Milestone updates 07/136307/2
authorJvD_Ericsson <jeff.van.dam@est.tech>
Mon, 23 Oct 2023 15:50:37 +0000 (16:50 +0100)
committerMichael Morris <michael.morris@est.tech>
Tue, 24 Oct 2023 19:34:58 +0000 (19:34 +0000)
Signed-off-by: JvD_Ericsson <jeff.van.dam@est.tech>
Change-Id: I43c91fbeb476acea8a8c05c249dcfb01618ddb7b
Issue-ID: SDC-4666

catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/YamlTemplateParsingHandler.java
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/InterfaceDefinitionHandler.java
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverter.java
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaLifecycleOperationDefinition.java
catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/InterfaceDefinitionHandlerTest.java
catalog-be/src/test/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverterTest.java
catalog-be/src/test/resources/interfaceDefinition/interfaceDefinition-legacy.yaml
catalog-be/src/test/resources/interfaceDefinition/interfaceDefinition-tosca1.3.yaml
catalog-be/src/test/resources/interfaceDefinition/interfaceDefinitionInvalidMilestone-tosca1.3.yaml
catalog-ui/src/app/ng2/pages/composition/interface-operatons/operation-creator/activities-list/activities-list.component.html
catalog-ui/src/app/ng2/pages/composition/interface-operatons/operation-creator/interface-operation-handler.component.html

index a5927a5..0314f97 100644 (file)
@@ -45,7 +45,6 @@ import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.INPUTS;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.INTERFACES;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.IS_PASSWORD;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.MEMBERS;
-import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.MILESTONES;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.NODE;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.NODE_TEMPLATES;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.NODE_TYPE;
@@ -98,13 +97,10 @@ import org.openecomp.sdc.be.components.utils.PropertiesUtils;
 import org.openecomp.sdc.be.config.BeEcompErrorManager;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphDao;
-import org.openecomp.sdc.be.datatypes.elements.ActivityDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.FilterDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ListDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.MilestoneDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.OperationInputDefinition;
 import org.openecomp.sdc.be.datatypes.elements.PolicyTargetType;
@@ -114,9 +110,9 @@ import org.openecomp.sdc.be.datatypes.elements.SubPropertyToscaFunction;
 import org.openecomp.sdc.be.datatypes.elements.SubstitutionFilterPropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ToscaFunction;
 import org.openecomp.sdc.be.datatypes.elements.ToscaFunctionType;
-import org.openecomp.sdc.be.datatypes.enums.ActivityTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ConstraintType;
 import org.openecomp.sdc.be.datatypes.enums.FilterValueType;
+import org.openecomp.sdc.be.datatypes.enums.MilestoneTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.PropertyFilterTargetType;
 import org.openecomp.sdc.be.model.CapabilityDefinition;
 import org.openecomp.sdc.be.model.Component;
