aboutsummaryrefslogtreecommitdiffstats
path: root/blueprints-processor/plugin/generator-provider
diff options
context:
space:
mode:
authorSingal, Kapil (ks220y) <ks220y@att.com>2018-09-04 22:04:48 -0400
committerSingal, Kapil (ks220y) <ks220y@att.com>2018-09-04 22:04:48 -0400
commitc09c0fa4ef4c1cd7e7e28a12c9469b783b75d4d8 (patch)
tree224b50684ace3785d9da69f710706c3d810d0450 /blueprints-processor/plugin/generator-provider
parentd280b356afc2595ab9d5492bb5ae55b9553b218f (diff)
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) <ks220y@att.com>
Diffstat (limited to 'blueprints-processor/plugin/generator-provider')
-rw-r--r--blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/ConfigGeneratorConstant.java49
-rw-r--r--blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/data/ConfigGeneratorInfo.java102
-rw-r--r--blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorNode.java140
-rw-r--r--blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorService.java33
-rw-r--r--blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorServiceImpl.java143
-rw-r--r--blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/CustomJsonNodeFactory.java30
-rw-r--r--blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/CustomTextNode.java42
-rw-r--r--blueprints-processor/plugin/generator-provider/src/main/java/org/onap/ccsdk/config/generator/tool/EscapeUtils.java82
-rw-r--r--blueprints-processor/plugin/generator-provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml49
-rw-r--r--blueprints-processor/plugin/generator-provider/src/test/java/org/onap/ccsdk/config/generator/service/ConfigGeneratorNodeTest.java222
-rw-r--r--blueprints-processor/plugin/generator-provider/src/test/java/org/onap/ccsdk/config/generator/tool/EscapeUtilsTest.java51
-rw-r--r--blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/configdata.json36
-rw-r--r--blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/configdata_with_null.json36
-rw-r--r--blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/generate_configuration.json355
-rw-r--r--blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/velocity/base-config-template.vtl61
-rw-r--r--blueprints-processor/plugin/generator-provider/src/test/resources/service_templates/velocity/base-config-template_group.vtl40
16 files changed, 1471 insertions, 0 deletions
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<String, String> inParams, SvcLogicContext ctx, Map<String, Object> componentContext)
+ throws SvcLogicException {
+ logger.trace("Received generateConfiguration preCondition call with params : ({})", inParams);
+ return Boolean.TRUE;
+ }
+
+ @Override
+ public void preProcess(Map<String, String> inParams, SvcLogicContext ctx, Map<String, Object> componentContext)
+ throws SvcLogicException {
+ logger.trace("Received generateConfiguration preProcess call with params : ({})", inParams);
+ }
+
+ @Override
+ public void process(Map<String, String> inParams, SvcLogicContext ctx) throws SvcLogicException {
+ logger.trace("Received generateConfiguration process call with params : ({})", inParams);
+ }
+
+ @SuppressWarnings("squid:S3776")
+ @Override
+ public void process(Map<String, String> inParams, SvcLogicContext ctx, Map<String, Object> 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<String, String> inParams, SvcLogicContext ctx, Map<String, Object> 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<ConfigResource> 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<String> 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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
+ odl:use-default-for-reference-types="true">
+
+ <reference id="configModelService"
+ interface="org.onap.ccsdk.config.model.service.ConfigModelService" />
+
+ <reference id="configResourceService"
+ interface="org.onap.ccsdk.config.data.adaptor.service.ConfigResourceService" />
+
+ <!-- Expose the Common Component Bean -->
+
+ <bean id="configGeneratorService"
+ class="org.onap.ccsdk.config.generator.service.ConfigGeneratorServiceImpl">
+ <argument ref="configResourceService" />
+ </bean>
+
+ <service ref="configGeneratorService"
+ interface="org.onap.ccsdk.config.generator.service.ConfigGeneratorService" />
+
+ <bean id="configGeneratorNode"
+ class="org.onap.ccsdk.config.generator.service.ConfigGeneratorNode">
+ <argument ref="configResourceService" />
+ <argument ref="configModelService" />
+ </bean>
+
+ <service ref="configGeneratorNode"
+ interface="org.onap.ccsdk.config.generator.service.ConfigGeneratorNode" />
+
+
+</blueprint>
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<Void>() {
+ @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<List<ConfigResource>>() {
+ @Override
+ public List<ConfigResource> answer(InvocationOnMock invocationOnMock) throws Throwable {
+ List<ConfigResource> 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<String, String> inParams = new HashMap<String, String>();
+ 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<String, Object> 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<String, String> inParams = new HashMap<String, String>();
+ 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<String, Object> 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<String, String> 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<String, String> inparams = new HashMap<String, String>();
+ 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<String, Object> 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 @@
+<configuration xmlns="http://xml.juniper.net/xnm/1.1/xnm"
+xmlns:a="http://xml.juniper.net/junos/15.1X49/junos">
+ <version>15.1X49-D50.3</version>
+ <groups>
+ <name>node0</name>
+ <system>
+ #foreach($server in ${servers})
+ <server-host-name>$StringUtils.upperCase("$server")</server-host-name>
+ #end
+ </system>
+ <system>
+ <host-name>${node0_hostname}</host-name>
+ <backup-router>
+ <address>${node0_backup_router_address}</address>
+ <destination>$node0_backup_router_address</destination>
+ </backup-router>
+ #foreach($tacplus-server in ${tacplus-servers})
+ <tacplus-server>
+ <name>$tacplus-server.tacplus-server-name</name>
+ <source-address>$tacplus-server.tacplus-server-source-address</source-address>
+ </tacplus-server>
+ #end
+ <login>
+ <message>AT&amp;T information assets</message>
+ #foreach($class in ${classes})
+ <class>
+ <name>$class.name</name>
+ <idle-timeout>$class.idle-timeout</idle-timeout>
+ #if ($class.permissions)
+ <permissions>$class.permissions</permissions>
+ #end
+ </class>
+ #end
+ <user>
+ <name>readonly</name>
+ <full-name>Read Only Account Access</full-name>
+ <uid>1001</uid>
+ <class>tacacs-base-class</class>
+ </user>
+ <user>
+ <name>readwrite</name>
+ <full-name>Read - Write Account Access</full-name>
+ <uid>1002</uid>
+ <class>tacacs-adv-class</class>
+ <authentication>
+ <encrypted-password>${system-password}</encrypted-password>
+ </authentication>
+ </user>
+ <user>
+ <name>readwrite</name>
+ <full-name>Emergency Access Only</full-name>
+ <uid>1000</uid>
+ <class>superuser-class</class>
+ <authentication>
+ <encrypted-password>${root-password}</encrypted-password>
+ </authentication>
+ </user>
+ </login>
+ </system>
+ </groups>
+</configuration> \ 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 @@
+ <config>
+ <configuration>
+ <groups>
+ <name>${group-name}</name>
+ <routing-instances>
+ <instance>
+ <name>&lt;*&gt;</name>
+ <protocols>
+ <pim>
+ <dense-groups>
+ <dynamic-reject />
+ <pim-dense-group-type>
+ <name>224.0.1.40/32</name>
+ </pim-dense-group-type>
+ <pim-dense-group-type>
+ <name>224.0.1.39/32</name>
+ </pim-dense-group-type>
+ <pim-dense-group-type>
+ <name>224.0.0.0/4</name>
+ <reject />
+ </pim-dense-group-type>
+ </dense-groups>
+ <rp>
+ <auto-rp>
+ <discovery />
+ </auto-rp>
+ </rp>
+ <interface>
+ <name>&lt;*&gt;</name>
+ <disable />
+ <priority>1000</priority>
+ </interface>
+ <reset-tracking-bit />
+ </pim>
+ </protocols>
+ </instance>
+ </routing-instances>
+ </groups>
+ </configuration>
+ </config> \ No newline at end of file