Add script and patch to build CBA file to support PNF SW upgrade

Change-Id: I8b0155a0a6022d7b6d172c1b46d1b7d189fcbe8a
Issue-ID: INT-1210
Signed-off-by: Enbo Wang <wangenbo@huawei.com>
diff --git a/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/build-cba-for-pnf-sw-upgrade-with-em.sh b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/build-cba-for-pnf-sw-upgrade-with-em.sh
new file mode 100755
index 0000000..76102c3
--- /dev/null
+++ b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/build-cba-for-pnf-sw-upgrade-with-em.sh
@@ -0,0 +1,77 @@
+#!/bin/bash
+
+#  ============LICENSE_START=======================================================
+#  Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+#  ================================================================================
+#  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=========================================================
+
+set -euo pipefail
+
+readonly SOURCE_CBA="PNF_CDS_RESTCONF"
+readonly TARGET_CBA="PNF_SW_UPGRADE_WITH_EM"
+readonly CDS_CODE_DIR="cds-codes-for-pnf-sw-upgrade"
+
+function use_specific_commit()
+{
+    local commit_id="$1"
+    cd ${CDS_CODE_DIR}
+    local tmp_branch="get-cba-for-pnf-sw-upgrade"
+    if ! git branch | grep -q "${tmp_branch}"; then
+        git checkout -b ${tmp_branch} ${commit_id}
+    else
+        git checkout -q ${tmp_branch}
+    fi
+    cd ${OLDPWD}
+}
+
+if [ ! -e ${CDS_CODE_DIR} ]; then
+    git clone https://gerrit.onap.org/r/ccsdk/cds ${CDS_CODE_DIR}
+else
+    cd ${CDS_CODE_DIR}
+	code_status=`git status -s`
+    if [ -n "${code_status}" ]; then
+        echo "Please keep the CDS codes are not modified."
+        exit 1
+    fi
+    cd ${OLDPWD}
+fi
+
+# Lock the version of source CBA files
+use_specific_commit f4ac359d80d043a2d0e6eaf1730813b81f2c837f
+
+if [ -e ${TARGET_CBA} -o -e ${TARGET_CBA}.zip ]; then
+    echo "${TARGET_CBA} or ${TARGET_CBA}.zip has existed, please rename or delete them."
+    exit 1
+fi
+
+cp -ir ${CDS_CODE_DIR}/components/model-catalog/blueprint-model/uat-blueprints/${SOURCE_CBA} ${TARGET_CBA}
+cp -ir patches ${TARGET_CBA}
+
+cd ${TARGET_CBA}
+
+mv Definitions/PNF_CDS_RESTCONF.json Definitions/PNF_SW_UPGRADE_WITH_EM.json
+mv Templates/pnf-swug-config-template.vtl Templates/pnf-swug-activate-ne-sw-template.vtl
+
+for p in patches/*.patch; do
+    patch -p1 -i $p
+done
+
+rm -rf patches
+
+zip -r ${TARGET_CBA}.zip .
+
+cd ${OLDPWD}
+
+mv -i ${TARGET_CBA}/${TARGET_CBA}.zip .
+
diff --git a/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/PNF_SW_UPGRADE_WITH_EM.json.patch b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/PNF_SW_UPGRADE_WITH_EM.json.patch
new file mode 100644
index 0000000..f4c8062
--- /dev/null
+++ b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/PNF_SW_UPGRADE_WITH_EM.json.patch
@@ -0,0 +1,148 @@
+--- PNF_CDS_RESTCONF/Definitions/PNF_CDS_RESTCONF.json	2020-03-14 20:54:46.677546900 +0800
++++ PNF_SW_UPGRADE_WITH_EM/Definitions/PNF_SW_UPGRADE_WITH_EM.json	2020-03-14 22:08:47.225398400 +0800
+@@ -4,7 +4,7 @@
+     "template_author" : "Raj Gumma",
+     "author-email" : "raj.gumma@est.tech",
+     "user-groups" : "ADMIN, OPERATION",
+-    "template_name" : "PNF_CDS_RESTCONF",
++    "template_name" : "PNF_SW_UPGRADE_WITH_EM",
+     "template_version" : "1.0.0",
+     "template_tags" : "PNF, Restconf, config, configuration, software upgrade"
+   },
+@@ -74,28 +74,6 @@
+           }
+         }
+       },
+-      "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" : {
+@@ -220,41 +198,6 @@
+           }
+         }
+       },
+-      "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" : {
+@@ -268,7 +211,7 @@
+                 },
+                 "inputs" : {
+                   "script-type" : "kotlin",
+-                  "script-class-reference" : "cba.pnf.swug.RestconfSoftwareUpgrade",
++                  "script-class-reference" : "cba.pnf.swm.RestconfSoftwareUpgrade",
+                   "dynamic-properties" : "*preCheck-properties"
+                 },
+                 "outputs" : {
+@@ -303,7 +246,7 @@
+                 },
+                 "inputs" : {
+                   "script-type" : "kotlin",
+-                  "script-class-reference" : "cba.pnf.swug.RestconfSoftwareUpgrade",
++                  "script-class-reference" : "cba.pnf.swm.RestconfSoftwareUpgrade",
+                   "dynamic-properties" : "*downloadNESw-properties"
+                 },
+                 "outputs" : {
+@@ -323,14 +266,6 @@
+             "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"
+@@ -354,7 +289,7 @@
+                 },
+                 "inputs" : {
+                   "script-type" : "kotlin",
+-                  "script-class-reference" : "cba.pnf.swug.RestconfSoftwareUpgrade",
++                  "script-class-reference" : "cba.pnf.swm.RestconfSoftwareUpgrade",
+                   "dynamic-properties" : "*activateNESw-properties"
+                 },
+                 "outputs" : {
+@@ -374,11 +309,11 @@
+             "type" : "artifact-mapping-resource",
+             "file" : "Definitions/pnf-software-upgrade-mapping.json"
+           },
+-          "configure-template" : {
++          "activate-ne-sw-template" : {
+             "type" : "artifact-template-velocity",
+-            "file" : "Templates/pnf-swug-config-template.vtl"
++            "file" : "Templates/pnf-swug-activate-ne-sw-template.vtl"
+           },
+-          "configure-mapping" : {
++          "activate-ne-sw-mapping" : {
+             "type" : "artifact-mapping-resource",
+             "file" : "Definitions/pnf-software-upgrade-mapping.json"
+           }
+@@ -397,7 +332,7 @@
+                 },
+                 "inputs" : {
+                   "script-type" : "kotlin",
+-                  "script-class-reference" : "cba.pnf.swug.RestconfSoftwareUpgrade",
++                  "script-class-reference" : "cba.pnf.swm.RestconfSoftwareUpgrade",
+                   "dynamic-properties" : "*postCheck-properties"
+                 },
+                 "outputs" : {
diff --git a/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/RestconfSoftwareUpgrade.kt.patch b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/RestconfSoftwareUpgrade.kt.patch
new file mode 100644
index 0000000..01473f4
--- /dev/null
+++ b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/RestconfSoftwareUpgrade.kt.patch
@@ -0,0 +1,192 @@
+--- PNF_CDS_RESTCONF/Scripts/kotlin/RestconfSoftwareUpgrade.kt	2020-03-12 15:16:34.617000000 +0800
++++ PNF_SW_UPGRADE_WITH_EM/Scripts/kotlin/RestconfSoftwareUpgrade.kt	2020-03-12 23:12:50.012507800 +0800
+@@ -1,6 +1,7 @@
+ /*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation.
++*  Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+@@ -17,7 +18,7 @@
+  */
+ 
+ 
+-package cba.pnf.swug
++package cba.pnf.swm
+ 
+ import com.fasterxml.jackson.databind.node.ObjectNode
+ import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
+@@ -38,20 +39,27 @@
+ class RestconfSoftwareUpgrade : AbstractScriptComponentFunction() {
+ 
+     private val RESTCONF_SERVER_IDENTIFIER = "sdnc"
+-    private val CONFIGLET_RESOURCE_PATH = "yang-ext:mount/pnf-sw-upgrade:software-upgrade"
++    private val CONFIGLET_RESOURCE_PATH = "yang-ext:mount/pnf-swm:software-management"
+     private val log = logger(AbstractScriptComponentFunction::class.java)
+-    private val TARGET_SOFTWARE_PATH = "$CONFIGLET_RESOURCE_PATH/upgrade-package/"
++    private val TARGET_SOFTWARE_PATH = "$CONFIGLET_RESOURCE_PATH/pnf-software-package/"
+ 
+     override suspend fun processNB(executionRequest: ExecutionServiceInput) {
+ 
+         // Extract request properties
+-        val model= validatedPayload(executionRequest)
++        var model: SoftwareManagementModel = validatedPayload(executionRequest)
+ 
+         log.info("Blueprint invoked for ${model.resolutionKey} for SW Upgrade : " +
+-            "${model.action} for sw version ${model.targetSwVersion} on pnf: ${model.deviceId}")
++            "${model.action} for sw version ${model.targetSwVersion} on pnf: ${model.neIdentifier}")
+ 
+         try {
+-            val mountPayload = contentFromResolvedArtifactNB("mount-node")
++            var mountPayload: String = contentFromResolvedArtifactNB("mount-node")
++
++            val mountPayloadObject = JacksonUtils.jsonNode(mountPayload) as ObjectNode
++            val emsIp = mountPayloadObject.get("node")?.get(0)?.get("netconf-node-topology:host")?.asText()
++
++            model.deviceId = "ems-" + emsIp?.replace(".", "-")
++            mountPayload = mountPayload.replace("%ems-id%", model.deviceId)
++
+             log.debug("Mount Payload : $mountPayload")
+             restconfMountDevice(model.client, model.deviceId, mountPayload, mutableMapOf("Content-Type" to "application/json"))
+ 
+@@ -70,40 +78,34 @@
+         }
+     }
+ 
+-    private fun validatedPayload(executionRequest: ExecutionServiceInput): SoftwareUpgradeModel {
++    private fun validatedPayload(executionRequest: ExecutionServiceInput): SoftwareManagementModel {
+         val properties = requestPayloadActionProperty(executionRequest.actionIdentifiers.actionName + "-properties")!!.get(0)
+         if(!properties?.get("pnf-id")?.textValue().isNullOrEmpty() &&
+             !properties?.get("target-software-version")?.textValue().isNullOrEmpty()) {
+-            return SoftwareUpgradeModel(getDynamicProperties("resolution-key").asText(),
++            return SoftwareManagementModel(getDynamicProperties("resolution-key").asText(),
+                 BluePrintDependencyService.restClientService(RESTCONF_SERVER_IDENTIFIER),
+-                properties.get("pnf-id").textValue(), properties.get("target-software-version").textValue(),
++                "",
++                properties.get("pnf-id").textValue(),
++                properties.get("target-software-version").textValue(),
+                 Action.getEnumFromActionName(executionRequest.actionIdentifiers.actionName))
+         }else{
+             throw BluePrintException("Invalid parameters sent to CDS. Request parameters pnf-id or target-software-version missing")
+         }
+     }
+ 
+-    private suspend fun processPreCheck(model: SoftwareUpgradeModel) {
++    private suspend fun processPreCheck(model: SoftwareManagementModel) {
+         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.debug("Current sw version on pnf : ${payloadObject.get("software-management")?.get("pnf-software-package")?.get(0)?.get("software-version")?.asText()}")
+         log.info("PNF is Healthy!")
+     }
+ 
+-    private suspend fun processDownloadNESw(model: SoftwareUpgradeModel) {
++    private suspend fun processDownloadNESw(model: SoftwareManagementModel) {
+         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
+-        }
++        var downloadConfigPayload: String = contentFromResolvedArtifactNB("download-ne-sw")
++        model.yangId = model.neIdentifier
+         downloadConfigPayload = downloadConfigPayload.replace("%actionName%", Action.DOWNLOAD_NE_SW.name)
+         log.info("Config Payload to start download : $downloadConfigPayload")
+ 
+@@ -115,14 +117,15 @@
+         checkExecution(model)
+     }
+ 
+-    private suspend fun processActivateNESw(model: SoftwareUpgradeModel) {
++    private suspend fun processActivateNESw(model: SoftwareManagementModel) {
+         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")
++            var activateConfigPayload: String = contentFromResolvedArtifactNB("activate-ne-sw")
+             activateConfigPayload = activateConfigPayload.replace("%actionName%", Action.ACTIVATE_NE_SW.name)
+-            activateConfigPayload = activateConfigPayload.replace("%id%", model.yangId)
+             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"))
+@@ -134,7 +137,7 @@
+         }
+     }
+ 
+-    private suspend fun processPostCheck(model: SoftwareUpgradeModel) {
++    private suspend fun processPostCheck(model: SoftwareManagementModel) {
+         log.info("In PNF SW upgrade : processPostCheck")
+         //Log the current configuration for the subtree
+         if (checkIfSwReadyToPerformAction(Action.POST_CHECK, model)) {
+@@ -142,35 +145,36 @@
+         }
+     }
+ 
+-    private fun processCancel(model :SoftwareUpgradeModel) {
++    private fun processCancel(model :SoftwareManagementModel) {
+         //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{
++    private suspend fun getCurrentConfig(model: SoftwareManagementModel) : 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) {
++
++    private suspend fun checkExecution(model: SoftwareManagementModel) {
+         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}")
++                throw BluePrintRetryException("Waiting for device(${model.deviceId}) to complete ${model.action.name}")
+             }
+         }
+         model.client.retry<String>(10, 0, 1000, checkExecutionBlock)
+ 
+     }
+ 
+-    private suspend fun checkIfSwReadyToPerformAction(action : Action, model: SoftwareUpgradeModel): Boolean {
++    private suspend fun checkIfSwReadyToPerformAction(action : Action, model: SoftwareManagementModel): Boolean {
+         val configBody = getCurrentConfig(model)
+-        configBody.get("software-upgrade")?.get("upgrade-package")?.iterator()?.forEach { item ->
++        configBody.get("software-management")?.get("pnf-software-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()
++                model.yangId= item.get("neIdentifier").textValue()
+                 return true
+             }
+         }
+@@ -201,5 +205,12 @@
+     }
+ }
+ 
+-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
++data class SoftwareManagementModel(
++        val resolutionKey: String,
++        val client: BlueprintWebClientService,
++        var deviceId: String,
++        val neIdentifier: String,
++        val targetSwVersion: String,
++        val action: Action,
++        var yangId: String = ""
++)
+\ No newline at end of file
diff --git a/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/TOSCA.meta.patch b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/TOSCA.meta.patch
new file mode 100644
index 0000000..29ce13c
--- /dev/null
+++ b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/TOSCA.meta.patch
@@ -0,0 +1,13 @@
+--- PNF_CDS_RESTCONF/TOSCA-Metadata/TOSCA.meta	2020-03-12 12:13:38.654109400 +0800
++++ PNF_SW_UPGRADE_WITH_EM/TOSCA-Metadata/TOSCA.meta	2020-03-13 00:05:30.186335900 +0800
+@@ -1,7 +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
++Entry-Definitions: Definitions/PNF_SW_UPGRADE_WITH_EM.json
++Template-Name: PNF_SW_UPGRADE_WITH_EM
+ Template-Version: 1.0.0
+-Template-Tags: PNF_CDS_RESTCONF
++Template-Tags: PNF_SW_UPGRADE_WITH_EM
diff --git a/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/pnf-software-upgrade-mapping.json.patch b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/pnf-software-upgrade-mapping.json.patch
new file mode 100644
index 0000000..74c5d18
--- /dev/null
+++ b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/pnf-software-upgrade-mapping.json.patch
@@ -0,0 +1,17 @@
+--- PNF_CDS_RESTCONF/Definitions/pnf-software-upgrade-mapping.json	2020-03-12 12:13:38.642390600 +0800
++++ PNF_SW_UPGRADE_WITH_EM/Definitions/pnf-software-upgrade-mapping.json	2020-03-12 23:59:44.111140600 +0800
+@@ -22,12 +22,12 @@
+     ]
+   },
+   {
+-    "name": "pnf-ipv4-address",
++    "name": "ems-ipv4-address",
+     "input-param": false,
+     "property": {
+       "type": "string"
+     },
+-    "dictionary-name": "pnf-ipaddress-aai",
++    "dictionary-name": "ems-ipaddress-aai",
+     "dictionary-source": "aai-data",
+     "dependencies": [
+       "pnf-id"
diff --git a/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/pnf-swug-activate-ne-sw-template.vtl.patch b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/pnf-swug-activate-ne-sw-template.vtl.patch
new file mode 100644
index 0000000..7d8d7ef
--- /dev/null
+++ b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/pnf-swug-activate-ne-sw-template.vtl.patch
@@ -0,0 +1,19 @@
+--- PNF_CDS_RESTCONF/Templates/pnf-swug-config-template.vtl	2020-03-12 19:06:30.108210900 +0800
++++ PNF_SW_UPGRADE_WITH_EM/Templates/pnf-swug-activate-ne-sw-template.vtl	2020-03-12 23:29:51.565242200 +0800
+@@ -7,11 +7,12 @@
+         "operation": "merge",
+         "target": "/",
+         "value": {
+-          "software-upgrade": {
+-            "upgrade-package": [
++          "software-management": {
++            "pnf-software-package": [
+               {
+-                "id": "%id%",
+-                "action": "%actionName%"
++                "neIdentifier": "${pnf-id}",
++                "action": "%actionName%",
++                "swVersionToBeActivated": "${target-software-version}"
+               }
+             ]
+           }
diff --git a/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/pnf-swug-download-ne-sw-template.vtl.patch b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/pnf-swug-download-ne-sw-template.vtl.patch
new file mode 100644
index 0000000..f74ad83
--- /dev/null
+++ b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/pnf-swug-download-ne-sw-template.vtl.patch
@@ -0,0 +1,34 @@
+--- PNF_CDS_RESTCONF/Templates/pnf-swug-download-ne-sw-template.vtl	2020-03-12 12:13:38.660945300 +0800
++++ PNF_SW_UPGRADE_WITH_EM/Templates/pnf-swug-download-ne-sw-template.vtl	2020-03-12 23:12:49.980281200 +0800
+@@ -7,17 +7,21 @@
+         "operation": "merge",
+         "target": "/",
+         "value": {
+-          "software-upgrade": {
+-            "upgrade-package": [
++          "software-management": {
++            "pnf-software-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"
++                "neIdentifier": "${pnf-id}",
++                "current-status": "INITIALIZED",
++                "action": "%actionName%",
++                "software-version": "${target-software-version}",
++                "swToBeDownloaded": [
++                  {
++                    "swLocation": "http://192.168.35.96:10080/ran_du_pkg1-v2.zip",
++                    "swFileSize": "12345678",
++                    "swFileCompression": "ZIP",
++                    "swFileFormat": "binary"
++                  }
++                ]
+               }
+             ]
+           }
diff --git a/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/resources_definition_types.json.patch b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/resources_definition_types.json.patch
new file mode 100644
index 0000000..74f3fb0
--- /dev/null
+++ b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/resources_definition_types.json.patch
@@ -0,0 +1,14 @@
+--- PNF_CDS_RESTCONF/Definitions/resources_definition_types.json	2020-03-12 12:13:38.643367200 +0800
++++ PNF_SW_UPGRADE_WITH_EM/Definitions/resources_definition_types.json	2020-03-12 23:55:20.636531200 +0800
+@@ -14,9 +14,9 @@
+       }
+     }
+   },
+-  "pnf-ipaddress-aai" : {
++  "ems-ipaddress-aai" : {
+     "tags" : "aai-get",
+-    "name" : "pnf-ipaddress-aai",
++    "name" : "ems-ipaddress-aai",
+     "property" : {
+       "description" : "primary aai data to get resource",
+       "type" : "string"
diff --git a/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/restconf-mount-template.vtl.patch b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/restconf-mount-template.vtl.patch
new file mode 100644
index 0000000..b5a9c5b
--- /dev/null
+++ b/test/mocks/emssimulator/pnf-sw-upgrade-cba-builder/patches/restconf-mount-template.vtl.patch
@@ -0,0 +1,16 @@
+--- PNF_CDS_RESTCONF/Templates/restconf-mount-template.vtl	2020-03-12 12:13:38.664851500 +0800
++++ PNF_SW_UPGRADE_WITH_EM/Templates/restconf-mount-template.vtl	2020-03-12 23:36:52.209773400 +0800
+@@ -1,11 +1,11 @@
+ {
+   "node": [
+     {
+-      "node-id": "${pnf-id}",
++      "node-id": "%ems-id%",
+       "netconf-node-topology:protocol": {
+         "name": "TLS"
+       },
+-      "netconf-node-topology:host": "${pnf-ipv4-address}",
++      "netconf-node-topology:host": "${ems-ipv4-address}",
+       "netconf-node-topology:key-based": {
+         "username": "netconf",
+         "key-id": "ODL_private_key_0"