From 69644638aa0e93c9c2c2ccea590fa02213d24a7a Mon Sep 17 00:00:00 2001 From: Remigiusz Janeczek Date: Wed, 17 Jun 2020 17:52:56 +0200 Subject: Add external tls info to bpgenerator and component spec schema Also: - Fix issue where local run without import file caused exception instead of use of default imports. - Update blueprint generator version from 1.3.2 to 1.4.0 Issue-ID: DCAEGEN2-2251 Signed-off-by: Remigiusz Janeczek Change-Id: I2f976ccc3e0b271bf9ae1357f02bd86fe0903459 --- mod/bpgenerator/README.md | 6 +- .../blueprint_withTlsFalseAndExternalTlsFalse.yaml | 136 +++++++++++++ .../blueprint_withTlsTrueAndExternalTlsTrue.yaml | 136 +++++++++++++ .../blueprint_withTlsTrueAndNoExternalTls.yaml | 101 ++++++++++ .../TlsInfo/blueprint_withoutTlsInfo.yaml | 93 +++++++++ ...ponentSpec_withTlsFalseAndExternalTlsFalse.json | 43 ++++ ...omponentSpec_withTlsTrueAndExternalTlsTrue.json | 43 ++++ ...tComponentSpec_withTlsTrueAndNoExternalTls.json | 42 ++++ .../TlsInfo/testComponentSpec_withoutTlsInfo.json | 38 ++++ mod/bpgenerator/pom.xml | 2 +- .../models/blueprint/ExternalTlsInfo.java | 153 ++++++++++++++ .../models/blueprint/GetInput.java | 42 ++-- .../blueprintgenerator/models/blueprint/Node.java | 7 + .../models/blueprint/Properties.java | 96 +++++---- .../models/componentspec/Auxilary.java | 4 +- .../models/dmaapbp/DmaapBlueprint.java | 4 +- .../models/dmaapbp/DmaapNode.java | 4 - .../models/onapbp/OnapBlueprint.java | 8 +- .../blueprintgenerator/models/onapbp/OnapNode.java | 5 +- .../core/BlueprintGeneratorTest.java | 2 + .../onap/blueprintgenerator/core/TlsInfoTest.java | 162 +++++++++++++++ mod/bpgenerator/version.properties | 4 +- .../dcae-cli-v2/component-spec-schema.json | 222 +++++++++++---------- mod/runtimeapi/runtime-core/pom.xml | 2 +- 24 files changed, 1167 insertions(+), 188 deletions(-) create mode 100644 mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsFalseAndExternalTlsFalse.yaml create mode 100644 mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsTrueAndExternalTlsTrue.yaml create mode 100644 mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsTrueAndNoExternalTls.yaml create mode 100644 mod/bpgenerator/TestCases/TlsInfo/blueprint_withoutTlsInfo.yaml create mode 100644 mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsFalseAndExternalTlsFalse.json create mode 100644 mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsTrueAndExternalTlsTrue.json create mode 100644 mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsTrueAndNoExternalTls.json create mode 100644 mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withoutTlsInfo.json create mode 100644 mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/ExternalTlsInfo.java create mode 100644 mod/bpgenerator/src/test/java/org/onap/blueprintgenerator/core/TlsInfoTest.java (limited to 'mod') diff --git a/mod/bpgenerator/README.md b/mod/bpgenerator/README.md index 2e81745..d6b6f7d 100644 --- a/mod/bpgenerator/README.md +++ b/mod/bpgenerator/README.md @@ -9,7 +9,7 @@ This tool allows the user to create a blueprint from a component spec json file - To execute the application ```bash -java -jar target/blueprint-generator-1.2.1-SNAPSHOT-executable.jar +java -jar target/blueprint-generator-1.4.0-SNAPSHOT-executable.jar ``` @@ -31,7 +31,7 @@ OPTIONS: it will look like this: ```bash -java -jar target/blueprint-generator-1.2.1-SNAPSHOT-executable.jar blueprint -p Blueprints -i ComponentSpecs/TestComponentSpec.json -n HelloWorld -d +java -jar target/blueprint-generator-1.4.0-SNAPSHOT-executable.jar blueprint -p Blueprints -i ComponentSpecs/TestComponentSpec.json -n HelloWorld -d ``` This command will create a blueprint from the component spec TestComponentSpec. The blueprint file name will be called HelloWorld.yaml and it will be in the directory Blueprints. The blueprint will also contain the DMaaP plugin. @@ -55,7 +55,7 @@ OPTIONS: it will look like this: ```bash -java -jar target/blueprint-generator-1.2.1-SNAPSHOT-executable.jar policy -p models -i ComponentSpecs/TestComponentSpec.json +java -jar target/blueprint-generator-1.4.0-SNAPSHOT-executable.jar policy -p models -i ComponentSpecs/TestComponentSpec.json ``` This command will create a directory called models and put the policy models created from the component spec given in that directory. (A component spec may generate multiple policy models) \ No newline at end of file diff --git a/mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsFalseAndExternalTlsFalse.yaml b/mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsFalseAndExternalTlsFalse.yaml new file mode 100644 index 0000000..94a3f1e --- /dev/null +++ b/mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsFalseAndExternalTlsFalse.yaml @@ -0,0 +1,136 @@ + +#description: Test component spec +#blueprint_version: 1.0.1 +--- +tosca_definitions_version: cloudify_dsl_1_3 +imports: +- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml +- https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/k8splugin/1.7.2/k8splugin_types.yaml +- https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/dcaepolicyplugin/2.4.0/dcaepolicyplugin_types.yaml +inputs: + always_pull_image: + type: boolean + description: Set to true if the image should always be pulled + default: true + envs: + default: {} + external_cert_ca_name: + type: string + description: Name of Certificate Authority configured on CertService side. + default: "RA" + external_cert_cert_type: + type: string + description: Format of provided certificates + default: "P12" + external_cert_common_name: + type: string + description: Common name which should be present in certificate. + default: "sample.onap.org" + external_cert_sans: + type: string + description: "List of Subject Alternative Names (SANs) which should be present + in certificate. Delimiter - : Should contain common_name value and other FQDNs + under which given component is accessible." + default: "sample.onap.org:component.sample.onap.org" + external_cert_use_external_tls: + type: boolean + description: Flag to indicate external tls enable/disable. + default: false + external_port_0: + type: string + default: "80" + external_port_1: + type: string + default: "99" + image: + type: string + default: "test.tester" + location_id: + type: string + default: "" + replicas: + type: integer + description: number of instances + default: 1 + service_component_name_override: + type: string + default: "" + test.component.spec_cpu_limit: + type: string + default: "250m" + test.component.spec_cpu_request: + type: string + default: "250m" + test.component.spec_memory_limit: + type: string + default: "128Mi" + test.component.spec_memory_request: + type: string + default: "128Mi" + use_tls: + type: boolean + description: flag to indicate tls enable/disable + default: false +node_templates: + test.component.spec: + type: dcae.nodes.ContainerizedServiceComponent + interfaces: + cloudify.interfaces.lifecycle: + start: + inputs: + ports: + - concat: ["80:", {get_input: external_port_0}] + - concat: ["99:", {get_input: external_port_1}] + envs: + get_input: envs + properties: + application_config: + service_calls: [] + streams_publishes: {} + streams_subscribes: {} + service_component_name_override: + get_input: service_component_name_override + docker_config: + healthcheck: + interval: 300s + timeout: 120s + script: /etc/init.d/nagios status + type: docker + image: + get_input: image + location_id: + get_input: location_id + service_component_type: test-component-spec + replicas: + get_input: replicas + tls_info: + cert_directory: /opt/app/dcae-certificate/ + use_tls: + get_input: use_tls + external_cert: + external_cert_directory: /opt/app/dcae-certificate/ + use_external_tls: + get_input: external_cert_use_external_tls + ca_name: + get_input: external_cert_ca_name + cert_type: + get_input: external_cert_cert_type + external_certificate_parameters: + common_name: + get_input: external_cert_common_name + sans: + get_input: external_cert_sans + resource_config: + limits: + cpu: + get_input: test.component.spec_cpu_limit + memory: + get_input: test.component.spec_memory_limit + requests: + cpu: + get_input: test.component.spec_cpu_request + memory: + get_input: test.component.spec_memory_request + always_pull_image: + get_input: always_pull_image + relationships: [] \ No newline at end of file diff --git a/mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsTrueAndExternalTlsTrue.yaml b/mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsTrueAndExternalTlsTrue.yaml new file mode 100644 index 0000000..4313d6b --- /dev/null +++ b/mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsTrueAndExternalTlsTrue.yaml @@ -0,0 +1,136 @@ + +#description: Test component spec +#blueprint_version: 1.0.1 +--- +tosca_definitions_version: cloudify_dsl_1_3 +imports: +- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml +- https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/k8splugin/1.7.2/k8splugin_types.yaml +- https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/dcaepolicyplugin/2.4.0/dcaepolicyplugin_types.yaml +inputs: + always_pull_image: + type: boolean + description: Set to true if the image should always be pulled + default: true + envs: + default: {} + external_cert_ca_name: + type: string + description: Name of Certificate Authority configured on CertService side. + default: "RA" + external_cert_cert_type: + type: string + description: Format of provided certificates + default: "P12" + external_cert_common_name: + type: string + description: Common name which should be present in certificate. + default: "sample.onap.org" + external_cert_sans: + type: string + description: "List of Subject Alternative Names (SANs) which should be present + in certificate. Delimiter - : Should contain common_name value and other FQDNs + under which given component is accessible." + default: "sample.onap.org:component.sample.onap.org" + external_cert_use_external_tls: + type: boolean + description: Flag to indicate external tls enable/disable. + default: true + external_port_0: + type: string + default: "80" + external_port_1: + type: string + default: "99" + image: + type: string + default: "test.tester" + location_id: + type: string + default: "" + replicas: + type: integer + description: number of instances + default: 1 + service_component_name_override: + type: string + default: "" + test.component.spec_cpu_limit: + type: string + default: "250m" + test.component.spec_cpu_request: + type: string + default: "250m" + test.component.spec_memory_limit: + type: string + default: "128Mi" + test.component.spec_memory_request: + type: string + default: "128Mi" + use_tls: + type: boolean + description: flag to indicate tls enable/disable + default: true +node_templates: + test.component.spec: + type: dcae.nodes.ContainerizedServiceComponent + interfaces: + cloudify.interfaces.lifecycle: + start: + inputs: + ports: + - concat: ["80:", {get_input: external_port_0}] + - concat: ["99:", {get_input: external_port_1}] + envs: + get_input: envs + properties: + application_config: + service_calls: [] + streams_publishes: {} + streams_subscribes: {} + service_component_name_override: + get_input: service_component_name_override + docker_config: + healthcheck: + interval: 300s + timeout: 120s + script: /etc/init.d/nagios status + type: docker + image: + get_input: image + location_id: + get_input: location_id + service_component_type: test-component-spec + replicas: + get_input: replicas + tls_info: + cert_directory: /opt/app/dcae-certificate/ + use_tls: + get_input: use_tls + external_cert: + external_cert_directory: /opt/app/dcae-certificate/ + use_external_tls: + get_input: external_cert_use_external_tls + ca_name: + get_input: external_cert_ca_name + cert_type: + get_input: external_cert_cert_type + external_certificate_parameters: + common_name: + get_input: external_cert_common_name + sans: + get_input: external_cert_sans + resource_config: + limits: + cpu: + get_input: test.component.spec_cpu_limit + memory: + get_input: test.component.spec_memory_limit + requests: + cpu: + get_input: test.component.spec_cpu_request + memory: + get_input: test.component.spec_memory_request + always_pull_image: + get_input: always_pull_image + relationships: [] \ No newline at end of file diff --git a/mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsTrueAndNoExternalTls.yaml b/mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsTrueAndNoExternalTls.yaml new file mode 100644 index 0000000..c4515e3 --- /dev/null +++ b/mod/bpgenerator/TestCases/TlsInfo/blueprint_withTlsTrueAndNoExternalTls.yaml @@ -0,0 +1,101 @@ + +#description: Test component spec +#blueprint_version: 1.0.1 +--- +tosca_definitions_version: cloudify_dsl_1_3 +imports: +- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml +- https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/k8splugin/1.7.2/k8splugin_types.yaml +- https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/dcaepolicyplugin/2.4.0/dcaepolicyplugin_types.yaml +inputs: + always_pull_image: + type: boolean + description: Set to true if the image should always be pulled + default: true + envs: + default: {} + external_port_0: + type: string + default: "80" + external_port_1: + type: string + default: "99" + image: + type: string + default: "test.tester" + location_id: + type: string + default: "" + replicas: + type: integer + description: number of instances + default: 1 + service_component_name_override: + type: string + default: "" + test.component.spec_cpu_limit: + type: string + default: "250m" + test.component.spec_cpu_request: + type: string + default: "250m" + test.component.spec_memory_limit: + type: string + default: "128Mi" + test.component.spec_memory_request: + type: string + default: "128Mi" + use_tls: + type: boolean + description: flag to indicate tls enable/disable + default: true +node_templates: + test.component.spec: + type: dcae.nodes.ContainerizedServiceComponent + interfaces: + cloudify.interfaces.lifecycle: + start: + inputs: + ports: + - concat: ["80:", {get_input: external_port_0}] + - concat: ["99:", {get_input: external_port_1}] + envs: + get_input: envs + properties: + application_config: + service_calls: [] + streams_publishes: {} + streams_subscribes: {} + service_component_name_override: + get_input: service_component_name_override + docker_config: + healthcheck: + interval: 300s + timeout: 120s + script: /etc/init.d/nagios status + type: docker + image: + get_input: image + location_id: + get_input: location_id + service_component_type: test-component-spec + replicas: + get_input: replicas + tls_info: + cert_directory: /opt/app/dcae-certificate/ + use_tls: + get_input: use_tls + resource_config: + limits: + cpu: + get_input: test.component.spec_cpu_limit + memory: + get_input: test.component.spec_memory_limit + requests: + cpu: + get_input: test.component.spec_cpu_request + memory: + get_input: test.component.spec_memory_request + always_pull_image: + get_input: always_pull_image + relationships: [] \ No newline at end of file diff --git a/mod/bpgenerator/TestCases/TlsInfo/blueprint_withoutTlsInfo.yaml b/mod/bpgenerator/TestCases/TlsInfo/blueprint_withoutTlsInfo.yaml new file mode 100644 index 0000000..e1f942f --- /dev/null +++ b/mod/bpgenerator/TestCases/TlsInfo/blueprint_withoutTlsInfo.yaml @@ -0,0 +1,93 @@ + +#description: Test component spec +#blueprint_version: 1.0.1 +--- +tosca_definitions_version: cloudify_dsl_1_3 +imports: +- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml +- https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/k8splugin/1.7.2/k8splugin_types.yaml +- https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R6/dcaepolicyplugin/2.4.0/dcaepolicyplugin_types.yaml +inputs: + always_pull_image: + type: boolean + description: Set to true if the image should always be pulled + default: true + envs: + default: {} + external_port_0: + type: string + default: "80" + external_port_1: + type: string + default: "99" + image: + type: string + default: "test.tester" + location_id: + type: string + default: "" + replicas: + type: integer + description: number of instances + default: 1 + service_component_name_override: + type: string + default: "" + test.component.spec_cpu_limit: + type: string + default: "250m" + test.component.spec_cpu_request: + type: string + default: "250m" + test.component.spec_memory_limit: + type: string + default: "128Mi" + test.component.spec_memory_request: + type: string + default: "128Mi" +node_templates: + test.component.spec: + type: dcae.nodes.ContainerizedServiceComponent + interfaces: + cloudify.interfaces.lifecycle: + start: + inputs: + ports: + - concat: ["80:", {get_input: external_port_0}] + - concat: ["99:", {get_input: external_port_1}] + envs: + get_input: envs + properties: + application_config: + service_calls: [] + streams_publishes: {} + streams_subscribes: {} + service_component_name_override: + get_input: service_component_name_override + docker_config: + healthcheck: + interval: 300s + timeout: 120s + script: /etc/init.d/nagios status + type: docker + image: + get_input: image + location_id: + get_input: location_id + service_component_type: test-component-spec + replicas: + get_input: replicas + resource_config: + limits: + cpu: + get_input: test.component.spec_cpu_limit + memory: + get_input: test.component.spec_memory_limit + requests: + cpu: + get_input: test.component.spec_cpu_request + memory: + get_input: test.component.spec_memory_request + always_pull_image: + get_input: always_pull_image + relationships: [] \ No newline at end of file diff --git a/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsFalseAndExternalTlsFalse.json b/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsFalseAndExternalTlsFalse.json new file mode 100644 index 0000000..da75ab8 --- /dev/null +++ b/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsFalseAndExternalTlsFalse.json @@ -0,0 +1,43 @@ +{ + "self": { + "component_type": "docker", + "description": "Test component spec", + "name": "test.component.spec", + "version": "1.0.1" + }, + + "services": { + "calls": [], + "provides": [] + }, + + "streams": { + "publishes": [], + "subscribes": [] + }, + + "parameters": [], + + "auxilary": { + "healthcheck": { + "type": "docker", + "interval": "300s", + "timeout": "120s", + "script": "/etc/init.d/nagios status" + }, + "ports": [ + "80:80", + "99:99" + ], + "tls_info": { + "cert_directory": "/opt/app/dcae-certificate/", + "use_tls": false, + "use_external_tls": false + } + }, + "artifacts": [{ + "type": "docker image", + "uri": "test.tester" + }] + +} diff --git a/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsTrueAndExternalTlsTrue.json b/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsTrueAndExternalTlsTrue.json new file mode 100644 index 0000000..f13e3fd --- /dev/null +++ b/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsTrueAndExternalTlsTrue.json @@ -0,0 +1,43 @@ +{ + "self": { + "component_type": "docker", + "description": "Test component spec", + "name": "test.component.spec", + "version": "1.0.1" + }, + + "services": { + "calls": [], + "provides": [] + }, + + "streams": { + "publishes": [], + "subscribes": [] + }, + + "parameters": [], + + "auxilary": { + "healthcheck": { + "type": "docker", + "interval": "300s", + "timeout": "120s", + "script": "/etc/init.d/nagios status" + }, + "ports": [ + "80:80", + "99:99" + ], + "tls_info": { + "cert_directory": "/opt/app/dcae-certificate/", + "use_tls": true, + "use_external_tls": true + } + }, + "artifacts": [{ + "type": "docker image", + "uri": "test.tester" + }] + +} diff --git a/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsTrueAndNoExternalTls.json b/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsTrueAndNoExternalTls.json new file mode 100644 index 0000000..517c461 --- /dev/null +++ b/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withTlsTrueAndNoExternalTls.json @@ -0,0 +1,42 @@ +{ + "self": { + "component_type": "docker", + "description": "Test component spec", + "name": "test.component.spec", + "version": "1.0.1" + }, + + "services": { + "calls": [], + "provides": [] + }, + + "streams": { + "publishes": [], + "subscribes": [] + }, + + "parameters": [], + + "auxilary": { + "healthcheck": { + "type": "docker", + "interval": "300s", + "timeout": "120s", + "script": "/etc/init.d/nagios status" + }, + "ports": [ + "80:80", + "99:99" + ], + "tls_info": { + "cert_directory": "/opt/app/dcae-certificate/", + "use_tls": true + } + }, + "artifacts": [{ + "type": "docker image", + "uri": "test.tester" + }] + +} diff --git a/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withoutTlsInfo.json b/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withoutTlsInfo.json new file mode 100644 index 0000000..a94c987 --- /dev/null +++ b/mod/bpgenerator/TestCases/TlsInfo/testComponentSpec_withoutTlsInfo.json @@ -0,0 +1,38 @@ +{ + "self": { + "component_type": "docker", + "description": "Test component spec", + "name": "test.component.spec", + "version": "1.0.1" + }, + + "services": { + "calls": [], + "provides": [] + }, + + "streams": { + "publishes": [], + "subscribes": [] + }, + + "parameters": [], + + "auxilary": { + "healthcheck": { + "type": "docker", + "interval": "300s", + "timeout": "120s", + "script": "/etc/init.d/nagios status" + }, + "ports": [ + "80:80", + "99:99" + ] + }, + "artifacts": [{ + "type": "docker image", + "uri": "test.tester" + }] + +} diff --git a/mod/bpgenerator/pom.xml b/mod/bpgenerator/pom.xml index b6a45d0..96ceb41 100644 --- a/mod/bpgenerator/pom.xml +++ b/mod/bpgenerator/pom.xml @@ -29,7 +29,7 @@ org.onap.dcaegen2.platform.mod blueprint-generator - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT 1.6 1.6 diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/ExternalTlsInfo.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/ExternalTlsInfo.java new file mode 100644 index 0000000..cf97dec --- /dev/null +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/ExternalTlsInfo.java @@ -0,0 +1,153 @@ +/**============LICENSE_START======================================================= + org.onap.dcae + ================================================================================ + Copyright (c) 2020 Nokia. All rights reserved. + ================================================================================ + 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. + ============LICENSE_END========================================================= + */ + +package org.onap.blueprintgenerator.models.blueprint; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.onap.blueprintgenerator.models.componentspec.ComponentSpec; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.TreeMap; + +@Getter +@Setter +@NoArgsConstructor +public class ExternalTlsInfo { + + static final String USE_EXTERNAL_TLS_FIELD = "use_external_tls"; + + private static final String DEFAULT_CA = "RA"; + private static final Object DEFAULT_CERT_TYPE = "P12"; + + private static final String INPUT_PREFIX = "external_cert_"; + private static final String EXTERNAL_CERT_DIRECTORY_FIELD = "external_cert_directory"; + private static final String CA_NAME_FIELD = "ca_name"; + private static final String CERT_TYPE_FIELD = "cert_type"; + private static final String EXTERNAL_CERTIFICATE_PARAMETERS_FIELD = "external_certificate_parameters"; + + @JsonProperty(EXTERNAL_CERT_DIRECTORY_FIELD) + private String externalCertDirectory; + + @JsonProperty(USE_EXTERNAL_TLS_FIELD) + private GetInput useExternalTls; + + @JsonProperty(CA_NAME_FIELD) + private GetInput caName; + + @JsonProperty(CERT_TYPE_FIELD) + private GetInput certType; + + @JsonProperty(EXTERNAL_CERTIFICATE_PARAMETERS_FIELD) + private ExternalCertificateParameters externalCertificateParameters; + + static ExternalTlsInfo createFromComponentSpec(ComponentSpec cs) { + ExternalTlsInfo externalTlsInfoBp = new ExternalTlsInfo(); + TreeMap tlsInfoCs = cs.getAuxilary().getTls_info(); + + externalTlsInfoBp.setExternalCertDirectory((String) tlsInfoCs.get("cert_directory")); + externalTlsInfoBp.setUseExternalTls(createGetInput(USE_EXTERNAL_TLS_FIELD)); + externalTlsInfoBp.setCaName(createGetInput(CA_NAME_FIELD)); + externalTlsInfoBp.setCertType(createGetInput(CERT_TYPE_FIELD)); + + ExternalCertificateParameters externalCertificateParameters = + ExternalCertificateParameters.create(); + externalTlsInfoBp.setExternalCertificateParameters(externalCertificateParameters); + + return externalTlsInfoBp; + } + + static Map> createInputMapFromComponentSpec(ComponentSpec cs){ + Map> retInputs = new HashMap<>(); + + Map tlsInfoCs = cs.getAuxilary().getTls_info(); + LinkedHashMap useTlsFlagInput = Properties.makeInput("boolean", + "Flag to indicate external tls enable/disable.", + tlsInfoCs.get(USE_EXTERNAL_TLS_FIELD)); + retInputs.put(addPrefix(USE_EXTERNAL_TLS_FIELD), useTlsFlagInput); + + LinkedHashMap caNameInputMap = Properties.makeInput("string", + "Name of Certificate Authority configured on CertService side.", + DEFAULT_CA); + retInputs.put(addPrefix(CA_NAME_FIELD), caNameInputMap); + + LinkedHashMap certTypeInputMap = Properties.makeInput("string", + "Format of provided certificates", + DEFAULT_CERT_TYPE); + retInputs.put(addPrefix(CERT_TYPE_FIELD), certTypeInputMap); + + retInputs.putAll(ExternalCertificateParameters.createInputMap()); + return retInputs; + } + + private static GetInput createGetInput(String fieldName) { + return new GetInput(addPrefix(fieldName)); + } + + private static String addPrefix(String fieldName) { + return INPUT_PREFIX + fieldName; + } + + @Getter + @Setter + @NoArgsConstructor + public static class ExternalCertificateParameters { + + private static final String DEFAULT_COMMON_NAME = "sample.onap.org"; + private static final String DEFAULT_SANS = "sample.onap.org:component.sample.onap.org"; + + private static final String COMMON_NAME_FIELD = "common_name"; + private static final String SANS_FIELD = "sans"; + + @JsonProperty(COMMON_NAME_FIELD) + private GetInput commonName; + + @JsonProperty(SANS_FIELD) + private GetInput sans; + + + private static ExternalCertificateParameters create() { + ExternalCertificateParameters externalCertificateParameters = new ExternalCertificateParameters(); + externalCertificateParameters.setCommonName(createGetInput(COMMON_NAME_FIELD)); + externalCertificateParameters.setSans(createGetInput(SANS_FIELD)); + return externalCertificateParameters; + } + + private static Map> createInputMap(){ + Map> retInputs = new LinkedHashMap<>(); + + LinkedHashMap commonNameInputMap = Properties.makeInput("string", + "Common name which should be present in certificate.", + DEFAULT_COMMON_NAME); + retInputs.put(addPrefix(COMMON_NAME_FIELD), commonNameInputMap); + + LinkedHashMap sansInputMap = Properties.makeInput("string", + "\"List of Subject Alternative Names (SANs) which should be present in certificate. " + + "Delimiter - : Should contain common_name value and other FQDNs under which given " + + "component is accessible.\"", + DEFAULT_SANS); + retInputs.put(addPrefix(SANS_FIELD), sansInputMap); + return retInputs; + } + } +} diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/GetInput.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/GetInput.java index e7980c8..351c2b2 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/GetInput.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/GetInput.java @@ -1,28 +1,36 @@ -/**============LICENSE_START======================================================= - org.onap.dcae - ================================================================================ - Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. - ================================================================================ - 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 +/**============LICENSE_START======================================================= + org.onap.dcae + ================================================================================ + Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. + ================================================================================ + Modifications Copyright (c) 2020 Nokia. All rights reserved. + ================================================================================ + 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 + 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. - ============LICENSE_END========================================================= + 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. + ============LICENSE_END========================================================= */ package org.onap.blueprintgenerator.models.blueprint; -import lombok.Getter; import lombok.Setter; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; -@Getter @Setter +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor public class GetInput { private Object get_input; diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Node.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Node.java index bac795f..ee75ce0 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Node.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Node.java @@ -22,7 +22,14 @@ package org.onap.blueprintgenerator.models.blueprint; import lombok.Getter; import lombok.Setter; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.TreeMap; + @Getter @Setter public class Node { private String type; + private TreeMap interfaces; + private Properties properties; + private ArrayList> relationships; } diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Properties.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Properties.java index 382964b..d7947f8 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Properties.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/blueprint/Properties.java @@ -1,8 +1,10 @@ -/**============LICENSE_START======================================================= - org.onap.dcae - ================================================================================ +/**============LICENSE_START======================================================= + org.onap.dcae + ================================================================================ Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. - ================================================================================ + ================================================================================ + Modifications Copyright (c) 2020 Nokia. All rights reserved. + ================================================================================ 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 @@ -15,13 +17,13 @@ See the License for the specific language governing permissions and limitations under the License. ============LICENSE_END========================================================= - */ package org.onap.blueprintgenerator.models.blueprint; import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.Map; import java.util.TreeMap; import org.onap.blueprintgenerator.models.componentspec.Auxilary; @@ -33,10 +35,12 @@ import org.onap.blueprintgenerator.models.dmaapbp.DmaapStreams; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; -import lombok.Getter; import lombok.Setter; +import lombok.Getter; +import lombok.Setter; -@Getter @Setter -@JsonInclude(value=Include.NON_NULL) +@Getter +@Setter +@JsonInclude(value = Include.NON_NULL) public class Properties { private Appconfig application_config; private Auxilary docker_config; @@ -52,6 +56,7 @@ public class Properties { ArrayList streams_publishes; ArrayList streams_subscribes; private TlsInfo tls_info; + private ExternalTlsInfo external_cert; private ResourceConfig resource_config; private GetInput always_pull_image; //private boolean useExisting; @@ -85,10 +90,7 @@ public class Properties { GetInput replica = new GetInput(); replica.setGet_input("replicas"); this.setReplicas(replica); - LinkedHashMap rep = new LinkedHashMap(); - rep.put("type", "integer"); - rep.put("description", "number of instances"); - rep.put("default", 1); + LinkedHashMap rep = makeInput("integer", "number of instances", 1); retInputs.put("replicas", rep); //set the dns name @@ -112,10 +114,9 @@ public class Properties { // set always_pull_image this.always_pull_image = new GetInput(); this.always_pull_image.setGet_input("always_pull_image"); - LinkedHashMap inputAlwaysPullImage = new LinkedHashMap(); - inputAlwaysPullImage.put("type", "boolean"); - inputAlwaysPullImage.put("description", "Set to true if the image should always be pulled"); - inputAlwaysPullImage.put("default", true); + LinkedHashMap inputAlwaysPullImage = makeInput("boolean", + "Set to true if the image should always be pulled", + true); retInputs.put("always_pull_image", inputAlwaysPullImage); @@ -124,9 +125,10 @@ public class Properties { sType = sType.replace('.', '-'); this.setService_component_type(sType); - //set the tls info - if(cs.getAuxilary().getTls_info() != null){ - addTlsInfo(cs,retInputs); + //set the tls info for internal and external communication + if (cs.getAuxilary().getTls_info() != null) { + addTlsInfo(cs, retInputs); + addExternalTlsInfo(cs, retInputs); } //set the reource config @@ -168,19 +170,17 @@ public class Properties { sType = sType.replace('.', '-'); this.setService_component_type(sType); - //set the tls info - if(cs.getAuxilary().getTls_info() != null){ - addTlsInfo(cs,retInputs); + //set the tls info for internal and external communication + if (cs.getAuxilary().getTls_info() != null) { + addTlsInfo(cs, retInputs); + addExternalTlsInfo(cs, retInputs); } //set the replicas GetInput replica = new GetInput(); replica.setGet_input("replicas"); this.setReplicas(replica); - LinkedHashMap rep = new LinkedHashMap(); - rep.put("type", "integer"); - rep.put("description", "number of instances"); - rep.put("default", 1); + LinkedHashMap rep = makeInput("integer", "number of instances", 1); retInputs.put("replicas", rep); // //set the dns name @@ -203,15 +203,14 @@ public class Properties { //set the stream publishes ArrayList pubStreams = new ArrayList(); - if(cs.getStreams().getPublishes() != null) { - for(Publishes p: cs.getStreams().getPublishes()) { - if(p.getType().equals("message_router") || p.getType().equals("message router")) { + if (cs.getStreams().getPublishes() != null) { + for (Publishes p : cs.getStreams().getPublishes()) { + if (p.getType().equals("message_router") || p.getType().equals("message router")) { String topic = p.getConfig_key() + "_topic"; DmaapStreams mrStreams = new DmaapStreams(); retInputs = mrStreams.createStreams(inps, cs, topic, p.getType(), p.getConfig_key(), p.getRoute(), 'p'); pubStreams.add(mrStreams); - } - else if(p.getType().equals("data_router") || p.getType().equals("data router")){ + } else if (p.getType().equals("data_router") || p.getType().equals("data router")) { String feed = p.getConfig_key() + "_feed"; DmaapStreams drStreams = new DmaapStreams(); retInputs = drStreams.createStreams(inps, cs, feed, p.getType(), p.getConfig_key(), p.getRoute(), 'p'); @@ -222,15 +221,14 @@ public class Properties { //set the stream subscribes ArrayList subStreams = new ArrayList(); - if(cs.getStreams().getSubscribes() != null) { - for(Subscribes s: cs.getStreams().getSubscribes()) { - if(s.getType().equals("message_router") || s.getType().equals("message router")) { + if (cs.getStreams().getSubscribes() != null) { + for (Subscribes s : cs.getStreams().getSubscribes()) { + if (s.getType().equals("message_router") || s.getType().equals("message router")) { String topic = s.getConfig_key() + "_topic"; DmaapStreams mrStreams = new DmaapStreams(); retInputs = mrStreams.createStreams(inps, cs, topic, s.getType(), s.getConfig_key(), s.getRoute(), 's'); subStreams.add(mrStreams); - } - else if(s.getType().equals("data_router") || s.getType().equals("data router")){ + } else if (s.getType().equals("data_router") || s.getType().equals("data router")) { String feed = s.getConfig_key() + "_feed"; DmaapStreams drStreams = new DmaapStreams(); retInputs = drStreams.createStreams(inps, cs, feed, s.getType(), s.getConfig_key(), s.getRoute(), 's'); @@ -239,10 +237,10 @@ public class Properties { } } - if(pubStreams.size() != 0) { + if (pubStreams.size() != 0) { this.setStreams_publishes(pubStreams); } - if(subStreams.size() != 0) { + if (subStreams.size() != 0) { this.setStreams_subscribes(subStreams); } @@ -262,10 +260,24 @@ public class Properties { useTLSFlag.setGet_input("use_tls"); tlsInfo.setUseTls(useTLSFlag); this.setTls_info(tlsInfo); - LinkedHashMap useTlsFlagInput = new LinkedHashMap(); - useTlsFlagInput.put("type", "boolean"); - useTlsFlagInput.put("description", "flag to indicate tls enable/disable"); - useTlsFlagInput.put("default", cs.getAuxilary().getTls_info().get("use_tls")); + LinkedHashMap useTlsFlagInput = makeInput("boolean", + "flag to indicate tls enable/disable", + cs.getAuxilary().getTls_info().get("use_tls")); retInputs.put("use_tls", useTlsFlagInput); } + + private void addExternalTlsInfo(ComponentSpec cs, Map> retInputs) { + if(cs.getAuxilary().getTls_info().get(ExternalTlsInfo.USE_EXTERNAL_TLS_FIELD) == null) + return; + this.setExternal_cert(ExternalTlsInfo.createFromComponentSpec(cs)); + retInputs.putAll(ExternalTlsInfo.createInputMapFromComponentSpec(cs)); + } + + static LinkedHashMap makeInput(String type, String description, Object defaultValue) { + LinkedHashMap inputMap = new LinkedHashMap<>(); + inputMap.put("type", type); + inputMap.put("description", description); + inputMap.put("default", defaultValue); + return inputMap; + } } diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/componentspec/Auxilary.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/componentspec/Auxilary.java index 73acda8..a36deb5 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/componentspec/Auxilary.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/componentspec/Auxilary.java @@ -3,6 +3,8 @@ ================================================================================ Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. ================================================================================ + Modifications Copyright (c) 2020 Nokia. All rights reserved. + ================================================================================ 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 @@ -125,4 +127,4 @@ public class Auxilary { // this.setPorts(ports); // return retInputs; // } -} \ No newline at end of file +} diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapBlueprint.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapBlueprint.java index 21eabf0..c4cc663 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapBlueprint.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapBlueprint.java @@ -3,6 +3,8 @@ ================================================================================ Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. ================================================================================ + Modifications Copyright (c) 2020 Nokia. All rights reserved. + ================================================================================ 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 @@ -114,4 +116,4 @@ public class DmaapBlueprint extends Blueprint{ bp.setInputs(inps); return bp; } -} \ No newline at end of file +} diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapNode.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapNode.java index 6c74347..e84901c 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapNode.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/dmaapbp/DmaapNode.java @@ -52,10 +52,6 @@ import lombok.Setter; public class DmaapNode extends Node{ - private TreeMap interfaces; - private Properties properties; - private ArrayList> relationships; - public TreeMap> createDmaapNode(ComponentSpec cs, TreeMap> inps, String override) { TreeMap> retInputs = inps; diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/onapbp/OnapBlueprint.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/onapbp/OnapBlueprint.java index c0ef8b3..9f6f560 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/onapbp/OnapBlueprint.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/onapbp/OnapBlueprint.java @@ -2,7 +2,9 @@ org.onap.dcae ================================================================================ Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. - ================================================================================ + ================================================================================ + Modifications Copyright (c) 2020 Nokia. All rights reserved. + ================================================================================ 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 @@ -52,7 +54,7 @@ public class OnapBlueprint extends Blueprint{ this.setTosca_definitions_version("cloudify_dsl_1_3"); //set the imports - if(importPath != "") { + if(!"".equals(importPath)) { Imports imps = new Imports(); this.setImports(imps.createImportsFromFile(importPath)); } @@ -94,4 +96,4 @@ public class OnapBlueprint extends Blueprint{ return bp; } -} \ No newline at end of file +} diff --git a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/onapbp/OnapNode.java b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/onapbp/OnapNode.java index dbff78c..b0d1302 100644 --- a/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/onapbp/OnapNode.java +++ b/mod/bpgenerator/src/main/java/org/onap/blueprintgenerator/models/onapbp/OnapNode.java @@ -48,9 +48,6 @@ import lombok.NoArgsConstructor; @JsonInclude(value=Include.NON_NULL) public class OnapNode extends Node{ - private TreeMap interfaces; - private Properties properties; - private ArrayList> relationships; public TreeMap> createOnapNode(TreeMap> inps, ComponentSpec cs, String override) { TreeMap> retInputs = new TreeMap>(); @@ -90,4 +87,4 @@ public class OnapNode extends Node{ return retInputs; } -} \ No newline at end of file +} diff --git a/mod/bpgenerator/src/test/java/org/onap/blueprintgenerator/core/BlueprintGeneratorTest.java b/mod/bpgenerator/src/test/java/org/onap/blueprintgenerator/core/BlueprintGeneratorTest.java index 9c581cf..4ebd23c 100644 --- a/mod/bpgenerator/src/test/java/org/onap/blueprintgenerator/core/BlueprintGeneratorTest.java +++ b/mod/bpgenerator/src/test/java/org/onap/blueprintgenerator/core/BlueprintGeneratorTest.java @@ -392,6 +392,8 @@ public class BlueprintGeneratorTest { assertEquals(true, test); } + + @Test public void dmaapPluginTest() { ComponentSpec cs = new ComponentSpec(); diff --git a/mod/bpgenerator/src/test/java/org/onap/blueprintgenerator/core/TlsInfoTest.java b/mod/bpgenerator/src/test/java/org/onap/blueprintgenerator/core/TlsInfoTest.java new file mode 100644 index 0000000..6bd7b40 --- /dev/null +++ b/mod/bpgenerator/src/test/java/org/onap/blueprintgenerator/core/TlsInfoTest.java @@ -0,0 +1,162 @@ +/**============LICENSE_START======================================================= + org.onap.dcae + ================================================================================ + Copyright (c) 2020 Nokia. All rights reserved. + ================================================================================ + 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. + ============LICENSE_END========================================================= + */ + +package org.onap.blueprintgenerator.core; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.onap.blueprintgenerator.models.blueprint.Blueprint; +import org.onap.blueprintgenerator.models.blueprint.ExternalTlsInfo; +import org.onap.blueprintgenerator.models.blueprint.Node; +import org.onap.blueprintgenerator.models.blueprint.TlsInfo; +import org.onap.blueprintgenerator.models.componentspec.ComponentSpec; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +@RunWith(Parameterized.class) +public class TlsInfoTest { + + @Parameterized.Parameter + public char bpType; + + @Parameterized.Parameters(name = "Blueprint type: {0}") + public static List data() { + return Arrays.asList('o', 'd'); + } + + @Test + public void useTlsTrueAndUseExternalTlsTrueTest(){ + Blueprint bp = createBlueprintFromFile("TestCases/TlsInfo/testComponentSpec_withTlsTrueAndExternalTlsTrue.json"); + + assertBlueprintContainsExternalTlsInfoWithUseFlagDefault(bp, true); + assertBlueprintContainsTlsInfoWithUseFlagDefault(bp, true); + } + + @Test + public void useTlsFalseAndUseExternalTlsFalseTest(){ + Blueprint bp = createBlueprintFromFile("TestCases/TlsInfo/testComponentSpec_withTlsFalseAndExternalTlsFalse.json"); + + assertBlueprintContainsExternalTlsInfoWithUseFlagDefault(bp, false); + assertBlueprintContainsTlsInfoWithUseFlagDefault(bp, false); + } + + @Test + public void useTlsTrueAndNoExternalTlsFlagTest(){ + Blueprint bp = createBlueprintFromFile("TestCases/TlsInfo/testComponentSpec_withTlsTrueAndNoExternalTls.json"); + + assertBlueprintContainsTlsInfoWithUseFlagDefault(bp, true); + assertBlueprintHasNoExternalTlsInfo(bp); + } + + @Test + public void noTlsInfo(){ + Blueprint bp = createBlueprintFromFile("TestCases/TlsInfo/testComponentSpec_withoutTlsInfo.json"); + + assertBlueprintHasNoTlsInfo(bp); + assertBlueprintHasNoExternalTlsInfo(bp); + } + + private void assertBlueprintContainsExternalTlsInfoWithUseFlagDefault(Blueprint bp, boolean useFlagDefault) { + //should create proper inputs + assertContainsInputWithDefault(bp, "external_cert_use_external_tls", useFlagDefault); + assertContainsInputWithDefault(bp, "external_cert_ca_name", "\"RA\""); + assertContainsInputWithDefault(bp, "external_cert_cert_type", "\"P12\""); + assertContainsInputWithDefault(bp, "external_cert_common_name", "\"sample.onap.org\""); + assertContainsInputWithDefault(bp, "external_cert_sans", + "\"sample.onap.org:component.sample.onap.org\""); + + Node node = bp.getNode_templates().get("test.component.spec"); + + //should create proper externalTlsInfo object in node properties + ExternalTlsInfo externalTlsInfo = node.getProperties().getExternal_cert(); + assertNotNull(externalTlsInfo); + + assertEquals("external_cert_ca_name", externalTlsInfo.getCaName().getGet_input()); + assertEquals("external_cert_cert_type", externalTlsInfo.getCertType().getGet_input()); + assertEquals("external_cert_use_external_tls", externalTlsInfo.getUseExternalTls().getGet_input()); + assertEquals("/opt/app/dcae-certificate/", externalTlsInfo.getExternalCertDirectory()); + + ExternalTlsInfo.ExternalCertificateParameters extCertParams = externalTlsInfo.getExternalCertificateParameters(); + assertNotNull(extCertParams); + + assertEquals("external_cert_common_name", extCertParams.getCommonName().getGet_input()); + assertEquals("external_cert_sans", extCertParams.getSans().getGet_input()); + } + + private void assertBlueprintContainsTlsInfoWithUseFlagDefault(Blueprint bp, boolean useFlagDefault) { + //shold create proper inputs + assertContainsInputWithDefault(bp, "use_tls", useFlagDefault); + + Node node = bp.getNode_templates().get("test.component.spec"); + + //should create proper tlsInfo object in node properties + TlsInfo tlsInfo = node.getProperties().getTls_info(); + assertEquals("use_tls", tlsInfo.getUseTls().getGet_input()); + assertEquals("/opt/app/dcae-certificate/", tlsInfo.getCertDirectory()); + + } + + private void assertBlueprintHasNoExternalTlsInfo(Blueprint bp) { + //should not create inputs for external tls + assertFalse(bp.getInputs().containsKey("external_cert_use_external_tls")); + assertFalse(bp.getInputs().containsKey("external_cert_common_name")); + assertFalse(bp.getInputs().containsKey("external_cert_ca_name")); + assertFalse(bp.getInputs().containsKey("external_cert_sans")); + + Node node = bp.getNode_templates().get("test.component.spec"); + + //should not create externalTlsInfo object in node properties + ExternalTlsInfo externalTlsInfo = node.getProperties().getExternal_cert(); + assertNull(externalTlsInfo); + } + + + private void assertBlueprintHasNoTlsInfo(Blueprint bp) { + //should not create inputs for tls + assertFalse(bp.getInputs().containsKey("use_tls")); + + Node node = bp.getNode_templates().get("test.component.spec"); + + //should not create tlsInfo object in node properties + assertNull(node.getProperties().getTls_info()); + } + + private void assertContainsInputWithDefault(Blueprint bp, String inputName, Object defaultValue) { + LinkedHashMap input = bp.getInputs().get(inputName); + assertNotNull(input); + assertEquals(defaultValue, input.get("default")); + } + + private Blueprint createBlueprintFromFile(String path) { + ComponentSpec cs = new ComponentSpec(); + cs.createComponentSpecFromFile(path); + + Blueprint bp = new Blueprint(); + bp = bp.createBlueprint(cs, "", this.bpType, "", ""); + return bp; + } +} diff --git a/mod/bpgenerator/version.properties b/mod/bpgenerator/version.properties index fd60497..9e0d73d 100644 --- a/mod/bpgenerator/version.properties +++ b/mod/bpgenerator/version.properties @@ -1,6 +1,6 @@ major=1 -minor=3 -patch=3 +minor=4 +patch=0 base_version=${major}.${minor}.${patch} release_version=${base_version} snapshot_version=${base_version}-SNAPSHOT diff --git a/mod/component-json-schemas/component-specification/dcae-cli-v2/component-spec-schema.json b/mod/component-json-schemas/component-specification/dcae-cli-v2/component-spec-schema.json index 0fd68ec..63032cb 100644 --- a/mod/component-json-schemas/component-specification/dcae-cli-v2/component-spec-schema.json +++ b/mod/component-json-schemas/component-specification/dcae-cli-v2/component-spec-schema.json @@ -38,9 +38,9 @@ "uniqueItems": true, "items": { "oneOf": [ - { "$ref": "#/definitions/publisher_http" }, - { "$ref": "#/definitions/publisher_message_router" }, - { "$ref": "#/definitions/publisher_data_router" } + { "$ref": "#/definitions/publisher_http" }, + { "$ref": "#/definitions/publisher_message_router" }, + { "$ref": "#/definitions/publisher_data_router" } ] } }, @@ -49,9 +49,9 @@ "uniqueItems": true, "items": { "oneOf": [ - { "$ref": "#/definitions/subscriber_http" }, - { "$ref": "#/definitions/subscriber_message_router" }, - { "$ref": "#/definitions/subscriber_data_router" } + { "$ref": "#/definitions/subscriber_http" }, + { "$ref": "#/definitions/subscriber_message_router" }, + { "$ref": "#/definitions/subscriber_data_router" } ] } } @@ -84,7 +84,7 @@ "provides" ] }, - "parameters" : { + "parameters" : { "anyOf" : [ {"$ref": "#/definitions/docker-parameters"}, {"$ref": "#/definitions/cdap-parameters"} @@ -106,25 +106,25 @@ "policy_info": { "type": "object", "properties": { - "policy": + "policy": { "type": "array", - "items": + "items": { "type": "object", - "properties": + "properties": { - "node_label": + "node_label": { "type": "string" }, - "policy_id": + "policy_id": { - "type": "string" + "type": "string" }, - "policy_model_id": + "policy_model_id": { - "type": "string" + "type": "string" } }, "required": ["node_label", "policy_model_id"] @@ -159,18 +159,18 @@ "app_preferences" : { "description" : "Parameters Passed down to the CDAP preference API", "type": "array", - "uniqueItems": true, - "items": { - "$ref": "#/definitions/parameter" - } + "uniqueItems": true, + "items": { + "$ref": "#/definitions/parameter" + } }, "app_config" : { "description" : "Parameters Passed down to the CDAP App Config", "type": "array", - "uniqueItems": true, - "items": { - "$ref": "#/definitions/parameter" - } + "uniqueItems": true, + "items": { + "$ref": "#/definitions/parameter" + } } } }, @@ -185,11 +185,11 @@ }, "program_pref":{ "description" : "Parameters that the CDAP developer wants pushed to this program's preferences API. Optional", - "type": "array", - "uniqueItems": true, - "items": { - "$ref": "#/definitions/parameter" - } + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/definitions/parameter" + } } }, "required": ["program_type", "program_id", "program_pref"] @@ -207,8 +207,8 @@ }, "parameter": { "oneOf": [ - {"$ref": "#/definitions/parameter-list"}, - {"$ref": "#/definitions/parameter-other"} + {"$ref": "#/definitions/parameter-list"}, + {"$ref": "#/definitions/parameter-other"} ] }, "parameter-list": { @@ -241,10 +241,10 @@ } }, "entry_schema": { - "description": "The optional property used to declare the name of the Datatype definition for entries of certain types. entry_schema must be defined when the type is list. This is the only type it is currently supported for.", - "type": "object", - "uniqueItems": true, - "items": {"$ref": "#/definitions/list-parameter"} + "description": "The optional property used to declare the name of the Datatype definition for entries of certain types. entry_schema must be defined when the type is list. This is the only type it is currently supported for.", + "type": "object", + "uniqueItems": true, + "items": {"$ref": "#/definitions/list-parameter"} }, "designer_editable": { "description": "A required property that declares a parameter as editable by designer in SDC Tool (true) or not (false).", @@ -362,44 +362,44 @@ "additionalProperties": false }, "policy_schema_parameter": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "value": { - "description": "Default value for the parameter" - }, - "description": { - "description": "Description for the parameter.", - "type": "string" - }, - "type": { - "description": "The required data type for the parameter.", - "type": "string", - "enum": [ "string", "number", "boolean", "datetime", "list", "map" ] - }, - "required": { - "description": "An optional key that declares a parameter as required (true) or not (false). Default is true.", - "type": "boolean", - "default": true - }, - "constraints": { - "description": "The optional list of sequenced constraint clauses for the parameter.", - "type": "array", - "items": { - "$ref": "#/definitions/parameter-constraints" - } - }, - "entry_schema": { - "description": "The optional key that is used to declare the name of the Datatype definition for entries of certain types. entry_schema must be defined when the type is either list or map. If the type is list and the entry type is a simple type (string, number, boolean, datetime), follow with a simple string to describe the entry type. If the type is list and the entry type is a map, follow with an array to describe the keys for the entry map. If the type is list and the entry type is also list, this is not currently supported here. If the type is map, then follow with an array to describe the keys for this map. ", - "type": "array", "uniqueItems": true, "items": {"$ref": "#/definitions/policy_schema_parameter"} - } - }, - "required": [ - "name", - "type" - ], + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "description": "Default value for the parameter" + }, + "description": { + "description": "Description for the parameter.", + "type": "string" + }, + "type": { + "description": "The required data type for the parameter.", + "type": "string", + "enum": [ "string", "number", "boolean", "datetime", "list", "map" ] + }, + "required": { + "description": "An optional key that declares a parameter as required (true) or not (false). Default is true.", + "type": "boolean", + "default": true + }, + "constraints": { + "description": "The optional list of sequenced constraint clauses for the parameter.", + "type": "array", + "items": { + "$ref": "#/definitions/parameter-constraints" + } + }, + "entry_schema": { + "description": "The optional key that is used to declare the name of the Datatype definition for entries of certain types. entry_schema must be defined when the type is either list or map. If the type is list and the entry type is a simple type (string, number, boolean, datetime), follow with a simple string to describe the entry type. If the type is list and the entry type is a map, follow with an array to describe the keys for the entry map. If the type is list and the entry type is also list, this is not currently supported here. If the type is map, then follow with an array to describe the keys for this map. ", + "type": "array", "uniqueItems": true, "items": {"$ref": "#/definitions/policy_schema_parameter"} + } + }, + "required": [ + "name", + "type" + ], "additionalProperties": false }, "parameter-constraints": { @@ -600,21 +600,21 @@ "cdap-provider" : { "type": "object", "properties" : { - "request": { - "$ref": "#/definitions/formatPair" - }, - "response": { - "$ref": "#/definitions/formatPair" - }, - "service_name" : { - "type" : "string" - }, - "service_endpoint" : { - "type" : "string" - }, - "verb" : { - "type": "string", - "enum": ["GET", "PUT", "POST", "DELETE"] + "request": { + "$ref": "#/definitions/formatPair" + }, + "response": { + "$ref": "#/definitions/formatPair" + }, + "service_name" : { + "type" : "string" + }, + "service_endpoint" : { + "type" : "string" + }, + "verb" : { + "type": "string", + "enum": ["GET", "PUT", "POST", "DELETE"] } }, "required" : [ @@ -623,7 +623,7 @@ "service_name", "service_endpoint", "verb" - ] + ] }, "docker-provider": { "type": "object", @@ -796,11 +796,15 @@ "use_tls": { "description": "Boolean flag to determine if the application is using tls certificates", "type": "boolean" + }, + "use_external_tls": { + "description": "Boolean flag to determine if the application is using tls certificates for external communication", + "type": "boolean" } }, "required": [ - "cert_directory","use_tls" - ], + "cert_directory","use_tls" + ], "additionalProperties": false }, "databases": { @@ -814,34 +818,34 @@ } }, "policy": { - "properties": { - "trigger_type": { - "description": "Only value of docker is supported at this time.", - "type": "string", - "enum": ["docker"] - }, - "script_path": { - "description": "Script command that will be executed for policy reconfiguration", - "type": "string" - } + "properties": { + "trigger_type": { + "description": "Only value of docker is supported at this time.", + "type": "string", + "enum": ["docker"] }, - "required": [ - "trigger_type","script_path" - ], - "additionalProperties": false + "script_path": { + "description": "Script command that will be executed for policy reconfiguration", + "type": "string" + } + }, + "required": [ + "trigger_type","script_path" + ], + "additionalProperties": false }, "volumes": { "description": "Volume mapping to be used for Docker containers. Each entry is of the format below", "type": "array", "items": { - "type": "object", + "type": "object", "properties": { "host":{ - "type":"object", + "type":"object", "path": {"type": "string"} }, "container":{ - "type":"object", + "type":"object", "bind": { "type": "string"}, "mode": { "type": "string"} } @@ -882,7 +886,7 @@ "required": [ "type", "endpoint" - ] + ] }, "docker_healthcheck_script": { "properties": { @@ -912,7 +916,7 @@ "required": [ "type", "script" - ] + ] } } } diff --git a/mod/runtimeapi/runtime-core/pom.xml b/mod/runtimeapi/runtime-core/pom.xml index 7add43b..c43c3dc 100644 --- a/mod/runtimeapi/runtime-core/pom.xml +++ b/mod/runtimeapi/runtime-core/pom.xml @@ -44,7 +44,7 @@ limitations under the License. org.onap.dcaegen2.platform.mod blueprint-generator - 1.3.1 + 1.3.1 org.json -- cgit 1.2.3-korg