aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorWeberLaurent <weberlaurent23@gmail.com>2020-02-06 10:23:01 +0100
committersebdet <sebastien.determe@intl.att.com>2020-03-03 12:41:30 -0800
commitf0a648cc89cb870a4053d47a06fe2a4a54cc3f1c (patch)
tree73943b8d2e363ff74393f60160f3d2d23f3c86ff /src
parentfb445e11abb3ad59e5e2305b023422e2b4796989 (diff)
Rework tosca converter
New code to convert the Policy Tosca Yaml to Json Schema for the Clamp UI Issue-ID: CLAMP-253 Change-Id: I10c1d3d81c5feae402773de94bd88c190ec68645 Signed-off-by: WeberLaurent <weberlaurent23@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/onap/clamp/clds/tosca/update/ArrayField.java72
-rw-r--r--src/main/java/org/onap/clamp/clds/tosca/update/Component.java121
-rw-r--r--src/main/java/org/onap/clamp/clds/tosca/update/Constraint.java221
-rw-r--r--src/main/java/org/onap/clamp/clds/tosca/update/Extractor.java101
-rw-r--r--src/main/java/org/onap/clamp/clds/tosca/update/ParserToJson.java283
-rw-r--r--src/main/java/org/onap/clamp/clds/tosca/update/Property.java134
-rw-r--r--src/main/java/org/onap/clamp/clds/tosca/update/Template.java104
-rw-r--r--src/main/java/org/onap/clamp/clds/tosca/update/TemplateManagement.java180
-rw-r--r--src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java34
-rw-r--r--src/main/resources/application.properties3
-rw-r--r--src/main/resources/clds/tosca_update/templates.properties15
-rw-r--r--src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java50
-rw-r--r--src/test/java/org/onap/clamp/clds/tosca/update/ComponentTest.java49
-rw-r--r--src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java97
-rw-r--r--src/test/java/org/onap/clamp/clds/tosca/update/PropertyTest.java69
-rw-r--r--src/test/java/org/onap/clamp/clds/tosca/update/TemplateManagementTest.java116
-rw-r--r--src/test/java/org/onap/clamp/clds/tosca/update/TemplateTest.java44
-rw-r--r--src/test/resources/tosca/base.yaml171
-rw-r--r--src/test/resources/tosca/new-converter/constraints.yaml60
-rw-r--r--src/test/resources/tosca/new-converter/origin.json1
-rw-r--r--src/test/resources/tosca/new-converter/rendu.json1
-rw-r--r--src/test/resources/tosca/new-converter/sampleOperationalPolicies.yaml160
-rw-r--r--src/test/resources/tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml174
-rw-r--r--src/test/resources/tosca/templates.properties7
24 files changed, 2267 insertions, 0 deletions
diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/ArrayField.java b/src/main/java/org/onap/clamp/clds/tosca/update/ArrayField.java
new file mode 100644
index 000000000..61e40a1e6
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/tosca/update/ArrayField.java
@@ -0,0 +1,72 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import com.google.gson.JsonArray;
+import java.util.ArrayList;
+
+public class ArrayField {
+
+ private ArrayList<Object> complexFields;
+
+ /**
+ * Constructor from arraryList.
+ *
+ * @param arrayProperties the array properties
+ */
+ public ArrayField(ArrayList<Object> arrayProperties) {
+ this.complexFields = arrayProperties;
+ }
+
+ /**
+ * Each LinkedHashMap is parsed to extract the Array and each of its value. They are casted for the JsonObject.
+ *
+ * @return JsonArray
+ */
+ public JsonArray deploy() {
+
+ JsonArray subPropertyValuesArray = new JsonArray();
+ for (Object arrayElement : complexFields) {
+ //Cast for each Primitive Type
+ String typeValue = arrayElement.getClass().getSimpleName();
+ switch (typeValue) {
+ case "String":
+ subPropertyValuesArray.add((String) arrayElement);
+ break;
+ case "Boolean":
+ subPropertyValuesArray.add((Boolean) arrayElement);
+ break;
+ case "Double":
+ subPropertyValuesArray.add((Number) arrayElement);
+ break;
+ case "Integer":
+ subPropertyValuesArray.add((Number) arrayElement);
+ break;
+ default:
+ break;
+ }
+ }
+ return subPropertyValuesArray;
+ }
+}
diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/Component.java b/src/main/java/org/onap/clamp/clds/tosca/update/Component.java
new file mode 100644
index 000000000..6db129d1a
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/tosca/update/Component.java
@@ -0,0 +1,121 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+
+public class Component {
+
+ /**
+ * name parameter is used as "key", in the LinkedHashMap of Components.
+ */
+ private String name;
+ private String derivedFrom;
+ private String version;
+ private String typeVersion;
+ private String description;
+ private LinkedHashMap<String, Property> properties;
+
+ public Component() {
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param name name
+ * @param derivedFrom derivedFrom
+ * @param description description
+ */
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ public Component(String name, String derivedFrom, String description) {
+ super();
+ this.name = name;
+ this.derivedFrom = derivedFrom;
+ this.description = description;
+ this.properties = new LinkedHashMap();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDerivedFrom() {
+ return derivedFrom;
+ }
+
+ public void setDerivedFrom(String derivedFrom) {
+ this.derivedFrom = derivedFrom;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getTypeVersion() {
+ return typeVersion;
+ }
+
+ public void setTypeVersion(String typeVersion) {
+ this.typeVersion = typeVersion;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public LinkedHashMap<String, Property> getProperties() {
+ return properties;
+ }
+
+ public void setProperties(LinkedHashMap<String, Property> properties) {
+ this.properties = properties;
+ }
+
+ public void addProperties(Property property) {
+ this.properties.put(property.getName(), property);
+ }
+
+ public ArrayList<String> propertiesNames() {
+ return new ArrayList<>(properties.keySet());
+ }
+
+ @Override
+ public String toString() {
+ return name + ": " + description + ", version: " + version + ", nb de properties: " + properties.size()
+ + System.getProperty("line.separator") + propertiesNames();
+ }
+}
diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/Constraint.java b/src/main/java/org/onap/clamp/clds/tosca/update/Constraint.java
new file mode 100644
index 000000000..4f6b27a6a
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/tosca/update/Constraint.java
@@ -0,0 +1,221 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.Map.Entry;
+
+public class Constraint {
+
+ private LinkedHashMap<String, Object> constraints;
+ private Template template;
+
+ public Constraint(LinkedHashMap<String, Object> constraints, Template template) {
+ this.template = template;
+ this.constraints = constraints;
+ }
+
+ /**
+ * Deploy the linkedhashmap which contains the constraints, to extract them one to one.
+ *
+ * @param jsonSchema The json Schema
+ * @param typeProperty The ype property
+ * @return the json object
+ */
+ public JsonObject deployConstraints(JsonObject jsonSchema, String typeProperty) {
+ for (Entry<String, Object> constraint : constraints.entrySet()) {
+ this.parseConstraint(jsonSchema, constraint.getKey(), constraint.getValue(), typeProperty);
+ }
+ return jsonSchema;
+ }
+
+ /**
+ * Each case of Tosca constraints below parse specifically the field in the JsonObject.
+ *
+ * @param jsonSchema Json Schema
+ * @param nameConstraint Name constraint
+ * @param valueConstraint value constraint
+ * @param typeProperty Type Property
+ */
+ @SuppressWarnings("unchecked")
+ public void parseConstraint(JsonObject jsonSchema, String nameConstraint, Object valueConstraint,
+ String typeProperty) {
+ switch (nameConstraint) {
+ case "equal":
+ checkTemplateField("const", jsonSchema, valueConstraint);
+ break;
+ case "greater_than":
+ checkTemplateField("exclusiveMinimum", jsonSchema, valueConstraint);
+ break;
+ case "greater_or_equal":
+ checkTemplateField("minimum", jsonSchema, valueConstraint);
+ break;
+ case "less_than":
+ checkTemplateField("exclusiveMaximum", jsonSchema, valueConstraint);
+ break;
+ case "less_or_equal":
+ checkTemplateField("maximum", jsonSchema, valueConstraint);
+ break;
+ case "in_range":
+ ArrayList<Integer> limitValues = (ArrayList<Integer>) valueConstraint;
+ checkTemplateField("minimum", jsonSchema, limitValues.get(0));
+ checkTemplateField("maximum", jsonSchema, limitValues.get(1));
+ break;
+ case "pattern":
+ jsonSchema.addProperty(nameConstraint, (String) valueConstraint);
+ break;
+ case "length":
+ this.getSpecificLength(jsonSchema, valueConstraint, typeProperty);
+ break;
+ case "min_length":
+ String[] prefixValues = nameConstraint.split("_");
+ this.getLimitValue(jsonSchema, valueConstraint, typeProperty, prefixValues[0]);
+ break;
+ case "max_length":
+ String[] maxtab = nameConstraint.split("_");
+ this.getLimitValue(jsonSchema, valueConstraint, typeProperty, maxtab[0]);
+ break;
+ default://valid_value
+ this.getValueArray(jsonSchema, valueConstraint, typeProperty);
+ break;
+ }
+
+ }
+
+ /**
+ * To be done.
+ *
+ * @param jsonSchema json schema
+ * @param fieldValue field value
+ * @param typeProperty For the complex components, get a specific number of items/properties
+ */
+ public void getSpecificLength(JsonObject jsonSchema, Object fieldValue, String typeProperty) {
+ switch (typeProperty.toLowerCase()) {
+ case "string":
+ checkTemplateField("minLength", jsonSchema, fieldValue);
+ checkTemplateField("maxLength", jsonSchema, fieldValue);
+ break;
+ case "array":
+ if (fieldValue.equals(1) && template.hasFields("uniqueItems")) {
+ jsonSchema.addProperty("uniqueItems", true);
+ } else {
+ checkTemplateField("minItems", jsonSchema, fieldValue);
+ checkTemplateField("maxItems", jsonSchema, fieldValue);
+ }
+ break;
+ default:// Map && List
+ checkTemplateField("minProperties", jsonSchema, fieldValue);
+ checkTemplateField("maxProperties", jsonSchema, fieldValue);
+ break;
+ }
+
+ }
+
+ /**
+ * To be done.
+ *
+ * @param jsonSchema json schema
+ * @param fieldValue field value
+ * @param typeProperty type property
+ * @param side Get the limits fieldValue for the properties : depend of the type of the component
+ */
+ public void getLimitValue(JsonObject jsonSchema, Object fieldValue, String typeProperty, String side) {
+ switch (typeProperty) {
+ case "string":
+ if (side.equals("min")) {
+ checkTemplateField("minLength", jsonSchema, fieldValue);
+ } else {
+ checkTemplateField("maxLength", jsonSchema, fieldValue);
+ }
+ break;
+ default:// Array
+ if (side.equals("min")) {
+ checkTemplateField("minItems", jsonSchema, fieldValue);
+ } else {
+ checkTemplateField("maxItems", jsonSchema, fieldValue);
+ }
+ break;
+ }
+
+ }
+
+ /**
+ * To be done.
+ *
+ * @param jsonSchema Json schema
+ * @param fieldValue field value
+ * @param typeProperty Get as Enum the valid values for the property
+ */
+ public void getValueArray(JsonObject jsonSchema, Object fieldValue, String typeProperty) {
+ if (template.hasFields("enum")) {
+ JsonArray enumeration = new JsonArray();
+ if (typeProperty.equals("string") || typeProperty.equals("String")) {
+ ArrayList<String> arrayValues = (ArrayList<String>) fieldValue;
+ for (String arrayItem : arrayValues) {
+ enumeration.add(arrayItem);
+ }
+ jsonSchema.add("enum", enumeration);
+ } else {
+ ArrayList<Number> arrayValues = (ArrayList<Number>) fieldValue;
+ for (Number arrayItem : arrayValues) {
+ enumeration.add(arrayItem);
+ }
+ jsonSchema.add("enum", enumeration);
+ }
+ }
+ }
+
+ /**
+ * To be done.
+ *
+ * @param field Field
+ * @param jsonSchema Json schema
+ * @param fieldValue Simple way to avoid code duplication
+ */
+ public void checkTemplateField(String field, JsonObject jsonSchema, Object fieldValue) {
+ if (template.hasFields(field)) {
+ String typeField = fieldValue.getClass().getSimpleName();
+ switch (typeField) {
+ case "String":
+ jsonSchema.addProperty(field, (String) fieldValue);
+ break;
+ case "Integer":
+ jsonSchema.addProperty(field, (Integer) fieldValue);
+ break;
+ case "Number":
+ jsonSchema.addProperty(field, (Number) fieldValue);
+ break;
+ case "Boolean":
+ jsonSchema.addProperty(field, (Boolean) fieldValue);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/Extractor.java b/src/main/java/org/onap/clamp/clds/tosca/update/Extractor.java
new file mode 100644
index 000000000..032edbaa8
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/tosca/update/Extractor.java
@@ -0,0 +1,101 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import java.util.LinkedHashMap;
+import java.util.Map.Entry;
+import org.yaml.snakeyaml.Yaml;
+
+public class Extractor {
+
+ private LinkedHashMap<String, Component> allItems = new LinkedHashMap<>();
+ private String source;
+
+ @SuppressWarnings("unchecked")
+ public Extractor(String toParse) {
+ this.source = toParse;
+ getAllAsMaps();
+ }
+
+ public LinkedHashMap<String, Component> getAllItems() {
+ return allItems;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ /**
+ * Yaml Parse gets raw policies and datatypes, in different sections : necessary to extract
+ * all entities and put them at the same level.
+ *
+ * @return an object
+ */
+ @SuppressWarnings("unchecked")
+ public LinkedHashMap<String, Object> getAllAsMaps() {
+ Yaml yaml = new Yaml();
+ Object contentFile = yaml.load(source);
+ LinkedHashMap<String, LinkedHashMap<String, Object>> file =
+ (LinkedHashMap<String, LinkedHashMap<String, Object>>) contentFile;
+ // Get DataTypes
+ LinkedHashMap<String, Object> dataTypes = file.get("data_types");
+ // Get Policies : first, get topology and after extract policies from it
+ LinkedHashMap<String, Object> policyTypes = file.get("policy_types");
+ // Put the policies and datatypes in the same collection
+ dataTypes.putAll(policyTypes);
+ parseInComponent(dataTypes);
+ return dataTypes;
+ }
+
+ /**
+ * With all the component, get as Map, Components and Components properties are created.
+ *
+ * @param allMaps maps
+ */
+ @SuppressWarnings("unchecked")
+ public void parseInComponent(LinkedHashMap<String, Object> allMaps) {
+ //Component creations, from the file maps
+ for (Entry<String, Object> itemToParse : allMaps.entrySet()) {
+ LinkedHashMap<String, Object> componentBody = (LinkedHashMap<String, Object>) itemToParse.getValue();
+ Component component = new Component(itemToParse.getKey(), (String) componentBody.get("derived_from"),
+ (String) componentBody.get("description"));
+ //If policy, version and type_version :
+ if (componentBody.get("type_version") != null) {
+ component.setVersion((String) componentBody.get("type_version"));
+ component.setTypeVersion((String) componentBody.get("type_version"));
+ }
+ //Properties creation, from the map
+ if (componentBody.get("properties") != null) {
+ LinkedHashMap<String, Object> properties =
+ (LinkedHashMap<String, Object>) componentBody.get("properties");
+ for (Entry<String, Object> itemToProperty : properties.entrySet()) {
+ Property property = new Property(itemToProperty.getKey(),
+ (LinkedHashMap<String, Object>) itemToProperty.getValue());
+ component.addProperties(property);
+ }
+ }
+ this.allItems.put(component.getName(), component);
+ }
+ }
+}
diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/ParserToJson.java b/src/main/java/org/onap/clamp/clds/tosca/update/ParserToJson.java
new file mode 100644
index 000000000..6da55eaec
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/tosca/update/ParserToJson.java
@@ -0,0 +1,283 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map.Entry;
+
+public class ParserToJson {
+ private LinkedHashMap<String, Component> components;
+ private LinkedHashMap<String, Template> templates;
+
+ public ParserToJson(LinkedHashMap<String, Component> components, LinkedHashMap<String, Template> templates) {
+ this.components = components;
+ this.templates = templates;
+ }
+
+ /**
+ * For a given component, launch process to parse it in Json.
+ *
+ * @param nameComponent name components
+ * @return return
+ */
+ public JsonObject getJsonProcess(String nameComponent) {
+ JsonObject glob = this.getGeneralField(matchComponent(nameComponent));
+ if (templates.get("object").hasFields("required")) {
+ glob.add("required", this.getRequirements(nameComponent));
+ }
+ if (templates.get("object").hasFields("properties")) {
+ glob.add("properties", this.deploy(nameComponent));
+ }
+ return glob;
+ }
+
+ /**
+ * Return the classical/general fields of the component, & launch the properties deployment.
+ *
+ * @param component the compo
+ * @return a json object
+ */
+ public JsonObject getGeneralField(Component component) {
+
+ JsonObject globalFields = new JsonObject();
+ if (templates.get("object").hasFields("title")) {
+ globalFields.addProperty("title", component.getName());
+ }
+ if (templates.get("object").hasFields("type")) {
+ globalFields.addProperty("type", "object");
+ }
+ if (templates.get("object").hasFields("description")) {
+ if (component.getDescription() != null) {
+ globalFields.addProperty("description", component.getDescription());
+ }
+ }
+ return globalFields;
+ }
+
+ /**
+ * Get the required properties of the Component, including the parents properties requirements.
+ *
+ * @param nameComponent name component
+ * @return a json array
+ */
+ public JsonArray getRequirements(String nameComponent) {
+ JsonArray requirements = new JsonArray();
+ Component toParse = components.get(nameComponent);
+ //Check for a father component, and launch the same process
+ if (!toParse.getDerivedFrom().equals("tosca.datatypes.Root")
+ && !toParse.getDerivedFrom().equals("tosca.policies.Root")) {
+ requirements.addAll(getRequirements(toParse.getDerivedFrom()));
+ }
+ //Each property is checked, and add to the requirement array if it's required
+ Collection<Property> properties = toParse.getProperties().values();
+ for (Property property : properties) {
+ if (property.getItems().containsKey("required")
+ && property.getItems().get("required").equals(true)) {
+ requirements.add(property.getName());
+ }
+ }
+ return requirements;
+ }
+
+ /**
+ * The beginning of the recursive process. Get the parents (or not) to launch the same process, and otherwise
+ * deploy and parse the properties.
+ *
+ * @param nameComponent name component
+ * @return a json object
+ */
+ public JsonObject deploy(String nameComponent) {
+ JsonObject jsonSchema = new JsonObject();
+ Component toParse = components.get(nameComponent);
+ //Check for a father component, and launch the same process
+ if (!toParse.getDerivedFrom().equals("tosca.datatypes.Root")
+ && !toParse.getDerivedFrom().equals("tosca.policies.Root")) {
+ jsonSchema = this.getParent(toParse.getDerivedFrom());
+ }
+ //For each component property, check if its a complex properties (a component) or not. In that case,
+ //launch the analyse of the property.
+ for (Entry<String, Property> property : toParse.getProperties().entrySet()) {
+ if (matchComponent((String) property.getValue().getItems().get("type")) != null) {
+ jsonSchema.add(property.getValue().getName(),
+ this.getJsonProcess((String) property.getValue().getItems().get("type")));
+ }
+ else {
+ jsonSchema.add(property.getValue().getName(), this.complexParse(property.getValue()));
+ }
+ }
+ return jsonSchema;
+ }
+
+ /**
+ * If a component has a parent, it is deploy in the same way.
+ *
+ * @param nameComponent name component
+ * @return a json object
+ */
+ public JsonObject getParent(String nameComponent) {
+ return deploy(nameComponent);
+ }
+
+ /**
+ * to be done.
+ *
+ * @param property property
+ * @return a json object
+ */
+ @SuppressWarnings("unchecked")
+ public JsonObject complexParse(Property property) {
+ JsonObject propertiesInJson = new JsonObject();
+ Template currentPropertyTemplate;
+ String typeProperty = (String) property.getItems().get("type");
+ if (typeProperty.toLowerCase().equals("list") || typeProperty.toLowerCase().equals("map")) {
+ currentPropertyTemplate = templates.get("object");
+ }
+ else {
+ String propertyType = (String) property.getItems().get("type");
+ currentPropertyTemplate = templates.get(propertyType.toLowerCase());
+ }
+ //Each "special" field is analysed, and has a specific treatment
+ for (String propertyField : property.getItems().keySet()) {
+ switch (propertyField) {
+ case "type":
+ if (currentPropertyTemplate.hasFields(propertyField)) {
+ switch ((String) property.getItems().get(propertyField)) {
+ case "list":
+ case "map":
+ propertiesInJson.addProperty("type", "object");
+ break;
+ case "scalar-unit.time":
+ case "scalar-unit.frequency":
+ case "scalar-unit.size":
+ propertiesInJson.addProperty("type", "string");
+ break;
+ case "timestamp":
+ propertiesInJson.addProperty("type", "string");
+ propertiesInJson.addProperty("format", "date-time");
+ break;
+ case "range":
+ propertiesInJson.addProperty("type", "integer");
+ if (!checkConstraintPresence(property, "greater_than")
+ && currentPropertyTemplate.hasFields("exclusiveMinimum")) {
+ propertiesInJson.addProperty("exclusiveMinimum", false);
+ }
+ if (!checkConstraintPresence(property, "less_than")
+ && currentPropertyTemplate.hasFields("exclusiveMaximum")) {
+ propertiesInJson.addProperty("exclusiveMaximum", false);
+ }
+ break;
+ default:
+ propertiesInJson.addProperty("type", currentPropertyTemplate.getName());
+ break;
+ }
+ }
+ break;
+ case "metadata":
+ break;
+ case "constraints":
+ property.addConstraintsAsJson(propertiesInJson,
+ (ArrayList<Object>) property.getItems().get("constraints"),
+ currentPropertyTemplate);
+ break;
+ case "entry_schema":
+ if (matchComponent(this.extractSpecificFieldFromMap(property, "entry_schema")) != null) {
+ ParserToJson child = new ParserToJson(components, templates);
+ JsonObject componentAsProperty =
+ child.getJsonProcess(this.extractSpecificFieldFromMap(property, "entry_schema"));
+ JsonObject propertiesContainer = new JsonObject();
+ propertiesContainer
+ .add(this.extractSpecificFieldFromMap(property, "entry_schema"), componentAsProperty);
+ if (currentPropertyTemplate.hasFields("properties")) {
+ propertiesInJson.add("properties", propertiesContainer);
+ }
+ }
+ break;
+ default://Each classical field : type, description, default..
+ if (currentPropertyTemplate.hasFields(propertyField) && !propertyField.equals("required")) {
+ property.addFieldToJson(propertiesInJson, propertyField,
+ property.getItems().get(propertyField));
+ }
+ break;
+ }
+ }
+ return propertiesInJson;
+ }
+
+ /**
+ * Look for a matching Component for the name paramater, in the components list.
+ *
+ * @param name the name
+ * @return a component
+ */
+ public Component matchComponent(String name) {
+ Component correspondingComponent = null;
+ Collection<Component> listofComponent = components.values();
+ for (Component component : listofComponent) {
+ if (component.getName().equals(name)) {
+ correspondingComponent = component;
+ }
+ }
+ return correspondingComponent;
+ }
+
+ /**
+ * Simple method to extract quickly a type field from particular property item.
+ *
+ * @param property the property
+ * @param fieldName the fieldname
+ * @return a string
+ */
+ @SuppressWarnings("unchecked")
+ public String extractSpecificFieldFromMap(Property property, String fieldName) {
+ LinkedHashMap<String, String> entrySchemaFields =
+ (LinkedHashMap<String, String>) property.getItems().get(fieldName);
+ return entrySchemaFields.get("type");
+ }
+
+ /**
+ * Check if a constraint, for a specific property, is there.
+ *
+ * @param property property
+ * @param nameConstraint name constraint
+ * @return a flag boolean
+ */
+ public boolean checkConstraintPresence(Property property, String nameConstraint) {
+ boolean presentConstraint = false;
+ if (property.getItems().containsKey("constraints")) {
+ ArrayList<Object> constraints = (ArrayList) property.getItems().get("constraints");
+ for (Object constraint : constraints) {
+ if (constraint instanceof LinkedHashMap) {
+ if (((LinkedHashMap) constraint).containsKey(nameConstraint)) {
+ presentConstraint = true;
+ }
+ }
+ }
+ }
+ return presentConstraint;
+ }
+}
diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/Property.java b/src/main/java/org/onap/clamp/clds/tosca/update/Property.java
new file mode 100644
index 000000000..0b6e38166
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/tosca/update/Property.java
@@ -0,0 +1,134 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+
+public class Property {
+
+ /**
+ * name parameter is used as "key", in the LinkedHashMap of Components.
+ */
+ private String name;
+ private LinkedHashMap<String, Object> items;
+
+ /**
+ * Constructor.
+ *
+ * @param name the name
+ * @param items the items
+ */
+ public Property(String name, LinkedHashMap<String, Object> items) {
+ super();
+ this.name = name;
+ this.items = items;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public LinkedHashMap<String, Object> getItems() {
+ return items;
+ }
+
+ public void setItems(LinkedHashMap<String, Object> items) {
+ this.items = items;
+ }
+
+ /**
+ * For each primitive value, requires to get each field Value and cast it and add it in a Json.
+ *
+ * @param fieldsContent field
+ * @param fieldName field
+ * @param value value
+ */
+ public void addFieldToJson(JsonObject fieldsContent, String fieldName, Object value) {
+ if (value != null) {
+ String typeValue = value.getClass().getSimpleName();
+ switch (typeValue) {
+ case "String":
+ fieldsContent.addProperty(fieldName, (String) value);
+ break;
+ case "Boolean":
+ fieldsContent.addProperty(fieldName, (Boolean) value);
+ break;
+ case "Double":
+ fieldsContent.addProperty(fieldName, (Number) value);
+ break;
+ case "Integer":
+ fieldsContent.addProperty(fieldName, (Integer) value);
+ break;
+ default:
+ fieldsContent.add(fieldName, parseArray((ArrayList) value));
+ break;
+ }
+ }
+ }
+
+ /**
+ * If a field value is an Array, create an Instance of ArrayField to insert if in the JsonObject.
+ *
+ * @param arrayProperties array pro
+ * @return a json array
+ */
+ public JsonArray parseArray(ArrayList<Object> arrayProperties) {
+ JsonArray arrayContent = new JsonArray();
+ ArrayList<Object> arrayComponent = new ArrayList<>();
+ for (Object itemArray : arrayProperties) {
+ arrayComponent.add(itemArray);
+ }
+ ArrayField af = new ArrayField(arrayComponent);
+ arrayContent = af.deploy();
+ return arrayContent;
+ }
+
+ /**
+ * Create an instance of Constraint, to extract the values and add it to the Json (according to the type
+ * * of the current property).
+ *
+ * @param json a json
+ * @param constraints constraints
+ * @param template template
+ */
+ @SuppressWarnings("unchecked")
+ public void addConstraintsAsJson(JsonObject json, ArrayList<Object> constraints, Template template) {
+ for (Object constraint : constraints) {
+ if (constraint instanceof LinkedHashMap) {
+ LinkedHashMap<String, Object> valueConstraint = (LinkedHashMap<String, Object>) constraint;
+ Constraint constraintParser = new Constraint(valueConstraint, template);
+ constraintParser.deployConstraints(json, (String) getItems().get("type"));
+ }
+ }
+
+ }
+
+}
diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/Template.java b/src/main/java/org/onap/clamp/clds/tosca/update/Template.java
new file mode 100644
index 000000000..34459067f
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/tosca/update/Template.java
@@ -0,0 +1,104 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import java.util.ArrayList;
+
+public class Template {
+
+ /**
+ * name parameter is used as "key", in the LinkedHashMap of Templates.
+ */
+ private String name;
+ private ArrayList<String> fields;
+
+ public Template(String name) {
+ this.name = name;
+ this.fields = new ArrayList<String>();
+ }
+
+ public Template(String name, ArrayList<String> fields) {
+ this.name = name;
+ this.fields = fields;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public ArrayList<String> getFields() {
+ return fields;
+ }
+
+ public void setFields(ArrayList<String> fields) {
+ this.fields = fields;
+ }
+
+ public boolean hasFields(String name) {
+ return fields.contains(name);
+ }
+
+ public void addField(String field) {
+ fields.add(field);
+ }
+
+ public void removeField(String field) {
+ fields.remove(field);
+ }
+
+ /**
+ * Compare two templates : size and their contents.
+ *
+ * @param template the template
+ * @return a boolean
+ */
+ public boolean checkFields(Template template) {
+
+ boolean duplicateFields = false;
+ if (template.getFields().size() == this.getFields().size()) {
+ int countMatchingFields = 0;
+ //loop each component of first
+ for (String templateField : template.getFields()) {
+ //if component.key is present in the second
+ if (this.getFields().contains(templateField)) {
+ countMatchingFields++;
+ }
+ }
+
+ if (template.getFields().size() == countMatchingFields) {
+ duplicateFields = true;
+ }
+ }
+ return duplicateFields;
+ }
+
+ @Override
+ public String toString() {
+ return " fields : " + fields;
+ }
+}
diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/TemplateManagement.java b/src/main/java/org/onap/clamp/clds/tosca/update/TemplateManagement.java
new file mode 100644
index 000000000..4b510cb75
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/tosca/update/TemplateManagement.java
@@ -0,0 +1,180 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import com.google.gson.JsonObject;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Properties;
+
+public class TemplateManagement {
+
+ private LinkedHashMap<String, Template> templates;
+ private LinkedHashMap<String, Component> components;
+ private ParserToJson parserToJson;
+ private Extractor extractor;
+
+ /**
+ * Constructor.
+ *
+ * @param yamlContent Yaml content as string
+ * @param templateProperties template properties as string
+ * @throws IOException in case of failure
+ */
+ public TemplateManagement(String yamlContent, String templateProperties) throws IOException {
+ if (yamlContent != null && !yamlContent.isEmpty()) {
+ this.extractor = new Extractor(yamlContent);
+ this.components = extractor.getAllItems();
+ this.templates = initializeTemplates(templateProperties);
+ }
+ else {
+ components = null;
+ }
+ }
+
+ //GETTERS & SETTERS
+ public LinkedHashMap<String, Component> getComponents() {
+ return components;
+ }
+
+ public void setComponents(LinkedHashMap<String, Component> components) {
+ this.components = components;
+ }
+
+ public ParserToJson getParseToJson() {
+ return parserToJson;
+ }
+
+ public void setParseToJson(ParserToJson parserToJson) {
+ this.parserToJson = parserToJson;
+ }
+
+ public LinkedHashMap<String, Template> getTemplates() {
+ return templates;
+ }
+
+ public void setTemplates(LinkedHashMap<String, Template> templates) {
+ this.templates = templates;
+ }
+
+ public Extractor getExtractor() {
+ return extractor;
+ }
+
+ /**
+ * Add a template.
+ *
+ * @param name name
+ * @param fields fields
+ */
+ public void addTemplate(String name, ArrayList<String> fields) {
+ Template template = new Template(name, fields);
+ //If it is true, the operation does not have any interest :
+ // replace OR put two different object with the same body
+ if (!templates.containsKey(template.getName()) || !this.hasTemplate(template)) {
+ this.templates.put(template.getName(), template);
+ }
+ }
+
+ /**
+ * By name, find and remove a given template.
+ *
+ * @param nameTemplate name template
+ */
+ public void removeTemplate(String nameTemplate) {
+ this.templates.remove(nameTemplate);
+ }
+
+ /**
+ * Update Template : adding with true flag, removing with false.
+ *
+ * @param nameTemplate name template
+ * @param fieldName field name
+ * @param operation operation
+ */
+ public void updateTemplate(String nameTemplate, String fieldName, Boolean operation) {
+ // Operation = true && field is not present => add Field
+ if (operation && !this.templates.get(nameTemplate).getFields().contains(fieldName)) {
+ this.templates.get(nameTemplate).addField(fieldName);
+ }
+ // Operation = false && field is present => remove Field
+ else if (!operation && this.templates.get(nameTemplate).getFields().contains(fieldName)) {
+ this.templates.get(nameTemplate).removeField(fieldName);
+ }
+ }
+
+ /**
+ * Check if the JSONTemplates have the same bodies.
+ *
+ * @param template template
+ * @return a boolean
+ */
+ public boolean hasTemplate(Template template) {
+ boolean duplicateTemplate = false;
+ Collection<String> templatesName = templates.keySet();
+ if (templatesName.contains(template.getName())) {
+ Template existingTemplate = templates.get(template.getName());
+ duplicateTemplate = existingTemplate.checkFields(template);
+ }
+ return duplicateTemplate;
+ }
+
+ /**
+ * For a given Component, get a corresponding JsonObject, through parseToJSON.
+ *
+ * @param componentName name
+ * @return an json object
+ */
+ public JsonObject launchTranslation(String componentName) throws UnknownComponentException {
+ this.parserToJson = new ParserToJson(components, templates);
+ if (parserToJson.matchComponent(componentName) == null) {
+ throw new UnknownComponentException(componentName);
+ }
+ return parserToJson.getJsonProcess(componentName);
+ }
+
+ /**
+ * Create and complete several Templates from file.properties.
+ *
+ * @param templateProperties The template properties as String
+ * @return a map
+ */
+ private LinkedHashMap<String, Template> initializeTemplates(String templateProperties) throws IOException {
+ LinkedHashMap<String, Template> generatedTemplates = new LinkedHashMap<>();
+ Properties templates = new Properties();
+ templates.load(new StringReader(templateProperties));
+
+ for (Object key : templates.keySet()) {
+ String fields = (String) templates.get(key);
+ String[] fieldsInArray = fields.split(",");
+ Template template = new Template((String) key, new ArrayList<>(Arrays.asList(fieldsInArray)));
+ generatedTemplates.put(template.getName(), template);
+ }
+ return generatedTemplates;
+ }
+}
diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java b/src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java
new file mode 100644
index 000000000..e30f9158b
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+public class UnknownComponentException extends Exception {
+ public UnknownComponentException(String nameEntry) {
+ this.getWrongName(nameEntry);
+ }
+
+ public String getWrongName(String nameEntry) {
+ return "Unknown Component: " + nameEntry;
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 4422156fd..695319d5b 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -220,3 +220,6 @@ clamp.config.cadi.oauthIntrospectUrll=https://AAF_LOCATE_URL/locate/onap.org.osa
clamp.config.cadi.aafEnv=DEV
clamp.config.cadi.aafUrl=https://AAF_LOCATE_URL/onap.org.osaaf.aaf.service:2.1
clamp.config.cadi.cadiX509Issuers=CN=intermediateCA_1, OU=OSAAF, O=ONAP, C=US:CN=intermediateCA_7, OU=OSAAF, O=ONAP, C=US:CN=intermediateCA_9, OU=OSAAF, O=ONAP, C=US
+
+## Tosca converter
+clamp.config.tosca.converter.templates=classpath:/clds/tosca_updates/templates.properties
diff --git a/src/main/resources/clds/tosca_update/templates.properties b/src/main/resources/clds/tosca_update/templates.properties
new file mode 100644
index 000000000..5da239b1f
--- /dev/null
+++ b/src/main/resources/clds/tosca_update/templates.properties
@@ -0,0 +1,15 @@
+#Numeric types
+integer=type,description,title,deprecated,default,enum,const,multipleOf,maximum,exclusiveMaximum,minimum,exclusiveMinimum
+number=type,description,title,deprecated,default,enum,const,multipleOf,maximum,exclusiveMaximum,minimum,exclusiveMinimum
+range=type,description,title,deprecated,default,enum,const,multipleOf,maximum,exclusiveMaximum,minimum,exclusiveMinimum
+#
+boolean=type,description,title,deprecated,default,enum,const,readOnly,writeOnly
+#String types
+string=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format
+timestamp=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format
+scalar-unit.time=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format
+scalar-unit.frequency=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format
+scalar-unit.size=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format
+#Complex types
+array=type,description,title,deprecated,default,enum,const,minItems,maxItems,uniqueItems,minContains,maxContains
+object=type,description,title,deprecated,default,enum,const,properties,minProperties,maxProperties,required,dependentRequired,dependencies,readOnly,writeOnly
diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java
new file mode 100644
index 000000000..abf65c366
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import com.google.gson.JsonArray;
+import java.io.IOException;
+import java.util.ArrayList;
+import junit.framework.TestCase;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+
+public class ArrayFieldTest extends TestCase {
+
+ /**
+ * Test the deploy method.
+ *
+ * @throws IOException in case of failure
+ */
+ public void testDeploy() throws IOException {
+ TemplateManagement templateManagement = new TemplateManagement(ResourceFileUtil.getResourceAsString(
+ "tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml"),
+ ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties"));
+ Component component = templateManagement.getComponents().get("onap.datatype.controlloop.Actor");
+ Property property = component.getProperties().get("actor");
+ ArrayField arrayParser = new ArrayField((ArrayList<Object>) property.getItems().get("default"));
+ JsonArray toTest = arrayParser.deploy();
+ String reference = "[1,\"String\",5.5,true]";
+ assertEquals(reference, String.valueOf(toTest));
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/ComponentTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/ComponentTest.java
new file mode 100644
index 000000000..0494ee11d
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/tosca/update/ComponentTest.java
@@ -0,0 +1,49 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import junit.framework.TestCase;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+
+public class ComponentTest extends TestCase {
+
+ /**
+ * Test propertiesName.
+ *
+ * @throws IOException In case of failure
+ */
+ public void testPropertiesNames() throws IOException {
+ ArrayList<String> reference = new ArrayList<>(Arrays.asList("actor", "operation", "target", "payload"));
+ TemplateManagement templateManagement =
+ new TemplateManagement(
+ ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"),
+ ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties"));
+ Component component = templateManagement.getComponents().get("onap.datatype.controlloop.Actor");
+ assertEquals(reference, component.propertiesNames());
+ }
+
+}
diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java
new file mode 100644
index 000000000..a71ea8ac4
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import com.google.gson.JsonObject;
+import java.io.IOException;
+import java.util.ArrayList;
+import junit.framework.TestCase;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+
+public class ConstraintTest extends TestCase {
+
+ TemplateManagement templateManagement = new TemplateManagement(
+ ResourceFileUtil.getResourceAsString("tosca/new-converter/constraints.yaml"),
+ ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties"));
+
+ Component component = templateManagement.getComponents().get("onap.datatype.controlloop.Operation");
+
+ public ConstraintTest() throws IOException {
+ }
+
+ /**
+ * Test get value array.
+ */
+ public void testGetValuesArray() {
+ Property property = component.getProperties().get("timeout");
+ Template template = templateManagement.getTemplates().get("integer");
+ JsonObject resultProcess = new JsonObject();
+ property.addConstraintsAsJson(resultProcess, (ArrayList<Object>) property.getItems().get("constraints"),
+ template);
+ String reference = "{\"enum\":[3,4,5.5,6,10]}";
+ assertEquals(reference, String.valueOf(resultProcess));
+ property = component.getProperties().get("success");
+ template = templateManagement.getTemplates().get("string");
+ resultProcess = new JsonObject();
+ property.addConstraintsAsJson(resultProcess, (ArrayList<Object>) property.getItems().get("constraints"),
+ template);
+ reference = "{\"enum\":[\"VALID\",\"TERMINATED\"]}";
+ assertEquals(reference, String.valueOf(resultProcess));
+ }
+
+ /**
+ * Test get Specific length.
+ */
+ public void testGetSpecificLength() {
+ //Test for string type, same process for array
+ Property property = component.getProperties().get("id");
+ Template template = templateManagement.getTemplates().get("string");
+ JsonObject resultProcess = new JsonObject();
+ property.addConstraintsAsJson(resultProcess, (ArrayList<Object>) property.getItems().get("constraints"),
+ template);
+ int specificLength = 8;
+ int toTest = resultProcess.get("minLength").getAsInt();
+ assertEquals(specificLength, toTest);
+ toTest = resultProcess.get("maxLength").getAsInt();
+ assertEquals(specificLength, toTest);
+ }
+
+ /**
+ * Test get limit value.
+ */
+ public void testGetLimitValue() {
+ //Test for array type, same process for string
+ Property property = component.getProperties().get("description");
+ Template template = templateManagement.getTemplates().get("array");
+ JsonObject resultProcess = new JsonObject();
+ property.addConstraintsAsJson(resultProcess, (ArrayList<Object>) property.getItems().get("constraints"),
+ template);
+
+ int toTest = resultProcess.get("minItems").getAsInt();
+ assertEquals(5, toTest);
+ toTest = resultProcess.get("maxItems").getAsInt();
+ assertEquals(7, toTest);
+ }
+
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/PropertyTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/PropertyTest.java
new file mode 100644
index 000000000..cf183af81
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/tosca/update/PropertyTest.java
@@ -0,0 +1,69 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import java.io.IOException;
+import java.util.ArrayList;
+import junit.framework.TestCase;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+
+public class PropertyTest extends TestCase {
+ public PropertyTest() throws IOException {
+ }
+
+ /**
+ * Test Parse array.
+ *
+ * @throws IOException In case of failure
+ */
+ public void testParseArray() throws IOException {
+ TemplateManagement templateManagement = new TemplateManagement(
+ ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml"),
+ ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties"));
+ Component component = templateManagement.getComponents().get("onap.datatype.controlloop.Actor");
+ Property property = component.getProperties().get("actor");
+ JsonArray toTest = property.parseArray((ArrayList<Object>) property.getItems().get("default"));
+ assertNotNull(toTest);
+ }
+
+ /**
+ * Test add constraint as json.
+ *
+ * @throws IOException In case of failure
+ */
+ public void testAddConstraintsAsJson() throws IOException {
+ TemplateManagement templateManagement = new TemplateManagement(
+ ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"),
+ ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties"));
+ Component component = templateManagement.getComponents().get("onap.datatype.controlloop.operation.Failure");
+ Property property = component.getProperties().get("category");
+ Template template = templateManagement.getTemplates().get("string");
+ JsonObject toTest = new JsonObject();
+ property.addConstraintsAsJson(toTest, (ArrayList<Object>) property.getItems().get("constraints"), template);
+ String test = "{\"enum\":[\"error\",\"timeout\",\"retries\",\"guard\",\"exception\"]}";
+ assertEquals(test, String.valueOf(toTest));
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/TemplateManagementTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/TemplateManagementTest.java
new file mode 100644
index 000000000..8e411069c
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/tosca/update/TemplateManagementTest.java
@@ -0,0 +1,116 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import junit.framework.TestCase;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+
+public class TemplateManagementTest extends TestCase {
+
+ /**
+ * Test the launch translation.
+ *
+ * @throws IOException In case of failure
+ * @throws UnknownComponentException In case of failure
+ */
+ public void testLaunchTranslation() throws IOException, UnknownComponentException {
+ TemplateManagement templateManagement =
+ new TemplateManagement(
+ ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"),
+ ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties"));
+ assertNull(templateManagement.getParseToJson());
+ String componentName = "onap.policies.controlloop.operational.common.Drools";
+ templateManagement.launchTranslation(componentName);
+ assertNotNull(templateManagement.getParseToJson());
+ }
+
+ /**
+ * Test addTemplate.
+ *
+ * @throws IOException In case of failure
+ */
+ public void testAddTemplate() throws IOException {
+ TemplateManagement templateManagement =
+ new TemplateManagement(
+ ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"),
+ ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties"));
+ int count = templateManagement.getTemplates().size();
+ ArrayList<String> templateFields =
+ new ArrayList<>(Arrays.asList("type", "description", "required", "metadata", "constraints"));
+ templateManagement.addTemplate("test", templateFields);
+ assertNotSame(count, templateManagement.getTemplates().size());
+ }
+
+ /**
+ * test Remove template.
+ *
+ * @throws IOException In case of failure
+ */
+ public void testRemoveTemplate() throws IOException {
+ TemplateManagement templateManagement =
+ new TemplateManagement(
+ ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"),
+ ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties"));
+ int count = templateManagement.getTemplates().size();
+ templateManagement.removeTemplate("string");
+ assertNotSame(count, templateManagement.getTemplates().size());
+ }
+
+ /**
+ * Test update template.
+ *
+ * @throws IOException In case of failure
+ */
+ public void testUpdateTemplate() throws IOException {
+ TemplateManagement templateManagement =
+ new TemplateManagement(
+ ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"),
+ ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties"));
+ int count = templateManagement.getTemplates().get("integer").getFields().size();
+ templateManagement.updateTemplate("integer", "type", false);
+ assertNotSame(count, templateManagement.getTemplates().get("integer").getFields().size());
+ }
+
+ /**
+ * Test has template.
+ *
+ * @throws IOException In case of failure
+ */
+ public void testHasTemplate() throws IOException {
+ TemplateManagement templateManagement =
+ new TemplateManagement(
+ ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"),
+ ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties"));
+ boolean has = true;
+ ArrayList<String> templateFieldsString =
+ new ArrayList<>(Arrays.asList("type", "description", "required", "metadata", "constraints"));
+ Template templateTest = new Template("String", templateFieldsString);
+ has = templateManagement.hasTemplate(templateTest);
+ assertEquals(false, has);
+ }
+
+}
diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/TemplateTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/TemplateTest.java
new file mode 100644
index 000000000..ebc119f0d
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/tosca/update/TemplateTest.java
@@ -0,0 +1,44 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.tosca.update;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import junit.framework.TestCase;
+
+public class TemplateTest extends TestCase {
+
+ /**
+ * Test check failed.
+ */
+ public void testCheckFields() {
+ Template toTest = new Template("toTest");
+ ArrayList<String> fields = new ArrayList<>(Arrays.asList("type", "description", "enum"));
+ toTest.setFields(fields);
+ Template reference = new Template("toTest");
+ reference.setFields(fields);
+ assertTrue(toTest.checkFields(reference));
+ }
+
+} \ No newline at end of file
diff --git a/src/test/resources/tosca/base.yaml b/src/test/resources/tosca/base.yaml
new file mode 100644
index 000000000..3d31cd203
--- /dev/null
+++ b/src/test/resources/tosca/base.yaml
@@ -0,0 +1,171 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+topology_template:
+ policy_types:
+ onap.policies.controlloop.operational.Common:
+ derived_from: tosca.policies.Root
+ version: 1.0.0
+ description: Operational Policy for Control Loop execution
+ properties:
+ id:
+ type: String
+ description: The unique control loop id.
+ required: true
+ timeout:
+ type: Integer
+ description: |
+ Overall timeout for executing all the operations. This timeout should equal or exceed the total
+ timeout for each operation listed.
+ required: true
+ abatement:
+ type: Boolean
+ description: Whether an abatement event message will be expected for the control loop from DCAE.
+ required: true
+ default: false
+ trigger:
+ type: String
+ description: Initial operation to execute upon receiving an Onset event message for the Control Loop.
+ required: true
+ operations:
+ type: List
+ description: List of operations to be performed when Control Loop is triggered.
+ required: true
+ entry_schema:
+ type: onap.datatype.controlloop.operation.Failure
+
+ onap.policies.controlloop.operational.common.Apex:
+ derived_from: onap.policies.controlloop.operational.Common
+ type_version: 1.0.0
+ version: 1.0.0
+ description: Operational policies for Apex PDP
+ properties:
+
+ onap.policies.controlloop.operational.common.Drools:
+ derived_from: onap.policies.controlloop.operational.Common
+ type_version: 1.0.0
+ version: 1.0.0
+ description: Operational policies for Drools PDP
+ properties:
+ controllerName:
+ type: String
+ description: Drools controller properties
+ required: false
+
+data_types:
+ # TBD if this is needed
+ onap.datatype.controlloop.operation.Failure:
+ derived_from: tosca.datatypes.Root
+ description: Captures information of an operational failure performed for control loop
+ properties:
+ messages:
+ type: String
+ description: error message
+ required: true
+ category:
+ type: String
+ description: |
+ The category the error occurred in. Whether this is a general error from the actor, or the operation
+ timed out, retries were exhausted in trying to execute the operation, a guard policy prevented the
+ operation from occuring, or an exception in the system caused the failure.
+ constraints:
+ - valid_values: [error, timeout, retries, guard, exception]
+ - values: [4.5, false]
+
+ onap.datatype.controlloop.Target:
+ derived_from: tosca.datatypes.Root
+ description: Definition for a entity in A&AI to perform a control loop operation on
+ properties:
+ targetType:
+ type: String
+ description: Category for the target type
+ required: true
+ constraints:
+ - valid_values: [VNF, VM, VFMODULE, PNF]
+ entityIds:
+ type: Map
+ description: |
+ Map of values that identify the resource. If none are provided, it is assumed that the
+ entity that generated the ONSET event will be the target.
+ required: false
+
+ onap.datatype.controlloop.Actor:
+ derived_from: tosca.datatypes.Root
+ description: An actor/operation/target definition
+ properties:
+ actor:
+ type: String
+ description: The actor performing the operation.
+ required: true
+ operation:
+ type: String
+ description: The operation the actor is performing.
+ required: true
+ target:
+ type: String
+ description: The resource the operation should be performed on.
+ required: true
+ metadata:
+ clamp_possible_values: <string:see clamp project for syntax>
+ payload:
+ type: Map
+ description: Name/value pairs of payload information passed by Policy to the actor
+ required: false
+ entry_schema:
+ type: String
+
+ onap.datatype.controlloop.Operation:
+ derived_from: tosca.datatypes.Root
+ description: An operation supported by an actor
+ properties:
+ id:
+ type: String
+ description: Unique identifier for the operation
+ required: true
+ description:
+ type: String
+ description: A user-friendly description of the intent for the operation
+ required: false
+ operation:
+ type: onap.datatype.controlloop.Actor
+ description: The definition of the operation to be performed.
+ required: true
+ metadata:
+ clamp_possible_values: <string:see clamp project for syntax>
+ timeout:
+ type: Integer
+ description: The amount of time for the actor to perform the operation.
+ required: true
+ retries:
+ type: Integer
+ description: The number of retries the actor should attempt to perform the operation.
+ required: true
+ default: 0
+ success:
+ type: String
+ description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation.
+ required: false
+ default: final_success
+ failure:
+ type: String
+ description: Points to the operation to invoke on Actor operation failure.
+ required: false
+ default: final_failure
+ failure_timeout:
+ type: String
+ description: Points to the operation to invoke when the time out for the operation occurs.
+ required: false
+ default: final_failure_timeout
+ failure_retries:
+ type: String
+ description: Points to the operation to invoke when the current operation has exceeded its max retries.
+ required: false
+ default: final_failure_retries
+ failure_exception:
+ type: String
+ description: Points to the operation to invoke when the current operation causes an exception.
+ required: false
+ default: final_failure_exception
+ failure_guard:
+ type: String
+ description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.
+ required: false
+ default: final_failure_guard
diff --git a/src/test/resources/tosca/new-converter/constraints.yaml b/src/test/resources/tosca/new-converter/constraints.yaml
new file mode 100644
index 000000000..7a94ca965
--- /dev/null
+++ b/src/test/resources/tosca/new-converter/constraints.yaml
@@ -0,0 +1,60 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+policy_types:
+ onap.policies.controlloop.operational.common.Drools:
+ derived_from: onap.policies.controlloop.operational.Common
+ type_version: 1.0.0
+ version: 1.0.0
+ description: Operational policies for Drools PDP
+ properties:
+ controllerName:
+ type: String
+ description: Drools controller properties
+ required: true
+data_types:
+ onap.datatype.controlloop.Operation:
+ derived_from: tosca.datatypes.Root
+ description: An operation supported by an actor
+ properties:
+ id:
+ type: String
+ description: Unique identifier for the operation
+ required: true
+ constraints:
+ - length: 8
+ description:
+ type: Array
+ description: A user-friendly description of the intent for the operation
+ required: false
+ constraints:
+ - min_length: 5
+ - max_length: 7
+ test:
+ type: Integer
+ description: |
+ Overall timeout for executing all the operations. This timeout should equal or exceed the total
+ timeout for each operation listed.
+ required: true
+ constraints:
+ - greater_than: 7
+ - greater_or_equal: 1
+ - less_than: 7
+ - less_or_equal: 1
+ timeout:
+ type: Integer
+ description: The amount of time for the actor to perform the operation.
+ required: true
+ constraints:
+ - valid_values: [3,4,5.5,6,10]
+ retries:
+ type: Integer
+ description: The number of retries the actor should attempt to perform the operation.
+ required: true
+ default: 0
+ constraints:
+ - equal: 5
+ success:
+ type: String
+ description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation.
+ required: false
+ constraints:
+ - valid_values: [VALID,TERMINATED]
diff --git a/src/test/resources/tosca/new-converter/origin.json b/src/test/resources/tosca/new-converter/origin.json
new file mode 100644
index 000000000..da0529d04
--- /dev/null
+++ b/src/test/resources/tosca/new-converter/origin.json
@@ -0,0 +1 @@
+{"onap.policies.controlloop.operational.common.Drools":{"derived_from":{"onap.policies.controlloop.operational.Common":{"derived_from":"tosca.policies.Root","required":["id","timeout","abatement","trigger","operations"],"properties":{"id":{"type":"String","description":"The unique control loop id.","required":true},"timeout":{"type":"Integer","description":"Overall timeout for executing all the operations. This timeout should equal or exceed the total\ntimeout for each operation listed.\n","required":true},"abatement":{"description":"Whether an abatement event message will be expected for the control loop from DCAE.","required":true},"trigger":{"type":"String","description":"Initial operation to execute upon receiving an Onset event message for the Control Loop.","required":true},"operations":{"type":"List","description":"List of operations to be performed when Control Loop is triggered.","required":true,"entry_schema":{"type":{"onap.datatype.controlloop.Operation":{"derived_from":"tosca.datatypes.Root","required":["id","operation","timeout","retries"],"properties":{"id":{"type":"String","description":"Unique identifier for the operation","required":true},"description":{"type":"String","description":"A user-friendly description of the intent for the operation","required":false},"operation":{"type":{"onap.datatype.controlloop.Actor":{"derived_from":"tosca.datatypes.Root","required":["actor","operation","target"],"properties":{"actor":{"type":"String","description":"The actor performing the operation.","required":true},"operation":{"type":"String","description":"The operation the actor is performing.","required":true},"target":{"type":"String","description":"The resource the operation should be performed on.","required":true,"metadata":{"clamp_possible_values":"some special treatment"}},"payload":{"type":"Map","description":"Name/value pairs of payload information passed by Policy to the actor","required":false,"entry_schema":{"type":"String"}}}}},"description":"The definition of the operation to be performed.","required":true},"timeout":{"type":"Integer","description":"The amount of time for the actor to perform the operation.","required":true},"retries":{"type":"Integer","description":"The number of retries the actor should attempt to perform the operation.","required":true},"success":{"type":"String","description":"Points to the operation to invoke on success. A value of \"final_success\" indicates and end to the operation.","required":false},"failure":{"type":"String","description":"Points to the operation to invoke on Actor operation failure.","required":false},"failure_timeout":{"type":"String","description":"Points to the operation to invoke when the time out for the operation occurs.","required":false},"failure_retries":{"type":"String","description":"Points to the operation to invoke when the current operation has exceeded its max retries.","required":false},"failure_exception":{"type":"String","description":"Points to the operation to invoke when the current operation causes an exception.","required":false},"failure_guard":{"type":"String","description":"Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.","required":false}}}}}}}}},"required":[],"properties":{"controllerName":{"type":"String","description":"Drools controller properties","required":false}}}} \ No newline at end of file
diff --git a/src/test/resources/tosca/new-converter/rendu.json b/src/test/resources/tosca/new-converter/rendu.json
new file mode 100644
index 000000000..da0529d04
--- /dev/null
+++ b/src/test/resources/tosca/new-converter/rendu.json
@@ -0,0 +1 @@
+{"onap.policies.controlloop.operational.common.Drools":{"derived_from":{"onap.policies.controlloop.operational.Common":{"derived_from":"tosca.policies.Root","required":["id","timeout","abatement","trigger","operations"],"properties":{"id":{"type":"String","description":"The unique control loop id.","required":true},"timeout":{"type":"Integer","description":"Overall timeout for executing all the operations. This timeout should equal or exceed the total\ntimeout for each operation listed.\n","required":true},"abatement":{"description":"Whether an abatement event message will be expected for the control loop from DCAE.","required":true},"trigger":{"type":"String","description":"Initial operation to execute upon receiving an Onset event message for the Control Loop.","required":true},"operations":{"type":"List","description":"List of operations to be performed when Control Loop is triggered.","required":true,"entry_schema":{"type":{"onap.datatype.controlloop.Operation":{"derived_from":"tosca.datatypes.Root","required":["id","operation","timeout","retries"],"properties":{"id":{"type":"String","description":"Unique identifier for the operation","required":true},"description":{"type":"String","description":"A user-friendly description of the intent for the operation","required":false},"operation":{"type":{"onap.datatype.controlloop.Actor":{"derived_from":"tosca.datatypes.Root","required":["actor","operation","target"],"properties":{"actor":{"type":"String","description":"The actor performing the operation.","required":true},"operation":{"type":"String","description":"The operation the actor is performing.","required":true},"target":{"type":"String","description":"The resource the operation should be performed on.","required":true,"metadata":{"clamp_possible_values":"some special treatment"}},"payload":{"type":"Map","description":"Name/value pairs of payload information passed by Policy to the actor","required":false,"entry_schema":{"type":"String"}}}}},"description":"The definition of the operation to be performed.","required":true},"timeout":{"type":"Integer","description":"The amount of time for the actor to perform the operation.","required":true},"retries":{"type":"Integer","description":"The number of retries the actor should attempt to perform the operation.","required":true},"success":{"type":"String","description":"Points to the operation to invoke on success. A value of \"final_success\" indicates and end to the operation.","required":false},"failure":{"type":"String","description":"Points to the operation to invoke on Actor operation failure.","required":false},"failure_timeout":{"type":"String","description":"Points to the operation to invoke when the time out for the operation occurs.","required":false},"failure_retries":{"type":"String","description":"Points to the operation to invoke when the current operation has exceeded its max retries.","required":false},"failure_exception":{"type":"String","description":"Points to the operation to invoke when the current operation causes an exception.","required":false},"failure_guard":{"type":"String","description":"Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.","required":false}}}}}}}}},"required":[],"properties":{"controllerName":{"type":"String","description":"Drools controller properties","required":false}}}} \ No newline at end of file
diff --git a/src/test/resources/tosca/new-converter/sampleOperationalPolicies.yaml b/src/test/resources/tosca/new-converter/sampleOperationalPolicies.yaml
new file mode 100644
index 000000000..c2afeccdc
--- /dev/null
+++ b/src/test/resources/tosca/new-converter/sampleOperationalPolicies.yaml
@@ -0,0 +1,160 @@
+
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+policy_types:
+ onap.policies.controlloop.operational.Common:
+ derived_from: tosca.policies.Root
+ version: 1.0.0
+ description: Operational Policy for Control Loop execution
+ properties:
+ id:
+ type: String
+ description: The unique control loop id.
+ required: true
+ timeout:
+ type: Integer
+ description: |
+ Overall timeout for executing all the operations. This timeout should equal or exceed the total
+ timeout for each operation listed.
+ required: true
+ abatement:
+ type: Boolean
+ description: Whether an abatement event message will be expected for the control loop from DCAE.
+ required: true
+ default: false
+ trigger:
+ type: String
+ description: Initial operation to execute upon receiving an Onset event message for the Control Loop.
+ required: true
+ operations:
+ type: List
+ description: List of operations to be performed when Control Loop is triggered.
+ required: true
+ entry_schema:
+ type: onap.datatype.controlloop.Operation
+ onap.policies.controlloop.operational.common.Drools:
+ derived_from: onap.policies.controlloop.operational.Common
+ type_version: 1.0.0
+ version: 1.0.0
+ description: Operational policies for Drools PDP
+ properties:
+ controllerName:
+ type: String
+ description: Drools controller properties
+ required: false
+data_types:
+ # TBD if this is needed
+ onap.datatype.controlloop.operation.Failure:
+ derived_from: tosca.datatypes.Root
+ description: Captures information of an operational failure performed for control loop
+ properties:
+ messages:
+ type: String
+ description: error message
+ required: true
+ category:
+ type: String
+ description: |
+ The category the error occurred in. Whether this is a general error from the actor, or the operation
+ timed out, retries were exhausted in trying to execute the operation, a guard policy prevented the
+ operation from occuring, or an exception in the system caused the failure.
+ constraints:
+ - valid_values: [error, timeout, retries, guard, exception]
+ onap.datatype.controlloop.Target:
+ derived_from: tosca.datatypes.Root
+ description: Definition for a entity in A&AI to perform a control loop operation on
+ properties:
+ targetType:
+ type: String
+ description: Category for the target type
+ required: true
+ constraints:
+ - valid_values: [VNF, VM, VFMODULE, PNF]
+ entityIds:
+ type: Map
+ description: |
+ Map of values that identify the resource. If none are provided, it is assumed that the
+ entity that generated the ONSET event will be the target.
+ required: false
+ entry_schema:
+ type: String
+ onap.datatype.controlloop.Actor:
+ derived_from: tosca.datatypes.Root
+ description: An actor/operation/target definition
+ properties:
+ actor:
+ type: String
+ description: The actor performing the operation.
+ required: true
+ operation:
+ type: String
+ description: The operation the actor is performing.
+ required: true
+ target:
+ type: String
+ description: The resource the operation should be performed on.
+ required: true
+ metadata:
+ clamp_possible_values: <string:see clamp project for syntax>
+ payload:
+ type: Map
+ description: Name/value pairs of payload information passed by Policy to the actor
+ required: false
+ entry_schema:
+ type: String
+ onap.datatype.controlloop.Operation:
+ derived_from: tosca.datatypes.Root
+ description: An operation supported by an actor
+ properties:
+ id:
+ type: String
+ description: Unique identifier for the operation
+ required: true
+ description:
+ type: String
+ description: A user-friendly description of the intent for the operation
+ required: false
+ operation:
+ type: onap.datatype.controlloop.Actor
+ description: The definition of the operation to be performed.
+ required: true
+ metadata:
+ clamp_possible_values: <string:see clamp project for syntax>
+ timeout:
+ type: Integer
+ description: The amount of time for the actor to perform the operation.
+ required: true
+ retries:
+ type: Integer
+ description: The number of retries the actor should attempt to perform the operation.
+ required: true
+ default: 0
+ success:
+ type: String
+ description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation.
+ required: false
+ default: final_success
+ failure:
+ type: String
+ description: Points to the operation to invoke on Actor operation failure.
+ required: false
+ default: final_failure
+ failure_timeout:
+ type: String
+ description: Points to the operation to invoke when the time out for the operation occurs.
+ required: false
+ default: final_failure_timeout
+ failure_retries:
+ type: String
+ description: Points to the operation to invoke when the current operation has exceeded its max retries.
+ required: false
+ default: final_failure_retries
+ failure_exception:
+ type: String
+ description: Points to the operation to invoke when the current operation causes an exception.
+ required: false
+ default: final_failure_exception
+ failure_guard:
+ type: String
+ description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.
+ required: false
+ default: final_failure_guard
diff --git a/src/test/resources/tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml b/src/test/resources/tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml
new file mode 100644
index 000000000..9d45c645e
--- /dev/null
+++ b/src/test/resources/tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml
@@ -0,0 +1,174 @@
+
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+policy_types:
+ onap.policies.controlloop.operational.Common:
+ derived_from: onap.datatype.controlloop.operation.Failure
+ version: 1.0.0
+ description: Operational Policy for Control Loop execution
+ properties:
+ id:
+ type: String
+ description: The unique control loop id.
+ required: true
+ timeout:
+ type: Integer
+ description: |
+ Overall timeout for executing all the operations. This timeout should equal or exceed the total
+ timeout for each operation listed.
+ required: true
+ constraints:
+ - valid_values: [1, 2, 5]
+ - equal: 5
+ - greater_than: 7
+ - greater_or_equal: 1
+ - less_than: 7
+ - less_or_equal: 1
+ abatement:
+ type: Boolean
+ description: Whether an abatement event message will be expected for the control loop from DCAE.
+ required: true
+ default: false
+ trigger:
+ type: String
+ description: Initial operation to execute upon receiving an Onset event message for the Control Loop.
+ required: true
+ operations:
+ type: List
+ description: List of operations to be performed when Control Loop is triggered.
+ required: true
+ entry_schema:
+ type: onap.datatype.controlloop.Operation
+ onap.policies.controlloop.operational.common.Drools:
+ derived_from: onap.policies.controlloop.operational.Common
+ type_version: 1.0.0
+ version: 1.0.0
+ description: Operational policies for Drools PDP
+ properties:
+ controllerName:
+ type: String
+ description: Drools controller properties
+ required: true
+data_types:
+ # TBD if this is needed
+ onap.datatype.controlloop.operation.Failure:
+ derived_from: onap.datatype.controlloop.Target
+ description: Captures information of an operational failure performed for control loop
+ properties:
+ messages:
+ type: String
+ description: error message
+ required: true
+ category:
+ type: String
+ description: |
+ The category the error occurred in. Whether this is a general error from the actor, or the operation
+ timed out, retries were exhausted in trying to execute the operation, a guard policy prevented the
+ operation from occuring, or an exception in the system caused the failure.
+ constraints:
+ - valid_values: [error, timeout, retries, guard, exception]
+ onap.datatype.controlloop.Target:
+ derived_from: tosca.datatypes.Root
+ description: Definition for a entity in A&AI to perform a control loop operation on
+ properties:
+ targetType:
+ type: String
+ description: Category for the target type
+ required: true
+ constraints:
+ - valid_values: [VNF, VM, VFMODULE, PNF]
+ entityIds:
+ type: Map
+ description: |
+ Map of values that identify the resource. If none are provided, it is assumed that the
+ entity that generated the ONSET event will be the target.
+ required: false
+ entry_schema:
+ type: String
+ onap.datatype.controlloop.Actor:
+ derived_from: tosca.datatypes.Root
+ description: An actor/operation/target definition
+ properties:
+ actor:
+ type: String
+ description: The actor performing the operation.
+ required: true
+ default: [1,"String",5.5,true]
+ operation:
+ type: String
+ description: The operation the actor is performing.
+ required: true
+ target:
+ type: String
+ description: The resource the operation should be performed on.
+ required: true
+ metadata:
+ clamp_possible_values: <string:see clamp project for syntax>
+ payload:
+ type: Map
+ description: Name/value pairs of payload information passed by Policy to the actor
+ required: false
+ entry_schema:
+ type: String
+ onap.datatype.controlloop.Operation:
+ derived_from: tosca.datatypes.Root
+ description: An operation supported by an actor
+ properties:
+ id:
+ type: String
+ description: Unique identifier for the operation
+ required: true
+ description:
+ type: Array
+ description: A user-friendly description of the intent for the operation
+ required: false
+ constraints:
+ - min_length: 5
+ - max_length: 7
+ - length: 1
+ operation:
+ type: onap.datatype.controlloop.Actor
+ description: The definition of the operation to be performed.
+ required: true
+ metadata:
+ clamp_possible_values: <string:see clamp project for syntax>
+ timeout:
+ type: Integer
+ description: The amount of time for the actor to perform the operation.
+ required: true
+ constraints:
+ - valid_values: [3, 4, 5.5, 6, 10]
+ retries:
+ type: Integer
+ description: The number of retries the actor should attempt to perform the operation.
+ required: true
+ default: 0
+ success:
+ type: String
+ description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation.
+ required: false
+ default: final_success
+ failure:
+ type: String
+ description: Points to the operation to invoke on Actor operation failure.
+ required: false
+ default: final_failure
+ failure_timeout:
+ type: String
+ description: Points to the operation to invoke when the time out for the operation occurs.
+ required: false
+ default: final_failure_timeout
+ failure_retries:
+ type: String
+ description: Points to the operation to invoke when the current operation has exceeded its max retries.
+ required: false
+ default: final_failure_retries
+ failure_exception:
+ type: String
+ description: Points to the operation to invoke when the current operation causes an exception.
+ required: false
+ default: final_failure_exception
+ failure_guard:
+ type: String
+ description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.
+ required: false
+ default: final_failure_guard
diff --git a/src/test/resources/tosca/templates.properties b/src/test/resources/tosca/templates.properties
new file mode 100644
index 000000000..792238bd3
--- /dev/null
+++ b/src/test/resources/tosca/templates.properties
@@ -0,0 +1,7 @@
+Integer=type,description,required
+Boolean=description,required
+String=type,description,required,metadata,constraints
+Number=description,required
+Map=type,description,required,entry_schema
+List=type,required,entry_schema
+onap.datatype.controlloop.Actor=type,description,required,metadata \ No newline at end of file