3 * Copyright (c) 2018 AT&T Intellectual Property.
7 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
15 * http://www.apache.org/licenses/LICENSE-2.0
19 * Unless required by applicable law or agreed to in writing, software
21 * distributed under the License is distributed on an "AS IS" BASIS,
23 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25 * See the License for the specific language governing permissions and
27 * limitations under the License.
30 package org.openecomp.sdc.be.model.jsontitan.operations;
32 import fj.data.Either;
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.junit.runner.RunWith;
36 import org.mockito.ArgumentCaptor;
37 import org.mockito.InjectMocks;
38 import org.mockito.Mock;
39 import org.mockito.ArgumentMatchers;
40 import org.mockito.MockitoAnnotations;
41 import org.mockito.junit.MockitoJUnitRunner;
42 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
43 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
44 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
45 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
46 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
47 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
48 import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
49 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
50 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
51 import org.openecomp.sdc.be.model.Component;
52 import org.openecomp.sdc.be.model.Resource;
53 import org.openecomp.sdc.be.model.LifecycleStateEnum;
54 import org.openecomp.sdc.be.model.ComponentParametersView;
55 import org.openecomp.sdc.be.model.PolicyDefinition;
56 import org.openecomp.sdc.be.model.jsontitan.datamodel.TopologyTemplate;
57 import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElement;
58 import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElementTypeEnum;
59 import org.openecomp.sdc.be.model.jsontitan.utils.ModelConverter;
60 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
61 import static org.assertj.core.api.Assertions.assertThat;
63 import java.util.HashMap;
64 import java.util.List;
66 import java.util.ArrayList;
67 import java.util.EnumMap;
68 import java.util.stream.Collectors;
69 import java.util.stream.IntStream;
71 import static org.junit.Assert.assertEquals;
72 import static org.junit.Assert.assertSame;
73 import static org.junit.Assert.assertTrue;
74 import static org.mockito.Mockito.when;
75 import static org.mockito.ArgumentMatchers.any;
76 import static org.mockito.ArgumentMatchers.anyMap;
77 import static org.mockito.ArgumentMatchers.anyInt;
78 import static org.mockito.ArgumentMatchers.eq;
80 @RunWith(MockitoJUnitRunner.class)
81 public class ToscaOperationFacadeTest {
84 private ToscaOperationFacade testInstance;
87 private TitanDao titanDaoMock;
90 private TopologyTemplateOperation topologyTemplateOperationMock;
93 public void setUp() throws Exception {
94 testInstance = new ToscaOperationFacade();
95 MockitoAnnotations.initMocks(this);
98 @SuppressWarnings("unchecked")
100 public void fetchMetaDataByResourceType() throws Exception {
101 ArgumentCaptor<Map> criteriaCapture = ArgumentCaptor.forClass(Map.class);
102 ArgumentCaptor<Map> criteriaNotCapture = ArgumentCaptor.forClass(Map.class);
103 ComponentParametersView dataFilter = new ComponentParametersView();
104 List<GraphVertex> mockVertices = getMockVertices(2);
105 Either<List<GraphVertex>, TitanOperationStatus> returnedVertices = Either.left(mockVertices);
107 when(titanDaoMock.getByCriteria(eq(null), criteriaCapture.capture(), criteriaNotCapture.capture(), eq(JsonParseFlagEnum.ParseMetadata))).thenReturn(returnedVertices);
108 when(topologyTemplateOperationMock.getToscaElement(mockVertices.get(0), dataFilter)).thenReturn(Either.left(getResourceToscaElement("0")));
109 when(topologyTemplateOperationMock.getToscaElement(mockVertices.get(1), dataFilter)).thenReturn(Either.left(getResourceToscaElement("1")));
110 Either<List<Component>, StorageOperationStatus> fetchedComponents = testInstance.fetchMetaDataByResourceType(ResourceTypeEnum.VF.getValue(), dataFilter);
112 verifyCriteriaForHighestVersionAndVfResourceType(criteriaCapture);
113 verifyCriteriaNotIsDeleted(criteriaNotCapture);
115 assertTrue(fetchedComponents.isLeft());
116 List<Component> cmpts = fetchedComponents.left().value();
117 assertEquals(2, cmpts.size());
118 assertEquals("0", cmpts.get(0).getUniqueId());
119 assertEquals("1", cmpts.get(1).getUniqueId());
122 private void verifyCriteriaForHighestVersionAndVfResourceType(ArgumentCaptor<Map> criteriaCapture) {
123 Map<GraphPropertyEnum, Object> criteria = (Map<GraphPropertyEnum, Object>)criteriaCapture.getValue();
124 assertEquals(2, criteria.size());
125 assertEquals(criteria.get(GraphPropertyEnum.RESOURCE_TYPE), "VF");
126 assertEquals(criteria.get(GraphPropertyEnum.IS_HIGHEST_VERSION), true);
129 private void verifyCriteriaNotIsDeleted(ArgumentCaptor<Map> criteriaNotCapture) {
130 Map<GraphPropertyEnum, Object> notCriteria = (Map<GraphPropertyEnum, Object>)criteriaNotCapture.getValue();
131 assertEquals(1, notCriteria.size());
132 assertEquals(notCriteria.get(GraphPropertyEnum.IS_DELETED), true);
135 @SuppressWarnings("unchecked")
137 public void fetchMetaDataByResourceType_failedToGetData() throws Exception {
138 when(titanDaoMock.getByCriteria(eq(null), anyMap(), anyMap(), eq(JsonParseFlagEnum.ParseMetadata))).thenReturn(Either.right(TitanOperationStatus.GENERAL_ERROR));
139 Either<List<Component>, StorageOperationStatus> fetchedComponents = testInstance.fetchMetaDataByResourceType(ResourceTypeEnum.VF.getValue(), new ComponentParametersView());
140 assertTrue(fetchedComponents.isRight());
141 assertEquals(StorageOperationStatus.GENERAL_ERROR, fetchedComponents.right().value());
145 public void associatePolicyToComponentSuccessTest(){
146 Either<PolicyDefinition, StorageOperationStatus> result = associatePolicyToComponentWithStatus(StorageOperationStatus.OK);
147 assertTrue(result.isLeft());
151 public void associatePolicyToComponentFailureTest(){
152 Either<PolicyDefinition, StorageOperationStatus> result = associatePolicyToComponentWithStatus(StorageOperationStatus.BAD_REQUEST);
153 assertTrue(result.isRight() && result.right().value() == StorageOperationStatus.BAD_REQUEST);
157 public void updatePolicyOfComponentSuccessTest(){
158 Either<PolicyDefinition, StorageOperationStatus> result = updatePolicyOfComponentWithStatus(StorageOperationStatus.OK);
159 assertTrue(result.isLeft());
163 public void updatePolicyOfComponentFailureTest(){
164 Either<PolicyDefinition, StorageOperationStatus> result = updatePolicyOfComponentWithStatus(StorageOperationStatus.NOT_FOUND);
165 assertTrue(result.isRight() && result.right().value() == StorageOperationStatus.NOT_FOUND);
169 public void removePolicyFromComponentSuccessTest(){
170 removePolicyFromComponentWithStatus(StorageOperationStatus.OK);
174 public void removePolicyFromComponentFailureTest(){
175 removePolicyFromComponentWithStatus(StorageOperationStatus.NOT_FOUND);
179 public void testFindLastCertifiedToscaElementByUUID(){
180 Either<Component, StorageOperationStatus> result;
181 Component component = new Resource();
182 List<GraphVertex> list = new ArrayList<>();
183 GraphVertex graphVertex = getTopologyTemplateVertex();
184 list.add(graphVertex);
185 Map<GraphPropertyEnum, Object> props = new EnumMap<>(GraphPropertyEnum.class);
186 props.put(GraphPropertyEnum.UUID, component.getUUID());
187 props.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name());
188 props.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
189 TopologyTemplate toscaElement = new TopologyTemplate();
190 toscaElement.setComponentType(ComponentTypeEnum.RESOURCE);
191 when(topologyTemplateOperationMock.getToscaElement(ArgumentMatchers.eq(graphVertex),any(ComponentParametersView.class))).thenReturn(Either.left(toscaElement));
192 when(titanDaoMock.getByCriteria(ModelConverter.getVertexType(component), props)).thenReturn(Either.left(list));
193 result = testInstance.findLastCertifiedToscaElementByUUID(component);
194 Component resultComp = result.left().value();
195 assertEquals(resultComp.getToscaType(),ToscaElementTypeEnum.TOPOLOGY_TEMPLATE.getValue());
199 public void testLatestComponentByToscaResourceName(){
200 Either<Component, StorageOperationStatus> result;
201 TopologyTemplate toscaElement = new TopologyTemplate();
202 toscaElement.setComponentType(ComponentTypeEnum.SERVICE);
203 List<GraphVertex> list = new ArrayList<>();
204 GraphVertex graphVertex = getTopologyTemplateVertex();
205 Map<GraphPropertyEnum, Object> props = new HashMap<>();
206 props.put(GraphPropertyEnum.VERSION, "1.0");
207 graphVertex.setMetadataProperties(props);
208 list.add(graphVertex);
210 Map<GraphPropertyEnum, Object> propertiesToMatch = new EnumMap<>(GraphPropertyEnum.class);
211 Map<GraphPropertyEnum, Object> propertiesNotToMatch = new EnumMap<>(GraphPropertyEnum.class);
212 propertiesToMatch.put(GraphPropertyEnum.TOSCA_RESOURCE_NAME, "toscaResourceName");
213 propertiesToMatch.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
214 propertiesNotToMatch.put(GraphPropertyEnum.IS_DELETED, true);
216 when(titanDaoMock.getByCriteria(null, propertiesToMatch, propertiesNotToMatch, JsonParseFlagEnum.ParseAll)).thenReturn(Either.left(list));
217 when(topologyTemplateOperationMock.getToscaElement(ArgumentMatchers.eq(graphVertex),any(ComponentParametersView.class))).thenReturn(Either.left(toscaElement));
219 result = testInstance.getFullLatestComponentByToscaResourceName("toscaResourceName");
220 assertThat(result.isLeft());
224 public void testValidateCsarUuidUniqueness() {
225 StorageOperationStatus result;
226 String csarUUID = "csarUUID";
227 Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
228 properties.put(GraphPropertyEnum.CSAR_UUID, csarUUID);
229 List<GraphVertex> vertexList = new ArrayList<>();
230 when(titanDaoMock.getByCriteria(null, properties, JsonParseFlagEnum.ParseMetadata)).thenReturn(Either.left(vertexList));
231 result = testInstance.validateCsarUuidUniqueness(csarUUID);
232 assertEquals(StorageOperationStatus.ENTITY_ALREADY_EXISTS, result);
236 public void testValidateCsarUuidUnique_true() {
237 StorageOperationStatus result;
238 String csarUUID = "csarUUID";
239 Map<GraphPropertyEnum, Object> properties = new EnumMap<>(GraphPropertyEnum.class);
240 properties.put(GraphPropertyEnum.CSAR_UUID, csarUUID);
241 when(titanDaoMock.getByCriteria(null, properties, JsonParseFlagEnum.ParseMetadata)).thenReturn(Either.right(TitanOperationStatus.NOT_FOUND));
242 result = testInstance.validateCsarUuidUniqueness(csarUUID);
243 assertEquals(StorageOperationStatus.OK, result);
247 public void testGetLatestCertiNodeTypeByToscaResourceName() {
248 Either<Resource, StorageOperationStatus> result;
249 String toscaResourceName = "resourceName";
250 String uniqueId = "uniqueId";
251 GraphVertex graphVertex = getTopologyTemplateVertex();
252 graphVertex.setJsonMetadataField(JsonPresentationFields.VERSION, "1.0");
253 graphVertex.setUniqueId(uniqueId);
254 List<GraphVertex> vertexList = new ArrayList<>();
255 vertexList.add(graphVertex);
256 Map<GraphPropertyEnum, Object> props = new EnumMap<>(GraphPropertyEnum.class);
257 props.put(GraphPropertyEnum.TOSCA_RESOURCE_NAME, toscaResourceName);
258 props.put(GraphPropertyEnum.IS_HIGHEST_VERSION, true);
259 props.put(GraphPropertyEnum.STATE, LifecycleStateEnum.CERTIFIED.name());
260 ToscaElement topologyTemplate = new TopologyTemplate();
261 topologyTemplate.setComponentType(ComponentTypeEnum.SERVICE);
262 when(titanDaoMock.getByCriteria(VertexTypeEnum.NODE_TYPE, props, JsonParseFlagEnum.ParseMetadata)).thenReturn(Either.left(vertexList));
263 when(titanDaoMock.getVertexById(uniqueId, JsonParseFlagEnum.ParseAll)).thenReturn(Either.left(graphVertex));
264 when(topologyTemplateOperationMock.getToscaElement(any(GraphVertex.class), any(ComponentParametersView.class))).thenReturn(Either.left(topologyTemplate));
265 result = testInstance.getLatestCertifiedNodeTypeByToscaResourceName(toscaResourceName);
266 assertThat(result.isLeft());
269 private Either<PolicyDefinition, StorageOperationStatus> associatePolicyToComponentWithStatus(StorageOperationStatus status) {
270 PolicyDefinition policy = new PolicyDefinition();
271 String componentId = "componentId";
274 if(status == StorageOperationStatus.OK){
275 vertex = getTopologyTemplateVertex();
277 vertex = getNodeTypeVertex();
279 Either<GraphVertex, TitanOperationStatus> getVertexEither = Either.left(vertex);
280 when(titanDaoMock.getVertexById(eq(componentId), eq(JsonParseFlagEnum.ParseMetadata))).thenReturn(getVertexEither);
281 when(topologyTemplateOperationMock.addPolicyToToscaElement(eq(vertex), any(PolicyDefinition.class), anyInt())).thenReturn(status);
282 return testInstance.associatePolicyToComponent(componentId, policy, counter);
285 private Either<PolicyDefinition, StorageOperationStatus> updatePolicyOfComponentWithStatus(StorageOperationStatus status) {
286 PolicyDefinition policy = new PolicyDefinition();
287 String componentId = "componentId";
288 GraphVertex vertex = getTopologyTemplateVertex();
289 when(titanDaoMock.getVertexById(eq(componentId), eq(JsonParseFlagEnum.NoParse))).thenReturn(Either.left(vertex));
290 when(topologyTemplateOperationMock.updatePolicyOfToscaElement(eq(vertex), any(PolicyDefinition.class))).thenReturn(status);
291 return testInstance.updatePolicyOfComponent(componentId, policy);
294 private void removePolicyFromComponentWithStatus(StorageOperationStatus status) {
295 String componentId = "componentId";
296 String policyId = "policyId";
297 GraphVertex vertex = getTopologyTemplateVertex();
298 Either<GraphVertex, TitanOperationStatus> getVertexEither = Either.left(vertex);
299 when(titanDaoMock.getVertexById(eq(componentId), eq(JsonParseFlagEnum.NoParse))).thenReturn(getVertexEither);
300 when(topologyTemplateOperationMock.removePolicyFromToscaElement(eq(vertex), eq(policyId))).thenReturn(status);
301 StorageOperationStatus result = testInstance.removePolicyFromComponent(componentId, policyId);
302 assertSame(result, status);
305 private List<GraphVertex> getMockVertices(int numOfVertices) {
306 return IntStream.range(0, numOfVertices).mapToObj(i -> getTopologyTemplateVertex()).collect(Collectors.toList());
309 private ToscaElement getResourceToscaElement(String id) {
310 ToscaElement toscaElement = new TopologyTemplate();
311 toscaElement.setMetadata(new HashMap<>());
312 toscaElement.getMetadata().put(JsonPresentationFields.COMPONENT_TYPE.getPresentation(), "RESOURCE");
313 toscaElement.getMetadata().put(JsonPresentationFields.UNIQUE_ID.getPresentation(), id);
317 private GraphVertex getTopologyTemplateVertex() {
318 GraphVertex graphVertex = new GraphVertex();
319 graphVertex.setLabel(VertexTypeEnum.TOPOLOGY_TEMPLATE);
323 private GraphVertex getNodeTypeVertex() {
324 GraphVertex graphVertex = new GraphVertex();
325 graphVertex.setLabel(VertexTypeEnum.NODE_TYPE);