Catalog alignment
[sdc.git] / asdctool / src / test / java / org / openecomp / sdc / asdctool / migration / tasks / mig1902 / SdcGroupsMigrationTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
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.asdctool.migration.tasks.mig1902;
22
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;
43
44 import java.util.ArrayList;
45 import java.util.HashMap;
46 import java.util.List;
47 import java.util.Map;
48
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;
57
58 @RunWith(MockitoJUnitRunner.class)
59 public class SdcGroupsMigrationTest {
60
61     @Mock
62     private JanusGraphDao janusGraphDao;
63     @Mock
64     private GroupTypeOperation groupTypeOperation;
65     @Mock
66     private GraphVertex topologyTemplateVertex;
67     @Mock
68     private GraphVertex groupsVertex;
69
70     @InjectMocks
71     private SdcGroupsMigration groupsMigration;
72
73     @Before
74     public void setUp() {
75         groupsMigration = new SdcGroupsMigration(janusGraphDao, groupTypeOperation);
76         when(janusGraphDao.getVertexById(any())).thenReturn(Either.left(topologyTemplateVertex));
77     }
78
79     @Test
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);
85     }
86
87     @Test
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);
93     }
94
95     @Test
96     public void handleOneContainerWhenGroupsShouldNotBeUpdated() {
97         when(janusGraphDao.getChildVertex(any(GraphVertex.class), eq(EdgeLabelEnum.GROUPS), eq(JsonParseFlagEnum.ParseAll)))
98                 .thenReturn(Either.left(groupsVertex));
99
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();
105
106     }
107
108     @Test
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();
116     }
117
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();
126     }
127
128     @Test
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();
140     }
141
142     @Test
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();
150
151     }
152
153     // A temp remark for this test - following Commit hash:    08595ad21b0c409c69e3902232f5575963199e3e [ASDC-641] – Migration workaround for deployment artifact timeout. Reviewer: Lior.
154 //    @Test
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();
166 //
167 //    }
168
169     @Test
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();
177
178         assertEquals(MigrationResult.MigrationStatus.COMPLETED, groupsMigration.migrate().getMigrationStatus());
179         verify(janusGraphDao, times(1)).commit();
180         verify(janusGraphDao, times(0)).rollback();
181     }
182
183
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();
188             gr.setType(type);
189
190             gr.setProperties(createInstanceProperties(propertyNames));
191             groupsMap.put(gr.getType(), gr);
192         }
193         return groupsMap;
194     }
195
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();
202
203     }
204
205     private GroupTypeDefinition createTypeDefinition(String[] propertyNames) {
206         GroupTypeDefinition typeDefinition = new GroupTypeDefinition();
207         typeDefinition.setProperties(createTypeProperties(propertyNames));
208         return typeDefinition;
209     }
210
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);
217         }
218         return propertyDefinitionList;
219     }
220
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);
227         }
228         return propertyDefinitionList;
229     }
230
231 }