From f0a648cc89cb870a4053d47a06fe2a4a54cc3f1c Mon Sep 17 00:00:00 2001 From: WeberLaurent Date: Thu, 6 Feb 2020 10:23:01 +0100 Subject: [PATCH] Rework tosca converter New code to convert the Policy Tosca Yaml to Json Schema for the Clamp UI Issue-ID: CLAMP-253 Change-Id: I10c1d3d81c5feae402773de94bd88c190ec68645 Signed-off-by: WeberLaurent --- .../onap/clamp/clds/tosca/update/ArrayField.java | 72 ++++++ .../onap/clamp/clds/tosca/update/Component.java | 121 +++++++++ .../onap/clamp/clds/tosca/update/Constraint.java | 221 ++++++++++++++++ .../onap/clamp/clds/tosca/update/Extractor.java | 101 ++++++++ .../onap/clamp/clds/tosca/update/ParserToJson.java | 283 +++++++++++++++++++++ .../org/onap/clamp/clds/tosca/update/Property.java | 134 ++++++++++ .../org/onap/clamp/clds/tosca/update/Template.java | 104 ++++++++ .../clds/tosca/update/TemplateManagement.java | 180 +++++++++++++ .../tosca/update/UnknownComponentException.java | 34 +++ src/main/resources/application.properties | 3 + .../clds/tosca_update/templates.properties | 15 ++ .../clamp/clds/tosca/update/ArrayFieldTest.java | 50 ++++ .../clamp/clds/tosca/update/ComponentTest.java | 49 ++++ .../clamp/clds/tosca/update/ConstraintTest.java | 97 +++++++ .../onap/clamp/clds/tosca/update/PropertyTest.java | 69 +++++ .../clds/tosca/update/TemplateManagementTest.java | 116 +++++++++ .../onap/clamp/clds/tosca/update/TemplateTest.java | 44 ++++ src/test/resources/tosca/base.yaml | 171 +++++++++++++ .../resources/tosca/new-converter/constraints.yaml | 60 +++++ src/test/resources/tosca/new-converter/origin.json | 1 + src/test/resources/tosca/new-converter/rendu.json | 1 + .../new-converter/sampleOperationalPolicies.yaml | 160 ++++++++++++ .../sampleOperationalPoliciesEXTENTED.yaml | 174 +++++++++++++ src/test/resources/tosca/templates.properties | 7 + 24 files changed, 2267 insertions(+) create mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/ArrayField.java create mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/Component.java create mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/Constraint.java create mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/Extractor.java create mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/ParserToJson.java create mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/Property.java create mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/Template.java create mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/TemplateManagement.java create mode 100644 src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java create mode 100644 src/main/resources/clds/tosca_update/templates.properties create mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java create mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/ComponentTest.java create mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java create mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/PropertyTest.java create mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/TemplateManagementTest.java create mode 100644 src/test/java/org/onap/clamp/clds/tosca/update/TemplateTest.java create mode 100644 src/test/resources/tosca/base.yaml create mode 100644 src/test/resources/tosca/new-converter/constraints.yaml create mode 100644 src/test/resources/tosca/new-converter/origin.json create mode 100644 src/test/resources/tosca/new-converter/rendu.json create mode 100644 src/test/resources/tosca/new-converter/sampleOperationalPolicies.yaml create mode 100644 src/test/resources/tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml create mode 100644 src/test/resources/tosca/templates.properties diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/ArrayField.java b/src/main/java/org/onap/clamp/clds/tosca/update/ArrayField.java new file mode 100644 index 00000000..61e40a1e --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/tosca/update/ArrayField.java @@ -0,0 +1,72 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import com.google.gson.JsonArray; +import java.util.ArrayList; + +public class ArrayField { + + private ArrayList complexFields; + + /** + * Constructor from arraryList. + * + * @param arrayProperties the array properties + */ + public ArrayField(ArrayList arrayProperties) { + this.complexFields = arrayProperties; + } + + /** + * Each LinkedHashMap is parsed to extract the Array and each of its value. They are casted for the JsonObject. + * + * @return JsonArray + */ + public JsonArray deploy() { + + JsonArray subPropertyValuesArray = new JsonArray(); + for (Object arrayElement : complexFields) { + //Cast for each Primitive Type + String typeValue = arrayElement.getClass().getSimpleName(); + switch (typeValue) { + case "String": + subPropertyValuesArray.add((String) arrayElement); + break; + case "Boolean": + subPropertyValuesArray.add((Boolean) arrayElement); + break; + case "Double": + subPropertyValuesArray.add((Number) arrayElement); + break; + case "Integer": + subPropertyValuesArray.add((Number) arrayElement); + break; + default: + break; + } + } + return subPropertyValuesArray; + } +} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/Component.java b/src/main/java/org/onap/clamp/clds/tosca/update/Component.java new file mode 100644 index 00000000..6db129d1 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/tosca/update/Component.java @@ -0,0 +1,121 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import java.util.ArrayList; +import java.util.LinkedHashMap; + +public class Component { + + /** + * name parameter is used as "key", in the LinkedHashMap of Components. + */ + private String name; + private String derivedFrom; + private String version; + private String typeVersion; + private String description; + private LinkedHashMap 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 getProperties() { + return properties; + } + + public void setProperties(LinkedHashMap properties) { + this.properties = properties; + } + + public void addProperties(Property property) { + this.properties.put(property.getName(), property); + } + + public ArrayList propertiesNames() { + return new ArrayList<>(properties.keySet()); + } + + @Override + public String toString() { + return name + ": " + description + ", version: " + version + ", nb de properties: " + properties.size() + + System.getProperty("line.separator") + propertiesNames(); + } +} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/Constraint.java b/src/main/java/org/onap/clamp/clds/tosca/update/Constraint.java new file mode 100644 index 00000000..4f6b27a6 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/tosca/update/Constraint.java @@ -0,0 +1,221 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map.Entry; + +public class Constraint { + + private LinkedHashMap constraints; + private Template template; + + public Constraint(LinkedHashMap constraints, Template template) { + this.template = template; + this.constraints = constraints; + } + + /** + * Deploy the linkedhashmap which contains the constraints, to extract them one to one. + * + * @param jsonSchema The json Schema + * @param typeProperty The ype property + * @return the json object + */ + public JsonObject deployConstraints(JsonObject jsonSchema, String typeProperty) { + for (Entry constraint : constraints.entrySet()) { + this.parseConstraint(jsonSchema, constraint.getKey(), constraint.getValue(), typeProperty); + } + return jsonSchema; + } + + /** + * Each case of Tosca constraints below parse specifically the field in the JsonObject. + * + * @param jsonSchema Json Schema + * @param nameConstraint Name constraint + * @param valueConstraint value constraint + * @param typeProperty Type Property + */ + @SuppressWarnings("unchecked") + public void parseConstraint(JsonObject jsonSchema, String nameConstraint, Object valueConstraint, + String typeProperty) { + switch (nameConstraint) { + case "equal": + checkTemplateField("const", jsonSchema, valueConstraint); + break; + case "greater_than": + checkTemplateField("exclusiveMinimum", jsonSchema, valueConstraint); + break; + case "greater_or_equal": + checkTemplateField("minimum", jsonSchema, valueConstraint); + break; + case "less_than": + checkTemplateField("exclusiveMaximum", jsonSchema, valueConstraint); + break; + case "less_or_equal": + checkTemplateField("maximum", jsonSchema, valueConstraint); + break; + case "in_range": + ArrayList limitValues = (ArrayList) valueConstraint; + checkTemplateField("minimum", jsonSchema, limitValues.get(0)); + checkTemplateField("maximum", jsonSchema, limitValues.get(1)); + break; + case "pattern": + jsonSchema.addProperty(nameConstraint, (String) valueConstraint); + break; + case "length": + this.getSpecificLength(jsonSchema, valueConstraint, typeProperty); + break; + case "min_length": + String[] prefixValues = nameConstraint.split("_"); + this.getLimitValue(jsonSchema, valueConstraint, typeProperty, prefixValues[0]); + break; + case "max_length": + String[] maxtab = nameConstraint.split("_"); + this.getLimitValue(jsonSchema, valueConstraint, typeProperty, maxtab[0]); + break; + default://valid_value + this.getValueArray(jsonSchema, valueConstraint, typeProperty); + break; + } + + } + + /** + * To be done. + * + * @param jsonSchema json schema + * @param fieldValue field value + * @param typeProperty For the complex components, get a specific number of items/properties + */ + public void getSpecificLength(JsonObject jsonSchema, Object fieldValue, String typeProperty) { + switch (typeProperty.toLowerCase()) { + case "string": + checkTemplateField("minLength", jsonSchema, fieldValue); + checkTemplateField("maxLength", jsonSchema, fieldValue); + break; + case "array": + if (fieldValue.equals(1) && template.hasFields("uniqueItems")) { + jsonSchema.addProperty("uniqueItems", true); + } else { + checkTemplateField("minItems", jsonSchema, fieldValue); + checkTemplateField("maxItems", jsonSchema, fieldValue); + } + break; + default:// Map && List + checkTemplateField("minProperties", jsonSchema, fieldValue); + checkTemplateField("maxProperties", jsonSchema, fieldValue); + break; + } + + } + + /** + * To be done. + * + * @param jsonSchema json schema + * @param fieldValue field value + * @param typeProperty type property + * @param side Get the limits fieldValue for the properties : depend of the type of the component + */ + public void getLimitValue(JsonObject jsonSchema, Object fieldValue, String typeProperty, String side) { + switch (typeProperty) { + case "string": + if (side.equals("min")) { + checkTemplateField("minLength", jsonSchema, fieldValue); + } else { + checkTemplateField("maxLength", jsonSchema, fieldValue); + } + break; + default:// Array + if (side.equals("min")) { + checkTemplateField("minItems", jsonSchema, fieldValue); + } else { + checkTemplateField("maxItems", jsonSchema, fieldValue); + } + break; + } + + } + + /** + * To be done. + * + * @param jsonSchema Json schema + * @param fieldValue field value + * @param typeProperty Get as Enum the valid values for the property + */ + public void getValueArray(JsonObject jsonSchema, Object fieldValue, String typeProperty) { + if (template.hasFields("enum")) { + JsonArray enumeration = new JsonArray(); + if (typeProperty.equals("string") || typeProperty.equals("String")) { + ArrayList arrayValues = (ArrayList) fieldValue; + for (String arrayItem : arrayValues) { + enumeration.add(arrayItem); + } + jsonSchema.add("enum", enumeration); + } else { + ArrayList arrayValues = (ArrayList) fieldValue; + for (Number arrayItem : arrayValues) { + enumeration.add(arrayItem); + } + jsonSchema.add("enum", enumeration); + } + } + } + + /** + * To be done. + * + * @param field Field + * @param jsonSchema Json schema + * @param fieldValue Simple way to avoid code duplication + */ + public void checkTemplateField(String field, JsonObject jsonSchema, Object fieldValue) { + if (template.hasFields(field)) { + String typeField = fieldValue.getClass().getSimpleName(); + switch (typeField) { + case "String": + jsonSchema.addProperty(field, (String) fieldValue); + break; + case "Integer": + jsonSchema.addProperty(field, (Integer) fieldValue); + break; + case "Number": + jsonSchema.addProperty(field, (Number) fieldValue); + break; + case "Boolean": + jsonSchema.addProperty(field, (Boolean) fieldValue); + break; + default: + break; + } + } + } + +} \ No newline at end of file diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/Extractor.java b/src/main/java/org/onap/clamp/clds/tosca/update/Extractor.java new file mode 100644 index 00000000..032edbaa --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/tosca/update/Extractor.java @@ -0,0 +1,101 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import java.util.LinkedHashMap; +import java.util.Map.Entry; +import org.yaml.snakeyaml.Yaml; + +public class Extractor { + + private LinkedHashMap allItems = new LinkedHashMap<>(); + private String source; + + @SuppressWarnings("unchecked") + public Extractor(String toParse) { + this.source = toParse; + getAllAsMaps(); + } + + public LinkedHashMap 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 getAllAsMaps() { + Yaml yaml = new Yaml(); + Object contentFile = yaml.load(source); + LinkedHashMap> file = + (LinkedHashMap>) contentFile; + // Get DataTypes + LinkedHashMap dataTypes = file.get("data_types"); + // Get Policies : first, get topology and after extract policies from it + LinkedHashMap 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 allMaps) { + //Component creations, from the file maps + for (Entry itemToParse : allMaps.entrySet()) { + LinkedHashMap componentBody = (LinkedHashMap) 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 properties = + (LinkedHashMap) componentBody.get("properties"); + for (Entry itemToProperty : properties.entrySet()) { + Property property = new Property(itemToProperty.getKey(), + (LinkedHashMap) itemToProperty.getValue()); + component.addProperties(property); + } + } + this.allItems.put(component.getName(), component); + } + } +} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/ParserToJson.java b/src/main/java/org/onap/clamp/clds/tosca/update/ParserToJson.java new file mode 100644 index 00000000..6da55eae --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/tosca/update/ParserToJson.java @@ -0,0 +1,283 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Map.Entry; + +public class ParserToJson { + private LinkedHashMap components; + private LinkedHashMap templates; + + public ParserToJson(LinkedHashMap components, LinkedHashMap 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 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 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) 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 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 entrySchemaFields = + (LinkedHashMap) 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 constraints = (ArrayList) property.getItems().get("constraints"); + for (Object constraint : constraints) { + if (constraint instanceof LinkedHashMap) { + if (((LinkedHashMap) constraint).containsKey(nameConstraint)) { + presentConstraint = true; + } + } + } + } + return presentConstraint; + } +} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/Property.java b/src/main/java/org/onap/clamp/clds/tosca/update/Property.java new file mode 100644 index 00000000..0b6e3816 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/tosca/update/Property.java @@ -0,0 +1,134 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.util.ArrayList; +import java.util.LinkedHashMap; + +public class Property { + + /** + * name parameter is used as "key", in the LinkedHashMap of Components. + */ + private String name; + private LinkedHashMap items; + + /** + * Constructor. + * + * @param name the name + * @param items the items + */ + public Property(String name, LinkedHashMap items) { + super(); + this.name = name; + this.items = items; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public LinkedHashMap getItems() { + return items; + } + + public void setItems(LinkedHashMap 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 arrayProperties) { + JsonArray arrayContent = new JsonArray(); + ArrayList 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 constraints, Template template) { + for (Object constraint : constraints) { + if (constraint instanceof LinkedHashMap) { + LinkedHashMap valueConstraint = (LinkedHashMap) constraint; + Constraint constraintParser = new Constraint(valueConstraint, template); + constraintParser.deployConstraints(json, (String) getItems().get("type")); + } + } + + } + +} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/Template.java b/src/main/java/org/onap/clamp/clds/tosca/update/Template.java new file mode 100644 index 00000000..34459067 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/tosca/update/Template.java @@ -0,0 +1,104 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import java.util.ArrayList; + +public class Template { + + /** + * name parameter is used as "key", in the LinkedHashMap of Templates. + */ + private String name; + private ArrayList fields; + + public Template(String name) { + this.name = name; + this.fields = new ArrayList(); + } + + public Template(String name, ArrayList fields) { + this.name = name; + this.fields = fields; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ArrayList getFields() { + return fields; + } + + public void setFields(ArrayList fields) { + this.fields = fields; + } + + public boolean hasFields(String name) { + return fields.contains(name); + } + + public void addField(String field) { + fields.add(field); + } + + public void removeField(String field) { + fields.remove(field); + } + + /** + * Compare two templates : size and their contents. + * + * @param template the template + * @return a boolean + */ + public boolean checkFields(Template template) { + + boolean duplicateFields = false; + if (template.getFields().size() == this.getFields().size()) { + int countMatchingFields = 0; + //loop each component of first + for (String templateField : template.getFields()) { + //if component.key is present in the second + if (this.getFields().contains(templateField)) { + countMatchingFields++; + } + } + + if (template.getFields().size() == countMatchingFields) { + duplicateFields = true; + } + } + return duplicateFields; + } + + @Override + public String toString() { + return " fields : " + fields; + } +} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/TemplateManagement.java b/src/main/java/org/onap/clamp/clds/tosca/update/TemplateManagement.java new file mode 100644 index 00000000..4b510cb7 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/tosca/update/TemplateManagement.java @@ -0,0 +1,180 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import com.google.gson.JsonObject; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Properties; + +public class TemplateManagement { + + private LinkedHashMap templates; + private LinkedHashMap 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 getComponents() { + return components; + } + + public void setComponents(LinkedHashMap components) { + this.components = components; + } + + public ParserToJson getParseToJson() { + return parserToJson; + } + + public void setParseToJson(ParserToJson parserToJson) { + this.parserToJson = parserToJson; + } + + public LinkedHashMap getTemplates() { + return templates; + } + + public void setTemplates(LinkedHashMap templates) { + this.templates = templates; + } + + public Extractor getExtractor() { + return extractor; + } + + /** + * Add a template. + * + * @param name name + * @param fields fields + */ + public void addTemplate(String name, ArrayList 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 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 initializeTemplates(String templateProperties) throws IOException { + LinkedHashMap generatedTemplates = new LinkedHashMap<>(); + Properties templates = new Properties(); + templates.load(new StringReader(templateProperties)); + + for (Object key : templates.keySet()) { + String fields = (String) templates.get(key); + String[] fieldsInArray = fields.split(","); + Template template = new Template((String) key, new ArrayList<>(Arrays.asList(fieldsInArray))); + generatedTemplates.put(template.getName(), template); + } + return generatedTemplates; + } +} diff --git a/src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java b/src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java new file mode 100644 index 00000000..e30f9158 --- /dev/null +++ b/src/main/java/org/onap/clamp/clds/tosca/update/UnknownComponentException.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +public class UnknownComponentException extends Exception { + public UnknownComponentException(String nameEntry) { + this.getWrongName(nameEntry); + } + + public String getWrongName(String nameEntry) { + return "Unknown Component: " + nameEntry; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4422156f..695319d5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -220,3 +220,6 @@ clamp.config.cadi.oauthIntrospectUrll=https://AAF_LOCATE_URL/locate/onap.org.osa clamp.config.cadi.aafEnv=DEV clamp.config.cadi.aafUrl=https://AAF_LOCATE_URL/onap.org.osaaf.aaf.service:2.1 clamp.config.cadi.cadiX509Issuers=CN=intermediateCA_1, OU=OSAAF, O=ONAP, C=US:CN=intermediateCA_7, OU=OSAAF, O=ONAP, C=US:CN=intermediateCA_9, OU=OSAAF, O=ONAP, C=US + +## Tosca converter +clamp.config.tosca.converter.templates=classpath:/clds/tosca_updates/templates.properties diff --git a/src/main/resources/clds/tosca_update/templates.properties b/src/main/resources/clds/tosca_update/templates.properties new file mode 100644 index 00000000..5da239b1 --- /dev/null +++ b/src/main/resources/clds/tosca_update/templates.properties @@ -0,0 +1,15 @@ +#Numeric types +integer=type,description,title,deprecated,default,enum,const,multipleOf,maximum,exclusiveMaximum,minimum,exclusiveMinimum +number=type,description,title,deprecated,default,enum,const,multipleOf,maximum,exclusiveMaximum,minimum,exclusiveMinimum +range=type,description,title,deprecated,default,enum,const,multipleOf,maximum,exclusiveMaximum,minimum,exclusiveMinimum +# +boolean=type,description,title,deprecated,default,enum,const,readOnly,writeOnly +#String types +string=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format +timestamp=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format +scalar-unit.time=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format +scalar-unit.frequency=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format +scalar-unit.size=type,description,title,deprecated,default,enum,const,minLength,maxLength,pattern,format +#Complex types +array=type,description,title,deprecated,default,enum,const,minItems,maxItems,uniqueItems,minContains,maxContains +object=type,description,title,deprecated,default,enum,const,properties,minProperties,maxProperties,required,dependentRequired,dependencies,readOnly,writeOnly diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java new file mode 100644 index 00000000..abf65c36 --- /dev/null +++ b/src/test/java/org/onap/clamp/clds/tosca/update/ArrayFieldTest.java @@ -0,0 +1,50 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import com.google.gson.JsonArray; +import java.io.IOException; +import java.util.ArrayList; +import junit.framework.TestCase; +import org.onap.clamp.clds.util.ResourceFileUtil; + +public class ArrayFieldTest extends TestCase { + + /** + * Test the deploy method. + * + * @throws IOException in case of failure + */ + public void testDeploy() throws IOException { + TemplateManagement templateManagement = new TemplateManagement(ResourceFileUtil.getResourceAsString( + "tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml"), + ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties")); + Component component = templateManagement.getComponents().get("onap.datatype.controlloop.Actor"); + Property property = component.getProperties().get("actor"); + ArrayField arrayParser = new ArrayField((ArrayList) property.getItems().get("default")); + JsonArray toTest = arrayParser.deploy(); + String reference = "[1,\"String\",5.5,true]"; + assertEquals(reference, String.valueOf(toTest)); + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/ComponentTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/ComponentTest.java new file mode 100644 index 00000000..0494ee11 --- /dev/null +++ b/src/test/java/org/onap/clamp/clds/tosca/update/ComponentTest.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import junit.framework.TestCase; +import org.onap.clamp.clds.util.ResourceFileUtil; + +public class ComponentTest extends TestCase { + + /** + * Test propertiesName. + * + * @throws IOException In case of failure + */ + public void testPropertiesNames() throws IOException { + ArrayList reference = new ArrayList<>(Arrays.asList("actor", "operation", "target", "payload")); + TemplateManagement templateManagement = + new TemplateManagement( + ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), + ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties")); + Component component = templateManagement.getComponents().get("onap.datatype.controlloop.Actor"); + assertEquals(reference, component.propertiesNames()); + } + +} diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java new file mode 100644 index 00000000..a71ea8ac --- /dev/null +++ b/src/test/java/org/onap/clamp/clds/tosca/update/ConstraintTest.java @@ -0,0 +1,97 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.ArrayList; +import junit.framework.TestCase; +import org.onap.clamp.clds.util.ResourceFileUtil; + +public class ConstraintTest extends TestCase { + + TemplateManagement templateManagement = new TemplateManagement( + ResourceFileUtil.getResourceAsString("tosca/new-converter/constraints.yaml"), + ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties")); + + Component component = templateManagement.getComponents().get("onap.datatype.controlloop.Operation"); + + public ConstraintTest() throws IOException { + } + + /** + * Test get value array. + */ + public void testGetValuesArray() { + Property property = component.getProperties().get("timeout"); + Template template = templateManagement.getTemplates().get("integer"); + JsonObject resultProcess = new JsonObject(); + property.addConstraintsAsJson(resultProcess, (ArrayList) 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) 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) 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) property.getItems().get("constraints"), + template); + + int toTest = resultProcess.get("minItems").getAsInt(); + assertEquals(5, toTest); + toTest = resultProcess.get("maxItems").getAsInt(); + assertEquals(7, toTest); + } + +} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/PropertyTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/PropertyTest.java new file mode 100644 index 00000000..cf183af8 --- /dev/null +++ b/src/test/java/org/onap/clamp/clds/tosca/update/PropertyTest.java @@ -0,0 +1,69 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import java.io.IOException; +import java.util.ArrayList; +import junit.framework.TestCase; +import org.onap.clamp.clds.util.ResourceFileUtil; + +public class PropertyTest extends TestCase { + public PropertyTest() throws IOException { + } + + /** + * Test Parse array. + * + * @throws IOException In case of failure + */ + public void testParseArray() throws IOException { + TemplateManagement templateManagement = new TemplateManagement( + ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml"), + ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties")); + Component component = templateManagement.getComponents().get("onap.datatype.controlloop.Actor"); + Property property = component.getProperties().get("actor"); + JsonArray toTest = property.parseArray((ArrayList) 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) property.getItems().get("constraints"), template); + String test = "{\"enum\":[\"error\",\"timeout\",\"retries\",\"guard\",\"exception\"]}"; + assertEquals(test, String.valueOf(toTest)); + } +} \ No newline at end of file diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/TemplateManagementTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/TemplateManagementTest.java new file mode 100644 index 00000000..8e411069 --- /dev/null +++ b/src/test/java/org/onap/clamp/clds/tosca/update/TemplateManagementTest.java @@ -0,0 +1,116 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import junit.framework.TestCase; +import org.onap.clamp.clds.util.ResourceFileUtil; + +public class TemplateManagementTest extends TestCase { + + /** + * Test the launch translation. + * + * @throws IOException In case of failure + * @throws UnknownComponentException In case of failure + */ + public void testLaunchTranslation() throws IOException, UnknownComponentException { + TemplateManagement templateManagement = + new TemplateManagement( + ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), + ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties")); + assertNull(templateManagement.getParseToJson()); + String componentName = "onap.policies.controlloop.operational.common.Drools"; + templateManagement.launchTranslation(componentName); + assertNotNull(templateManagement.getParseToJson()); + } + + /** + * Test addTemplate. + * + * @throws IOException In case of failure + */ + public void testAddTemplate() throws IOException { + TemplateManagement templateManagement = + new TemplateManagement( + ResourceFileUtil.getResourceAsString("tosca/new-converter/sampleOperationalPolicies.yaml"), + ResourceFileUtil.getResourceAsString("clds/tosca_update/templates.properties")); + int count = templateManagement.getTemplates().size(); + ArrayList 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 templateFieldsString = + new ArrayList<>(Arrays.asList("type", "description", "required", "metadata", "constraints")); + Template templateTest = new Template("String", templateFieldsString); + has = templateManagement.hasTemplate(templateTest); + assertEquals(false, has); + } + +} diff --git a/src/test/java/org/onap/clamp/clds/tosca/update/TemplateTest.java b/src/test/java/org/onap/clamp/clds/tosca/update/TemplateTest.java new file mode 100644 index 00000000..ebc119f0 --- /dev/null +++ b/src/test/java/org/onap/clamp/clds/tosca/update/TemplateTest.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CLAMP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.clamp.clds.tosca.update; + +import java.util.ArrayList; +import java.util.Arrays; +import junit.framework.TestCase; + +public class TemplateTest extends TestCase { + + /** + * Test check failed. + */ + public void testCheckFields() { + Template toTest = new Template("toTest"); + ArrayList fields = new ArrayList<>(Arrays.asList("type", "description", "enum")); + toTest.setFields(fields); + Template reference = new Template("toTest"); + reference.setFields(fields); + assertTrue(toTest.checkFields(reference)); + } + +} \ No newline at end of file diff --git a/src/test/resources/tosca/base.yaml b/src/test/resources/tosca/base.yaml new file mode 100644 index 00000000..3d31cd20 --- /dev/null +++ b/src/test/resources/tosca/base.yaml @@ -0,0 +1,171 @@ +tosca_definitions_version: tosca_simple_yaml_1_0_0 +topology_template: + policy_types: + onap.policies.controlloop.operational.Common: + derived_from: tosca.policies.Root + version: 1.0.0 + description: Operational Policy for Control Loop execution + properties: + id: + type: String + description: The unique control loop id. + required: true + timeout: + type: Integer + description: | + Overall timeout for executing all the operations. This timeout should equal or exceed the total + timeout for each operation listed. + required: true + abatement: + type: Boolean + description: Whether an abatement event message will be expected for the control loop from DCAE. + required: true + default: false + trigger: + type: String + description: Initial operation to execute upon receiving an Onset event message for the Control Loop. + required: true + operations: + type: List + description: List of operations to be performed when Control Loop is triggered. + required: true + entry_schema: + type: onap.datatype.controlloop.operation.Failure + + onap.policies.controlloop.operational.common.Apex: + derived_from: onap.policies.controlloop.operational.Common + type_version: 1.0.0 + version: 1.0.0 + description: Operational policies for Apex PDP + properties: + + onap.policies.controlloop.operational.common.Drools: + derived_from: onap.policies.controlloop.operational.Common + type_version: 1.0.0 + version: 1.0.0 + description: Operational policies for Drools PDP + properties: + controllerName: + type: String + description: Drools controller properties + required: false + +data_types: + # TBD if this is needed + onap.datatype.controlloop.operation.Failure: + derived_from: tosca.datatypes.Root + description: Captures information of an operational failure performed for control loop + properties: + messages: + type: String + description: error message + required: true + category: + type: String + description: | + The category the error occurred in. Whether this is a general error from the actor, or the operation + timed out, retries were exhausted in trying to execute the operation, a guard policy prevented the + operation from occuring, or an exception in the system caused the failure. + constraints: + - valid_values: [error, timeout, retries, guard, exception] + - values: [4.5, false] + + onap.datatype.controlloop.Target: + derived_from: tosca.datatypes.Root + description: Definition for a entity in A&AI to perform a control loop operation on + properties: + targetType: + type: String + description: Category for the target type + required: true + constraints: + - valid_values: [VNF, VM, VFMODULE, PNF] + entityIds: + type: Map + description: | + Map of values that identify the resource. If none are provided, it is assumed that the + entity that generated the ONSET event will be the target. + required: false + + onap.datatype.controlloop.Actor: + derived_from: tosca.datatypes.Root + description: An actor/operation/target definition + properties: + actor: + type: String + description: The actor performing the operation. + required: true + operation: + type: String + description: The operation the actor is performing. + required: true + target: + type: String + description: The resource the operation should be performed on. + required: true + metadata: + clamp_possible_values: + 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: + timeout: + type: Integer + description: The amount of time for the actor to perform the operation. + required: true + retries: + type: Integer + description: The number of retries the actor should attempt to perform the operation. + required: true + default: 0 + success: + type: String + description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation. + required: false + default: final_success + failure: + type: String + description: Points to the operation to invoke on Actor operation failure. + required: false + default: final_failure + failure_timeout: + type: String + description: Points to the operation to invoke when the time out for the operation occurs. + required: false + default: final_failure_timeout + failure_retries: + type: String + description: Points to the operation to invoke when the current operation has exceeded its max retries. + required: false + default: final_failure_retries + failure_exception: + type: String + description: Points to the operation to invoke when the current operation causes an exception. + required: false + default: final_failure_exception + failure_guard: + type: String + description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement. + required: false + default: final_failure_guard diff --git a/src/test/resources/tosca/new-converter/constraints.yaml b/src/test/resources/tosca/new-converter/constraints.yaml new file mode 100644 index 00000000..7a94ca96 --- /dev/null +++ b/src/test/resources/tosca/new-converter/constraints.yaml @@ -0,0 +1,60 @@ +tosca_definitions_version: tosca_simple_yaml_1_0_0 +policy_types: + onap.policies.controlloop.operational.common.Drools: + derived_from: onap.policies.controlloop.operational.Common + type_version: 1.0.0 + version: 1.0.0 + description: Operational policies for Drools PDP + properties: + controllerName: + type: String + description: Drools controller properties + required: true +data_types: + onap.datatype.controlloop.Operation: + derived_from: tosca.datatypes.Root + description: An operation supported by an actor + properties: + id: + type: String + description: Unique identifier for the operation + required: true + constraints: + - length: 8 + description: + type: Array + description: A user-friendly description of the intent for the operation + required: false + constraints: + - min_length: 5 + - max_length: 7 + test: + type: Integer + description: | + Overall timeout for executing all the operations. This timeout should equal or exceed the total + timeout for each operation listed. + required: true + constraints: + - greater_than: 7 + - greater_or_equal: 1 + - less_than: 7 + - less_or_equal: 1 + timeout: + type: Integer + description: The amount of time for the actor to perform the operation. + required: true + constraints: + - valid_values: [3,4,5.5,6,10] + retries: + type: Integer + description: The number of retries the actor should attempt to perform the operation. + required: true + default: 0 + constraints: + - equal: 5 + success: + type: String + description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation. + required: false + constraints: + - valid_values: [VALID,TERMINATED] diff --git a/src/test/resources/tosca/new-converter/origin.json b/src/test/resources/tosca/new-converter/origin.json new file mode 100644 index 00000000..da0529d0 --- /dev/null +++ b/src/test/resources/tosca/new-converter/origin.json @@ -0,0 +1 @@ +{"onap.policies.controlloop.operational.common.Drools":{"derived_from":{"onap.policies.controlloop.operational.Common":{"derived_from":"tosca.policies.Root","required":["id","timeout","abatement","trigger","operations"],"properties":{"id":{"type":"String","description":"The unique control loop id.","required":true},"timeout":{"type":"Integer","description":"Overall timeout for executing all the operations. This timeout should equal or exceed the total\ntimeout for each operation listed.\n","required":true},"abatement":{"description":"Whether an abatement event message will be expected for the control loop from DCAE.","required":true},"trigger":{"type":"String","description":"Initial operation to execute upon receiving an Onset event message for the Control Loop.","required":true},"operations":{"type":"List","description":"List of operations to be performed when Control Loop is triggered.","required":true,"entry_schema":{"type":{"onap.datatype.controlloop.Operation":{"derived_from":"tosca.datatypes.Root","required":["id","operation","timeout","retries"],"properties":{"id":{"type":"String","description":"Unique identifier for the operation","required":true},"description":{"type":"String","description":"A user-friendly description of the intent for the operation","required":false},"operation":{"type":{"onap.datatype.controlloop.Actor":{"derived_from":"tosca.datatypes.Root","required":["actor","operation","target"],"properties":{"actor":{"type":"String","description":"The actor performing the operation.","required":true},"operation":{"type":"String","description":"The operation the actor is performing.","required":true},"target":{"type":"String","description":"The resource the operation should be performed on.","required":true,"metadata":{"clamp_possible_values":"some special treatment"}},"payload":{"type":"Map","description":"Name/value pairs of payload information passed by Policy to the actor","required":false,"entry_schema":{"type":"String"}}}}},"description":"The definition of the operation to be performed.","required":true},"timeout":{"type":"Integer","description":"The amount of time for the actor to perform the operation.","required":true},"retries":{"type":"Integer","description":"The number of retries the actor should attempt to perform the operation.","required":true},"success":{"type":"String","description":"Points to the operation to invoke on success. A value of \"final_success\" indicates and end to the operation.","required":false},"failure":{"type":"String","description":"Points to the operation to invoke on Actor operation failure.","required":false},"failure_timeout":{"type":"String","description":"Points to the operation to invoke when the time out for the operation occurs.","required":false},"failure_retries":{"type":"String","description":"Points to the operation to invoke when the current operation has exceeded its max retries.","required":false},"failure_exception":{"type":"String","description":"Points to the operation to invoke when the current operation causes an exception.","required":false},"failure_guard":{"type":"String","description":"Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.","required":false}}}}}}}}},"required":[],"properties":{"controllerName":{"type":"String","description":"Drools controller properties","required":false}}}} \ No newline at end of file diff --git a/src/test/resources/tosca/new-converter/rendu.json b/src/test/resources/tosca/new-converter/rendu.json new file mode 100644 index 00000000..da0529d0 --- /dev/null +++ b/src/test/resources/tosca/new-converter/rendu.json @@ -0,0 +1 @@ +{"onap.policies.controlloop.operational.common.Drools":{"derived_from":{"onap.policies.controlloop.operational.Common":{"derived_from":"tosca.policies.Root","required":["id","timeout","abatement","trigger","operations"],"properties":{"id":{"type":"String","description":"The unique control loop id.","required":true},"timeout":{"type":"Integer","description":"Overall timeout for executing all the operations. This timeout should equal or exceed the total\ntimeout for each operation listed.\n","required":true},"abatement":{"description":"Whether an abatement event message will be expected for the control loop from DCAE.","required":true},"trigger":{"type":"String","description":"Initial operation to execute upon receiving an Onset event message for the Control Loop.","required":true},"operations":{"type":"List","description":"List of operations to be performed when Control Loop is triggered.","required":true,"entry_schema":{"type":{"onap.datatype.controlloop.Operation":{"derived_from":"tosca.datatypes.Root","required":["id","operation","timeout","retries"],"properties":{"id":{"type":"String","description":"Unique identifier for the operation","required":true},"description":{"type":"String","description":"A user-friendly description of the intent for the operation","required":false},"operation":{"type":{"onap.datatype.controlloop.Actor":{"derived_from":"tosca.datatypes.Root","required":["actor","operation","target"],"properties":{"actor":{"type":"String","description":"The actor performing the operation.","required":true},"operation":{"type":"String","description":"The operation the actor is performing.","required":true},"target":{"type":"String","description":"The resource the operation should be performed on.","required":true,"metadata":{"clamp_possible_values":"some special treatment"}},"payload":{"type":"Map","description":"Name/value pairs of payload information passed by Policy to the actor","required":false,"entry_schema":{"type":"String"}}}}},"description":"The definition of the operation to be performed.","required":true},"timeout":{"type":"Integer","description":"The amount of time for the actor to perform the operation.","required":true},"retries":{"type":"Integer","description":"The number of retries the actor should attempt to perform the operation.","required":true},"success":{"type":"String","description":"Points to the operation to invoke on success. A value of \"final_success\" indicates and end to the operation.","required":false},"failure":{"type":"String","description":"Points to the operation to invoke on Actor operation failure.","required":false},"failure_timeout":{"type":"String","description":"Points to the operation to invoke when the time out for the operation occurs.","required":false},"failure_retries":{"type":"String","description":"Points to the operation to invoke when the current operation has exceeded its max retries.","required":false},"failure_exception":{"type":"String","description":"Points to the operation to invoke when the current operation causes an exception.","required":false},"failure_guard":{"type":"String","description":"Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.","required":false}}}}}}}}},"required":[],"properties":{"controllerName":{"type":"String","description":"Drools controller properties","required":false}}}} \ No newline at end of file diff --git a/src/test/resources/tosca/new-converter/sampleOperationalPolicies.yaml b/src/test/resources/tosca/new-converter/sampleOperationalPolicies.yaml new file mode 100644 index 00000000..c2afeccd --- /dev/null +++ b/src/test/resources/tosca/new-converter/sampleOperationalPolicies.yaml @@ -0,0 +1,160 @@ + +tosca_definitions_version: tosca_simple_yaml_1_0_0 +policy_types: + onap.policies.controlloop.operational.Common: + derived_from: tosca.policies.Root + version: 1.0.0 + description: Operational Policy for Control Loop execution + properties: + id: + type: String + description: The unique control loop id. + required: true + timeout: + type: Integer + description: | + Overall timeout for executing all the operations. This timeout should equal or exceed the total + timeout for each operation listed. + required: true + abatement: + type: Boolean + description: Whether an abatement event message will be expected for the control loop from DCAE. + required: true + default: false + trigger: + type: String + description: Initial operation to execute upon receiving an Onset event message for the Control Loop. + required: true + operations: + type: List + description: List of operations to be performed when Control Loop is triggered. + required: true + entry_schema: + type: onap.datatype.controlloop.Operation + onap.policies.controlloop.operational.common.Drools: + derived_from: onap.policies.controlloop.operational.Common + type_version: 1.0.0 + version: 1.0.0 + description: Operational policies for Drools PDP + properties: + controllerName: + type: String + description: Drools controller properties + required: false +data_types: + # TBD if this is needed + onap.datatype.controlloop.operation.Failure: + derived_from: tosca.datatypes.Root + description: Captures information of an operational failure performed for control loop + properties: + messages: + type: String + description: error message + required: true + category: + type: String + description: | + The category the error occurred in. Whether this is a general error from the actor, or the operation + timed out, retries were exhausted in trying to execute the operation, a guard policy prevented the + operation from occuring, or an exception in the system caused the failure. + constraints: + - valid_values: [error, timeout, retries, guard, exception] + onap.datatype.controlloop.Target: + derived_from: tosca.datatypes.Root + description: Definition for a entity in A&AI to perform a control loop operation on + properties: + targetType: + type: String + description: Category for the target type + required: true + constraints: + - valid_values: [VNF, VM, VFMODULE, PNF] + entityIds: + type: Map + description: | + Map of values that identify the resource. If none are provided, it is assumed that the + entity that generated the ONSET event will be the target. + required: false + entry_schema: + type: String + onap.datatype.controlloop.Actor: + derived_from: tosca.datatypes.Root + description: An actor/operation/target definition + properties: + actor: + type: String + description: The actor performing the operation. + required: true + operation: + type: String + description: The operation the actor is performing. + required: true + target: + type: String + description: The resource the operation should be performed on. + required: true + metadata: + clamp_possible_values: + 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: + timeout: + type: Integer + description: The amount of time for the actor to perform the operation. + required: true + retries: + type: Integer + description: The number of retries the actor should attempt to perform the operation. + required: true + default: 0 + success: + type: String + description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation. + required: false + default: final_success + failure: + type: String + description: Points to the operation to invoke on Actor operation failure. + required: false + default: final_failure + failure_timeout: + type: String + description: Points to the operation to invoke when the time out for the operation occurs. + required: false + default: final_failure_timeout + failure_retries: + type: String + description: Points to the operation to invoke when the current operation has exceeded its max retries. + required: false + default: final_failure_retries + failure_exception: + type: String + description: Points to the operation to invoke when the current operation causes an exception. + required: false + default: final_failure_exception + failure_guard: + type: String + description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement. + required: false + default: final_failure_guard diff --git a/src/test/resources/tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml b/src/test/resources/tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml new file mode 100644 index 00000000..9d45c645 --- /dev/null +++ b/src/test/resources/tosca/new-converter/sampleOperationalPoliciesEXTENTED.yaml @@ -0,0 +1,174 @@ + +tosca_definitions_version: tosca_simple_yaml_1_0_0 +policy_types: + onap.policies.controlloop.operational.Common: + derived_from: onap.datatype.controlloop.operation.Failure + version: 1.0.0 + description: Operational Policy for Control Loop execution + properties: + id: + type: String + description: The unique control loop id. + required: true + timeout: + type: Integer + description: | + Overall timeout for executing all the operations. This timeout should equal or exceed the total + timeout for each operation listed. + required: true + constraints: + - valid_values: [1, 2, 5] + - equal: 5 + - greater_than: 7 + - greater_or_equal: 1 + - less_than: 7 + - less_or_equal: 1 + abatement: + type: Boolean + description: Whether an abatement event message will be expected for the control loop from DCAE. + required: true + default: false + trigger: + type: String + description: Initial operation to execute upon receiving an Onset event message for the Control Loop. + required: true + operations: + type: List + description: List of operations to be performed when Control Loop is triggered. + required: true + entry_schema: + type: onap.datatype.controlloop.Operation + onap.policies.controlloop.operational.common.Drools: + derived_from: onap.policies.controlloop.operational.Common + type_version: 1.0.0 + version: 1.0.0 + description: Operational policies for Drools PDP + properties: + controllerName: + type: String + description: Drools controller properties + required: true +data_types: + # TBD if this is needed + onap.datatype.controlloop.operation.Failure: + derived_from: onap.datatype.controlloop.Target + description: Captures information of an operational failure performed for control loop + properties: + messages: + type: String + description: error message + required: true + category: + type: String + description: | + The category the error occurred in. Whether this is a general error from the actor, or the operation + timed out, retries were exhausted in trying to execute the operation, a guard policy prevented the + operation from occuring, or an exception in the system caused the failure. + constraints: + - valid_values: [error, timeout, retries, guard, exception] + onap.datatype.controlloop.Target: + derived_from: tosca.datatypes.Root + description: Definition for a entity in A&AI to perform a control loop operation on + properties: + targetType: + type: String + description: Category for the target type + required: true + constraints: + - valid_values: [VNF, VM, VFMODULE, PNF] + entityIds: + type: Map + description: | + Map of values that identify the resource. If none are provided, it is assumed that the + entity that generated the ONSET event will be the target. + required: false + entry_schema: + type: String + onap.datatype.controlloop.Actor: + derived_from: tosca.datatypes.Root + description: An actor/operation/target definition + properties: + actor: + type: String + description: The actor performing the operation. + required: true + default: [1,"String",5.5,true] + operation: + type: String + description: The operation the actor is performing. + required: true + target: + type: String + description: The resource the operation should be performed on. + required: true + metadata: + clamp_possible_values: + payload: + type: Map + description: Name/value pairs of payload information passed by Policy to the actor + required: false + entry_schema: + type: String + onap.datatype.controlloop.Operation: + derived_from: tosca.datatypes.Root + description: An operation supported by an actor + properties: + id: + type: String + description: Unique identifier for the operation + required: true + description: + type: Array + description: A user-friendly description of the intent for the operation + required: false + constraints: + - min_length: 5 + - max_length: 7 + - length: 1 + operation: + type: onap.datatype.controlloop.Actor + description: The definition of the operation to be performed. + required: true + metadata: + clamp_possible_values: + timeout: + type: Integer + description: The amount of time for the actor to perform the operation. + required: true + constraints: + - valid_values: [3, 4, 5.5, 6, 10] + retries: + type: Integer + description: The number of retries the actor should attempt to perform the operation. + required: true + default: 0 + success: + type: String + description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation. + required: false + default: final_success + failure: + type: String + description: Points to the operation to invoke on Actor operation failure. + required: false + default: final_failure + failure_timeout: + type: String + description: Points to the operation to invoke when the time out for the operation occurs. + required: false + default: final_failure_timeout + failure_retries: + type: String + description: Points to the operation to invoke when the current operation has exceeded its max retries. + required: false + default: final_failure_retries + failure_exception: + type: String + description: Points to the operation to invoke when the current operation causes an exception. + required: false + default: final_failure_exception + failure_guard: + type: String + description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement. + required: false + default: final_failure_guard diff --git a/src/test/resources/tosca/templates.properties b/src/test/resources/tosca/templates.properties new file mode 100644 index 00000000..792238bd --- /dev/null +++ b/src/test/resources/tosca/templates.properties @@ -0,0 +1,7 @@ +Integer=type,description,required +Boolean=description,required +String=type,description,required,metadata,constraints +Number=description,required +Map=type,description,required,entry_schema +List=type,required,entry_schema +onap.datatype.controlloop.Actor=type,description,required,metadata \ No newline at end of file -- 2.16.6