From b6d953c506c08a5369c0be7242ef3ce3ec888452 Mon Sep 17 00:00:00 2001 From: vasraz Date: Fri, 5 Feb 2021 19:24:06 +0000 Subject: Implement Attributes/Outputs BE (part 2) This commit includes support for: - declare Attribute as Output - undeclare Attribute as Output - export 'Tosca Artifacts' with Attributes/Outputs Change-Id: Iedfbf936e439fd2f7d252b660fe2c42b8d9b9113 Signed-off-by: Vasyl Razinkov Issue-ID: SDC-3448 --- .../sdc/be/model/AttributeDefinition.java | 2 + .../java/org/openecomp/sdc/be/model/Component.java | 4 + .../sdc/be/model/ComponentInstOutputsMap.java | 60 +++++ .../be/model/ComponentInstanceAttribOutput.java | 49 ++++ .../sdc/be/model/ComponentInstanceOutput.java | 26 +- .../sdc/be/model/ComponentParametersView.java | 4 + .../openecomp/sdc/be/model/InputDefinition.java | 23 +- .../openecomp/sdc/be/model/OutputDefinition.java | 12 +- .../jsonjanusgraph/datamodel/TopologyTemplate.java | 4 +- .../operations/NodeTemplateOperation.java | 131 +++++++--- .../operations/NodeTypeOperation.java | 1 + .../operations/TopologyTemplateOperation.java | 23 ++ .../operations/ToscaOperationFacade.java | 269 +++++++++++++++++---- .../model/jsonjanusgraph/utils/ModelConverter.java | 34 +++ .../sdc/be/ui/model/UiComponentDataTransfer.java | 5 +- 15 files changed, 526 insertions(+), 121 deletions(-) create mode 100644 catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstOutputsMap.java create mode 100644 catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstanceAttribOutput.java (limited to 'catalog-model') diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/AttributeDefinition.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/AttributeDefinition.java index f9e0d646b3..ee819310c1 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/AttributeDefinition.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/AttributeDefinition.java @@ -47,11 +47,13 @@ public class AttributeDefinition extends AttributeDataDefinition implements IOpe } public AttributeDefinition(final AttributeDefinition attributeDefinition) { + super(attributeDefinition); this.type = attributeDefinition.getType(); this.description = attributeDefinition.getDescription(); this._default = attributeDefinition.get_default(); this.status = attributeDefinition.getStatus(); this.entry_schema = attributeDefinition.getEntry_schema(); + this.toscaPresentation = attributeDefinition.toscaPresentation; } @Override diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/Component.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/Component.java index 600451d193..c40eef3309 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/Component.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/Component.java @@ -349,6 +349,10 @@ public abstract class Component implements PropertiesOwner { return componentInstancesProperties == null ? emptyMap() : componentInstancesProperties; } + public Map> safeGetComponentInstancesAttributes() { + return componentInstancesAttributes == null ? emptyMap() : componentInstancesAttributes; + } + public Map> safeGetUiComponentInstancesProperties() { return componentInstancesProperties == null ? emptyMap() : findUiComponentInstancesProperties(); } diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstOutputsMap.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstOutputsMap.java new file mode 100644 index 0000000000..98b39fd1c2 --- /dev/null +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstOutputsMap.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2021, Nordix Foundation. 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.openecomp.sdc.be.model; + +import static org.apache.commons.collections.MapUtils.isNotEmpty; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import lombok.Setter; +import org.apache.commons.lang3.tuple.Pair; + +@Setter +public class ComponentInstOutputsMap { + + private Map> componentInstanceOutputsMap; + private Map> componentInstanceAttributes; + + public Pair> resolveAttributesToDeclare() { + if (isNotEmpty(componentInstanceOutputsMap)) { + return singleMapEntry(componentInstanceOutputsMap); + } + if (isNotEmpty(componentInstanceAttributes)) { + return singleMapEntry(componentInstanceAttributes); + } + throw new IllegalStateException("there are no properties selected for declaration"); + } + + private Pair> singleMapEntry(final Map> attributesMap) { + final Map.Entry> singleEntry = attributesMap.entrySet().iterator().next(); + return Pair.of(singleEntry.getKey(), singleEntry.getValue()); + } + + public Map> getComponentInstanceOutputsMap() { + return componentInstanceOutputsMap == null ? new HashMap<>() : componentInstanceOutputsMap; + } + + public Map> getComponentInstanceAttributes() { + return componentInstanceAttributes == null ? new HashMap<>() : componentInstanceAttributes; + } + +} diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstanceAttribOutput.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstanceAttribOutput.java new file mode 100644 index 0000000000..9b14e1af54 --- /dev/null +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstanceAttribOutput.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2021, Nordix Foundation. 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.openecomp.sdc.be.model; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ComponentInstanceAttribOutput extends ComponentInstanceAttribute { + + private String attributesName; + private AttributeDefinition output; + + public ComponentInstanceAttribOutput() { + super(); + } + + public ComponentInstanceAttribOutput(ComponentInstanceAttribute p) { + super(p); + } + + public String[] getParsedAttribNames() { + String[] tokens = null; + if (attributesName != null && !attributesName.isEmpty()) { + tokens = attributesName.split("#"); + } + return tokens; + } + +} diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstanceOutput.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstanceOutput.java index db79511a67..be3f87eb9b 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstanceOutput.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstanceOutput.java @@ -22,12 +22,16 @@ package org.openecomp.sdc.be.model; import java.util.List; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition; import org.openecomp.sdc.be.datatypes.elements.PropertyRule; @Getter @Setter +@NoArgsConstructor +@ToString(callSuper = true) public class ComponentInstanceOutput extends OutputDefinition implements IComponentInstanceConnectedElement, IAttributeOutputCommon { /** @@ -35,21 +39,25 @@ public class ComponentInstanceOutput extends OutputDefinition implements ICompon */ private String valueUniqueUid; - private List path = null; + private List path; - private List rules = null; + private List rules; private String componentInstanceName; private String componentInstanceId; - public ComponentInstanceOutput(AttributeDataDefinition curPropertyDef, String outputId, String value, - String valueUniqueUid) { + public ComponentInstanceOutput(final AttributeDataDefinition curPropertyDef, + final String outputId, + final String value, + final String valueUniqueUid) { super(curPropertyDef); setOutputId(outputId); setValue(value); this.valueUniqueUid = valueUniqueUid; } - public ComponentInstanceOutput(OutputDefinition pd, String value, String valueUniqueUid) { + public ComponentInstanceOutput(final OutputDefinition pd, + final String value, + final String valueUniqueUid) { super(pd); setValue(value); @@ -60,14 +68,8 @@ public class ComponentInstanceOutput extends OutputDefinition implements ICompon super(attributeDataDefinition); if (attributeDataDefinition.getGetOutputValues() != null && !attributeDataDefinition.getGetOutputValues() .isEmpty()) { - setOutputId(attributeDataDefinition.getGetOutputValues().get(0).getInputId()); + setOutputId(attributeDataDefinition.getGetOutputValues().get(0).getOutputId()); } } - @Override - public String toString() { - return "ComponentInstanceOutput [ " + super.toString() + " , value=" + getValue() + ", valueUniqueUid = " - + valueUniqueUid + " , rules=" + rules + " , path=" + path + " ]"; - } - } diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentParametersView.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentParametersView.java index 87917d7861..4c8cb3d866 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentParametersView.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentParametersView.java @@ -151,6 +151,10 @@ public class ComponentParametersView { this.setIgnoreComponentInstances(false); this.setIgnoreComponentInstancesInputs(false); break; + case COMPONENT_INSTANCE_OUTPUTS: + this.setIgnoreComponentInstances(false); + this.setIgnoreComponentInstancesOutputs(false); + break; case INSTANCE_CAPABILTY_PROPERTIES: this.setIgnoreCapabiltyProperties(false); break; diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/InputDefinition.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/InputDefinition.java index 2f61e9e6f3..bbb71463fc 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/InputDefinition.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/InputDefinition.java @@ -20,6 +20,8 @@ package org.openecomp.sdc.be.model; +import lombok.Getter; +import lombok.Setter; import org.openecomp.sdc.be.datatypes.elements.Annotation; import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition; @@ -27,12 +29,13 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +@Getter +@Setter public class InputDefinition extends PropertyDefinition { private List inputs; private List properties; - public InputDefinition(PropertyDataDefinition p) { super(p); } @@ -49,26 +52,8 @@ public class InputDefinition extends PropertyDefinition { super(other); } - public List getInputs() { - return inputs; - } - - public void setInputs(List inputs) { - this.inputs = inputs; - } - - public List getProperties() { - return properties; - } - - public void setProperties(List properties) { - this.properties = properties; - } - public void setAnnotationsToInput(Collection annotations){ this.setAnnotations(new ArrayList<>(annotations)); } - - } diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/OutputDefinition.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/OutputDefinition.java index cbff8fa3af..354a5b2ae3 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/OutputDefinition.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/OutputDefinition.java @@ -19,12 +19,20 @@ package org.openecomp.sdc.be.model; +import java.util.List; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition; +@Getter +@Setter +@NoArgsConstructor public class OutputDefinition extends AttributeDefinition { + private List attributes; - public OutputDefinition(final AttributeDataDefinition propertyDataDefinition) { - super(propertyDataDefinition); + public OutputDefinition(final AttributeDataDefinition attributeDataDefinition) { + super(attributeDataDefinition); } public OutputDefinition(AttributeDefinition propertyDefinition) { diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/datamodel/TopologyTemplate.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/datamodel/TopologyTemplate.java index 1bf35fbd9f..483e79c53b 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/datamodel/TopologyTemplate.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/datamodel/TopologyTemplate.java @@ -26,10 +26,10 @@ import lombok.Getter; import lombok.Setter; import org.apache.commons.collections.MapUtils; import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition; import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition; import org.openecomp.sdc.be.datatypes.elements.ComponentInstanceDataDefinition; import org.openecomp.sdc.be.datatypes.elements.CompositionDataDefinition; -import org.openecomp.sdc.be.datatypes.elements.DataTypeDataDefinition; import org.openecomp.sdc.be.datatypes.elements.ForwardingPathDataDefinition; import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition; import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition; @@ -59,7 +59,9 @@ public class TopologyTemplate extends ToscaElement { } private Map inputs; + private Map outputs; private Map instInputs; + private Map instOutputs; private Map heatParameters; private Map instAttributes; private Map instProperties; diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTemplateOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTemplateOperation.java index 3f3e54146d..babe44234e 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTemplateOperation.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTemplateOperation.java @@ -23,6 +23,7 @@ package org.openecomp.sdc.be.model.jsonjanusgraph.operations; import fj.data.Either; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.EnumMap; import java.util.HashMap; import java.util.HashSet; @@ -33,7 +34,6 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.Set; import java.util.UUID; -import java.util.function.BiConsumer; import java.util.function.BiPredicate; import java.util.stream.Collectors; import org.apache.commons.collections.CollectionUtils; @@ -82,7 +82,25 @@ import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields; import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum; import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum; import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition; -import org.openecomp.sdc.be.model.*; +import org.openecomp.sdc.be.model.ArtifactDefinition; +import org.openecomp.sdc.be.model.CapabilityDefinition; +import org.openecomp.sdc.be.model.CapabilityRequirementRelationship; +import org.openecomp.sdc.be.model.Component; +import org.openecomp.sdc.be.model.ComponentInstance; +import org.openecomp.sdc.be.model.ComponentInstanceAttribute; +import org.openecomp.sdc.be.model.ComponentInstanceInput; +import org.openecomp.sdc.be.model.ComponentInstanceOutput; +import org.openecomp.sdc.be.model.ComponentInstanceProperty; +import org.openecomp.sdc.be.model.ComponentParametersView; +import org.openecomp.sdc.be.model.GroupDefinition; +import org.openecomp.sdc.be.model.GroupInstance; +import org.openecomp.sdc.be.model.InputDefinition; +import org.openecomp.sdc.be.model.PropertyDefinition; +import org.openecomp.sdc.be.model.RelationshipImpl; +import org.openecomp.sdc.be.model.RelationshipInfo; +import org.openecomp.sdc.be.model.RequirementCapabilityRelDef; +import org.openecomp.sdc.be.model.RequirementDefinition; +import org.openecomp.sdc.be.model.User; import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.NodeType; import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.TopologyTemplate; import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElement; @@ -233,37 +251,40 @@ public class NodeTemplateOperation extends BaseOperation { addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAPABILITIES, VertexTypeEnum.CALCULATED_CAPABILITIES, allCalculatedCap, componentInstance.getUniqueId()); /******** capability property ****************************/ - status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, componentInstanceData.getUniqueId()); + status = deleteToscaDataDeepElementsBlockOfToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, + VertexTypeEnum.CALCULATED_CAP_PROPERTIES, componentInstanceData.getUniqueId()); if (status != StorageOperationStatus.OK && status != StorageOperationStatus.NOT_FOUND) { - CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to remove calculated capabilty properties for instance {} in container {}. error {] ", componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status); + CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, + "Failed to remove calculated capabilty properties for instance {} in container {}. error {] ", + componentInstanceData.getUniqueId(), updatedContainer.getUniqueId(), status); return Either.right(status); } - MapCapabilityProperty allCalculatedCapProp = calcCapProp == null || !calcCapProp.containsKey(componentInstanceData.getUniqueId()) ? new MapCapabilityProperty() : calcCapProp.get(componentInstanceData.getUniqueId()); - - additionalCap.forEach(new BiConsumer>() { - @Override - public void accept(String s, List caps) { - if (caps != null && !caps.isEmpty()) { - MapPropertiesDataDefinition dataToCreate; - for (CapabilityDefinition cap : caps) { - dataToCreate = new MapPropertiesDataDefinition(); - List capPrps = cap.getProperties(); - if (capPrps != null) { - for (ComponentInstanceProperty cip : capPrps) { - dataToCreate.put(cip.getName(), new PropertyDataDefinition(cip)); - } - StringBuilder sb = new StringBuilder(componentInstance.getUniqueId()); - sb.append(ModelConverter.CAP_PROP_DELIM); - sb.append(cap.getOwnerId()); - sb.append(ModelConverter.CAP_PROP_DELIM).append(s).append(ModelConverter.CAP_PROP_DELIM).append(cap.getName()); - allCalculatedCapProp.put(sb.toString(), dataToCreate); + MapCapabilityProperty allCalculatedCapProp = + calcCapProp == null || !calcCapProp.containsKey(componentInstanceData.getUniqueId()) ? new MapCapabilityProperty() + : calcCapProp.get(componentInstanceData.getUniqueId()); + + additionalCap.forEach((s, caps) -> { + if (caps != null && !caps.isEmpty()) { + MapPropertiesDataDefinition dataToCreate; + for (CapabilityDefinition cap : caps) { + dataToCreate = new MapPropertiesDataDefinition(); + List capPrps = cap.getProperties(); + if (capPrps != null) { + for (ComponentInstanceProperty cip : capPrps) { + dataToCreate.put(cip.getName(), new PropertyDataDefinition(cip)); } + StringBuilder sb = new StringBuilder(componentInstance.getUniqueId()); + sb.append(ModelConverter.CAP_PROP_DELIM); + sb.append(cap.getOwnerId()); + sb.append(ModelConverter.CAP_PROP_DELIM).append(s).append(ModelConverter.CAP_PROP_DELIM).append(cap.getName()); + allCalculatedCapProp.put(sb.toString(), dataToCreate); } } } }); - addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, allCalculatedCapProp, componentInstance.getUniqueId()); + addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(), EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, + VertexTypeEnum.CALCULATED_CAP_PROPERTIES, allCalculatedCapProp, componentInstance.getUniqueId()); } /******** Requirements property ****************************/ @@ -1294,8 +1315,7 @@ public class NodeTemplateOperation extends BaseOperation { private Boolean isUniqueInstanceName(TopologyTemplate container, String instanceName) { Boolean isUniqueName = true; try { - isUniqueName = !container.getComponentInstances().values().stream().anyMatch(ci -> ci.getName() != null && ci.getName().equals(instanceName)); - + isUniqueName = container.getComponentInstances().values().stream().noneMatch(ci -> ci.getName() != null && ci.getName().equals(instanceName)); } catch (Exception e) { CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Exception occured during fetching component instance with name {} from component container {}. {} ", instanceName, container.getName(), e.getMessage()); } @@ -2134,10 +2154,8 @@ public class NodeTemplateOperation extends BaseOperation { if (!validateInstanceNames(componentInstanceTMap)) { throw new StorageException(StorageOperationStatus.INCONSISTENCY); } - if (!allowDeleted) { - if (!validateDeletedResources(componentInstanceTMap)) { - throw new StorageException(StorageOperationStatus.INCONSISTENCY); - } + if (!allowDeleted && !validateDeletedResources(componentInstanceTMap)) { + throw new StorageException(StorageOperationStatus.INCONSISTENCY); } instancesJsonData = convertToComponentInstanceDataDefinition(componentInstanceTMap, containerId, isUpdateCsar); @@ -2313,32 +2331,53 @@ public class NodeTemplateOperation extends BaseOperation { public StorageOperationStatus addComponentInstanceProperty(Component containerComponent, String componentInstanceId, ComponentInstanceProperty property) { List pathKeys = new ArrayList<>(); pathKeys.add(componentInstanceId); - return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, property, pathKeys, JsonPresentationFields.NAME); + return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, + property, pathKeys, JsonPresentationFields.NAME); } - public StorageOperationStatus updateComponentInstanceProperties(Component containerComponent, String componentInstanceId, List properties) { + public StorageOperationStatus updateComponentInstanceProperties(Component containerComponent, String componentInstanceId, + List properties) { List pathKeys = new ArrayList<>(); pathKeys.add(componentInstanceId); - return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, VertexTypeEnum.INST_PROPERTIES, properties, pathKeys, JsonPresentationFields.NAME); + return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_PROPERTIES, + VertexTypeEnum.INST_PROPERTIES, properties, pathKeys, JsonPresentationFields.NAME); } - public StorageOperationStatus updateComponentInstanceAttribute(Component containerComponent, String componentInstanceId, ComponentInstanceAttribute property){ + public StorageOperationStatus updateComponentInstanceAttributes(final Component containerComponent, + final String componentInstanceId, + final List attributes) { + final List pathKeys = Arrays.asList(componentInstanceId); + return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES, + VertexTypeEnum.INST_ATTRIBUTES, attributes, pathKeys, JsonPresentationFields.NAME); + } + + public StorageOperationStatus updateComponentInstanceAttribute(final Component containerComponent, + final String componentInstanceId, + final ComponentInstanceAttribute attribute) { + final List pathKeys = Arrays.asList(componentInstanceId); + return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES, + VertexTypeEnum.INST_ATTRIBUTES, attribute, pathKeys, JsonPresentationFields.NAME); + } + + public StorageOperationStatus addComponentInstanceAttribute(Component containerComponent, String componentInstanceId, + ComponentInstanceAttribute attribute) { List pathKeys = new ArrayList<>(); pathKeys.add(componentInstanceId); - return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES, property, pathKeys, JsonPresentationFields.NAME); + return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES, + attribute, pathKeys, JsonPresentationFields.NAME); } - public StorageOperationStatus addComponentInstanceAttribute(Component containerComponent, String componentInstanceId, ComponentInstanceAttribute attribute){ + public StorageOperationStatus updateComponentInstanceInput(Component containerComponent, String componentInstanceId, + ComponentInstanceInput property) { List pathKeys = new ArrayList<>(); pathKeys.add(componentInstanceId); - return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_ATTRIBUTES, VertexTypeEnum.INST_ATTRIBUTES, attribute, pathKeys, JsonPresentationFields.NAME); + return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, property, pathKeys, JsonPresentationFields.NAME); } - public StorageOperationStatus updateComponentInstanceInput(Component containerComponent, String componentInstanceId, ComponentInstanceInput property) { - + public StorageOperationStatus updateComponentInstanceOutput(Component containerComponent, String componentInstanceId, ComponentInstanceOutput property) { List pathKeys = new ArrayList<>(); pathKeys.add(componentInstanceId); - return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, property, pathKeys, JsonPresentationFields.NAME); + return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS, property, pathKeys, JsonPresentationFields.NAME); } public StorageOperationStatus updateComponentInstanceInputs(Component containerComponent, String componentInstanceId, List properties) { @@ -2347,12 +2386,24 @@ public class NodeTemplateOperation extends BaseOperation { return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, properties, pathKeys, JsonPresentationFields.NAME); } + public StorageOperationStatus updateComponentInstanceOutputs(Component containerComponent, String componentInstanceId, List properties) { + List pathKeys = new ArrayList<>(); + pathKeys.add(componentInstanceId); + return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS, properties, pathKeys, JsonPresentationFields.NAME); + } + public StorageOperationStatus addComponentInstanceInput(Component containerComponent, String componentInstanceId, ComponentInstanceInput property) { List pathKeys = new ArrayList<>(); pathKeys.add(componentInstanceId); return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, property, pathKeys, JsonPresentationFields.NAME); } + public StorageOperationStatus addComponentInstanceOutput(Component containerComponent, String componentInstanceId, ComponentInstanceOutput property) { + List pathKeys = new ArrayList<>(){}; + pathKeys.add(componentInstanceId); + return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS, property, pathKeys, JsonPresentationFields.NAME); + } + public StorageOperationStatus createInstanceEdge(GraphVertex metadataVertex, ComponentInstanceDataDefinition componentInstance) { String instUniqueId = componentInstance.getUniqueId(); diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTypeOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTypeOperation.java index 1860e696e5..e8aba6dcb6 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTypeOperation.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTypeOperation.java @@ -932,6 +932,7 @@ public class NodeTypeOperation extends ToscaElementOperation { case ARTIFACTS: case GROUPS: case INPUTS: + case OUTPUTS: return true; default: return false; diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/TopologyTemplateOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/TopologyTemplateOperation.java index ed9196098e..a27989bc9e 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/TopologyTemplateOperation.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/TopologyTemplateOperation.java @@ -35,6 +35,7 @@ import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum; import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum; import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum; import org.openecomp.sdc.be.datatypes.category.MetadataKeyDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition; import org.openecomp.sdc.be.datatypes.elements.MapAttributesDataDefinition; import org.openecomp.sdc.be.datatypes.elements.MapCapabilityProperty; import org.openecomp.sdc.be.datatypes.elements.MapListCapabilityDataDefinition; @@ -721,6 +722,14 @@ public class TopologyTemplateOperation extends ToscaElementOperation { } } + + if (!componentParametersView.isIgnoreOutputs()) { + final JanusGraphOperationStatus storageStatus = setOutputsFromGraph(componentV, toscaElement); + if (storageStatus != JanusGraphOperationStatus.OK) { + return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(storageStatus)); + } + } + if (!componentParametersView.isIgnoreProperties()) { status = setPropertiesFromGraph(componentV, toscaElement); if (status != JanusGraphOperationStatus.OK) { @@ -1130,6 +1139,20 @@ public class TopologyTemplateOperation extends ToscaElementOperation { return JanusGraphOperationStatus.OK; } + private JanusGraphOperationStatus setOutputsFromGraph(final GraphVertex componentV, + final TopologyTemplate toscaElement) { + final Either, JanusGraphOperationStatus> result = + getDataFromGraph(componentV, EdgeLabelEnum.OUTPUTS); + if (result.isLeft()) { + toscaElement.setOutputs(result.left().value()); + } else { + if (result.right().value() != JanusGraphOperationStatus.NOT_FOUND) { + return result.right().value(); + } + } + return JanusGraphOperationStatus.OK; + } + private JanusGraphOperationStatus setGroupsFromGraph(GraphVertex componentV, TopologyTemplate toscaElement) { Either, JanusGraphOperationStatus> result = getDataFromGraph(componentV, EdgeLabelEnum.GROUPS); if (result.isLeft()) { diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java index cdddb2049f..b4517e47c5 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java @@ -91,6 +91,7 @@ import org.openecomp.sdc.be.model.ComponentInstance; import org.openecomp.sdc.be.model.ComponentInstanceAttribute; import org.openecomp.sdc.be.model.ComponentInstanceInput; import org.openecomp.sdc.be.model.ComponentInstanceInterface; +import org.openecomp.sdc.be.model.ComponentInstanceOutput; import org.openecomp.sdc.be.model.ComponentInstanceProperty; import org.openecomp.sdc.be.model.ComponentParametersView; import org.openecomp.sdc.be.model.DataTypeDefinition; @@ -99,6 +100,7 @@ import org.openecomp.sdc.be.model.GroupDefinition; import org.openecomp.sdc.be.model.GroupInstance; import org.openecomp.sdc.be.model.InputDefinition; import org.openecomp.sdc.be.model.LifecycleStateEnum; +import org.openecomp.sdc.be.model.OutputDefinition; import org.openecomp.sdc.be.model.PolicyDefinition; import org.openecomp.sdc.be.model.PropertyDefinition; import org.openecomp.sdc.be.model.RelationshipInfo; @@ -1245,6 +1247,36 @@ public class ToscaOperationFacade { } + public Either, StorageOperationStatus> addOutputsToComponent(Map outputs, + String componentId) { + + Either getVertexEither = janusGraphDao + .getVertexById(componentId, JsonParseFlagEnum.NoParse); + if (getVertexEither.isRight()) { + log.debug(COULDNT_FETCH_COMPONENT_WITH_AND_UNIQUE_ID_ERROR, componentId, getVertexEither.right().value()); + return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getVertexEither.right().value())); + + } + + GraphVertex vertex = getVertexEither.left().value(); + Map outputsMap = outputs.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, e -> new AttributeDefinition(e.getValue()))); + + StorageOperationStatus status = topologyTemplateOperation + .addToscaDataToToscaElement(vertex, EdgeLabelEnum.OUTPUTS, VertexTypeEnum.OUTPUTS, outputsMap, JsonPresentationFields.NAME); + + if (StorageOperationStatus.OK == status) { + log.debug(COMPONENT_CREATED_SUCCESSFULLY); + List outputsResList = null; + if (outputsMap != null && !outputsMap.isEmpty()) { + outputsResList = outputsMap.values().stream().map(OutputDefinition::new).collect(Collectors.toList()); + } + return Either.left(outputsResList); + } + return Either.right(status); + + } + /** * Add data types into a Component. * @@ -1252,7 +1284,8 @@ public class ToscaOperationFacade { * @param componentId unique ID of Component. * @return list of data types. */ - public Either, StorageOperationStatus> addDataTypesToComponent(Map dataTypes, String componentId) { + public Either, StorageOperationStatus> addDataTypesToComponent(Map dataTypes, + String componentId) { log.trace("#addDataTypesToComponent - enter, componentId={}", componentId); @@ -1511,7 +1544,38 @@ public class ToscaOperationFacade { return Either.left(instProperties); } - public Either>, StorageOperationStatus> addComponentInstancePropertiesToComponent(Component containerComponent, Map> instProperties) { + public Either>, StorageOperationStatus> addComponentInstanceOutputsToComponent( + Component containerComponent, Map> instProperties) { + requireNonNull(instProperties); + StorageOperationStatus status; + for (final Entry> entry : instProperties.entrySet()) { + final List props = entry.getValue(); + final String componentInstanceId = entry.getKey(); + if (!isEmpty(props)) { + for (final ComponentInstanceOutput property : props) { + final List componentInstancesInputs + = containerComponent.getComponentInstancesOutputs().get(componentInstanceId); + final Optional instanceProperty = componentInstancesInputs.stream() + .filter(p -> p.getName().equals(property.getName())).findAny(); + if (instanceProperty.isPresent()) { + status = updateComponentInstanceOutput(containerComponent, componentInstanceId, property); + } else { + status = addComponentInstanceOutput(containerComponent, componentInstanceId, property); + } + if (status != StorageOperationStatus.OK) { + log.debug("Failed to update instance input {} for instance {} error {} ", property, componentInstanceId, status); + return Either.right(status); + } else { + log.trace("instance input {} for instance {} updated", property, componentInstanceId); + } + } + } + } + return Either.left(instProperties); + } + + public Either>, StorageOperationStatus> addComponentInstancePropertiesToComponent( + Component containerComponent, Map> instProperties) { requireNonNull(instProperties); for (Entry> entry : instProperties.entrySet()) { List props = entry.getValue(); @@ -1520,7 +1584,7 @@ public class ToscaOperationFacade { containerComponent.getComponentInstancesProperties().get(componentInstanceId); Map> containerComponentCapabilities = containerComponent.getCapabilities(); - if(isEmpty(props)) { + if (isEmpty(props)) { continue; } for (ComponentInstanceProperty property : props) { @@ -1528,15 +1592,38 @@ public class ToscaOperationFacade { String propertyParentUniqueId = property.getParentUniqueId(); Optional capPropDefinition = getPropertyCapability(propertyParentUniqueId, containerComponent); - if(capPropDefinition.isPresent() && MapUtils.isNotEmpty(containerComponentCapabilities)) { + if (capPropDefinition.isPresent() && MapUtils.isNotEmpty(containerComponentCapabilities)) { status = populateAndUpdateInstanceCapProperty(containerComponent, componentInstanceId, - containerComponentCapabilities, property, capPropDefinition.get()); + containerComponentCapabilities, property, capPropDefinition.get()); } - if(status == null) { + if (status == null) { status = updateOrAddComponentInstanceProperty(containerComponent, componentInstanceId, originalComponentInstProps, property); } - if(status != StorageOperationStatus.OK) { + if (status != StorageOperationStatus.OK) { + return Either.right(status); + } + } + } + return Either.left(instProperties); + } + + public Either>, StorageOperationStatus> addComponentInstanceAttributesToComponent( + final Component containerComponent, final Map> instProperties) { + requireNonNull(instProperties); + for (final Entry> entry : instProperties.entrySet()) { + final List props = entry.getValue(); + if (isEmpty(props)) { + continue; + } + final String componentInstanceId = entry.getKey(); + final List originalComponentInstProps = + containerComponent.getComponentInstancesAttributes().get(componentInstanceId); + + for (final ComponentInstanceAttribute property : props) { + final StorageOperationStatus status = updateOrAddComponentInstanceAttribute( + containerComponent, componentInstanceId, originalComponentInstProps, property); + if (status != StorageOperationStatus.OK) { return Either.right(status); } } @@ -1549,7 +1636,7 @@ public class ToscaOperationFacade { ComponentInstanceProperty property, CapabilityDefinition capabilityDefinition) { List capabilityDefinitions = containerComponentCapabilities.get(capabilityDefinition.getType()); - if(CollectionUtils.isEmpty(capabilityDefinitions)) { + if (CollectionUtils.isEmpty(capabilityDefinitions)) { return null; } Optional capDefToGetProp = capabilityDefinitions.stream() @@ -1578,13 +1665,13 @@ public class ToscaOperationFacade { } private StorageOperationStatus updateOrAddComponentInstanceProperty(Component containerComponent, - String componentInstanceId, List originalComponentInstProps, - ComponentInstanceProperty property) - { + String componentInstanceId, + List originalComponentInstProps, + ComponentInstanceProperty property) { StorageOperationStatus status; // check if the property already exists or not Optional instanceProperty = originalComponentInstProps.stream() - .filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny(); + .filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny(); if (instanceProperty.isPresent()) { status = updateComponentInstanceProperty(containerComponent, componentInstanceId, property); } else { @@ -1597,15 +1684,35 @@ public class ToscaOperationFacade { return status; } - public StorageOperationStatus updateInstanceCapabilityProperty(Component containerComponent, String componentInstanceId, + private StorageOperationStatus updateOrAddComponentInstanceAttribute(Component containerComponent, + String componentInstanceId, + List originalComponentInstProps, + ComponentInstanceAttribute property) { + StorageOperationStatus status; + // check if the property already exists or not + Optional instanceProperty = originalComponentInstProps.stream() + .filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny(); + if (instanceProperty.isPresent()) { + status = updateComponentInstanceAttribute(containerComponent, componentInstanceId, property); + } else { + status = addComponentInstanceAttribute(containerComponent, componentInstanceId, property); + } + if (status != StorageOperationStatus.OK) { + log.debug("Failed to update instance property {} for instance {} error {} ", + property, componentInstanceId, status); + } + return status; + } + + public StorageOperationStatus updateInstanceCapabilityProperty(Component containerComponent, String componentInstanceId, ComponentInstanceProperty property, CapabilityDefinition capabilityDefinition) { Optional fetchedCIOptional = containerComponent.getComponentInstanceById(componentInstanceId); - if(!fetchedCIOptional.isPresent()) { + if (!fetchedCIOptional.isPresent()) { return StorageOperationStatus.GENERAL_ERROR; } Either getComponentRes = - getToscaFullElement(fetchedCIOptional.get().getComponentUid()); + getToscaFullElement(fetchedCIOptional.get().getComponentUid()); if(getComponentRes.isRight()) { return StorageOperationStatus.GENERAL_ERROR; } @@ -2034,12 +2141,7 @@ public class ToscaOperationFacade { log.debug("failed to get vertex from graph with property normalizedName: {}", normalizedName); return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(vertexEither.right().value())); } - List vertexList = vertexEither.isLeft() ? vertexEither.left().value() : null; - if (vertexList != null && !vertexList.isEmpty()) { - return Either.left(false); - } else { - return Either.left(true); - } + return Either.left(CollectionUtils.isEmpty(vertexEither.isLeft() ? vertexEither.left().value() : null)); } private void fillNodeTypePropsMap(final Map hasProps, @@ -2650,6 +2752,10 @@ public class ToscaOperationFacade { return getToscaElementOperation(resource).deleteToscaDataElement(resource.getUniqueId(), EdgeLabelEnum.INPUTS, VertexTypeEnum.INPUTS, inputName, JsonPresentationFields.NAME); } + public StorageOperationStatus deleteOutputOfResource(final Component resource, final String outputName) { + return getToscaElementOperation(resource).deleteToscaDataElement(resource.getUniqueId(), EdgeLabelEnum.OUTPUTS, VertexTypeEnum.OUTPUTS, outputName, JsonPresentationFields.NAME); + } + /** * Deletes a data type from a component. * @param component the container which has the data type @@ -2682,21 +2788,60 @@ public class ToscaOperationFacade { } } if (result == null) { - Optional newProperty = (getUpdatedComponentRes.left().value()) - .getProperties().stream().filter(p -> p.getName().equals(newPropertyDefinition.getName())).findAny(); - if (newProperty.isPresent()) { - result = Either.left(newProperty.get()); - } else { + Optional newProperty = (getUpdatedComponentRes.left().value()) + .getProperties().stream().filter(p -> p.getName().equals(newPropertyDefinition.getName())).findAny(); + if (newProperty.isPresent()) { + result = Either.left(newProperty.get()); + } else { CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_FIND_RECENTLY_ADDED_PROPERTY_ON_THE_RESOURCE_STATUS_IS, newPropertyDefinition.getName(), component.getUniqueId(), StorageOperationStatus.NOT_FOUND); result = Either.right(StorageOperationStatus.NOT_FOUND); } - } - return result; - } + } + return result; + } - public Either addAttributeOfResource(Component component, AttributeDefinition newAttributeDef) { + public Either updateAttributeOfComponent(Component component, + AttributeDefinition newPropertyDefinition) { + + Either getUpdatedComponentRes = null; + Either result = null; + StorageOperationStatus status = getToscaElementOperation(component) + .updateToscaDataOfToscaElement(component.getUniqueId(), EdgeLabelEnum.ATTRIBUTES, VertexTypeEnum.ATTRIBUTES, + newPropertyDefinition, JsonPresentationFields.NAME); + if (status != StorageOperationStatus.OK) { + CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_ADD_THE_PROPERTY_TO_THE_RESOURCE_STATUS_IS, + newPropertyDefinition.getName(), component.getName(), status); + result = Either.right(status); + } + if (result == null) { + ComponentParametersView filter = new ComponentParametersView(true); + filter.setIgnoreProperties(false); + getUpdatedComponentRes = getToscaElement(component.getUniqueId(), filter); + if (getUpdatedComponentRes.isRight()) { + CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_GET_UPDATED_RESOURCE_STATUS_IS, + component.getUniqueId(), getUpdatedComponentRes.right().value()); + result = Either.right(status); + } + } + if (result == null) { + Optional newProperty = (getUpdatedComponentRes.left().value()) + .getAttributes().stream().filter(p -> p.getName().equals(newPropertyDefinition.getName())).findAny(); + if (newProperty.isPresent()) { + result = Either.left(newProperty.get()); + } else { + CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, + FAILED_TO_FIND_RECENTLY_ADDED_PROPERTY_ON_THE_RESOURCE_STATUS_IS, newPropertyDefinition.getName(), + component.getUniqueId(), StorageOperationStatus.NOT_FOUND); + result = Either.right(StorageOperationStatus.NOT_FOUND); + } + } + return result; + } + + public Either addAttributeOfResource(Component component, + AttributeDefinition newAttributeDef) { Either getUpdatedComponentRes = null; Either result = null; @@ -2706,7 +2851,9 @@ public class ToscaOperationFacade { newAttributeDef.setOwnerId(component.getUniqueId()); } - StorageOperationStatus status = getToscaElementOperation(component).addToscaDataToToscaElement(component.getUniqueId(), EdgeLabelEnum.ATTRIBUTES, VertexTypeEnum.ATTRIBUTES, newAttributeDef, JsonPresentationFields.NAME); + StorageOperationStatus status = getToscaElementOperation(component) + .addToscaDataToToscaElement(component.getUniqueId(), EdgeLabelEnum.ATTRIBUTES, VertexTypeEnum.ATTRIBUTES, newAttributeDef, + JsonPresentationFields.NAME); if (status != StorageOperationStatus.OK) { CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, FAILED_TO_ADD_THE_PROPERTY_TO_THE_RESOURCE_STATUS_IS, newAttributeDef.getName(), component.getName(), status); result = Either.right(status); @@ -2847,31 +2994,58 @@ public class ToscaOperationFacade { return nodeTemplateOperation.updateComponentInstanceProperties(containerComponent, componentInstanceId, properties); } + public StorageOperationStatus updateComponentInstanceAttributes(final Component containerComponent, + final String componentInstanceId, + final List attributes) { + return nodeTemplateOperation.updateComponentInstanceAttributes(containerComponent, componentInstanceId, attributes); + } - public StorageOperationStatus addComponentInstanceProperty(Component containerComponent, String componentInstanceId, ComponentInstanceProperty property) { + public StorageOperationStatus addComponentInstanceProperty(Component containerComponent, String componentInstanceId, + ComponentInstanceProperty property) { return nodeTemplateOperation.addComponentInstanceProperty(containerComponent, componentInstanceId, property); } - public StorageOperationStatus updateComponentInstanceAttribute(Component containerComponent, String componentInstanceId, ComponentInstanceAttribute property){ - return nodeTemplateOperation.updateComponentInstanceAttribute(containerComponent, componentInstanceId, property); + public StorageOperationStatus updateComponentInstanceAttribute(final Component containerComponent, + final String componentInstanceId, + final ComponentInstanceAttribute attribute) { + return nodeTemplateOperation.updateComponentInstanceAttribute(containerComponent, componentInstanceId, attribute); } - public StorageOperationStatus addComponentInstanceAttribute(Component containerComponent, String componentInstanceId, ComponentInstanceAttribute attribute){ + public StorageOperationStatus addComponentInstanceAttribute(Component containerComponent, String componentInstanceId, + ComponentInstanceAttribute attribute) { return nodeTemplateOperation.addComponentInstanceAttribute(containerComponent, componentInstanceId, attribute); } - public StorageOperationStatus updateComponentInstanceInput(Component containerComponent, String componentInstanceId, ComponentInstanceInput property) { + public StorageOperationStatus updateComponentInstanceInput(Component containerComponent, String componentInstanceId, + ComponentInstanceInput property) { return nodeTemplateOperation.updateComponentInstanceInput(containerComponent, componentInstanceId, property); } - public StorageOperationStatus updateComponentInstanceInputs(Component containerComponent, String componentInstanceId, List instanceInputs) { + public StorageOperationStatus updateComponentInstanceOutput(Component containerComponent, String componentInstanceId, + ComponentInstanceOutput property) { + return nodeTemplateOperation.updateComponentInstanceOutput(containerComponent, componentInstanceId, property); + } + + public StorageOperationStatus updateComponentInstanceInputs(Component containerComponent, String componentInstanceId, + List instanceInputs) { return nodeTemplateOperation.updateComponentInstanceInputs(containerComponent, componentInstanceId, instanceInputs); } - public StorageOperationStatus addComponentInstanceInput(Component containerComponent, String componentInstanceId, ComponentInstanceInput property) { + public StorageOperationStatus updateComponentInstanceOutputs(Component containerComponent, String componentInstanceId, + List instanceInputs) { + return nodeTemplateOperation.updateComponentInstanceOutputs(containerComponent, componentInstanceId, instanceInputs); + } + + public StorageOperationStatus addComponentInstanceInput(Component containerComponent, String componentInstanceId, + ComponentInstanceInput property) { return nodeTemplateOperation.addComponentInstanceInput(containerComponent, componentInstanceId, property); } + public StorageOperationStatus addComponentInstanceOutput(Component containerComponent, String componentInstanceId, + ComponentInstanceOutput property) { + return nodeTemplateOperation.addComponentInstanceOutput(containerComponent, componentInstanceId, property); + } + public void setNodeTypeOperation(NodeTypeOperation nodeTypeOperation) { this.nodeTypeOperation = nodeTypeOperation; } @@ -2880,17 +3054,24 @@ public class ToscaOperationFacade { this.topologyTemplateOperation = topologyTemplateOperation; } - public StorageOperationStatus deleteComponentInstanceInputsFromTopologyTemplate(Component containerComponent, List inputsToDelete) { - return topologyTemplateOperation.deleteToscaDataElements(containerComponent.getUniqueId(), EdgeLabelEnum.INPUTS, inputsToDelete.stream().map(PropertyDataDefinition::getName).collect(Collectors.toList())); + public StorageOperationStatus deleteComponentInstanceInputsFromTopologyTemplate(Component containerComponent, + List inputsToDelete) { + return topologyTemplateOperation.deleteToscaDataElements(containerComponent.getUniqueId(), EdgeLabelEnum.INPUTS, + inputsToDelete.stream().map(PropertyDataDefinition::getName).collect(Collectors.toList())); } - public StorageOperationStatus updateComponentInstanceCapabiltyProperty(Component containerComponent, String componentInstanceUniqueId, String capabilityPropertyKey, ComponentInstanceProperty property) { - return nodeTemplateOperation.updateComponentInstanceCapabilityProperty(containerComponent, componentInstanceUniqueId, capabilityPropertyKey, property); + public StorageOperationStatus updateComponentInstanceCapabiltyProperty(Component containerComponent, String componentInstanceUniqueId, + String capabilityPropertyKey, + ComponentInstanceProperty property) { + return nodeTemplateOperation + .updateComponentInstanceCapabilityProperty(containerComponent, componentInstanceUniqueId, capabilityPropertyKey, property); } - public StorageOperationStatus updateComponentInstanceCapabilityProperties(Component containerComponent, String componentInstanceUniqueId) { + public StorageOperationStatus updateComponentInstanceCapabilityProperties(Component containerComponent, + String componentInstanceUniqueId) { return convertComponentInstanceProperties(containerComponent, componentInstanceUniqueId) - .map(instanceCapProps -> topologyTemplateOperation.updateComponentInstanceCapabilityProperties(containerComponent, componentInstanceUniqueId, instanceCapProps)) + .map(instanceCapProps -> topologyTemplateOperation + .updateComponentInstanceCapabilityProperties(containerComponent, componentInstanceUniqueId, instanceCapProps)) .orElse(StorageOperationStatus.NOT_FOUND); } diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/utils/ModelConverter.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/utils/ModelConverter.java index db6a8e100f..08f672b4c8 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/utils/ModelConverter.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/utils/ModelConverter.java @@ -94,6 +94,7 @@ import org.openecomp.sdc.be.model.ComponentInstance; import org.openecomp.sdc.be.model.ComponentInstanceAttribute; import org.openecomp.sdc.be.model.ComponentInstanceInput; import org.openecomp.sdc.be.model.ComponentInstanceInterface; +import org.openecomp.sdc.be.model.ComponentInstanceOutput; import org.openecomp.sdc.be.model.ComponentInstanceProperty; import org.openecomp.sdc.be.model.DataTypeDefinition; import org.openecomp.sdc.be.model.DistributionStatusEnum; @@ -102,6 +103,7 @@ import org.openecomp.sdc.be.model.GroupInstance; import org.openecomp.sdc.be.model.InputDefinition; import org.openecomp.sdc.be.model.InterfaceDefinition; import org.openecomp.sdc.be.model.MapInterfaceInstanceDataDefinition; +import org.openecomp.sdc.be.model.OutputDefinition; import org.openecomp.sdc.be.model.PolicyDefinition; import org.openecomp.sdc.be.model.PropertyDefinition; import org.openecomp.sdc.be.model.RelationshipImpl; @@ -204,6 +206,8 @@ public class ModelConverter { convertInputs(topologyTemplate, service); + convertOutputs(topologyTemplate, service); + convertProperties(topologyTemplate, service); convertPolicies(topologyTemplate, service); @@ -282,6 +286,7 @@ public class ModelConverter { convertComponentInstances(topologyTemplate, resource); convertRelations(topologyTemplate, resource); convertInputs(topologyTemplate, resource); + convertOutputs(topologyTemplate, resource); convertGroups(topologyTemplate, resource); setCapabilitiesToComponentAndGroups(topologyTemplate, resource); convertPolicies(topologyTemplate, resource); @@ -355,6 +360,8 @@ public class ModelConverter { setComponentInstancesInputsToComponent(topologyTemplate, component); + setComponentInstancesOutputsToComponent(topologyTemplate, component); + setComponentInstancesToComponent(topologyTemplate, component); setComponentInstancesCapabilitiesToComponentAndCI(topologyTemplate, component); @@ -1347,6 +1354,18 @@ public class ModelConverter { } } + private static void convertOutputs(final TopologyTemplate topologyTemplate, final Component component) { + final Map outputsMap = topologyTemplate.getOutputs(); + if (MapUtils.isEmpty(outputsMap)) { + return; + } + final List outputList = outputsMap.values() + .stream() + .map(OutputDefinition::new) + .collect(Collectors.toList()); + component.setOutputs(outputList); + } + private static void convertProperties(Component component, TopologyTemplate topologyTemplate) { List propertiesList = component.getProperties(); if (propertiesList != null && !propertiesList.isEmpty()) { @@ -1573,6 +1592,21 @@ public class ModelConverter { } } + private static void setComponentInstancesOutputsToComponent(final TopologyTemplate topologyTemplate, final Component component) { + if (topologyTemplate.getInstOutputs() != null) { + final Map> outputs = new HashMap<>(); + for (final Entry entry : topologyTemplate.getInstOutputs().entrySet()) { + if (entry.getValue() != null && entry.getValue().getMapToscaDataDefinition() != null) { + final String key = entry.getKey(); + final List componentInstanceAttributes = entry.getValue().getMapToscaDataDefinition().entrySet().stream() + .map(e -> new ComponentInstanceOutput(e.getValue())).collect(Collectors.toList()); + outputs.put(key, componentInstanceAttributes); + } + } + component.setComponentInstancesOutputs(outputs); + } + } + private static void setComponentInstancesPropertiesToComponent(TopologyTemplate topologyTemplate, Component component) { if (topologyTemplate.getInstProperties() != null) { Map> properties = new HashMap<>(); diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/UiComponentDataTransfer.java b/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/UiComponentDataTransfer.java index 1d1c8cd9dc..c7e34fcbfa 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/UiComponentDataTransfer.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/UiComponentDataTransfer.java @@ -40,6 +40,7 @@ import org.openecomp.sdc.be.model.ComponentInstanceProperty; import org.openecomp.sdc.be.model.GroupDefinition; import org.openecomp.sdc.be.model.InputDefinition; import org.openecomp.sdc.be.model.InterfaceDefinition; +import org.openecomp.sdc.be.model.OutputDefinition; import org.openecomp.sdc.be.model.PolicyDefinition; import org.openecomp.sdc.be.model.PropertyDefinition; import org.openecomp.sdc.be.model.RequirementCapabilityRelDef; @@ -70,6 +71,7 @@ public class UiComponentDataTransfer { private List policies; private Map> requirements; private List inputs; + private List outputs; private List groups; private Map interfaces; @@ -82,7 +84,4 @@ public class UiComponentDataTransfer { private List attributes; private Map> componentInstancesInterfaces; - public UiComponentDataTransfer() { - } - } -- cgit 1.2.3-korg