@@ -969,7 +965,7 @@ public class YamlTemplateParsingHandler {
         if (nodeTemplateJsonMap.containsKey(TypeUtils.ToscaTagNamesEnum.INSTANCE_COUNT.getElementName())) {
             Object instanceCount = nodeTemplateJsonMap.get(TypeUtils.ToscaTagNamesEnum.INSTANCE_COUNT.getElementName());
             if (instanceCount instanceof Map) {
-                String instanceCountAsString = "{get_input:" + (String)((Map)instanceCount).get("get_input") + "}";
+                String instanceCountAsString = "{get_input:" + (String) ((Map) instanceCount).get("get_input") + "}";
                 nodeTemplateInfo.setInstanceCount(instanceCountAsString);
             } else {
                 nodeTemplateInfo.setInstanceCount(instanceCount.toString());
@@ -1303,9 +1299,19 @@ public class YamlTemplateParsingHandler {
                     final Map<String, Object> interfaceInputs = (Map<String, Object>) operationValue.get(INPUTS.getElementName());
                     operationDef.setInputs(handleInterfaceOperationInputs(interfaceInputs));
                 }
-                if (operationValue.containsKey(MILESTONES.getElementName())) {
-                    final Map<String, Object> interfaceMilestones = (Map<String, Object>) operationValue.get(MILESTONES.getElementName());
-                    operationDef.setMilestones(interfaceDefinitionHandler.handleInterfaceOperationMilestones(interfaceMilestones));
+                for (MilestoneTypeEnum milestone : MilestoneTypeEnum.values()) {
+                    String milestoneType = milestone.getValue();
+                    if (operationValue.containsKey(milestoneType)) {
+                        final Map<String, Object> interfaceMilestones = (Map<String, Object>) operationValue.get(milestoneType);
+                        if (operationDef.getMilestones() == null || operationDef.getMilestones().isEmpty()) {
+                            operationDef.setMilestones(new HashMap<>());
+                            operationDef.getMilestones().put(milestoneType,
+                                interfaceDefinitionHandler.handleInterfaceOperationMilestones(interfaceMilestones, milestoneType));
+                            continue;
+                        }
+                        operationDef.getMilestones()
+                            .put(milestoneType, interfaceDefinitionHandler.handleInterfaceOperationMilestones(interfaceMilestones, milestoneType));
+                    }
                 }
                 operations.put(operationEntry.getKey(), operationDef);
             }
@@ -1415,7 +1421,7 @@ public class YamlTemplateParsingHandler {
         if (operationDefinitionMap.get(IMPLEMENTATION.getElementName()) instanceof Map &&
             ((Map) operationDefinitionMap.get(IMPLEMENTATION.getElementName())).containsKey("timeout")) {
             final Object timeOut = ((Map) operationDefinitionMap.get(IMPLEMENTATION.getElementName())).get("timeout");
-            artifactDataDefinition.setTimeout((Integer)timeOut);
+            artifactDataDefinition.setTimeout((Integer) timeOut);
         }
 
         if (operationDefinitionMap.get(IMPLEMENTATION.getElementName()) instanceof String) {
index 8d713c4..b850dfd 100644 (file)
@@ -27,7 +27,6 @@ import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.DESCRIPTION
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.FILTERS;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.IMPLEMENTATION;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.INPUTS;
-import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.MILESTONES;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.NOTIFICATIONS;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.OPERATIONS;
 import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.REQUIRED;
@@ -47,7 +46,6 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
@@ -70,6 +68,7 @@ import org.openecomp.sdc.be.datatypes.elements.ToscaFunction;
 import org.openecomp.sdc.be.datatypes.elements.ToscaFunctionType;
 import org.openecomp.sdc.be.datatypes.enums.ActivityTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ConstraintType;
+import org.openecomp.sdc.be.datatypes.enums.MilestoneTypeEnum;
 import org.openecomp.sdc.be.model.InputDefinition;
 import org.openecomp.sdc.be.model.InterfaceDefinition;
 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
@@ -192,29 +191,38 @@ public class InterfaceDefinitionHandler {
             final Map<String, Object> interfaceInputs = (Map<String, Object>) operationDefinitionMap.get(INPUTS.getElementName());
             operation.setInputs(handleInterfaceOperationInputs(interfaceInputs));
         }
-        if (operationDefinitionMap.containsKey(MILESTONES.getElementName())) {
-            final Map<String, Object> interfaceMilestones = (Map<String, Object>) operationDefinitionMap.get(MILESTONES.getElementName());
-            operation.setMilestones(handleInterfaceOperationMilestones(interfaceMilestones));
+        for (MilestoneTypeEnum milestone : MilestoneTypeEnum.values()) {
+            String milestoneType = milestone.getValue();
+            if (operationDefinitionMap.containsKey(milestone.getValue())) {
+                final Map<String, Object> interfaceMilestones = (Map<String, Object>) operationDefinitionMap.get(milestoneType);
+                if (operation.getMilestones() == null || operation.getMilestones().isEmpty()) {
+                    operation.setMilestones(new HashMap<>());
+                    operation.getMilestones().put(milestoneType, handleInterfaceOperationMilestones(interfaceMilestones, milestoneType));
+                    continue;
+                }
+                operation.getMilestones().put(milestoneType, handleInterfaceOperationMilestones(interfaceMilestones, milestoneType));
+            }
         }
         return operation;
     }
 
-    public Map<String, MilestoneDataDefinition> handleInterfaceOperationMilestones(final Map<String, Object> interfaceMilestones) {
-        final Map<String, MilestoneDataDefinition> milestones = new HashMap<>();
-        for (final Entry<String, Object> interfaceInput : interfaceMilestones.entrySet()) {
-            final MilestoneDataDefinition operationMilestone = new MilestoneDataDefinition();
-            ListDataDefinition<ActivityDataDefinition> activities = handleMilestoneActivities(interfaceInput.getValue());
-            if (activities.isEmpty()) {
-                throw new ByActionStatusComponentException(ActionStatus.INVALID_OPERATION_MILESTONE, interfaceInput.getKey());
-            }
-            ListDataDefinition<FilterDataDefinition> filters = handleMilestoneFilters(interfaceInput.getValue());
+    public MilestoneDataDefinition handleInterfaceOperationMilestones(final Map<String, Object> interfaceMilestones, String key) {
+        final MilestoneDataDefinition operationMilestone = new MilestoneDataDefinition();
+        if (interfaceMilestones != null && !interfaceMilestones.containsKey(ACTIVITIES.getElementName())) {
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_OPERATION_MILESTONE, key);
+        }
+        ListDataDefinition<ActivityDataDefinition> activities = handleMilestoneActivities(interfaceMilestones);
+        if (activities.isEmpty()) {
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_OPERATION_MILESTONE, key);
+        }
+        if (interfaceMilestones.containsKey(FILTERS.getElementName())) {
+            ListDataDefinition<FilterDataDefinition> filters = handleMilestoneFilters(interfaceMilestones);
             if (!filters.isEmpty()) {
                 operationMilestone.setFilters(filters);
             }
-            operationMilestone.setActivities(activities);
-            milestones.put(interfaceInput.getKey(), operationMilestone);
         }
-        return milestones;
+        operationMilestone.setActivities(activities);
+        return operationMilestone;
     }
 
     private ListDataDefinition<FilterDataDefinition> handleMilestoneFilters(Object milestone) {
@@ -325,7 +333,7 @@ public class InterfaceDefinitionHandler {
         }
         return inputs;
     }
-    
+
     private boolean isMilestoneJeopardyData(Object value) {
         if (value instanceof Map) {
             Set<String> allowedKeys = new HashSet<>();
index 97657f0..57c48f5 100644 (file)
@@ -67,7 +67,6 @@ import org.openecomp.sdc.be.model.tosca.constraints.LessOrEqualConstraint;
 import org.openecomp.sdc.be.model.tosca.constraints.LessThanConstraint;
 import org.openecomp.sdc.be.model.tosca.constraints.MaxLengthConstraint;
 import org.openecomp.sdc.be.model.tosca.constraints.MinLengthConstraint;
-import org.openecomp.sdc.be.model.tosca.constraints.PatternConstraint;
 import org.openecomp.sdc.be.model.tosca.constraints.ValidValuesConstraint;
 import org.openecomp.sdc.be.tosca.PropertyConvertor.PropertyType;
 import org.openecomp.sdc.be.tosca.model.ToscaActivity;
@@ -92,7 +91,6 @@ import org.openecomp.sdc.be.tosca.model.ToscaPropertyConstraintLessOrEqual;
 import org.openecomp.sdc.be.tosca.model.ToscaPropertyConstraintLessThan;
 import org.openecomp.sdc.be.tosca.model.ToscaPropertyConstraintMaxLength;
 import org.openecomp.sdc.be.tosca.model.ToscaPropertyConstraintMinLength;
-import org.openecomp.sdc.be.tosca.model.ToscaPropertyConstraintPattern;
 import org.openecomp.sdc.be.tosca.model.ToscaPropertyConstraintValidValues;
 import org.openecomp.sdc.be.tosca.utils.OperationArtifactUtil;
 import org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum;
@@ -489,7 +487,8 @@ public class InterfacesOperationsConverter {
             } else {
                 if (toscaInterfaceOperationImplementation.getTimeout() != null) {
                     final ToscaArtifactDefinition toscaArtifactDefinition = new ToscaArtifactDefinition();
-                    toscaArtifactDefinition.setFile(StringUtils.isBlank(operationArtifactPath) || "null".equals(operationArtifactPath) ? null : operationArtifactPath);
+                    toscaArtifactDefinition.setFile(
+                        StringUtils.isBlank(operationArtifactPath) || "null".equals(operationArtifactPath) ? null : operationArtifactPath);
                     toscaInterfaceOperationImplementation.setPrimary(toscaArtifactDefinition);
                     toscaOperation.setImplementation(toscaInterfaceOperationImplementation);
                 } else {
index 53aca45..e4b55fc 100644 (file)
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.openecomp.sdc.be.tosca.model;
 
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import java.util.Map;
 import lombok.Data;
 
@@ -28,6 +31,12 @@ public class ToscaLifecycleOperationDefinition {
     private String description;
     private Object implementation;
     private Map<String, ToscaProperty> inputs;
+    @JsonIgnore
     private Map<String, ToscaMilestone> milestones;
 
+    @JsonAnyGetter
+    public Map<String, ToscaMilestone> getMilestonesMap() {
+        return milestones;
+    }
+
 }
index 800fbc2..b57ae5a 100644 (file)
@@ -129,7 +129,7 @@ class InterfaceDefinitionHandlerTest {
             assertThrows(ByActionStatusComponentException.class, () -> interfaceDefinitionHandler.create(load, StringUtils.EMPTY));
         assertEquals(ActionStatus.INVALID_OPERATION_MILESTONE, actualException.getActionStatus());
         assertEquals(1, actualException.getParams().length);
-        assertEquals("on_failure", actualException.getParams()[0]);
+        assertEquals("on_success", actualException.getParams()[0]);
     }
 
     private void assertInterfaceDefinition(final InterfaceDefinition actualInterfaceDefinition) {
index 7e4b4c2..5afd520 100644 (file)
@@ -661,10 +661,8 @@ class InterfacesOperationsConverterTest {
         Map<String, Object> resource = (Map<String, Object>) resourceName;
         assertTrue(resource.containsKey("name_for_op_0"));
         Map<String, Object> operation0 = (Map<String, Object>) resource.get("name_for_op_0");
-        assertTrue(operation0.containsKey("milestones"));
-        Map<String, Object> operation0Milestones = (Map<String, Object>) operation0.get("milestones");
-        assertTrue(operation0Milestones.containsKey(MilestoneTypeEnum.ON_ENTRY.getValue()));
-        Map<String, Object> milestone = (Map<String, Object>) operation0Milestones.get(MilestoneTypeEnum.ON_ENTRY.getValue());
+        assertTrue(operation0.containsKey(MilestoneTypeEnum.ON_ENTRY.getValue()));
+        Map<String, Object> milestone = (Map<String, Object>) operation0.get(MilestoneTypeEnum.ON_ENTRY.getValue());
         assertTrue(milestone.containsKey("activities"));
         List<Map<String, Object>> activities = (List<Map<String, Object>>) milestone.get("activities");
         assertEquals(1, activities.size());
@@ -676,7 +674,7 @@ class InterfacesOperationsConverterTest {
         assertEquals("workflow1", activityVariables.get("workflow"));
         assertTrue(activityVariables.containsKey("inputs"));
         assertTrue(activityVariables.get("inputs") instanceof Map);
-        Map<String, Object> inputs =  (Map<String, Object>) activityVariables.get("inputs");
+        Map<String, Object> inputs = (Map<String, Object>) activityVariables.get("inputs");
         assertNotNull(inputs);
         assertTrue(inputs.containsKey("stringName"));
         assertTrue(inputs.get("stringName") instanceof String);
index 108c43f..2d13fb8 100644 (file)
@@ -46,54 +46,53 @@ start:
         service_restoration_sla: service_restoration_sla_value
         battery_backup: true
         partner_priorty_assist: false
-  milestones:
-    on_failure:
-      activities:
-        - delegate:
-            workflow: workflow1
-        - delegate:
-            workflow: workflow2
-    on_success:
-      activities:
-        - delegate:
-            workflow: workflow1
-        - delegate:
-            workflow: workflow2
-            inputs:
-              string:
-                testString
-              complex:
-                jeopardyType: test
-                name: name
-                eventType: type
-                message: message
-      filters:
-        - my_attribute:
-            equal:
-              get_attribute:
-                - SELF
-                - role
-        - my_attribute1:
-            greaterThan: my_other_value
-        - my_attribute2:
-            inRange:
-              - test1
-              - test99
-        - my_attribute3:
-            validValues:
-              - test1
-              - test2
-              - test3
-        - my_attribute4:
-            length: 12
-        - my_attribute5:
-            minLength: 4
-    on_timeout:
-      activities:
-        - delegate:
-            workflow: workflow1
-        - delegate:
-            workflow: workflow2
+  on_failure:
+    activities:
+      - delegate:
+          workflow: workflow1
+      - delegate:
+          workflow: workflow2
+  on_success:
+    activities:
+      - delegate:
+          workflow: workflow1
+      - delegate:
+          workflow: workflow2
+          inputs:
+            string:
+              testString
+            complex:
+              jeopardyType: test
+              name: name
+              eventType: type
+              message: message
+    filters:
+      - my_attribute:
+          equal:
+            get_attribute:
+              - SELF
+              - role
+      - my_attribute1:
+          greaterThan: my_other_value
+      - my_attribute2:
+          inRange:
+            - test1
+            - test99
+      - my_attribute3:
+          validValues:
+            - test1
+            - test2
+            - test3
+      - my_attribute4:
+          length: 12
+      - my_attribute5:
+          minLength: 4
+  on_timeout:
+    activities:
+      - delegate:
+          workflow: workflow1
+      - delegate:
+          workflow: workflow2
 stop:
   implementation: "camunda/executeAction"
   inputs:
index 0eb1db3..2b3e28c 100644 (file)
@@ -41,25 +41,24 @@ operations:
           service_restoration_sla: service_restoration_sla_value
           battery_backup: true
           partner_priorty_assist: false
-    milestones:
-      on_failure:
-        activities:
-          - delegate:
-              workflow: workflow1
-          - delegate:
-              workflow: workflow2
-      on_success:
-        activities:
-          - delegate:
-              workflow: workflow1
-          - delegate:
-              workflow: workflow2
-      on_timeout:
-        activities:
-          - delegate:
-              workflow: workflow1
-          - delegate:
-              workflow: workflow2
+    on_failure:
+      activities:
+        - delegate:
+            workflow: workflow1
+        - delegate:
+            workflow: workflow2
+    on_success:
+      activities:
+        - delegate:
+            workflow: workflow1
+        - delegate:
+            workflow: workflow2
+    on_timeout:
+      activities:
+        - delegate:
+            workflow: workflow1
+        - delegate:
+            workflow: workflow2
   stop:
     implementation: "camunda/executeAction"
     inputs:
index 4e3c556..c6a297b 100644 (file)
@@ -11,7 +11,6 @@ type: tosca.interfaces.node.lifecycle.Standard
 operations:
   start:
     implementation: "camunda/executeAction"
-    milestones:
-      on_failure:
-      on_success:
-      on_timeout:
\ No newline at end of file
+    on_failure:
+    on_success:
+    on_timeout:
\ No newline at end of file
index ce8eb2f..7c045ca 100644 (file)
@@ -26,7 +26,7 @@
         <div *ngFor="let activity of activities; let idx = index">
           <div class="side-by-side group-with-border-blue">
             <div class="form-item">
-              <label class="sdc-timeout-label">Type: </label>
+              <label class="sdc-timeout-label">Activity Type: </label>
               <div class="sdc-dropdown">
                 <select class="i-sdc-form-select"
                         data-tests-id="activity-type"
@@ -47,9 +47,9 @@
             <div class="form-item">
               <div class="side-by-side">
                 <div class="form-item-big">
-                  <label>Workflow: </label>
+                  <label>Activity Implementation: </label>
                   <input type="text"
-                     class="i-sdc-form-input"
+                     class="sdc-input"
                      [disabled]="isViewOnly"
                      (input)="onActivityValueChange($event.target.value, idx)"
                      [value]="activity.workflow"
index b187fa5..3f99476 100644 (file)
         </div>
 
         <div class="group-with-border content-row" *ngIf="showActivities">
-            <label class="sub-operations-label"> Sub operations </label>
+            <label class="sub-operations-label"> Progress Points </label>
             <tabs tabStyle="basic-tabs" [hideIndicationOnTabChange]="true" (tabChanged)="tabChanged($event)">
                 <div *ngFor="let milestone of milestones">
                   <tab tabTitle="{{milestone}}" [active]="isActiveTab(milestone)" [highlight]="isInvalidActivity(milestone)">