aboutsummaryrefslogtreecommitdiffstats
path: root/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF
diff options
context:
space:
mode:
authorgummar <raj.gumma@est.tech>2020-02-18 18:54:44 +0000
committerKAPIL SINGAL <ks220y@att.com>2020-02-26 15:23:42 +0000
commit94ad509756f17e79c278e3cc2f87440009125cd1 (patch)
treeccd6a842eb0fdca66689b2569cd71cb78ec81cd2 /components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF
parentac31d2159014a84de91b6c7baeb29adf90284c10 (diff)
Merge SW Upgrade Blueprint into PNF_AAI and create one UAT BP for PNF
UAT: Add support to multiple responses for a single request Set property IN_UAT=1 during UAT execution so blueprints can tune their settings to values more suitable for testing (like timeouts) Add 'times' field to specify expected number of invocations Add UAT blueprint script for PNF SW Upgrade UC Add current thread check for Hazelcast distributed lock Resolve URI before returning Issue-ID: CCSDK-2091 Change-Id: Id256bad043488f88f1b60015ebf9ade4be607fa2 Signed-off-by: gummar <raj.gumma@est.tech>
Diffstat (limited to 'components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF')
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/PNF_CDS_RESTCONF.json424
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/artifact_types.json22
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/config-assign-pnf-mapping.json1
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/config-deploy-pnf-mapping.json25
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/data_types.json75
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/node_types.json262
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/pnf-software-upgrade-mapping.json36
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/policy_types.json3
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/relationship_types.json3
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/resources_definition_types.json47
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Environments/source-db.properties1
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Environments/source-rest.properties4
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_configAssign.xml15
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_configDeploy.xml15
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_upgradeSoftware.xml15
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Scripts/kotlin/RestconfConfigDeploy.kt93
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Scripts/kotlin/RestconfSoftwareUpgrade.kt195
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/TOSCA-Metadata/TOSCA.meta7
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/config-assign-restconf-configlet-template.vtl53
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/pnf-swug-config-template.vtl22
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/pnf-swug-download-ne-sw-template.vtl28
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/restconf-mount-template.vtl18
-rw-r--r--components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Tests/uat.yaml374
23 files changed, 1738 insertions, 0 deletions
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/PNF_CDS_RESTCONF.json b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/PNF_CDS_RESTCONF.json
new file mode 100644
index 000000000..2e6c2f547
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/PNF_CDS_RESTCONF.json
@@ -0,0 +1,424 @@
+{
+ "tosca_definitions_version" : "controller_blueprint_1_0_0",
+ "metadata" : {
+ "template_author" : "Raj Gumma",
+ "author-email" : "raj.gumma@est.tech",
+ "user-groups" : "ADMIN, OPERATION",
+ "template_name" : "PNF_CDS_RESTCONF",
+ "template_version" : "1.0.0",
+ "template_tags" : "PNF, Restconf, config, configuration, software upgrade"
+ },
+ "imports" : [ {
+ "file" : "Definitions/data_types.json"
+ }, {
+ "file" : "Definitions/relationship_types.json"
+ }, {
+ "file" : "Definitions/artifact_types.json"
+ }, {
+ "file" : "Definitions/node_types.json"
+ }, {
+ "file" : "Definitions/policy_types.json"
+ } ],
+ "dsl_definitions" : {
+ "config-deploy-properties" : {
+ "resolution-key" : {
+ "get_input" : "resolution-key"
+ }
+ },
+ "precheck-properties" : {
+ "resolution-key" : {
+ "get_input" : "resolution-key"
+ }
+ },
+ "downloadNeSw-properties" : {
+ "resolution-key" : {
+ "get_input" : "resolution-key"
+ }
+ },
+ "activateNeSw-properties" : {
+ "resolution-key" : {
+ "get_input" : "resolution-key"
+ }
+ },
+ "postcheck-properties" : {
+ "resolution-key" : {
+ "get_input" : "resolution-key"
+ }
+ }
+ },
+ "topology_template" : {
+ "workflows" : {
+ "config-assign" : {
+ "steps" : {
+ "activate-process" : {
+ "description" : "Create a configlet",
+ "target" : "config-assign",
+ "activities" : [ {
+ "call_operation" : ""
+ } ]
+ }
+ },
+ "inputs" : {
+ "resolution-key" : {
+ "required" : true,
+ "type" : "string"
+ },
+ "store-result" : {
+ "required" : true,
+ "type" : "boolean"
+ },
+ "config-assign-properties" : {
+ "description" : "Dynamic PropertyDefinition for workflow(config-assign).",
+ "required" : true,
+ "type" : "dt-config-assign-properties"
+ }
+ }
+ },
+ "config-deploy" : {
+ "steps" : {
+ "activate-process" : {
+ "description" : "Send a configlet to the pnf",
+ "target" : "config-deploy",
+ "activities" : [ {
+ "call_operation" : ""
+ } ]
+ }
+ },
+ "inputs" : {
+ "resolution-key" : {
+ "required" : true,
+ "type" : "string"
+ },
+ "config-deploy-properties" : {
+ "description" : "Dynamic PropertyDefinition for workflow(config-deploy).",
+ "required" : true,
+ "type" : "dt-config-deploy-properties"
+ }
+ }
+ },
+ "precheck" : {
+ "steps" : {
+ "activate-process" : {
+ "description" : "Check if pnf ready for sw upgrade",
+ "target" : "precheck",
+ "activities" : [ {
+ "call_operation" : ""
+ } ]
+ }
+ },
+ "inputs" : {
+ "resolution-key" : {
+ "required" : true,
+ "type" : "string"
+ },
+ "precheck-properties" : {
+ "description" : "Dynamic PropertyDefinition for precheck workflow(software-upgrade).",
+ "required" : true,
+ "type" : "dt-precheck-properties"
+ }
+ }
+ },
+ "downloadNeSw" : {
+ "steps" : {
+ "activate-process" : {
+ "description" : "Trigger download new software for sw upgrade",
+ "target" : "downloadNeSw",
+ "activities" : [ {
+ "call_operation" : ""
+ } ]
+ }
+ },
+ "inputs" : {
+ "resolution-key" : {
+ "required" : true,
+ "type" : "string"
+ },
+ "downloadNeSw-properties" : {
+ "description" : "Dynamic PropertyDefinition for downloadNeSw workflow(software-upgrade).",
+ "required" : true,
+ "type" : "dt-downloadNeSw-properties"
+ }
+ }
+ },
+ "activateNeSw" : {
+ "steps" : {
+ "activate-process" : {
+ "description" : "Trigger activation of target software version for pnf upgrade",
+ "target" : "activateNeSw",
+ "activities" : [ {
+ "call_operation" : ""
+ } ]
+ }
+ },
+ "inputs" : {
+ "resolution-key" : {
+ "required" : true,
+ "type" : "string"
+ },
+ "activateNeSw-properties" : {
+ "description" : "Dynamic PropertyDefinition for activateNeSw workflow(software-upgrade).",
+ "required" : true,
+ "type" : "dt-activateNeSw-properties"
+ }
+ }
+ },
+ "postcheck" : {
+ "steps" : {
+ "activate-process" : {
+ "description" : "Check if pnf upgrade is completed",
+ "target" : "postcheck",
+ "activities" : [ {
+ "call_operation" : ""
+ } ]
+ }
+ },
+ "inputs" : {
+ "resolution-key" : {
+ "required" : true,
+ "type" : "string"
+ },
+ "postcheck-properties" : {
+ "description" : "Dynamic PropertyDefinition for postcheck workflow(software-upgrade).",
+ "required" : true,
+ "type" : "dt-postcheck-properties"
+ }
+ }
+ }
+ },
+ "node_templates" : {
+ "config-assign" : {
+ "type" : "component-resource-resolution",
+ "interfaces" : {
+ "ResourceResolutionComponent" : {
+ "operations" : {
+ "process" : {
+ "inputs" : {
+ "resolution-key" : {
+ "get_input" : "resolution-key"
+ },
+ "store-result" : true,
+ "artifact-prefix-names" : [ "config-assign" ]
+ },
+ "outputs" : {
+ "resource-assignment-params" : {
+ "get_attribute" : [ "SELF", "assignment-params" ]
+ },
+ "status" : "success"
+ }
+ }
+ }
+ }
+ },
+ "artifacts" : {
+ "config-assign-template" : {
+ "type" : "artifact-template-velocity",
+ "file" : "Templates/config-assign-restconf-configlet-template.vtl"
+ },
+ "config-assign-mapping" : {
+ "type" : "artifact-mapping-resource",
+ "file" : "Definitions/config-assign-pnf-mapping.json"
+ }
+ }
+ },
+ "config-deploy" : {
+ "type" : "component-script-executor",
+ "interfaces" : {
+ "ComponentScriptExecutor" : {
+ "operations" : {
+ "process" : {
+ "implementation" : {
+ "primary" : "component-script",
+ "timeout" : 180,
+ "operation_host" : "SELF"
+ },
+ "inputs" : {
+ "script-type" : "kotlin",
+ "script-class-reference" : "cba.pnf.config.aai.RestconfConfigDeploy",
+ "dynamic-properties" : "*config-deploy-properties"
+ },
+ "outputs" : {
+ "response-data" : "",
+ "status" : "success"
+ }
+ }
+ }
+ }
+ },
+ "artifacts" : {
+ "config-deploy-template" : {
+ "type" : "artifact-template-velocity",
+ "file" : "Templates/restconf-mount-template.vtl"
+ },
+ "config-deploy-mapping" : {
+ "type" : "artifact-mapping-resource",
+ "file" : "Definitions/config-deploy-pnf-mapping.json"
+ }
+ }
+ },
+ "precheck" : {
+ "type" : "component-script-executor",
+ "interfaces" : {
+ "ComponentScriptExecutor" : {
+ "operations" : {
+ "process" : {
+ "implementation" : {
+ "primary" : "component-script",
+ "timeout" : 180,
+ "operation_host" : "SELF"
+ },
+ "inputs" : {
+ "script-type" : "kotlin",
+ "script-class-reference" : "cba.pnf.swug.RestconfSoftwareUpgrade",
+ "dynamic-properties" : "*precheck-properties"
+ },
+ "outputs" : {
+ "response-data" : "",
+ "status" : "success"
+ }
+ }
+ }
+ }
+ },
+ "artifacts" : {
+ "mount-node-template" : {
+ "type" : "artifact-template-velocity",
+ "file" : "Templates/restconf-mount-template.vtl"
+ },
+ "mount-node-mapping" : {
+ "type" : "artifact-mapping-resource",
+ "file" : "Definitions/pnf-software-upgrade-mapping.json"
+ }
+ }
+ },
+ "downloadNeSw" : {
+ "type" : "component-script-executor",
+ "interfaces" : {
+ "ComponentScriptExecutor" : {
+ "operations" : {
+ "process" : {
+ "implementation" : {
+ "primary" : "component-script",
+ "timeout" : 180,
+ "operation_host" : "SELF"
+ },
+ "inputs" : {
+ "script-type" : "kotlin",
+ "script-class-reference" : "cba.pnf.swug.RestconfSoftwareUpgrade",
+ "dynamic-properties" : "*downloadNeSw-properties"
+ },
+ "outputs" : {
+ "response-data" : "",
+ "status" : "success"
+ }
+ }
+ }
+ }
+ },
+ "artifacts" : {
+ "mount-node-template" : {
+ "type" : "artifact-template-velocity",
+ "file" : "Templates/restconf-mount-template.vtl"
+ },
+ "mount-node-mapping" : {
+ "type" : "artifact-mapping-resource",
+ "file" : "Definitions/pnf-software-upgrade-mapping.json"
+ },
+ "configure-template" : {
+ "type" : "artifact-template-velocity",
+ "file" : "Templates/pnf-swug-config-template.vtl"
+ },
+ "configure-mapping" : {
+ "type" : "artifact-mapping-resource",
+ "file" : "Definitions/pnf-software-upgrade-mapping.json"
+ },
+ "download-ne-sw-template" : {
+ "type" : "artifact-template-velocity",
+ "file" : "Templates/pnf-swug-download-ne-sw-template.vtl"
+ },
+ "download-ne-sw-mapping" : {
+ "type" : "artifact-mapping-resource",
+ "file" : "Definitions/pnf-software-upgrade-mapping.json"
+ }
+ }
+ },
+ "activateNeSw" : {
+ "type" : "component-script-executor",
+ "interfaces" : {
+ "ComponentScriptExecutor" : {
+ "operations" : {
+ "process" : {
+ "implementation" : {
+ "primary" : "component-script",
+ "timeout" : 180,
+ "operation_host" : "SELF"
+ },
+ "inputs" : {
+ "script-type" : "kotlin",
+ "script-class-reference" : "cba.pnf.swug.RestconfSoftwareUpgrade",
+ "dynamic-properties" : "*activateNeSw-properties"
+ },
+ "outputs" : {
+ "response-data" : "",
+ "status" : "success"
+ }
+ }
+ }
+ }
+ },
+ "artifacts" : {
+ "mount-node-template" : {
+ "type" : "artifact-template-velocity",
+ "file" : "Templates/restconf-mount-template.vtl"
+ },
+ "mount-node-mapping" : {
+ "type" : "artifact-mapping-resource",
+ "file" : "Definitions/pnf-software-upgrade-mapping.json"
+ },
+ "configure-template" : {
+ "type" : "artifact-template-velocity",
+ "file" : "Templates/pnf-swug-config-template.vtl"
+ },
+ "configure-mapping" : {
+ "type" : "artifact-mapping-resource",
+ "file" : "Definitions/pnf-software-upgrade-mapping.json"
+ }
+ }
+ },
+ "postcheck" : {
+ "type" : "component-script-executor",
+ "interfaces" : {
+ "ComponentScriptExecutor" : {
+ "operations" : {
+ "process" : {
+ "implementation" : {
+ "primary" : "component-script",
+ "timeout" : 180,
+ "operation_host" : "SELF"
+ },
+ "inputs" : {
+ "script-type" : "kotlin",
+ "script-class-reference" : "cba.pnf.swug.RestconfSoftwareUpgrade",
+ "dynamic-properties" : "*postcheck-properties"
+ },
+ "outputs" : {
+ "response-data" : "",
+ "status" : "success"
+ }
+ }
+ }
+ }
+ },
+ "artifacts" : {
+ "mount-node-template" : {
+ "type" : "artifact-template-velocity",
+ "file" : "Templates/restconf-mount-template.vtl"
+ },
+ "mount-node-mapping" : {
+ "type" : "artifact-mapping-resource",
+ "file" : "Definitions/pnf-software-upgrade-mapping.json"
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/artifact_types.json b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/artifact_types.json
new file mode 100644
index 000000000..6ec3b4105
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/artifact_types.json
@@ -0,0 +1,22 @@
+{
+ "artifact_types" : {
+ "artifact-directed-graph" : {
+ "description" : "Directed Graph File",
+ "version" : "1.0.0",
+ "derived_from" : "tosca.artifacts.Implementation",
+ "file_ext" : [ "json", "xml" ]
+ },
+ "artifact-mapping-resource" : {
+ "description" : "Resource Mapping File used along with Configuration template",
+ "version" : "1.0.0",
+ "derived_from" : "tosca.artifacts.Implementation",
+ "file_ext" : [ "json" ]
+ },
+ "artifact-template-velocity" : {
+ "description" : " Velocity Template used for Configuration",
+ "version" : "1.0.0",
+ "derived_from" : "tosca.artifacts.Implementation",
+ "file_ext" : [ "vtl" ]
+ }
+ }
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/config-assign-pnf-mapping.json b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/config-assign-pnf-mapping.json
new file mode 100644
index 000000000..fe51488c7
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/config-assign-pnf-mapping.json
@@ -0,0 +1 @@
+[]
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/config-deploy-pnf-mapping.json b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/config-deploy-pnf-mapping.json
new file mode 100644
index 000000000..dd8889c80
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/config-deploy-pnf-mapping.json
@@ -0,0 +1,25 @@
+[
+ {
+ "name": "pnf-id",
+ "input-param": true,
+ "property": {
+ "type": "string"
+ },
+ "dictionary-name": "pnf-id",
+ "dictionary-source": "input",
+ "dependencies": [
+ ]
+ },
+ {
+ "name": "pnf-ipv4-address",
+ "input-param": false,
+ "property": {
+ "type": "string"
+ },
+ "dictionary-name": "pnf-ipaddress-aai",
+ "dictionary-source": "aai-data",
+ "dependencies": [
+ "pnf-id"
+ ]
+ }
+]
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/data_types.json b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/data_types.json
new file mode 100644
index 000000000..e3d216c89
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/data_types.json
@@ -0,0 +1,75 @@
+{
+ "data_types" : {
+ "dt-config-assign-properties" : {
+ "description" : "Dynamic DataType definition for workflow(config-assign).",
+ "version" : "1.0.0",
+ "properties" : { },
+ "derived_from" : "tosca.datatypes.Dynamic"
+ },
+ "dt-config-deploy-properties" : {
+ "description" : "Dynamic DataType definition for workflow(config-deploy).",
+ "version" : "1.0.0",
+ "properties" : {
+ "pnf-ipv4-address" : {
+ "type" : "string"
+ },
+ "pnf-id" : {
+ "type" : "string"
+ }
+ },
+ "derived_from" : "tosca.datatypes.Dynamic"
+ },
+ "dt-precheck-properties": {
+ "description": "Dynamic DataType definition for the precheck workflow(upgrade-software).",
+ "version": "1.0.0",
+ "properties": {
+ "pnf-id": {
+ "type": "string"
+ },
+ "target-software-version": {
+ "type": "string"
+ }
+ },
+ "derived_from": "tosca.datatypes.Dynamic"
+ },
+ "dt-downloadNeSw-properties": {
+ "description": "Dynamic DataType definition for the downloadNeSw workflow(upgrade-software).",
+ "version": "1.0.0",
+ "properties": {
+ "pnf-id": {
+ "type": "string"
+ },
+ "target-software-version": {
+ "type": "string"
+ }
+ },
+ "derived_from": "tosca.datatypes.Dynamic"
+ },
+ "dt-activateNeSw-properties": {
+ "description": "Dynamic DataType definition for the activateNeSw workflow(upgrade-software).",
+ "version": "1.0.0",
+ "properties": {
+ "pnf-id": {
+ "type": "string"
+ },
+ "target-software-version": {
+ "type": "string"
+ }
+ },
+ "derived_from": "tosca.datatypes.Dynamic"
+ },
+ "dt-postcheck-properties": {
+ "description": "Dynamic DataType definition for the postcheck workflow(upgrade-software).",
+ "version": "1.0.0",
+ "properties": {
+ "pnf-id": {
+ "type": "string"
+ },
+ "target-software-version": {
+ "type": "string"
+ }
+ },
+ "derived_from": "tosca.datatypes.Dynamic"
+ }
+ }
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/node_types.json b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/node_types.json
new file mode 100644
index 000000000..bfae6779e
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/node_types.json
@@ -0,0 +1,262 @@
+{
+ "node_types" : {
+ "component-resource-resolution" : {
+ "description" : "This is Resource Assignment Component API",
+ "version" : "1.0.0",
+ "attributes" : {
+ "assignment-params" : {
+ "required" : true,
+ "type" : "string"
+ }
+ },
+ "capabilities" : {
+ "component-node" : {
+ "type" : "tosca.capabilities.Node"
+ }
+ },
+ "interfaces" : {
+ "ResourceResolutionComponent" : {
+ "operations" : {
+ "process" : {
+ "inputs" : {
+ "resolution-key" : {
+ "description" : "Key for service instance related correlation.",
+ "required" : false,
+ "type" : "string"
+ },
+ "occurrence" : {
+ "description" : "Number of time to perform the resolution.",
+ "required" : false,
+ "type" : "integer",
+ "default" : 1
+ },
+ "store-result" : {
+ "description" : "Whether or not to store the output.",
+ "required" : false,
+ "type" : "boolean"
+ },
+ "resource-type" : {
+ "description" : "Request type.",
+ "required" : false,
+ "type" : "string"
+ },
+ "artifact-prefix-names" : {
+ "description" : "Template , Resource Assignment Artifact Prefix names",
+ "required" : true,
+ "type" : "list",
+ "entry_schema" : {
+ "type" : "string"
+ }
+ },
+ "request-id" : {
+ "description" : "Request Id, Unique Id for the request.",
+ "required" : true,
+ "type" : "string"
+ },
+ "resource-id" : {
+ "description" : "Resource Id.",
+ "required" : false,
+ "type" : "string"
+ },
+ "action-name" : {
+ "description" : "Action Name of the process",
+ "required" : false,
+ "type" : "string"
+ },
+ "dynamic-properties" : {
+ "description" : "Dynamic Json Content or DSL Json reference.",
+ "required" : false,
+ "type" : "json"
+ }
+ },
+ "outputs" : {
+ "resource-assignment-params" : {
+ "required" : true,
+ "type" : "string"
+ },
+ "status" : {
+ "required" : true,
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "derived_from" : "tosca.nodes.Component"
+ },
+ "component-script-executor" : {
+ "description" : "This is CLI Transaction Configuration Component API",
+ "version" : "1.0.0",
+ "attributes" : {
+ "response-data" : {
+ "required" : false,
+ "type" : "json"
+ }
+ },
+ "capabilities" : {
+ "component-node" : {
+ "type" : "tosca.capabilities.Node"
+ }
+ },
+ "interfaces" : {
+ "ComponentScriptExecutor" : {
+ "operations" : {
+ "process" : {
+ "inputs" : {
+ "script-type" : {
+ "description" : "Script type, kotlin type is supported",
+ "required" : true,
+ "type" : "string",
+ "constraints" : [ {
+ "valid_values" : [ "kotlin", "jython", "internal" ]
+ } ],
+ "default" : "internal"
+ },
+ "script-class-reference" : {
+ "description" : "Kotlin Script class name or jython script name.",
+ "required" : true,
+ "type" : "string"
+ },
+ "dynamic-properties" : {
+ "description" : "Dynamic Json Content or DSL Json reference.",
+ "required" : false,
+ "type" : "json"
+ }
+ },
+ "outputs" : {
+ "response-data" : {
+ "description" : "Execution Response Data.",
+ "required" : false,
+ "type" : "string"
+ },
+ "status" : {
+ "description" : "Status of the Component Execution ( success or failure )",
+ "required" : true,
+ "type" : "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "derived_from" : "tosca.nodes.Component"
+ },
+ "dg-generic" : {
+ "description" : "This is Generic Directed Graph Type",
+ "version" : "1.0.0",
+ "properties" : {
+ "content" : {
+ "required" : true,
+ "type" : "string"
+ },
+ "dependency-node-templates" : {
+ "description" : "Dependent Step Components NodeTemplate name.",
+ "required" : true,
+ "type" : "list",
+ "entry_schema" : {
+ "type" : "string"
+ }
+ }
+ },
+ "derived_from" : "tosca.nodes.Workflow"
+ },
+ "source-input" : {
+ "description" : "This is Input Resource Source Node Type",
+ "version" : "1.0.0",
+ "properties" : { },
+ "derived_from" : "tosca.nodes.ResourceSource"
+ },
+ "source-rest" : {
+ "description" : "This is Rest Resource Source Node Type",
+ "version" : "1.0.0",
+ "properties" : {
+ "type" : {
+ "required" : true,
+ "type" : "string",
+ "constraints" : [ {
+ "valid_values" : [ "JSON" ]
+ } ],
+ "default" : "JSON"
+ },
+ "headers" : {
+ "required" : false,
+ "type" : "map",
+ "entry_schema" : {
+ "type" : "string"
+ }
+ },
+ "verb" : {
+ "required" : true,
+ "type" : "string",
+ "constraints" : [ {
+ "valid_values" : [ "GET", "POST", "DELETE", "PUT" ]
+ } ],
+ "default" : "GET"
+ },
+ "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",
+ "constraints" : [ {
+ "valid_values" : [ "JSON_PATH", "JSON_POINTER" ]
+ } ],
+ "default" : "JSON_PATH"
+ },
+ "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"
+ },
+ "tosca.nodes.Component" : {
+ "description" : "This is default Component Node",
+ "version" : "1.0.0",
+ "derived_from" : "tosca.nodes.Root"
+ },
+ "tosca.nodes.ResourceSource" : {
+ "description" : "TOSCA base type for Resource Sources",
+ "version" : "1.0.0",
+ "derived_from" : "tosca.nodes.Root"
+ },
+ "tosca.nodes.Workflow" : {
+ "description" : "This is Directed Graph Node Type",
+ "version" : "1.0.0",
+ "derived_from" : "tosca.nodes.Root"
+ }
+ }
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/pnf-software-upgrade-mapping.json b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/pnf-software-upgrade-mapping.json
new file mode 100644
index 000000000..2c3de2e49
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/pnf-software-upgrade-mapping.json
@@ -0,0 +1,36 @@
+[
+ {
+ "name": "pnf-id",
+ "input-param": true,
+ "property": {
+ "type": "string"
+ },
+ "dictionary-name": "pnf-id",
+ "dictionary-source": "input",
+ "dependencies": [
+ ]
+ },
+ {
+ "name": "target-software-version",
+ "input-param": true,
+ "property": {
+ "type": "string"
+ },
+ "dictionary-name": "target-software-version",
+ "dictionary-source": "input",
+ "dependencies": [
+ ]
+ },
+ {
+ "name": "pnf-ipv4-address",
+ "input-param": false,
+ "property": {
+ "type": "string"
+ },
+ "dictionary-name": "pnf-ipaddress-aai",
+ "dictionary-source": "aai-data",
+ "dependencies": [
+ "pnf-id"
+ ]
+ }
+]
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/policy_types.json b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/policy_types.json
new file mode 100644
index 000000000..1e44cc70a
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/policy_types.json
@@ -0,0 +1,3 @@
+{
+ "policy_types" : { }
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/relationship_types.json b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/relationship_types.json
new file mode 100644
index 000000000..4ddd7a57c
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/relationship_types.json
@@ -0,0 +1,3 @@
+{
+ "relationship_types" : { }
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/resources_definition_types.json b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/resources_definition_types.json
new file mode 100644
index 000000000..235a05d27
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Definitions/resources_definition_types.json
@@ -0,0 +1,47 @@
+{
+ "pnf-id" : {
+ "tags" : "pnf-id",
+ "name" : "pnf-id",
+ "property" : {
+ "description" : "pnf-id",
+ "type" : "string"
+ },
+ "updated-by" : "Rahul Tyagi <rahul.tyagi@est.tech>",
+ "sources" : {
+ "input" : {
+ "type" : "source-input",
+ "properties" : { }
+ }
+ }
+ },
+ "pnf-ipaddress-aai" : {
+ "tags" : "aai-get",
+ "name" : "pnf-ipaddress-aai",
+ "property" : {
+ "description" : "primary aai data to get resource",
+ "type" : "string"
+ },
+ "updated-by" : "Rahul, Tyagi <rahul.tyagi@est.tech>",
+ "sources" : {
+ "aai-data" : {
+ "type" : "source-rest",
+ "properties" : {
+ "type" : "JSON",
+ "verb" : "GET",
+ "url-path" : "/aai/v14/network/pnfs/pnf/$pnf-id",
+ "path" : "/ipaddress-v4-oam",
+ "input-key-mapping" : {
+ "pnf-id" : "pnf-id"
+ },
+ "headers" : {
+ "Accept" : "application/json"
+ },
+ "output-key-mapping" : {
+ "ipaddress-v4-oam" : "value"
+ },
+ "key-dependencies" : [ "pnf-id" ]
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Environments/source-db.properties b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Environments/source-db.properties
new file mode 100644
index 000000000..49a7eb47b
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Environments/source-db.properties
@@ -0,0 +1 @@
+dynamic-db-source.password=sdnctl \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Environments/source-rest.properties b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Environments/source-rest.properties
new file mode 100644
index 000000000..bc1eb7417
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Environments/source-rest.properties
@@ -0,0 +1,4 @@
+blueprintsprocessor.restclient.sdnc.type=basic-auth
+blueprintsprocessor.restclient.sdnc.url=http://127.0.0.1:9111
+blueprintsprocessor.restclient.sdnc.userId=sampleuser
+blueprintsprocessor.restclient.sdnc.token=sampletoken \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_configAssign.xml b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_configAssign.xml
new file mode 100644
index 000000000..a3eedf172
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_configAssign.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd" module="CONFIG" version="1.0.0">
+ <method rpc="ResourceAssignAndActivate" mode="sync">
+ <block atomic="true">
+ <execute plugin="config-assign" method="process">
+ <outcome value="failure">
+ <return status="failure"/>
+ </outcome>
+ <outcome value="success">
+ <return status="success"/>
+ </outcome>
+ </execute>
+ </block>
+ </method>
+</service-logic>
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_configDeploy.xml b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_configDeploy.xml
new file mode 100644
index 000000000..f4e1b996f
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_configDeploy.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd" module="CONFIG" version="1.0.0">
+ <method rpc="ResourceAssignAndActivate" mode="sync">
+ <block atomic="true">
+ <execute plugin="config-deploy" method="process">
+ <outcome value="failure">
+ <return status="failure"/>
+ </outcome>
+ <outcome value="success">
+ <return status="success"/>
+ </outcome>
+ </execute>
+ </block>
+ </method>
+</service-logic>
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_upgradeSoftware.xml b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_upgradeSoftware.xml
new file mode 100644
index 000000000..52a9900b2
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Plans/CONFIG_upgradeSoftware.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd" module="CONFIG" version="1.0.0">
+ <method rpc="ResourceAssignAndActivate" mode="sync">
+ <block atomic="true">
+ <execute plugin="upgrade-software" method="process">
+ <outcome value="failure">
+ <return status="failure"/>
+ </outcome>
+ <outcome value="success">
+ <return status="success"/>
+ </outcome>
+ </execute>
+ </block>
+ </method>
+</service-logic>
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Scripts/kotlin/RestconfConfigDeploy.kt b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Scripts/kotlin/RestconfConfigDeploy.kt
new file mode 100644
index 000000000..730565959
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Scripts/kotlin/RestconfConfigDeploy.kt
@@ -0,0 +1,93 @@
+/*
+* ============LICENSE_START=======================================================
+* Copyright (C) 2020 Nordix Foundation.
+* ================================================================================
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+* ============LICENSE_END=========================================================
+ */
+
+
+package cba.pnf.config.aai
+
+
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.contentFromResolvedArtifactNB
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.storedContentFromResolvedArtifactNB
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.restconf.executor.restconfMountDevice
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.restconf.executor.restconfApplyDeviceConfig
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.restconf.executor.restconfUnMountDevice
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.restconf.executor.restconfDeviceConfig
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.restconf.executor.restconfClientService
+import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractScriptComponentFunction
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
+import org.onap.ccsdk.cds.controllerblueprints.core.logger
+import com.fasterxml.jackson.databind.ObjectMapper
+import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.BlueprintWebClientService.WebClientResponse
+
+class RestconfConfigDeploy : AbstractScriptComponentFunction() {
+ private val CONFIGLET_TEMPLATE_NAME = "config-assign"
+ private val CONFIGLET_RESOURCE_PATH = "yang-ext:mount/mynetconf:netconflist"
+ private val RESTCONF_SERVER_IDENTIFIER = "sdnc"
+ private val mapper = ObjectMapper()
+ private val log = logger(AbstractScriptComponentFunction::class.java)
+
+ override suspend fun processNB(executionRequest: ExecutionServiceInput) {
+ log.info("Started execution of process method")
+ try {
+ // Extract Resolution key & Device ID
+ val resolutionKey = getDynamicProperties("resolution-key").asText()
+ log.info("resolution_key: $resolutionKey")
+ val deviceID: String = requestPayloadActionProperty("config-deploy-properties")?.get(0)?.get("pnf-id")?.textValue()!!
+ log.info("device_id: $deviceID")
+ val webclientService = restconfClientService(RESTCONF_SERVER_IDENTIFIER)
+
+ try {
+ // Mount the device
+ val mountPayload = contentFromResolvedArtifactNB("config-deploy")
+ log.debug("Mounting Device : $deviceID")
+ restconfMountDevice(webclientService, deviceID, mountPayload, mutableMapOf("Content-Type" to "application/json"))
+
+ //Log the current configuration for the subtree
+ val currentConfig: Any = restconfDeviceConfig(webclientService, deviceID, CONFIGLET_RESOURCE_PATH)
+ log.info("Current configuration subtree : $currentConfig")
+ //Apply configlet
+ val result = restconfApplyDeviceConfig(webclientService, deviceID, CONFIGLET_RESOURCE_PATH,
+ storedContentFromResolvedArtifactNB(resolutionKey, CONFIGLET_TEMPLATE_NAME),
+ mutableMapOf("Content-Type" to "application/yang.patch+json")) as WebClientResponse<*>
+
+ val jsonResult = mapper.readTree((result.body).toString())
+
+ if (jsonResult.get("ietf-yang-patch:yang-patch-status").get("errors") != null) {
+ log.error("There was an error configuring device")
+ } else {
+ log.info("Device has been configured succesfully")
+ }
+
+ } catch (err: Exception) {
+ log.error("an error occurred while configuring device {}", err)
+ } finally {
+ //Un mount device
+ restconfUnMountDevice(webclientService, deviceID, "")
+ }
+ } catch (bpe: BluePrintProcessorException) {
+ log.error("Error looking up server identifier ", bpe)
+ }
+ }
+
+
+ override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: ExecutionServiceInput) {
+ log.info("Recover function called!")
+ log.info("Execution request : $executionRequest")
+ log.error("Exception", runtimeException)
+ }
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Scripts/kotlin/RestconfSoftwareUpgrade.kt b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Scripts/kotlin/RestconfSoftwareUpgrade.kt
new file mode 100644
index 000000000..07e804b95
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Scripts/kotlin/RestconfSoftwareUpgrade.kt
@@ -0,0 +1,195 @@
+/*
+* ============LICENSE_START=======================================================
+* Copyright (C) 2020 Nordix Foundation.
+* ================================================================================
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+* ============LICENSE_END=========================================================
+ */
+
+
+package cba.pnf.swug
+
+import com.fasterxml.jackson.databind.node.ObjectNode
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.contentFromResolvedArtifactNB
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.restconf.executor.restconfApplyDeviceConfig
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.restconf.executor.restconfDeviceConfig
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.restconf.executor.restconfMountDevice
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.restconf.executor.restconfUnMountDevice
+import org.onap.ccsdk.cds.blueprintsprocessor.rest.restClientService
+import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.BlueprintWebClientService
+import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractScriptComponentFunction
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintException
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintRetryException
+import org.onap.ccsdk.cds.controllerblueprints.core.logger
+import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintDependencyService
+import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
+
+class RestconfSoftwareUpgrade : AbstractScriptComponentFunction() {
+
+ private val RESTCONF_SERVER_IDENTIFIER = "sdnc"
+ private val CONFIGLET_RESOURCE_PATH = "yang-ext:mount/pnf-sw-upgrade:software-upgrade"
+ private val log = logger(AbstractScriptComponentFunction::class.java)
+ private val TARGET_SOFTWARE_PATH = "$CONFIGLET_RESOURCE_PATH/upgrade-package/"
+
+ override suspend fun processNB(executionRequest: ExecutionServiceInput) {
+
+ // Extract request properties
+ val properties = requestPayloadActionProperty(executionRequest.actionIdentifiers.actionName + "-properties")!!.get(0)
+ val model= SoftwareUpgradeModel(getDynamicProperties("resolution-key").asText(),
+ BluePrintDependencyService.restClientService(RESTCONF_SERVER_IDENTIFIER),
+ properties.get("pnf-id").textValue(), properties.get("target-software-version").textValue(),
+ Action.getEnumFromActionName(executionRequest.actionIdentifiers.actionName))
+
+ log.info("Blueprint invoked for ${model.resolutionKey} for SW Upgrade : " +
+ "${model.action} for sw version ${model.targetSwVersion} on pnf: ${model.deviceId}")
+
+ try {
+ val mountPayload = contentFromResolvedArtifactNB("mount-node")
+ log.debug("Mount Payload : $mountPayload")
+ restconfMountDevice(model.client, model.deviceId, mountPayload, mutableMapOf("Content-Type" to "application/json"))
+
+ when (model.action) {
+ Action.PRE_CHECK -> processPrecheck(model)
+ Action.DOWNLOAD_NE_SW -> processDownloadNeSw(model)
+ Action.ACTIVATE_NE_SW -> processActivateNeSw(model)
+ Action.POST_CHECK -> processPostcheck(model)
+ Action.CANCEL -> processCancel(model)
+ }
+
+ } catch (err: Exception) {
+ log.error("an error occurred while configuring device {}", err)
+ } finally {
+ restconfUnMountDevice(model.client, model.deviceId, "")
+ }
+ }
+
+ private suspend fun processPrecheck(model: SoftwareUpgradeModel) {
+ log.debug("In PNF SW upgrade : processPreCheck")
+ //Log the current configuration for the subtree
+ val payloadObject = getCurrentConfig(model)
+ log.debug("Current sw version on pnf : ${payloadObject.get("software-upgrade")?.get("upgrade-package")?.get(0)?.get("software-version")?.asText()}")
+ log.info("PNF is Healthy!")
+ }
+
+ private suspend fun processDownloadNeSw(model: SoftwareUpgradeModel) {
+ log.debug("In PNF SW upgrade : processDownloadNeSw")
+ //Check if there is existing config for the targeted software version
+
+ var downloadConfigPayload: String
+ if (checkIfSwReadyToPerformAction(Action.PRE_CHECK, model)) {
+ downloadConfigPayload = contentFromResolvedArtifactNB("configure")
+ downloadConfigPayload =downloadConfigPayload.replace("%id%", model.yangId)
+ }
+ else {
+ downloadConfigPayload = contentFromResolvedArtifactNB("download-ne-sw")
+ model.yangId=model.targetSwVersion
+ }
+ downloadConfigPayload = downloadConfigPayload.replace("%actionName%", Action.DOWNLOAD_NE_SW.name)
+ log.info("Config Payload to start download : $downloadConfigPayload")
+
+ //Apply configlet
+ restconfApplyDeviceConfig(model.client, model.deviceId, CONFIGLET_RESOURCE_PATH, downloadConfigPayload,
+ mutableMapOf("Content-Type" to "application/yang.patch+json"))
+
+ //Poll PNF for Download action's progress
+ checkExecution(model)
+ }
+
+ private suspend fun processActivateNeSw(model: SoftwareUpgradeModel) {
+ log.debug("In PNF SW upgrade : processActivateNeSw")
+ //Check if the software is downloaded and ready to be activated
+ if (checkIfSwReadyToPerformAction(Action.DOWNLOAD_NE_SW, model)) {
+ var activateConfigPayload: String = contentFromResolvedArtifactNB("configure")
+ activateConfigPayload = activateConfigPayload.replace("%actionName%", Action.ACTIVATE_NE_SW.name)
+ log.info("Config Payload to start activate : $activateConfigPayload")
+ //Apply configlet
+ restconfApplyDeviceConfig(model.client, model.deviceId, CONFIGLET_RESOURCE_PATH, activateConfigPayload,
+ mutableMapOf("Content-Type" to "application/yang.patch+json"))
+
+ //Poll PNF for Activate action's progress
+ checkExecution(model)
+ } else {
+ throw BluePrintRetryException("Software Download not completed for device(${model.deviceId}) to activate sw version: ${model.targetSwVersion}")
+ }
+ }
+
+ private suspend fun processPostcheck(model: SoftwareUpgradeModel) {
+ log.info("In PNF SW upgrade : processPostcheck")
+ //Log the current configuration for the subtree
+ if (checkIfSwReadyToPerformAction(Action.POST_CHECK, model)) {
+ log.info("PNF is healthy post activation!")
+ }
+ }
+
+ private fun processCancel(model :SoftwareUpgradeModel) {
+ //This is for future implementation of cancel step during software upgrade
+ log.info("In PNF SW upgrade : processCancel")
+ }
+
+ private suspend fun getCurrentConfig(model: SoftwareUpgradeModel) : ObjectNode{
+ val currentConfig: BlueprintWebClientService.WebClientResponse<String> = restconfDeviceConfig(model.client, model.deviceId, CONFIGLET_RESOURCE_PATH)
+ return JacksonUtils.jsonNode(currentConfig.body) as ObjectNode
+ }
+ private suspend fun checkExecution(model: SoftwareUpgradeModel) {
+ val checkExecutionBlock: suspend (Int) -> String = {
+ val result = restconfDeviceConfig(model.client, model.deviceId, TARGET_SOFTWARE_PATH.plus(model.yangId))
+ if (result.body.contains(model.action.completionStatus)) {
+ log.info("${model.action.name} is complete")
+ result.body
+ } else {
+ throw BluePrintRetryException("Waiting for device(${model.deviceId}) to activate sw version ${model.targetSwVersion}")
+ }
+ }
+ model.client.retry<String>(10, 0, 1000, checkExecutionBlock)
+
+ }
+
+ private suspend fun checkIfSwReadyToPerformAction(action : Action, model: SoftwareUpgradeModel): Boolean {
+ val configBody = getCurrentConfig(model)
+ configBody.get("software-upgrade")?.get("upgrade-package")?.iterator()?.forEach { item ->
+ if (model.targetSwVersion == item.get("software-version")?.asText() &&
+ action.completionStatus == item?.get("current-status")?.asText()) {
+ model.yangId= item.get("id").textValue()
+ return true
+ }
+ }
+ return false
+ }
+
+ override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: ExecutionServiceInput) {
+ log.info("Recover function called!")
+ log.info("Execution request : $executionRequest")
+ log.error("Exception", runtimeException)
+ }
+}
+
+enum class Action(val actionName: String, val completionStatus: String) {
+ PRE_CHECK("precheck", "INITIALIZED"),
+ DOWNLOAD_NE_SW("downloadNeSw", "DOWNLOAD_COMPLETED"),
+ ACTIVATE_NE_SW("activateNeSw", "ACTIVATION_COMPLETED"),
+ POST_CHECK("postcheck", "ACTIVATION_COMPLETED"),
+ CANCEL("cancel", "CANCELLED")
+ ;
+ companion object{
+ fun getEnumFromActionName(name: String): Action {
+ for(value in values()){
+ if (value.actionName==name) return value
+ }
+ throw BluePrintException("Invalid Action sent to CDS")
+ }
+ }
+}
+
+data class SoftwareUpgradeModel(val resolutionKey: String, val client: BlueprintWebClientService, val deviceId: String,
+ val targetSwVersion: String, val action: Action, var yangId: String = "") \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/TOSCA-Metadata/TOSCA.meta b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/TOSCA-Metadata/TOSCA.meta
new file mode 100644
index 000000000..467964604
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/TOSCA-Metadata/TOSCA.meta
@@ -0,0 +1,7 @@
+TOSCA-Meta-File-Version: 1.0.0
+CSAR-Version: 1.0
+Created-By: Raj Gumma <raj.gumma@est.tech>
+Entry-Definitions: Definitions/PNF_CDS_RESTCONF.json
+Template-Name: PNF_CDS_RESTCONF
+Template-Version: 1.0.0
+Template-Tags: PNF_CDS_RESTCONF
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/config-assign-restconf-configlet-template.vtl b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/config-assign-restconf-configlet-template.vtl
new file mode 100644
index 000000000..af91ba00d
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/config-assign-restconf-configlet-template.vtl
@@ -0,0 +1,53 @@
+{
+ "ietf-restconf:yang-patch":{
+ "patch-id":"patch-1",
+ "edit":[
+ {
+ "edit-id":"edit1",
+ "operation":"merge",
+ "target":"/",
+ "value":{
+ "netconflist":{
+ "netconf":[
+ {
+ "netconf-id":"10",
+ "netconf-param":"1000"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "edit-id":"edit2",
+ "operation":"merge",
+ "target":"/",
+ "value":{
+ "netconflist":{
+ "netconf":[
+ {
+ "netconf-id":"20",
+ "netconf-param":"2000"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "edit-id":"edit3",
+ "operation":"merge",
+ "target":"/",
+ "value":{
+ "netconflist":{
+ "netconf":[
+ {
+ "netconf-id":"30",
+ "netconf-param":"3000"
+ }
+ ]
+ }
+ }
+ }
+
+ ]
+ }
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/pnf-swug-config-template.vtl b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/pnf-swug-config-template.vtl
new file mode 100644
index 000000000..5e52f6779
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/pnf-swug-config-template.vtl
@@ -0,0 +1,22 @@
+{
+ "ietf-restconf:yang-patch": {
+ "patch-id": "patch-1",
+ "edit": [
+ {
+ "edit-id": "edit1",
+ "operation": "merge",
+ "target": "/",
+ "value": {
+ "software-upgrade": {
+ "upgrade-package": [
+ {
+ "id": "%id%",
+ "action": "%actionName%"
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/pnf-swug-download-ne-sw-template.vtl b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/pnf-swug-download-ne-sw-template.vtl
new file mode 100644
index 000000000..695b66866
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/pnf-swug-download-ne-sw-template.vtl
@@ -0,0 +1,28 @@
+{
+ "ietf-restconf:yang-patch": {
+ "patch-id": "patch-1",
+ "edit": [
+ {
+ "edit-id": "edit1",
+ "operation": "merge",
+ "target": "/",
+ "value": {
+ "software-upgrade": {
+ "upgrade-package": [
+ {
+ "id": "${target-software-version}",
+ "current-status": "INITIALIZED",
+ "action": "%actionName%",
+ "user-label": "trial software update",
+ "uri": "sftp://127.0.0.1/test_software_2.img",
+ "software-version": "${target-software-version}",
+ "user": "test_user",
+ "password": "test_password"
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/restconf-mount-template.vtl b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/restconf-mount-template.vtl
new file mode 100644
index 000000000..8098b05d8
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Templates/restconf-mount-template.vtl
@@ -0,0 +1,18 @@
+{
+ "node": [
+ {
+ "node-id": "${pnf-id}",
+ "netconf-node-topology:protocol": {
+ "name": "TLS"
+ },
+ "netconf-node-topology:host": "${pnf-ipv4-address}",
+ "netconf-node-topology:key-based": {
+ "username": "netconf",
+ "key-id": "ODL_private_key_0"
+ },
+ "netconf-node-topology:port": 6513,
+ "netconf-node-topology:tcp-only": false,
+ "netconf-node-topology:max-connection-attempts": 5
+ }
+ ]
+} \ No newline at end of file
diff --git a/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Tests/uat.yaml b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Tests/uat.yaml
new file mode 100644
index 000000000..79328e697
--- /dev/null
+++ b/components/model-catalog/blueprint-model/uat-blueprints/PNF_CDS_RESTCONF/Tests/uat.yaml
@@ -0,0 +1,374 @@
+%YAML 1.1
+---
+processes:
+ - name: config-assign
+ request:
+ commonHeader: &commonHeader
+ originatorId: sdnc
+ requestId: "123456-1000"
+ subRequestId: sub-123456-1000
+ actionIdentifiers: &assign-ai
+ blueprintName: PNF_CDS_RESTCONF
+ blueprintVersion: "1.0.0"
+ actionName: config-assign
+ mode: sync
+ payload:
+ config-assign-request:
+ resolution-key: &resKey "RES-KEY 61"
+ config-assign-properties:
+ service-instance-id: siid_1234
+ pnf-id: &pnfId pnf-id-2019-07-12
+ service-model-uuid: service-model-uuid
+ pnf-customization-uuid: pnf-customization-uuid
+ expectedResponse:
+ commonHeader: *commonHeader
+ actionIdentifiers: *assign-ai
+ status:
+ code: 200
+ eventType: EVENT_COMPONENT_EXECUTED
+ errorMessage: null
+ message: success
+ payload:
+ config-assign-response: {}
+ - name: config-deploy
+ request:
+ commonHeader: *commonHeader
+ actionIdentifiers: &deploy-ai
+ actionName: config-deploy
+ blueprintName: PNF_CDS_RESTCONF
+ blueprintVersion: "1.0.0"
+ mode: sync
+ payload:
+ config-deploy-request:
+ resolution-key: *resKey
+ config-deploy-properties:
+ service-instance-id: siid_1234
+ pnf-id: *pnfId
+ service-model-uuid: service-model-uuid
+ pnf-customization-uuid: pnf-customization-uuid
+ expectedResponse:
+ commonHeader: *commonHeader
+ actionIdentifiers: *deploy-ai
+ payload:
+ config-deploy-response: {}
+ status:
+ code: 200
+ errorMessage: null
+ eventType: EVENT_COMPONENT_EXECUTED
+ message: success
+ - name: precheck
+ request:
+ commonHeader: &swugCommonHeader
+ originatorId: sdnc
+ requestId: "123456-1000"
+ subRequestId: sub-123456-1000
+ actionIdentifiers: &precheck-ai
+ blueprintName: PNF_CDS_RESTCONF
+ blueprintVersion: "1.0.0"
+ actionName: precheck
+ mode: sync
+ payload:
+ precheck-request:
+ resolution-key: &resKey "RES-KEY 61"
+ precheck-properties: &actionProps
+ service-instance-id: siid_1234
+ pnf-id: &pnfId pnf-id-2019-07-12
+ target-software-version: "2.0.2"
+ service-model-uuid: service-model-uuid
+ pnf-customization-uuid: pnf-customization-uuid
+ expectedResponse:
+ commonHeader: *swugCommonHeader
+ actionIdentifiers: *precheck-ai
+ status:
+ code: 200
+ eventType: EVENT_COMPONENT_EXECUTED
+ errorMessage: null
+ message: success
+ payload:
+ precheck-response: {}
+ - name: downloadNeSw
+ request:
+ commonHeader: *swugCommonHeader
+ actionIdentifiers: &download-ai
+ blueprintName: PNF_CDS_RESTCONF
+ blueprintVersion: "1.0.0"
+ actionName: downloadNeSw
+ mode: sync
+ payload:
+ downloadNeSw-request:
+ resolution-key: *resKey
+ downloadNeSw-properties: *actionProps
+ expectedResponse:
+ commonHeader: *swugCommonHeader
+ actionIdentifiers: *download-ai
+ status:
+ code: 200
+ eventType: EVENT_COMPONENT_EXECUTED
+ errorMessage: null
+ message: success
+ payload:
+ downloadNeSw-response: {}
+ - name: activateNeSw
+ request:
+ commonHeader: *swugCommonHeader
+ actionIdentifiers: &activate-ai
+ blueprintName: PNF_CDS_RESTCONF
+ blueprintVersion: "1.0.0"
+ actionName: activateNeSw
+ mode: sync
+ payload:
+ activateNeSw-request:
+ resolution-key: *resKey
+ activateNeSw-properties: *actionProps
+ expectedResponse:
+ commonHeader: *swugCommonHeader
+ actionIdentifiers: *activate-ai
+ status:
+ code: 200
+ eventType: EVENT_COMPONENT_EXECUTED
+ errorMessage: null
+ message: success
+ payload:
+ activateNeSw-response: {}
+ - name: postcheck
+ request:
+ commonHeader: *swugCommonHeader
+ actionIdentifiers: &postcheck-ai
+ blueprintName: PNF_CDS_RESTCONF
+ blueprintVersion: "1.0.0"
+ actionName: postcheck
+ mode: sync
+ payload:
+ postcheck-request:
+ resolution-key: *resKey
+ postcheck-properties: *actionProps
+ expectedResponse:
+ commonHeader: *swugCommonHeader
+ actionIdentifiers: *postcheck-ai
+ status:
+ code: 200
+ eventType: EVENT_COMPONENT_EXECUTED
+ errorMessage: null
+ message: success
+ payload:
+ postcheck-response: {}
+external-services:
+ - selector: aai-data
+ expectations:
+ - request:
+ method: GET
+ path: [ /aai/v14/network/pnfs/pnf, *pnfId]
+ headers:
+ Accept: application/json
+ response:
+ headers:
+ Content-Type: application/json
+ body:
+ ipaddress-v4-oam: &pnfAddress 13.13.13.13
+ ipaddress-v6-oam: 1::13
+ - selector: sdnc
+ expectations:
+ - request:
+ method: PUT
+ path: &configUri [ /restconf/config, &nodeIdentifier [network-topology:network-topology/topology/topology-netconf/node, *pnfId]]
+ headers:
+ Content-Type: application/json
+ body:
+ node:
+ - node-id: *pnfId
+ netconf-node-topology:protocol: { name: TLS }
+ netconf-node-topology:host: *pnfAddress
+ netconf-node-topology:key-based:
+ username: netconf
+ key-id: ODL_private_key_0
+ netconf-node-topology:port: 6513
+ netconf-node-topology:tcp-only: false
+ netconf-node-topology:max-connection-attempts: 5
+ response:
+ status: 201
+ - request:
+ method: GET
+ path: [ /restconf/operational, *nodeIdentifier]
+ response:
+ body:
+ node: [ { netconf-node-topology:connection-status: connected }]
+ - request:
+ method: GET
+ path: [*configUri, &configletResourcePath yang-ext:mount/mynetconf:netconflist]
+ response:
+ body: {}
+ - request:
+ method: PATCH
+ path: [*configUri, *configletResourcePath]
+ headers:
+ Content-Type: application/yang.patch+json
+ body:
+ ietf-restconf:yang-patch:
+ patch-id: patch-1
+ edit:
+ - edit-id: edit1
+ operation: merge
+ target: /
+ value: { netconflist: { netconf: [ { netconf-id: "10", netconf-param: "1000" }]}}
+ - edit-id: edit2
+ operation: merge
+ target: /
+ value: { netconflist: { netconf: [ { netconf-id: "20", netconf-param: "2000" }]}}
+ - edit-id: edit3
+ operation: merge
+ target: /
+ value: { netconflist: { netconf: [ { netconf-id: "30", netconf-param: "3000" }]}}
+ response:
+ body:
+ ietf-yang-patch:yang-patch-status:
+ patch-id: patch-1
+ ok: [
+ null
+ ]
+ ### External expectations for Software Upgrade
+ - request:
+ method: GET
+ path: &ConfigSwUgUri [*configUri, &configletResourcePath yang-ext:mount/pnf-sw-upgrade:software-upgrade]
+ headers:
+ Accept: application/json
+ responses:
+ - headers:
+ Content-Type: application/json
+ body:
+ software-upgrade:
+ upgrade-package:
+ - id: 2.0.1
+ current-status: INITIALIZED
+ user-label: trial software update
+ uri: sftp:127.0.0.1/test_software_1.img
+ software-version: 2.0.1
+ user: test_user
+ password: test_password
+ - headers:
+ Content-Type: application/json
+ body:
+ software-upgrade:
+ upgrade-package:
+ - id: 2.0.1
+ current-status: INITIALIZED
+ user-label: trial software update
+ uri: sftp:127.0.0.1/test_software_1.img
+ software-version: 2.0.1
+ user: test_user
+ password: test_password
+ - headers:
+ Content-Type: application/json
+ body:
+ software-upgrade:
+ upgrade-package:
+ - id: 2.0.1
+ current-status: INITIALIZED
+ user-label: trial software update
+ uri: sftp:127.0.0.1/test_software_1.img
+ software-version: 2.0.1
+ user: test_user
+ password: test_password
+ - id: 2.0.2
+ current-status: DOWNLOAD_COMPLETED
+ state-change-time: '2020-02-20T13:03:21Z'
+ software-version: 2.0.2
+ user-label: trial software update
+ uri: sftp:127.0.0.1/test_software_1.img
+ user: test_user
+ password: test_password
+ - headers:
+ Content-Type: application/json
+ body:
+ software-upgrade:
+ upgrade-package:
+ - id: 2.0.1
+ current-status: INITIALIZED
+ user-label: trial software update
+ uri: sftp:127.0.0.1/test_software_1.img
+ software-version: 2.0.1
+ user: test_user
+ password: test_password
+ - id: 2.0.2
+ current-status: ACTIVATION_COMPLETED
+ state-change-time: '2020-02-20T13:03:21Z'
+ software-version: 2.0.2
+ user-label: trial software update
+ uri: sftp:127.0.0.1/test_software_1.img
+ user: test_user
+ password: test_password
+ - request:
+ method: PATCH
+ path: *ConfigSwUgUri
+ headers:
+ Content-Type: application/yang.patch+json
+ body:
+ ietf-restconf:yang-patch:
+ patch-id: patch-1
+ edit:
+ - edit-id: edit1
+ operation: merge
+ target: "/"
+ response:
+ headers:
+ Content-Type: application/yang.patch-status+json
+ body:
+ { ietf-yang-patch:yang-patch-status: {patch-id: patch-1, ok: [ ] } }
+ times: 2
+ - request:
+ method: GET
+ path: [*ConfigSwUgUri, upgrade-package/2.0.2]
+ headers:
+ Accept: application/json
+ responses:
+ - headers:
+ Content-Type: application/json
+ body:
+ upgrade-package:
+ - id: 2.0.2
+ current-status: DOWNLOAD_IN_PROGRESS
+ state-change-time: '2020-02-20T12:17:34.984Z'
+ software-version: 2.0.2
+ - headers:
+ Content-Type: application/json
+ body:
+ upgrade-package:
+ - id: 2.0.2
+ current-status: DOWNLOAD_IN_PROGRESS
+ state-change-time: '2020-02-20T12:52:30Z'
+ software-version: 2.0.2
+ - headers:
+ Content-Type: application/json
+ body:
+ upgrade-package:
+ - id: 2.0.2
+ current-status: DOWNLOAD_COMPLETED
+ state-change-time: '2020-02-20T13:03:21Z'
+ software-version: 2.0.2
+ - headers:
+ Content-Type: application/json
+ body:
+ upgrade-package:
+ - id: 2.0.2
+ current-status: ACTIVATION_IN_PROGRESS
+ state-change-time: '2020-02-20T13:05:08Z'
+ software-version: 2.0.2
+ - headers:
+ Content-Type: application/json
+ body:
+ upgrade-package:
+ - id: 2.0.2
+ current-status: ACTIVATION_IN_PROGRESS
+ state-change-time: '2020-02-20T12:52:30Z'
+ software-version: 2.0.2
+ - headers:
+ Content-Type: application/json
+ body:
+ upgrade-package:
+ - id: 2.0.2
+ current-status: ACTIVATION_COMPLETED
+ state-change-time: '2020-02-20T13:07:12Z'
+ software-version: 2.0.2
+ - request:
+ method: DELETE
+ path: *configUri
+ times: 5 \ No newline at end of file