diff options
Diffstat (limited to 'ms')
19 files changed, 733 insertions, 169 deletions
diff --git a/ms/blueprintsprocessor/functions/pom.xml b/ms/blueprintsprocessor/functions/pom.xml index 24cc352c9..3f948061f 100755 --- a/ms/blueprintsprocessor/functions/pom.xml +++ b/ms/blueprintsprocessor/functions/pom.xml @@ -47,6 +47,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>org.mock-server</groupId> + <artifactId>mockserver-netty</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <scope>test</scope> diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessor.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessor.kt index 9852e3438..2d726d487 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessor.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessor.kt @@ -101,7 +101,7 @@ open class RestResourceResolutionProcessor(private val blueprintRestLibPropertyS } } - private fun blueprintWebClientService(resourceAssignment: ResourceAssignment, + fun blueprintWebClientService(resourceAssignment: ResourceAssignment, restResourceSource: RestResourceSource): BlueprintWebClientService { return if (isNotEmpty(restResourceSource.endpointSelector)) { val restPropertiesJson = raRuntimeService.resolveDSLExpression(restResourceSource.endpointSelector!!) @@ -195,12 +195,8 @@ open class RestResourceResolutionProcessor(private val blueprintRestLibPropertyS checkNotEmpty(resourceAssignment.dictionaryName) { "resource assignment dictionary name is not defined for template key (${resourceAssignment.name})" } - checkEquals(ResourceDictionaryConstants.SOURCE_PRIMARY_CONFIG_DATA, resourceAssignment.dictionarySource) { - "resource assignment source is not ${ResourceDictionaryConstants.SOURCE_PRIMARY_CONFIG_DATA} but it is " + - "${resourceAssignment.dictionarySource}" - } - checkNotEmpty(resourceAssignment.dictionaryName) { - "resource assignment dictionary name is not defined for template key (${resourceAssignment.name})" + checkNotEmpty(resourceAssignment.dictionarySource) { + "resource assignment dictionary source is not defined for template key (${resourceAssignment.name})" } } @@ -208,5 +204,4 @@ open class RestResourceResolutionProcessor(private val blueprintRestLibPropertyS raRuntimeService.getBluePrintError().addError(runtimeException.message!!) } - }
\ No newline at end of file diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionServiceTest.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionServiceTest.kt index 3f251b104..9c2a100bc 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionServiceTest.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionServiceTest.kt @@ -128,7 +128,7 @@ class ResourceResolutionServiceTest { val artifactPrefix = "another" - // Velocity Artifact Definition Name + // Templating Artifact Definition Name val artifactTemplate = "$artifactPrefix-template" // Resource Assignment Artifact Definition Name val artifactMapping = "$artifactPrefix-mapping" diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/mock/MockBlueprintResLibPropertyService.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/mock/MockBlueprintResLibPropertyService.kt new file mode 100644 index 000000000..b79f48682 --- /dev/null +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/mock/MockBlueprintResLibPropertyService.kt @@ -0,0 +1,36 @@ +/* + * Copyright © 2019 IBM, Bell Canada. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.mock + +import org.onap.ccsdk.cds.blueprintsprocessor.core.BluePrintProperties +import org.onap.ccsdk.cds.blueprintsprocessor.rest.RestClientProperties +import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.BluePrintRestLibPropertyService + +class MockBluePrintRestLibPropertyService(bluePrintProperties: BluePrintProperties) : + BluePrintRestLibPropertyService(bluePrintProperties) { + + fun mockBlueprintWebClientService (selector: String): + MockBlueprintWebClientService { + val prefix = "blueprintsprocessor.restclient.$selector" + val restClientProperties = restClientProperties(prefix) + return mockBlueprintWebClientService(restClientProperties) + } + + private fun mockBlueprintWebClientService(restClientProperties: RestClientProperties): + MockBlueprintWebClientService { + return MockBlueprintWebClientService(restClientProperties) + } +}
\ No newline at end of file diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/mock/MockBlueprintWebClientService.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/mock/MockBlueprintWebClientService.kt new file mode 100644 index 000000000..c6ca41351 --- /dev/null +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/mock/MockBlueprintWebClientService.kt @@ -0,0 +1,124 @@ +/* + * Copyright © 2019 IBM, Bell Canada. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.mock + +import org.apache.http.message.BasicHeader +import org.mockserver.integration.ClientAndServer +import org.mockserver.model.Header +import org.mockserver.model.HttpRequest.request +import org.mockserver.model.HttpResponse.response +import org.onap.ccsdk.cds.blueprintsprocessor.rest.RestClientProperties +import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.BlueprintWebClientService +import org.springframework.http.HttpHeaders +import org.springframework.http.MediaType +import java.nio.charset.Charset +import java.util.* + +class MockBlueprintWebClientService(private var restClientProperties: RestClientProperties): BlueprintWebClientService { + private var mockServer: ClientAndServer + private var port: String = if (restClientProperties.url.split(":")[2].isEmpty()) "8080" + else restClientProperties.url.split(":")[2] + private var headers: Map<String, String> + + init { + mockServer = ClientAndServer.startClientAndServer(port.toInt()) + headers = defaultHeaders() + + // Create expected requests and responses + setRequest("GET", "/aai/v14/network/generic-vnfs/generic-vnf/123456") + setRequest("GET", "/config/GENERIC-RESOURCE-API:services/service/10/service-data/vnfs/vnf/123456/" + + "vnf-data/vnf-topology/vnf-parameters-data/param/vnf_name") + setRequestWithPayload("PUT", "/query", + "{\r\n\"start\": \"\\/nodes\\/vf-modules?vf-module-name=vf-module-name\",\r\n\"query\": \"\\/query\\/related-to?startingNodeType=vf-module&relatedToNodeType=generic-vnf\"\r\n}") + } + + override fun defaultHeaders(): Map<String, String> { + val encodedCredentials = this.setBasicAuth("admin", "aaiTest") + return mapOf( + HttpHeaders.CONTENT_TYPE to MediaType.APPLICATION_JSON_VALUE, + HttpHeaders.ACCEPT to MediaType.APPLICATION_JSON_VALUE, + HttpHeaders.AUTHORIZATION to "Basic $encodedCredentials") + } + + override fun host(uri: String): String { + return restClientProperties.url + uri + } + + fun tearDown() { + mockServer.close() + } + + override fun exchangeResource(method: String, path: String, payload: String): String { + val header = arrayOf(BasicHeader(HttpHeaders.AUTHORIZATION, headers[HttpHeaders.AUTHORIZATION])) + return when (method) { + "POST" -> { + post(path, payload, header) + } + "PUT" -> { + put(path, payload, header) + } + else -> { + get(path, header) + } + } + } + + private fun setRequest(method: String, path: String) { + val requestResponse = when (method) { + "POST" -> { + "Post response" + } + "PUT" -> { + "Put response" + } + else -> { + "Get response" + } + + } + mockServer.`when`(request().withHeaders(Header(HttpHeaders.AUTHORIZATION, headers[HttpHeaders.AUTHORIZATION])) + .withMethod(method) + .withPath(path) + ).respond(response().withStatusCode(200).withBody("{\"aai-resource\":\"$requestResponse\"}")) + } + + private fun setRequestWithPayload(method: String, path: String, payload: String) { + val requestResponse = when (method) { + "POST" -> { + "Post response" + } + "PUT" -> { + "Put response" + } + else -> { + "Get response" + } + + } + mockServer.`when`(request().withHeaders(Header(HttpHeaders.AUTHORIZATION, headers[HttpHeaders.AUTHORIZATION])) + .withMethod(method) + .withPath(path) + .withQueryStringParameter("format", "resource") + .withBody(payload) + ).respond(response().withStatusCode(200).withBody("{\"aai-resource\":\"$requestResponse\"}")) + } + + private fun setBasicAuth(username: String, password: String): String { + val credentialsString = "$username:$password" + return Base64.getEncoder().encodeToString( + credentialsString.toByteArray(Charset.defaultCharset())) + } +}
\ No newline at end of file diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/mock/MockRestResourceResolutionProcessor.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/mock/MockRestResourceResolutionProcessor.kt new file mode 100644 index 000000000..2c481dca3 --- /dev/null +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/mock/MockRestResourceResolutionProcessor.kt @@ -0,0 +1,159 @@ +/* + * Copyright © 2019 IBM, Bell Canada. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.mock + +import com.fasterxml.jackson.databind.node.ArrayNode +import com.fasterxml.jackson.databind.node.MissingNode +import org.apache.commons.collections.MapUtils +import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.ResourceResolutionConstants +import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.RestResourceSource +import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.processor.ResourceAssignmentProcessor +import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.utils.ResourceAssignmentUtils +import org.onap.ccsdk.cds.controllerblueprints.core.* +import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils +import org.onap.ccsdk.cds.controllerblueprints.resource.dict.ResourceAssignment +import org.slf4j.LoggerFactory +import java.util.HashMap + +class MockRestResourceResolutionProcessor(private val blueprintRestLibPropertyService: + MockBluePrintRestLibPropertyService): ResourceAssignmentProcessor() { + + private val logger = LoggerFactory.getLogger(MockRestResourceResolutionProcessor::class.java) + + override fun resolveInputKeyMappingVariables(inputKeyMapping: Map<String, String>): Map<String, Any> { + val resolvedInputKeyMapping = HashMap<String, Any>() + if (MapUtils.isNotEmpty(inputKeyMapping)) { + resolvedInputKeyMapping["service-instance-id"] = "10" + resolvedInputKeyMapping["vnf_name"] = "vnf1" + resolvedInputKeyMapping["vnf-id"] = "123456" + } + return resolvedInputKeyMapping + } + + override fun getName(): String { + return "${ResourceResolutionConstants.PREFIX_RESOURCE_RESOLUTION_PROCESSOR}source-rest" + } + + override suspend fun processNB(executionRequest: ResourceAssignment) { + try { + // Check if It has Input + val value = getFromInput(executionRequest) + if (value == null || value is MissingNode) { + val dName = executionRequest.dictionaryName + val dSource = executionRequest.dictionarySource + val resourceDefinition = resourceDictionaries[dName] + + val resourceSource = resourceDefinition!!.sources[dSource] + + val resourceSourceProperties = resourceSource!!.properties + + val sourceProperties = + JacksonUtils.getInstanceFromMap(resourceSourceProperties!!, RestResourceSource::class.java) + + val path = nullToEmpty(sourceProperties.path) + val inputKeyMapping = sourceProperties.inputKeyMapping + + val resolvedInputKeyMapping = resolveInputKeyMappingVariables(inputKeyMapping!!).toMutableMap() + + // Resolving content Variables + val payload = resolveFromInputKeyMapping(nullToEmpty(sourceProperties.payload), resolvedInputKeyMapping) + val urlPath = + resolveFromInputKeyMapping(checkNotNull(sourceProperties.urlPath), resolvedInputKeyMapping) + val verb = resolveFromInputKeyMapping(nullToEmpty(sourceProperties.verb), resolvedInputKeyMapping) + + logger.info("$dSource dictionary information : ($urlPath), ($inputKeyMapping), (${sourceProperties.outputKeyMapping})") + + // Get the Rest Client Service + val restClientService = blueprintWebClientService(executionRequest) + + val response = restClientService.exchangeResource(verb, urlPath, payload) + if (response.isEmpty()) { + logger.warn("Failed to get $dSource result for dictionary name ($dName) using urlPath ($urlPath)") + } else { + populateResource(executionRequest, sourceProperties, response, path) + restClientService.tearDown() + } + } + } catch (e: Exception) { + ResourceAssignmentUtils.setFailedResourceDataValue(executionRequest, e.message) + throw BluePrintProcessorException("Failed in template key ($executionRequest) assignments with: ${e.message}", + e) + } + } + + override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: ResourceAssignment) { + raRuntimeService.getBluePrintError().addError(runtimeException.message!!) + } + + private fun blueprintWebClientService(resourceAssignment: ResourceAssignment): MockBlueprintWebClientService { + return blueprintRestLibPropertyService.mockBlueprintWebClientService(resourceAssignment.dictionarySource!!) + } + + @Throws(BluePrintProcessorException::class) + private fun populateResource(resourceAssignment: ResourceAssignment, sourceProperties: RestResourceSource, + restResponse: String, path: String) { + val type = nullToEmpty(resourceAssignment.property?.type) + lateinit var entrySchemaType: String + + val outputKeyMapping = sourceProperties.outputKeyMapping + + val responseNode = JacksonUtils.jsonNode(restResponse).at(path) + + when (type) { + in BluePrintTypes.validPrimitiveTypes() -> { + ResourceAssignmentUtils.setResourceDataValue(resourceAssignment, raRuntimeService, responseNode) + } + in BluePrintTypes.validCollectionTypes() -> { + // Array Types + entrySchemaType = resourceAssignment.property!!.entrySchema!!.type + val arrayNode = responseNode as ArrayNode + + if (entrySchemaType !in BluePrintTypes.validPrimitiveTypes()) { + val responseArrayNode = responseNode.toList() + for (responseSingleJsonNode in responseArrayNode) { + + val arrayChildNode = JacksonUtils.objectMapper.createObjectNode() + + outputKeyMapping!!.map { + val responseKeyValue = responseSingleJsonNode.get(it.key) + val propertyTypeForDataType = ResourceAssignmentUtils + .getPropertyType(raRuntimeService, entrySchemaType, it.key) + + JacksonUtils.populateJsonNodeValues(it.value, + responseKeyValue, propertyTypeForDataType, arrayChildNode) + } + arrayNode.add(arrayChildNode) + } + } + // Set the List of Complex Values + ResourceAssignmentUtils.setResourceDataValue(resourceAssignment, raRuntimeService, arrayNode) + } + else -> { + // Complex Types + entrySchemaType = resourceAssignment.property!!.type + val objectNode = JacksonUtils.objectMapper.createObjectNode() + outputKeyMapping!!.map { + val responseKeyValue = responseNode.get(it.key) + val propertyTypeForDataType = ResourceAssignmentUtils + .getPropertyType(raRuntimeService, entrySchemaType, it.key) + JacksonUtils.populateJsonNodeValues(it.value, responseKeyValue, propertyTypeForDataType, objectNode) + } + // Set the List of Complex Values + ResourceAssignmentUtils.setResourceDataValue(resourceAssignment, raRuntimeService, objectNode) + } + } + } +}
\ No newline at end of file diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/CapabilityResourceResolutionProcessorTest.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/CapabilityResourceResolutionProcessorTest.kt index 2af15c2be..66fdd8ff8 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/CapabilityResourceResolutionProcessorTest.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/CapabilityResourceResolutionProcessorTest.kt @@ -123,7 +123,6 @@ class CapabilityResourceResolutionProcessorTest { println(processorName) } } - } open class MockCapabilityService { diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessorTest.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessorTest.kt index 08174ed47..7e7e65635 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessorTest.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessorTest.kt @@ -16,13 +16,15 @@ package org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.processor import kotlinx.coroutines.runBlocking -import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import org.onap.ccsdk.cds.blueprintsprocessor.core.BluePrintProperties import org.onap.ccsdk.cds.blueprintsprocessor.core.BlueprintPropertyConfiguration import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.ResourceAssignmentRuntimeService +import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.mock.MockBluePrintRestLibPropertyService +import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.mock.MockRestResourceResolutionProcessor import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.utils.ResourceAssignmentUtils +import org.onap.ccsdk.cds.blueprintsprocessor.rest.RestClientProperties import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.BluePrintRestLibPropertyService import org.onap.ccsdk.cds.controllerblueprints.core.data.PropertyDefinition import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintMetadataUtils @@ -31,18 +33,25 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.test.context.ContextConfiguration import org.springframework.test.context.TestPropertySource import org.springframework.test.context.junit4.SpringRunner +import kotlin.test.AfterTest +import kotlin.test.BeforeTest import kotlin.test.assertNotNull @RunWith(SpringRunner::class) -@ContextConfiguration(classes = [RestResourceResolutionProcessor::class, BluePrintRestLibPropertyService::class, - BlueprintPropertyConfiguration::class, BluePrintProperties::class]) +@ContextConfiguration(classes = [MockRestResourceResolutionProcessor::class, MockBluePrintRestLibPropertyService::class, + BlueprintPropertyConfiguration::class, BluePrintProperties::class, RestClientProperties::class]) @TestPropertySource(locations = ["classpath:application-test.properties"]) class RestResourceResolutionProcessorTest { - @Autowired - lateinit var restResourceResolutionProcessor: RestResourceResolutionProcessor + lateinit var bluePrintRestLibPropertyService: MockBluePrintRestLibPropertyService + + private lateinit var restResourceResolutionProcessor: MockRestResourceResolutionProcessor + + @BeforeTest + fun init(){ + restResourceResolutionProcessor = MockRestResourceResolutionProcessor(bluePrintRestLibPropertyService) + } - @Ignore @Test fun `test rest resource resolution`() { runBlocking { @@ -55,7 +64,11 @@ class RestResourceResolutionProcessorTest { restResourceResolutionProcessor.resourceDictionaries = ResourceAssignmentUtils .resourceDefinitions(bluePrintContext.rootPath) - //TODO ("Mock the dependency values and rest service.") + val scriptPropertyInstances: MutableMap<String, Any> = mutableMapOf() + scriptPropertyInstances["mock-service1"] = MockCapabilityService() + scriptPropertyInstances["mock-service2"] = MockCapabilityService() + + restResourceResolutionProcessor.scriptPropertyInstances = scriptPropertyInstances val resourceAssignment = ResourceAssignment().apply { name = "rr-name" @@ -71,4 +84,70 @@ class RestResourceResolutionProcessorTest { println(processorName) } } + + @Test + fun `test rest aai get resource resolution`() { + runBlocking { + val bluePrintContext = BluePrintMetadataUtils.getBluePrintContext( + "./../../../../components/model-catalog/blueprint-model/test-blueprint/baseconfiguration") + + val resourceAssignmentRuntimeService = ResourceAssignmentRuntimeService("1234", bluePrintContext) + + restResourceResolutionProcessor.raRuntimeService = resourceAssignmentRuntimeService + restResourceResolutionProcessor.resourceDictionaries = ResourceAssignmentUtils + .resourceDefinitions(bluePrintContext.rootPath) + + val scriptPropertyInstances: MutableMap<String, Any> = mutableMapOf() + scriptPropertyInstances["mock-service1"] = MockCapabilityService() + scriptPropertyInstances["mock-service2"] = MockCapabilityService() + + restResourceResolutionProcessor.scriptPropertyInstances = scriptPropertyInstances + + val resourceAssignment = ResourceAssignment().apply { + name = "rr-aai" + dictionaryName = "aai-get-resource" + dictionarySource = "primary-aai-data" + property = PropertyDefinition().apply { + type = "string" + } + } + + val processorName = restResourceResolutionProcessor.applyNB(resourceAssignment) + assertNotNull(processorName, "couldn't get AAI Rest resource assignment processor name") + println(processorName) + } + } + + @Test + fun `test rest aai put resource resolution`() { + runBlocking { + val bluePrintContext = BluePrintMetadataUtils.getBluePrintContext( + "./../../../../components/model-catalog/blueprint-model/test-blueprint/baseconfiguration") + + val resourceAssignmentRuntimeService = ResourceAssignmentRuntimeService("1234", bluePrintContext) + + restResourceResolutionProcessor.raRuntimeService = resourceAssignmentRuntimeService + restResourceResolutionProcessor.resourceDictionaries = ResourceAssignmentUtils + .resourceDefinitions(bluePrintContext.rootPath) + + val scriptPropertyInstances: MutableMap<String, Any> = mutableMapOf() + scriptPropertyInstances["mock-service1"] = MockCapabilityService() + scriptPropertyInstances["mock-service2"] = MockCapabilityService() + + restResourceResolutionProcessor.scriptPropertyInstances = scriptPropertyInstances + + val resourceAssignment = ResourceAssignment().apply { + name = "rr-aai" + dictionaryName = "aai-put-resource" + dictionarySource = "primary-aai-data" + property = PropertyDefinition().apply { + type = "string" + } + } + + val processorName = restResourceResolutionProcessor.applyNB(resourceAssignment) + assertNotNull(processorName, "couldn't get AAI Rest resource assignment processor name") + println(processorName) + } + } }
\ No newline at end of file diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/test/resources/application-test.properties b/ms/blueprintsprocessor/functions/resource-resolution/src/test/resources/application-test.properties index 071b27afc..5deea31e1 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/test/resources/application-test.properties +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/test/resources/application-test.properties @@ -28,4 +28,14 @@ blueprintsprocessor.blueprintArchivePath=./target/blueprints/archive blueprintsprocessor.blueprintWorkingPath=./target/blueprints/work # Python executor blueprints.processor.functions.python.executor.executionPath=./../../../../components/scripts/python/ccsdk_blueprints -blueprints.processor.functions.python.executor.modulePaths=./../../../../components/scripts/python/ccsdk_blueprints
\ No newline at end of file +blueprints.processor.functions.python.executor.modulePaths=./../../../../components/scripts/python/ccsdk_blueprints + +blueprintsprocessor.restclient.primary-config-data.type=basic-auth +blueprintsprocessor.restclient.primary-config-data.url=http://127.0.0.1:9911 +blueprintsprocessor.restclient.primary-config-data.username=sampleuser +blueprintsprocessor.restclient.primary-config-data.password=sampletoken + +blueprintsprocessor.restclient.primary-aai-data.type=basic-auth +blueprintsprocessor.restclient.primary-aai-data.url=http://127.0.0.1:30800 +blueprintsprocessor.restclient.primary-aai-data.username=admin +blueprintsprocessor.restclient.primary-aai-data.password=aaiTest
\ No newline at end of file diff --git a/ms/blueprintsprocessor/parent/pom.xml b/ms/blueprintsprocessor/parent/pom.xml index e6901354a..42abbc51d 100755 --- a/ms/blueprintsprocessor/parent/pom.xml +++ b/ms/blueprintsprocessor/parent/pom.xml @@ -51,6 +51,7 @@ <mockk.version>1.9</mockk.version> <dmaap.client.version>1.1.5</dmaap.client.version> <jinja.version>2.5.0</jinja.version> + <mockkserver.version>5.5.1</mockkserver.version> </properties> <dependencyManagement> <dependencies> @@ -407,6 +408,12 @@ <scope>test</scope> </dependency> <dependency> + <groupId>org.mock-server</groupId> + <artifactId>mockserver-netty</artifactId> + <version>${mockkserver.version}</version> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <version>${powermock.version}</version> diff --git a/ms/cds-sdc-listener/application/pom.xml b/ms/cds-sdc-listener/application/pom.xml index cbf8ca879..3f8e1a319 100644 --- a/ms/cds-sdc-listener/application/pom.xml +++ b/ms/cds-sdc-listener/application/pom.xml @@ -6,41 +6,42 @@ ~ proprietary to Bell Canada and are protected by trade secret or copyright law. ~ Unauthorized copying of this file, via any medium is strictly prohibited. --> -<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-1-starter-parent</artifactId> + <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.2-SNAPSHOT</version> - <relativePath/> </parent> - <modelVersion>4.0.0</modelVersion> <groupId>org.onap.ccsdk.cds</groupId> + <modelVersion>4.0.0</modelVersion> <artifactId>cds-sdc-listener-application</artifactId> <version>0.4.2-SNAPSHOT</version> - <name>CDS-SDC Listener Application </name> + <name>CDS-SDC Listener Application</name> <properties> <grpc.version>1.17.1</grpc.version> <protobuf.version>3.6.1</protobuf.version> + <image.name>onap/ccsdk-cds-sdc-listener</image.name> + <docker.push.phase>deploy</docker.push.phase> + <project.version>${parent.version}</project.version> + <!-- Start of Docker Related Properties --> + <docker.fabric.version>0.26.1</docker.fabric.version> + <ccsdk.project.version>${project.version}</ccsdk.project.version> </properties> <dependencies> <!-- Spring boot --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - </dependency> <dependency> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-devtools</artifactId> - <optional>true</optional> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> </dependency> <!-- SDC Distribution client dependency --> @@ -87,16 +88,15 @@ <dependency> <groupId>org.onap.ccsdk.cds.components</groupId> <artifactId>proto-definition</artifactId> - <version>0.4.2-SNAPSHOT</version> + <version>${project.version}</version> </dependency> - <!-- SDC Distribution client dependency --> <dependency> - <groupId>org.onap.sdc.sdc-distribution-client</groupId> - <artifactId>sdc-distribution-client</artifactId> - <version>1.3.0</version> + <groupId>io.projectreactor</groupId> + <artifactId>reactor-core</artifactId> + <version>3.2.6.RELEASE</version> + <scope>compile</scope> </dependency> - </dependencies> <build> @@ -113,7 +113,103 @@ </execution> </executions> </plugin> + <plugin> + <artifactId>maven-antrun-plugin</artifactId> + <version>1.8</version> + <executions> + <execution> + <id>copy</id> + <phase>package</phase> + <configuration> + <target> + <echo>ANT TASK - copying Docker files</echo> + <copy todir="${basedir}/target/docker-stage" overwrite="true" flatten="true"> + <fileset dir="${basedir}/src/main/docker"> + <include name="Dockerfile"/> + <include name="start.sh"/> + </fileset> + <fileset dir="${basedir}/target"> + <include name="*.jar"/> + </fileset> + <fileset dir="${basedir}/src/main/resources/"> + <include name="application.yml"/> + </fileset> + </copy> + </target> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.codehaus.groovy.maven</groupId> + <artifactId>gmaven-plugin</artifactId> + <version>1.0</version> + <executions> + <execution> + <phase>validate</phase> + <goals> + <goal>execute</goal> + </goals> + <configuration> + <source>${basedir}/../../../TagVersion.groovy</source> + </configuration> + </execution> + </executions> + </plugin> </plugins> </build> + <profiles> + <profile> + <id>docker</id> + <build> + <plugins> + <plugin> + <groupId>io.fabric8</groupId> + <artifactId>docker-maven-plugin</artifactId> + <version>${docker.fabric.version}</version> + <inherited>false</inherited> + <configuration> + <images> + <image> + <name>${image.name}</name> + <build> + <cleanup>try</cleanup> + <dockerFileDir>${basedir}/target/docker-stage</dockerFileDir> + <tags> + <tag>${project.docker.latestminortag.version}</tag> + <tag>${project.docker.latestfulltag.version}</tag> + <tag>${project.docker.latesttagtimestamp.version}</tag> + </tags> + </build> + </image> + </images> + <verbose>true</verbose> + </configuration> + <executions> + <execution> + <id>generate-images</id> + <phase>package</phase> + <goals> + <goal>build</goal> + </goals> + </execution> + <execution> + <id>push-images</id> + <phase>${docker.push.phase}</phase> + <goals> + <goal>build</goal> + <goal>push</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + </profiles> + </project> diff --git a/ms/cds-sdc-listener/application/src/main/docker/Dockerfile b/ms/cds-sdc-listener/application/src/main/docker/Dockerfile new file mode 100644 index 000000000..062f65767 --- /dev/null +++ b/ms/cds-sdc-listener/application/src/main/docker/Dockerfile @@ -0,0 +1,13 @@ +FROM openjdk:8-jdk-alpine + +ENV HTTP_PROXY ${HTTP_PROXY} +ENV HTTPS_PROXY ${HTTPS_PROXY} + +RUN mkdir -p /opt/app/onap/ /opt/app/onap/config +WORKDIR /opt/app/onap/ +COPY start.sh /opt/app/onap/ +COPY application.yml /opt/app/onap/config +RUN chmod 751 /opt/app/onap/start.sh +COPY cds-sdc-listener-application-0.4.2-SNAPSHOT.jar /opt/app/onap/cds-sdc-listener-distribution.jar +EXPOSE 9000 +ENTRYPOINT /opt/app/onap/start.sh diff --git a/ms/cds-sdc-listener/application/src/main/docker/docker-compose.yaml b/ms/cds-sdc-listener/application/src/main/docker/docker-compose.yaml new file mode 100644 index 000000000..1e7384744 --- /dev/null +++ b/ms/cds-sdc-listener/application/src/main/docker/docker-compose.yaml @@ -0,0 +1,29 @@ +version: '3.3' + +services: + cds-sdc-listener: + image: onap/cdssdclistener:latest + container_name: cdssdclistener + restart: always + environment: + asdcAddress: localhost:8443 + messageBusAddress: localhost + sdcusername: vid + password: Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U + pollingInterval: 15 + pollingTimeout: 15 + relevantArtifactTypes: TOSCA_CSAR + consumerGroup: cds-id-local + environmentName: AUTO + consumerId: cds-id-local + keyStorePassword: + keyStorePath: + activateServerTLSAuth: "false" + isUseHttpsWithDmaap: "false" + archivePath: /opt/app/onap/cds-sdc-listener/ + grpcAddress: localhost + grpcPort: 9111 + authHeader: Basic Y2NzZGthcHBzOmNjc2RrYXBwcw== + #port needed by Liveness probe + healthcheckPort: "9000" + sprintWebListenerEnabled: "true" diff --git a/ms/cds-sdc-listener/application/src/main/docker/start.sh b/ms/cds-sdc-listener/application/src/main/docker/start.sh new file mode 100755 index 000000000..f24d15618 --- /dev/null +++ b/ms/cds-sdc-listener/application/src/main/docker/start.sh @@ -0,0 +1,6 @@ +#!/bin/sh +extraArgs=$@ +java -jar /opt/app/onap/cds-sdc-listener-distribution.jar \ +-Dspring.config=/opt/app/onap/config/application.yml \ +-Djava.security.egd=file:/dev/./urandom \ +${extraArgs} diff --git a/ms/cds-sdc-listener/application/src/main/java/org/onap/ccsdk/cds/cdssdclistener/controller/HealthCheck.java b/ms/cds-sdc-listener/application/src/main/java/org/onap/ccsdk/cds/cdssdclistener/controller/HealthCheck.java new file mode 100644 index 000000000..a1bb116bf --- /dev/null +++ b/ms/cds-sdc-listener/application/src/main/java/org/onap/ccsdk/cds/cdssdclistener/controller/HealthCheck.java @@ -0,0 +1,35 @@ +/* + * Copyright © 2019 Bell Canada + * + * 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.cdssdclistener.controller; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + +@RestController +@RequestMapping("/api/v1/sdclistener") +public class HealthCheck { + + @RequestMapping(path = "/healthcheck", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public @ResponseBody + Mono<String> ping() { + return Mono.just("{\"status\":\"UP\"}"); + } +} diff --git a/ms/cds-sdc-listener/application/src/main/resources/application.yml b/ms/cds-sdc-listener/application/src/main/resources/application.yml index cb1b54c96..b3f8443eb 100644 --- a/ms/cds-sdc-listener/application/src/main/resources/application.yml +++ b/ms/cds-sdc-listener/application/src/main/resources/application.yml @@ -1,21 +1,27 @@ listenerservice: - config: - asdcAddress: localhost:8443 - messageBusAddress: localhost - user: vid - password: Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U - pollingInterval: 15 - pollingTimeout: 60 - relevantArtifactTypes: TOSCA_CSAR - consumerGroup: cds-id-local - environmentName: AUTO - consumerId: cds-id-local - keyStorePassword: - keyStorePath: - activateServerTLSAuth : false - isUseHttpsWithDmaap: false - archivePath: /opt/app/onap/cds-sdc-listener/ - grpcAddress: localhost - grpcPort: 9111 - authHeader: Basic Y2NzZGthcHBzOmNjc2RrYXBwcw== - + config: + asdcAddress: ${asdcAddress:localhost:8443} + messageBusAddress: ${messageBusAddress:localhost} + user: ${sdcusername:vid} + password: ${password:Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U} + pollingInterval: ${pollingInterval:15} + pollingTimeout: ${pollingTimeout:60} + relevantArtifactTypes: ${relevantArtifactTypes:TOSCA_CSAR} + consumerGroup: ${consumerGroup:cds-id-local} + environmentName: ${environmentName:AUTO} + consumerId: ${consumerId:cds-id-local} + keyStorePassword: ${keyStorePassword} + keyStorePath: ${keyStorePath} + activateServerTLSAuth : ${activateServerTLSAuth:false} + isUseHttpsWithDmaap: ${isUseHttpsWithDmaap:false} + archivePath: ${archivePath:/opt/app/onap/cds-sdc-listener/} + grpcAddress: ${grpcAddress:localhost} + grpcPort: ${grpcPort:9111} + authHeader: ${authHeader:Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==} +#port needed by Liveness probe +server: + port: ${healthcheckPort:9000} +#set spring.main.web-environment=false if you want to NOT to open a port for healthcheck. +spring: + main: + web-environment: ${sprintWebListenerEnabled:true} diff --git a/ms/cds-sdc-listener/application/src/main/resources/logback.xml b/ms/cds-sdc-listener/application/src/main/resources/logback.xml new file mode 100644 index 000000000..b26cbcbe4 --- /dev/null +++ b/ms/cds-sdc-listener/application/src/main/resources/logback.xml @@ -0,0 +1,33 @@ +<!-- +Copyright (C) 2019 Bell Canada + +Unless otherwise specified, all software contained herein is licensed +under the Apache License, Version 2.0 (the License); +you may not use this software 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. +--> + +<configuration> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> + </encoder> + </appender> + + <root level="info"> + <appender-ref ref="STDOUT"/> + </root> + + <logger name="org.springframework" level="info"/> + <logger name="org.springframework.web" level="info"/> + <logger name="org.onap.ccsdk.cds" level="info"/> + +</configuration> diff --git a/ms/cds-sdc-listener/distribution/pom.xml b/ms/cds-sdc-listener/distribution/pom.xml deleted file mode 100644 index 59e3824d7..000000000 --- a/ms/cds-sdc-listener/distribution/pom.xml +++ /dev/null @@ -1,106 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - ~ Copyright (C) 2019 Bell Canada. All rights reserved. - ~ - ~ NOTICE: All the intellectual and technical concepts contained herein are - ~ proprietary to Bell Canada and are protected by trade secret or copyright law. - ~ Unauthorized copying of this file, via any medium is strictly prohibited. - --> -<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>cds-sdc-listener</artifactId> - <groupId>org.onap.ccsdk.cds</groupId> - <version>0.4.2-SNAPSHOT</version> - </parent> - - <modelVersion>4.0.0</modelVersion> - <groupId>org.onap.ccsdk.cds</groupId> - <artifactId>cds-sdc-listener-distribution</artifactId> - <name>CDS-SDC Listener Distribution</name> - - <properties> - <image.name>onap/ccsdk-cdssdclistener</image.name> - <docker.push.phase>deploy</docker.push.phase> - </properties> - - <build> - <plugins> - <plugin> - <artifactId>maven-resources-plugin</artifactId> - <version>2.6</version> - <executions> - <execution> - <id>copy-dockerfile</id> - <goals> - <goal>copy-resources</goal> - </goals> - <phase>validate</phase> - <configuration> - <outputDirectory>${basedir}/target/docker-stage</outputDirectory> - <resources> - <resource> - <directory>src/main/docker</directory> - <includes> - <include>*</include> - </includes> - <filtering>true</filtering> - </resource> - </resources> - </configuration> - </execution> - </executions> - </plugin> - </plugins> - </build> - - <profiles> - <profile> - <id>docker</id> - <build> - <plugins> - <plugin> - <!-- Maven plugin for managing docker images and containers --> - <groupId>io.fabric8</groupId> - <artifactId>docker-maven-plugin</artifactId> - <version>0.26.1</version> - <inherited>false</inherited> - <configuration> - <images> - <image> - <name>${image.name}</name> - <build> - <cleanup>try</cleanup> - <dockerFileDir>${basedir}/target/docker-stage</dockerFileDir> - <tags> - <tag>${project.version}</tag> - <tag>${project.version}-STAGING-${maven.build.timestamp}</tag> - </tags> - </build> - </image> - </images> - <verbose>true</verbose> - </configuration> - <executions> - <execution> - <id>generate-images</id> - <phase>package</phase> - <goals> - <goal>build</goal> - </goals> - </execution> - <execution> - <id>push-images</id> - <phase>${docker.push.phase}</phase> - <goals> - <goal>build</goal> - <goal>push</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - </profile> - </profiles> - -</project> diff --git a/ms/controllerblueprints/modules/blueprint-core/src/test/resources/dictionary/dictionary_schema.json b/ms/controllerblueprints/modules/blueprint-core/src/test/resources/dictionary/dictionary_schema.json index cac8770af..0e1f84278 100644 --- a/ms/controllerblueprints/modules/blueprint-core/src/test/resources/dictionary/dictionary_schema.json +++ b/ms/controllerblueprints/modules/blueprint-core/src/test/resources/dictionary/dictionary_schema.json @@ -51,8 +51,46 @@ "default": { "type": "any" }, - "aai": { - "type": "any" + "primary-aai-data": { + "type": "object", + "properties": { + "verb": { + "type": "string", + "required": true + }, + "path": { + "type": "string", + "required": true + }, + "url-path": { + "type": "string", + "required": true + }, + "payload": { + "type": "string", + "required": false + }, + "input-key-mapping": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "type": { + "type": "string", + "required": true + }, + "output-key-mapping": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "base": { + "type": "string", + "required": true + } + } }, "primary-config-data": { "type": "object", @@ -177,7 +215,7 @@ } } }, - "aai": { + "primary-aai-data": { "type": "object", "properties": { "names": { |