From 72066bf5f27870a6bd009b920452a77d57fd8af3 Mon Sep 17 00:00:00 2001 From: "Muthuramalingam, Brinda Santh(bs2796)" Date: Fri, 14 Dec 2018 12:30:51 -0500 Subject: Add blueprint artifact definition enrichment. Change-Id: I3b03a1f76472ce6b44929457a42805d281950ff7 Issue-ID: CCSDK-839 Signed-off-by: Muthuramalingam, Brinda Santh(bs2796) --- .../core/interfaces/BluePrintEnhancer.kt | 9 + .../core/service/BluePrintRuntimeService.kt | 7 + .../core/utils/BluePrintArchiveUtils.kt | 12 + .../core/utils/JacksonReactorUtils.kt | 1 + .../core/utils/JacksonUtils.kt | 12 +- .../BluePrintNodeTemplateValidatorImpl.kt | 2 +- .../core/service/BluePrintRepoFileServiceTest.kt | 4 +- .../core/utils/JacksonReactorUtilsTest.kt | 5 +- .../BluePrintArtifactDefinitionEnhancerImpl.kt | 101 ++++ .../enhancer/BluePrintNodeTemplateEnhancerImpl.kt | 19 +- .../BluePrintServiceTemplateEnhancerImpl.kt | 2 +- .../enhancer/BluePrintTypeEnhancerServiceImpl.kt | 4 + .../enhancer/BluePrintWorkflowEnhancerImpl.kt | 51 +- .../test/resources/enhance/enhanced-template.json | 603 --------------------- 14 files changed, 184 insertions(+), 648 deletions(-) create mode 100644 ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintArtifactDefinitionEnhancerImpl.kt diff --git a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/interfaces/BluePrintEnhancer.kt b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/interfaces/BluePrintEnhancer.kt index f6659e7d..f01f1262 100644 --- a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/interfaces/BluePrintEnhancer.kt +++ b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/interfaces/BluePrintEnhancer.kt @@ -35,6 +35,8 @@ interface BluePrintNodeTemplateEnhancer : BluePrintEnhancer interface BluePrintNodeTypeEnhancer : BluePrintEnhancer +interface BluePrintArtifactDefinitionEnhancer : BluePrintEnhancer + interface BluePrintPolicyTypeEnhancer : BluePrintEnhancer interface BluePrintPropertyDefinitionEnhancer : BluePrintEnhancer @@ -63,6 +65,8 @@ interface BluePrintTypeEnhancerService { fun getNodeTypeEnhancers(): List + fun getArtifactDefinitionEnhancers(): List + fun getPolicyTypeEnhancers(): List fun getPropertyDefinitionEnhancers(): List @@ -94,6 +98,11 @@ interface BluePrintTypeEnhancerService { doEnhancement(bluePrintRuntimeService, name, nodeType, enhancers) } + fun enhanceArtifactDefinition(bluePrintRuntimeService: BluePrintRuntimeService<*>, name: String, artifactDefinition: ArtifactDefinition) { + val enhancers = getArtifactDefinitionEnhancers() + doEnhancement(bluePrintRuntimeService, name, artifactDefinition, enhancers) + } + fun enhancePolicyType(bluePrintRuntimeService: BluePrintRuntimeService<*>, name: String, policyType: PolicyType) { val enhancers = getPolicyTypeEnhancers() doEnhancement(bluePrintRuntimeService, name, policyType, enhancers) diff --git a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintRuntimeService.kt b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintRuntimeService.kt index cf518bd1..5540047c 100644 --- a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintRuntimeService.kt +++ b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintRuntimeService.kt @@ -46,6 +46,8 @@ interface BluePrintRuntimeService { fun get(key: String): JsonNode? + fun check(key: String): Boolean + fun cleanRuntime() fun getAsString(key: String): String? @@ -114,6 +116,7 @@ interface BluePrintRuntimeService { open class DefaultBluePrintRuntimeService(private var id: String, private var bluePrintContext: BluePrintContext) : BluePrintRuntimeService> { + @Transient private val log: EELFLogger = EELFManager.getInstance().getLogger(BluePrintRuntimeService::class.toString()) private var store: MutableMap = hashMapOf() @@ -145,6 +148,10 @@ open class DefaultBluePrintRuntimeService(private var id: String, private var bl return store[key] ?: throw BluePrintProcessorException("failed to get execution property($key)") } + override fun check(key: String): Boolean { + return store.containsKey(key) + } + override fun cleanRuntime() { store.clear() } diff --git a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintArchiveUtils.kt b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintArchiveUtils.kt index f02524ff..c1ab4fc6 100644 --- a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintArchiveUtils.kt +++ b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintArchiveUtils.kt @@ -16,9 +16,12 @@ package org.onap.ccsdk.apps.controllerblueprints.core.utils +import kotlinx.coroutines.async +import kotlinx.coroutines.runBlocking import org.apache.commons.compress.archivers.zip.ZipArchiveEntry import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream import org.apache.commons.io.IOUtils +import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException import java.io.* import java.nio.charset.Charset @@ -28,6 +31,15 @@ class BluePrintArchiveUtils { companion object { + fun getFileContent(fileName: String): String = runBlocking { + async { + try { + File(fileName).readText(Charsets.UTF_8) + } catch (e: Exception) { + throw BluePrintException("couldn't find file($fileName)") + } + }.await() + } fun compress(source: String, destination: String, absolute: Boolean): Boolean { val rootDir = File(source) diff --git a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonReactorUtils.kt b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonReactorUtils.kt index 0ed90170..e3c2a710 100644 --- a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonReactorUtils.kt +++ b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonReactorUtils.kt @@ -23,6 +23,7 @@ import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import reactor.core.publisher.Mono import reactor.core.publisher.toMono +@Deprecated("Reactor will be replaced by coroutines by default") object JacksonReactorUtils { private val log: EELFLogger = EELFManager.getInstance().getLogger(this::class.toString()) diff --git a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonUtils.kt b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonUtils.kt index be23172a..01874455 100644 --- a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonUtils.kt +++ b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonUtils.kt @@ -25,10 +25,12 @@ import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.SerializationFeature import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import org.apache.commons.io.IOUtils import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants +import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintTypes import java.io.File import java.nio.charset.Charset @@ -55,12 +57,14 @@ object JacksonUtils { } @JvmStatic - fun getContent(fileName: String): String { - return runBlocking { - withContext(Dispatchers.Default) { + fun getContent(fileName: String): String = runBlocking { + async { + try { File(fileName).readText(Charsets.UTF_8) + } catch (e: Exception) { + throw BluePrintException("couldn't get file ($fileName) content : ${e.message}") } - } + }.await() } @JvmStatic diff --git a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/validation/BluePrintNodeTemplateValidatorImpl.kt b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/validation/BluePrintNodeTemplateValidatorImpl.kt index 1449e63d..0ed87f81 100644 --- a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/validation/BluePrintNodeTemplateValidatorImpl.kt +++ b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/validation/BluePrintNodeTemplateValidatorImpl.kt @@ -242,7 +242,7 @@ open class BluePrintNodeTemplateValidatorImpl(private val bluePrintTypeValidator open fun checkValidArtifactType(artifactDefinitionName: String, artifactTypeName: String) { val artifactType = bluePrintContext.serviceTemplate.artifactTypes?.get(artifactTypeName) - ?: throw BluePrintException("failed to artifactType($artifactTypeName) for ArtifactDefinition($artifactDefinitionName)") + ?: throw BluePrintException("failed to get artifactType($artifactTypeName) for ArtifactDefinition($artifactDefinitionName)") checkValidArtifactTypeDerivedFrom(artifactTypeName, artifactType.derivedFrom) } diff --git a/components/core/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintRepoFileServiceTest.kt b/components/core/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintRepoFileServiceTest.kt index f7ffc394..9348a237 100644 --- a/components/core/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintRepoFileServiceTest.kt +++ b/components/core/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintRepoFileServiceTest.kt @@ -18,7 +18,7 @@ package org.onap.ccsdk.apps.controllerblueprints.core.service import org.junit.Test -import java.io.FileNotFoundException +import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException import kotlin.test.assertNotNull /** @@ -49,7 +49,7 @@ class BluePrintRepoFileServiceTest { assertNotNull(nodeType, "Failed to get ArtifactType from repo") } - @Test(expected = FileNotFoundException::class) + @Test(expected = BluePrintException::class) fun testModelNotFound() { val dataType = bluePrintRepoFileService.getDataType("dt-not-found") assertNotNull(dataType, "Failed to get DataType from repo") diff --git a/components/core/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonReactorUtilsTest.kt b/components/core/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonReactorUtilsTest.kt index be76593d..ad55c776 100644 --- a/components/core/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonReactorUtilsTest.kt +++ b/components/core/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonReactorUtilsTest.kt @@ -19,11 +19,12 @@ package org.onap.ccsdk.apps.controllerblueprints.core.utils import com.att.eelf.configuration.EELFLogger import com.att.eelf.configuration.EELFManager import org.junit.Test +import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException import org.onap.ccsdk.apps.controllerblueprints.core.data.ServiceTemplate -import java.io.FileNotFoundException import kotlin.test.assertEquals import kotlin.test.assertNotNull +@Deprecated("Reactor will be replacecd by coroutines by default.") class JacksonReactorUtilsTest { private val log: EELFLogger = EELFManager.getInstance().getLogger(this::class.toString()) @Test @@ -43,7 +44,7 @@ class JacksonReactorUtilsTest { assertNotNull(jsonContent, "Failed to get json Node") } - @Test(expected = FileNotFoundException::class) + @Test(expected = BluePrintException::class) fun testReadValuesFailure() { JacksonReactorUtils.jsonNodeFromFile("load/blueprints/not-found.json") .block() diff --git a/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintArtifactDefinitionEnhancerImpl.kt b/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintArtifactDefinitionEnhancerImpl.kt new file mode 100644 index 00000000..986ce986 --- /dev/null +++ b/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintArtifactDefinitionEnhancerImpl.kt @@ -0,0 +1,101 @@ +/* + * 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.controllerblueprints.service.enhancer + +import com.att.eelf.configuration.EELFLogger +import com.att.eelf.configuration.EELFManager +import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException +import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException +import org.onap.ccsdk.apps.controllerblueprints.core.asJsonPrimitive +import org.onap.ccsdk.apps.controllerblueprints.core.data.ArtifactDefinition +import org.onap.ccsdk.apps.controllerblueprints.core.data.ArtifactType +import org.onap.ccsdk.apps.controllerblueprints.core.interfaces.BluePrintArtifactDefinitionEnhancer +import org.onap.ccsdk.apps.controllerblueprints.core.interfaces.BluePrintRepoService +import org.onap.ccsdk.apps.controllerblueprints.core.interfaces.BluePrintTypeEnhancerService +import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintContext +import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintRuntimeService +import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils +import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment +import org.springframework.stereotype.Service + +@Service +open class BluePrintArtifactDefinitionEnhancerImpl(private val bluePrintRepoService: BluePrintRepoService, + private val bluePrintTypeEnhancerService: BluePrintTypeEnhancerService, + private val resourceAssignmentEnhancerService: ResourceAssignmentEnhancerService) + : BluePrintArtifactDefinitionEnhancer { + + companion object { + const val ARTIFACT_TYPE_MAPPING_SOURCE: String = "artifact-mapping-resource" + } + + + private val log: EELFLogger = EELFManager.getInstance().getLogger(BluePrintArtifactDefinitionEnhancerImpl::class.toString()) + + lateinit var bluePrintRuntimeService: BluePrintRuntimeService<*> + lateinit var bluePrintContext: BluePrintContext + + + override fun enhance(bluePrintRuntimeService: BluePrintRuntimeService<*>, name: String, artifactDefinition: ArtifactDefinition) { + log.info("enhancing ArtifactDefinition($name)") + + this.bluePrintRuntimeService = bluePrintRuntimeService + this.bluePrintContext = bluePrintRuntimeService.bluePrintContext() + + val artifactTypeName = artifactDefinition.type + ?: throw BluePrintException("Artifact type is missing for ArtifactDefinition($name)") + + // Populate Artifact Type + populateArtifactType(artifactTypeName) + + when (artifactTypeName) { + ARTIFACT_TYPE_MAPPING_SOURCE -> { + enhanceMappingType(name, artifactDefinition) + } + } + } + + // Enhance Resource Mapping + open fun enhanceMappingType(name: String, artifactDefinition: ArtifactDefinition) { + + val artifactFilePath = "${bluePrintContext.rootPath}/${artifactDefinition.file}" + + val alreadyEnhancedKey = "enhanced-${artifactDefinition.file}" + val alreadyEnhanced = bluePrintRuntimeService.check(alreadyEnhancedKey) + + log.info("enhancing resource mapping file(${artifactDefinition.file}) already enhanced($alreadyEnhanced)") + + if (!alreadyEnhanced) { + val resourceAssignments: MutableList = JacksonUtils.getListFromFile(artifactFilePath, ResourceAssignment::class.java) + as? MutableList + ?: throw BluePrintProcessorException("couldn't get ResourceAssignment definitions for the file($artifactFilePath)") + + // Call Resource Assignment Enhancer + resourceAssignmentEnhancerService.enhanceBluePrint(bluePrintTypeEnhancerService, bluePrintRuntimeService, resourceAssignments) + + bluePrintRuntimeService.put(alreadyEnhancedKey, true.asJsonPrimitive()) + } + } + + open fun populateArtifactType(artifactTypeName: String): ArtifactType { + + val artifactType = bluePrintContext.serviceTemplate.artifactTypes?.get(artifactTypeName) + ?: bluePrintRepoService.getArtifactType(artifactTypeName) + ?: throw BluePrintException("couldn't get ArtifactType($artifactTypeName) from repo.") + bluePrintContext.serviceTemplate.artifactTypes?.put(artifactTypeName, artifactType) + return artifactType + } +} \ No newline at end of file diff --git a/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintNodeTemplateEnhancerImpl.kt b/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintNodeTemplateEnhancerImpl.kt index cfbfab71..fb6c06af 100644 --- a/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintNodeTemplateEnhancerImpl.kt +++ b/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintNodeTemplateEnhancerImpl.kt @@ -18,9 +18,7 @@ package org.onap.ccsdk.apps.controllerblueprints.service.enhancer import com.att.eelf.configuration.EELFLogger import com.att.eelf.configuration.EELFManager -import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintError import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException -import org.onap.ccsdk.apps.controllerblueprints.core.data.ArtifactType import org.onap.ccsdk.apps.controllerblueprints.core.data.NodeTemplate import org.onap.ccsdk.apps.controllerblueprints.core.data.NodeType import org.onap.ccsdk.apps.controllerblueprints.core.format @@ -46,7 +44,7 @@ open class BluePrintNodeTemplateEnhancerImpl(private val bluePrintRepoService: B override fun enhance(bluePrintRuntimeService: BluePrintRuntimeService<*>, name: String, nodeTemplate: NodeTemplate) { - log.info("Enhancing NodeTemplate($name)") + log.info("***** Enhancing NodeTemplate($name)") this.bluePrintRuntimeService = bluePrintRuntimeService this.bluePrintContext = bluePrintRuntimeService.bluePrintContext() @@ -75,20 +73,9 @@ open class BluePrintNodeTemplateEnhancerImpl(private val bluePrintRepoService: B open fun enhanceNodeTemplateArtifactDefinition(nodeTemplateName: String, nodeTemplate: NodeTemplate) { nodeTemplate.artifacts?.forEach { artifactDefinitionName, artifactDefinition -> - val artifactTypeName = artifactDefinition.type - ?: throw BluePrintException(format("Artifact type is missing for NodeTemplate({}) artifact({})", nodeTemplateName, artifactDefinitionName)) - - // Populate Artifact Type - populateArtifactType(artifactTypeName) + // Enhance Artifacct Definitions + bluePrintTypeEnhancerService.enhanceArtifactDefinition(bluePrintRuntimeService, artifactDefinitionName, artifactDefinition) } } - open fun populateArtifactType(artifactTypeName: String): ArtifactType { - val artifactType = bluePrintContext.serviceTemplate.artifactTypes?.get(artifactTypeName) - ?: bluePrintRepoService.getArtifactType(artifactTypeName) - ?: throw BluePrintException(format("Couldn't get ArtifactType({}) from repo.", artifactTypeName)) - bluePrintContext.serviceTemplate.artifactTypes?.put(artifactTypeName, artifactType) - return artifactType - } - } \ No newline at end of file diff --git a/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintServiceTemplateEnhancerImpl.kt b/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintServiceTemplateEnhancerImpl.kt index 6a4f6232..2ad0583e 100644 --- a/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintServiceTemplateEnhancerImpl.kt +++ b/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintServiceTemplateEnhancerImpl.kt @@ -33,7 +33,7 @@ import org.springframework.stereotype.Service open class BluePrintServiceTemplateEnhancerImpl(private val bluePrintRepoService: BluePrintRepoService, private val bluePrintTypeEnhancerService: BluePrintTypeEnhancerService) : BluePrintServiceTemplateEnhancer { - private val log: EELFLogger = EELFManager.getInstance().getLogger(BluePrintEnhancerServiceImpl::class.toString()) + private val log: EELFLogger = EELFManager.getInstance().getLogger(BluePrintServiceTemplateEnhancerImpl::class.toString()) lateinit var bluePrintRuntimeService: BluePrintRuntimeService<*> diff --git a/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintTypeEnhancerServiceImpl.kt b/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintTypeEnhancerServiceImpl.kt index 3128b6c6..02a19c3f 100644 --- a/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintTypeEnhancerServiceImpl.kt +++ b/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintTypeEnhancerServiceImpl.kt @@ -47,6 +47,10 @@ open class BluePrintTypeEnhancerServiceImpl : BluePrintTypeEnhancerService { return context.getBeansOfType(BluePrintNodeTypeEnhancer::class.java).map { it.value } } + override fun getArtifactDefinitionEnhancers(): List { + return context.getBeansOfType(BluePrintArtifactDefinitionEnhancer::class.java).map { it.value } + } + override fun getPolicyTypeEnhancers(): List { return context.getBeansOfType(BluePrintPolicyTypeEnhancer::class.java).map { it.value } } diff --git a/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintWorkflowEnhancerImpl.kt b/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintWorkflowEnhancerImpl.kt index e3a8f222..a620e9bf 100644 --- a/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintWorkflowEnhancerImpl.kt +++ b/ms/controllerblueprints/modules/service/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/service/enhancer/BluePrintWorkflowEnhancerImpl.kt @@ -21,6 +21,7 @@ import com.att.eelf.configuration.EELFManager import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException import org.onap.ccsdk.apps.controllerblueprints.core.ConfigModelConstant +import org.onap.ccsdk.apps.controllerblueprints.core.asJsonPrimitive import org.onap.ccsdk.apps.controllerblueprints.core.data.DataType import org.onap.ccsdk.apps.controllerblueprints.core.data.PropertyDefinition import org.onap.ccsdk.apps.controllerblueprints.core.data.Workflow @@ -41,19 +42,21 @@ open class BluePrintWorkflowEnhancerImpl(private val bluePrintRepoService: BlueP private val bluePrintTypeEnhancerService: BluePrintTypeEnhancerService, private val resourceAssignmentEnhancerService: ResourceAssignmentEnhancerService) : BluePrintWorkflowEnhancer { - private val log: EELFLogger = EELFManager.getInstance().getLogger(BluePrintNodeTemplateEnhancerImpl::class.toString()) + private val log: EELFLogger = EELFManager.getInstance().getLogger(BluePrintWorkflowEnhancerImpl::class.toString()) + + companion object { + const val ARTIFACT_TYPE_MAPPING_SOURCE: String = "artifact-mapping-resource" + const val PROPERTY_DEPENDENCY_NODE_TEMPLATES = "dependency-node-templates" + } lateinit var bluePrintRuntimeService: BluePrintRuntimeService<*> lateinit var bluePrintContext: BluePrintContext - val PROPERTY_DEPENDENCY_NODE_TEMPLATES = "dependency-node-templates" - - private val workflowDataTypes: MutableMap = hashMapOf() override fun enhance(bluePrintRuntimeService: BluePrintRuntimeService<*>, name: String, workflow: Workflow) { - log.info("Enhancing Workflow($name)") - this.bluePrintRuntimeService = bluePrintRuntimeService + log.info("##### Enhancing Workflow($name)") + this.bluePrintRuntimeService = bluePrintRuntimeService this.bluePrintContext = bluePrintRuntimeService.bluePrintContext() val dynamicPropertyName = "$name-properties" @@ -94,10 +97,11 @@ open class BluePrintWorkflowEnhancerImpl(private val bluePrintRepoService: BlueP // Check and Get Resource Assignment File val resourceAssignmentArtifacts = dependencyNodeTemplates?.mapNotNull { componentNodeTemplateName -> - log.info("Identified workflow($name) targets($componentNodeTemplateName") + log.info("identified workflow($name) targets($componentNodeTemplateName)") + val resourceAssignmentArtifacts = bluePrintContext.nodeTemplateByName(componentNodeTemplateName) .artifacts?.filter { - it.value.type == "artifact-mapping-resource" + it.value.type == ARTIFACT_TYPE_MAPPING_SOURCE }?.map { log.info("resource assignment artifacts(${it.key}) for NodeType(${componentNodeTemplateName})") it.value.file @@ -105,7 +109,7 @@ open class BluePrintWorkflowEnhancerImpl(private val bluePrintRepoService: BlueP resourceAssignmentArtifacts }?.flatten() - log.info("Workflow($name) resource assignment files($resourceAssignmentArtifacts") + log.info("workflow($name) resource assignment files($resourceAssignmentArtifacts") if (resourceAssignmentArtifacts != null && resourceAssignmentArtifacts.isNotEmpty()) { @@ -113,19 +117,20 @@ open class BluePrintWorkflowEnhancerImpl(private val bluePrintRepoService: BlueP addWorkFlowDynamicPropertyDefinitions(name, workflow) resourceAssignmentArtifacts.forEach { fileName -> - - val absoluteFilePath = "${bluePrintContext.rootPath}/$fileName" - - log.info("enriching workflow($name) artifacts file(${absoluteFilePath}") // Enhance Resource Assignment File - val resourceAssignmentProperties = enhanceResourceAssignmentFile(absoluteFilePath) + val resourceAssignmentProperties = enhanceResourceAssignmentFile(fileName!!) // Add Workflow Dynamic DataType addWorkFlowDynamicDataType(name, resourceAssignmentProperties) } } } - private fun enhanceResourceAssignmentFile(filePath: String): MutableMap { + // Enhancement for Dynamic Properties, Resource Assignment Properties, Resource Sources + private fun enhanceResourceAssignmentFile(fileName: String): MutableMap { + + val filePath = "${bluePrintContext.rootPath}/$fileName" + + log.info("enriching artifacts file(${filePath}") val resourceAssignmentProperties: MutableMap = hashMapOf() @@ -133,8 +138,16 @@ open class BluePrintWorkflowEnhancerImpl(private val bluePrintRepoService: BlueP as? MutableList ?: throw BluePrintProcessorException("couldn't get ResourceAssignment definitions for the file($filePath)") - // Call Resource Assignment Enhancer - resourceAssignmentEnhancerService.enhanceBluePrint(bluePrintTypeEnhancerService, bluePrintRuntimeService, resourceAssignments) + val alreadyEnhancedKey = "enhanced-$fileName" + val alreadyEnhanced = bluePrintRuntimeService.check(alreadyEnhancedKey) + + log.info("enhancing workflow resource mapping file($fileName) already enhanced($alreadyEnhanced)") + + if (!alreadyEnhanced) { + // Call Resource Assignment Enhancer + resourceAssignmentEnhancerService.enhanceBluePrint(bluePrintTypeEnhancerService, bluePrintRuntimeService, resourceAssignments) + bluePrintRuntimeService.put(alreadyEnhancedKey, true.asJsonPrimitive()) + } resourceAssignments.forEach { resourceAssignment -> resourceAssignmentProperties[resourceAssignment.name] = resourceAssignment.property!! @@ -159,7 +172,7 @@ open class BluePrintWorkflowEnhancerImpl(private val bluePrintRepoService: BlueP var recipeDataType: DataType? = bluePrintContext.serviceTemplate.dataTypes?.get(dataTypeName) if (recipeDataType == null) { - log.info("DataType not present for the recipe({})", dataTypeName) + log.info("dataType not present for the recipe({})", dataTypeName) recipeDataType = DataType() recipeDataType.version = "1.0.0" recipeDataType.description = "Dynamic DataType definition for workflow($workflowName)." @@ -172,7 +185,7 @@ open class BluePrintWorkflowEnhancerImpl(private val bluePrintRepoService: BlueP bluePrintContext.serviceTemplate.dataTypes?.put(dataTypeName, recipeDataType) } else { - log.info("Dynamic dataType($dataTypeName) already present for workflow($workflowName).") + log.info("dynamic dataType($dataTypeName) already present for workflow($workflowName).") } // Merge all the Recipe Properties mappingProperties.forEach { propertyName, propertyDefinition -> diff --git a/ms/controllerblueprints/modules/service/src/test/resources/enhance/enhanced-template.json b/ms/controllerblueprints/modules/service/src/test/resources/enhance/enhanced-template.json index 5e41a507..b13932b7 100644 --- a/ms/controllerblueprints/modules/service/src/test/resources/enhance/enhanced-template.json +++ b/ms/controllerblueprints/modules/service/src/test/resources/enhance/enhanced-template.json @@ -11,611 +11,8 @@ "tosca_definitions_version" : "controller_blueprint_1_0_0", "artifact_types" : { }, "data_types" : { - "dt-v4-aggregate" : { - "description" : "This is dt-v4-aggregate Data Type", - "version" : "1.0.0", - "properties" : { - "ipv4-address" : { - "required" : true, - "type" : "string" - }, - "ipv4-plen" : { - "required" : false, - "type" : "integer" - } - }, - "derived_from" : "tosca.datatypes.Root" - }, - "dt-license-key" : { - "description" : "This is dt-plicense-key Data Type", - "version" : "1.0.0", - "properties" : { - "license-key" : { - "required" : true, - "type" : "string" - } - }, - "derived_from" : "tosca.datatypes.Root" - }, - "datatype-resource-assignment" : { - "description" : "This is Resource Assignment Data Type", - "version" : "1.0.0", - "properties" : { - "property" : { - "required" : true, - "type" : "datatype-property" - }, - "input-param" : { - "required" : true, - "type" : "boolean" - }, - "dictionary-name" : { - "required" : false, - "type" : "string" - }, - "dictionary-source" : { - "required" : false, - "type" : "string" - }, - "dependencies" : { - "required" : true, - "type" : "list", - "entry_schema" : { - "type" : "string" - } - }, - "status" : { - "required" : false, - "type" : "string" - }, - "message" : { - "required" : false, - "type" : "string" - }, - "updated-date" : { - "required" : false, - "type" : "string" - }, - "updated-by" : { - "required" : false, - "type" : "string" - } - }, - "derived_from" : "tosca.datatypes.Root" - }, - "datatype-property" : { - "description" : "This is Entry point Input Data Type, which is dynamic datatype, The parameter names will be populated during the Design time for each inputs", - "version" : "1.0.0", - "properties" : { - "type" : { - "required" : true, - "type" : "string" - }, - "description" : { - "required" : false, - "type" : "string" - }, - "required" : { - "required" : false, - "type" : "boolean" - }, - "default" : { - "required" : false, - "type" : "string" - }, - "entry_schema" : { - "required" : false, - "type" : "string" - } - }, - "derived_from" : "tosca.datatypes.Root" - }, - "dt-resource-assignment-request" : { - "description" : "This is Dynamic Data type definition generated from resource mapping for the config template name base-config-template.", - "version" : "1.0.0", - "properties" : { - "hostname" : { - "required" : true, - "type" : "string" - }, - "licenses" : { - "required" : true, - "type" : "list", - "entry_schema" : { - "type" : "dt-license-key" - } - }, - "rs-db-source" : { - "required" : true, - "type" : "string" - }, - "service" : { - "required" : true, - "type" : "string" - }, - "service-instance-id" : { - "required" : true, - "type" : "string" - }, - "mdsal-source" : { - "description" : "", - "required" : true, - "type" : "list", - "entry_schema" : { - "type" : "dt-v4-aggregate" - } - } - }, - "derived_from" : "tosca.datatypes.Dynamic" - } }, "node_types" : { - "dg-resource-assignment" : { - "description" : "This is Resource Assignment Directed Graph", - "version" : "1.0.0", - "properties" : { - "mode" : { - "required" : false, - "type" : "string", - "default" : "sync" - }, - "version" : { - "required" : false, - "type" : "string", - "default" : "LATEST" - }, - "is-start-flow" : { - "required" : false, - "type" : "boolean", - "default" : false - } - }, - "capabilities" : { - "dg-node" : { - "type" : "tosca.capabilities.Node" - } - }, - "requirements" : { - "component-dependency" : { - "capability" : "component-node", - "node" : "component-resource-assignment", - "relationship" : "tosca.relationships.DependsOn" - } - }, - "interfaces" : { - "CONFIG" : { - "operations" : { - "ResourceAssignment" : { - "inputs" : { - "params" : { - "required" : false, - "type" : "list", - "entry_schema" : { - "type" : "datatype-property" - } - } - } - } - } - } - }, - "derived_from" : "tosca.nodes.DG" - }, - "tosca.nodes.Component" : { - "description" : "This is default Component Node", - "version" : "1.0.0", - "derived_from" : "tosca.nodes.Root" - }, - "artifact-config-template" : { - "description" : "This is Configuration Velocity Template", - "version" : "1.0.0", - "properties" : { - "action-names" : { - "required" : true, - "type" : "list", - "entry_schema" : { - "type" : "string" - } - } - }, - "capabilities" : { - "content" : { - "type" : "tosca.capabilities.Content", - "properties" : { - "content" : { - "required" : true, - "type" : "string" - } - } - }, - "mapping" : { - "type" : "tosca.capabilities.Mapping", - "properties" : { - "mapping" : { - "required" : false, - "type" : "list", - "entry_schema" : { - "type" : "datatype-resource-assignment" - } - } - } - } - }, - "derived_from" : "tosca.nodes.Artifact" - }, - "tosca.nodes.Vnf" : { - "description" : "This is VNF Node Type", - "version" : "1.0.0", - "derived_from" : "tosca.nodes.Root" - }, - "tosca.nodes.Artifact" : { - "description" : "This is Deprecated Artifact Node Type.", - "version" : "1.0.0", - "derived_from" : "tosca.nodes.Root" - }, - "dg-activate-netconf" : { - "description" : "This is Download Netconf Directed Graph", - "version" : "1.0.0", - "properties" : { - "mode" : { - "required" : false, - "type" : "string", - "default" : "sync" - }, - "version" : { - "required" : false, - "type" : "string", - "default" : "LATEST" - }, - "is-start-flow" : { - "required" : false, - "type" : "boolean", - "default" : false - } - }, - "capabilities" : { - "dg-node" : { - "type" : "tosca.capabilities.Node" - } - }, - "requirements" : { - "component-dependency" : { - "capability" : "component-node", - "node" : "component-netconf-executor", - "relationship" : "tosca.relationships.DependsOn" - } - }, - "interfaces" : { - "CONFIG" : { - "operations" : { - "ActivateNetconf" : { - "inputs" : { - "params" : { - "required" : false, - "type" : "list", - "entry_schema" : { - "type" : "datatype-property" - } - } - } - } - } - } - }, - "derived_from" : "tosca.nodes.DG" - }, - "source-input" : { - "description" : "This is Input Resource Source Node Type", - "version" : "1.0.0", - "properties" : { - "key" : { - "required" : false, - "type" : "string" - }, - "key-dependencies" : { - "required" : true, - "type" : "list", - "entry_schema" : { - "type" : "string" - } - } - }, - "derived_from" : "tosca.nodes.ResourceSource" - }, - "tosca.nodes.ResourceSource" : { - "description" : "TOSCA base type for Resource Sources", - "version" : "1.0.0", - "derived_from" : "tosca.nodes.Root" - }, - "component-resource-assignment" : { - "description" : "This is Resource Assignment Component API", - "version" : "1.0.0", - "capabilities" : { - "component-node" : { - "type" : "tosca.capabilities.Node" - } - }, - "interfaces" : { - "ResourceAssignmentComponent" : { - "operations" : { - "process" : { - "inputs" : { - "template-name" : { - "description" : "Service Template Name.", - "required" : true, - "type" : "string" - }, - "template-version" : { - "description" : "Service Template Version.", - "required" : true, - "type" : "string" - }, - "resource-type" : { - "description" : "Request type.", - "required" : true, - "type" : "string" - }, - "template-names" : { - "description" : "Name of the artifact Node Templates, to get the template Content.", - "required" : true, - "type" : "list", - "entry_schema" : { - "type" : "string" - } - }, - "request-id" : { - "description" : "Request Id, Unique Id for the request.", - "required" : true, - "type" : "string" - }, - "resource-id" : { - "description" : "Resource Id.", - "required" : true, - "type" : "string" - }, - "action-name" : { - "description" : "Action Name of the process", - "required" : true, - "type" : "string" - } - }, - "outputs" : { - "resource-assignment-params" : { - "required" : true, - "type" : "string" - }, - "status" : { - "required" : true, - "type" : "string" - } - } - } - } - } - }, - "derived_from" : "tosca.nodes.Component" - }, - "tosca.nodes.component.Jython" : { - "description" : "This is Jython Component", - "version" : "1.0.0", - "derived_from" : "tosca.nodes.Root" - }, - "tosca.nodes.DG" : { - "description" : "This is Directed Graph Node Type", - "version" : "1.0.0", - "derived_from" : "tosca.nodes.Root" - }, - "source-db" : { - "description" : "This is Database Resource Source Node Type", - "version" : "1.0.0", - "properties" : { - "type" : { - "required" : true, - "type" : "string", - "constraints" : [ { - "valid_values" : [ "SQL", "PLSQL" ] - } ] - }, - "query" : { - "required" : true, - "type" : "string" - }, - "input-key-mapping" : { - "required" : false, - "type" : "map", - "entry_schema" : { - "type" : "string" - } - }, - "output-key-mapping" : { - "required" : false, - "type" : "map", - "entry_schema" : { - "type" : "string" - } - }, - "key-dependencies" : { - "required" : true, - "type" : "list", - "entry_schema" : { - "type" : "string" - } - } - }, - "derived_from" : "tosca.nodes.ResourceSource" - }, - "vnf-netconf-device" : { - "description" : "This is VNF Device with Netconf Capability", - "version" : "1.0.0", - "capabilities" : { - "netconf" : { - "type" : "tosca.capabilities.Netconf", - "properties" : { - "login-key" : { - "required" : true, - "type" : "string", - "default" : "sdnc" - }, - "login-account" : { - "required" : true, - "type" : "string", - "default" : "sdnc-tacacs" - }, - "source" : { - "required" : true, - "type" : "string", - "default" : "npm" - }, - "target-ip-address" : { - "required" : true, - "type" : "string" - }, - "port-number" : { - "required" : true, - "type" : "integer", - "default" : 830 - }, - "connection-time-out" : { - "required" : false, - "type" : "integer", - "default" : 30 - } - } - } - }, - "derived_from" : "tosca.nodes.Vnf" - }, - "source-rest" : { - "description" : "This is Rest Resource Source Node Type", - "version" : "1.0.0", - "properties" : { - "type" : { - "required" : false, - "type" : "string", - "constraints" : [ { - "valid_values" : [ "JSON" ] - } ], - "default" : "JSON" - }, - "url-path" : { - "required" : true, - "type" : "string" - }, - "path" : { - "required" : true, - "type" : "string" - }, - "expression-type" : { - "required" : false, - "type" : "string", - "constraints" : [ { - "valid_values" : [ "JSON_PATH", "JSON_POINTER" ] - } ], - "default" : "JSON_PATH" - }, - "input-key-mapping" : { - "required" : false, - "type" : "map", - "entry_schema" : { - "type" : "string" - } - }, - "output-key-mapping" : { - "required" : false, - "type" : "map", - "entry_schema" : { - "type" : "string" - } - }, - "key-dependencies" : { - "required" : true, - "type" : "list", - "entry_schema" : { - "type" : "string" - } - } - }, - "derived_from" : "tosca.nodes.ResourceSource" - }, - "component-netconf-executor" : { - "description" : "This is Netconf Transaction Configuration Component API", - "version" : "1.0.0", - "capabilities" : { - "component-node" : { - "type" : "tosca.capabilities.Node" - } - }, - "requirements" : { - "netconf-connection" : { - "capability" : "netconf", - "node" : "vnf-netconf-device", - "relationship" : "tosca.relationships.ConnectsTo" - } - }, - "interfaces" : { - "NetconfExecutorComponent" : { - "operations" : { - "process" : { - "inputs" : { - "request-id" : { - "description" : "Request Id used to store the generated configuration, in the database along with the template-name", - "required" : true, - "type" : "string" - }, - "template-name" : { - "description" : "Service Template Name", - "required" : true, - "type" : "string" - }, - "template-version" : { - "description" : "Service Template Version", - "required" : true, - "type" : "string" - }, - "action-name" : { - "description" : "Action Name to get from Database, Either (message & mask-info ) or ( resource-id & resource-type & action-name & template-name ) should be present. Message will be given higest priority", - "required" : false, - "type" : "string" - }, - "resource-type" : { - "description" : "Resource Type to get from Database, Either (message & mask-info ) or( resource-id & resource-type & action-name & template-name ) should be present. Message will be given higest priority", - "required" : false, - "type" : "string" - }, - "resource-id" : { - "description" : "Resource Id to get from Database, Either (message & mask-info ) or ( resource-id & resource-type & action-name & template-name ) should be present. Message will be given higest priority", - "required" : false, - "type" : "string" - }, - "reservation-id" : { - "description" : "Reservation Id used to send to NPM", - "required" : false, - "type" : "string" - }, - "execution-script" : { - "description" : "Python Script to Execute for this Component action, It should refer any one of Prython Artifact Definition for this Node Template.", - "required" : true, - "type" : "string" - } - }, - "outputs" : { - "response-data" : { - "description" : "Execution Response Data in JSON format.", - "required" : false, - "type" : "string" - }, - "status" : { - "description" : "Status of the Component Execution ( success or failure )", - "required" : true, - "type" : "string" - } - } - } - } - } - }, - "derived_from" : "tosca.nodes.component.Jython" - } }, "topology_template" : { "inputs" : { -- cgit 1.2.3-korg