Implement basic blueprint service logic workflow execution engine.
Change-Id: Ifbbad70f2bdc4ba879b07d972083a411c7cc02f1
Issue-ID: CCSDK-672
Signed-off-by: Muthuramalingam, Brinda Santh(bs2796) <bs2796@att.com>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ Copyright © 2017-2018 AT&T 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.
- -->
-<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.apps.blueprintsprocessor</groupId>
- <artifactId>commons</artifactId>
- <version>0.4.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>adaptors</artifactId>
- <packaging>pom</packaging>
- <name>Blueprints Processor Adaptors POM</name>
- <description>Blueprints Processor Adaptors</description>
- <modules>
-
- </modules>
-
-</project>
@get:ApiModelProperty(required = true)\r
lateinit var actionIdentifiers: ActionIdentifiers\r
@get:ApiModelProperty(required = true)\r
- lateinit var status: Status\r
+ var status: Status = Status()\r
@get:ApiModelProperty(required = true)\r
lateinit var payload: ObjectNode\r
var metadata: MutableMap<String, JsonNode> = hashMapOf()\r
@get:ApiModelProperty(required = false)\r
var errorMessage: String? = null\r
@get:ApiModelProperty(required = true)\r
- lateinit var message: String\r
+ var message: String = "success"\r
}\r
\r
\r
+++ /dev/null
-/*\r
- * Copyright © 2017-2018 AT&T Intellectual Property.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package org.onap.ccsdk.apps.blueprintsprocessor.core.api.data\r
-\r
-/**\r
- * BlueprintProcessorException\r
- * @author Brinda Santh\r
- * DATE : 8/15/2018\r
- */\r
-open class BlueprintProcessorException : Exception {\r
- var code: Int = 100\r
-\r
- constructor(cause: Throwable) : super(cause)\r
- constructor(message: String) : super(message)\r
- constructor(message: String, cause: Throwable) : super(message, cause)\r
- constructor(cause: Throwable, message: String, vararg args: Any?) : super(String.format(message, *args), cause)\r
-\r
- constructor(code: Int, cause: Throwable) : super(cause) {\r
- this.code = code\r
- }\r
-\r
- constructor(code: Int, message: String) : super(message) {\r
- this.code = code\r
- }\r
-\r
- constructor(code: Int, message: String, cause: Throwable) : super(message, cause) {\r
- this.code = code\r
- }\r
-\r
- constructor(code: Int, cause: Throwable, message: String, vararg args: Any?)\r
- : super(String.format(message, *args), cause) {\r
- this.code = code\r
- }\r
-}
\ No newline at end of file
import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException\r
import org.springframework.context.ApplicationContext\r
import org.springframework.context.ApplicationContextAware\r
-import org.springframework.stereotype.Service\r
\r
/**\r
* ComponentNode\r
*\r
* @author Brinda Santh\r
*/\r
-@Service\r
open class ComponentNodeFactory : ApplicationContextAware {\r
private val log = EELFManager.getInstance().getLogger(ComponentNodeFactory::class.java)\r
\r
import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignmentProcessor\r
import org.springframework.context.ApplicationContext\r
import org.springframework.context.ApplicationContextAware\r
-import org.springframework.stereotype.Service\r
+import org.springframework.context.annotation.Configuration\r
\r
/**\r
* ResourceAssignmentProcessorFactory\r
*\r
* @author Brinda Santh\r
*/\r
-@Service\r
+@Configuration\r
open class ResourceAssignmentProcessorFactory : ApplicationContextAware {\r
\r
private val log = EELFManager.getInstance().getLogger(ResourceAssignmentProcessorFactory::class.java)\r
<modules>
<module>db-lib</module>
<module>rest-lib</module>
- <module>adaptors</module>
<module>core</module>
</modules>
<dependencies>
import io.swagger.annotations.ApiOperation;\r
import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ExecutionServiceInput;\r
import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ExecutionServiceOutput;\r
-import org.onap.ccsdk.apps.blueprintsprocessor.services.execution.ExecutionService;\r
import org.springframework.http.MediaType;\r
import org.springframework.web.bind.annotation.*;\r
import reactor.core.publisher.Mono;\r
@RequestMapping("/api/v1/execution-service")\r
public class ExecutionServiceController {\r
\r
- private ExecutionService executionService;\r
-\r
- public ExecutionServiceController(ExecutionService executionService) {\r
- this.executionService = executionService;\r
- }\r
\r
@RequestMapping(path = "/ping", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)\r
public @ResponseBody\r
notes = "Takes the blueprint information and process as per the payload")\r
public @ResponseBody\r
Mono<ExecutionServiceOutput> process(@RequestBody ExecutionServiceInput executionServiceInput) {\r
- return Mono.just(executionService.process(executionServiceInput));\r
+ return Mono.just(new ExecutionServiceOutput());\r
}\r
}\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ Copyright © 2017-2018 AT&T 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.
- -->
-<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.apps.blueprintsprocessor</groupId>
- <artifactId>services</artifactId>
- <version>0.4.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>db-service</artifactId>
- <packaging>jar</packaging>
- <name>Blueprints Processor DB Service</name>
- <description>Blueprints Processor DB Service</description>
-
- <dependencies>
- </dependencies>
-</project>
--- /dev/null
+/*\r
+ * Copyright © 2017-2018 AT&T Intellectual Property.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package org.onap.ccsdk.apps.blueprintsprocessor.services.execution\r
+\r
+\r
+import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ExecutionServiceInput\r
+import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ExecutionServiceOutput\r
+import org.onap.ccsdk.apps.controllerblueprints.core.interfaces.BlueprintFunctionNode\r
+import org.slf4j.LoggerFactory\r
+\r
+/**\r
+ * AbstractComponentFunction\r
+ * @author Brinda Santh\r
+ */\r
+abstract class AbstractComponentFunction : BlueprintFunctionNode<ExecutionServiceInput, ExecutionServiceOutput> {\r
+ private val log = LoggerFactory.getLogger(AbstractComponentFunction::class.java)\r
+\r
+ override fun prepareRequest(executionRequest: ExecutionServiceInput): ExecutionServiceInput {\r
+ log.info("prepareRequest...")\r
+ return executionRequest\r
+ }\r
+\r
+ override fun process(executionRequest: ExecutionServiceInput) {\r
+ log.info("Processing...")\r
+ }\r
+\r
+ override fun recover(runtimeException: RuntimeException, executionRequest: ExecutionServiceInput) {\r
+ log.info("Recovering...")\r
+ }\r
+\r
+ override fun prepareResponse(): ExecutionServiceOutput {\r
+ log.info("Preparing Response...")\r
+ return ExecutionServiceOutput()\r
+ }\r
+\r
+ override fun apply(executionServiceInput: ExecutionServiceInput): ExecutionServiceOutput {\r
+ prepareRequest(executionServiceInput)\r
+ process(executionServiceInput)\r
+ return prepareResponse()\r
+ }\r
+}
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright © 2017-2018 AT&T Intellectual Property.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package org.onap.ccsdk.apps.blueprintsprocessor.services.execution\r
-\r
-\r
-import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ExecutionServiceInput\r
-import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ExecutionServiceOutput\r
-import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.Status\r
-import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils\r
-import org.springframework.stereotype.Service\r
-import com.fasterxml.jackson.databind.node.ObjectNode\r
-\r
-/**\r
- * ExecutionService\r
- * @author Brinda Santh\r
- * 8/14/2018\r
- */\r
-@Service\r
-class ExecutionService {\r
-\r
- fun process(executionServiceInput: ExecutionServiceInput): ExecutionServiceOutput {\r
- val executionServiceOutput = ExecutionServiceOutput()\r
- executionServiceOutput.actionIdentifiers = executionServiceInput.actionIdentifiers\r
- executionServiceOutput.commonHeader = executionServiceInput.commonHeader\r
- executionServiceOutput.payload = JacksonUtils.jsonNode("{}") as ObjectNode\r
- val status = Status()\r
- status.code = 200\r
- status.message = "Success"\r
- executionServiceOutput.status = status\r
- return executionServiceOutput\r
- }\r
-}
\ No newline at end of file
+++ /dev/null
-/*
- * 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.apps.blueprintsprocessor.services.execution
-
-import org.onap.ccsdk.apps.blueprintsprocessor.core.factory.ComponentNode
-import org.springframework.stereotype.Component
-
-/**
- * JavaScriptExecuteComponent
- *
- * @author Brinda Santh
- */
-@Component("component-javascript-executor")
-class JavaScriptExecuteComponent : ComponentNode {
-
- override fun validate(context: MutableMap<String, Any>, componentContext: MutableMap<String, Any?>) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override fun process(context: MutableMap<String, Any>, componentContext: MutableMap<String, Any?>) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override fun errorHandle(context: MutableMap<String, Any>, componentContext: MutableMap<String, Any?>) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override fun reTrigger(context: MutableMap<String, Any>, componentContext: MutableMap<String, Any?>) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-}
\ No newline at end of file
+++ /dev/null
-/*
- * 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.apps.blueprintsprocessor.services.execution
-
-import org.onap.ccsdk.apps.blueprintsprocessor.core.factory.ComponentNode
-import org.springframework.stereotype.Component
-
-/**
- * PythonExecuteComponent
- *
- * @author Brinda Santh
- */
-@Component("component-python-executor")
-class PythonExecuteComponent : ComponentNode {
- override fun validate(context: MutableMap<String, Any>, componentContext: MutableMap<String, Any?>) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override fun process(context: MutableMap<String, Any>, componentContext: MutableMap<String, Any?>) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override fun errorHandle(context: MutableMap<String, Any>, componentContext: MutableMap<String, Any?>) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-
- override fun reTrigger(context: MutableMap<String, Any>, componentContext: MutableMap<String, Any?>) {
- TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- }
-}
\ No newline at end of file
+++ /dev/null
-/*\r
- * Copyright © 2017-2018 AT&T Intellectual Property.\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package org.onap.ccsdk.apps.blueprintsprocessor.services.execution;\r
-\r
-import com.fasterxml.jackson.databind.node.ObjectNode;\r
-import org.apache.commons.io.FileUtils;\r
-import org.junit.Assert;\r
-import org.junit.Test;\r
-import org.junit.runner.RunWith;\r
-import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ExecutionServiceInput;\r
-import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ExecutionServiceOutput;\r
-import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-import org.springframework.beans.factory.annotation.Autowired;\r
-import org.springframework.test.context.ContextConfiguration;\r
-import org.springframework.test.context.junit4.SpringRunner;\r
-\r
-import java.io.File;\r
-import java.nio.charset.Charset;\r
-\r
-\r
-/**\r
- * ExecutionServiceTest\r
- *\r
- * @author Brinda Santh\r
- * DATE : 8/15/2018\r
- */\r
-@RunWith(SpringRunner.class)\r
-@ContextConfiguration(classes = ExecutionService.class)\r
-public class ExecutionServiceTest {\r
- private static Logger log = LoggerFactory.getLogger(ExecutionServiceTest.class);\r
-\r
- @Autowired\r
- private ExecutionService executionService;\r
-\r
- @Test\r
- public void testExecutionService() throws Exception {\r
-\r
- Assert.assertNotNull("failed to create ResourceResolutionService", executionService);\r
-\r
- String resourceResolutionInputContent = FileUtils.readFileToString(\r
- new File("src/test/resources/payload/requests/sample-execution-request.json"), Charset.defaultCharset());\r
-\r
- ExecutionServiceInput executionServiceInput = JacksonUtils.readValue(resourceResolutionInputContent, ExecutionServiceInput.class );\r
- Assert.assertNotNull("failed to populate executionServiceInput request ",executionServiceInput);\r
-\r
- ObjectNode inputContent = (ObjectNode)JacksonUtils.jsonNodeFromFile("src/test/resources/payload/inputs/input.json");\r
- Assert.assertNotNull("failed to populate input payload ",inputContent);\r
- executionServiceInput.setPayload(inputContent);\r
-\r
- ExecutionServiceOutput executionServiceOutput = executionService.process(executionServiceInput);\r
- Assert.assertNotNull("failed to populate output",executionServiceOutput);\r
-\r
- }\r
-}
\ No newline at end of file
<packaging>pom</packaging>
<modules>
- <module>db-service</module>
- <module>resolution-service</module>
<module>execution-service</module>
+ <module>resolution-service</module>
+ <module>workflow-service</module>
</modules>
<dependencies>
\r
package org.onap.ccsdk.apps.blueprintsprocessor.services.resolution\r
\r
-import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.BlueprintProcessorException\r
-import org.onap.ccsdk.apps.blueprintsprocessor.core.factory.ResourceAssignmentProcessorFactory\r
import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ResourceResolutionInput\r
import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ResourceResolutionOutput\r
import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.Status\r
-import org.onap.ccsdk.apps.controllerblueprints.core.format\r
+import org.onap.ccsdk.apps.blueprintsprocessor.core.factory.ResourceAssignmentProcessorFactory\r
+import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException\r
import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment\r
import org.onap.ccsdk.apps.controllerblueprints.resource.dict.utils.BulkResourceSequencingUtils\r
import org.springframework.stereotype.Service\r
val bulkSequenced = BulkResourceSequencingUtils.process(resourceAssignments)\r
\r
bulkSequenced.map { batchResourceAssignments ->\r
- batchResourceAssignments.filter { it.name != "*" && it.name != "start"}\r
- .map { resourceAssignment ->\r
- val dictionarySource = resourceAssignment.dictionarySource\r
- val processorInstanceName = "resource-assignment-processor-".plus(dictionarySource)\r
- val resourceAssignmentProcessor = resourceAssignmentProcessorFactory.getInstance(processorInstanceName)\r
- ?: throw BlueprintProcessorException(format("failed to get resource processor for instance name({}) " +\r
- "for resource assignment({})", processorInstanceName, resourceAssignment.name))\r
- try {\r
- resourceAssignmentProcessor.validate(resourceAssignment, context)\r
- resourceAssignmentProcessor.process(resourceAssignment, context)\r
- } catch (e: Exception) {\r
- resourceAssignmentProcessor.errorHandle(resourceAssignment, context)\r
- throw BlueprintProcessorException(e)\r
- }\r
+ batchResourceAssignments.filter { it.name != "*" && it.name != "start" }\r
+ .map { resourceAssignment ->\r
+ val dictionarySource = resourceAssignment.dictionarySource\r
+ val processorInstanceName = "resource-assignment-processor-".plus(dictionarySource)\r
+ val resourceAssignmentProcessor = resourceAssignmentProcessorFactory.getInstance(processorInstanceName)\r
+ ?: throw BluePrintProcessorException("failed to get resource processor for instance name($processorInstanceName) " +\r
+ "for resource assignment(${resourceAssignment.name})")\r
+ try {\r
+ resourceAssignmentProcessor.validate(resourceAssignment, context)\r
+ resourceAssignmentProcessor.process(resourceAssignment, context)\r
+ } catch (e: Exception) {\r
+ resourceAssignmentProcessor.errorHandle(resourceAssignment, context)\r
+ throw BluePrintProcessorException(e)\r
+ }\r
\r
- }\r
+ }\r
}\r
}\r
}\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright © 2017-2018 AT&T 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.
+ -->
+
+<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.apps.blueprintsprocessor</groupId>
+ <artifactId>services</artifactId>
+ <version>0.4.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>workflow-service</artifactId>
+ <name>Blueprints Processor Workflow Service</name>
+ <description>Blueprints Processor Workflow Service</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.onap.ccsdk.apps.blueprintsprocessor</groupId>
+ <artifactId>execution-service</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.core</groupId>
+ <artifactId>sli-provider</artifactId>
+ </dependency>
+ </dependencies>
+
+
+</project>
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright © 2017-2018 AT&T 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.apps.blueprintsprocessor.services.workflow
+
+import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintRuntimeService
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext
+
+class BlueprintSvcLogicContext : SvcLogicContext() {
+
+ private var bluePrintRuntimeService: BluePrintRuntimeService<*>? = null
+ private var request: Any? = null
+ private var response: Any? = null
+
+ fun getBluePrintService(): BluePrintRuntimeService<*> {
+ return this.bluePrintRuntimeService!!
+ }
+
+ fun setBluePrintRuntimeService(bluePrintRuntimeService: BluePrintRuntimeService<*>) {
+ this.bluePrintRuntimeService = bluePrintRuntimeService
+ }
+
+ fun setRequest(request: Any) {
+ this.request = request
+ }
+
+ fun getRequest(): Any {
+ return this.request!!
+ }
+
+ fun setResponse(response: Any) {
+ this.response = response
+ }
+
+ fun getResponse(): Any {
+ return this.response!!
+ }
+
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright © 2017-2018 AT&T 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.apps.blueprintsprocessor.services.workflow
+
+import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintRuntimeService
+import org.onap.ccsdk.sli.core.sli.*
+import org.onap.ccsdk.sli.core.sli.provider.*
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker
+import org.slf4j.LoggerFactory
+import org.slf4j.MDC
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.ApplicationContext
+import org.springframework.stereotype.Service
+import java.util.*
+import javax.annotation.PostConstruct
+
+interface BlueprintSvcLogicService : SvcLogicService {
+
+ fun registerDefaultExecutors()
+
+ fun registerExecutors(name: String, svcLogicNodeExecutor: SvcLogicNodeExecutor)
+
+ fun unRegisterExecutors(name: String)
+
+ fun execute(graph: SvcLogicGraph, bluePrintRuntimeService: BluePrintRuntimeService<*>): Any
+
+ @Deprecated("Populate Graph Dynamically from Blueprints, No need to get from Database Store ")
+ override fun getStore(): SvcLogicStore {
+ TODO("not implemented")
+ }
+
+ @Deprecated("Not used in Micro service Implementation")
+ override fun hasGraph(module: String, rpc: String, version: String?, mode: String): Boolean {
+ TODO("not implemented")
+ }
+
+ @Deprecated("Not used in Micro service Implementation")
+ override fun execute(p0: String?, p1: String?, p2: String?, p3: String?, p4: Properties?): Properties {
+ TODO("not implemented")
+ }
+
+ @Deprecated("Not used in Micro service Implementation")
+ override fun execute(p0: String?, p1: String?, p2: String?, p3: String?, p4: Properties?, p5: DOMDataBroker?): Properties {
+ TODO("not implemented")
+ }
+}
+
+
+@Service
+class DefaultBlueprintSvcLogicService : BlueprintSvcLogicService {
+
+ private val log = LoggerFactory.getLogger(DefaultBlueprintSvcLogicService::class.java)
+
+ private val nodeExecutors: MutableMap<String, SvcLogicNodeExecutor> = hashMapOf()
+
+ @Autowired
+ private lateinit var context: ApplicationContext
+
+ @PostConstruct
+ override fun registerDefaultExecutors() {
+
+ val executeNodeExecutor = context.getBean(ExecuteNodeExecutor::class.java)
+ registerExecutors("execute", executeNodeExecutor)
+ registerExecutors("block", BlockNodeExecutor())
+ registerExecutors("return", ReturnNodeExecutor())
+ registerExecutors("break", BreakNodeExecutor())
+ registerExecutors("exit", ExitNodeExecutor())
+ }
+
+ override fun registerExecutors(name: String, svcLogicNodeExecutor: SvcLogicNodeExecutor) {
+ log.info("Registering executors($name) with type(${svcLogicNodeExecutor.javaClass}")
+ nodeExecutors.put(name, svcLogicNodeExecutor)
+ }
+
+ override fun unRegisterExecutors(name: String) {
+ if (nodeExecutors.containsKey(name)) {
+ log.info("UnRegistering executors($name)")
+ nodeExecutors.remove(name)
+ }
+ }
+
+ override fun execute(graph: SvcLogicGraph, bluePrintRuntimeService: BluePrintRuntimeService<*>): Any {
+ //Initialise BlueprintSvcLogic Context
+ val blueprintSvcLogicContext = BlueprintSvcLogicContext()
+ blueprintSvcLogicContext.setBluePrintRuntimeService(bluePrintRuntimeService)
+ // Execute the Graph
+ execute(graph, blueprintSvcLogicContext)
+ // Get the Response
+ return blueprintSvcLogicContext.getResponse()
+ }
+
+ override fun executeNode(node: SvcLogicNode?, ctx: SvcLogicContext): SvcLogicNode? {
+ if (node == null) {
+ return null
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("Executing node {}", node.getNodeId())
+ }
+
+ val executor = this.nodeExecutors[node.getNodeType()]
+
+ if (executor != null) {
+ log.debug("Executing node executor for node type {} - {}", node.getNodeType(), executor.javaClass.name)
+ return executor.execute(this, node, ctx)
+ } else {
+ throw SvcLogicException("Attempted to execute a node of type " + node.getNodeType() + ", but no executor was registered for this type")
+ }
+ }
+ }
+
+ override fun execute(graph: SvcLogicGraph, svcLogicContext: SvcLogicContext): SvcLogicContext {
+ MDC.put("currentGraph", graph.toString())
+
+ val ctx = svcLogicContext as BlueprintSvcLogicContext
+
+ val blueprintRuntimeService = ctx.getBluePrintService()
+
+ log.info("Blueprint Runtime Service : ${blueprintRuntimeService}")
+
+ var curNode: SvcLogicNode? = graph.getRootNode()
+ log.info("About to execute graph {}", graph.toString())
+
+ try {
+ while (curNode != null) {
+ MDC.put("nodeId", curNode.nodeId.toString() + " (" + curNode.nodeType + ")")
+ log.info("About to execute node # {} ({})", curNode.nodeId, curNode.nodeType)
+ val nextNode = this.executeNode(curNode, ctx)
+ curNode = nextNode
+ }
+ } catch (var5: ExitNodeException) {
+ log.debug("SvcLogicServiceImpl caught ExitNodeException")
+ }
+
+ MDC.remove("nodeId")
+ MDC.remove("currentGraph")
+ return ctx
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright © 2017-2018 AT&T 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.apps.blueprintsprocessor.services.workflow
+
+import org.springframework.context.annotation.ComponentScan
+import org.springframework.context.annotation.Configuration
+
+@Configuration
+@ComponentScan
+open class WorkflowServiceConfiguration {
+
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright © 2017-2018 AT&T 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.apps.blueprintsprocessor.services.workflow.executor
+
+import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ExecutionServiceInput
+import org.onap.ccsdk.apps.blueprintsprocessor.services.execution.AbstractComponentFunction
+import org.onap.ccsdk.apps.blueprintsprocessor.services.workflow.BlueprintSvcLogicContext
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext
+import org.onap.ccsdk.sli.core.sli.SvcLogicException
+import org.onap.ccsdk.sli.core.sli.SvcLogicNode
+import org.onap.ccsdk.sli.core.sli.provider.ExecuteNodeExecutor
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicExpressionResolver
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicService
+import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.ApplicationContext
+import org.springframework.stereotype.Service
+
+@Service
+open class ComponentExecuteNodeExecutor : ExecuteNodeExecutor() {
+
+ private val log = LoggerFactory.getLogger(ComponentExecuteNodeExecutor::class.java)
+
+ @Autowired
+ private lateinit var context: ApplicationContext
+
+ fun getComponentFunction(pluginName: String): AbstractComponentFunction {
+ return context.getBean(pluginName, AbstractComponentFunction::class.java)
+ }
+
+ @Throws(SvcLogicException::class)
+ override fun execute(svc: SvcLogicService, node: SvcLogicNode, svcLogicContext: SvcLogicContext): SvcLogicNode {
+
+ var outValue: String
+
+ val ctx = svcLogicContext as BlueprintSvcLogicContext
+
+ val nodeTemplateName = SvcLogicExpressionResolver.evaluate(node.getAttribute("plugin"), node, ctx)
+
+ try {
+ // Get the Blueprint Context
+ val blueprintContext = ctx.getBluePrintService().bluePrintContext()
+ // Get the Component Name, NodeTemplate type is mapped to Component Name
+ val componentName = blueprintContext.nodeTemplateByName(nodeTemplateName).type
+
+ log.info("executing node template($nodeTemplateName) component($componentName)")
+ // Get the Component Instance
+ val plugin = this.getComponentFunction(componentName)
+
+ val executionInput = ctx.getRequest() as ExecutionServiceInput
+ // Get the Request from the Context and Set to the Function Input and Invoke the function
+ val executionOutput = plugin.apply(executionInput)
+
+ ctx.setResponse(executionOutput)
+
+ outValue = executionOutput.status.message
+ ctx.status = executionOutput.status.message
+
+ } catch (e: Exception) {
+ this.log.error("Could not execute plugin($nodeTemplateName) : ", e)
+ outValue = "failure"
+ ctx.status = "failure"
+ }
+
+ return this.getNextNode(node, outValue)
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright © 2017-2018 AT&T 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.apps.blueprintsprocessor.services.workflow.utils
+
+import org.onap.ccsdk.sli.core.sli.SvcLogicGraph
+import org.onap.ccsdk.sli.core.sli.SvcLogicParser
+
+object SvcGraphUtils {
+
+ @JvmStatic
+ fun getSvcGraphFromClassPathFile(fileName: String): SvcLogicGraph {
+ val url = SvcGraphUtils::class.java.classLoader.getResource(fileName)
+ return getSvcGraphFromFile(url.path)
+ }
+
+ @JvmStatic
+ fun getSvcGraphFromFile(fileName: String): SvcLogicGraph {
+ val svcLogicParser = SvcLogicParser()
+ return svcLogicParser.parse(fileName).first
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright © 2017-2018 AT&T 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.apps.blueprintsprocessor.services.workflow
+
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ExecutionServiceInput
+import org.onap.ccsdk.apps.blueprintsprocessor.services.workflow.executor.ComponentExecuteNodeExecutor
+import org.onap.ccsdk.apps.blueprintsprocessor.services.workflow.utils.SvcGraphUtils
+import org.onap.ccsdk.apps.controllerblueprints.core.utils.BluePrintMetadataUtils
+import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.test.context.ContextConfiguration
+import org.springframework.test.context.junit4.SpringRunner
+
+@RunWith(SpringRunner::class)
+@ContextConfiguration(classes = [WorkflowServiceConfiguration::class, ComponentExecuteNodeExecutor::class])
+class BlueprintServiceLogicTest {
+
+ private val log = LoggerFactory.getLogger(BlueprintServiceLogicTest::class.java)
+
+ val bluePrintRuntimeService = BluePrintMetadataUtils.getBluePrintRuntime("1234",
+ "./../../../../../components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration")
+
+ @Autowired
+ lateinit var blueprintSvcLogicService: BlueprintSvcLogicService
+
+ @Test
+ fun testExecuteGraphWithSingleComponent() {
+
+ val graph = SvcGraphUtils.getSvcGraphFromClassPathFile("service-logic/one-component.xml")
+ val svcLogicContext = BlueprintSvcLogicContext()
+ svcLogicContext.setBluePrintRuntimeService(bluePrintRuntimeService)
+ svcLogicContext.setRequest(ExecutionServiceInput())
+ blueprintSvcLogicService.execute(graph, svcLogicContext)
+
+ }
+
+ @Test
+ fun testExecuteGraphWithMultipleComponents() {
+ val graph = SvcGraphUtils.getSvcGraphFromClassPathFile("service-logic/two-component.xml")
+ val svcLogicContext = BlueprintSvcLogicContext()
+ svcLogicContext.setBluePrintRuntimeService(bluePrintRuntimeService)
+ svcLogicContext.setRequest(ExecutionServiceInput())
+ blueprintSvcLogicService.execute(graph, svcLogicContext)
+
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright © 2017-2018 AT&T 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.apps.blueprintsprocessor.services.workflow.mock
+
+import org.onap.ccsdk.apps.blueprintsprocessor.core.api.data.ExecutionServiceInput
+import org.onap.ccsdk.apps.blueprintsprocessor.services.execution.AbstractComponentFunction
+import org.onap.ccsdk.apps.blueprintsprocessor.services.workflow.executor.ComponentExecuteNodeExecutor
+import org.slf4j.LoggerFactory
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+
+@Configuration
+open class MockComponentConfiguration {
+
+ @Bean(name = ["component-resource-assignment", "component-netconf-executor"])
+ open fun createComponentFunction(): AbstractComponentFunction {
+ return MockComponentFunction()
+ }
+}
+
+class MockComponentFunction : AbstractComponentFunction() {
+
+ private val log = LoggerFactory.getLogger(ComponentExecuteNodeExecutor::class.java)
+
+ override fun process(executionRequest: ExecutionServiceInput) {
+ super.process(executionRequest)
+ }
+
+ override fun recover(runtimeException: RuntimeException, executionRequest: ExecutionServiceInput) {
+ super.recover(runtimeException, executionRequest)
+ }
+}
\ No newline at end of file
--- /dev/null
+<!--
+ ~ Copyright © 2017-2018 AT&T 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.
+ -->
+
+<service-logic
+ xmlns='http://www.onap.org/sdnc/svclogic'
+ xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.onap.org/sdnc/svclogic ./svclogic.xsd' module='CONFIG' version='1.0.0'>
+ <method rpc='ActivateNetconf' mode='sync'>
+ <block atomic="true">
+ <execute plugin="resource-assignment" method="process">
+ <outcome value='failure'>
+ <return status="failure">
+ </return>
+ </outcome>
+ <outcome value='success'>
+ <return status='success'>
+ </return>
+ </outcome>
+ </execute>
+ </block>
+ </method>
+</service-logic>
\ No newline at end of file
--- /dev/null
+<!--
+ ~ Copyright © 2017-2018 AT&T 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.
+ -->
+
+<service-logic
+ xmlns='http://www.onap.org/sdnc/svclogic'
+ xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.onap.org/sdnc/svclogic ./svclogic.xsd' module='CONFIG' version='1.0.0'>
+ <method rpc='ResourceAssignAndActivate' mode='sync'>
+ <block atomic="true">
+ <execute plugin="resource-assignment" method="process">
+ <outcome value='failure'>
+ <return status="failure">
+ </return>
+ </outcome>
+ <outcome value='success'>
+ <execute plugin="resource-assignment-py" method="process">
+ <outcome value='failure'>
+ <return status="failure">
+ </return>
+ </outcome>
+ <outcome value='success'>
+ <return status='success'>
+ </return>
+ </outcome>
+ </execute>
+ </outcome>
+ </execute>
+ </block>
+ </method>
+</service-logic>
\ No newline at end of file
~ 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.apps</groupId>
<kotlin.version>1.3.0</kotlin.version>
<kotlin.couroutines.version>1.0.1</kotlin.couroutines.version>
<eelf.version>1.0.0</eelf.version>
+ <sli.version>0.3.1</sli.version>
<guava.version>26.0-jre</guava.version>
<springfox.swagger2.version>2.9.2</springfox.swagger2.version>
<h2database.version>1.4.197</h2database.version>
<version>${kotlin.version}</version>
</dependency>
+ <!-- SLI Version -->
+ <dependency>
+ <groupId>org.onap.ccsdk.sli.core</groupId>
+ <artifactId>sli-provider</artifactId>
+ <version>${sli.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.opendaylight.mdsal.model</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ <!--<exclusion>-->
+ <!--<groupId>org.opendaylight.controller</groupId>-->
+ <!--<artifactId>*</artifactId>-->
+ <!--</exclusion>-->
+ <exclusion>
+ <groupId>org.apache.tomcat</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.karaf.shell</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.mariadb.jdbc</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
<!-- Application Module Dependencies -->
<dependency>
<artifactId>execution-service</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.apps.blueprintsprocessor</groupId>
+ <artifactId>workflow-service</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>org.onap.ccsdk.apps.blueprintsprocessor</groupId>
<artifactId>resolution-service</artifactId>
<executions>
<execution>
<id>compile</id>
- <goals>
+ <goals>
<goal>compile</goal>
</goals>
<configuration>