2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2020 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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.asdctool.migration.tasks.mig1902;
23 import fj.data.Either;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 import org.mockito.InjectMocks;
28 import org.mockito.Mock;
29 import org.mockito.junit.MockitoJUnitRunner;
30 import org.openecomp.sdc.asdctool.migration.core.task.MigrationResult;
31 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
32 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
33 import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
34 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
35 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
36 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
37 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
38 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
39 import org.openecomp.sdc.be.model.GroupTypeDefinition;
40 import org.openecomp.sdc.be.model.PropertyDefinition;
41 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
42 import org.openecomp.sdc.be.model.operations.impl.GroupTypeOperation;
44 import java.util.ArrayList;
45 import java.util.HashMap;
46 import java.util.List;
49 import static org.junit.Assert.assertEquals;
50 import static org.mockito.ArgumentMatchers.any;
51 import static org.mockito.ArgumentMatchers.anyMap;
52 import static org.mockito.ArgumentMatchers.eq;
53 import static org.mockito.Mockito.doReturn;
54 import static org.mockito.Mockito.times;
55 import static org.mockito.Mockito.verify;
56 import static org.mockito.Mockito.when;
58 @RunWith(MockitoJUnitRunner.class)
59 public class SdcGroupsMigrationTest {
62 private JanusGraphDao janusGraphDao;
64 private GroupTypeOperation groupTypeOperation;
66 private GraphVertex topologyTemplateVertex;
68 private GraphVertex groupsVertex;
71 private SdcGroupsMigration groupsMigration;
75 groupsMigration = new SdcGroupsMigration(janusGraphDao, groupTypeOperation);
76 when(janusGraphDao.getVertexById(any())).thenReturn(Either.left(topologyTemplateVertex));
80 public void handleOneContainerWhenErrorHappened() {
81 when(janusGraphDao.getChildVertex(any(GraphVertex.class), eq(EdgeLabelEnum.GROUPS), eq(JsonParseFlagEnum.ParseAll)))
82 .thenReturn(Either.right(JanusGraphOperationStatus.MATCH_NOT_FOUND));
83 StorageOperationStatus status = groupsMigration.handleOneContainer(topologyTemplateVertex);
84 assertEquals(StorageOperationStatus.MATCH_NOT_FOUND, status);
88 public void handleOneContainerWhenNoGroups() {
89 when(janusGraphDao.getChildVertex(any(GraphVertex.class), eq(EdgeLabelEnum.GROUPS), eq(JsonParseFlagEnum.ParseAll)))
90 .thenReturn(Either.right(JanusGraphOperationStatus.NOT_FOUND));
91 StorageOperationStatus status = groupsMigration.handleOneContainer(topologyTemplateVertex);
92 assertEquals(StorageOperationStatus.OK, status);
96 public void handleOneContainerWhenGroupsShouldNotBeUpdated() {
97 when(janusGraphDao.getChildVertex(any(GraphVertex.class), eq(EdgeLabelEnum.GROUPS), eq(JsonParseFlagEnum.ParseAll)))
98 .thenReturn(Either.left(groupsVertex));
100 doReturn(buildGroupInstancesMap(new String[] {"org.openecomp.groups.heat.HeatStack", "org.openecomp.groups.VfModule"}, new String[]{}))
101 .when(groupsVertex).getJson();
102 StorageOperationStatus status = groupsMigration.handleOneContainer(topologyTemplateVertex);
103 assertEquals(StorageOperationStatus.OK, status);
104 verify(janusGraphDao, times(0)).commit();
109 public void handleOneContainerWhenGroupsShouldBeUpdated() {
110 mockLatestGroupMapCreating();
111 mockUpgradeHappyFlow();
112 StorageOperationStatus status = groupsMigration.handleOneContainer(topologyTemplateVertex);
113 assertEquals(StorageOperationStatus.OK, status);
114 verify(janusGraphDao, times(1)).commit();
115 verify(janusGraphDao, times(0)).rollback();
118 private void mockUpgradeHappyFlow() {
119 when(janusGraphDao.getChildVertex(any(GraphVertex.class), eq(EdgeLabelEnum.GROUPS), eq(JsonParseFlagEnum.ParseAll)))
120 .thenReturn(Either.left(groupsVertex));
121 when(janusGraphDao.updateVertex(any(GraphVertex.class))).thenReturn(Either.left(groupsVertex));
122 when(janusGraphDao.commit()).thenReturn(JanusGraphOperationStatus.OK);
123 doReturn(buildGroupInstancesMap(new String[] {"org.openecomp.groups.NetworkCollection", "org.openecomp.groups.VfcInstanceGroup"},
124 new String[] {"old1", "old2"}))
125 .when(groupsVertex).getJson();
129 public void handleOneContainerWhenGroupsAlreadyUpdated() {
130 mockLatestGroupMapCreating();
131 when(janusGraphDao.getChildVertex(any(GraphVertex.class), eq(EdgeLabelEnum.GROUPS), eq(JsonParseFlagEnum.ParseAll)))
132 .thenReturn(Either.left(groupsVertex));
133 doReturn(buildGroupInstancesMap(new String[] {"org.openecomp.groups.NetworkCollection"},
134 new String[] {"a", "b", "c", "d"}))
135 .when(groupsVertex).getJson();
136 StorageOperationStatus status = groupsMigration.handleOneContainer(topologyTemplateVertex);
137 assertEquals(StorageOperationStatus.OK, status);
138 verify(janusGraphDao, times(0)).commit();
139 verify(janusGraphDao, times(1)).rollback();
143 public void handleOneContainerWhenExceptionIsThrown() {
144 when(janusGraphDao.getChildVertex(any(GraphVertex.class), eq(EdgeLabelEnum.GROUPS), eq(JsonParseFlagEnum.ParseAll)))
145 .thenThrow(new RuntimeException());
146 StorageOperationStatus status = groupsMigration.handleOneContainer(topologyTemplateVertex);
147 assertEquals(StorageOperationStatus.GENERAL_ERROR, status);
148 verify(janusGraphDao, times(0)).commit();
149 verify(janusGraphDao, times(1)).rollback();
153 // A temp remark for this test - following Commit hash: 08595ad21b0c409c69e3902232f5575963199e3e [ASDC-641] – Migration workaround for deployment artifact timeout. Reviewer: Lior.
155 // public void migrateWhenExceptionIsThrown() {
156 // List<GraphVertex> vertexList = new ArrayList<>();
157 // vertexList.add(topologyTemplateVertex);
158 // mockLatestGroupMapCreating();
159 // when(janusGraphDao.getByCriteria(eq(VertexTypeEnum.TOPOLOGY_TEMPLATE), eq(null), anyMap(), eq(JsonParseFlagEnum.ParseAll)))
160 // .thenReturn(Either.left(vertexList));
161 // when(janusGraphDao.getChildVertex(any(GraphVertex.class), eq(EdgeLabelEnum.GROUPS), eq(JsonParseFlagEnum.ParseAll)))
162 // .thenThrow(new RuntimeException());
163 // assertEquals(MigrationResult.MigrationStatus.FAILED, groupsMigration.migrate().getMigrationStatus());
164 // verify(janusGraphDao, times(0)).commit();
165 // verify(janusGraphDao, times(1)).rollback();
170 public void migrateWhenGroupsShouldBeUpdated() {
171 List<GraphVertex> vertexList = new ArrayList<>();
172 vertexList.add(topologyTemplateVertex);
173 mockLatestGroupMapCreating();
174 when(janusGraphDao.getByCriteria(eq(VertexTypeEnum.TOPOLOGY_TEMPLATE), eq(null), anyMap(), eq(JsonParseFlagEnum.ParseAll)))
175 .thenReturn(Either.left(vertexList));
176 mockUpgradeHappyFlow();
178 assertEquals(MigrationResult.MigrationStatus.COMPLETED, groupsMigration.migrate().getMigrationStatus());
179 verify(janusGraphDao, times(1)).commit();
180 verify(janusGraphDao, times(0)).rollback();
184 private Map<String, GroupDataDefinition> buildGroupInstancesMap(String[] groupTypes, String [] propertyNames) {
185 Map<String, GroupDataDefinition> groupsMap = new HashMap<>();
186 for (String type: groupTypes) {
187 GroupDataDefinition gr = new GroupDataDefinition();
190 gr.setProperties(createInstanceProperties(propertyNames));
191 groupsMap.put(gr.getType(), gr);
196 private void mockLatestGroupMapCreating() {
197 doReturn(Either.left(createTypeDefinition(new String[] {"a", "b", "c", "d"})))
198 .when(groupTypeOperation).getLatestGroupTypeByType(eq(SdcGroupsMigration.GroupsForUpgrade.NW_COLLECTION_GROUP_NAME.getToscaType()), eq(false));
199 doReturn(Either.left(createTypeDefinition(new String[] {"l", "m", "n", "o", "p"})))
200 .when(groupTypeOperation).getLatestGroupTypeByType(eq(SdcGroupsMigration.GroupsForUpgrade.VFC_INSTANCE_GROUP_NAME.getToscaType()), eq(false));
201 groupsMigration.loadLatestGroupTypeDefinitions();
205 private GroupTypeDefinition createTypeDefinition(String[] propertyNames) {
206 GroupTypeDefinition typeDefinition = new GroupTypeDefinition();
207 typeDefinition.setProperties(createTypeProperties(propertyNames));
208 return typeDefinition;
211 private List<PropertyDefinition> createTypeProperties(String[] propertyNames) {
212 List<PropertyDefinition> propertyDefinitionList = new ArrayList<>();
213 for (String name: propertyNames) {
214 PropertyDefinition propertyDefinition = new PropertyDefinition();
215 propertyDefinition.setName(name);
216 propertyDefinitionList.add(propertyDefinition);
218 return propertyDefinitionList;
221 private List<PropertyDataDefinition> createInstanceProperties(String[] propertyNames) {
222 List<PropertyDataDefinition> propertyDefinitionList = new ArrayList<>();
223 for (String name: propertyNames) {
224 PropertyDefinition propertyDefinition = new PropertyDefinition();
225 propertyDefinition.setName(name);
226 propertyDefinitionList.add(propertyDefinition);
228 return propertyDefinitionList;