Add the executor and the component function to support 5G NRM CM 85/101085/12
authorHuang Cheng <duke.huangcheng@huawei.com>
Tue, 4 Feb 2020 03:53:15 +0000 (03:53 +0000)
committerHuang Cheng <duke.huangcheng@huawei.com>
Fri, 6 Mar 2020 01:21:14 +0000 (01:21 +0000)
The executor and the component function are designed to invoke the 5G NRM CM opertions: createMOI getMOIAttributes modifyMOIAttributes and deleteMOI

Issue-ID: CCSDK-2003
Signed-off-by: Huang Cheng <duke.huangcheng@huawei.com>
Change-Id: I20d3e97c01f6499e73ab0ec77abbc24775f428b7

ms/blueprintsprocessor/application/pom.xml
ms/blueprintsprocessor/functions/pom.xml
ms/blueprintsprocessor/functions/restful-executor/pom.xml [moved from ms/blueprintsprocessor/functions/nrm-restful/pom.xml with 84% similarity]
ms/blueprintsprocessor/functions/restful-executor/src/main/kotlin/internal/scripts/TestRestfulConfigure.kt [new file with mode: 0644]
ms/blueprintsprocessor/functions/restful-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restful/executor/ComponentRestfulExecutor.kt [new file with mode: 0644]
ms/blueprintsprocessor/functions/restful-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restful/executor/RestfulCMComponentFunction.kt [new file with mode: 0644]
ms/blueprintsprocessor/functions/restful-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restful/executor/nrmfunction/RestfulNRMServiceClient.kt [moved from ms/blueprintsprocessor/functions/nrm-restful/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/nrm/restful/RestfulNRMServiceClient.kt with 98% similarity]
ms/blueprintsprocessor/functions/restful-executor/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/restful/executor/ComponentRestfulExecutorTest.kt [new file with mode: 0644]
ms/blueprintsprocessor/functions/restful-executor/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/restful/executor/nrmfunction/RestfulNRMServiceClientTest.kt [moved from ms/blueprintsprocessor/functions/nrm-restful/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/nrm/restful/RestfulNRMServiceClientTest.kt with 98% similarity]
ms/blueprintsprocessor/parent/pom.xml

index 0a78d54..b75e161 100755 (executable)
             <groupId>org.onap.ccsdk.cds.blueprintsprocessor.functions</groupId>
             <artifactId>python-executor</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.cds.blueprintsprocessor.functions</groupId>
+            <artifactId>restful-executor</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.onap.ccsdk.cds.blueprintsprocessor.functions</groupId>
             <artifactId>ansible-awx-executor</artifactId>
index abd186b..3097c1b 100755 (executable)
@@ -33,7 +33,7 @@
 
     <modules>
         <module>resource-resolution</module>
-        <module>nrm-restful</module>
+        <module>restful-executor</module>
         <module>ansible-awx-executor</module>
         <module>python-executor</module>
         <module>netconf-executor</module>
     </parent>
 
     <groupId>org.onap.ccsdk.cds.blueprintsprocessor.functions</groupId>
-    <artifactId>nrm-restful</artifactId>
-    <packaging>jar</packaging>
+    <artifactId>restful-executor</artifactId>
 
-    <name>Blueprints Processor Function - NRM Restful</name>
-    <description>Blueprints Processor Function - NRM Restful</description>
+    <name>Blueprints Processor Function - NRM Restful executor</name>
+    <description>Blueprints Processor Function - NRM Restful executor</description>
 
     <dependencies>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-web</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/ms/blueprintsprocessor/functions/restful-executor/src/main/kotlin/internal/scripts/TestRestfulConfigure.kt b/ms/blueprintsprocessor/functions/restful-executor/src/main/kotlin/internal/scripts/TestRestfulConfigure.kt
