SaaS Connectivity: Building Your First Connector

Additional Resources

2 Likes

Hello Philip,

Thanks a lot. This is an very interesting topic. May I ask some questions here:

  • What’s the environment setup required here, I assume it’s Windows, but I am confused how can we run the commands (such as sail, spcx), should we install any package locally?
  • I noticed in one of the post, it mentioned there is a SailPoint CLI utility, but the link seems not exists any more.
  • And if I understand correctly, this SaaS connector only handles endpoints connectivity which sits on cloud in IDN? it seems to WebServices connector of IIQ but in JavaScript, am I correct?
  • Also, do you have any idea, can such framework also used to connect application which is on-premise?

Sorry, due to private appointments, I did not make it to join the full live streaming in IDN part. And I am relatively new to IDN.

Thanks and regards,
Mike

  • Environment – All you need is visual studio code and node/npm installed to get going. For full documentation, see here: SaaS Connectivity | SailPoint Developer Community
  • The CLI tool can be found here: Releases · sailpoint-oss/sailpoint-cli · GitHub
  • SaaS is a cloud based connector, so it is running in the IDN cloud. Because of this, the best use cases are for connecting to other cloud based resources
  • Right now to connect a SaaS connector to an on-prem source, you would need to somehow expose that on-prem source to the internet. It is probably best to use the VA in those cases since you have better control over access. As @bwong1 mentioned during the roadmap session, a SaaS connector that can run on-prem might be available in the longer term future.

Hi @philip-ellis,

I have tried to onboard the SaaS Airtable connector. Able to create and read accounts from local machine using postman.

