Release version 1.13.7
[sdc.git] / catalog-model / src / test / java / org / openecomp / sdc / be / model / jsonjanusgraph / operations / TopologyTemplateOperationCapabilityIntegrationTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.be.model.jsonjanusgraph.operations;
22
23 import static org.assertj.core.api.Assertions.assertThat;
24
25 import java.util.Arrays;
26 import java.util.HashMap;
27 import java.util.List;
28 import java.util.Map;
29 import javax.annotation.Resource;
30 import org.junit.jupiter.api.AfterEach;
31 import org.junit.jupiter.api.BeforeAll;
32 import org.junit.jupiter.api.BeforeEach;
33 import org.junit.jupiter.api.Test;
34 import org.openecomp.sdc.be.dao.config.JanusGraphSpringConfig;
35 import org.openecomp.sdc.be.dao.janusgraph.HealingJanusGraphDao;
36 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
37 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
38 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
39 import org.openecomp.sdc.be.datatypes.elements.MapCapabilityProperty;
40 import org.openecomp.sdc.be.datatypes.elements.MapPropertiesDataDefinition;
41 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
42 import org.openecomp.sdc.be.model.Component;
43 import org.openecomp.sdc.be.model.ComponentParametersView;
44 import org.openecomp.sdc.be.model.ModelTestBase;
45 import org.openecomp.sdc.be.model.PropertyDefinition;
46 import org.openecomp.sdc.be.model.config.ModelOperationsSpringConfig;
47 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.TopologyTemplate;
48 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
49 import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
50
51 @SpringJUnitConfig(classes = {JanusGraphSpringConfig.class, ModelOperationsSpringConfig.class})
52 public class TopologyTemplateOperationCapabilityIntegrationTest extends ModelTestBase {
53
54     private static final String CONTAINER_ID = "id";
55     private Map<String, MapCapabilityProperty> capabilitiesPropsMap;
56     private List<CapabilityPropertyDataObject> capabilitiesProperties;
57
58     @Resource
59     private TopologyTemplateOperation topologyTemplateOperation;
60
61     @Resource
62     private HealingJanusGraphDao janusGraphDao;
63     private CapabilityPropertyDataObject capabilityProperty1;
64     private CapabilityPropertyDataObject capabilityProperty2;
65     private CapabilityPropertyDataObject capabilityProperty3;
66
67     @BeforeAll
68     public static void setupBeforeClass() {
69
70         ModelTestBase.init();
71     }
72
73     @BeforeEach
74     public void setUp() throws Exception {
75
76         capabilitiesPropsMap = new HashMap<>();
77         capabilityProperty1 = new CapabilityPropertyDataObject("instance1", "capability1", "prop1", "val1");
78         capabilityProperty2 = new CapabilityPropertyDataObject("instance1", "capability2", "prop2", "val2");
79         capabilityProperty3 = new CapabilityPropertyDataObject("instance2", "capability3", "prop3", "val3");
80         capabilitiesProperties = Arrays.asList(capabilityProperty1, capabilityProperty2, capabilityProperty3);
81
82         //capablities props == Map<instance id, Map<capability id, Map<prop id, property>>>
83         capabilitiesProperties.forEach(capabilitiesProperty -> {
84             capabilitiesPropsMap.computeIfAbsent(capabilitiesProperty.getInstanceId(), k -> new MapCapabilityProperty(new HashMap<>()))
85                 .getMapToscaDataDefinition()
86                 .computeIfAbsent(capabilitiesProperty.getCapabilityId(), k -> new MapPropertiesDataDefinition(new HashMap<>()))
87                 .getMapToscaDataDefinition().computeIfAbsent(capabilitiesProperty.getPropName(),
88                     k -> new PropertyDefinition(createPropWithValue(capabilitiesProperty.getPropValue())));
89         });
90
91         GraphVertex resource = new GraphVertex(VertexTypeEnum.TOPOLOGY_TEMPLATE);
92         resource.addMetadataProperty(GraphPropertyEnum.UNIQUE_ID, CONTAINER_ID);
93         janusGraphDao.createVertex(resource);
94         GraphVertex loadedResource = janusGraphDao.getVertexById(CONTAINER_ID).left().value();
95         topologyTemplateOperation.associateElementToData(loadedResource, VertexTypeEnum.CALCULATED_CAP_PROPERTIES,
96             EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, capabilitiesPropsMap).left().value();
97     }
98
99     @AfterEach
100     public void tearDown() {
101         janusGraphDao.rollback();
102     }
103
104     @Test
105     public void overrideCalculatedCapabilityProperties() {
106         Map<String, MapCapabilityProperty> loadedCapPropsMap = fetchCapabilitiesProps(CONTAINER_ID);
107         compareCapabilitiesProperties(capabilitiesProperties, loadedCapPropsMap);
108         capabilityProperty1.setPropValue("newVal1");
109         capabilityProperty3.setPropValue("newVal3");
110         setPropertyValue(capabilitiesPropsMap, capabilityProperty1);
111         setPropertyValue(capabilitiesPropsMap, capabilityProperty3);
112         StorageOperationStatus storageOperationStatus = topologyTemplateOperation.overrideToscaDataOfToscaElement(CONTAINER_ID,
113             EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, capabilitiesPropsMap);
114         assertThat(storageOperationStatus).isEqualTo(StorageOperationStatus.OK);
115         Map<String, MapCapabilityProperty> updatedCapPropsMap = fetchCapabilitiesProps(CONTAINER_ID);
116         compareCapabilitiesProperties(capabilitiesProperties, updatedCapPropsMap);
117     }
118
119     @Test
120     public void updateToscaDataDeepElementsBlockToToscaElement() {
121         assertCapabilityPropValue(capabilityProperty1, "val1");
122         assertCapabilityPropValue(capabilityProperty2, "val2");
123         assertCapabilityPropValue(capabilityProperty3, "val3");
124
125         MapCapabilityProperty instance1Props = capabilitiesPropsMap.get("instance1");
126         capabilityProperty1.setPropValue("newVal1");
127         setPropertyValue(capabilitiesPropsMap, capabilityProperty1);
128
129         capabilityProperty3.setPropValue("newVal3");
130         setPropertyValue(capabilitiesPropsMap, capabilityProperty3);
131
132         Component component = new org.openecomp.sdc.be.model.Resource();
133         component.setUniqueId(CONTAINER_ID);
134         StorageOperationStatus updateStatus = topologyTemplateOperation.updateToscaDataDeepElementsBlockToToscaElement(CONTAINER_ID,
135             EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, instance1Props, "instance1");
136
137         assertThat(updateStatus).isEqualTo(StorageOperationStatus.OK);
138         assertCapabilityPropValue(capabilityProperty1, "newVal1");
139         assertCapabilityPropValue(capabilityProperty2, "val2");
140         assertCapabilityPropValue(capabilityProperty3, "val3");//only instance1 props should be updated
141     }
142
143     private Map<String, MapCapabilityProperty> fetchCapabilitiesProps(String containerId) {
144         ComponentParametersView capabilityPropsFilter = new ComponentParametersView(true);
145         capabilityPropsFilter.setIgnoreCapabiltyProperties(false);
146         return ((TopologyTemplate) topologyTemplateOperation.getToscaElement(containerId, capabilityPropsFilter).left()
147             .value()).getCalculatedCapabilitiesProperties();
148     }
149
150     private void compareCapabilitiesProperties(List<CapabilityPropertyDataObject> expected, Map<String, MapCapabilityProperty> actual) {
151         expected.forEach(expectedCapabilityProp -> {
152             assertThat(
153                 getPropertyValue(actual, expectedCapabilityProp.instanceId, expectedCapabilityProp.capabilityId, expectedCapabilityProp.propName))
154                 .isEqualTo(expectedCapabilityProp.propValue);
155         });
156     }
157
158     private String getPropertyValue(Map<String, MapCapabilityProperty> capabilityPropertyMap, String instance, String capability, String prop) {
159         return capabilityPropertyMap.get(instance).getMapToscaDataDefinition().get(capability).getMapToscaDataDefinition().get(prop).getValue();
160     }
161
162     private void setPropertyValue(Map<String, MapCapabilityProperty> capabilityPropertyMap, CapabilityPropertyDataObject capabilityProperty) {
163         setPropertyValue(capabilityPropertyMap.get(capabilityProperty.getInstanceId()), capabilityProperty);
164
165     }
166
167     private void setPropertyValue(MapCapabilityProperty capabilitiesInstanceProperties, CapabilityPropertyDataObject capabilityProperty) {
168         capabilitiesInstanceProperties.getMapToscaDataDefinition().get(capabilityProperty.getCapabilityId())
169             .getMapToscaDataDefinition().get(capabilityProperty.getPropName())
170             .setValue(capabilityProperty.getPropValue());
171     }
172
173     private void assertCapabilityPropValue(CapabilityPropertyDataObject prop, String expectedValue) {
174         Map<String, MapCapabilityProperty> loadedCapPropsMap = fetchCapabilitiesProps(CONTAINER_ID);
175         String propertyValue = getPropertyValue(loadedCapPropsMap, prop.getInstanceId(), prop.getCapabilityId(), prop.getPropName());
176         assertThat(propertyValue).isEqualTo(expectedValue);
177     }
178
179
180     private PropertyDefinition createPropWithValue(String val) {
181         PropertyDefinition propertyDefinition = new PropertyDefinition();
182         propertyDefinition.setValue(val);
183         return propertyDefinition;
184     }
185
186     private static class CapabilityPropertyDataObject {
187
188         private String instanceId;
189         private String capabilityId;
190         private String propName;
191         private String propValue;
192
193         CapabilityPropertyDataObject(String instanceId, String capabilityId, String propName, String propValue) {
194             this.instanceId = instanceId;
195             this.capabilityId = capabilityId;
196             this.propName = propName;
197             this.propValue = propValue;
198         }
199
200         String getInstanceId() {
201             return instanceId;
202         }
203
204         String getCapabilityId() {
205             return capabilityId;
206         }
207
208         String getPropName() {
209             return propName;
210         }
211
212         String getPropValue() {
213             return propValue;
214         }
215
216         void setPropValue(String propValue) {
217             this.propValue = propValue;
218         }
219     }
220 }