new file mode 100644 (file)
index 0000000..5f867b9
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ *  Copyright © 2020 Huawei.
+ *
+ *  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.
+ */
+@file:Suppress("unused")
+
+package internal.scripts
+
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.restful.executor.RestfulCMComponentFunction
+import org.slf4j.LoggerFactory
+
+/**
+ * This is for used for Testing only
+ */
+open class TestRestfulConfigure : RestfulCMComponentFunction() {
+
+    val log = LoggerFactory.getLogger(TestRestfulConfigure::class.java)!!
+
+    override fun getName(): String {
+        return "TestRestfulConfigure"
+    }
+
+    override suspend fun processNB(executionRequest: ExecutionServiceInput) {
+        log.info("processing request..")
+    }
+
+    override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: ExecutionServiceInput) {
+        log.info("recovering..")
+    }
+}
diff --git a/ms/blueprintsprocessor/functions/restful-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restful/executor/ComponentRestfulExecutor.kt b/ms/blueprintsprocessor/functions/restful-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restful/executor/ComponentRestfulExecutor.kt
new file mode 100644 (file)
index 0000000..e1643b5
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright © 2020 Huawei Intellectual Property.
+ *
+ * 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.
+ */
+package org.onap.ccsdk.cds.blueprintsprocessor.functions.restful.executor
+
+import com.fasterxml.jackson.databind.node.ArrayNode
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
+import org.onap.ccsdk.cds.blueprintsprocessor.rest.RestLibConstants
+import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractComponentFunction
+import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.ComponentFunctionScriptingService
+import org.onap.ccsdk.cds.controllerblueprints.core.getAsString
+import org.springframework.beans.factory.config.ConfigurableBeanFactory
+import org.springframework.context.annotation.Scope
+import org.springframework.stereotype.Component
+
+@Component("component-restful-executor")
+@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+open class ComponentRestfulExecutor(private var componentFunctionScriptingService: ComponentFunctionScriptingService) : AbstractComponentFunction() {
+
+    lateinit var scriptComponent: RestfulCMComponentFunction
+
+    companion object {
+        const val SCRIPT_TYPE = "script-type"
+        const val SCRIPT_CLASS_REFERENCE = "script-class-reference"
+        const val INSTANCE_DEPENDENCIES = "instance-dependencies"
+    }
+
+    override suspend fun processNB(executionRequest: ExecutionServiceInput) {
+
+        val scriptType = operationInputs.getAsString(SCRIPT_TYPE)
+        val scriptClassReference = operationInputs.getAsString(SCRIPT_CLASS_REFERENCE)
+        val instanceDependenciesNode = operationInputs.get(INSTANCE_DEPENDENCIES) as? ArrayNode
+
+        val scriptDependencies: MutableList<String> = arrayListOf()
+        scriptDependencies.add(RestLibConstants.SERVICE_BLUEPRINT_REST_LIB_PROPERTY)
+
+        instanceDependenciesNode?.forEach { instanceName ->
+            scriptDependencies.add(instanceName.textValue())
+        }
+        /**
+         * Populate the Script Instance based on the Type
+         */
+        scriptComponent = componentFunctionScriptingService
+                .scriptInstance<RestfulCMComponentFunction>(this, scriptType,
+                        scriptClassReference, scriptDependencies)
+
+        checkNotNull(scriptComponent) { "failed to get restfulCM script component" }
+
+        // Handles both script processing and error handling
+        scriptComponent.executeScript(executionServiceInput)
+    }
+
+    override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: ExecutionServiceInput) {
+        bluePrintRuntimeService.getBluePrintError()
+                .addError("Failed in ComponentRestfulExecutor : ${runtimeException.message}")
+    }
+}
diff --git a/ms/blueprintsprocessor/functions/restful-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restful/executor/RestfulCMComponentFunction.kt b/ms/blueprintsprocessor/functions/restful-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restful/executor/RestfulCMComponentFunction.kt
new file mode 100644 (file)
index 0000000..46fec31
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ *  Copyright © 2020 Huawei.
+ *
+ *  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.
+ */
+package org.onap.ccsdk.cds.blueprintsprocessor.functions.restful.executor
+
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
+import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractScriptComponentFunction
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintException
+import com.fasterxml.jackson.databind.JsonNode
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.databind.node.ObjectNode
+import com.fasterxml.jackson.databind.node.ArrayNode
+import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
+import org.onap.ccsdk.cds.blueprintsprocessor.rest.RestLibConstants
+import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.BluePrintRestLibPropertyService
+import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.BlueprintWebClientService
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.restful.executor.nrmfunction.RestfulNRMServiceClient
+import org.slf4j.LoggerFactory
+
+abstract class RestfulCMComponentFunction : AbstractScriptComponentFunction() {
+
+    private val log = LoggerFactory.getLogger(RestfulCMComponentFunction::class.java)
+    override suspend fun processNB(executionRequest: ExecutionServiceInput) {
+        throw BluePrintException("Not Implemented required")
+    }
+
+    override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: ExecutionServiceInput) {
+        throw BluePrintException("Not Implemented required")
+    }
+
+    open fun bluePrintRestLibPropertyService(): BluePrintRestLibPropertyService =
+            functionDependencyInstanceAsType(RestLibConstants.SERVICE_BLUEPRINT_REST_LIB_PROPERTY)
+
+    fun restClientService(clientInfo: JsonNode): BlueprintWebClientService {
+        return bluePrintRestLibPropertyService().blueprintWebClientService(clientInfo)
+    }
+
+    fun processNRM(executionRequest: ExecutionServiceInput, input_params: ArrayNode): String {
+        // process the managed object instances
+        log.info("Processing NRM Object")
+        operationInputs = executionServiceInput.stepData!!.properties
+        val dynamic_properties = operationInputs.get("dynamic-properties")
+        // instantiate one restClientService instance
+        val hostname = dynamic_properties?.get("hostname").toString().replace("\"", "")
+        val port = dynamic_properties?.get("port").toString().replace("\"", "")
+        val username = dynamic_properties?.get("username").toString().replace("\"", "")
+        val password = dynamic_properties?.get("password").toString().replace("\"", "")
+        val url = "http://" + hostname + ":" + port
+        val RestInfo: String = "{\n" +
+            " \"type\" : \"basic-auth\",\n" +
+            " \"url\" : \"" + url + "\",\n" +
+            " \"username\" : \"" + username + "\",\n" +
+            " \"password\" : \"" + password + "\"\n" +
+            "}"
+        val mapper = ObjectMapper()
+        val jsonRestInfo: JsonNode = mapper.readTree(RestInfo)
+        val web_client_service = restClientService(jsonRestInfo)
+        val managed_object_instances = input_params
+        var response = JacksonUtils.jsonNode("{}") as ObjectNode
+        // Invoke the corresponding function according to the workflowname
+        when (this.workflowName) {
+            "config-deploy" -> {
+                for (managed_object_instance in managed_object_instances) {
+                    // invoke createMOI for each managed-object-instance
+                    log.info("invoke createMOI for each managed-object-instance")
+                    var NRM_Restful_client = RestfulNRMServiceClient()
+                    val MOI_id = NRM_Restful_client.generateMOIid()
+                    var httpresponse = NRM_Restful_client.createMOI(web_client_service, MOI_id, managed_object_instance)
+                    var MOIname = managed_object_instance.get("className").toString().replace("\"", "")
+                    response.put("/$MOIname/$MOI_id", httpresponse)
+                }
+            }
+            "config-get" -> {
+                for (managed_object_instance in managed_object_instances) {
+                    // invoke getMOIAttributes for each managed-object-instance
+                    log.info("invoke getMOIAttributes for each managed-object-instance")
+                    var NRM_Restful_client = RestfulNRMServiceClient()
+                    val MOI_id = managed_object_instance.get("id").toString().replace("\"", "")
+                    var httpresponse = NRM_Restful_client.getMOIAttributes(web_client_service, MOI_id, managed_object_instance)
+                    var MOIname = managed_object_instance.get("className").toString().replace("\"", "")
+                    response.put("/$MOIname/$MOI_id", httpresponse)
+                }
+            }
+            "config-modify" -> {
+                for (managed_object_instance in managed_object_instances) {
+                    // invoke modifyMOIAttributes for each managed-object-instance
+                    log.info("invoke modifyMOIAttributes for each managed-object-instance")
+                    var NRM_Restful_client = RestfulNRMServiceClient()
+                    val MOI_id = managed_object_instance.get("id").toString().replace("\"", "")
+                    var httpresponse = NRM_Restful_client.modifyMOIAttributes(web_client_service, MOI_id, managed_object_instance)
+                    var MOIname = managed_object_instance.get("className").toString().replace("\"", "")
+                    response.put("/$MOIname/$MOI_id", httpresponse)
+                }
+            }
+            "config-delete" -> {
+                    for (managed_object_instance in managed_object_instances) {
+                    // invoke deleteMOI for each managed-object-instance
+                    log.info("invoke deleteMOI for each managed-object-instance")
+                    var NRM_Restful_client = RestfulNRMServiceClient()
+                    val MOI_id = managed_object_instance.get("id").toString().replace("\"", "")
+                    var httpresponse = NRM_Restful_client.deleteMOI(web_client_service, MOI_id, managed_object_instance)
+                    var MOIname = managed_object_instance.get("className").toString().replace("\"", "")
+                    response.put("/$MOIname/$MOI_id", httpresponse)
+                }
+            }
+            else -> {
+                print("not Implemented")
+                response.put(this.workflowName, "Not Implemented")
+            }
+        }
+        val strresponse = "$response"
+        return strresponse
+    }
+}
diff --git a/ms/blueprintsprocessor/functions/restful-executor/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/restful/executor/ComponentRestfulExecutorTest.kt b/ms/blueprintsprocessor/functions/restful-executor/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/restful/executor/ComponentRestfulExecutorTest.kt
new file mode 100644 (file)
index 0000000..ad70ac0
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Copyright © 2020 Huawei Intellectual Property.
+ *
+ * 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.
+ */
+
+package org.onap.ccsdk.cds.blueprintsprocessor.functions.restful.executor
+
+import com.fasterxml.jackson.databind.JsonNode
+import com.fasterxml.jackson.databind.node.ObjectNode
+import io.mockk.every
+import io.mockk.mockk
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ActionIdentifiers
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.CommonHeader
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.StepData
+import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.ComponentFunctionScriptingService
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
+import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive
+import org.onap.ccsdk.cds.controllerblueprints.core.data.Implementation
+import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintContext
+import org.onap.ccsdk.cds.controllerblueprints.core.service.DefaultBluePrintRuntimeService
+import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
+import org.springframework.context.ApplicationContext
+
+class ComponentRestfulExecutorTest {
+
+    @Test
+    fun testComponentRestfulExecutor() {
+        runBlocking {
+
+            val applicationContext = mockk<ApplicationContext>()
+            every { applicationContext.getBean(any()) } returns mockk()
+
+            val componentFunctionScriptingService = ComponentFunctionScriptingService(applicationContext, mockk())
+
+            val componentRestfulExecutor = ComponentRestfulExecutor(componentFunctionScriptingService)
+
+            val executionServiceInput = ExecutionServiceInput().apply {
+                commonHeader = CommonHeader().apply {
+                    requestId = "1234"
+                }
+                actionIdentifiers = ActionIdentifiers().apply {
+                    actionName = "config-deploy"
+                }
+                payload = JacksonUtils.jsonNode("{}") as ObjectNode
+            }
+
+            val blueprintContext = mockk<BluePrintContext>()
+            every {
+                blueprintContext.nodeTemplateOperationImplementation(
+                    any(), any(), any()
+                )
+            } returns Implementation()
+
+            val bluePrintRuntime = mockk<DefaultBluePrintRuntimeService>("1234")
+            every { bluePrintRuntime.bluePrintContext() } returns blueprintContext
+
+            componentRestfulExecutor.bluePrintRuntimeService = bluePrintRuntime
+            componentRestfulExecutor.stepName = "sample-step"
+
+            val operationInputs = hashMapOf<String, JsonNode>()
+            operationInputs[BluePrintConstants.PROPERTY_CURRENT_NODE_TEMPLATE] = "config-deploy-process".asJsonPrimitive()
+            operationInputs[BluePrintConstants.PROPERTY_CURRENT_INTERFACE] = "interfaceName".asJsonPrimitive()
+            operationInputs[BluePrintConstants.PROPERTY_CURRENT_OPERATION] = "operationName".asJsonPrimitive()
+            operationInputs["script-type"] = BluePrintConstants.SCRIPT_INTERNAL.asJsonPrimitive()
+            operationInputs["script-class-reference"] = "internal.scripts.TestRestfulConfigure".asJsonPrimitive()
+
+            val stepInputData = StepData().apply {
+                name = "call-config-deploy-process"
+                properties = operationInputs
+            }
+            executionServiceInput.stepData = stepInputData
+
+            every {
+                bluePrintRuntime.resolveNodeTemplateInterfaceOperationInputs(
+                    "config-deploy-process",
+                    "interfaceName", "operationName"
+                )
+            } returns operationInputs
+
+            val operationOutputs = hashMapOf<String, JsonNode>()
+            every {
+                bluePrintRuntime.resolveNodeTemplateInterfaceOperationOutputs(
+                    "config-deploy-process",
+                    "interfaceName", "operationName"
+                )
+            } returns operationOutputs
+
+            componentRestfulExecutor.applyNB(executionServiceInput)
+        }
+    }
+}
index d47889a..d1de108 100755 (executable)
             </dependency>
             <dependency>
                 <groupId>org.onap.ccsdk.cds.blueprintsprocessor.functions</groupId>
-                <artifactId>nrm-restful</artifactId>
+                <artifactId>restful-executor</artifactId>
                 <version>${ccsdk.cds.version}</version>
             </dependency>
             <dependency>