From c09c0fa4ef4c1cd7e7e28a12c9469b783b75d4d8 Mon Sep 17 00:00:00 2001 From: "Singal, Kapil (ks220y)" Date: Tue, 4 Sep 2018 22:04:48 -0400 Subject: SDNC Blueprints Content Generation Service Creating SDNC Blueprints Content Generation Service to mash data into Velocity Templates Change-Id: I0b5100f1dd242b9d70df7f919c2a7e4105364eed Issue-ID: CCSDK-504 Signed-off-by: Singal, Kapil (ks220y) --- .../config/generator/ConfigGeneratorConstant.java | 49 +++ .../config/generator/data/ConfigGeneratorInfo.java | 102 ++++++ .../generator/service/ConfigGeneratorNode.java | 140 ++++++++ .../generator/service/ConfigGeneratorService.java | 33 ++ .../service/ConfigGeneratorServiceImpl.java | 143 +++++++++ .../generator/tool/CustomJsonNodeFactory.java | 30 ++ .../config/generator/tool/CustomTextNode.java | 42 +++ .../ccsdk/config/generator/tool/EscapeUtils.java | 82 +++++ .../org/opendaylight/blueprint/impl-blueprint.xml | 49 +++ .../generator/service/ConfigGeneratorNodeTest.java | 222 +++++++++++++ .../config/generator/tool/EscapeUtilsTest.java | 51 +++ .../resources/service_templates/configdata.json | 36 +++ .../service_templates/configdata_with_null.json | 36 +++ .../service_templates/generate_configuration.json | 355 +++++++++++++++++++++ .../velocity/base-config-template.vtl | 61 ++++ .../velocity/base-config-template_group.vtl | 40 +++ 16 files changed, 1471 insertions(+) create mode 100644 blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/ConfigGeneratorConstant.java create mode 100644 blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/data/ConfigGeneratorInfo.java create mode 100644 blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorNode.java create mode 100644 blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorService.java create mode 100644 blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorServiceImpl.java create mode 100644 blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/CustomJsonNodeFactory.java create mode 100644 blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/CustomTextNode.java create mode 100644 blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/EscapeUtils.java create mode 100644 blueprints-processor/plugin/generator-provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml create mode 100644 blueprints-processor/plugin/generator-provider/src/test/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorNodeTest.java create mode 100644 blueprints-processor/plugin/generator-provider/src/test/java/org/onap/ccsdk/config/generator/tool/EscapeUtilsTest.java create mode 100644 blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/configdata.json create mode 100644 blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/configdata_with_null.json create mode 100644 blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/generate_configuration.json create mode 100644 blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/velocity/base-config-template.vtl create mode 100644 blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/velocity/base-config-template_group.vtl (limited to 'blueprints-processor') diff --git a/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/ConfigGeneratorConstant.java b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/ConfigGeneratorConstant.java new file mode 100644 index 000000000..b859b69cd --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/ConfigGeneratorConstant.java @@ -0,0 +1,49 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. + * Modifications Copyright © 2018 IBM. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.ccsdk.config.generator; + +public class ConfigGeneratorConstant { + + private ConfigGeneratorConstant() { + + } + + public static final String STRING_ENCODING = "utf-8"; + public static final String Y = "Y"; + public static final String N = "N"; + public static final String DATA_TYPE_TEXT = "TEXT"; + public static final String DATA_TYPE_JSON = "JSON"; + public static final String DATA_TYPE_XML = "XML"; + public static final String DATA_TYPE_SQL = "SQL"; + + public static final String INPUT_PARAM_REQUEST_ID = "request-id"; + public static final String INPUT_PARAM_RESOURCE_ID = "resource-id"; + public static final String INPUT_PARAM_RESOURCE_TYPE = "resource-type"; + public static final String INPUT_PARAM_ACTION_NAME = "action-name"; + public static final String INPUT_PARAM_TEMPLATE_NAME = "template-name"; + public static final String INPUT_PARAM_TEMPLATE_CONTENT = "template-content"; + public static final String INPUT_PARAM_TEMPLATE_DATA = "template-data"; + + public static final String OUTPUT_PARAM_GENERATED_CONFIG = "generated-config"; + public static final String OUTPUT_PARAM_MASK_INFO = "mask-info"; + public static final String OUTPUT_PARAM_STATUS = "status"; + public static final String OUTPUT_PARAM_ERROR_MESSAGE = "error-message"; + public static final String OUTPUT_STATUS_SUCCESS = "success"; + public static final String OUTPUT_STATUS_FAILURE = "failure"; + +} diff --git a/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/data/ConfigGeneratorInfo.java b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/data/ConfigGeneratorInfo.java new file mode 100644 index 000000000..ec461549a --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/data/ConfigGeneratorInfo.java @@ -0,0 +1,102 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. + * Modifications Copyright © 2018 IBM. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.ccsdk.config.generator.data; + +public class ConfigGeneratorInfo { + + private String requestId; + private String resourceId; + private String resourceType; + private String templateName; + private String recipeName; + private String resourceData; + private String templateContent; + private String mashedData; + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public String getResourceId() { + return resourceId; + } + + public void setResourceId(String resourceId) { + this.resourceId = resourceId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getTemplateName() { + return templateName; + } + + public void setTemplateName(String templateName) { + this.templateName = templateName; + } + + public String getRecipeName() { + return recipeName; + } + + public void setRecipeName(String recipeName) { + this.recipeName = recipeName; + } + + public String getResourceData() { + return resourceData; + } + + public void setResourceData(String resourceData) { + this.resourceData = resourceData; + } + + public String getTemplateContent() { + return templateContent; + } + + public void setTemplateContent(String templateContent) { + this.templateContent = templateContent; + } + + public String getMashedData() { + return mashedData; + } + + public void setMashedData(String mashedData) { + this.mashedData = mashedData; + } + + @Override + public String toString() { + return "ConfigGeneratorInfo [requestId=" + requestId + ", resourceId=" + resourceId + ", resourceType=" + + resourceType + ", templateName=" + templateName + ", recipeName=" + recipeName + ", resourceData=" + + resourceData + ", templateContent=" + templateContent + ", mashedData=" + mashedData + "]"; + } + +} diff --git a/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorNode.java b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorNode.java new file mode 100644 index 000000000..136ba7f25 --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorNode.java @@ -0,0 +1,140 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. + * Modifications Copyright © 2018 IBM. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.ccsdk.config.generator.service; + +import java.util.Map; +import org.apache.commons.lang3.StringUtils; +import org.onap.ccsdk.config.data.adaptor.service.ConfigResourceService; +import org.onap.ccsdk.config.generator.ConfigGeneratorConstant; +import org.onap.ccsdk.config.generator.data.ConfigGeneratorInfo; +import org.onap.ccsdk.config.model.ConfigModelConstant; +import org.onap.ccsdk.config.model.service.ComponentNode; +import org.onap.ccsdk.config.model.service.ConfigModelService; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + +public class ConfigGeneratorNode implements ComponentNode { + + private static EELFLogger logger = EELFManager.getInstance().getLogger(ConfigGeneratorNode.class); + + private ConfigModelService configModelService; + private ConfigResourceService configResourceService; + private ConfigGeneratorService configGeneratorService; + + public ConfigGeneratorNode(ConfigResourceService configResourceService, ConfigModelService configModelService) { + this.configResourceService = configResourceService; + this.configModelService = configModelService; + this.configGeneratorService = new ConfigGeneratorServiceImpl(this.configResourceService); + } + + @Override + public Boolean preCondition(Map inParams, SvcLogicContext ctx, Map componentContext) + throws SvcLogicException { + logger.trace("Received generateConfiguration preCondition call with params : ({})", inParams); + return Boolean.TRUE; + } + + @Override + public void preProcess(Map inParams, SvcLogicContext ctx, Map componentContext) + throws SvcLogicException { + logger.trace("Received generateConfiguration preProcess call with params : ({})", inParams); + } + + @Override + public void process(Map inParams, SvcLogicContext ctx) throws SvcLogicException { + logger.trace("Received generateConfiguration process call with params : ({})", inParams); + } + + @SuppressWarnings("squid:S3776") + @Override + public void process(Map inParams, SvcLogicContext ctx, Map componentContext) + throws SvcLogicException { + logger.trace("Received generateConfiguration process with params : ({})", inParams); + String prifix = inParams.get(ConfigModelConstant.PROPERTY_SELECTOR); + try { + prifix = StringUtils.isNotBlank(prifix) ? (prifix + ".") : ""; + + String templateContent = inParams.get(ConfigGeneratorConstant.INPUT_PARAM_TEMPLATE_CONTENT); + String templateData = inParams.get(ConfigGeneratorConstant.INPUT_PARAM_TEMPLATE_DATA); + String requestId = inParams.get(ConfigGeneratorConstant.INPUT_PARAM_REQUEST_ID); + String resourceId = inParams.get(ConfigGeneratorConstant.INPUT_PARAM_RESOURCE_ID); + String resourceType = inParams.get(ConfigGeneratorConstant.INPUT_PARAM_RESOURCE_TYPE); + String recipeName = inParams.get(ConfigGeneratorConstant.INPUT_PARAM_ACTION_NAME); + String templateName = inParams.get(ConfigGeneratorConstant.INPUT_PARAM_TEMPLATE_NAME); + + ConfigGeneratorInfo configGeneratorInfo = null; + if (StringUtils.isNotBlank(templateContent) && StringUtils.isNotBlank(templateData)) { + configGeneratorInfo = this.configGeneratorService.generateConfiguration(templateContent, templateData); + } else { + if (StringUtils.isBlank(requestId)) { + throw new SvcLogicException("Config Generator Request Id is missing."); + } + if (StringUtils.isBlank(resourceId)) { + throw new SvcLogicException("Config Generator Resource Id is missing."); + } + if (StringUtils.isBlank(resourceType)) { + throw new SvcLogicException("Config Generator Resource Type is missing."); + } + if (StringUtils.isBlank(recipeName)) { + throw new SvcLogicException("Config Generator Action Name is missing."); + } + if (StringUtils.isBlank(templateName)) { + throw new SvcLogicException("Config Generator Template Name Id is missing."); + } + + templateContent = configModelService.getNodeTemplateContent(ctx, templateName); + + if (StringUtils.isBlank(templateContent)) { + throw new SvcLogicException( + "Failed to get the Template Content for the Temaple Name :" + templateName); + } + + configGeneratorInfo = new ConfigGeneratorInfo(); + configGeneratorInfo.setRequestId(requestId); + configGeneratorInfo.setResourceId(resourceId); + configGeneratorInfo.setResourceType(resourceType); + configGeneratorInfo.setRecipeName(recipeName); + configGeneratorInfo.setTemplateName(templateName); + configGeneratorInfo.setTemplateContent(templateContent); + + this.configGeneratorService.generateConfiguration(configGeneratorInfo); + } + if (configGeneratorInfo != null) { + ctx.setAttribute(prifix + ConfigGeneratorConstant.OUTPUT_PARAM_GENERATED_CONFIG, + configGeneratorInfo.getMashedData()); + } + ctx.setAttribute(prifix + ConfigGeneratorConstant.OUTPUT_PARAM_STATUS, + ConfigGeneratorConstant.OUTPUT_STATUS_SUCCESS); + } catch (Exception e) { + ctx.setAttribute(prifix + ConfigGeneratorConstant.OUTPUT_PARAM_STATUS, + ConfigGeneratorConstant.OUTPUT_STATUS_FAILURE); + ctx.setAttribute(prifix + ConfigGeneratorConstant.OUTPUT_PARAM_ERROR_MESSAGE, e.getMessage()); + logger.error("Failed in generateConfiguration ({})", e); + throw new SvcLogicException(e.getMessage()); + } + } + + @Override + public void postProcess(Map inParams, SvcLogicContext ctx, Map componentContext) + throws SvcLogicException { + logger.info("Received generateConfiguration postProcess with params : ({})", inParams); + } + +} diff --git a/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorService.java b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorService.java new file mode 100644 index 000000000..710d47d25 --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorService.java @@ -0,0 +1,33 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. + * Modifications Copyright © 2018 IBM. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.ccsdk.config.generator.service; + +import org.onap.ccsdk.config.generator.data.ConfigGeneratorInfo; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; + +public interface ConfigGeneratorService { + + public ConfigGeneratorInfo generateConfiguration(String templateContent, String templateData) + throws SvcLogicException; + + public ConfigGeneratorInfo generateConfiguration(String templateContent, String templateData, boolean ignoreNull) + throws SvcLogicException; + + public ConfigGeneratorInfo generateConfiguration(ConfigGeneratorInfo configGeneratorInfo) throws SvcLogicException; + +} diff --git a/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorServiceImpl.java b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorServiceImpl.java new file mode 100644 index 000000000..472f5b291 --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorServiceImpl.java @@ -0,0 +1,143 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. + * Modifications Copyright © 2018 IBM. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.ccsdk.config.generator.service; + +import java.io.StringWriter; +import java.util.Iterator; +import java.util.List; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.onap.ccsdk.config.data.adaptor.domain.ConfigResource; +import org.onap.ccsdk.config.data.adaptor.service.ConfigResourceService; +import org.onap.ccsdk.config.generator.data.ConfigGeneratorInfo; +import org.onap.ccsdk.config.generator.tool.CustomJsonNodeFactory; +import org.onap.ccsdk.config.model.utils.TransformationUtils; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ConfigGeneratorServiceImpl implements ConfigGeneratorService { + + private static EELFLogger logger = EELFManager.getInstance().getLogger(ConfigGeneratorServiceImpl.class); + private static final String CLASS_NAME = "ConfigGeneratorServiceImpl"; + + private ConfigResourceService configResourceService; + + public ConfigGeneratorServiceImpl(ConfigResourceService configResourceService) { + logger.info("{} Constuctor Initated...", CLASS_NAME); + this.configResourceService = configResourceService; + } + + @Override + public ConfigGeneratorInfo generateConfiguration(ConfigGeneratorInfo configGeneratorInfo) throws SvcLogicException { + + if (configGeneratorInfo != null && StringUtils.isNotBlank(configGeneratorInfo.getResourceId()) + && StringUtils.isNotBlank(configGeneratorInfo.getResourceType()) + && StringUtils.isNotBlank(configGeneratorInfo.getRecipeName()) + && StringUtils.isNotBlank(configGeneratorInfo.getTemplateName()) + && StringUtils.isNotBlank(configGeneratorInfo.getTemplateContent())) { + + ConfigResource configResourceQuery = new ConfigResource(); + configResourceQuery.setResourceId(configGeneratorInfo.getResourceId()); + configResourceQuery.setResourceType(configGeneratorInfo.getResourceType()); + configResourceQuery.setTemplateName(configGeneratorInfo.getTemplateName()); + + List configResourceList = configResourceService.getConfigResource(configResourceQuery); + + if (CollectionUtils.isEmpty(configResourceList)) { + throw new SvcLogicException("No Config Resource found"); + } else if (configResourceList.size() > 1) { + throw new SvcLogicException("More than one Config Resource found for specified parameter for" + + " resourceId " + configGeneratorInfo.getResourceId() + ", resourceType " + + configGeneratorInfo.getResourceType() + ", recipeName " + configGeneratorInfo.getRecipeName() + + ", templateName " + configGeneratorInfo.getTemplateName()); + } + + ConfigResource configResource = configResourceList.get(0); + + if (configResource != null && StringUtils.isNotBlank(configResource.getResourceData())) { + configGeneratorInfo.setResourceData(configResource.getResourceData()); + logger.debug("Retrieve ConfigResource Data : ({})", configResource.getResourceData()); + ConfigGeneratorInfo generatorInfo = generateConfiguration(configGeneratorInfo.getTemplateContent(), + configResource.getResourceData()); + if (generatorInfo != null) { + configGeneratorInfo.setMashedData(generatorInfo.getMashedData()); + } + } else { + throw new SvcLogicException( + "Failed to get the Resource Data for the Resource Id :" + configGeneratorInfo.getResourceId() + + " of template :" + configGeneratorInfo.getTemplateName()); + } + } + return configGeneratorInfo; + } + + @Override + public ConfigGeneratorInfo generateConfiguration(String templateContent, String templateData) + throws SvcLogicException { + return generateConfiguration(templateContent, templateData, true); + } + + @Override + public ConfigGeneratorInfo generateConfiguration(String templateContent, String templateData, boolean ignoreNull) + throws SvcLogicException { + ConfigGeneratorInfo configGeneratorInfo = null; + try { + if (StringUtils.isNotBlank(templateContent) && StringUtils.isNotBlank(templateData)) { + configGeneratorInfo = new ConfigGeneratorInfo(); + + Velocity.init(); + + ObjectMapper mapper = new ObjectMapper(); + CustomJsonNodeFactory f = new CustomJsonNodeFactory(); + mapper.setNodeFactory(f); + + JsonNode jsonObj = mapper.readValue(templateData, JsonNode.class); + if (ignoreNull) { + TransformationUtils.removeJsonNullNode(jsonObj); + } + + VelocityContext context = new VelocityContext(); + context.put("StringUtils", org.apache.commons.lang3.StringUtils.class); + context.put("BooleanUtils", org.apache.commons.lang3.BooleanUtils.class); + + Iterator ii = jsonObj.fieldNames(); + while (ii.hasNext()) { + String key = ii.next(); + JsonNode node = jsonObj.get(key); + logger.info("Adding key ({}) with value ({})", key, node); + context.put(key, node); + } + + StringWriter writer = new StringWriter(); + Velocity.evaluate(context, writer, "TemplateData", templateContent); + writer.flush(); + configGeneratorInfo.setMashedData(writer.toString()); + } + } catch (Exception e) { + logger.error("Failed to generate Configuration ({})", e.getMessage()); + throw new SvcLogicException(e.getMessage(), e); + } + return configGeneratorInfo; + } + +} diff --git a/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/CustomJsonNodeFactory.java b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/CustomJsonNodeFactory.java new file mode 100644 index 000000000..3e69ef355 --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/CustomJsonNodeFactory.java @@ -0,0 +1,30 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. + * Modifications Copyright © 2018 IBM. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.ccsdk.config.generator.tool; + +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.TextNode; + +public class CustomJsonNodeFactory extends JsonNodeFactory { + + @Override + public TextNode textNode(String text) { + return new CustomTextNode(text); + } + +} diff --git a/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/CustomTextNode.java b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/CustomTextNode.java new file mode 100644 index 000000000..cf42c552b --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/CustomTextNode.java @@ -0,0 +1,42 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. + * Modifications Copyright © 2018 IBM. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.ccsdk.config.generator.tool; + +import com.fasterxml.jackson.core.io.CharTypes; +import com.fasterxml.jackson.databind.node.TextNode; + +public class CustomTextNode extends TextNode { + + public CustomTextNode(String v) { + super(v); + } + + @Override + public String toString() { + int len = textValue().length(); + len = len + 2 + (len >> 4); + StringBuilder sb = new StringBuilder(len); + appendQuoted(sb, textValue()); + return sb.toString(); + } + + protected static void appendQuoted(StringBuilder sb, String content) { + CharTypes.appendQuoted(sb, content); + } + +} diff --git a/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/EscapeUtils.java b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/EscapeUtils.java new file mode 100644 index 000000000..3009f87f9 --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/EscapeUtils.java @@ -0,0 +1,82 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. + * Modifications Copyright © 2018 IBM. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.ccsdk.config.generator.tool; + +import org.apache.commons.lang3.StringUtils; + +@SuppressWarnings("squid:S1118") +public class EscapeUtils { + + public static String escapeSql(String str) { + if (str == null) { + return null; + } + String[] searchList = new String[] {"'", "\\"}; + String[] replacementList = new String[] {"''", "\\\\"}; + return StringUtils.replaceEach(str, searchList, replacementList); + } + + // For Generic Purpose + public static String escapeSequence(String s) { + if (s == null) { + return null; + } + + int length = s.length(); + int newLength = length; + for (int i = 0; i < length; i++) { + char c = s.charAt(i); + switch (c) { + case '\\': + case '\"': + case '\'': + case '\0': + newLength += 1; + break; + default: + // do nothing + } + } + if (length == newLength) { + // nothing to escape in the string + return s; + } + StringBuilder sb = new StringBuilder(newLength); + for (int i = 0; i < length; i++) { + char c = s.charAt(i); + switch (c) { + case '\\': + sb.append("\\\\"); + break; + case '\"': + sb.append("\\\""); + break; + case '\'': + sb.append("\\\'"); + break; + case '\0': + sb.append("\\0"); + break; + default: + sb.append(c); + } + } + return sb.toString(); + } + +} diff --git a/blueprints-processor/plugin/generator-provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml b/blueprints-processor/plugin/generator-provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml new file mode 100644 index 000000000..7bf65fa4e --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blueprints-processor/plugin/generator-provider/src/test/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorNodeTest.java b/blueprints-processor/plugin/generator-provider/src/test/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorNodeTest.java new file mode 100644 index 000000000..941387347 --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/test/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorNodeTest.java @@ -0,0 +1,222 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. + * Modifications Copyright © 2018 IBM. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.ccsdk.config.generator.service; + +import static org.mockito.Matchers.any; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.stubbing.Answer; +import org.onap.ccsdk.config.data.adaptor.domain.ConfigResource; +import org.onap.ccsdk.config.data.adaptor.domain.TransactionLog; +import org.onap.ccsdk.config.data.adaptor.service.ConfigResourceService; +import org.onap.ccsdk.config.generator.ConfigGeneratorConstant; +import org.onap.ccsdk.config.model.ConfigModelConstant; +import org.onap.ccsdk.config.model.service.ConfigModelService; +import org.onap.ccsdk.config.model.service.ConfigModelServiceImpl; +import org.onap.ccsdk.config.model.utils.TransformationUtils; +import org.onap.ccsdk.config.rest.adaptor.service.ConfigRestAdaptorService; +import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.ccsdk.sli.core.sli.SvcLogicException; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + +@RunWith(MockitoJUnitRunner.class) +public class ConfigGeneratorNodeTest { + + private static EELFLogger logger = EELFManager.getInstance().getLogger(ConfigGeneratorNodeTest.class); + + @Mock + private ConfigResourceService configResourceService; + + @Mock + private ConfigRestAdaptorService configRestAdaptorService; + + private ConfigModelService configModelService; + + @Before + public void setUp() throws Exception { + + configModelService = new ConfigModelServiceImpl(configRestAdaptorService); + + MockitoAnnotations.initMocks(this); + + try { + Mockito.doAnswer(new Answer() { + @Override + public Void answer(InvocationOnMock invocationOnMock) throws Throwable { + Object[] args = invocationOnMock.getArguments(); + if (args != null) { + logger.trace("Transaction info " + Arrays.asList(args)); + } + return null; + } + }).when(configResourceService).save(any(TransactionLog.class)); + + Mockito.doAnswer(new Answer>() { + @Override + public List answer(InvocationOnMock invocationOnMock) throws Throwable { + List configResources = new ArrayList<>(); + Object[] args = invocationOnMock.getArguments(); + if (args != null) { + logger.trace("Transaction info " + Arrays.asList(args)); + String resourceData = IOUtils.toString(ConfigGeneratorNodeTest.class.getClassLoader() + .getResourceAsStream("service_templates/configdata.json"), Charset.defaultCharset()); + ConfigResource configResource = (ConfigResource) args[0]; + configResource.setRecipeName("Sample-recipe"); + configResource.setResourceData(resourceData); + configResources.add(configResource); + } + return configResources; + } + }).when(configResourceService).getConfigResource(any(ConfigResource.class)); + + } catch (SvcLogicException e) { + e.printStackTrace(); + } + } + + @Test + public void testInputTemplateContentNData() throws Exception { + + ConfigGeneratorNode configGeneratorNode = new ConfigGeneratorNode(configResourceService, configModelService); + + Map inParams = new HashMap(); + inParams.put(ConfigModelConstant.PROPERTY_SELECTOR, "test"); + + String jsonData = IOUtils.toString( + ConfigGeneratorNodeTest.class.getClassLoader().getResourceAsStream("service_templates/configdata.json"), + Charset.defaultCharset()); + inParams.put(ConfigGeneratorConstant.INPUT_PARAM_TEMPLATE_DATA, jsonData); + + String templateData = IOUtils.toString(ConfigGeneratorNodeTest.class.getClassLoader() + .getResourceAsStream("service_templates/velocity/base-config-template.vtl"), Charset.defaultCharset()); + inParams.put(ConfigGeneratorConstant.INPUT_PARAM_TEMPLATE_CONTENT, templateData); + + SvcLogicContext ctx = new SvcLogicContext(); + Map componentContext = new HashMap<>(); + configGeneratorNode.process(inParams, ctx, componentContext); + Assert.assertEquals("Failed to generate Configuration Status as Failure", + ConfigGeneratorConstant.OUTPUT_STATUS_SUCCESS, + ctx.getAttribute("test." + ConfigGeneratorConstant.OUTPUT_PARAM_STATUS)); + Assert.assertNotNull("Failed to generate Configuration", + ctx.getAttribute("test." + ConfigGeneratorConstant.OUTPUT_PARAM_GENERATED_CONFIG)); + + logger.trace("Generated Configuration:\n " + + ctx.getAttribute("test." + ConfigGeneratorConstant.OUTPUT_PARAM_GENERATED_CONFIG)); + logger.trace("Generated Configuration:\n " + + ctx.getAttribute("test." + ConfigGeneratorConstant.OUTPUT_PARAM_MASK_INFO)); + + } + + @Test + public void testInputTemplateWithNullData() throws Exception { + + ConfigGeneratorNode configGeneratorNode = new ConfigGeneratorNode(configResourceService, configModelService); + + Map inParams = new HashMap(); + inParams.put(ConfigModelConstant.PROPERTY_SELECTOR, "test"); + + String jsonData = IOUtils.toString(ConfigGeneratorNodeTest.class.getClassLoader() + .getResourceAsStream("service_templates/configdata_with_null.json"), Charset.defaultCharset()); + inParams.put(ConfigGeneratorConstant.INPUT_PARAM_TEMPLATE_DATA, jsonData); + + String templateData = IOUtils.toString(ConfigGeneratorNodeTest.class.getClassLoader() + .getResourceAsStream("service_templates/velocity/base-config-template.vtl"), Charset.defaultCharset()); + inParams.put(ConfigGeneratorConstant.INPUT_PARAM_TEMPLATE_CONTENT, templateData); + + SvcLogicContext ctx = new SvcLogicContext(); + Map componentContext = new HashMap<>(); + configGeneratorNode.process(inParams, ctx, componentContext); + Assert.assertEquals("Failed to generate Configuration Status as Failure", + ConfigGeneratorConstant.OUTPUT_STATUS_SUCCESS, + ctx.getAttribute("test." + ConfigGeneratorConstant.OUTPUT_PARAM_STATUS)); + Assert.assertNotNull("Failed to generate Configuration", + ctx.getAttribute("test." + ConfigGeneratorConstant.OUTPUT_PARAM_GENERATED_CONFIG)); + + logger.trace("Generated Configuration:\n " + + ctx.getAttribute("test." + ConfigGeneratorConstant.OUTPUT_PARAM_GENERATED_CONFIG)); + logger.trace("Generated Configuration:\n " + + ctx.getAttribute("test." + ConfigGeneratorConstant.OUTPUT_PARAM_MASK_INFO)); + + } + + @Test + public void testDBTemplateContentNData() throws Exception { + + String fileContent = IOUtils.toString(ConfigGeneratorNodeTest.class.getClassLoader() + .getResourceAsStream("service_templates/generate_configuration.json"), Charset.defaultCharset()); + + String baseConfigTemplateContent = IOUtils.toString(ConfigGeneratorNodeTest.class.getClassLoader() + .getResourceAsStream("service_templates/velocity/base-config-template.vtl"), Charset.defaultCharset()); + + Map context = new HashMap<>(); + context = configModelService.convertServiceTemplate2Properties(fileContent, context); + + context.put("node_templates.base-config-template.content", baseConfigTemplateContent); + + Assert.assertNotNull("Failed to Prepare Context : ", context); + + context.put("request-id", "12345"); + context.put("vnf-id", "vnf12345"); + context.put("action-name", "config-generator-action"); + + Map inparams = new HashMap(); + inparams.put(ConfigModelConstant.PROPERTY_SELECTOR, "generate-configuration"); + + SvcLogicContext inputContext = new SvcLogicContext(); + context.forEach((name, value) -> { + inputContext.setAttribute(name, value); + }); + + TransformationUtils.printMap(context); + configModelService.assignInParamsFromModel(inputContext, inparams); + ConfigGeneratorNode configGeneratorNode = new ConfigGeneratorNode(configResourceService, configModelService); + + Map componentContext = new HashMap<>(); + configGeneratorNode.process(inparams, inputContext, componentContext); + + Assert.assertEquals("Failed to generate Configuration Status as Failure", + ConfigGeneratorConstant.OUTPUT_STATUS_SUCCESS, + inputContext.getAttribute("generate-configuration." + ConfigGeneratorConstant.OUTPUT_PARAM_STATUS)); + Assert.assertNotNull("Failed to generate Configuration", inputContext + .getAttribute("generate-configuration." + ConfigGeneratorConstant.OUTPUT_PARAM_GENERATED_CONFIG)); + + logger.trace("Generated Configuration:\n " + inputContext + .getAttribute("generate-configuration." + ConfigGeneratorConstant.OUTPUT_PARAM_GENERATED_CONFIG)); + } + + @Test + public void testTemplateContentNDataForMask() throws Exception { + + } + +} diff --git a/blueprints-processor/plugin/generator-provider/src/test/java/org/onap/ccsdk/config/generator/tool/EscapeUtilsTest.java b/blueprints-processor/plugin/generator-provider/src/test/java/org/onap/ccsdk/config/generator/tool/EscapeUtilsTest.java new file mode 100644 index 000000000..0bd2384bf --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/test/java/org/onap/ccsdk/config/generator/tool/EscapeUtilsTest.java @@ -0,0 +1,51 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. + * Modifications Copyright © 2018 IBM. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.ccsdk.config.generator.tool; + +import org.junit.Assert; +import org.junit.Test; + +public class EscapeUtilsTest { + + @Test + public void testEscapeSql() { + Assert.assertEquals("", EscapeUtils.escapeSql("")); + Assert.assertEquals("text", EscapeUtils.escapeSql("text")); + + Assert.assertEquals("''", EscapeUtils.escapeSql("'")); + Assert.assertEquals("\\\\", EscapeUtils.escapeSql("\\")); + + Assert.assertEquals("text''text", EscapeUtils.escapeSql("text'text")); + Assert.assertEquals("text\\\\text", EscapeUtils.escapeSql("text\\text")); + } + + @Test + public void testEscapeSequence() { + Assert.assertEquals("", EscapeUtils.escapeSequence("")); + Assert.assertEquals("text", EscapeUtils.escapeSequence("text")); + + Assert.assertEquals("\\\'", EscapeUtils.escapeSequence("'")); + Assert.assertEquals("\\\"", EscapeUtils.escapeSequence("\"")); + Assert.assertEquals("\\\\", EscapeUtils.escapeSequence("\\")); + + Assert.assertEquals("text\\\'text", EscapeUtils.escapeSequence("text'text")); + Assert.assertEquals("text\\\"text", EscapeUtils.escapeSequence("text\"text")); + Assert.assertEquals("text\\\\text", EscapeUtils.escapeSequence("text\\text")); + } + +} diff --git a/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/configdata.json b/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/configdata.json new file mode 100644 index 000000000..13d355cbc --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/configdata.json @@ -0,0 +1,36 @@ +{ + "node0_hostname": "appc-host", + "node0_backup_router_address": "2001:2001:2001:2001:2001:2001:2001:2001", + "servers": [ + "Server1", + "Server2", + "Server3" + ], + "tacplus-servers": [ + { + "tacplus-server-name": "tacplus-server-name1", + "tacplus-server-source-address": "enc-dsdsasa1" + }, + { + "tacplus-server-name": "tacplus-server-name2", + "tacplus-server-source-address": "enc-dsdsasa2" + } + ], + "classes": [ + { + "name": "superuser-class", + "idle-timeout": 5, + "permissions": "all" + }, + { + "name": "tacacs-adv-class", + "idle-timeout": 5 + }, + { + "name": "tacacs-base-class", + "idle-timeout": 5 + } + ], + "system-password": "teamops-system-password", + "root-password": "teamops-root-password" +} diff --git a/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/configdata_with_null.json b/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/configdata_with_null.json new file mode 100644 index 000000000..d08acb17c --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/configdata_with_null.json @@ -0,0 +1,36 @@ +{ + "node0_hostname": null, + "node0_backup_router_address": "2001:2001:2001:2001:2001:2001:2001:2001", + "servers": [ + "Server1", + "Server2", + "Server3" + ], + "tacplus-servers": [ + { + "tacplus-server-name": null, + "tacplus-server-source-address": "enc-dsdsasa1" + }, + { + "tacplus-server-name": "tacplus-server-name2", + "tacplus-server-source-address": "enc-dsdsasa2" + } + ], + "classes": [ + { + "name": "superuser-class", + "idle-timeout": 5, + "permissions": "all" + }, + { + "name": "tacacs-adv-class", + "idle-timeout": 5 + }, + { + "name": "tacacs-base-class", + "idle-timeout": 5 + } + ], + "system-password": "teamops-system-password", + "root-password": "teamops-root-password" +} \ No newline at end of file diff --git a/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/generate_configuration.json b/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/generate_configuration.json new file mode 100644 index 000000000..d2c16ede1 --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/generate_configuration.json @@ -0,0 +1,355 @@ +{ + "metadata": { + "author": "ks220y@att.com", + "service-template-name": "VRR-baseconfiguration", + "service-template-version": "1.0.0", + "service-type": "AVPN", + "vnf-type": "VRR", + "action": "Base Configuration", + "sub-action": "Generate Configuration" + }, + "topology_template": { + "inputs": { + "request-id": { + "required": true, + "type": "string" + }, + "service-instance-id": { + "required": true, + "type": "string" + }, + "vnf-id": { + "required": true, + "type": "string" + } + }, + "node_templates": { + "base-config-template": { + "type": "artifact-config-template", + "properties": { + "action-names": [ + "resource-assignment-action" + ] + }, + "capabilities": { + "content": { + "properties": { + "content": "db://base-config-template" + } + }, + "mapping": { + "properties": { + "mapping": [ + { + "name": "bundle-id", + "input-param": true, + "property": { + "type": "string", + "required": true + }, + "dictionary-name": "bundle-id", + "dictionary-source": "mdsal" + }, + { + "name": "bundle-mac", + "input-param": true, + "property": { + "type": "string" + }, + "dictionary-name": "bundle-mac", + "dictionary-source": "db" + } + ] + } + } + } + }, + "generate-configuration": { + "type": "component-config-generator", + "interfaces": { + "org-onap-ccsdk-config-generator-service-ConfigGeneratorNode": { + "operations": { + "process": { + "inputs": { + "resource-type": "vnf-type", + "request-id": "{ \"get_attribute\" : \"request-id\" }", + "resource-id": "{ \"get_input\" : \"vnf-id\" }", + "action-name": "{ \"get_attribute\" : \"action-name\" }", + "template-name": "base-config-template" + }, + "outputs": { + "generated-config": "", + "status": "" + } + } + } + } + }, + "capabilities": { + "component-node": { + + } + } + }, + "config-generator-action": { + "type": "dg-config-generator", + "interfaces": { + "CONFIG": { + "operations": { + "GenerateConfiguration": { + + } + } + } + }, + "capabilities": { + "dg-node": { + + } + }, + "requirements": { + "component-dependency": { + "capability": "component-node", + "node": "generate-configuration", + "relationship": "tosca.relationships.DependsOn" + } + } + } + } + }, + "node_types": { + "artifact-config-template": { + "description": "This is Configuration Velocity Template", + "version": "1.0.0", + "properties": { + "action-names": { + "required": true, + "type": "list", + "entry_schema": { + "type": "string" + } + } + }, + "capabilities": { + "content": { + "type": "tosca.capability.Content", + "properties": { + "content": { + "required": true, + "type": "string" + } + } + }, + "mapping": { + "type": "tosca.capability.Mapping", + "properties": { + "mapping": { + "required": false, + "type": "list", + "entry_schema": { + "type": "datatype-resource-assignment" + } + } + } + } + }, + "derived_from": "tosca.nodes.Artifact" + }, + "component-config-generator": { + "description": "This is Generate Configuration Component API", + "version": "1.0.0", + "capabilities": { + "component-node": { + "type": "tosca.capabilities.Node" + } + }, + "interfaces": { + "org-onap-ccsdk-config-generator-service-ConfigGeneratorNode": { + "operations": { + "process": { + "inputs": { + "template-data": { + "description": "Conditional : JSON string which is used to mash with template. Either template-data or ( resource-id and resource-type ) should be present", + "required": false, + "type": "string" + }, + "template-content": { + "description": "Conditional : Dynamic Template used to generate Configuration.", + "required": false, + "type": "string" + }, + "resource-type": { + "description": "Conditional : resource-type used to pull the data content from the data base. Either template-data or ( resource-id and resource-type ) should be present", + "required": false, + "type": "string" + }, + "request-id": { + "description": "Request Id used to store the generated configuration, in the database along with the template-name", + "required": true, + "type": "string" + }, + "resource-id": { + "description": "Conditional : Id used to pull the data content from the data base. Either template-data or ( resource-id and resource-type ) should be present", + "required": false, + "type": "string" + }, + "action-name": { + "description": "Conditional : Action Name to get from Database, Either (message & mask-info ) or ( resource-id & resource-type & action-name & template-name ) should be present. Message will be given higest priority", + "required": false, + "type": "string" + }, + "template-name": { + "description": "Conditional : Name of the Artifact Node Template, to get the template Content. If template-content is present, then content wont be reterived from the Artifact Node Template.", + "required": true, + "type": "string" + } + }, + "outputs": { + "generated-config": { + "description": "Generated Configuration for the Template adn Resource Data", + "required": true, + "type": "string" + }, + "mask-info": { + "description": "If template contains mask encription keys, then this mask-info field will be generated, This JSON Content alligns to the bean org.onap.ccsdk.config.model.data.custom.MaskInfo ", + "required": false, + "type": "string" + }, + "status": { + "description": "Status of the Component Execution ( success or failure )", + "required": true, + "type": "string" + } + } + } + } + } + }, + "derived_from": "tosca.nodes.Component" + }, + "dg-config-generator": { + "description": "This is Activate DG for Config Generator Directed Graph", + "version": "1.0.0", + "properties": { + "mode": { + "required": false, + "type": "string", + "default": "sync" + }, + "version": { + "required": false, + "type": "string", + "default": "LATEST" + }, + "is-start-flow": { + "required": false, + "type": "boolean", + "default": "false" + } + }, + "capabilities": { + "dg-node": { + "type": "tosca.capabilities.Node" + }, + "content": { + "type": "tosca.capability.Content", + "properties": { + "type": { + "required": false, + "type": "string", + "default": "json" + }, + "content": { + "required": true, + "type": "string" + } + } + } + }, + "requirements": { + "component-dependency": { + "capability": "component-node", + "node": "component-config-generator", + "relationship": "tosca.relationships.DependsOn" + } + }, + "interfaces": { + "CONFIG": { + "operations": { + "GenerateConfiguration": { + "inputs": { + "params": { + "required": false, + "type": "list", + "entry_schema": { + "type": "datatype-property" + } + } + } + } + } + } + }, + "derived_from": "tosca.nodes.DG" + } + }, + "data_types": { + "datatype-resource-assignment": { + "version": "1.0.0", + "description": "This is Resource Assignment Data Type", + "properties": { + "property": { + "required": true, + "type": "datatype-property" + }, + "input-param": { + "required": true, + "type": "boolean" + }, + "dictionary-name": { + "required": false, + "type": "string" + }, + "dictionary-source": { + "required": false, + "type": "string" + }, + "dependencies": { + "required": true, + "type": "list", + "entry_schema": { + "type": "string" + } + } + }, + "derived_from": "tosca.datatypes.Root" + }, + "datatype-property": { + "version": "1.0.0", + "description": "This is Entry point Input Data Type, which is dynamic datatype, The parameter names will be populated during the Design time for each inputs", + "properties": { + "type": { + "required": true, + "type": "string" + }, + "description": { + "required": false, + "type": "string" + }, + "required": { + "required": false, + "type": "boolean" + }, + "default": { + "required": false, + "type": "string" + }, + "entry_schema": { + "required": false, + "type": "string" + } + }, + "derived_from": "tosca.datatypes.Root" + } + } +} diff --git a/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/velocity/base-config-template.vtl b/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/velocity/base-config-template.vtl new file mode 100644 index 000000000..e0ea400c6 --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/velocity/base-config-template.vtl @@ -0,0 +1,61 @@ + + 15.1X49-D50.3 + + node0 + + #foreach($server in ${servers}) + $StringUtils.upperCase("$server") + #end + + + ${node0_hostname} + +
${node0_backup_router_address}
+ $node0_backup_router_address +
+ #foreach($tacplus-server in ${tacplus-servers}) + + $tacplus-server.tacplus-server-name + $tacplus-server.tacplus-server-source-address + + #end + + AT&T information assets + #foreach($class in ${classes}) + + $class.name + $class.idle-timeout + #if ($class.permissions) + $class.permissions + #end + + #end + + readonly + Read Only Account Access + 1001 + tacacs-base-class + + + readwrite + Read - Write Account Access + 1002 + tacacs-adv-class + + ${system-password} + + + + readwrite + Emergency Access Only + 1000 + superuser-class + + ${root-password} + + + +
+
+
\ No newline at end of file diff --git a/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/velocity/base-config-template_group.vtl b/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/velocity/base-config-template_group.vtl new file mode 100644 index 000000000..92dba1024 --- /dev/null +++ b/blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/velocity/base-config-template_group.vtl @@ -0,0 +1,40 @@ + + + + ${group-name} + + + <*> + + + + + + 224.0.1.40/32 + + + 224.0.1.39/32 + + + 224.0.0.0/4 + + + + + + + + + + <*> + + 1000 + + + + + + + + + \ No newline at end of file -- cgit 1.2.3-korg