REST API¶
The Solution Manager provides a REST API to perform programmatically certain tasks. This is useful to automate the creating and deployment of revisions, automate the management of the licenses, etc. The operations to register and deregister servers from the Solution Manager can be used in combination with the auto scaling capabilities of your cloud provider, to start and stop Denodo servers when necessary. The article Configuring Auto Scaling of Denodo in AWS of the Knowledge Base explains how to do this.
Considerations to use this API:
The base URL for all the operations (except
externalShutdown
andpingLicenseManager
) is this:https://<host of the Solution Manager server>:10090
10090 is the default port of the Solution Manager.
This API supports the following authentication methods:
HTTP Basic
SPNEGO (Kerberos over HTTP)
This API is stateless. That is, each request from the client has to contain all of the information necessary to understand the request, including the credentials. This is the usual pattern followed by REST APIs, in which each request is independent from the previous ones.
List of operations:
Some operations are available since an update version. You can see the update version in the operation description.
Get the List of Environments¶
You can get the list of environments defined in the Solution Manager executing the following request:
URL:
/environments
Method:
GET
If the request has been successfully executed, the server sends the status code 200. The response body includes the list of environments in JSON format. Each environment can contain the following information:
{
"id": <number>,
"name": <text>,
"uuid": <uuid>,
"description": <text>,
"minimumUpdateValue":<number> /* format yyyymmdd */,
"minimumUpdateMandatory": <boolean> /* the minimum update is mandatory in the Virtual DataPort Administration Tool */,
"minimumUpdateDownloadUrl": <URL>,
"licenseAlias": <text>,
"environmentType": <environment type> /* environment type */
}
<environment type>::= "STANDARD" | "AUTOMATED_AWS"
The following example represents a list of 2 environments.
[
{
"id": 1,
"name": "Environment 1",
"uuid" : "46984e8e-be0a-4f28-9802-aab0aa03e451",
"description": "First environment",
"minimumUpdateMandatory": false,
"licenseAlias": "PRODUCTION",
"environmentType": "STANDARD"
},
{
"id": 2,
"name": "Environment 2",
"uuid" : "979475f0-51b5-4f2e-af26-09aa76fa72a0",
"description": "Second environment",
"minimumUpdateMandatory": false,
"licenseAlias": "DEVELOPMENT",
"environmentType": "STANDARD"
},
{
"id": 3,
"name": "Environment AWS",
"uuid": "4b6bc266-61f6-4394-9b43-aee507beddbb",
"description": "",
"minimumUpdateValue": "",
"minimumUpdateMandatory": false,
"minimumUpdateDownloadUrl": "",
"licenseAlias": "PRODUCTION",
"environmentType": "AUTOMATED_AWS"
}
]
Create an Environment¶
Endpoint to create an environment:
URL:
/environments
Method:
POST
Syntax of the body of the request:
{
"name": <text>,
"description": <text>, /* optional */
"minimumUpdateValue":<number> /* /* optional, format yyyymmdd */,
"minimumUpdateMandatory": <boolean> /* optional, the minimum update is mandatory in the Virtual DataPort Administration Tool */,
"minimumUpdateDownloadUrl": <URL> /* optional */,
"licenseAlias": <text>, /* optional, assign a license to this environment */
"environmentType": <environment type> /* only "STANDARD" <environment type> is supported */
}
<environment type>::= "STANDARD" | "AUTOMATED_AWS"
Note
To assign a license to the environment, indicate the license alias. To obtain it, use the operation licenseAlias.
Note
This operation only allows to create standard environments.
If the request succeeds, the service returns the HTTP code 201 and a response that contains the id of the new environment.
Example
In this example, we create a file “new_environment.json” with the body of the request and then, use cURL to send a request with the content of this file.
{
"name": "finance-development",
"description": "Environment for the development servers allocated to the finance department",
"minimumUpdateValue": "20190312",
"minimumUpdateDownloadUrl": "https://denodo-repository.acme.com/denodo-v70-update-20190903.zip",
"minimumUpdateMandatory": true,
"licenseAlias": "DEVELOPMENT",
"environmentType": "STANDARD"
}
curl --data @new_environment.json --header "Content-Type: application/json" --user "jsmith" "https://solution-manager.acme.com:10090/environments"
{
"id": 1,
"name": "finance-development",
"uuid": "d7bea1bb-8aa6-4161-bdbe-f976fdfb6d1f",
"description": "Environment for the development servers allocated to the finance department",
"minimumUpdateValue": "20190312",
"minimumUpdateDownloadUrl": "https://denodo-repository.acme.com/denodo-v70-update-20190903.zip",
"minimumUpdateMandatory": true,
"licenseAlias": "DEVELOPMENT",
"environmentType": "STANDARD"
}
Get the List of Licenses Available¶
Get the list of licenses available license loaded in the Solution Manager.
URL:
/licenseAlias
Method:
GET
If the request succeeds, the service returns the HTTP code 200 and the body of the response contains the list of licenses in JSON format. Each license can contain the following information:
{
"alias": <text>, /* license alias name */
"licenseType": <license type>, /* license type */
"version": <text>, /* license version number, i.e: 9.0 */
"uniqueLicenseType": boolean /* indicates if there is more than one license with the same type */
}
<license type>::=
"PRODUCTION"
| "STAGING"
| "HOT_BACKUP"
| "COLD_BACKUP"
| "DEVELOPMENT"
| "PERSONAL_DEVELOPER"
| "TRAINING"
| "EVALUATION"
| "EXPRESS"
| "TESTING"
Example of response
[{
"alias": "DEVELOPMENT",
"licenseType": "DEVELOPMENT",
"version": "9.0",
"uniqueLicenseType": true
}, {
"alias": "PERSONAL_DEVELOPER",
"licenseType": "PERSONAL_DEVELOPER",
"version": "9.0",
"uniqueLicenseType": true
}, {
"alias": "PRODUCTION",
"licenseType": "PRODUCTION",
"version": "9.0",
"uniqueLicenseType": true
}
]
Update an Environment¶
Operation to modify the configuration of an environment.
URL:
/environments/{number:environmentId}
Method:
PUT
Syntax of the body of the request:
{ "name": <text>, "description": <text>, /* optional */ "minimumUpdateValue": <number>, /* optional, format yyyymmdd */ "minimumUpdateMandatory": <boolean>, /* optional, the minimum update is mandatory in the Virtual DataPort Administration Tool */ "minimumUpdateDownloadUrl": <URL>, /* optional */ "licenseAlias": <text>, /* optional, associate the environemnt with a license */ "environmentType": <environment type> /* only "STANDARD" <environment type> is supported */ } <environment type>::= "STANDARD" | "AUTOMATED_AWS"
Note
This operation only allows to update standard environments.
If the request succeeds, the service returns the HTTP code 200 and the body of the response contains a JSON document with the settings of the environment.
Example
Example of a PUT request:
{
"name": "env",
"description": "new description of the environment",
"minimumUpdateValue": "20190312",
"minimumUpdateDownloadUrl": "http://denodo.com/update20190312.zip",
"minimumUpdateMandatory": false,
"licenseAlias": "DEVELOPMENT",
"environmentType": "STANDARD"
}
Sample response:
{
"id": 1,
"name": "env",
"uuid": "979475f0-51b5-4f2e-af26-09aa76fa72a0",
"description": "sample updated environment",
"minimumUpdateValue": "20190312",
"minimumUpdateMandatory": false,
"minimumUpdateDownloadUrl": "http://denodo.com/update20190312.zip",
"licenseAlias": "DEVELOPMENT",
"environmentType": "STANDARD"
}
Delete an Environment¶
Delete an environment, and all the clusters and servers within the environment:
URL:
/environments/{number:environmentId}
Method:
DELETE
Example
The following request deletes the environment with identifier 1
and its clusters and servers:
DELETE https://solution-manager.acme.com:10090/environments/1
If the request succeeds, the service returns the HTTP code 204.
Update AWS Global Credentials¶
This operation updates the global AWS credentials access keys:
URL:
/configuration/credentials/aws
Method:
POST
Syntax of the body of the request:
{ "accessKeyId": <text>, /* Mandatory. Access key id */ "secretAccessKey": <text> /* Mandatory. Secret access key */ }
Consider this:
Both parameters are mandatory (
accessKeyId
andsecretAccessKey
).You can indicate the value of
secretAccessKey
in plain text or encrypted. To encrypt this value, use the script<SOLUTION_MANAGER_HOME>/bin/encrypt_password
.
Note
This operation only allows to update global AWS credentials.
If the request succeeds, the service returns the HTTP code 200.
Example
Example of a POST request to update AWS global credentials:
{
"accessKeyId" : "accessKeyId",
"secretAccessKey" : "clearOrEncryptedSecretAccessKey"
}
Update AWS Environment Credentials¶
This operation updates the credentials of a specific AWS environment:
URL:
/environments/{number:environmentId}/credentials
Method:
POST
Syntax of the body of the request:
{ "accessKeyId": <text>, /* Mandatory. Access key id */ "secretAccessKey": <text> /* Mandatory. Secret access key */ }
Consider this:
Both parameters are mandatory (
accessKeyId
andsecretAccessKey
).You can indicate the value of
secretAccessKey
in plain text or encrypted. To encrypt this value, use the script<SOLUTION_MANAGER_HOME>/bin/encrypt_password
.
If the request succeeds, the service returns the HTTP code 200.
Example
Example of a POST request to update the credentials for AWS environment with id 1
:
POST https://solution-manager.acme.com:10090/environments/1/credentials
{
"accessKeyId" : "accessKeyId",
"secretAccessKey" : "clearOrEncryptedSecretAccessKey"
}
Update Azure Global Credentials¶
This operation updates the global Azure credentials access keys:
URL:
/configuration/credentials/azure
Method:
POST
Syntax of the body of the request:
{ "subscriptionId": <text>, /* Mandatory */ "clientId": <text>, /* Mandatory */ "tenantId": <text>, /* Mandatory */ "secret": <text> /* Mandatory */ }
Consider this:
All the parameters are mandatory.
You can indicate the value of
secret
in plain text or encrypted. To encrypt this value, use the script<SOLUTION_MANAGER_HOME>/bin/encrypt_password
.
Note
This operation only allows to update global Azure credentials.
If the request succeeds, the service returns the HTTP code 200.
Example
Example of a POST request to update AWS global credentials:
{
"subscriptionId" : "subscriptionId",
"clientId" : "clientId",
"tenantId" : "tenantId",
"secret" : "clearOrEncryptedSecret"
}
Update Azure Environment Credentials¶
This operation updates the credentials of a specific Azure environment:
URL:
/environments/{number:environmentId}/credentials
Method:
POST
Syntax of the body of the request:
{ "subscriptionId": <text>, /* Mandatory */ "clientId": <text>, /* Mandatory */ "tenantId": <text>, /* Mandatory */ "secret": <text> /* Mandatory */ }
Consider this:
Both parameters are mandatory.
You can indicate the value of
secret
in plain text or encrypted. To encrypt this value, use the script<SOLUTION_MANAGER_HOME>/bin/encrypt_password
.
If the request succeeds, the service returns the HTTP code 200.
Example
Example of a POST request to update the credentials for AWS environment with id 1
:
POST https://solution-manager.acme.com:10090/environments/1/credentials
{
"subscriptionId" : "subscriptionId",
"clientId" : "clientId",
"tenantId" : "tenantId",
"secret" : "clearOrEncryptedSecret"
}
Start Automated Mode Cluster¶
This operation starts a cluster that was created in automated mode:
URL:
/clusters/{number:clusterId}/start
Method:
POST
If the request succeeds, the service returns the HTTP code 204.
Example
Example of a POST request to start an AWS cluster with id 1
:
POST https://solution-manager.acme.com:10090/clusters/1/start
Stop Automated Mode Cluster¶
This operation stops a cluster that was created in automated mode:
URL:
/clusters/{number:clusterId}/stop
Method:
POST
If the request succeeds, the service returns the HTTP code 204.
Example
Example of a POST request to stop an AWS cluster with id 1
:
POST https://solution-manager.acme.com:10090/clusters/1/stop
Restart Automated Mode Cluster¶
This operation restarts a cluster created in automated mode:
URL:
/clusters/{number:clusterId}/restart
Method:
POST
If the request succeeds, the service returns the HTTP code 204.
Example
Example of a POST request to restart an AWS cluster with id 1
:
POST https://solution-manager.acme.com:10090/clusters/1/restart
Recreate Automated Mode Cluster¶
This operation recreates partially or completely a cluster that was created in automated mode.
Important
If you made manual changes in some of the servers, you will lose those changes when recreating the cluster. If you want to keep them, use the operation to recreate from servers.
URL:
/clusters/{number:clusterId}/recreate
Method:
POST
Syntax of the body of the request:
{ "servers" : [ /* List with the type of product cluster servers to recreate */ { "typeNode": <server type> /* Server type to recreate */ } ], "withZeroDowntime": <boolean> /* To specify if the recreate process is performed minimizing downtime (true) or not (false) */ } <server type>::= "VDP" | "SCHEDULER" | "VDP_DATA_CATALOG"
If the request succeeds, the service returns the HTTP code 204.
Partial recreate cluster example without minimizing downtime
Example of a POST request to recreate only Virtual DataPort product cluster for an AWS cluster with id 1
without minimizing downtime:
POST https://solution-manager.acme.com:10090/clusters/1/recreate
{
"servers": [
{
"typeNode": "VDP"
}
],
"withZeroDowntime": false
}
Complete recreate cluster example with minimizing downtime option
Example of a POST request to recreate a complete cluster for an AWS cluster with id 1
with minimizing downtime option:
POST https://solution-manager.acme.com:10090/clusters/1/recreate
{
"servers": [
{
"typeNode": "VDP"
},
{
"typeNode": "SCHEDULER"
},
{
"typeNode": "VDP_DATA_CATALOG"
}
],
"withZeroDowntime": true
}
Recreate From Servers Automated Mode Cluster¶
This operation recreates an automated mode cluster using a server as template.
Important
We recommend to invoke this operation if you performed manual changes in a server and you want to replicate the changes in the corresponding product cluster.
Note
It is not possible to perform this operation minimizing downtime.
URL:
/clusters/{number:clusterId}/recreateFromServers
Method:
POST
Syntax of the body of the request:
{ "servers" : [ /* List with the type of product cluster servers to recreate */ { "typeNode": <server type>, /* Server type to recreate */ "instanceId": <text> /* Instance id of the server that will be used as the base for the recreation process */ } ] } <server type>::= "VDP" | "SCHEDULER" | "VDP_DATA_CATALOG"
If the request succeeds, the service returns the HTTP code 204.
Partial recreate cluster from servers example
Example of a POST request to recreate from server only Virtual DataPort product cluster for an AWS cluster with id 1
:
POST https://solution-manager.acme.com:10090/clusters/1/recreateFromServers
{
"servers": [
{
"typeNode": "VDP",
"instanceId": "virtualDataPortServerInstanceId"
}
]
}
Complete recreate from servers example
Example of a POST request to recreate from server a complete cluster for an AWS cluster with id 1
:
POST https://solution-manager.acme.com:10090/clusters/1/recreateFromServers
{
"servers": [{
"typeNode": "VDP",
"instanceId": "virtualDataPortServerInstanceId"
},
{
"typeNode": "SCHEDULER",
"instanceId": "schedulerServerInstanceId"
},
{
"typeNode": "VDP_DATA_CATALOG",
"instanceId": "dataCatalogServerInstanceId"
}
]
}
Install Denodo Update Automated Mode Cluster¶
This operation installs an update of Denodo in a cluster that was created in automated mode. The update has to be located in an AWS S3 bucket.
URL:
/clusters/{number:clusterId}/installDenodoUpdate
Method:
POST
Syntax of the body of the request:
{ "denodoProductClusterUpdateDtos": [ { "updateType": "S3", /* Type of update. Only S3 allowed */ "typeNode": <server type>, /* Type of the server where the update is installed */ "arnProfileForS3Access": <text>, /* ARN of the instance profile role that grants access to the S3 bucket where the update file is stored */ "s3UpdatePath": <text> /* Complete path to the Denodo update file */ } ], "withZeroDowntime": <boolean> /* To specify if the Denodo update installation process is performed minimizing downtime (true) or not (false) */ } <server type>::= "VDP" | "SCHEDULER" | "VDP_DATA_CATALOG"
If the request succeeds, the service returns the HTTP code 204.
Install update in a specific server type example
Example of a POST request to install a denodo update only in the Virtual DataPort servers for an AWS cluster with id 1
without minimizing downtime:
POST https://solution-manager.acme.com:10090/clusters/1/installDenodoUpdate
{
"denodoProductClusterUpdateDtos": [
{
"updateType": "S3",
"typeNode": "VDP",
"arnProfileForS3Access": "arn:aws:iam::accountId:instance-profile/instanceProfileRoleName",
"s3UpdatePath": "s3://bucketaNme/folderPath/denodoUpdateFile.zip"
}
],
"withZeroDowntime": false
}
Install update in all the types of servers example
Example of a POST request to install a specific update in each type of server for an AWS cluster with id 1
with minimizing downtime enabled:
POST https://solution-manager.acme.com:10090/clusters/1/installDenodoUpdate
{
"denodoProductClusterUpdateDtos": [
{
"updateType": "S3",
"typeNode": "VDP",
"arnProfileForS3Access": "arn:aws:iam::accountId:instance-profile/instanceProfileRoleName",
"s3UpdatePath": "s3://bucketName/folderPath/denodoUpdateFile.zip"
}, {
"updateType": "S3",
"typeNode": "VDP_DATA_CATALOG",
"arnProfileForS3Access": "arn:aws:iam::accountId:instance-profile/instanceProfileRoleName",
"s3UpdatePath": "s3://bucketName/folderPath/denodoUpdateFile.zip"
}, {
"updateType": "S3",
"typeNode": "SCHEDULER",
"arnProfileForS3Access": "arn:aws:iam::accountId:instance-profile/instanceProfileRoleName",
"s3UpdatePath": "s3://bucketName/folderPath/denodoUpdateFile.zip"
}
],
"withZeroDowntime": true
}
Get the List of Virtual DataPort Properties Associated to an Environment¶
Obtain the list of the Virtual DataPort properties defined on an environment.
URL:
/environments/{number:environmentId}/vdpProperties
Method:
GET
URL parameters. All of them are optional and can be combined:
propertyName
: this parameter specifies an exact property name. If the URL contains this parameter, the operation ignores the parameters below.databaseName
: filters properties by database name.elementType
: filters properties by element type (for example, view or data source).elementTypeName
: filters properties by element type name (for example, JDBC, XML, etc.).elementName
: filters properties by element name.
The URL path must include the environment identifier.
The response has this format:
{
"environmentProperties": [
{
"id": <number>,
"name": <text>,
"value": <text>,
"propertyType": "VDP",
"parentId": <number>,
"undefined": <boolean>
},
{ ... }
]
}
Example #1
The following example represents a response that returns the properties of the environment with identifier 4.
curl --user "jsmith" "https://solution-manager.acme.com:10090/environments/4/vdpProperties"
{
"environmentProperties": [
{
"id": 30,
"name": "users.smadmin.PASSWORD",
"value": "mYgfbAayggeImPPOGfklFLfgt ...",
"propertyType": "VDP",
"parentId": 3,
"undefined":false
},
{
"id": 32,
"name": "users.smadmin.PASSWORD.ALGORITHM",
"value": "SHA512",
"propertyType": "VDP",
"parentId": 3,
"undefined":false
},
{
"id": 31,
"name": "users.smadmin.PASSWORD.ENCRYPTED",
"value": "ENCRYPTED",
"propertyType": "VDP",
"parentId": 3,
"undefined":false
},
{
"id": 32,
"name": "undefinedProperty",
"value": "",
"propertyType": "VDP",
"parentId": 1,
"undefined": true
}
]
}
Example #2
The following URL uses the parameter propertyName
to obtain the value of the property users.smadmin.PASSWORD.ALGORITHM
in the environment with id #2.
curl --user "jsmith" "https://solution-manager.acme.com:10090/environments/2/vdpProperties?propertyName=users.smadmin.PASSWORD.ALGORITHM"
This parameter cannot be combined with others.
Example #3
The following URL uses the parameter databaseName
to obtain the properties defined for the database “admin”:
curl --user "jsmith" "https://solution-manager.acme.com:10090/environments/2/vdpProperties?databaseName=admin"
Example #4
The following URL uses the parameter elementType
to obtain the properties of the data sources:
curl --user "jsmith" "https://solution-manager.acme.com:10090/environments/2/vdpProperties?elementType=datasources"
Example #5
The following URL uses the parameter elementTypeName
to obtain the properties of all the JDBC data sources:
curl --user "jsmith" "https://solution-manager.acme.com:10090/environments/2/vdpProperties?elementTypeName=jdbc"
Example #6
The following URL uses the parameter elementName
to obtain the properties of the elements whose name is “oracle12c”:
curl --user "jsmith" "https://solution-manager.acme.com:10090/environments/2/vdpProperties?elementName=oracle12c"
Example #7
The following URL uses the parameters databaseName
, elementType
and elementTypeName
to obtain the properties of the LDAP data sources of the database admin:
curl --user "jsmith" "https://solution-manager.acme.com:10090/environments/2/vdpProperties?databaseName=admin&elementType=datasources&elementTypeName=ldap"
Create and Delete Environment Properties¶
If you execute a POST request to the following URL you can create an environment property:
URL:
/environments/{number:environmentId}/vdpProperties
Method:
POST
The request body must include the list of properties, according to the following format:
[
{
"name" : <text>,
"value" : <text>
"undefined" : <boolean>, /* optional */
"valueEncrypted" : <boolean> /* optional */
},
{ ... }
]
The undefined property is not mandatory, if you do not indicate it, this value is false by default.
The Solution Manager stores some properties as encrypted, such as passwords, depending on the name of the property. For this properties, the Solution Manager accepts the following values:
clear value
value encrypted with the encrypt_password script located in <SOLUTION_MANAGER_HOME>/bin
value encrypted by Denodo server (VDP)
The valueEncrypted property is not mandatory. This property can be used to check that the value encrypted with the encrypt_password is valid.
If valueEncrypted is false, the value is consider as clear text.
If valueEncrypted is true, the value is consider as encrypted. If the encrypted value is invalid an error will be thrown.
If valueEncrypted is not defined, the value is considered first as a value encrypted with encrypt_password script and if it is not valid it is considered a clear value.
The example below shows a POST request which creates some properties:
[
{
"name": "users.smadmin.PASSWORD",
"value": "7mclUPUm5bGx2L3KBLmzQsnO1o533AwYCAfk+oztHHqZIZ33Ow7w ... "
}, {
"name": "users.smadmin.PASSWORD.ALGORITHM",
"value": "SHA512"
}, {
"name": "users.acme.PASSWORD",
"value": "mypassword",
"valueEncrypted" : false
}, {
"name": "users.acme.PASSWORD.ALGORITHM",
"value": "SHA512"
}, {
"name": "undefinedProperty",
"value": "",
"undefined": true
}, {
"name": "databases.admin.datasources.jdbc.acmeOracle10gDs.USERPASSWORD",
"value": "C6zZSBoi55Oxgfxir6AX6YH7Ve5RjCfuQAPTpXsCYeQDkIg6xvVT ... "
}, {
"name": "databases.admin.datasources.jdbc.dsAcmeOracle11g.USERPASSWORD",
"value": "C6zZSBoi55Oxgfxir6AX6YH7Ve5RjCfuQAPTpXsCYeQDkIg6xvVT ... ",
"valueEncrypted": true
}, {
"name": "databases.admin.datasources.jdbc.dsAcmeOracle12c.USERPASSWORD",
"value": "y0DVUNiFjBzyME8Oes6ErRZDT+ppEFScSfjSnRnLh36eAjhervMM ... "
}, {
"name": "databases.admin.datasources.jdbc.dsAcmeSqlServer.USERPASSWORD",
"value": "y0DVUNiFjBzyME8Oes6ErRZDT+ppEFScSfjSnRnLh36eAjhervMM ... ",
"valueEncrypted": true
}, {
"name": "databases.admin.datasources.jdbc.dsAcmeMySql4.USERPASSWORD",
"value": "denodo"
}, {
"name": "databases.admin.datasources.jdbc.dsAcmeMySql5.USERPASSWORD",
"value": "denodo",
"valueEncrypted": false
}
]
This example shows the different values supported to add user PASSWORD and datasource USERPASSWORD:
value ‘mypassword’ encrypted by Denodo server for user smadmin
clear value ‘mypassword’ for user acme
value ‘denodo’ encrypted by Denodo server for acmeOracle10gDs and acmeOracle11gDs
value ‘denodo’ encrypted with encrypt_password script for dsAcmeOracle12c and dsAcmeSqlServer
clear value ‘denodo’ for dsAcmeMySql4 and dsAcmeMySql5
The response body contains the new properties with their identifiers:
[
{
"id": 30,
"name": "users.smadmin.PASSWORD",
"value": "7mclUPUm5bGx2L3KBLmzQsnO1o533AwYCAfk+oztHHqZIZ33Ow7w ... ",
"propertyType": "VDP",
"parentId": 4,
"undefined": false
}, {
"id": 31,
"name": "users.smadmin.PASSWORD.ALGORITHM",
"value": "SHA512",
"propertyType": "VDP",
"parentId": 4,
"undefined": false
}, {
"id": 32,
"name": "users.acme.PASSWORD",
"value": "zAo2EsLelqX34qRZkIOti7mqYebZfMHSpo/Gg2VVm2JgteBRznki ... ",
"propertyType": "VDP",
"parentId": 4,
"undefined": false
}, {
"id": 33,
"name": "users.acme.PASSWORD.ALGORITHM",
"value": "SHA512",
"propertyType": "VDP",
"parentId": 4,
"undefined": false
}, {
"id": 34,
"name": "undefinedProperty",
"value": "",
"propertyType": "VDP",
"parentId": 4,
"undefined": true
}, {
"id": 35,
"name": "databases.admin.datasources.jdbc.acmeOracle10gDs.USERPASSWORD",
"value": "C6zZSBoi55Oxgfxir6AX6YH7Ve5RjCfuQAPTpXsCYeQDkIg6xvVTj ... ",
"propertyType": "VDP",
"parentId": 4,
"undefined": false
}, {
"id": 37,
"name": "databases.admin.datasources.jdbc.dsAcmeOracle11g.USERPASSWORD",
"value": "C6zZSBoi55Oxgfxir6AX6YH7Ve5RjCfuQAPTpXsCYeQDkIg6xvVTj ... ",
"propertyType": "VDP",
"parentId": 4,
"undefined": false
}, {
"id": 39,
"name": "databases.admin.datasources.jdbc.dsAcmeOracle12c.USERPASSWORD",
"value": "MqBvb2IsfX4MITlV1W3SxoYfNhX4xS/KJAsKP85i2Q8a4G+oCiYK ... ",
"propertyType": "VDP",
"parentId": 4,
"undefined": false
}, {
"id": 41,
"name": "databases.admin.datasources.jdbc.dsAcmeSqlServer.USERPASSWORD",
"value": "t0cDdrY54hKNyOibbbdisaUUk+P0z/glf+XV2TwAnalxLtrv8fJi ... ",
"propertyType": "VDP",
"parentId": 4,
"undefined": false
}, {
"id": 43,
"name": "databases.admin.datasources.jdbc.dsAcmeMySql4.USERPASSWORD",
"value": "M/qun/6aOiyklDw1MWAmrLt9k7rQcz77Zt8MRE0w7XdzqxcOjYvS ... ",
"propertyType": "VDP",
"parentId": 4,
"undefined": false
}, {
"id": 45,
"name": "databases.admin.datasources.jdbc.dsAcmeMySql5.USERPASSWORD",
"value": "4SQ9CRkgv3jwi4DWJAicjF1rU63q47bxocI7gpd+rbusc65qFlwM ... ",
"propertyType": "VDP",
"parentId": 4,
"undefined": false
}
]
The Solution Manager will return the property password values as encrypted.
If you send a DELETE request to the following URL, you can delete an environment property:
URL:
/vdpProperties/{number:vdpPropertyId}
Method:
DELETE
The next example deletes a property with the identifier 5:
DELETE https://solution-manager.acme.com:10090/vdpProperties/5
If the property has been successfully deleted, the response status code is 204.
Get the List of Clusters¶
The following request returns the list of clusters of an environment:
URL:
/environments/{number:environmentId}/clusters
Method:
GET
If the request has been successfully executed, the server sends the status code 200. The response body includes the list of clusters in JSON format. Each cluster can contain the following information:
{
"clusters": [
{
"id": <number>,
"name": <text>,
"uuid": <uuid>,
"enabled": <boolean>,
},
{ ... }
]
}
The following example returns a list with 2 clusters.
{
"clusters": [
{
"id": 7,
"name": "Cluster 2",
"uuid": "a5c4fdea-9545-44d3-b462-44ee4ca3f567",
"enabled": true
},
{
"id": 8,
"name": "Cluster 3",
"uuid": "5a7cd9f1-6444-4900-aafd-b11148681a39",
"enabled": false
}
]
}
Start Environment Monitoring¶
This operation starts a monitoring for an existing environment:
URL:
/environments/{number:environmentId}/monitor/start
Method:
POST
If the request succeeds, the service returns the HTTP code 200.
Example
Example of a POST request to start a monitoring for an environment with id 1
:
POST https://solution-manager.acme.com:10090/environments/1/monitor/start
Stop Environment Monitoring¶
This operation stops a monitoring for an existing environment:
URL:
/environments/{number:environmentId}/monitor/stop
Method:
POST
If the request succeeds, the service returns the HTTP code 200.
Example
Example of a POST request to stop a monitoring for an environment with id 1
:
POST https://solution-manager.acme.com:10090/environments/1/monitor/stop
Create a Cluster¶
If you execute a POST request to the following URL you can create a cluster:
URL:
/clusters
Method:
POST
Note
This operation only allows to create clusters in standard environments.
The request body has to follow this format:
{
"name": <text>,
"description": <text>, /* optional */
"environmentId": <number>,
"enabled": <boolean>,
"externalDesignStudioUrl": <text>, /* optional */,
"vdpUrlBalancer": <text>, /* optional */,
"externalSchedulerAdminToolUrl": <text>, /* optional */,
"schUrlBalancer": <text>, /* optional */,
"dcUrlBalancer": <text>, /* optional */
}
If the servers are running behind a load balancer you can fill additional information regarding how to access the corresponding tool in the main panel:
externalDesignStudioUrl: URL of Design Studio that will appear under “My Applications” for the cluster.
vdpUrlBalancer: URL of the Virtual DataPort servers load balancer that will appear under “My Applications” for the cluster.
externalSchedulerAdminToolUrl: URL of the Scheduler Administration Tool load balancer that will appear under “My Applications” for the cluster.
schUrlBalancer: URL of the Scheduler servers load balancer that will appear under “My Applications” for the cluster.
dcUrlBalancer: URL of the Data Catalog load balancer that will appear under “My Applications” for the cluster.
The environmentId is the environment identifier that can be obtained in Get the List of Environments
If the cluster has been successfully inserted, the response status code is 201.
Basic cluster creation example
The following example shows a POST request which creates a cluster in standard mode:
{
"name": "clusterSample",
"description": "A cluster sample",
"environmentId": 1,
"enabled": true
}
The response body contains the added cluster with its identifier:
{
"id": 10,
"name": "clusterSample",
"uuid": "30facc8e-7973-4817-9e95-8a6e0ebd3b0e",
"description": "A cluster sample",
"order": 1,
"environmentId": 1,
"enabled": true
}
The returned order indicates the order of the cluster within the environment.
Create a cluster with some external load balancers URLs
The following example shows a POST request which creates a cluster in environment with id 1 with load balancer information to access the different servers in the main panel:
{
"name": "Cluster sample with LB",
"description": "Cluster sample with Load Balancers",
"environmentId": 1,
"enabled": true,
"externalDesignStudioUrl": "http://load-balancer.acme.org:9090/denodo-design-studio",
"vdpUrlBalancer": "//load-balancer.acme.org:9999",
"externalSchedulerAdminToolUrl": "http://load-balancer.acme.org:9090/webadmin/denodo-scheduler-admin",
"schUrlBalancer": "//load-balancer.acme.org:8000",
"dcUrlBalancer": "http://load-balancer.acme.org:9090/denodo-data-catalog"
}
Get a Cluster¶
The following request returns the list of clusters of an environment:
URL:
/clusters/{number:clusterId}
Method:
GET
If the request has been successfully executed, the server sends the status code 200. The response body includes the cluster in JSON format with the following information:
{
"id": <number>,
"name": <text>,
"uuid": <uuid>,
"description": <text>,
"order": <number>,
"environmentId": <number>,
"enabled": <boolean>
}
The following example returns the cluster with id 10.
{
"id": 10,
"name": "clusterSample",
"uuid": "a5c4fdea-9545-44d3-b462-44ee4ca3f567",
"description": "A cluster sample",
"order": 1,
"environmentId": 1,
"enabled": true
}
Get Cluster Status¶
The following request returns information regarding the status of a cluster:
URL:
/clusters/{number:clusterId}/status
Method:
GET
If the request has been successfully executed, the server sends the status code 200. The response body includes the following information about the cluster status in JSON format with the following information:
{
"clusterId": <number>,
"status": <cluster status>,
"lastOperationType": <operation type>,
"lastOperationStatus": <operation status>
}
<cluster status>::=
"AWAITING_SERVICES"
| "AWAITING_SERVICES_ONE_REGISTERED"
| "DELETED"
| "DELETING"
| "ERROR"
| "INITIALIZING"
| "OK"
| "PENDING"
| "RESTARTING"
| "RECREATING_CLUSTER_ZERO_DOWNTIME"
| "RECREATING_FROM_SERVERS"
| "STARTING"
| "STOPPED"
| "STOPPING"
| "WARNING"
| "PENDING_RECREATION"
| "PENDING_CONFIGURATION"
<operation type>::=
"CREATING_CLUSTER"
| "MODIFYING_CLUSTER"
| "STARTING"
| "STOPPING"
| "RESTARTING"
| "RECREATING_CLUSTER_ZERO_DOWNTIME"
| "LAUNCHING_CLUSTER_UPDATE"
| "DELETING_CLUSTER"
| "LAUNCHING_CLUSTER_DEPLOYMENT"
| "RECREATING_CLUSTER"
| "RECREATING_CLUSTER_FROM_SERVERS"
<operation status>::=
"IN_PROGRESS"
| "OK"
| "ERROR"
| "PENDING"
| "WARNING"
| "SKIPPED"
In the response the following fields are common for any type of cluster:
clusterId: Id of the cluster.
status: Status of the cluster. You can see the different status for a cluster in the overview screen here. Standard clusters will be in “OK” status.
The following fields are specific for automated mode clusters:
lastOperationType: Last operation performed with the cluster (creation, start, stop, deployment, update…)
lastOperationStatus: Status of the last operation in the cluster.
The following example returns the status of an automated cluster with id 10 after an stop operation.
{
"clusterId": 10,
"status": "STOPPED",
"lastOperationType": "STOPPING",
"lastOperationStatus": "OK"
}
Update a Cluster¶
If you execute a PUT request to the following URL you can update a cluster:
URL:
/clusters/{number:clusterId}
Method:
PUT
Note
This operation only allows to update clusters in standard environments.
The request body has to follow this format:
{
"name": <text>,
"description": <text>, /* optional */
"environmentId": <number>,
"enabled": <boolean>,
"externalDesignStudioUrl": <text>, /* optional */,
"vdpUrlBalancer": <text>, /* optional */,
"externalSchedulerAdminToolUrl": <text>, /* optional */,
"schUrlBalancer": <text>, /* optional */,
"dcUrlBalancer": <text>, /* optional */
}
If the cluster has been successfully updated, the response status code is 200.
Update cluster example
The next example shows a PUT request which update the cluster with id 10:
{
"name": "clusterSample updated",
"description": "A cluster sample updated",
"enabled": true
}
The response body contains the updated cluster:
{
"id": 10,
"name": "clusterSample updated",
"uuid": "a5c4fdea-9545-44d3-b462-44ee4ca3f567",
"description": "A cluster sample updated",
"order": 1,
"environmentId": 1,
"enabled": true
}
Update a cluster with some external load balancers URLs
The next example shows a PUT request which updates a cluster with id 10 with load balancer information to access the different servers in the main panel:
{
"name": "Updated cluster sample with LB",
"description": "Updated cluster sample with Load Balancers",
"enabled": true,
"externalDesignStudioUrl": "http://load-balancer.acme.org:9090/denodo-design-studio",
"vdpUrlBalancer": "//load-balancer.acme.org:9999",
"externalSchedulerAdminToolUrl": "http://load-balancer.acme.org:9090/webadmin/denodo-scheduler-admin",
"schUrlBalancer": "//load-balancer.acme.org:8000",
"dcUrlBalancer": "http://load-balancer.acme.org:9090/denodo-data-catalog"
}
Delete a Cluster¶
If you send a DELETE request to the following URL, you can delete a cluster:
URL:
/clusters/{number:clusterId}
Method:
DELETE
The next example deletes a cluster with the identifier 10:
DELETE https://solution-manager.acme.com:10090/clusters/10
If the cluster has been successfully deleted, the response status code is 204. This operation deletes all the servers contained in the cluster.
Get the List of Scheduler Properties Associated to a Cluster¶
The following URL returns the list of Scheduler properties for a given cluster:
URL:
/clusters/{number:clusterId}/schProperties
Method:
GET
Parameters:
propertyName
: this parameter specifies an exact property name.projectName
: this parameter filters properties by project name.elementType
: this parameter filters properties by element type (for example, data source).elementTypeName
: this parameter filters properties by element type name (for example, VDP).elementName
: this parameter filters properties by element name.
The URL path must include the cluster identifier. The following URL returns the Scheduler properties for the cluster with the identifier 3.
curl --user "jsmith" "https://solution-manager.acme.com:10090/cluster/3/schProperties"
Optional Request Parameters to Filter Cluster Properties¶
The following URL specifies the parameter propertyName and returns a Scheduler property with name SolutionManager.dataSource.ARN-Index.arnIndex.host
.
curl --user "jsmith" "https://solution-manager.acme.com:10090/clusters/4/schProperties?propertyName=SolutionManager.dataSource.ARN-Index.arnIndex.host"
Note
If propertyName is specified, the other parameters are ignored.
The parameter projectName filters properties by project.
The following URL returns all properties matching SolutionManager.*
curl --user "jsmith" "https://solution-manager.acme.com:10090/clusters/2/schProperties?projectName=SolutionManager"
The parameter elementType filters properties by element type.
The following URL returns all properties matching *.datasource.*
. Example: SolutionManager.dataSource.ARN-Index.arnIndex.port
.
curl --user "jsmith" "https://solution-manager.acme.com:10090/clusters/2/schProperties?elementType=datasource"
The parameter elementTypeName filters properties by element type name.
The following URL returns all properties related with ARN-Index. Example: SolutionManager.dataSource.ARN-Index.arnIndex.port
.
curl --user "jsmith" "https://solution-manager.acme.com:10090/clusters/2/schProperties?elementTypeName=ARN-Index"
The parameter elementName filters properties by element name. The following URL returns the properties of the data source named arnIndex.
curl --user "jsmith" "https://solution-manager.acme.com:10090/clusters/2/schProperties?elementName=arnIndex"
Except the parameter propertyName, the others can be combined in the same request. For example, the following URL returns all data source properties of the project SolutionManager.
curl --user "jsmith" "https://solution-manager.acme.com:10090/clusters/2/schProperties?projectName=SolutionManager&elementType=datasource"
Create and Delete Cluster Properties¶
You can execute a POST request to the following URL to create cluster properties:
URL:
/clusters/{number:clusterId}/schProperties
Method:
POST
The request body must include the list of properties, according to the following format:
[
{
"name" : <text>,
"value" : <text>,
"undefined" : <boolean>, /* optional */
"valueEncrypted" : <boolean> /* optional */
},
{ ... }
]
The undefined
attribute is optional; if you do not indicate it, this value is false by default.
About the attribute valueEncrypted
, consider this:
The Solution Manager stores encrypted the values of properties that represent passwords of data sources, user accounts and other values. However, when you use the API to define these properties, you can send their value encrypted or in clear text.
The values the Solution Manager stores encrypted are the ones that if you export the VQL of that element, it has the token
ENCRYPTED
next to the value.If
valueEncrypted
istrue
, it indicates thatvalue
is encrypted.To encrypt a value, use the script
<SOLUTION_MANAGER_HOME>/bin/encrypt_password
.If
valueEncrypted
isfalse
,value
is treated as clear text.valueEncrypted
is optional; if it is not defined and this property represents a password, the API tries to decrypt the password. If the password cannot be decrypted, it is treated as clear text.
The next example shows a POST request which creates some properties:
[
{
"name": "default.dataSource.VDP.vdp.connectionURI",
"value": "//solution-manager.acme.com:19999/admin"
}, {
"name": "default.dataSource.VDP.vdp.login",
"value": "admin"
}, {
"name": "default.dataSource.VDP.vdp.password",
"value": "5Aq8JFwEcYWcfIXzZiC8jkxXLqyiKshHGf+TIY0pky/kK1KBkyg3 ... "
}, {
"name": "default.dataSource.VDP.vdp2.connectionURI",
"value": "//solution-manager.acme.com:19999/admin"
}, {
"name": "default.dataSource.VDP.vdp2.login",
"value": "admin"
}, {
"name": "default.dataSource.VDP.vdp2.password",
"value": "5Aq8JFwEcYWcfIXzZiC8jkxXLqyiKshHGf+TIY0pky/kK1KBkyg3 ... ",
"valueEncrypted": true
}, {
"name": "default.dataSource.VDP.vdp3.connectionURI",
"value": "//solution-manager.acme.com:19999/admin"
}, {
"name": "default.dataSource.VDP.vdp3.login",
"value": "admin"
}, {
"name": "default.dataSource.VDP.vdp3.password",
"value": "TCcNJ8G5vxpKrjXAYWQtKtvUiQ/qh8hT9gnXdUzxIxft45Civz8i ... "
}, {
"name": "default.dataSource.VDP.vdp4.connectionURI",
"value": "//solution-manager.acme.com:19999/admin"
}, {
"name": "default.dataSource.VDP.vdp4.login",
"value": "admin"
}, {
"name": "default.dataSource.VDP.vdp4.password",
"value": "TCcNJ8G5vxpKrjXAYWQtKtvUiQ/qh8hT9gnXdUzxIxft45Civz8i ... ",
"valueEncrypted": true
}, {
"name": "default.dataSource.VDP.vdp5.connectionURI",
"value": "//solution-manager.acme.com:19999/admin"
}, {
"name": "default.dataSource.VDP.vdp5.login",
"value": "admin"
}, {
"name": "default.dataSource.VDP.vdp5.password",
"value": "admin"
}, {
"name": "default.dataSource.VDP.vdp6.connectionURI",
"value": "//solution-manager.acme.com:19999/admin"
}, {
"name": "default.dataSource.VDP.vdp6.login",
"value": "admin"
}, {
"name": "default.dataSource.VDP.vdp6.password",
"value": "admin",
"valueEncrypted": false
}, {
"name": "undefinedProperty",
"value": "",
"undefined": true
}
]
This example shows the different values supported to add data source password:
value ‘admin’ encrypted by Scheduler server for data source vdp and vdp2
value ‘admin’ encrypted with encrypt_password script for vdp3 and vdp4
clear value ‘admin’ for vdp5 and vdp6
The response body includes the created properties with their identifiers.
[
{
"id": 45,
"name": "default.dataSource.VDP.vdp.connectionURI",
"value": "//solution-manager.acme.com:19999/admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 46,
"name": "default.dataSource.VDP.vdp.login",
"value": "admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 47,
"name": "default.dataSource.VDP.vdp.password",
"value": "5Aq8JFwEcYWcfIXzZiC8jkxXLqyiKshHGf+TIY0pky/kK1KBkyg3 ... ",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 49,
"name": "default.dataSource.VDP.vdp2.connectionURI",
"value": "//solution-manager.acme.com:19999/admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 50,
"name": "default.dataSource.VDP.vdp2.login",
"value": "admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 51,
"name": "default.dataSource.VDP.vdp2.password",
"value": "5Aq8JFwEcYWcfIXzZiC8jkxXLqyiKshHGf+TIY0pky/kK1KBkyg3 ... ",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 53,
"name": "default.dataSource.VDP.vdp3.connectionURI",
"value": "//solution-manager.acme.com:19999/admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 54,
"name": "default.dataSource.VDP.vdp3.login",
"value": "admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 55,
"name": "default.dataSource.VDP.vdp3.password",
"value": "Ag/hk7xFu9t+DdFOwHm7U+fNMHn8QJsJ26gfXMk/UeTgfPcNNyH1 ... ",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 57,
"name": "default.dataSource.VDP.vdp4.connectionURI",
"value": "//solution-manager.acme.com:19999/admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 58,
"name": "default.dataSource.VDP.vdp4.login",
"value": "admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 59,
"name": "default.dataSource.VDP.vdp4.password",
"value": "gS6vbKXngsHVE2eIWYMYZIlCmtTRwIBnokVg2sgjj/JlkLMnLj7l ... ",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 61,
"name": "default.dataSource.VDP.vdp5.connectionURI",
"value": "//solution-manager.acme.com:19999/admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 62,
"name": "default.dataSource.VDP.vdp5.login",
"value": "admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 63,
"name": "default.dataSource.VDP.vdp5.password",
"value": "WdaU+vTYcAvjPrCBpDZbSrR3CvegkbPBCZtpv/amhDpxLoZMLmmw ... ",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 65,
"name": "default.dataSource.VDP.vdp6.connectionURI",
"value": "//solution-manager.acme.com:19999/admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 66,
"name": "default.dataSource.VDP.vdp6.login",
"value": "admin",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 67,
"name": "default.dataSource.VDP.vdp6.password",
"value": "s0jcp9bWAR8drBZTGn4j3BMbQzpvSVaG96+YdJVw9Jb0AgSyVDp1 ... ",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": false
},
{
"id": 69,
"name": "undefinedProperty",
"value": "",
"propertyType": "SCHEDULER",
"parentId": 5,
"undefined": true
}
]
This operation returns the passwords encrypted.
If you send a DELETE request to the following URL, you can delete a cluster property:
URL:
/schProperties/{number:schPropertyId}
Method:
DELETE
The next example deletes a property with identifier 5:
DELETE https://solution-manager.acme.com:10090/schProperties/5
If the property has been successfully deleted, the response status code is 204.
Get the List of Servers¶
The following request returns the list of servers in an environment:
URL:
/environments/{number:environmentId}/servers
Method:
GET
If the request has been successfully executed, the server sends the status code 200. The response body includes the list of servers with basic information in JSON format. Each server can contain the following information:
{
"servers": [
{
"id": <number>,
"name": <text>,
"typeNode": <type-node>,
"clusterId": <number>, /* id of the cluster to which it belongs */
"enabled": <boolean>
},
{ ... }
]
}
<type-node> ::= "VDP" | "SCHEDULER" | "VDP_DATA_CATALOG"
The following example get the servers of the environment with identifier 6.
curl --user "jsmith" "https://solution-manager.acme.com:10090/environments/6/servers"
{
"servers": [
{
"id": 9,
"name": "vdpServer",
"typeNode": "VDP",
"clusterId": 7,
"enabled": true
},
{
"id": 10,
"name": "schedulerServer",
"typeNode": "SCHEDULER",
"clusterId": 7,
"enabled": true
}
]
}
See get server to get more info about a server.
Create a Server¶
If you execute a POST request to the following URL you can create a server:
URL:
/servers
Method:
POST
Note
This operation only allows to create servers in standard environments.
The request body has to follow this format:
{
"id": <number> ,
"name": <text> ,
"description": <text> , /* optional */
"typeNode": <node type> ,
"urlIP": <text> ,
"urlPort": <number> ,
"clusterId": <number> ,
"useKerberos": <boolean> ,
"usePassThrough": <boolean> ,
"username": <text> ,
"password": <text> ,
"defaultDatabase": <text> ,
"enabled": <boolean> ,
"licenseAlias": <text> , /* optional */
"useDefaultLicenseAlias": <boolean>,
"environmentType": <environment type>, /* only "STANDARD" <environment type> is supported */
"infrastructureDto": { /* optional */
"provider": <text>, /* optional */
"region": <text> /* optional */
}
}
<node type>::=
"VDP"
| "SCHEDULER"
| "VDP_DATA_CATALOG"
<environment type>::= "STANDARD" | "AUTOMATED_AWS"
Note
Since update 9.1, the username and password fields are ignored for the “VDP_DATA_CATALOG” servers.
The clusterId must be the cluster identifier that can be obtained in Get the List of Clusters.
The password accepts the following values:
clear password
password encrypted with the encrypt_password script located in <SOLUTION_MANAGER_HOME>/bin
If useDefaultLicenseAlias is true, you can ommit the licenseAlias field or use an empty string. If useDefaultLicenseAlias is false, then you must indicate the license alias that can be obtained in Get the List of Licenses Available. If the server has been successfully inserted, the response status code is 201.
The next example shows a POST request which create a server:
{
"name": "vdpLocal",
"description": "",
"typeNode": "VDP",
"urlIP": "cajun",
"urlPort": 9999,
"clusterId": 11,
"useKerberos": false,
"usePassThrough": false,
"username": "admin",
"password": "admin",
"defaultDatabase": "admin",
"enabled": true,
"licenseAlias": "",
"useDefaultLicenseAlias": true,
"environmentType": "STANDARD",
"infrastructureDto": {
"provider": "On prem"
}
}
In this example password is a clear password. If the password is generated with the encrypt_password script, the password will be similar to:
"password": "8seLz7OWe6SRc9ivmekrkE+NTn8DzGxy",
The response body contains the added server with its identifier:
{
"id": 12,
"name": "vdpLocal",
"uuid": "e8b408c3-8b7d-4d28-a98a-ac448c08b98a",
"description": "",
"typeNode": "VDP",
"urlIP": "cajun",
"urlPort": 9999,
"clusterId": 11,
"useKerberos": false,
"usePassThrough": false,
"username": "admin",
"defaultDatabase": "admin",
"enabled": true,
"licenseAlias": "",
"useDefaultLicenseAlias": true,
"environmentType": "STANDARD",
"environmentId": 2,
"infrastructureDto": {
"provider": "On prem"
}
}
Get a Server¶
The following request returns a server:
URL:
/servers/{number:serverId}
Method:
GET
If the request has been successfully executed, the server sends the status code 200. The response body includes the server in JSON format with the following information:
{
"id": <number>,
"name": <text>,
"uuid": <uuid>,
"description": <text>,
"typeNode": <node type>,
"urlIP": <text>,
"urlPort": <number>,
"clusterId": <number>,
"useKerberos": <boolean>,
"usePassThrough": <boolean>,
"username": <text>,
"defaultDatabase": <text>,
"enabled": <boolean>,
"licenseAlias": <text>,
"useDefaultLicenseAlias": <boolean>,
"environmentType": <environment type>,
"environmentId": <number>,
"infrastructureDto": {
"provider": <text>,
"region": <text>
}
}
<node type>::=
"VDP"
| "SCHEDULER"
| "VDP_DATA_CATALOG"
<environment type>::= "STANDARD" | "AUTOMATED_AWS"
Note
Since update 9.1, the username and password fields are not included for the “VDP_DATA_CATALOG” servers.
Any property with null value will not be included in the JSON.
The following example returns the server with id 12.
{
"id": 12,
"name": "vdpLocal",
"uuid": "e8b408c3-8b7d-4d28-a98a-ac448c08b98a",
"description": "",
"typeNode": "VDP",
"urlIP": "cajun",
"urlPort": 9999,
"clusterId": 11,
"useKerberos": false,
"usePassThrough": false,
"username": "admin",
"defaultDatabase": "admin",
"enabled": true,
"licenseAlias": "",
"useDefaultLicenseAlias": true,
"environmentType": "STANDARD",
"environmentId": 2,
"infrastructureDto": {
"provider": "On prem"
}
}
Update a Server¶
If you execute a PUT request to the following URL you can update a server:
URL:
/servers/{number:serverId}
Method:
PUT
Note
This operation only allows to update servers in standard environments.
The request body has to follow this format:
{
"name": <text>,
"description": <text>, /* optional */
"typeNode": <node type>,
"urlIP": <text>,
"urlPort": <number>,
"clusterId": <number>,
"useKerberos": <boolean>,
"usePassThrough": <boolean>,
"username": <text>,
"password": <text>,
"defaultDatabase": <text>,
"enabled": <boolean>,
"licenseAlias": <text>, /* optional */
"useDefaultLicenseAlias": <boolean>,
"environmentType": <environment type>,
"infrastructureDto": { /* optional */
"provider": <text>, /* optional */
"region": <text> /* optional */
}
}
<node type>::=
"VDP"
| "SCHEDULER"
| "VDP_DATA_CATALOG"
<environment type>::= "STANDARD" | "AUTOMATED_AWS"
Note
Since update 9.1, the username and password fields are ignored for the “VDP_DATA_CATALOG” servers.
Note
The password accepts the following values:
“********” (8 asterisks), this values does not modify the password value
Clear password
A password encrypted with the encrypt_password script located in <SOLUTION_MANAGER_HOME>/bin
If the server has been successfully updated, the response status code is 200.
The next example shows a PUT request which update the server with id 12:
{
"name": "vdpLocal-modif",
"description": "",
"typeNode": "VDP",
"urlIP": "cajun",
"urlPort": 9999,
"clusterId": 11,
"useKerberos": false,
"usePassThrough": false,
"username": "admin",
"password": "********",
"defaultDatabase": "admin",
"enabled": true,
"licenseAlias": "",
"useDefaultLicenseAlias": true,
"environmentType": "STANDARD",
"infrastructureDto": {
"provider": "AWS",
"region": "eu-west-1"
}
}
The response body contains the updated server:
{
"id": 12,
"name": "vdpLocal-modif",
"uuid": "e8b408c3-8b7d-4d28-a98a-ac448c08b98a",
"description": "",
"typeNode": "VDP",
"urlIP": "cajun",
"urlPort": 9999,
"clusterId": 11,
"useKerberos": false,
"usePassThrough": false,
"username": "admin",
"defaultDatabase": "admin",
"enabled": true,
"licenseAlias": "",
"useDefaultLicenseAlias": true,
"environmentType": "STANDARD",
"environmentId": 2,
"infrastructureDto": {
"provider": "AWS",
"region": "eu-west-1"
}
}
Delete a Server¶
If you send a DELETE request to the following URL, you can delete a server:
URL:
/servers/{number:serverId}
Method:
DELETE
The next example deletes a property with the identifier 12:
DELETE https://solution-manager.acme.com:10090/servers/12
If the server has been successfully deleted, the response status code is 204.
Export Solution Manager Catalog and Configuration¶
This operation exports the environments, clusters and servers and some settings of the Solution Manager.
URL:
/export
Method:
POST
Syntax of the body of the request:
{
"customPasswd" : <text> /* Optional. Used for sensitive data encryption */
}
Note
If you specify a custom password, you will need to specify the same password when you import the exported content. If you do not want to encrypt the content, leave the body of the request empty.
If the export operation is successful, the response status code is 200.
Example of a POST request to get export content encrypted with a custom password:
POST https://solution-manager.acme.com:10090/export
{
"customPasswd" : "passwd"
}
Import Solution Manager Catalog and Configuration¶
This operation imports a file that contains the environments, clusters and servers and some settings of the Solution Manager.
URL:
/import
Method:
POST
Parameters:
overwrite
: Optional. Possible values true or false. If the imported file contains information about an environment that already exists, set this totrue
. Otherwise, it will not be imported.
Syntax of the body of the request:
{
"exportOptions" : {
"customPasswd" : <text> /* Optional. Used for sensitive data encryption. Only needed if you specified a value for the export operation */
},
"importData" : <JSON catalog info> /* Copy the JSON content of the export here */
}
Note
If you specified a custom password during the export process, you will need to specify the same password for the import operation. If you did not encrypt the export content, leave the exportOptions field in the body of the request empty.
If the operation is successful, the response status code is 200.
Import example without custom password
Example of a POST request to import the content of an export operation:
POST https://solution-manager.acme.com:10090/import
{
"importData" : {
"environments": [
{
"id": 230,
"name": "test",
"uuid": "8a7ad34c-b61a-435b-a428-7df36a04a397",
"minimumUpdateMandatory": false,
"licenseAlias": "DEVELOPMENT_1",
"environmentType": "ON_PREMISES",
"deploymentConfiguration": {
"deploymentsEnabled": true,
"deploymentType": "ONLINE",
"sharedCache": false,
"cacheURLPrimary": "",
"cacheURLSecondary": "",
"clusterStrategy": "ONE_BY_ONE",
"serverStrategy": "ONE_BY_ONE",
"rollbackEnabled": false,
"backupEnabled": false,
"dataCatalogSynchronizeEnabled": false,
"dataCatalogSyncType": "ALL",
"dataCatalogSyncPriority": "SERVER_WITH_LOCAL_CHANGES",
"dataCatalogVDPServerToSync": "",
"environmentSyncDataCatalogs": []
}
}
]
}
}
Import example with custom password and overwriting data
Example of a POST request to import the content of an export operation, specifying a custom password and overwriting existing elements:
POST https://solution-manager.acme.com:10090/import?overwrite=true
{
"exportOptions" : {
"customPasswd" : "exportPasswd"
},
"importData" : {
"environments": [
{
"id": 230,
"name": "test",
"uuid": "8a7ad34c-b61a-435b-a428-7df36a04a397",
"minimumUpdateMandatory": false,
"licenseAlias": "DEVELOPMENT_1",
"environmentType": "ON_PREMISES",
"deploymentConfiguration": {
"deploymentsEnabled": true,
"deploymentType": "ONLINE",
"sharedCache": false,
"cacheURLPrimary": "",
"cacheURLSecondary": "",
"clusterStrategy": "ONE_BY_ONE",
"serverStrategy": "ONE_BY_ONE",
"rollbackEnabled": false,
"backupEnabled": false,
"dataCatalogSynchronizeEnabled": false,
"dataCatalogSyncType": "ALL",
"dataCatalogSyncPriority": "SERVER_WITH_LOCAL_CHANGES",
"dataCatalogVDPServerToSync": "",
"environmentSyncDataCatalogs": []
}
}
]
}
}
Get the List of Revisions¶
The following URL returns the list of revisions:
URL:
/revisions
Method:
GET
Parameters:
start
: this parameter specifies the first element of the collection to be returned.count
: this parameter specifies the maximum number of results to be returned.
The response body includes the list of revisions according to the following format:
{
"start": <number> , /* specifies the first revision of the collection to be returned */
"count": <number> , /* maximum number of revisions to be returned */
"numElements": <number> , /* total number of revisions included in the response */
"revisions": [{
"id": <number> ,
"description": <text> ,
"name": <text> ,
"type": { "INSERT" | "DELETE" }, /* alias for CREATE and DROP */
"replace": <replace-drop Virtual DataPort elements> ,
"creationUser": <text>,
"creationTime": <date>, /* date format: yyyy-MM-dd'T'HH:mm:ss.SSZ */
"lastModifiedUser": <text>,
"lastModifiedTime": <date>, /* date format: yyyy-MM-dd'T'HH:mm:ss.SSZ */
"hasVql": <boolean>,
"hasScheduler": <boolean>,
"includeJars": <boolean>,
"includeI18N": <boolean>,
"includeStatistics": <boolean>,
"includeServerProperties": <boolean>,
"includeWebContainerProperties": <boolean>,
"includeJdbcWrapperProperties": <boolean>,
"includeVdpDependencies": <boolean>,
"includeUsersAndPrivileges": <boolean>,
"useDefaultDatabase": <boolean>,
"deployedOn": [/* list of environments in which the revision was already deployed */
{
"id": <number> ,
"name": <text> ,
"description": <text> ,
"minimumUpdateMandatory": <boolean>
}, {
...
}
]
}, {
...
}
]
}
<replace-drop Virtual DataPort elements>::=
"DO_NOT_REPLACE_EXISTING"
| "REPLACE_EXISTING"
| "DROP_ELEMENTS_BEFORE"
The following example represents two revisions in JSON format. The first one was deployed on 2 environment, the second one was not deployed on any environment:
{
"start": 0,
"count": 10,
"numElements": 2,
"revisions": [
{
"id": 3,
"description": "Third revision",
"name": "Revision 3",
"type": "INSERT",
"replace": "DO_NOT_REPLACE_EXISTING",
"creationUser": "smadmin",
"creationTime": "2017-11-11T00:15:34.507+0000",
"lastModifiedUser": "smadmin",
"lastModifiedTime": "2017-11-11T00:15:34.507+0000",
"hasVql": true,
"hasScheduler": false,
"includeJars": false,
"includeI18N": false,
"includeStatistics": false,
"includeServerProperties": false,
"includeWebContainerProperties": false,
"includeJdbcWrapperProperties": true,
"includeVdpDependencies": false,
"includeUsersAndPrivileges": false,
"useDefaultDatabase": true,
"deployedOn": [
{
"id": 2,
"name": "Environment 2",
"description": "Second environment",
"minimumUpdateMandatory": false
},
{
"id": 3,
"name": "Environment 3",
"description": "Third environment",
"minimumUpdateMandatory": false
}
]
},
{
"id": 2,
"description": "Second revision",
"name": "Revision 2",
"type": "DELETE",
"replace": "DROP_ELEMENTS_BEFORE",
"creationUser": "smadmin",
"creationTime": "2017-11-11T00:15:34.429+0000",
"lastModifiedUser": "smadmin",
"lastModifiedTime": "2017-11-11T00:15:34.429+0000",
"hasVql": true,
"hasScheduler": false,
"includeJars": false,
"includeI18N": false,
"includeStatistics": false,
"includeServerProperties": false,
"includeWebContainerProperties": false,
"includeJdbcWrapperProperties": true,
"includeVdpDependencies": false,
"includeUsersAndPrivileges": false,
"useDefaultDatabase": true
}
]
}
Create a Revision from a VQL File¶
You can execute a POST request to the following URL to create a revision from a VQL file:
URL:
/revisions/loadFromVQL
Method:
POST
The request body has to follow this format:
{
"name": <text>, /* descriptive name for the revision*/
"description": <text>, /* optional. Extensive description about the revision. */
"content": <text> /* VQL file content as **xsd:base64Binary** encoded in **UTF-8** */
}
Note
The field content
must be the content of the VQL file as xsd:base64Binary encoded in UTF-8.
The revision will be created even if the VQL is not parameterized with environment properties. We strongly recommend you always generate VQL files with specific environment properties separately. If you generate the VQL using Design Studio, select the option Export environment specific properties separately in the Export and Export database dialogs. Otherwise, check that the VQL file does not contain environment property values like the passwords of JDBC data sources. Deploying a revision created from a VQL without separate environment properties can generate unexpected results.
Note
The VQL files generated when exporting elements using VDP Admin Tool includes the BOM mark to indicate that they are encoded in UTF-8. The BOM mark must be skipped.
The response body contains the added revision with its identifier:
{
"id": 4,
"description": "Creating revision using exportTestDB-WithProperties",
"name": "revFromVQLWithProperties",
"type": "VQL",
"replace": "REPLACE_EXISTING",
"creationUser": "admin",
"creationTime": "2019-08-27T15:22:59.292+0000",
"lastModifiedUser": "admin",
"lastModifiedTime": "2019-08-27T15:22:59.292+0000",
"hasVql": false,
"hasScheduler": false,
"includeJars": false,
"includeI18N": false,
"includeStatistics": false,
"includeServerProperties": false,
"includeWebContainerProperties": false,
"includeJdbcWrapperProperties": true,
"includeVdpDependencies": false,
"includeUsersAndPrivileges": false,
"useDefaultDatabase": true
}
Download the VQL of a Revision¶
The following request downdloads the VQL of a revision:
URL:
/revisions/{number:revisionId}/VQL
Method:
GET
If the request has been successfully executed, the server sends the status code 200. The response body includes the VQL of the revision in text format. If the revision has no VQL, the response body is empty but the status code 200 is maintained.
Note
The VQL generated includes the BOM mark to indicate that it is encoded in UTF-8.
Example
The following request downloads the VQL of the revision with identifier 1:
GET https://solution-manager.acme.com:10090/revisions/1/VQL
If the request succeeds, the service returns the HTTP code of 200 and the response body is the VQL.
Download the Scheduler ZIP of a Revision¶
The following request downloads the Scheduler zip metatada of a revision:
URL:
/revisions/{number:revisionId}/schedulerZip
Method:
GET
If the request has been successfully executed, the server sends the status code 200. The response body includes the zip file with the Scheduler jobs included in the revision. If the revision has no Scheduler elements, the response body is empty but the status code 200 is maintained.
Example
The following request downloads the Scheduler zip metatada of a revision with identifier 1:
GET https://solution-manager.acme.com:10090/revisions/1/schedulerZip
If the request succeeds, the service returns the HTTP code of 200 and the response body is the Scheduler metadata zip.
Get the List of Deployments¶
The following URL returns the list of deployments:
URL:
/deployments
Method:
GET
Parameters:
start
: this parameter specifies the first deployment of the collection to be returned.count
: this parameter specifies the maximum number of deployments to be returned.environmentId
: this parameter filters deployments by target environment.status
: this parameter filters deployments by execution status (OK, ERROR, IN_PROGRESS).description
: this parameter filters deployments by description.user
: this parameter filters deployments by user.startDeploymentTime
: this parameter filters deployments by start deployment time. Date format is yyyy-MM-dd’T’HH:mm:ssZ.endDeploymentTime
: this parameter filters deployments by end deployment time. Date format is yyyy-MM-dd’T’HH:mm:ssZ.
The response body includes the deployments in JSON format, according to the following template:
{
"start": <number>,
"count": <number>,
"numElements": <number>,
"deployments": [{
"id": <number>,
"user": <text>,
"deploymentTime": <date>, /* date format: yyyy-MM-dd'T'HH:mm:ss.SSZ */
"description": <text>,
"state": <deployment status>,
"multipleErrors": <boolean>,
"targetEnvironment": {
"id": <number>,
"name": <text>,
"minimumUpdateMandatory": <boolean>
},
"revisions": [{
"id": <number>,
"description": <text>,
"name": <text>,
"includeJars": <boolean>,
"includeI18N": <boolean>,
"includeStatistics": <boolean>,
"includeServerProperties": <boolean>,
"includeWebContainerProperties": <boolean>,
"includeJdbcWrapperProperties": <boolean>,
"includeVdpDependencies": <boolean>,
"includeUsersAndPrivileges": <boolean>
}, { ... }
],
}, { ... }
]
}
<deployment status>::=
"OK"
| "ERROR"
| "IN_PROGRESS"
| "PENDING"
| "CANCELLED"
The following example returns a list of 2 deployments:
{
"start": 0,
"count": 10,
"numElements": 2,
"deployments": [{
"id": 28,
"user": "admin",
"deploymentTime": "2017-11-12T23:05:53.179+0000",
"description": "",
"targetEnvironment": {
"id": 3,
"name": "Environment 3",
"minimumUpdateMandatory": false
},
"revisions": [{
"id": 3,
"description": "Third revision",
"name": "Revision 3",
"includeJars": false,
"includeI18N": false,
"includeStatistics": false,
"includeServerProperties": false,
"includeWebContainerProperties": false,
"includeJdbcWrapperProperties": true,
"includeVdpDependencies": false,
"includeUsersAndPrivileges": false
}
],
"state": "OK",
"multipleErrors": false
}, {
"id": 27,
"user": "admin",
"deploymentTime": "2017-11-12T23:05:40.838+0000",
"description": "",
"targetEnvironment": {
"id": 3,
"name": "Environment 3",
"minimumUpdateMandatory": false
},
"revisions": [{
"id": 3,
"description": "Third revision",
"name": "Revision 3",
"includeJars": false,
"includeI18N": false,
"includeStatistics": false,
"includeServerProperties": false,
"includeWebContainerProperties": false,
"includeJdbcWrapperProperties": true,
"includeVdpDependencies": false,
"includeUsersAndPrivileges": false
}
],
"state": "OK",
"multipleErrors": false
}
]
}
The following URL returns the list of deployments between 2017-11-07T16:50:32+0100
and 2017-11-15T16:50:33+0100
.
You must specify both parameters, startDeploymentTime and endDeploymentTime, together.
curl --user "jsmith" "https://solution-manager.acme.com:10090/deployments?startDeploymentTime=2017-11-07T16%3A50%3A32%2B0100&endDeploymentTime=2017-11-15T16%3A50%3A33%2B0100"
The following URL returns the list of deployments in progress.
curl --user "jsmith" "https://solution-manager.acme.com:10090/deployments?status=IN_PROGRESS"
Start a New Deployment from a List of Revisions¶
You can execute a new deployment sending a POST request to the following URL:
URL:
/deployments
Method:
POST
The request body must follow the template below.
{
"revisionIds": [ <number>, ... ],
"environmentId": <number>,
"description": <text>
}
This request must include the list of revision identifiers (revisionIds) and also the identifier of the target environment (environmentId). The revisions are executed in the order specified in revisionIds. The following example creates a deployment from the revisions 1 and 2, on the target environment identified with the id 3.
{
"revisionIds": [1, 2],
"environmentId": 3,
"description": "My first deployment"
}
It the deployment has been successfully created, the response body contains the numeric deployment identifier. Since update 9.1 Solution Manager allows to enable queuing deployments in an environment, if a deployment is queued a new attribute queuedDeployment is included in the response.
{
"deploymentId": 7,
"queuedDeployment" : true /* this is filled only when a deployment is queued */
}
If some property is missing in the target environment, the deployment process fails and the response body returns the result of the validation.
{
"validationResponse": {
"validation": {
"resultVqlValidation": "ERROR",
"outputVqlValidation": "Error validating revision 'Third revision'.\n Missing VQL properties: \ndatabases.admin.datasources.jdbc.oracle_ds.DATABASEURI\ndatabases.admin.datasources.jdbc.oracle_ds.USERNAME\ndatabases.admin.datasources.jdbc.oracle_ds.USERPASSWORD\ndatabases.admin.datasources.jdbc.oracle_ds.USERPASSWORD.ENCRYPTED\nusers.user1.PASSWORD\nusers.user1.PASSWORD.ALGORITHM\nusers.user1.PASSWORD.ENCRYPTED\n\n",
"errorVqlValidation": "Error validating revision 'Third revision'.\n Some Virtual DataPort properties required by the revision are not defined in the target environment\n\n",
"missingVqlPropertiesWithServerValues": {
"users.user1.PASSWORD": "ISTcnym4dJECzqYlA7+Xv6+RJo5s0VupzxEhXqoXC9XHu+5+M03kn3ftHGwW57FB5Q1d4Glcad4g54l9iBdEm55U431gIeob",
"users.user1.PASSWORD.ALGORITHM": "SHA512",
"databases.admin.datasources.jdbc.oracle_ds.USERPASSWORD.ENCRYPTED": "ENCRYPTED",
"databases.admin.datasources.jdbc.oracle_ds.USERPASSWORD": "hJfznA24IFFPM8Z+6qCDO6Kg2Z3OSjP8W+uooHqFUpp8MoJT1FC3gdgsFe8cyh+Xmvu0dPIkFY21fidp75fqE4euFqx9QpH4Y8gcRE3CaeszFlB97AXg4dJ99eJFbWZ7",
"users.user1.PASSWORD.ENCRYPTED": "ENCRYPTED",
"databases.admin.datasources.jdbc.oracle_ds.USERNAME": "dblogin",
"databases.admin.datasources.jdbc.oracle_ds.DATABASEURI": "jdbc:oracle:thin:@host:port:database"
},
"resultSchValidation": "OK",
"outputSchValidation": "",
"errorSchValidation": "",
"targetEnvironment": {
"id": 1,
"name": "env1",
"uuid": "9417994b-3657-499a-a3b0-234cab5dfc07",
"description": "",
"minimumUpdateValue": "",
"minimumUpdateMandatory": false,
"minimumUpdateDownloadUrl": "",
"licenseAlias": "PRODUCTION_1"
},
"state": "ERROR",
"messageResult": "Some of the Virtual DataPort properties included in the revision are not defined in the target environment. "
},
"scriptValidationsResult": []
}
}
Get the Progress of a Deployment¶
The following URL returns the deployment status and the list of deployment tasks:
URL:
/deployments/{number:deploymentId}/progress
Method:
GET
Parameters:
lastUpdate
: filters deployment tasks by last update date.
The response body includes the deployment progress and the list of deployment tasks according to the following template:
{
"deploymentId": <number>,
"state": <deployment state>,
"progress": <number>, /* percent between 0 and 100 */
"tasks": [{
"id": <number>,
"name": <text>,
"state": <deployment task state>,
"startDate": <date>,
"endDate": <date>,
"deploymentExecutionType": <deployment execution type>,
"output": <text>,
"cluster": {
"id": <number>,
"name": <text>,
"enabled": <boolean>
},
"server": {
"id": <number>,
"name": <text>,
"enabled": <boolean>,
"useDefaultLicenseAlias": <boolean>
}
}, { ... }
]
}
<deployment state> ::=
"OK"
| "ERROR"
| "IN_PROGRESS"
| "PENDING"
| "CANCELLED"
| "QUEUED"
| "QUEUED_CANCELLED"
<deployment task state> ::=
"OK"
| "ERROR"
| "IN_PROGRESS"
| "PENDING"
| "WARNING"
| "SKIPPED"
| "CANCELLED"
<deployment execution type> ::=
"VQL"
| "SCH"
| "CACHE"
| "DATACATALOG_SYNC"
| "SCRIPT_CLUSTER"
| "SCRIPT_SERVER"
| "BACKUP"
| "ROLLBACK"
| "SERVER_DEPLOYMENT"
| "CLUSTER_DEPLOYMENT"
| "INITIALIZE_DEPLOYMENT_INSTANCE"
| "CLUSTER_REBOOT"
| "PROMOTION_CONFIG"
| "VQL_TRANSACTIONAL"
| "VQL_COMMIT"
| "VQL_ROLLBACK"
The optional request parameter lastUpdate filters tasks by last update date. If it is specified, the response body only include tasks modified since this date.
The following example shows an example of deployment progress with 1 execution task:
{
"deploymentId": 1,
"state": "OK",
"progress": 100,
"tasks": [{
"id": 1,
"name": "Revision Revision 1 VQL deployment",
"state": "OK",
"startDate": "2017-11-13T11:18:40.999+0000",
"endDate": "2017-11-13T11:18:41.065+0000",
"deploymentExecutionType": "VQL",
"output": " - Executed 1 of 1 VQL commands",
"cluster": {
"id": 7,
"name": "Cluster 2",
"enabled": true
},
"server": {
"id": 8,
"name": "Server 3",
"enabled": true,
"useDefaultLicenseAlias": true
}
}
]
}
Free License Usage¶
When you stop a Denodo server (e.g. Virtual DataPort server, Scheduler server, etc.), it sends an HTTP request to the License Manager, to notify that is going to stop. When the License Manager receives this request, it frees the corresponding license so it can be used by another server.
If a Denodo server stops working unexpectedly (e.g. the machine where it runs is restarted unexpectedly), you have to manually notify the License Manager that the license that this Denodo server was using, is no longer in use. Otherwise, the license will be considered in use until the grace period expires (5 days since the last time this Denodo server renewed its license).
To free up a license, log in to the Solution Manager. In the Elements Tree, open the definition of the server whose license you want to free up and copy the field Host .
Then, send a request to this endpoint:
URL:
/externalShutdown
Method:
GET
URL parameters:
nodeIp
: if the field Host in the Solution Manager is an IP address - not a host name - the value of this parameter has to be this IP address.hostDomainName
: if the field Host in the Solution Manager is a host name, the value of this parameter has to be this host name.instanceId
: instance id of the automated cloud mode server instance.port
: port of the Denodo server.product
: the value has to beVDP
,SCHEDULER
orVDP_DATA_CATALOG
.
Consider these:
The names of the parameters are case sensitive.
You have to add the parameter
instanceId
,nodeIp
orhostDomainName
to the URL. WheninstanceId
is specified,nodeIp
arehostDomainName
are ignored. Otherwise, you have to add the parameternodeIp
orhostDomainName
to the URL, not both.If a parameter is missing, the service returns the HTTP code 400 (Bad Request).
Unlike with the other endpoints described in this page, do not add the HTTP header
Cookie
to the requests.Unlike the other endpoints described in this page, the endpoint is the License Manager server, not the Solution Manager server. Therefore, the port is different (by default, 10091, not 10090 like the other operations)
Examples
Example #1
Free the license associated with the Virtual DataPort server that runs on the host denodo-dv1-prod.denodo.com
.
curl --user "jsmith" "https://solution-manager.acme.com:10091/externalShutdown?hostDomainName=denodo-dv1-prod.denodo.com&port=9999&product=VDP"
Example #2
Free the license associated with the Virtual DataPort server that runs on the host with IP 192.168.0.120
.
curl --user "jsmith" "https://solution-manager.acme.com:10091/externalShutdown?nodeIp=192.168.0.120&port=9999&product=VDP"
Example #3
Free the license associated with an automated cloud mode Virtual DataPort server running in the instance i-08ae3ee3f75ced7d0
.
GET https://solution-manager.acme.com:10091/externalShutdown?instanceId=i-08ae3ee3f75ced7d0&port=9999&product=VDP
The response from the service includes a summary of the operation with the result and a message:
{
"result": { "OK" | "ERROR" },
"message": <text>
}
Free License Usage by Server Id¶
This operation provides an alternative method of releasing license usage by specifying the identifier of the server.
URL:
/servers/{number:serverId}/externalShutdown
Method:
POST
The response from the service includes a summary of the operation with the result and a message:
{
"result": { "OK" | "ERROR" },
"message": <text>
}
Example of a POST request to release the license usage of the server with id 3
:
POST https://solution-manager.acme.com:10091/servers/3/externalShutdown
Ping License Manager Server¶
Use the endpoint “ping License Manager” to check the health of the License Manager.
URL:
https://denodo-server.acme.com:10091/pingLicenseManager
Method:
GET
Note that you need to send the request to the License Manager (its default port is 10091), not the Solution Manager.
This endpoint returns the HTTP code 200 and the text OK
if the server is up and the connection to the database where its metadata is stored is up. Otherwise, the request fails.
Ping to Solution Manager Server¶
Use the endpoint “ping Solution manager” to check the health of the Solution Manager server.
URL:
https://denodo-server.acme.com:10090/pingSolutionManager
Method:
GET
This endpoint returns the HTTP code 200 and the text OK
if the server is up and the connection to the database where its metadata is stored is up. Otherwise, the request fails.