.. 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": "", "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" : "" } } } basic-auth: ~~~~~~~~~~~ .. code-block:: json :linenos: { "dsl_definitions": { "dynamic-rest-source": { "type" : "basic-auth", "url" : "http://localhost:32778", "username" : "", "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": "", "sslKey": "keystore", "sslKeyPassword": "" } } } 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" ] } } } }