Merge "Add resource resolution component DSL"
diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponent.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponent.kt
index df7e048..875b9ae 100644
--- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponent.kt
+++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponent.kt
@@ -33,6 +33,23 @@
 @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
 open class ResourceResolutionComponent(private val resourceResolutionService: ResourceResolutionService) :
         AbstractComponentFunction() {
+    companion object{
+        const val INPUT_REQUEST_ID = "request-id"
+        const val INPUT_RESOURCE_ID = "resource-id"
+        const val INPUT_ACTION_NAME = "action-name"
+        const val INPUT_DYNAMIC_PROPERTIES = "dynamic-properties"
+        const val INPUT_RESOURCE_TYPE = "resource-type"
+        const val INPUT_ARTIFACT_PREFIX_NAMES = "artifact-prefix-names"
+        const val INPUT_RESOLUTION_KEY = "resolution-key"
+        const val INPUT_STORE_RESULT = "store-result"
+        const val INPUT_OCCURRENCE = "occurrence"
+
+        const val ATTRIBUTE_ASSIGNMENT_PARAM = "assignment-params"
+        const val ATTRIBUTE_STATUS = "status"
+
+        const val OUTPUT_RESOURCE_ASSIGNMENT_PARAMS = "resource-assignment-params"
+        const val OUTPUT_STATUS = "status"
+    }
 
     override suspend fun processNB(executionRequest: ExecutionServiceInput) {
 
diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentDSL.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentDSL.kt
new file mode 100644
index 0000000..c71541e
--- /dev/null
+++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentDSL.kt
@@ -0,0 +1,189 @@
+/*
+ *  Copyright © 2019 IBM.
+ *
+ *  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.resource.resolution
+
+import com.fasterxml.jackson.databind.JsonNode
+import org.onap.ccsdk.cds.controllerblueprints.core.*
+import org.onap.ccsdk.cds.controllerblueprints.core.data.NodeTemplate
+import org.onap.ccsdk.cds.controllerblueprints.core.data.NodeType
+import org.onap.ccsdk.cds.controllerblueprints.core.dsl.AbstractNodeTemplateImplBuilder
+import org.onap.ccsdk.cds.controllerblueprints.core.dsl.PropertiesAssignmentBuilder
+import org.onap.ccsdk.cds.controllerblueprints.core.dsl.nodeType
+
+/** Component Extensions **/
+fun BluePrintTypes.nodeTypeComponentResourceResolution(): NodeType {
+    return nodeType(id = "component-resource-resolution", version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+            derivedFrom = BluePrintConstants.MODEL_TYPE_NODE_COMPONENT,
+            description = "Resource Assignment Component") {
+
+        attribute(ResourceResolutionComponent.ATTRIBUTE_ASSIGNMENT_PARAM, BluePrintConstants.DATA_TYPE_STRING,
+                true)
+        attribute(ResourceResolutionComponent.ATTRIBUTE_STATUS, BluePrintConstants.DATA_TYPE_STRING,
+                true)
+
+        operation("ResourceResolutionComponent", "ResourceResolutionComponent Operation") {
+            inputs {
+                property(ResourceResolutionComponent.INPUT_REQUEST_ID, BluePrintConstants.DATA_TYPE_STRING,
+                        true, "Request Id, Unique Id for the request.")
+
+                property(ResourceResolutionComponent.INPUT_RESOURCE_ID, BluePrintConstants.DATA_TYPE_STRING,
+                        false, "Resource Id.")
+
+                property(ResourceResolutionComponent.INPUT_ACTION_NAME, BluePrintConstants.DATA_TYPE_STRING,
+                        false, "Action Name of the process")
+
+                property(ResourceResolutionComponent.INPUT_DYNAMIC_PROPERTIES, BluePrintConstants.DATA_TYPE_JSON,
+                        false, "Dynamic Json Content or DSL Json reference.")
+
+                property(ResourceResolutionComponent.INPUT_RESOLUTION_KEY, BluePrintConstants.DATA_TYPE_STRING,
+                        false, "Key for service instance related correlation.")
+
+                property(ResourceResolutionComponent.INPUT_OCCURRENCE, BluePrintConstants.DATA_TYPE_INTEGER,
+                        false, "Number of time to perform the resolution.") {
+                    defaultValue(1)
+                }
+
+                property(ResourceResolutionComponent.INPUT_STORE_RESULT, BluePrintConstants.DATA_TYPE_BOOLEAN,
+                        false, "Whether or not to store the output.")
+
+                property(ResourceResolutionComponent.INPUT_RESOURCE_TYPE, BluePrintConstants.DATA_TYPE_STRING,
+                        false, "Request type.")
+
+                property(ResourceResolutionComponent.INPUT_ARTIFACT_PREFIX_NAMES, BluePrintConstants.DATA_TYPE_LIST,
+                        true, "Template , Resource Assignment Artifact Prefix names") {
+                    entrySchema(BluePrintConstants.DATA_TYPE_STRING)
+                }
+            }
+            outputs {
+                property(ResourceResolutionComponent.OUTPUT_RESOURCE_ASSIGNMENT_PARAMS, BluePrintConstants.DATA_TYPE_STRING,
+                        true, "Output Response")
+                property(ResourceResolutionComponent.OUTPUT_STATUS, BluePrintConstants.DATA_TYPE_STRING,
+                        true, "Status of the Component Execution ( success or failure )")
+            }
+        }
+    }
+}
+
+/** Component Builder */
+fun BluePrintTypes.nodeTemplateComponentResourceResolution(id: String,
+                                                           description: String,
+                                                           block: ComponentResourceResolutionNodeTemplateImplBuilder.() -> Unit)
+        : NodeTemplate {
+    return ComponentResourceResolutionNodeTemplateImplBuilder(id, description).apply(block).build()
+}
+
+class ComponentResourceResolutionNodeTemplateImplBuilder(id: String, description: String) :
+        AbstractNodeTemplateImplBuilder<ComponentResourceResolutionInputAssignmentBuilder,
+                ComponentResourceResolutionOutputAssignmentBuilder>(id, "component-script-executor",
+                "ComponentResourceResolution",
+                description)
+
+class ComponentResourceResolutionInputAssignmentBuilder : PropertiesAssignmentBuilder() {
+
+    fun requestId(requestId: String) {
+        requestId(requestId.asJsonPrimitive())
+    }
+
+    fun requestId(requestId: JsonNode) {
+        property(ResourceResolutionComponent.INPUT_REQUEST_ID, requestId)
+    }
+
+    fun resourceId(resourceId: String) {
+        resourceId(resourceId.asJsonPrimitive())
+    }
+
+    fun resourceId(resourceId: JsonNode) {
+        property(ResourceResolutionComponent.INPUT_RESOURCE_ID, resourceId)
+    }
+
+    fun actionName(actionName: String) {
+        actionName(actionName.asJsonPrimitive())
+    }
+
+    fun actionName(actionName: JsonNode) {
+        property(ResourceResolutionComponent.INPUT_ACTION_NAME, actionName)
+    }
+
+    fun resolutionKey(resolutionKey: String) {
+        resolutionKey(resolutionKey.asJsonPrimitive())
+    }
+
+    fun resolutionKey(resolutionKey: JsonNode) {
+        property(ResourceResolutionComponent.INPUT_RESOLUTION_KEY, resolutionKey)
+    }
+
+    fun dynamicProperty(dynamicProperty: String) {
+        dynamicProperty(dynamicProperty.asJsonType())
+    }
+
+    fun dynamicProperty(dynamicProperty: JsonNode) {
+        property(ResourceResolutionComponent.INPUT_DYNAMIC_PROPERTIES, dynamicProperty)
+    }
+
+    fun occurrence(occurrence: Int) {
+        occurrence(occurrence.asJsonPrimitive())
+    }
+
+    fun occurrence(resolutionKey: JsonNode) {
+        property(ResourceResolutionComponent.INPUT_OCCURRENCE, resolutionKey)
+    }
+
+    fun storeResult(storeResult: Boolean) {
+        storeResult(storeResult.asJsonPrimitive())
+    }
+
+    fun storeResult(storeResult: JsonNode) {
+        property(ResourceResolutionComponent.INPUT_STORE_RESULT, storeResult)
+    }
+
+    fun resourceType(resourceType: String) {
+        resourceType(resourceType.asJsonPrimitive())
+    }
+
+    fun resourceType(resourceType: JsonNode) {
+        property(ResourceResolutionComponent.INPUT_RESOURCE_TYPE, resourceType)
+    }
+
+    fun artifactPrefixNames(artifactPrefixNames: String) = artifactPrefixNames(artifactPrefixNames.jsonAsJsonType())
+
+    fun artifactPrefixNames(artifactPrefixNameList: List<String>) {
+        artifactPrefixNames(artifactPrefixNameList.asJsonString())
+    }
+
+    fun artifactPrefixNames(artifactPrefixNames: JsonNode) {
+        property(ResourceResolutionComponent.INPUT_ARTIFACT_PREFIX_NAMES, artifactPrefixNames)
+    }
+}
+
+class ComponentResourceResolutionOutputAssignmentBuilder : PropertiesAssignmentBuilder() {
+
+    fun status(status: String) {
+        status(status.asJsonPrimitive())
+    }
+
+    fun status(status: JsonNode) {
+        property(ResourceResolutionComponent.OUTPUT_STATUS, status)
+    }
+
+    fun resourceAssignmentParams(resourceAssignmentParams: String) {
+        resourceAssignmentParams(resourceAssignmentParams.asJsonType())
+    }
+
+    fun resourceAssignmentParams(resourceAssignmentParams: JsonNode) {
+        property(ResourceResolutionComponent.OUTPUT_RESOURCE_ASSIGNMENT_PARAMS, resourceAssignmentParams)
+    }
+}
\ No newline at end of file
diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentDSLTest.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentDSLTest.kt
new file mode 100644
index 0000000..16052ae
--- /dev/null
+++ b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentDSLTest.kt
@@ -0,0 +1,60 @@
+/*
+ *  Copyright © 2019 IBM.
+ *
+ *  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.resource.resolution
+
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintTypes
+import org.onap.ccsdk.cds.controllerblueprints.core.dsl.getAttribute
+import kotlin.test.Test
+import kotlin.test.assertNotNull
+
+class ResourceResolutionComponentDSLTest {
+
+    @Test
+    fun testNodeTypeComponentResourceResolution() {
+        val nodeType = BluePrintTypes.nodeTypeComponentResourceResolution()
+        //println(nodeType.asJsonString(true))
+        assertNotNull(nodeType, "failed to generate nodeTypeComponentResourceResolution")
+    }
+
+    @Test
+    fun testNodeTemplateComponentResourceResolution() {
+        val nodeTemplate = BluePrintTypes.nodeTemplateComponentResourceResolution("resource-resolve", "") {
+            operation("Resolve resources") {
+                inputs {
+                    actionName("resolve")
+                    requestId("1234")
+                    resolutionKey("vnf-1234")
+                    occurrence(2)
+                    resourceType("vnf")
+                    storeResult(false)
+                    artifactPrefixNames(arrayListOf("template1", "template2"))
+                    dynamicProperty("""{
+                        "prop1" : "1234",
+                        "prop2" : true,
+                        "prop3" : 23
+                    }""".trimIndent())
+                }
+                outputs {
+                    resourceAssignmentParams(getAttribute("assignment-params"))
+                    status("success")
+                }
+            }
+        }
+        //println(nodeTemplate.asJsonString(true))
+        assertNotNull(nodeTemplate, "failed to generate nodeTemplateComponentResourceResolution")
+    }
+}
\ No newline at end of file