Rework tosca converter 27/101227/19
authorWeberLaurent <weberlaurent23@gmail.com>
Thu, 6 Feb 2020 09:23:01 +0000 (10:23 +0100)
committersebdet <sebastien.determe@intl.att.com>
Tue, 3 Mar 2020 20:41:30 +0000 (12:41 -0800)
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>
24 files changed:
src/main/java/org/onap/clamp/clds/tosca/update/ArrayField.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/tosca/update/Component.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/tosca/update/Constraint.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/tosca/update/Extractor.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/tosca/update/ParserToJson.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/tosca/update/Property.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/tosca/update/Template.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/tosca/update/TemplateManagement.java [new file with mode: 0644]
src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java [new file with mode: 0644]
src/main/resources/application.properties
src/main/resources/clds/tosca_update/templates.properties [new file with mode: 0644]
src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java [new file with mode: 0644]
src/test/java/org/onap/clamp/clds/tosca/update/ComponentTest.java [new file with mode: 0644]
src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java [new file with mode: 0644]
src/test/java/org/onap/clamp/clds/tosca/update/PropertyTest.java [new file with mode: 0644]
src/test/java/org/onap/clamp/clds/tosca/update/TemplateManagementTest.java [new file with mode: 0644]
src/test/java/org/onap/clamp/clds/tosca/update/TemplateTest.java [new file with mode: 0644]
src/test/resources/tosca/base.yaml [new file with mode: 0644]
src/test/resources/tosca/new-converter/constraints.yaml [new file with mode: 0644]
src/test/resources/tosca/new-converter/origin.json [new file with mode: 0644]
src/test/resources/tosca/new-converter/rendu.json [new file with mode: 0644]
src/test/resources/tosca/new-converter/sampleOperationalPolicies.yaml [new file with mode: 0644]
src/test/resources/tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml [new file with mode: 0644]
src/test/resources/tosca/templates.properties [new file with mode: 0644]

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 (file)
index 0000000..61e40a1
--- /dev/null
@@ -0,0 +1,72 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP CLAMP\r
+ * ================================================================================\r
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights\r
+ *                             reserved.\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ============LICENSE_END============================================\r
+ * ===================================================================\r
+ *\r
+ */\r
+\r
+package org.onap.clamp.clds.tosca.update;\r
+\r
+import com.google.gson.JsonArray;\r
+import java.util.ArrayList;\r
+\r
+public class ArrayField {\r
+\r
+    private ArrayList<Object> complexFields;\r
+\r
+    /**\r
+     * Constructor from arraryList.\r
+     *\r
+     * @param arrayProperties the array properties\r
+     */\r
+    public ArrayField(ArrayList<Object> arrayProperties) {\r
+        this.complexFields = arrayProperties;\r
+    }\r
+\r
+    /**\r
+     * Each LinkedHashMap is parsed to extract the Array and each of its value. They are casted for the JsonObject.\r
+     *\r
+     * @return JsonArray\r
+     */\r
+    public JsonArray deploy() {\r
+\r
+        JsonArray subPropertyValuesArray = new JsonArray();\r
+        for (Object arrayElement : complexFields) {\r
+            //Cast for each Primitive Type\r
+            String typeValue = arrayElement.getClass().getSimpleName();\r
+            switch (typeValue) {\r
+                case "String":\r
+                    subPropertyValuesArray.add((String) arrayElement);\r
+                    break;\r
+                case "Boolean":\r
+                    subPropertyValuesArray.add((Boolean) arrayElement);\r
+                    break;\r
+                case "Double":\r
+                    subPropertyValuesArray.add((Number) arrayElement);\r
+                    break;\r
+                case "Integer":\r
+                    subPropertyValuesArray.add((Number) arrayElement);\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+        }\r
+        return subPropertyValuesArray;\r
+    }\r
+}\r
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 (file)
index 0000000..6db129d
--- /dev/null
@@ -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 (file)
index 0000000..4f6b27a
--- /dev/null
@@ -0,0 +1,221 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP CLAMP\r
+ * ================================================================================\r
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights\r
+ *                             reserved.\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ============LICENSE_END============================================\r
+ * ===================================================================\r
+ *\r
+ */\r
+\r
+package org.onap.clamp.clds.tosca.update;\r
+\r
+import com.google.gson.JsonArray;\r
+import com.google.gson.JsonObject;\r
+import java.util.ArrayList;\r
+import java.util.LinkedHashMap;\r
+import java.util.Map.Entry;\r
+\r
+public class Constraint {\r
+\r
+    private LinkedHashMap<String, Object> constraints;\r
+    private Template template;\r
+\r
+    public Constraint(LinkedHashMap<String, Object> constraints, Template template) {\r
+        this.template = template;\r
+        this.constraints = constraints;\r
+    }\r
+\r
+    /**\r
+     * Deploy the linkedhashmap which contains the constraints, to extract them one to one.\r
+     *\r
+     * @param jsonSchema   The json Schema\r
+     * @param typeProperty The ype property\r
+     * @return the json object\r
+     */\r
+    public JsonObject deployConstraints(JsonObject jsonSchema, String typeProperty) {\r
+        for (Entry<String, Object> constraint : constraints.entrySet()) {\r
+            this.parseConstraint(jsonSchema, constraint.getKey(), constraint.getValue(), typeProperty);\r
+        }\r
+        return jsonSchema;\r
+    }\r
+\r
+    /**\r
+     * Each case of Tosca constraints below parse specifically the field in the JsonObject.\r
+     *\r
+     * @param jsonSchema      Json Schema\r
+     * @param nameConstraint  Name constraint\r
+     * @param valueConstraint value constraint\r
+     * @param typeProperty    Type Property\r
+     */\r
+    @SuppressWarnings("unchecked")\r
+    public void parseConstraint(JsonObject jsonSchema, String nameConstraint, Object valueConstraint,\r
+                                String typeProperty) {\r
+        switch (nameConstraint) {\r
+            case "equal":\r
+                checkTemplateField("const", jsonSchema, valueConstraint);\r
+                break;\r
+            case "greater_than":\r
+                checkTemplateField("exclusiveMinimum", jsonSchema, valueConstraint);\r
+                break;\r
+            case "greater_or_equal":\r
+                checkTemplateField("minimum", jsonSchema, valueConstraint);\r
+                break;\r
+            case "less_than":\r
+                checkTemplateField("exclusiveMaximum", jsonSchema, valueConstraint);\r
+                break;\r
+            case "less_or_equal":\r
+                checkTemplateField("maximum", jsonSchema, valueConstraint);\r
+                break;\r
+            case "in_range":\r
+                ArrayList<Integer> limitValues = (ArrayList<Integer>) valueConstraint;\r
+                checkTemplateField("minimum", jsonSchema, limitValues.get(0));\r
+                checkTemplateField("maximum", jsonSchema, limitValues.get(1));\r
+                break;\r
+            case "pattern":\r
+                jsonSchema.addProperty(nameConstraint, (String) valueConstraint);\r
+                break;\r
+            case "length":\r
+                this.getSpecificLength(jsonSchema, valueConstraint, typeProperty);\r
+                break;\r
+            case "min_length":\r
+                String[] prefixValues = nameConstraint.split("_");\r
+                this.getLimitValue(jsonSchema, valueConstraint, typeProperty, prefixValues[0]);\r
+                break;\r
+            case "max_length":\r
+                String[] maxtab = nameConstraint.split("_");\r
+                this.getLimitValue(jsonSchema, valueConstraint, typeProperty, maxtab[0]);\r
+                break;\r
+            default://valid_value\r
+                this.getValueArray(jsonSchema, valueConstraint, typeProperty);\r
+                break;\r
+        }\r
+\r
+    }\r
+\r
+    /**\r
+     * To be done.\r
+     *\r
+     * @param jsonSchema   json schema\r
+     * @param fieldValue   field value\r
+     * @param typeProperty For the complex components, get a specific number of items/properties\r
+     */\r
+    public void getSpecificLength(JsonObject jsonSchema, Object fieldValue, String typeProperty) {\r
+        switch (typeProperty.toLowerCase()) {\r
+            case "string":\r
+                checkTemplateField("minLength", jsonSchema, fieldValue);\r
+                checkTemplateField("maxLength", jsonSchema, fieldValue);\r
+                break;\r
+            case "array":\r
+                if (fieldValue.equals(1) && template.hasFields("uniqueItems")) {\r
+                    jsonSchema.addProperty("uniqueItems", true);\r
+                } else {\r
+                    checkTemplateField("minItems", jsonSchema, fieldValue);\r
+                    checkTemplateField("maxItems", jsonSchema, fieldValue);\r
+                }\r
+                break;\r
+            default:// Map && List\r
+                checkTemplateField("minProperties", jsonSchema, fieldValue);\r
+                checkTemplateField("maxProperties", jsonSchema, fieldValue);\r
+                break;\r
+        }\r
+\r
+    }\r
+\r
+    /**\r
+     * To be done.\r
+     *\r
+     * @param jsonSchema   json schema\r
+     * @param fieldValue   field value\r
+     * @param typeProperty type property\r
+     * @param side         Get the limits fieldValue for the properties : depend of the type of the component\r
+     */\r
+    public void getLimitValue(JsonObject jsonSchema, Object fieldValue, String typeProperty, String side) {\r
+        switch (typeProperty) {\r
+            case "string":\r
+                if (side.equals("min")) {\r
+                    checkTemplateField("minLength", jsonSchema, fieldValue);\r
+                } else {\r
+                    checkTemplateField("maxLength", jsonSchema, fieldValue);\r
+                }\r
+                break;\r
+            default:// Array\r
+                if (side.equals("min")) {\r
+                    checkTemplateField("minItems", jsonSchema, fieldValue);\r
+                } else {\r
+                    checkTemplateField("maxItems", jsonSchema, fieldValue);\r
+                }\r
+                break;\r
+        }\r
+\r
+    }\r
+\r
+    /**\r
+     * To be done.\r
+     *\r
+     * @param jsonSchema   Json schema\r
+     * @param fieldValue   field value\r
+     * @param typeProperty Get as Enum the valid values for the property\r
+     */\r
+    public void getValueArray(JsonObject jsonSchema, Object fieldValue, String typeProperty) {\r
+        if (template.hasFields("enum")) {\r
+            JsonArray enumeration = new JsonArray();\r
+            if (typeProperty.equals("string") || typeProperty.equals("String")) {\r
+                ArrayList<String> arrayValues = (ArrayList<String>) fieldValue;\r
+                for (String arrayItem : arrayValues) {\r
+                    enumeration.add(arrayItem);\r
+                }\r
+                jsonSchema.add("enum", enumeration);\r
+            } else {\r
+                ArrayList<Number> arrayValues = (ArrayList<Number>) fieldValue;\r
+                for (Number arrayItem : arrayValues) {\r
+                    enumeration.add(arrayItem);\r
+                }\r
+                jsonSchema.add("enum", enumeration);\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * To be done.\r
+     *\r
+     * @param field      Field\r
+     * @param jsonSchema Json schema\r
+     * @param fieldValue Simple way to avoid code duplication\r
+     */\r
+    public void checkTemplateField(String field, JsonObject jsonSchema, Object fieldValue) {\r
+        if (template.hasFields(field)) {\r
+            String typeField = fieldValue.getClass().getSimpleName();\r
+            switch (typeField) {\r
+                case "String":\r
+                    jsonSchema.addProperty(field, (String) fieldValue);\r
+                    break;\r
+                case "Integer":\r
+                    jsonSchema.addProperty(field, (Integer) fieldValue);\r
+                    break;\r
+                case "Number":\r
+                    jsonSchema.addProperty(field, (Number) fieldValue);\r
+                    break;\r
+                case "Boolean":\r
+                    jsonSchema.addProperty(field, (Boolean) fieldValue);\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+        }\r
+    }\r
+\r
+}
\ 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 (file)
index 0000000..032edba
--- /dev/null
@@ -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 (file)
index 0000000..6da55ea
--- /dev/null
@@ -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 (file)
index 0000000..0b6e381
--- /dev/null
@@ -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 (file)
index 0000000..3445906
--- /dev/null
@@ -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 (file)
index 0000000..4b510cb
--- /dev/null
@@ -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 (file)
index 0000000..e30f915
--- /dev/null
@@ -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;
+    }
+}
index 4422156..695319d 100644 (file)
@@ -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 (file)
index 0000000..5da239b
--- /dev/null
@@ -0,0 +1,15 @@
+#Numeric types\r
+integer=type,description,title,deprecated,default,enum,const,multipleOf,maximum,exclusiveMaximum,minimum,exclusiveMinimum\r
+number=type,description,title,deprecated,default,enum,const,multipleOf,maximum,exclusiveMaximum,minimum,exclusiveMinimum\r
+range=type,description,title,deprecated,default,enum,const,multipleOf,maximum,exclusiveMaximum,minimum,exclusiveMinimum\r
+#\r
+boolean=type,description,title,deprecated,default,enum,const,readOnly,writeOnly\r
+#String types\r
+string=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format\r
+timestamp=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format\r
+scalar-unit.time=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format\r
+scalar-unit.frequency=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format\r
+scalar-unit.size=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format\r
+#Complex types\r
+array=type,description,title,deprecated,default,enum,const,minItems,maxItems,uniqueItems,minContains,maxContains\r
+object=type,description,title,deprecated,default,enum,const,properties,minProperties,maxProperties,required,dependentRequired,dependencies,readOnly,writeOnly\r
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 (file)
index 0000000..abf65c3
--- /dev/null
@@ -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 (file)
index 0000000..0494ee1
--- /dev/null
@@ -0,0 +1,49 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ * ONAP CLAMP\r
+ * ================================================================================\r
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights\r
+ *                             reserved.\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ============LICENSE_END============================================\r
+ * ===================================================================\r
+ *\r
+ */\r
+\r
+package org.onap.clamp.clds.tosca.update;\r
+\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import junit.framework.TestCase;\r
+import org.onap.clamp.clds.util.ResourceFileUtil;\r
+\r
+public class ComponentTest extends TestCase {\r
+\r
+    /**\r
+     * Test propertiesName.\r
+     *\r
+     * @throws IOException In case of failure\r
+     */\r
+    public void testPropertiesNames() throws IOException {\r
+        ArrayList<String> reference = new ArrayList<>(Arrays.asList("actor", "operation", "target", "payload"));\r
+        TemplateManagement templateManagement =\r
+                new TemplateManagement(\r
+                        ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"),\r
+                        ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties"));\r
+        Component component = templateManagement.getComponents().get("onap.datatype.controlloop.Actor");\r
+        assertEquals(reference, component.propertiesNames());\r
+    }\r
+\r
+}\r
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 (file)
index 0000000..a71ea8a
--- /dev/null
@@ -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 (file)
index 0000000..cf183af
--- /dev/null
@@ -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 (file)
index 0000000..8e41106
--- /dev/null
@@ -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 (file)
index 0000000..ebc119f
--- /dev/null
@@ -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 (file)
index 0000000..3d31cd2
--- /dev/null
@@ -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 (file)
index 0000000..7a94ca9
--- /dev/null
@@ -0,0 +1,60 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0\r
+policy_types:\r
+    onap.policies.controlloop.operational.common.Drools:\r
+        derived_from: onap.policies.controlloop.operational.Common\r
+        type_version: 1.0.0\r
+        version: 1.0.0\r
+        description: Operational policies for Drools PDP\r
+        properties:\r
+            controllerName:\r
+                type: String\r
+                description: Drools controller properties\r
+                required: true\r
+data_types:\r
+    onap.datatype.controlloop.Operation:\r
+        derived_from: tosca.datatypes.Root\r
+        description: An operation supported by an actor\r
+        properties:\r
+            id:\r
+                type: String\r
+                description: Unique identifier for the operation\r
+                required: true\r
+                constraints:\r
+                - length: 8\r
+            description:\r
+                type: Array\r
+                description: A user-friendly description of the intent for the operation\r
+                required: false\r
+                constraints:\r
+                - min_length: 5\r
+                - max_length: 7\r
+            test:\r
+                type: Integer\r
+                description: |\r
+                    Overall timeout for executing all the operations. This timeout should equal or exceed the total\r
+                    timeout for each operation listed.\r
+                required: true\r
+                constraints:\r
+                    - greater_than: 7\r
+                    - greater_or_equal: 1\r
+                    - less_than: 7\r
+                    - less_or_equal: 1\r
+            timeout:\r
+                type: Integer\r
+                description: The amount of time for the actor to perform the operation.\r
+                required: true\r
+                constraints:\r
+                - valid_values: [3,4,5.5,6,10]\r
+            retries:\r
+                type: Integer\r
+                description: The number of retries the actor should attempt to perform the operation.\r
+                required: true\r
+                default: 0\r
+                constraints:\r
+                - equal: 5\r
+            success:\r
+                type: String\r
+                description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation.\r
+                required: false\r
+                constraints:\r
+                - valid_values: [VALID,TERMINATED]\r
diff --git a/src/test/resources/tosca/new-converter/origin.json b/src/test/resources/tosca/new-converter/origin.json
new file mode 100644 (file)
index 0000000..da0529d
--- /dev/null
@@ -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 (file)
index 0000000..da0529d
--- /dev/null
@@ -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 (file)
index 0000000..c2afecc
--- /dev/null
@@ -0,0 +1,160 @@
+\r
+tosca_definitions_version: tosca_simple_yaml_1_0_0\r
+policy_types:\r
+    onap.policies.controlloop.operational.Common:\r
+        derived_from: tosca.policies.Root\r
+        version: 1.0.0\r
+        description: Operational Policy for Control Loop execution\r
+        properties:\r
+            id:\r
+                type: String\r
+                description: The unique control loop id.\r
+                required: true\r
+            timeout:\r
+                type: Integer\r
+                description: |\r
+                    Overall timeout for executing all the operations. This timeout should equal or exceed the total\r
+                    timeout for each operation listed.\r
+                required: true\r
+            abatement:\r
+                type: Boolean\r
+                description: Whether an abatement event message will be expected for the control loop from DCAE.\r
+                required: true\r
+                default: false\r
+            trigger:\r
+                type: String\r
+                description: Initial operation to execute upon receiving an Onset event message for the Control Loop.\r
+                required: true\r
+            operations:\r
+                type: List\r
+                description: List of operations to be performed when Control Loop is triggered.\r
+                required: true\r
+                entry_schema:\r
+                    type: onap.datatype.controlloop.Operation\r
+    onap.policies.controlloop.operational.common.Drools:\r
+        derived_from: onap.policies.controlloop.operational.Common\r
+        type_version: 1.0.0\r
+        version: 1.0.0\r
+        description: Operational policies for Drools PDP\r
+        properties:\r
+            controllerName:\r
+                type: String\r
+                description: Drools controller properties\r
+                required: false\r
+data_types:\r
+    # TBD if this is needed\r
+    onap.datatype.controlloop.operation.Failure:\r
+        derived_from: tosca.datatypes.Root\r
+        description: Captures information of an operational failure performed for control loop\r
+        properties:\r
+            messages:\r
+                type: String\r
+                description: error message\r
+                required: true\r
+            category:\r
+                type: String\r
+                description: |\r
+                    The category the error occurred in. Whether this is a general error from the actor, or the operation\r
+                    timed out, retries were exhausted in trying to execute the operation, a guard policy prevented the\r
+                    operation from occuring, or an exception in the system caused the failure.\r
+                constraints:\r
+                - valid_values: [error, timeout, retries, guard, exception]\r
+    onap.datatype.controlloop.Target:\r
+        derived_from: tosca.datatypes.Root\r
+        description: Definition for a entity in A&AI to perform a control loop operation on\r
+        properties:\r
+            targetType:\r
+                type: String\r
+                description: Category for the target type\r
+                required: true\r
+                constraints:\r
+                - valid_values: [VNF, VM, VFMODULE, PNF]\r
+            entityIds:\r
+                type: Map\r
+                description: |\r
+                    Map of values that identify the resource. If none are provided, it is assumed that the\r
+                    entity that generated the ONSET event will be the target.\r
+                required: false\r
+                entry_schema:\r
+                    type: String\r
+    onap.datatype.controlloop.Actor:\r
+        derived_from: tosca.datatypes.Root\r
+        description: An actor/operation/target definition\r
+        properties:\r
+            actor:\r
+                type: String\r
+                description: The actor performing the operation.\r
+                required: true\r
+            operation:\r
+                type: String\r
+                description: The operation the actor is performing.\r
+                required: true\r
+            target:\r
+                type: String\r
+                description: The resource the operation should be performed on.\r
+                required: true\r
+                metadata:\r
+                    clamp_possible_values: <string:see clamp project for syntax>\r
+            payload:\r
+                type: Map\r
+                description: Name/value pairs of payload information passed by Policy to the actor\r
+                required: false\r
+                entry_schema:\r
+                    type: String\r
+    onap.datatype.controlloop.Operation:\r
+        derived_from: tosca.datatypes.Root\r
+        description: An operation supported by an actor\r
+        properties:\r
+            id:\r
+                type: String\r
+                description: Unique identifier for the operation\r
+                required: true\r
+            description:\r
+                type: String\r
+                description: A user-friendly description of the intent for the operation\r
+                required: false\r
+            operation:\r
+                type: onap.datatype.controlloop.Actor\r
+                description: The definition of the operation to be performed.\r
+                required: true\r
+                metadata:\r
+                    clamp_possible_values: <string:see clamp project for syntax>\r
+            timeout:\r
+                type: Integer\r
+                description: The amount of time for the actor to perform the operation.\r
+                required: true\r
+            retries:\r
+                type: Integer\r
+                description: The number of retries the actor should attempt to perform the operation.\r
+                required: true\r
+                default: 0\r
+            success:\r
+                type: String\r
+                description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation.\r
+                required: false\r
+                default: final_success\r
+            failure:\r
+                type: String\r
+                description: Points to the operation to invoke on Actor operation failure.\r
+                required: false\r
+                default: final_failure\r
+            failure_timeout:\r
+                type: String\r
+                description: Points to the operation to invoke when the time out for the operation occurs.\r
+                required: false\r
+                default: final_failure_timeout\r
+            failure_retries:\r
+                type: String\r
+                description: Points to the operation to invoke when the current operation has exceeded its max retries.\r
+                required: false\r
+                default: final_failure_retries\r
+            failure_exception:\r
+                type: String\r
+                description: Points to the operation to invoke when the current operation causes an exception.\r
+                required: false\r
+                default: final_failure_exception\r
+            failure_guard:\r
+                type: String\r
+                description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.\r
+                required: false\r
+                default: final_failure_guard\r
diff --git a/src/test/resources/tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml b/src/test/resources/tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml
new file mode 100644 (file)
index 0000000..9d45c64
--- /dev/null
@@ -0,0 +1,174 @@
+\r
+tosca_definitions_version: tosca_simple_yaml_1_0_0\r
+policy_types:\r
+    onap.policies.controlloop.operational.Common:\r
+        derived_from: onap.datatype.controlloop.operation.Failure\r
+        version: 1.0.0\r
+        description: Operational Policy for Control Loop execution\r
+        properties:\r
+            id:\r
+                type: String\r
+                description: The unique control loop id.\r
+                required: true\r
+            timeout:\r
+                type: Integer\r
+                description: |\r
+                    Overall timeout for executing all the operations. This timeout should equal or exceed the total\r
+                    timeout for each operation listed.\r
+                required: true\r
+                constraints:\r
+                - valid_values: [1, 2, 5]\r
+                - equal: 5\r
+                - greater_than: 7\r
+                - greater_or_equal: 1\r
+                - less_than: 7\r
+                - less_or_equal: 1\r
+            abatement:\r
+                type: Boolean\r
+                description: Whether an abatement event message will be expected for the control loop from DCAE.\r
+                required: true\r
+                default: false\r
+            trigger:\r
+                type: String\r
+                description: Initial operation to execute upon receiving an Onset event message for the Control Loop.\r
+                required: true\r
+            operations:\r
+                type: List\r
+                description: List of operations to be performed when Control Loop is triggered.\r
+                required: true\r
+                entry_schema:\r
+                    type: onap.datatype.controlloop.Operation\r
+    onap.policies.controlloop.operational.common.Drools:\r
+        derived_from: onap.policies.controlloop.operational.Common\r
+        type_version: 1.0.0\r
+        version: 1.0.0\r
+        description: Operational policies for Drools PDP\r
+        properties:\r
+            controllerName:\r
+                type: String\r
+                description: Drools controller properties\r
+                required: true\r
+data_types:\r
+    # TBD if this is needed\r
+    onap.datatype.controlloop.operation.Failure:\r
+        derived_from: onap.datatype.controlloop.Target\r
+        description: Captures information of an operational failure performed for control loop\r
+        properties:\r
+            messages:\r
+                type: String\r
+                description: error message\r
+                required: true\r
+            category:\r
+                type: String\r
+                description: |\r
+                    The category the error occurred in. Whether this is a general error from the actor, or the operation\r
+                    timed out, retries were exhausted in trying to execute the operation, a guard policy prevented the\r
+                    operation from occuring, or an exception in the system caused the failure.\r
+                constraints:\r
+                - valid_values: [error, timeout, retries, guard, exception]\r
+    onap.datatype.controlloop.Target:\r
+        derived_from: tosca.datatypes.Root\r
+        description: Definition for a entity in A&AI to perform a control loop operation on\r
+        properties:\r
+            targetType:\r
+                type: String\r
+                description: Category for the target type\r
+                required: true\r
+                constraints:\r
+                - valid_values: [VNF, VM, VFMODULE, PNF]\r
+            entityIds:\r
+                type: Map\r
+                description: |\r
+                    Map of values that identify the resource. If none are provided, it is assumed that the\r
+                    entity that generated the ONSET event will be the target.\r
+                required: false\r
+                entry_schema:\r
+                    type: String\r
+    onap.datatype.controlloop.Actor:\r
+        derived_from: tosca.datatypes.Root\r
+        description: An actor/operation/target definition\r
+        properties:\r
+            actor:\r
+                type: String\r
+                description: The actor performing the operation.\r
+                required: true\r
+                default: [1,"String",5.5,true]\r
+            operation:\r
+                type: String\r
+                description: The operation the actor is performing.\r
+                required: true\r
+            target:\r
+                type: String\r
+                description: The resource the operation should be performed on.\r
+                required: true\r
+                metadata:\r
+                    clamp_possible_values: <string:see clamp project for syntax>\r
+            payload:\r
+                type: Map\r
+                description: Name/value pairs of payload information passed by Policy to the actor\r
+                required: false\r
+                entry_schema:\r
+                    type: String\r
+    onap.datatype.controlloop.Operation:\r
+        derived_from: tosca.datatypes.Root\r
+        description: An operation supported by an actor\r
+        properties:\r
+            id:\r
+                type: String\r
+                description: Unique identifier for the operation\r
+                required: true\r
+            description:\r
+                type: Array\r
+                description: A user-friendly description of the intent for the operation\r
+                required: false\r
+                constraints:\r
+                - min_length: 5\r
+                - max_length: 7\r
+                - length: 1\r
+            operation:\r
+                type: onap.datatype.controlloop.Actor\r
+                description: The definition of the operation to be performed.\r
+                required: true\r
+                metadata:\r
+                    clamp_possible_values: <string:see clamp project for syntax>\r
+            timeout:\r
+                type: Integer\r
+                description: The amount of time for the actor to perform the operation.\r
+                required: true\r
+                constraints:\r
+                - valid_values: [3, 4, 5.5, 6, 10]\r
+            retries:\r
+                type: Integer\r
+                description: The number of retries the actor should attempt to perform the operation.\r
+                required: true\r
+                default: 0\r
+            success:\r
+                type: String\r
+                description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation.\r
+                required: false\r
+                default: final_success\r
+            failure:\r
+                type: String\r
+                description: Points to the operation to invoke on Actor operation failure.\r
+                required: false\r
+                default: final_failure\r
+            failure_timeout:\r
+                type: String\r
+                description: Points to the operation to invoke when the time out for the operation occurs.\r
+                required: false\r
+                default: final_failure_timeout\r
+            failure_retries:\r
+                type: String\r
+                description: Points to the operation to invoke when the current operation has exceeded its max retries.\r
+                required: false\r
+                default: final_failure_retries\r
+            failure_exception:\r
+                type: String\r
+                description: Points to the operation to invoke when the current operation causes an exception.\r
+                required: false\r
+                default: final_failure_exception\r
+            failure_guard:\r
+                type: String\r
+                description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.\r
+                required: false\r
+                default: final_failure_guard\r
diff --git a/src/test/resources/tosca/templates.properties b/src/test/resources/tosca/templates.properties
new file mode 100644 (file)
index 0000000..792238b
--- /dev/null
@@ -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