Added oparent to sdc main
[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 org.junit.After;
24 import org.junit.Before;
25 import org.junit.BeforeClass;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.openecomp.sdc.be.dao.config.JanusGraphSpringConfig;
29 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
30 import org.openecomp.sdc.be.dao.jsongraph.HealingJanusGraphDao;
31 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
32 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
33 import org.openecomp.sdc.be.datatypes.elements.MapCapabilityProperty;
34 import org.openecomp.sdc.be.datatypes.elements.MapPropertiesDataDefinition;
35 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
36 import org.openecomp.sdc.be.model.Component;
37 import org.openecomp.sdc.be.model.ComponentParametersView;
38 import org.openecomp.sdc.be.model.ModelTestBase;
39 import org.openecomp.sdc.be.model.PropertyDefinition;
40 import org.openecomp.sdc.be.model.config.ModelOperationsSpringConfig;
41 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.TopologyTemplate;
42 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
43 import org.springframework.test.context.ContextConfiguration;
44 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
45
46 import javax.annotation.Resource;
47 import java.util.Arrays;
48 import java.util.HashMap;
49 import java.util.List;
50 import java.util.Map;
51
52 import static org.assertj.core.api.Assertions.assertThat;
53
54 @RunWith(SpringJUnit4ClassRunner.class)
55 @ContextConfiguration(classes = {JanusGraphSpringConfig.class, ModelOperationsSpringConfig.class})
56 public class TopologyTemplateOperationCapabilityIntegrationTest extends ModelTestBase {
57
58     private static final String CONTAINER_ID = "id";
59     private Map<String, MapCapabilityProperty> capabilitiesPropsMap;
60     private List<CapabilityPropertyDataObject> capabilitiesProperties;
61
62     @Resource
63     private TopologyTemplateOperation topologyTemplateOperation;
64
65     @Resource
66     private HealingJanusGraphDao janusGraphDao;
67     private CapabilityPropertyDataObject capabilityProperty1;
68     private CapabilityPropertyDataObject capabilityProperty2;
69     private CapabilityPropertyDataObject capabilityProperty3;
70
71     @BeforeClass
72     public static void setupBeforeClass() {
73
74         ModelTestBase.init();
75     }
76
77     @Before
78     public void setUp() throws Exception {
79
80         capabilitiesPropsMap = new HashMap<>();
81         capabilityProperty1 = new CapabilityPropertyDataObject("instance1", "capability1", "prop1", "val1");
82         capabilityProperty2 = new CapabilityPropertyDataObject("instance1", "capability2", "prop2", "val2");
83         capabilityProperty3 = new CapabilityPropertyDataObject("instance2", "capability3", "prop3", "val3");
84         capabilitiesProperties = Arrays.asList(capabilityProperty1, capabilityProperty2, capabilityProperty3);
85
86
87         //capablities props == Map<instance id, Map<capability id, Map<prop id, property>>>
88         capabilitiesProperties.forEach(capabilitiesProperty -> {
89             capabilitiesPropsMap.computeIfAbsent(capabilitiesProperty.getInstanceId(), k -> new MapCapabilityProperty(new HashMap<>()))
90                              .getMapToscaDataDefinition().computeIfAbsent(capabilitiesProperty.getCapabilityId(), k -> new MapPropertiesDataDefinition(new HashMap<>()))
91                              .getMapToscaDataDefinition().computeIfAbsent(capabilitiesProperty.getPropName(), k -> new PropertyDefinition(createPropWithValue(capabilitiesProperty.getPropValue())));
92         });
93
94         GraphVertex resource = new GraphVertex(VertexTypeEnum.TOPOLOGY_TEMPLATE);
95         resource.addMetadataProperty(GraphPropertyEnum.UNIQUE_ID, CONTAINER_ID);
96         janusGraphDao.createVertex(resource);
97         GraphVertex loadedResource = janusGraphDao.getVertexById(CONTAINER_ID).left().value();
98         topologyTemplateOperation.associateElementToData(loadedResource, VertexTypeEnum.CALCULATED_CAP_PROPERTIES, EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, capabilitiesPropsMap).left().value();
99     }
100
101     @After
102     public void tearDown() {
103         janusGraphDao.rollback();
104     }
105
106     @Test
107     public void overrideCalculatedCapabilityProperties() {
108         Map<String, MapCapabilityProperty> loadedCapPropsMap = fetchCapabilitiesProps(CONTAINER_ID);
109         compareCapabilitiesProperties(capabilitiesProperties, loadedCapPropsMap);
110         capabilityProperty1.setPropValue("newVal1");
111         capabilityProperty3.setPropValue("newVal3");
112         setPropertyValue(capabilitiesPropsMap, capabilityProperty1);
113         setPropertyValue(capabilitiesPropsMap, capabilityProperty3);
114         StorageOperationStatus storageOperationStatus = topologyTemplateOperation.overrideToscaDataOfToscaElement(CONTAINER_ID, EdgeLabelEnum.CALCULATED_CAP_PROPERTIES, capabilitiesPropsMap);
115         assertThat(storageOperationStatus).isEqualTo(StorageOperationStatus.OK);
116         Map<String, MapCapabilityProperty> updatedCapPropsMap = fetchCapabilitiesProps(CONTAINER_ID);
117         compareCapabilitiesProperties(capabilitiesProperties, updatedCapPropsMap);
118     }
119
120     @Test
121     public void updateToscaDataDeepElementsBlockToToscaElement() {
122         assertCapabilityPropValue(capabilityProperty1, "val1");
123         assertCapabilityPropValue(capabilityProperty2, "val2");
124         assertCapabilityPropValue(capabilityProperty3, "val3");
125
126         MapCapabilityProperty instance1Props = capabilitiesPropsMap.get("instance1");
127         capabilityProperty1.setPropValue("newVal1");
128         setPropertyValue(capabilitiesPropsMap, capabilityProperty1);
129
130         capabilityProperty3.setPropValue("newVal3");
131         setPropertyValue(capabilitiesPropsMap, capabilityProperty3);
132
133         Component component = new org.openecomp.sdc.be.model.Resource();
134         component.setUniqueId(CONTAINER_ID);
135         StorageOperationStatus updateStatus = topologyTemplateOperation.updateToscaDataDeepElementsBlockToToscaElement(CONTAINER_ID, 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().value()).getCalculatedCapabilitiesProperties();
147     }
148
149     private void compareCapabilitiesProperties(List<CapabilityPropertyDataObject> expected, Map<String, MapCapabilityProperty> actual) {
150         expected.forEach(expectedCapabilityProp -> {
151             assertThat(getPropertyValue(actual, expectedCapabilityProp.instanceId, expectedCapabilityProp.capabilityId, expectedCapabilityProp.propName))
152                     .isEqualTo(expectedCapabilityProp.propValue);
153         });
154     }
155
156     private String getPropertyValue(Map<String, MapCapabilityProperty> capabilityPropertyMap, String instance, String capability, String prop) {
157         return capabilityPropertyMap.get(instance).getMapToscaDataDefinition().get(capability).getMapToscaDataDefinition().get(prop).getValue();
158     }
159
160     private void setPropertyValue(Map<String, MapCapabilityProperty> capabilityPropertyMap, CapabilityPropertyDataObject capabilityProperty) {
161         setPropertyValue(capabilityPropertyMap.get(capabilityProperty.getInstanceId()), capabilityProperty);
162
163     }
164
165     private void setPropertyValue(MapCapabilityProperty capabilitiesInstanceProperties, CapabilityPropertyDataObject capabilityProperty) {
166         capabilitiesInstanceProperties.getMapToscaDataDefinition().get(capabilityProperty.getCapabilityId())
167                                       .getMapToscaDataDefinition().get(capabilityProperty.getPropName())
168                                       .setValue(capabilityProperty.getPropValue());
169     }
170
171     private void assertCapabilityPropValue(CapabilityPropertyDataObject prop, String expectedValue) {
172         Map<String, MapCapabilityProperty> loadedCapPropsMap = fetchCapabilitiesProps(CONTAINER_ID);
173         String propertyValue = getPropertyValue(loadedCapPropsMap, prop.getInstanceId(), prop.getCapabilityId(), prop.getPropName());
174         assertThat(propertyValue).isEqualTo(expectedValue);
175     }
176
177
178     private PropertyDefinition createPropWithValue(String val) {
179         PropertyDefinition propertyDefinition = new PropertyDefinition();
180         propertyDefinition.setValue(val);
181         return propertyDefinition;
182     }
183
184     private static class CapabilityPropertyDataObject {
185         private String instanceId;
186         private String capabilityId;
187         private String propName;
188         private String propValue;
189
190         CapabilityPropertyDataObject(String instanceId, String capabilityId, String propName, String propValue) {
191             this.instanceId = instanceId;
192             this.capabilityId = capabilityId;
193             this.propName = propName;
194             this.propValue = propValue;
195         }
196
197         String getInstanceId() {
198             return instanceId;
199         }
200
201         String getCapabilityId() {
202             return capabilityId;
203         }
204
205         String getPropName() {
206             return propName;
207         }
208
209         String getPropValue() {
210             return propValue;
211         }
212
213         void setPropValue(String propValue) {
214             this.propValue = propValue;
215         }
216     }
217 }