Deployed connector into IDN:
The test connection is success. However the account aggregation is failing with following error message:
java.lang.RuntimeException - java.lang.IllegalStateException: [ConnectorError] invalid output format: Schema validation error in path: [/: {"attributes":{"emai... did not match any of the specified OneOf schemas] (requestId: 95f1495a865f41348f7837bc220db1d3) - java.lang.RuntimeException: java.lang.IllegalStateException: [ConnectorError] invalid output format: Schema validation error in path: [/: {"attributes":{"emai... did not match any of the specified OneOf schemas] (requestId: 95f1495a865f41348f7837bc220db1d3) at com.sailpoint.mantis.qpoc.message.AccountAggregation.iterateResourceObjects(AccountAggregation.java:628) at com.sailpoint.mantis.qpoc.message.AccountAggregation.handleMessage_aroundBody0(AccountAggregation.java:333) at com.sailpoint.mantis.qpoc.message.AccountAggregation$AjcClosure1.run(AccountAggregation.java:1) at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:167) at com.sailpoint.atlas.metrics.MessageMetricsAspect.meterMessageTimeAndExceptions(MessageMetricsAspect.java:68) at com.sailpoint.mantis.qpoc.message.AccountAggregation.handleMessage(AccountAggregation.java:320) at com.sailpoint.atlas.messaging.server.TypeMessageHandler.handleMessage(TypeMessageHandler.java:87) at com.sailpoint.mantis.qpoc.QpocMessageHandler.handleMessage(QpocMessageHandler.java:50) at com.sailpoint.mantis.platform.message.ObjectConfigMessageHandler.handleMessage(ObjectConfigMessageHandler.java:33) at com.sailpoint.atlas.tracing.plugin.TracingMessageHandler.handleMessage(TracingMessageHandler.java:88) at com.sailpoint.atlas.message.DynamicMessageHandler$ChainedMessageHandlerAdapter.handleMessage(DynamicMessageHandler.java:46) at com.sailpoint.atlas.usage.plugin.UsageMessageHandler.handleMessage(UsageMessageHandler.java:36) at com.sailpoint.atlas.message.DynamicMessageHandler$ChainedMessageHandlerAdapter.handleMessage(DynamicMessageHandler.java:46) at com.sailpoint.atlas.message.DynamicMessageHandler.handleMessage(DynamicMessageHandler.java:36) at com.sailpoint.mantis.platform.message.SailPointContextMessageHandler.handleMessage(SailPointContextMessageHandler.java:55) at com.sailpoint.atlas.message.FailureNotificationHandler.handleMessage(FailureNotificationHandler.java:55) at com.sailpoint.atlas.message.RequestContextMessageHandler.handleMessage(RequestContextMessageHandler.java:72) at com.sailpoint.mantis.platform.message.ExceptionMessageHandler.handleMessage(ExceptionMessageHandler.java:49) at com.sailpoint.atlas.messaging.server.MessageProcessor.handleJobMessage(MessageProcessor.java:196) at com.sailpoint.atlas.messaging.server.MessageProcessor.handleMessage(MessageProcessor.java:129) at com.sailpoint.atlas.messaging.server.MessageProcessor.lambda$null$0(MessageProcessor.java:99) at com.sailpoint.atlas.messaging.server.MessageProcessor.withOrgLogging(MessageProcessor.java:171) at com.sailpoint.atlas.messaging.server.MessageProcessor.lambda$asyncHandleMessage$1(MessageProcessor.java:99) at com.sailpoint.atlas.messaging.server.impl.SourceRunnableImpl.run(SourceRunnableImpl.java:77) at com.sailpoint.atlas.messaging.server.impl.BufferedSourceQueue$IncrementingSourceRunnable.run(BufferedSourceQueue.java:181) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: java.lang.IllegalStateException: [ConnectorError] invalid output format: Schema validation error in path: [/: {"attributes":{"emai... did not match any of the specified OneOf schemas] (requestId: 95f1495a865f41348f7837bc220db1d3) at com.sailpoint.connector.cloud.spconnect.SpConnectProxy$1.nextResponse(SpConnectProxy.java:277) at sailpoint.connector.cloud.CloudConnector$CloudBridgeIterator.buildDataBlockIterator(CloudConnector.java:1109) at sailpoint.connector.cloud.CloudConnector$CloudBridgeIterator.checkForMoreData(CloudConnector.java:1097) at sailpoint.connector.cloud.CloudConnector$CloudBridgeIterator.hasNext(CloudConnector.java:1023) at sailpoint.connector.ConnectorProxy$CustomizingIterator.peek(ConnectorProxy.java:738) at sailpoint.connector.ConnectorProxy$CustomizingIterator.hasNext(ConnectorProxy.java:765) at com.sailpoint.mantis.qpoc.message.AccountAggregation.iterateResourceObjects(AccountAggregation.java:596) ... 29 more

Regards,
Jagadeep

Hi Jagadeep,

It appears the data going to IDN is not in the right format. It’s probably something with how your airtable data is setup or your account mapping in the connector-spec.json. Are you able to share your connector-spec.json as well as the data as it appears in postman when you run locally?

Thanks for the prompt response.

JSON Output: std:account:list

{
    "identity": "recG4uQRt2rqqhEMQ",
    "attributes": {
        "id": "idn.user1",
        "email": "[email protected]",
        "fullname": "idn user1",
        "entitlements": "test"
    }
}
{
    "identity": "recgPwBo28D6sab4b",
    "attributes": {
        "id": "idn.test1",
        "email": "[email protected]",
        "fullname": "idn.test1",
        "entitlements": "read only"
    }
}

connector-spec.json (2.4 KB)

right away, I see what could be an issue. The entitlements should be an array. So the result should look like this:

{
    "identity": "recG4uQRt2rqqhEMQ",
    "attributes": {
        "id": "idn.user1",
        "email": "[email protected]",
        "fullname": "idn user1",
        "entitlements": ["test"]
    }
}

I’m not 100% sure that will cause a problem in your case, but it’s worth trying that change to see how it affects things.

I made entitlements multi value now. Postman result below:

{
    "identity": "recG4uQRt2rqqhEMQ",
    "attributes": {
        "id": "idn.user1",
        "email": "[email protected]",
        "fullname": "idn user1",
        "entitlements": [
            "test"
        ]
    }
}

But the problem is while running account aggregation in SailPoint.

Regards,
Jagadeep