| .. This work is licensed under a Creative Commons Attribution 4.0 International License. |
| .. http://creativecommons.org/licenses/by/4.0 |
| .. Copyright (C) 2019 IBM. |
| |
| Resource Source |
| =============== |
| .. toctree:: |
| :maxdepth: 4 |
| |
| Input: |
| ------ |
| Expects the value to be provided as input to the request. |
| |
| .. code-block:: json |
| :linenos: |
| |
| { |
| "source-input" : |
| { |
| "description": "This is Input Resource Source Node Type", |
| "version": "1.0.0", |
| "properties": {}, |
| "derived_from": "tosca.nodes.ResourceSource" |
| } |
| } |
| |
| Default: |
| -------- |
| Expects the value to be defaulted in the model itself. |
| |
| .. code-block:: json |
| :linenos: |
| |
| { |
| "source-default" : |
| { |
| "description": "This is Default Resource Source Node Type", |
| "version": "1.0.0", |
| "properties": {}, |
| "derived_from": "tosca.nodes.ResourceSource" |
| } |
| } |
| |
| Sql: |
| ---- |
| |
| Expects the SQL query to be modeled; that SQL query can be parameterized, and the parameters be other resources resolved through other means. If that's the case, this data dictionary definition will have to define key-dependencies along with input-key-mapping. |
| |
| CDS is currently deployed along the side of SDNC, hence the primary database connection provided by the framework is to SDNC database. |
| |
| |image0| |
| |
| .. |image0| image:: media/sqltable.JPG |
| :width: 400pt |
| |
| .. code-block:: json |
| :linenos: |
| |
| { |
| "description": "This is Database Resource Source Node Type", |
| "version": "1.0.0", |
| "properties": { |
| "type": { |
| "required": true, |
| "type": "string", |
| "constraints": [ |
| { |
| "valid_values": [ |
| "SQL" |
| ] |
| } |
| ] |
| }, |
| "endpoint-selector": { |
| "required": false, |
| "type": "string" |
| }, |
| "query": { |
| "required": true, |
| "type": "string" |
| }, |
| "input-key-mapping": { |
| "required": false, |
| "type": "map", |
| "entry_schema": { |
| "type": "string" |
| } |
| }, |
| "output-key-mapping": { |
| "required": false, |
| "type": "map", |
| "entry_schema": { |
| "type": "string" |
| } |
| }, |
| "key-dependencies": { |
| "required": true, |
| "type": "list", |
| "entry_schema": { |
| "type": "string" |
| } |
| } |
| }, |
| "derived_from": "tosca.nodes.ResourceSource" |
| } |
| |
| Connection to a specific database can be expressed through the endpoint-selector property, which refers to a macro defining the information about the database the connect to. Understand TOSCA Macro in the context of CDS. |
| |
| .. code-block:: json |
| :linenos: |
| |
| { |
| "dsl_definitions": { |
| "dynamic-db-source": { |
| "type": "maria-db", |
| "url": "jdbc:mysql://localhost:3306/sdnctl", |
| "username": "<username>", |
| "password": "<password>" |
| } |
| } |
| } |
| |
| Rest: |
| ----- |
| |
| Expects the URI along with the VERB and the payload, if needed. |
| |
| CDS is currently deployed along the side of SDNC, hence the default rest connection provided by the framework is to SDNC MDSAL. |
| |
| |image1| |
| |
| .. |image1| image:: media/optional.JPG |
| :width: 400pt |
| |
| .. code-block:: json |
| :linenos: |
| |
| { |
| "description": "This is Rest Resource Source Node Type", |
| "version": "1.0.0", |
| "properties": { |
| "type": { |
| "required": false, |
| "type": "string", |
| "default": "JSON", |
| "constraints": [ |
| { |
| "valid_values": [ |
| "JSON" |
| ] |
| } |
| ] |
| }, |
| "verb": { |
| "required": false, |
| "type": "string", |
| "default": "GET", |
| "constraints": [ |
| { |
| "valid_values": [ |
| "GET", "POST", "DELETE", "PUT" |
| ] |
| } |
| ] |
| }, |
| "payload": { |
| "required": false, |
| "type": "string", |
| "default": "" |
| }, |
| "endpoint-selector": { |
| "required": false, |
| "type": "string" |
| }, |
| "url-path": { |
| "required": true, |
| "type": "string" |
| }, |
| "path": { |
| "required": true, |
| "type": "string" |
| }, |
| "expression-type": { |
| "required": false, |
| "type": "string", |
| "default": "JSON_PATH", |
| "constraints": [ |
| { |
| "valid_values": [ |
| "JSON_PATH", |
| "JSON_POINTER" |
| ] |
| } |
| ] |
| }, |
| "input-key-mapping": { |
| "required": false, |
| "type": "map", |
| "entry_schema": { |
| "type": "string" |
| } |
| }, |
| "output-key-mapping": { |
| "required": false, |
| "type": "map", |
| "entry_schema": { |
| "type": "string" |
| } |
| }, |
| "key-dependencies": { |
| "required": true, |
| "type": "list", |
| "entry_schema": { |
| "type": "string" |
| } |
| } |
| }, |
| "derived_from": "tosca.nodes.ResourceSource" |
| } |
| |
| Connection to a specific REST system can be expressed through the endpoint-selector property, which refers to a macro defining the information about the REST system the connect to. Understand TOSCA Macro in the context of CDS. |
| |
| Few ways are available to authenticate to the REST system: |
| * token-auth |
| * basic-auth |
| * ssl-basic-auth |
| |
| token-auth: |
| ~~~~~~~~~~~ |
| |
| .. code-block:: json |
| :linenos: |
| |
| { |
| "dsl_definitions": { |
| "dynamic-rest-source": { |
| "type" : "token-auth", |
| "url" : "http://localhost:32778", |
| "token" : "<token>" |
| } |
| } |
| } |
| |
| basic-auth: |
| ~~~~~~~~~~~ |
| |
| .. code-block:: json |
| :linenos: |
| |
| { |
| "dsl_definitions": { |
| "dynamic-rest-source": { |
| "type" : "basic-auth", |
| "url" : "http://localhost:32778", |
| "username" : "<username>", |
| "password": "<password>" |
| } |
| } |
| } |
| |
| ssl-basic-auth: |
| ~~~~~~~~~~~~~~~ |
| |
| .. code-block:: json |
| :linenos: |
| |
| { |
| "dsl_definitions": { |
| "dynamic-rest-source": { |
| "type" : "ssl-basic-auth", |
| "url" : "http://localhost:32778", |
| "keyStoreInstance": "JKS or PKCS12", |
| "sslTrust": "trusture", |
| "sslTrustPassword": "<password>", |
| "sslKey": "keystore", |
| "sslKeyPassword": "<password>" |
| } |
| } |
| } |
| |
| Capability: |
| ----------- |
| |
| Expects a script to be provided. |
| |
| |image2| |
| |
| .. |image2| image:: media/capabilitytable.JPG |
| :width: 400pt |
| |
| .. code-block:: json |
| :linenos: |
| |
| { |
| "description": "This is Component Resource Source Node Type", |
| "version": "1.0.0", |
| "properties": { |
| "script-type": { |
| "required": true, |
| "type": "string", |
| "default": "kotlin", |
| "constraints": [ |
| { |
| "valid_values": [ |
| "kotlin", |
| "jython" |
| ] |
| } |
| ] |
| }, |
| "script-class-reference": { |
| "description": "Capability reference name for internal and kotlin, for jython script file path", |
| "required": true, |
| "type": "string" |
| }, |
| "instance-dependencies": { |
| "required": false, |
| "description": "Instance dependency Names to Inject to Kotlin / Jython Script.", |
| "type": "list", |
| "entry_schema": { |
| "type": "string" |
| } |
| }, |
| "key-dependencies": { |
| "description": "Resource Resolution dependency dictionary names.", |
| "required": true, |
| "type": "list", |
| "entry_schema": { |
| "type": "string" |
| } |
| } |
| }, |
| "derived_from": "tosca.nodes.ResourceSource" |
| } |
| |
| Complex Type: |
| ------------- |
| |
| Value will be resolved through REST., and output will be a complex type. |
| |
| Modeling reference: Modeling Concepts#rest |
| |
| In this example, we're making a POST request to an IPAM system with no payload. |
| |
| Some ingredients are required to perform the query, in this case, $prefixId. Hence It is provided as an input-key-mapping and defined as a key-dependencies. Please refer to the modeling guideline for more in depth understanding. |
| |
| As part of this request, the expected response will be as below. |
| |
| .. code-block:: json |
| :linenos: |
| |
| { |
| "id": 4, |
| "address": "192.168.10.2/32", |
| "vrf": null, |
| "tenant": null, |
| "status": 1, |
| "role": null, |
| "interface": null, |
| "description": "", |
| "nat_inside": null, |
| "created": "2018-08-30", |
| "last_updated": "2018-08-30T14:59:05.277820Z" |
| } |
| |
| What is of interest is the address and id fields. For the process to return these two values, we need to create a custom data-type, as bellow |
| |
| .. code-block:: json |
| :linenos: |
| |
| { |
| "version": "1.0.0", |
| "description": "This is Netbox IP Data Type", |
| "properties": { |
| "address": { |
| "required": true, |
| "type": "string" |
| }, |
| "id": { |
| "required": true, |
| "type": "integer" |
| } |
| }, |
| "derived_from": "tosca.datatypes.Root" |
| } |
| |
| The type of the data dictionary will be dt-netbox-ip. |
| |
| To tell the resolution framework what is of interest in the response, the output-key-mapping section is used. The process will map the output-key-mapping to the defined data-type. |
| |
| .. code-block:: json |
| |
| { |
| "tags" : "oam-local-ipv4-address", |
| "name" : "create_netbox_ip", |
| "property" : { |
| "description" : "netbox ip", |
| "type" : "dt-netbox-ip" |
| }, |
| "updated-by" : "adetalhouet", |
| "sources" : { |
| "config-data" : { |
| "type" : "source-rest", |
| "properties" : { |
| "type" : "JSON", |
| "verb" : "POST", |
| "endpoint-selector" : "ipam-1", |
| "url-path" : "/api/ipam/prefixes/$prefixId/available-ips/", |
| "path" : "", |
| "input-key-mapping" : { |
| "prefixId" : "prefix-id" |
| }, |
| "output-key-mapping" : { |
| "address" : "address", |
| "id" : "id" |
| }, |
| "key-dependencies" : [ "prefix-id" ] |
| } |
| } |
| } |
| } |