diff options
37 files changed, 200 insertions, 289 deletions
diff --git a/cds-ui/client/pom.xml b/cds-ui/client/pom.xml index 86504b7ea..ed0087d7d 100644 --- a/cds-ui/client/pom.xml +++ b/cds-ui/client/pom.xml @@ -50,8 +50,8 @@ limitations under the License. <version>1.3</version> <configuration> <nodeVersion>v8.12.0</nodeVersion> + <npmVersion>6.4.1</npmVersion> <nodeDownloadRoot>https://nodejs.org/dist/</nodeDownloadRoot> - <npmDownloadRoot>https://nodejs.org/dist/npm/</npmDownloadRoot> <installDirectory>./</installDirectory> </configuration> <executions> diff --git a/cds-ui/client/src/app/feature-modules/blueprint/select-template/template-options/template-options.component.html b/cds-ui/client/src/app/feature-modules/blueprint/select-template/template-options/template-options.component.html index 57ff00df5..1e8f469b6 100644 --- a/cds-ui/client/src/app/feature-modules/blueprint/select-template/template-options/template-options.component.html +++ b/cds-ui/client/src/app/feature-modules/blueprint/select-template/template-options/template-options.component.html @@ -19,7 +19,7 @@ limitations under the License. ============LICENSE_END============================================ --> <mat-radio-group> - <mat-radio-button value="1" (click)="selected(1)">Upload Template file</mat-radio-button><br> <br> - <mat-radio-button value="2" (click)="selected(2)">Starter Template</mat-radio-button><br> <br> - <mat-radio-button value="3" (click)="selected(3)">Existing Model File</mat-radio-button> + <mat-radio-button value="1" (click)="selected(1)">Upload From local</mat-radio-button><br> <br> + <mat-radio-button value="2" (click)="selected(2)">Existing Template File</mat-radio-button><br> <br> + <mat-radio-button value="3" (click)="selected(3)">Create New</mat-radio-button> </mat-radio-group>
\ No newline at end of file diff --git a/cds-ui/pom.xml b/cds-ui/pom.xml index e4c545e27..a22dd4328 100644 --- a/cds-ui/pom.xml +++ b/cds-ui/pom.xml @@ -24,7 +24,7 @@ limitations under the License. <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>1.3.0-SNAPSHOT</version> + <version>1.3.1-SNAPSHOT</version> <relativePath/> </parent> diff --git a/cds-ui/server/package.json b/cds-ui/server/package.json index 2f33abae7..8abadb15b 100644 --- a/cds-ui/server/package.json +++ b/cds-ui/server/package.json @@ -30,7 +30,7 @@ "prestart": "npm run build", "start": "node .", "prepublishOnly": "npm run test", - "copy:proto": "mkdir -p dist; cp -R target/generated/proto-definition/proto/ dist/proto" + "copy:proto": "mkdir -p dist && cp -R target/generated/proto-definition/proto/ dist/proto" }, "repository": { "type": "git" diff --git a/cds-ui/server/pom.xml b/cds-ui/server/pom.xml index 8d758c710..d0fc42190 100644 --- a/cds-ui/server/pom.xml +++ b/cds-ui/server/pom.xml @@ -80,8 +80,8 @@ limitations under the License. <version>1.3</version> <configuration> <nodeVersion>v8.12.0</nodeVersion> + <npmVersion>6.4.1</npmVersion> <nodeDownloadRoot>https://nodejs.org/dist/</nodeDownloadRoot> - <npmDownloadRoot>https://nodejs.org/dist/npm/</npmDownloadRoot> <installDirectory>./</installDirectory> </configuration> <executions> diff --git a/docs/bluePrintsProcessorMS.rst b/docs/bluePrintsProcessorMS.rst deleted file mode 100644 index 3f308138f..000000000 --- a/docs/bluePrintsProcessorMS.rst +++ /dev/null @@ -1,73 +0,0 @@ -.. This work is licensed under a Creative Commons Attribution 4.0 International License. -.. http://creativecommons. -.. Copyright (C) 2019 IBM. - -Blueprints Processor -==================== - -.. toctree:: - :maxdepth: 1 - :titlesonly: - -Micro service to Manage Controller Blueprint Models, such as Resource Dictionary, Service Models, Velocity Templates etc, which will serve service for Controller Design Studio and Controller runtimes. - -This microservice is used to deploy Controller Blueprint Archive file in Run time database. This also helps to test the Valid Blueprint. - -Architecture: -------------- - -|image0| - -.. |image0| image:: images/blueprintprocessor.jpg - :height: 600px - :width: 800px - -Running Blueprints Processor Microservice Locally: --------------------------------------------------- - -The purpose of this page is to show how to run the Blueprints Processor microservice locally, using the docker-compose.yaml file provided in the project. - -Check out the CDS' code: - -Check out the latest code from Gerrit: https://gerrit.onap.org/r/#/admin/projects/ccsdk/cds - -Build CDS locally: -In the checked out directory, type - - mvn clean install -DskipTests=true -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Dadditionalparam=-Xdoclint:none - -Create the needed Docker images: - -The Blueprints Processor microservice project has a module, called distribution, that provides a docker-compose.yaml file that can be used to spin up Docker containers to run this microservice. - -The first step is to create any custom image needed, by building the distribution module. From the CDS home directory (where the code was checked out), navigate to the module: - - cd ms/blueprintsprocessor/distribution/ -Build it using the Maven profile called Docker: - - mvn clean install -Pdocker - -Start Docker containers using docker-composer: ----------------------------------------------- - -Navigate to the docker-compose file in the distribution module: - - cd src/main/dc/ - -From there, start the containers: - - docker-compose up -d -This will spin the Docker containers declared inside the docker-compose.yaml file in the background. - - -To verify the logs generated by docker-composer, type: - - docker-compose logs -f - - -Testing the environment: ------------------------- - -Point your browser to http://localhost:8000/api/v1/execution-service/ping (please note that the port is 8000, not 8080) - -To authenticate, use ccsdkapps / ccsdkapps as login / password.
\ No newline at end of file diff --git a/docs/controllerBlueprintStudioProcessorMS.rst b/docs/controllerBlueprintStudioProcessorMS.rst deleted file mode 100644 index 6f3152d20..000000000 --- a/docs/controllerBlueprintStudioProcessorMS.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. This work is licensed under a Creative Commons Attribution 4.0 International License. -.. http://creativecommons. -.. Copyright (C) 2019 IBM. - -Controller Blueprints Studio Processor -====================================== - -The Controller Blueprint Archive is the overall service design, fully model-driven, intent based package needed for SELF SERVICE provisioning and configuration management automation. - -The CBA is .zip file which is saved in Controller Blueprint Database. - -Dynamic API: ------------- - -The nature of the API request and response is meant to be model driven and dynamic. They both share the same definition. - -The actionName, under the actionIdentifiers refers to the name of a Workflow (see workflow) - -The content of the payload is what is fully dynamic / model driven. - -The first top level element will always be either $actionName-request for a request or $actionName-response for a response. - -Then the content within this element is fully based on the workflow input and output. - - -Enrichment: ------------ - -Helps to generate complete valid CBA file. - - -
\ No newline at end of file diff --git a/docs/datadictionary/index.rst b/docs/datadictionary/index.rst index 88122b49f..0d87158d9 100644 --- a/docs/datadictionary/index.rst +++ b/docs/datadictionary/index.rst @@ -61,10 +61,10 @@ Also please click below for resource source available details .. _Resource: https://wiki.onap.org/display/DW/Modeling+Concepts#ModelingConcepts-NodeResourceSource -.. |image0| image:: media/image0.jpg +.. |image0| image:: media/mandatory.jpg :width: 7.88889in :height: 4.43750in -.. |image1| image:: media/image1.jpg +.. |image1| image:: media/optional.jpg :width: 7.88889in :height: 4.43750in
\ No newline at end of file diff --git a/docs/datadictionary/media/image0.JPG b/docs/datadictionary/media/mandatory.JPG Binary files differindex 074d20076..074d20076 100644 --- a/docs/datadictionary/media/image0.JPG +++ b/docs/datadictionary/media/mandatory.JPG diff --git a/docs/datadictionary/media/image1.JPG b/docs/datadictionary/media/optional.JPG Binary files differindex a27502a75..a27502a75 100644 --- a/docs/datadictionary/media/image1.JPG +++ b/docs/datadictionary/media/optional.JPG diff --git a/docs/datadictionary/resourcesource.rst b/docs/datadictionary/resourcesource.rst index 1bc0de4f1..1a69fd63f 100644 --- a/docs/datadictionary/resourcesource.rst +++ b/docs/datadictionary/resourcesource.rst @@ -11,12 +11,10 @@ Expects the value to be provided as input to the request. source-input: -{ "description": "This is Input Resource Source Node Type", "version": "1.0.0", "properties": {}, "derived_from": "tosca.nodes.ResourceSource" -} Default: @@ -25,12 +23,11 @@ Expects the value to be defaulted in the model itself. source-default: -{ "description": "This is Default Resource Source Node Type", "version": "1.0.0", "properties": {}, "derived_from": "tosca.nodes.ResourceSource" -} + sql: @@ -42,7 +39,7 @@ CDS is currently deployed along the side of SDNC, hence the primary database con |image0| -.. |image0| image:: sqltable.jpg +.. |image0| image:: media/sqltable.jpg :width: 7.88889in :height: 4.43750in @@ -68,7 +65,7 @@ CDS is currently deployed along the side of SDNC, hence the default rest connect |image1| -.. |image1| image:: resttable.jpg +.. |image1| image:: media/resttable.jpg :width: 7.88889in :height: 4.43750in @@ -99,7 +96,7 @@ Expects a script to be provided. |image2| -.. |image2| image:: capabilitytable.jpg +.. |image2| image:: media/capabilitytable.jpg :width: 7.88889in :height: 4.43750in diff --git a/docs/microservices/enrichment.rst b/docs/microservices/enrichment.rst new file mode 100644 index 000000000..55984d77c --- /dev/null +++ b/docs/microservices/enrichment.rst @@ -0,0 +1,36 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 +.. International License. http://creativecommons.org/licenses/by/4.0 +.. Copyright (C) 2019 IBM. + + +Enrichment +========== +.. toctree:: + :maxdepth: 1 + +Once the base CBA zip file is done, the enrichment process will complete the design by providing all the definitions required for the self-service provisioning. + +The following shows 2 ways to run CBA enrichment + +*REST API request + +|image0| + +*CDS UI + +|image1| + + +|image2| + +.. |image0| image:: media/Enrichment-REST.png + :width: 7.88889in + :height: 4.43750in + +.. |image1| image:: media/Enrichment-UI1.png + :width: 7.88889in + :height: 4.43750in + +.. |image2| image:: media/Enrichment-UI2.png + :width: 7.88889in + :height: 4.43750in
\ No newline at end of file diff --git a/docs/microservices/media/Enrichment-REST.png b/docs/microservices/media/Enrichment-REST.png Binary files differnew file mode 100644 index 000000000..005f7960b --- /dev/null +++ b/docs/microservices/media/Enrichment-REST.png diff --git a/docs/microservices/media/Enrichment-UI1.png b/docs/microservices/media/Enrichment-UI1.png Binary files differnew file mode 100644 index 000000000..62b870cab --- /dev/null +++ b/docs/microservices/media/Enrichment-UI1.png diff --git a/docs/microservices/media/Enrichment-UI2.png b/docs/microservices/media/Enrichment-UI2.png Binary files differnew file mode 100644 index 000000000..44497050a --- /dev/null +++ b/docs/microservices/media/Enrichment-UI2.png diff --git a/ms/blueprintsprocessor/application/pom.xml b/ms/blueprintsprocessor/application/pom.xml index a9552510d..e4129932b 100755 --- a/ms/blueprintsprocessor/application/pom.xml +++ b/ms/blueprintsprocessor/application/pom.xml @@ -17,8 +17,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.onap.ccsdk.cds.blueprintsprocessor</groupId> diff --git a/ms/blueprintsprocessor/application/src/main/java/org/onap/ccsdk/cds/blueprintsprocessor/BlueprintGRPCServer.java b/ms/blueprintsprocessor/application/src/main/java/org/onap/ccsdk/cds/blueprintsprocessor/BlueprintGRPCServer.java index 16eb4182e..6bb6a2697 100644 --- a/ms/blueprintsprocessor/application/src/main/java/org/onap/ccsdk/cds/blueprintsprocessor/BlueprintGRPCServer.java +++ b/ms/blueprintsprocessor/application/src/main/java/org/onap/ccsdk/cds/blueprintsprocessor/BlueprintGRPCServer.java @@ -61,7 +61,7 @@ public class BlueprintGRPCServer implements ApplicationListener<ContextRefreshed log.info("Blueprint Processor GRPC server started and ready to serve on port({})...", server.getPort()); server.awaitTermination(); } catch (Exception e) { - e.printStackTrace(); + log.error("*** Error ***", e); } } } diff --git a/ms/blueprintsprocessor/functions/python-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/python/executor/ComponentRemotePythonExecutor.kt b/ms/blueprintsprocessor/functions/python-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/python/executor/ComponentRemotePythonExecutor.kt index c45fb881f..fa5d882b0 100644 --- a/ms/blueprintsprocessor/functions/python-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/python/executor/ComponentRemotePythonExecutor.kt +++ b/ms/blueprintsprocessor/functions/python-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/python/executor/ComponentRemotePythonExecutor.kt @@ -79,16 +79,8 @@ open class ComponentRemotePythonExecutor(private val remoteScriptExecutionServic val argsNode = getOptionalOperationInput(INPUT_ARGUMENT_PROPERTIES)?.returnNullIfMissing() // This prevents unescaping values, as well as quoting the each parameter, in order to allow for spaces in values - var args = "" - argsNode?.fields()?.forEach { - if (it.value.isValueNode) { - args = "$args ${it.value}" - } else { - it.value.fields().forEach { item -> - args = "$args ${item.value}" - } - } - } + val args = getOptionalOperationInput(INPUT_ARGUMENT_PROPERTIES)?.returnNullIfMissing() + ?.rootFieldsToMap()?.toSortedMap()?.values?.joinToString(" ") { formatNestedJsonNode(it) } val command = getOperationInput(INPUT_COMMAND).asText() var scriptCommand = command.replace(pythonScript.name, pythonScript.absolutePath) @@ -141,4 +133,14 @@ open class ComponentRemotePythonExecutor(private val remoteScriptExecutionServic bluePrintRuntimeService.getBluePrintError() .addError("Failed in ComponentJythonExecutor : ${runtimeException.message}") } + + private fun formatNestedJsonNode(node: JsonNode): String { + val sb = StringBuilder() + if (node.isValueNode) { + sb.append(" $node") + } else { + node.forEach { sb.append(" $it") } + } + return sb.toString() + } } 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 b38ebb1b0..df7e0482c 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 @@ -51,6 +51,9 @@ open class ResourceResolutionComponent(private val resourceResolutionService: Re properties[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE] = occurrence val jsonResponse = JsonNodeFactory.instance.objectNode() + // Initialize Output Attribute to empty JSON + bluePrintRuntimeService.setNodeTemplateAttributeValue(nodeTemplateName, + ResourceResolutionConstants.OUTPUT_ASSIGNMENT_PARAMS, jsonResponse) // validate inputs if we need to store the resource and template resolution. if (storeResult) { @@ -84,7 +87,7 @@ open class ResourceResolutionComponent(private val resourceResolutionService: Re } - // Set Output Attributes + // Set Output Attributes with resolved value bluePrintRuntimeService.setNodeTemplateAttributeValue(nodeTemplateName, ResourceResolutionConstants.OUTPUT_ASSIGNMENT_PARAMS, jsonResponse) } diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentTest.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentTest.kt index 560bc4142..b63fa6798 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentTest.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentTest.kt @@ -71,6 +71,8 @@ class ResourceResolutionComponentTest { resourceResolutionComponent.stepName = "step" resourceResolutionComponent.interfaceName = "interfaceName" resourceResolutionComponent.operationName = "operationName" + + every { bluePrintRuntimeService.setNodeTemplateAttributeValue(any(), any(), any()) } returns Unit } @Test @@ -139,7 +141,6 @@ class ResourceResolutionComponentTest { any<List<String>>(), any<MutableMap<String, Any>>()) } returns mutableMapOf() - every { bluePrintRuntimeService.setNodeTemplateAttributeValue(any(), any(), any()) } returns Unit runBlocking { diff --git a/ms/blueprintsprocessor/modules/commons/message-lib/pom.xml b/ms/blueprintsprocessor/modules/commons/message-lib/pom.xml index d423dfd06..65d1474f3 100644 --- a/ms/blueprintsprocessor/modules/commons/message-lib/pom.xml +++ b/ms/blueprintsprocessor/modules/commons/message-lib/pom.xml @@ -14,10 +14,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>commons</artifactId> <groupId>org.onap.ccsdk.cds.blueprintsprocessor</groupId> @@ -47,4 +44,4 @@ <scope>test</scope> </dependency> </dependencies> -</project>
\ No newline at end of file +</project> diff --git a/ms/blueprintsprocessor/modules/commons/ssh-lib/pom.xml b/ms/blueprintsprocessor/modules/commons/ssh-lib/pom.xml index 6949c4f43..1ba04033d 100644 --- a/ms/blueprintsprocessor/modules/commons/ssh-lib/pom.xml +++ b/ms/blueprintsprocessor/modules/commons/ssh-lib/pom.xml @@ -14,10 +14,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>commons</artifactId> <groupId>org.onap.ccsdk.cds.blueprintsprocessor</groupId> @@ -43,4 +40,4 @@ <artifactId>sshd-core</artifactId> </dependency> </dependencies> -</project>
\ No newline at end of file +</project> diff --git a/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/BlueprintPythonHost.kt b/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/BlueprintPythonHost.kt index 600308959..78b7556f3 100644 --- a/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/BlueprintPythonHost.kt +++ b/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/BlueprintPythonHost.kt @@ -15,6 +15,7 @@ */ package org.onap.ccsdk.cds.blueprintsprocessor.services.execution.scripts +import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException import org.python.core.PyObject import org.python.util.PythonInterpreter @@ -38,9 +39,12 @@ open class BlueprintPythonHost(private val bluePrintPython: BluePrintPython){ bluePrintPython.content = content!! bluePrintPython.pythonClassName = interfaceName bluePrintPython.moduleName = "Blueprint Python Script [Class Name = $interfaceName]" - - return blueprintPythonInterpreterProxy.getPythonInstance(properties) + try { + return blueprintPythonInterpreterProxy.getPythonInstance(properties) + } catch (e: Exception) { + throw BluePrintProcessorException("Failed to execute Jython component ${e.toString()}", e) + } } //TODO Check potential errors in python scripts -}
\ No newline at end of file +} diff --git a/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/BlueprintPythonInterpreterProxy.kt b/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/BlueprintPythonInterpreterProxy.kt index 8998337c9..6e514de49 100644 --- a/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/BlueprintPythonInterpreterProxy.kt +++ b/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/scripts/BlueprintPythonInterpreterProxy.kt @@ -15,12 +15,14 @@ */ package org.onap.ccsdk.cds.blueprintsprocessor.services.execution.scripts +import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException import org.python.core.PyObject +import org.python.core.PySyntaxError import org.python.util.PythonInterpreter -open class BlueprintPythonInterpreterProxy(private val bluePrintPython: BluePrintPython): PythonInterpreter(){ +open class BlueprintPythonInterpreterProxy(private val bluePrintPython: BluePrintPython) : PythonInterpreter() { - fun getPythonInstance(properties: MutableMap<String, Any>?): PyObject{ + fun getPythonInstance(properties: MutableMap<String, Any>?): PyObject { properties?.forEach { (name, value) -> this.set(name, value) } @@ -28,13 +30,17 @@ open class BlueprintPythonInterpreterProxy(private val bluePrintPython: BluePrin this.exec("import sys") bluePrintPython.content.let { - this.exec(bluePrintPython.content) + try { + this.exec(bluePrintPython.content) + } catch (e: PySyntaxError) { + throw BluePrintProcessorException("Error executing Jython code! Python error: '${e.toString()}'", e) + } } val initCommand = bluePrintPython.pythonClassName.plus(" = ").plus( - bluePrintPython.pythonClassName).plus("()") + bluePrintPython.pythonClassName).plus("()") this.exec(initCommand) return this.get(bluePrintPython.pythonClassName) } -}
\ No newline at end of file +} diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BluePrintWorkflowExecutionServiceImpl.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BluePrintWorkflowExecutionServiceImpl.kt index 8ae128d4b..fcf0558c7 100644 --- a/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BluePrintWorkflowExecutionServiceImpl.kt +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BluePrintWorkflowExecutionServiceImpl.kt @@ -44,6 +44,10 @@ open class BluePrintWorkflowExecutionServiceImpl( val workflowName = executionServiceInput.actionIdentifiers.actionName // Assign Workflow inputs + //check if request structure exists + if (!executionServiceInput.payload.has("$workflowName-request")) { + throw BluePrintProcessorException("Input request missing the expected '$workflowName-request' block!") + } val input = executionServiceInput.payload.get("$workflowName-request") bluePrintRuntimeService.assignWorkflowInputs(workflowName, input) @@ -80,4 +84,4 @@ open class BluePrintWorkflowExecutionServiceImpl( return executionServiceOutput } -}
\ No newline at end of file +} diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BluePrintWorkflowExecutionServiceImplTest.kt b/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BluePrintWorkflowExecutionServiceImplTest.kt index 59be9406e..c15c054db 100644 --- a/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BluePrintWorkflowExecutionServiceImplTest.kt +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/workflow/BluePrintWorkflowExecutionServiceImplTest.kt @@ -22,6 +22,7 @@ import org.junit.runner.RunWith import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceOutput import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants +import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BluePrintWorkflowExecutionService import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintMetadataUtils import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils @@ -29,6 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.test.context.ContextConfiguration import org.springframework.test.context.junit4.SpringRunner import kotlin.test.assertEquals +import kotlin.test.assertFailsWith import kotlin.test.assertNotNull @@ -43,18 +45,33 @@ class BluePrintWorkflowExecutionServiceImplTest { fun testBluePrintWorkflowExecutionService() { runBlocking { val bluePrintRuntimeService = BluePrintMetadataUtils.getBluePrintRuntime("1234", - "./../../../../../components/model-catalog/blueprint-model/test-blueprint/baseconfiguration") + "./../../../../../components/model-catalog/blueprint-model/test-blueprint/baseconfiguration") val executionServiceInput = JacksonUtils.readValueFromClassPathFile("execution-input/resource-assignment-input.json", - ExecutionServiceInput::class.java)!! - + ExecutionServiceInput::class.java)!! val executionServiceOutput = bluePrintWorkflowExecutionService - .executeBluePrintWorkflow(bluePrintRuntimeService, executionServiceInput, hashMapOf()) + .executeBluePrintWorkflow(bluePrintRuntimeService, executionServiceInput, hashMapOf()) assertNotNull(executionServiceOutput, "failed to get response") assertEquals(BluePrintConstants.STATUS_SUCCESS, executionServiceOutput.status.message, - "failed to get successful response") + "failed to get successful response") + } + } + + @Test + fun `Blueprint fails on missing workflowName-parameters with a useful message`() { + assertFailsWith(exceptionClass = BluePrintProcessorException::class) { + runBlocking { + val bluePrintRuntimeService = BluePrintMetadataUtils.getBluePrintRuntime("1234", + "./../../../../../components/model-catalog/blueprint-model/test-blueprint/baseconfiguration") + //service input will have a mislabeled input params, we are expecting to get an error when that happens with a useful error message + val executionServiceInput = JacksonUtils.readValueFromClassPathFile("execution-input/resource-assignment-input-missing-resource_assignment_request.json", + ExecutionServiceInput::class.java)!! + + val executionServiceOutput = bluePrintWorkflowExecutionService + .executeBluePrintWorkflow(bluePrintRuntimeService, executionServiceInput, hashMapOf()) + } } } diff --git a/ms/blueprintsprocessor/modules/services/workflow-service/src/test/resources/execution-input/resource-assignment-input-missing-resource_assignment_request.json b/ms/blueprintsprocessor/modules/services/workflow-service/src/test/resources/execution-input/resource-assignment-input-missing-resource_assignment_request.json new file mode 100644 index 000000000..a44e171a3 --- /dev/null +++ b/ms/blueprintsprocessor/modules/services/workflow-service/src/test/resources/execution-input/resource-assignment-input-missing-resource_assignment_request.json @@ -0,0 +1,23 @@ +{ + "commonHeader": { + "originatorId": "System", + "requestId": "1234", + "subRequestId": "1234-12234" + }, + "actionIdentifiers": { + "blueprintName": "baseconfiguration", + "blueprintVersion": "1.0.0", + "actionName": "resource-assignment", + "mode": "sync" + }, + "payload": { + "resource-assignment-mislabeled-request": { + "resource-assignment-properties": { + "request-id": "1234", + "action-name": "resource-assignment", + "scope-type": "vnf-type", + "hostname": "localhost" + } + } + } +} diff --git a/ms/blueprintsprocessor/parent/pom.xml b/ms/blueprintsprocessor/parent/pom.xml index dc689ece0..4d05550ef 100755 --- a/ms/blueprintsprocessor/parent/pom.xml +++ b/ms/blueprintsprocessor/parent/pom.xml @@ -14,8 +14,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.onap.ccsdk.cds</groupId> diff --git a/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/cds/controllerblueprints/filters/ApplicationLoggingFilter.java b/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/cds/controllerblueprints/filters/ApplicationLoggingFilter.java deleted file mode 100644 index 60837e8a7..000000000 --- a/ms/controllerblueprints/application/src/main/java/org/onap/ccsdk/cds/controllerblueprints/filters/ApplicationLoggingFilter.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright © 2017-2018 AT&T Intellectual Property. - * Modifications Copyright © 2018 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.controllerblueprints.filters; - -import com.google.common.base.Preconditions; -import org.apache.commons.lang3.StringUtils; -import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpHeaders; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.web.server.ServerWebExchange; -import org.springframework.web.server.WebFilter; -import org.springframework.web.server.WebFilterChain; -import reactor.core.publisher.Mono; - -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.UUID; - -/** - * ApplicationLoggingFilter - * - * @author Brinda Santh 8/14/2018 - */ -@Configuration -@SuppressWarnings("unused") -public class ApplicationLoggingFilter implements WebFilter { - private static Logger log = LoggerFactory.getLogger(ApplicationLoggingFilter.class); - - @SuppressWarnings("unused") - @Value("${appVersion}") - private String appVersion; - - @Override - public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) { - try { - - ServerHttpRequest request = serverWebExchange.getRequest(); - ServerHttpResponse response = serverWebExchange.getResponse(); - - String[] tokens = StringUtils.split(appVersion, '.'); - Preconditions.checkNotNull(tokens, "failed to split application versions"); - Preconditions.checkArgument(tokens.length == 3, "failed to tokenize application versions"); - HttpHeaders header = response.getHeaders(); - - String requestID = defaultToUUID(request.getHeaders().getFirst("X-ONAP-RequestID")); - String invocationID = defaultToUUID(request.getHeaders().getFirst("X-ONAP-InvocationID")); - String partnerName = defaultToEmpty(request.getHeaders().getFirst("X-ONAP-PartnerName")); - MDC.put("InvokeTimestamp", ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT)); - MDC.put("RequestID", requestID); - MDC.put("InvocationID", invocationID); - MDC.put("PartnerName", partnerName); - MDC.put("ClientIPAddress", defaultToEmpty(request.getRemoteAddress().getAddress())); - MDC.put("ServerFQDN", defaultToEmpty(request.getRemoteAddress().getHostString())); - - header.add(BluePrintConstants.RESPONSE_HEADER_TRANSACTION_ID, requestID); - header.add(BluePrintConstants.RESPONSE_HEADER_MINOR_VERSION, tokens[1]); - header.add(BluePrintConstants.RESPONSE_HEADER_PATCH_VERSION, tokens[2]); - header.add(BluePrintConstants.RESPONSE_HEADER_LATEST_VERSION, appVersion); - } catch (Exception e) { - e.printStackTrace(); - } - - return webFilterChain.filter(serverWebExchange); - - } - - private static String defaultToUUID(String in) { - return in == null ? UUID.randomUUID().toString() : in; - } - - private static String defaultToEmpty(Object in) { - return in == null ? "" : in.toString(); - } - - -}
\ No newline at end of file diff --git a/ms/controllerblueprints/modules/blueprint-core/pom.xml b/ms/controllerblueprints/modules/blueprint-core/pom.xml index d0710b238..f18821e2c 100644 --- a/ms/controllerblueprints/modules/blueprint-core/pom.xml +++ b/ms/controllerblueprints/modules/blueprint-core/pom.xml @@ -15,8 +15,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.onap.ccsdk.cds.controllerblueprints</groupId> diff --git a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt index efdefd040..cea18ef9b 100644 --- a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt +++ b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt @@ -168,7 +168,7 @@ fun <T : JsonNode> T?.isNotNull(): Boolean { */ fun JsonNode.rootFieldsToMap(): MutableMap<String, JsonNode> { if (this is ObjectNode) { - val propertyMap: MutableMap<String, JsonNode> = hashMapOf() + val propertyMap: MutableMap<String, JsonNode> = linkedMapOf() this.fields().forEach { propertyMap[it.key] = it.value } diff --git a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintRuntimeService.kt b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintRuntimeService.kt index a7ed72dfa..e6f3f71ca 100644 --- a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintRuntimeService.kt +++ b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintRuntimeService.kt @@ -382,7 +382,7 @@ open class DefaultBluePrintRuntimeService(private var id: String, private var bl val nodeTemplate = bluePrintContext.nodeTemplateByName(nodeTemplateName) return nodeTemplate.artifacts?.get(artifactName) - ?: throw BluePrintProcessorException("failed to get artifat definition($artifactName) from the node " + + ?: throw BluePrintProcessorException("failed to get artifact definition($artifactName) from the node " + "template") } diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/cds/controllerblueprints/service/common/SwaggerGenerator.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/cds/controllerblueprints/service/common/SwaggerGenerator.java index abf774981..38216a616 100644 --- a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/cds/controllerblueprints/service/common/SwaggerGenerator.java +++ b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/cds/controllerblueprints/service/common/SwaggerGenerator.java @@ -155,19 +155,16 @@ public class SwaggerGenerator { defProperty = new StringProperty(); } } else if (BluePrintTypes.validCollectionTypes().contains(propertyDefinition.getType())) { - ArrayProperty arrayProperty = new ArrayProperty(); + Optional<Property> innerType = Optional.empty(); if (propertyDefinition.getEntrySchema() != null) { String entrySchema = propertyDefinition.getEntrySchema().getType(); if (!BluePrintTypes.validPrimitiveTypes().contains(entrySchema)) { - Property innerType = new RefProperty("#/definitions/" + entrySchema); - arrayProperty.setItems(innerType); - } else { - Property innerType = new StringProperty(); - arrayProperty.setItems(innerType); + innerType = Optional.of(new RefProperty("#/definitions/" + entrySchema)); } - defProperty = arrayProperty; } - + ArrayProperty arrayProperty = new ArrayProperty(); + arrayProperty.setItems(innerType.orElseGet(StringProperty::new)); + defProperty = arrayProperty; } else { defProperty = new RefProperty("#/definitions/" + propertyDefinition.getType()); } diff --git a/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/service/ListenerServiceImpl.java b/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/service/ListenerServiceImpl.java index 148d0c028..77f3ea536 100644 --- a/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/service/ListenerServiceImpl.java +++ b/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/service/ListenerServiceImpl.java @@ -119,7 +119,9 @@ public class ListenerServiceImpl implements ListenerService { File targetZipFile = new File(targetLocation.toString()); try { - targetZipFile.createNewFile(); + if (! targetZipFile.createNewFile()) { + LOGGER.warn("Overwriting zip file {}", targetLocation); + } } catch (IOException e) { LOGGER.error("Could not able to create file {}", targetZipFile, e); } diff --git a/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/status/ComponentStatusMessage.java b/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/status/ComponentStatusMessage.java index 7a959692a..4f31003b0 100644 --- a/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/status/ComponentStatusMessage.java +++ b/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/status/ComponentStatusMessage.java @@ -21,17 +21,17 @@ import org.onap.sdc.utils.DistributionStatusEnum; public class ComponentStatusMessage implements IComponentDoneStatusMessage, IDistributionStatusMessage { - public String componentName; + private String componentName; - public String consumerID; + private String consumerID; - public String distributionID; + private String distributionID; - public DistributionStatusEnum status; + private DistributionStatusEnum status; - public long timeStamp; + private long timeStamp; - public String artifactUrl; + private String artifactUrl; @Override public String getDistributionID() { @@ -55,11 +55,43 @@ public class ComponentStatusMessage implements IComponentDoneStatusMessage, IDi @Override public String getArtifactURL() { - return artifactUrl; + return getArtifactUrl(); } @Override public long getTimestamp() { + return getTimeStamp(); + } + + public void setComponentName(String componentName) { + this.componentName = componentName; + } + + public void setConsumerID(String consumerID) { + this.consumerID = consumerID; + } + + public void setDistributionID(String distributionID) { + this.distributionID = distributionID; + } + + public void setStatus(DistributionStatusEnum status) { + this.status = status; + } + + public long getTimeStamp() { return timeStamp; } + + public void setTimeStamp(long timeStamp) { + this.timeStamp = timeStamp; + } + + public String getArtifactUrl() { + return artifactUrl; + } + + public void setArtifactUrl(String artifactUrl) { + this.artifactUrl = artifactUrl; + } } diff --git a/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/status/SdcListenerStatus.java b/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/status/SdcListenerStatus.java index 446fdc068..a8e60c29a 100644 --- a/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/status/SdcListenerStatus.java +++ b/ms/sdclistener/application/src/main/java/org/onap/ccsdk/cds/sdclistener/status/SdcListenerStatus.java @@ -93,12 +93,12 @@ public class SdcListenerStatus { private ComponentStatusMessage buildStatusMessage(String distributionId, DistributionStatusEnum status, String url, String componentName) { return new BuilderUtil<>(new ComponentStatusMessage()).build(builder -> { - builder.distributionID = distributionId; - builder.status = status; - builder.consumerID = consumerId; - builder.componentName = componentName; - builder.timeStamp = System.currentTimeMillis(); - builder.artifactUrl = url; + builder.setDistributionID(distributionId); + builder.setStatus(status); + builder.setConsumerID(consumerId); + builder.setComponentName(componentName); + builder.setTimeStamp(System.currentTimeMillis()); + builder.setArtifactUrl(url); }).create(); } @@ -15,13 +15,12 @@ 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. --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>org.onap.ccsdk.parent</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>1.3.0-SNAPSHOT</version> + <version>1.3.1-SNAPSHOT</version> <relativePath/> </parent> |