Version 2023.10.20.001
Copyright and Proprietary Information Notice
© 2023 Synopsys, Inc. This Synopsys Cloud OpenLink Application Programming Interface (API) and all associated documentation are proprietary to Synopsys, Inc. and may only be used pursuant to the terms and conditions of a written agreement with Synopsys, Inc.
Disclaimer
Synopsys, Inc., and its licensors make no warranty of any kind, express or implied, with regard to this material, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose.
Trademarks
Synopsys and certain Synopsys product names are trademarks of Synopsys, as set forth at
https://www.synopsys.com/company/legal/trademarks-brands.html. All other product or company names may be trademarks of their respective owners.
Third-Party Links
Any links to third-party websites included in this document are for your convenience only. Synopsys does not endorse and is not responsible for such websites and their practices, including privacy practices, availability, and content.
This document describes the Synopsys Cloud OpenLink API which enables semiconductor foundries and EDA and IP vendors to interoperate on a system-to-system level with the Synopsys Cloud. Specifically, vendors can provide information about their product entitlements for a Synopsys Cloud customer. The customer can request licenses from the vendor using the API. The licenses are then installed in Synopsys Cloud. The scope of this document covers the following Synopsys Cloud OpenLink API functionality:
Synopsys Cloud customer navigates to a "Third-Party Entitlements" page in the Synopsys Cloud portal UIcustomer chooses a vendor for which they want to browse entitlements and eventually request licensesSynopsys Cloud fetches the available entitlements for the customer through the vendor entitlement API endpointvendor API response lists the available entitlements which are presented by the UIcustomer selects the quantity of entitlements for which they want to request a license and submits the requestSynopsys Cloud invokes the vendor license API endpointvendor provides the license files in response which are installed on the Synopsys Cloud license server
The graphic here illustrates the licensing flow.
The sequence chart diagram in this section shows the basics of the following flows.
The API for integration with Synopsys Cloud is specified using the OpenAPI v3 standard. The specification contains all details needed to implement the API . This section provides additional information to clarify the specification .
This section provides common properties of the Synopsys Cloud OpenLink API.
TLS 2.0 or higher over https is supported.Content-Type: application/json is supported for requests.OAUTH2 and API key-based authentication is supported.Each vendor registers the entitlement API with Synopsys Cloud through a manual onboarding flow. Customer specific details to be used for customer identification at the vendor side are agreed on and stored in the Synopsys Cloud for the customer.
The following table summarizes the kind of information needed for onboarding.
| Properties | Options |
|---|---|
| Vendor's Authentication Method | API Key, or OAuth 2 |
| Vendor's Authentication API | Url, parameters, headers |
| Vendor's Entitlement Query API | Url, parameters, headers |
| Vendor's Customer Identification | List of required fields |
The vendor API onboarding information is registered according to the following schema. For simplicity, information discussed further in this section is wrapped via <>
See Swagger OpenAPI specification for
VendorApiRegistration
{
"auth":"OAUTH2",
"oAuthApi":<vendorAuthApi>,
"entitlementApi":<vendorEntitlementApi>,
"customerIdentification":{
"params":<vendorCustomerFields>
}
}
The API endpoint for the license generation is dynamically provided with the entitlement query result. This allows the vendor to provide different endpoints for different licenses.
The following sections provides more details about the specific properties of the vendor information registered in the Synopsys Cloud
The customer will be identifiable by the vendor through the D-U-N-S (a unique nine-digit identifier for businesses) number. In addition, the vendor can specify additional parameters to be provided by the customer through the Synopsys Cloud to the vendor.
In the onboarding VendorApiRegistration schema, the customer identification property customerIdentification allows the vendor`` to define optional customer fields which are to be provided with the API calls from the Synopsys Cloudto thevendor`.
See Swagger OpenAPI specification for
VendorCustomerInfo
An example for optional customer fields is given below. Here, the vendor is asking the customer to provide a string mandatory parameter siteId.
...
"customerIdentification":{
"params":[
{
"title":"Site Id",
"key":"siteId",
"type":"String",
"required":true
}
...
]
}
The values specified in the above required parameters are then provided under the property vendorCustomerIdentification along with the API requests for entitlements and license retrieval.
The entitlement API is a static URL that needs to be provided during onboarding. The further API information for retrieving the licenses are provided dynamically using the entitlement API.
{
"url": "https://api.vendor.com/v1/synopsys/get-entitlements",
"header": {
"my-extra-info":"anything"
},
"staticbody": {
"my-extra-info":"anything"
}
}
The properties defined under staticBody are merged into the body of the POST request for the entitlement.
For API key based authentication, the vendor must provide a header and value for the API key
See Swagger OpenAPI specification for
ApiKeyAuthInfo
An example for the onboarding information needed for ApiKeyAuthInfo is shown below:
{
"header":"x-api-key",
"value":"9114dd77-912e-4179-a8c5-0a8de9dd44cc"
}
The Synopsys Cloud initiating service provides the API key in the header with each request for the entitlement API and the license generation API as shown in the following example:
{
"headers": { "x-api-key":"9114dd77-912e-4179-a8c5-0a8de9dd44cc" }
}
For two legged OAuth2.0 based authentication according to RFC 6749 the authentication URL, client ID and client secret are required from the vendor for API onboarding. It is possible to augment those parameters with additional static parameters which will be merged into the POST request body.
See Swagger OpenAPI specification for
Oauth2ClientInfo
An example for the onboarding information needed for Oauth2ClientInfo is shown here:
{
"url": "https://vendor.com/api/oauth2/token",
"header": {
"x-my-header": "xyz"
},
"staticBody": {
"origin": "synopsys"
},
"clientId": "6779ef20e75817b79602",
"clientSecret": "dl9aUnVyOWdtQ3gxTTlobGU5N2ZWQUd5amdCcUsya2hWdVlMZmZOLWVOZw=="
}
The entitlement API allows the Synopsys Cloud to retrieve the available entitlements from the vendor for a specific customer.
A POST request will be made from Synopsys Cloud with the following values encoded as body parameters:
SWAGGER: Please see Swagger OpenAPI specification for
EntitlementsRequestDto:
{
"customer": {
"name": "Big Chip Semi",
"dunsNumber": "1232234345",
"synopsysCustomerId": "5a8649c7-129e-447b-afb2-77b778e66ac3",
"vendorCustomerIdentification":{
"sideId": "32668"
}
}
}
This information is used by the vendor to identify the customer. The vendorCustomerIdentification properties are registered at the Synopsys Cloud during the vendor API onboarding process.
Once invoked from the Synopsys Cloud, the entitlements API needs to respond according to the following schema:
SWAGGER: Please see OpenAPI Swagger specification for
EntitlementsResponse
{
"customer": { }, // Same as in the request dto
"provides":[ ] // Array with entitlement information, See under "Item Type" for possible values
}
The details of the possible contents that the array provides are described in the next section. If all the licenses can be provided by the same endpoint from the vendor, then the array may only have one entry. Each entry lists all entitlements for which licenses can be retrieved through a single license retrieval endpoint. In case different endpoints are needed, multiple items can be provided with different endpoint configurations.
This item type is used by the vendor to expose all license entitlements and allow the Synopsys Cloud customer to request licenses.
customer's license server in the Synopsys Cloud.vendorvendor in the subsequent endpoint for license retrieval.SWAGGER: Please see OpenAPI Swagger specification for
LicenseEntitlements
An example for the LicenseEntitlements item as part of EntitlementsResponse provides array is shown here.
{
"customer": {
"name": "Big Chip Semi",
"dunsNumber": "1232234345",
"synopsysCustomerId": "5a8649c7-129e-447b-afb2-77b778e66ac3",
"vendorCustomerIdentification":{
"sideId": "32668"
}
},
"provides": [
{
"title": "AutoChip EDA Tools",
"description": "Digital Design EDA Tools Licenses",
"kind": "ProvideLicense",
"licenseEntitlements": [
{
"title": "Power Analyzer",
"aux":{"part": "part-1234"},
"qtyMax":10,
"termEndDate": "2024-08-01T00:00:00.000Z"
},
{
"title": "Timing Analyzer",
"aux":{"part": "part-5678"},
"qtyMax":5,
"termEndDate": "2025-08-01T00:00:00.000Z"
}
],
"licenseRequestApi":{
"url": "localhost:2000/get-license",
"header": {
"x-my-header": "xyz"
},
"staticBody": {
"origin": "synopsys"
},
},
}
]
}
Each entitlement item must contain the following:
titledescription, maximum available quantity qtyMax, end date for the license term termEndDateaux.For the license request, the title and aux object is provided along with the requested quantity qtyMax to the vendor license generation endpoint.
After configuration of the requested quantity in the UI, the vendor endpoint to request licenses is invoked from the Synopsys Cloud. In response to the request, the vendor provides the requested licenses or returns an error.
vendor if needed. Each license file can be provided back to the Synopsys Cloud synchronously or asynchronously (polling) from the vendor.SWAGGER: Please see OpenAPI Swagger specification for ProvideLicenseRequestDto
An example for a ProvideLicenseRequestDto item to request licenses from the vendor is provided here:
{
"customer": {
"name": "Big Chip Semi",
"dunsNumber": "1232234345",
"synopsysCustomerId": "5a8649c7-129e-447b-afb2-77b778e66ac3",
"vendorCustomerIdentification":{
"sideId": "32668"
}
},
"licenseRequests": [
{
"title": "Power Analyzer",
"aux":{"part": "part-1234"},
"qty": 2
},
{
"title": "Timing Analyzer",
"aux":{"part": "part-5678"},
"qty": 3
}
],
"host": {
"id": "id-auto-filled-by-snps",
"name": "auto-filled-by-snps"
},
"origin": "synopsys",
}
The response of the licenses request endpoint can provide the license file synchronously as part of the response, or asynchronously through a download URL which gets polled.
SWAGGER: Please see Swagger Type
ProvideLicenseResponse
The synchronous response provides the license file(s) directly as part of the HTTP POST response body. This response type is used if the license file can be provisioned in less than 20 seconds, thereby avoiding HTTP timeouts
The synchronous response is indicated by the property downloadType set to "Sync" in the payload. The property data can accommodate data along with filename and type for one or more licenses. In case of a license, the property fileType must be set to "License" as shown in the example below:
{
"files": [
{
"fileName": "lic_vendor_tool.lic",
"fileType": "License",
"data": "<Buffer 48 61 6c 6c 6f>",
"downloadType": "Sync"
}
]
}
The file property data contains the Base64 encoded license file as a buffer. See below an example for Base64 encoding in plain JavaScript
const licenseString = 'SERVER enterp ...';
const buff = new Buffer(licenseString);
const data = buff.toString('base64');
The asynchronous response does not provide the license file(s) directly as part of the HTTP POST response.
Instead, the response provides URLs where license file(s) can be downloaded after a time specified by the vendor in the response. This response type shall be used if the provisioning of the license file cannot be done in less than 20 seconds to prevent HTTP timeouts. The diagram below illustrates the interaction model:
The asynchronous response is indicated by the property fileType set to "Async" in the payload. In the array data, for each license, the instructions for the license file download are given (instead of the license file data) as shown in the example.
{
"files": [
{
"fileType": "Async",
"fileName": "lic_vendor_tool.lic",
"downloadType": "License",
"downloadApi":{
"url": "http://vendor.com/download?uuid=eec85dab-6de8-4f1f-8234-6df676bdb834",
"headers": {
"x-my-header": "xyz"
},
"staticBody": {
"origin": "synopsys"
},
"pollStartDateTime": "2023-07-12T09:40:18.000Z",
"pollIntervalSec": 30
}
}
]
}
The property url provides the URL for the download along with the method, optional headers, and optional body parameters under staticBody. The ISO Date string property pollStartDateTime indicates when Synopsys should attempt a download and the suggested poll interval using pollIntervalSec. If the file is not yet available, a 404 response is returned.
In case the validation of parameters as inputs to the REST API fails, each endpoint should return an error with the status code 400 as shown below:
{
"code": "LICGEN001",
"message": "License generation failed",
"statusCode": 400,
"tid": "eec85dab-6de8-4f1f-8234-6df676bdb834",
"errors": [
{
"message": "LmHostId is missing but required"
}
]
}
The property code allows the encoding of a vendor specific error code. The message contains information about the error to be provided back to the customer. The optional property tid allows the insertion of a vendor server trace ID for tracing and debugging. This is especially useful for 500 internal server errors. The optional array errors can contain additional error information (e.g., specific errors for individual parameters).
The following code shows a simple but functional example implementation for the Synopsys® Cloud OpenLink API Specification using NodeJS in Javascript.
/**
* NodeJS example application of the Synopsys® Cloud OpenLink API Specification
*
* npm install express
* npm install body-parser
* node main.js
*
*/
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
/*
* Server settings
*/
const port = 2000
const host = 'localhost'
const protocol='http'
app.use(bodyParser.json())
// Some tracing...
app.use((req,res,next)=>{
console.log(`TRACE: ${req.method} ${req.url}`)
next();
})
/**
* Example implementation for get-license API
*/
app.use('/vendor-api/get-license', async (req, res) => {
// Vendor sample endpoint to generate a license with synchronous response
console.log(req.body)
const customer = req.body.customer
const hostId = req.body.host.id;
const hostName = req.body.host.name;
let response = {
files: []
}
const backOfficeLicenseGeneration=async ()=>{
return "DUMMY LICENSE FILE...."
}
/* Here, we generate a license per part as one possible option */
for (let licenseRequest of req.body.licenseRequests) {
/* Vendor's backoffice call to generate license*/
const licenseFile = await backOfficeLicenseGeneration(customer, hostName, hostId, licenseRequest.qty, licenseRequest.expiry, licenseRequest.aux.part)
response.files.push({
files: [{
fileType: "Sync",
data: Buffer.from(licenseFile, 'base64'),
fileName: `lic ${hostId}.txt`,
downloadType: "License"
}
]
})
}
/* Respond to Synopsys with generated licenses */
res.json(response)
})
/**
* Example implementation for get-entitlements API
*/
app.post('/vendor-api/get-entitlements', (req, res) => {
/* Vendor sample endpoint to query entitlements and map user options to vendor's get-license API spec */
const response = {
"customer": req.body?.customer,
"provides": [
{
"title": "AutoChip EDA Tools",
"description": "Digital Design EDA Tools Licenses",
"kind": "ProvideLicense",
"licenseEntitlements": [
{
"title": "Power Analyzer",
"aux":{"part": "part-1234"},
"qtyMax":10,
"termEndDate": "2024-08-01T00:00:00.000Z"
},
{
"title": "Timing Analyzer",
"aux":{"part": "part-5678"},
"qtyMax":5,
"termEndDate": "2025-08-01T00:00:00.000Z"
}
],
"licenseRequestApi":{
"url":`${protocol}://${host}:${port}/vendor-api/get-license`,
"header": {
"x-my-header": "xyz"
},
"staticBody": {
"origin": "synopsys"
},
},
}
]
}
res.json(response)
})
app.listen(port, () => {
console.log(`Example Synopsys® Cloud OpenLink API vendor server listening on port ${port}`)
})