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.components.impl;
32 import static java.util.Arrays.asList;
33 import static org.assertj.core.api.Assertions.assertThat;
34 import static org.junit.jupiter.api.Assertions.assertEquals;
35 import static org.junit.jupiter.api.Assertions.assertThrows;
36 import static org.mockito.ArgumentMatchers.any;
37 import static org.mockito.ArgumentMatchers.anyList;
38 import static org.mockito.ArgumentMatchers.anyMap;
39 import static org.mockito.ArgumentMatchers.anyObject;
40 import static org.mockito.ArgumentMatchers.anyString;
41 import static org.mockito.Mockito.when;
43 import fj.data.Either;
44 import java.util.ArrayList;
45 import java.util.Collection;
46 import java.util.HashMap;
47 import java.util.LinkedList;
48 import java.util.List;
51 import org.junit.jupiter.api.Assertions;
52 import org.junit.jupiter.api.BeforeEach;
53 import org.junit.jupiter.api.Test;
54 import org.junit.jupiter.api.extension.ExtendWith;
55 import org.mockito.InjectMocks;
56 import org.mockito.Mock;
57 import org.mockito.junit.jupiter.MockitoExtension;
58 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
59 import org.openecomp.sdc.be.components.impl.policy.PolicyTargetsUpdateHandler;
60 import org.openecomp.sdc.be.components.validation.AccessValidations;
61 import org.openecomp.sdc.be.config.Configuration;
62 import org.openecomp.sdc.be.config.ConfigurationManager;
63 import org.openecomp.sdc.be.dao.api.ActionStatus;
64 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphDao;
65 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
66 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
67 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
68 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
69 import org.openecomp.sdc.be.impl.ComponentsUtils;
70 import org.openecomp.sdc.be.info.ArtifactTemplateInfo;
71 import org.openecomp.sdc.be.model.Component;
72 import org.openecomp.sdc.be.model.DataTypeDefinition;
73 import org.openecomp.sdc.be.model.GroupDefinition;
74 import org.openecomp.sdc.be.model.GroupInstance;
75 import org.openecomp.sdc.be.model.GroupInstanceProperty;
76 import org.openecomp.sdc.be.model.GroupTypeDefinition;
77 import org.openecomp.sdc.be.model.PropertyDefinition;
78 import org.openecomp.sdc.be.model.Resource;
79 import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
80 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElementTypeEnum;
81 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.GroupsOperation;
82 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
83 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
84 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
85 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
86 import org.openecomp.sdc.be.model.tosca.ToscaType;
87 import org.openecomp.sdc.common.api.ConfigurationSource;
88 import org.openecomp.sdc.common.api.Constants;
89 import org.openecomp.sdc.common.impl.ExternalConfiguration;
90 import org.openecomp.sdc.common.impl.FSConfigurationSource;
91 import org.openecomp.sdc.exception.ResponseFormat;
93 @ExtendWith(MockitoExtension.class)
94 class GroupBusinessLogicTest {
96 static ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(),
97 "src/test/resources/config/catalog-be");
98 static ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
100 private GroupBusinessLogic test;
102 private ApplicationDataTypeCache applicationDataTypeCache;
104 private ComponentsUtils componentsUtils;
106 private IGroupTypeOperation groupTypeOperation;
108 private GroupsOperation groupsOperation;
110 private AccessValidations accessValidations;
112 private ToscaOperationFacade toscaOperationFacade;
114 private PropertyOperation propertyOperation;
116 private JanusGraphDao janusGraphDao;
118 private PolicyTargetsUpdateHandler policyTargetsUpdateHandler;
121 public void setUp() throws Exception {
122 test.setApplicationDataTypeCache(applicationDataTypeCache);
123 test.setToscaOperationFacade(toscaOperationFacade);
124 test.setPropertyOperation(propertyOperation);
125 test.setComponentsUtils(componentsUtils);
126 test.setJanusGraphDao(janusGraphDao);
130 void testCreateGroups_NoDataType() {
131 Either<List<GroupDefinition>, ResponseFormat> result;
132 Component component = new Resource();
133 List<GroupDefinition> groupDefinitions = new ArrayList<>();
134 GroupDefinition groupDefinition = new GroupDefinition();
135 groupDefinitions.add(groupDefinition);
136 result = test.createGroups(component, groupDefinitions, true);
137 assertThat(result.isRight()).isTrue();
141 void testCreateGroups() {
142 Either<List<GroupDefinition>, ResponseFormat> result;
143 Component component = new Resource();
144 component.setUniqueId("id");
145 List<GroupDefinition> groupDefinitions = new ArrayList<>();
146 GroupDefinition groupDefinition = new GroupDefinition();
147 groupDefinition.setName("name");
148 groupDefinitions.add(groupDefinition);
149 groupDefinition.setType(Constants.DEFAULT_GROUP_VF_MODULE);
150 GroupTypeDefinition groupTypeDefinition = new GroupTypeDefinition();
151 Map<String, DataTypeDefinition> map = new HashMap<>();
152 when(groupTypeOperation.getLatestGroupTypeByType(Constants.DEFAULT_GROUP_VF_MODULE, component.getModel(), true))
153 .thenReturn(Either.left(groupTypeDefinition));
154 when(groupsOperation.createGroups(any(Component.class), anyMap())).thenReturn(Either.left(groupDefinitions));
155 when(groupsOperation.addCalculatedCapabilitiesWithProperties(anyString(), anyMap(), anyMap())).thenReturn(StorageOperationStatus.OK);
156 result = test.createGroups(component, groupDefinitions, true);
157 assertThat(result.isLeft()).isTrue();
161 void testValidUpdateVfGrpNameOnGraph() {
162 Either<List<GroupDefinition>, ResponseFormat> result;
163 Component component = new Resource();
164 component.setSystemName("name");
166 List<GroupDefinition> groupDefinitions = new ArrayList<>();
167 GroupDefinition groupDefinition = new GroupDefinition();
168 groupDefinition.setName("grp_one-1. ::module-1");
169 groupDefinition.setType(Constants.DEFAULT_GROUP_VF_MODULE);
170 groupDefinition.setDescription("desc");
171 groupDefinitions.add(groupDefinition);
173 result = test.validateUpdateVfGroupNamesOnGraph(groupDefinitions, component);
174 assertThat(result.isLeft()).isTrue();
178 void testValidAndUpdateGrpInstancePropValues_fail() {
179 String componentId = "id";
180 String instanceId = "id";
181 GroupInstance oldGroupInstance = new GroupInstance();
182 List<GroupInstanceProperty> newProperties = new ArrayList<>();
183 List<PropertyDataDefinition> properties = new LinkedList<>();
184 properties.add(new PropertyDataDefinition());
185 oldGroupInstance.setProperties(properties);
186 when(toscaOperationFacade.getToscaElement(componentId, JsonParseFlagEnum.ParseAll)).thenReturn(Either.left(new Resource()));
187 final ComponentException actualException = assertThrows(ComponentException.class,
188 () -> test.validateAndUpdateGroupInstancePropertyValues(componentId, instanceId, oldGroupInstance, newProperties));
189 assertEquals(ActionStatus.GENERAL_ERROR, actualException.getActionStatus());
193 void testCreateGroup() {
194 GroupDefinition result;
195 String componentId = "id";
196 String grpType = "grpType";
197 String userId = "userId";
198 ComponentTypeEnum compTypeEnum = ComponentTypeEnum.RESOURCE;
199 Component component = new Resource();
200 component.setName("name");
201 component.setUniqueId(componentId);
202 component.setToscaType(ToscaElementTypeEnum.TOPOLOGY_TEMPLATE.getValue());
203 List<GroupDefinition> groupDefList = new ArrayList<>();
204 Map<String, Set<String>> excludedGroupTypesMap = new HashMap<>();
205 GroupTypeDefinition groupTypeDefinition = new GroupTypeDefinition();
206 Map<String, DataTypeDefinition> map = new HashMap<>();
207 when(accessValidations.validateUserCanWorkOnComponent(componentId, compTypeEnum, userId, "CreateGroup")).thenReturn(component);
209 ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
210 configurationManager.setConfiguration(new Configuration());
211 configurationManager.getConfiguration().setExcludedGroupTypesMapping(excludedGroupTypesMap);
213 List<PropertyDefinition> properties = asList(
214 buildProperty("network_collection_type", "l3-network", "network collection type, defined with default value"));
215 groupTypeDefinition.setProperties(properties);
216 when(groupTypeOperation.getLatestGroupTypeByType(grpType, component.getModel(), false)).thenReturn(Either.left(groupTypeDefinition));
217 when(toscaOperationFacade.canAddGroups(componentId)).thenReturn(true);
218 when(groupTypeOperation.getLatestGroupTypeByType(grpType, component.getModel(), true)).thenReturn(Either.left(groupTypeDefinition));
219 when(propertyOperation.checkInnerType(any(PropertyDefinition.class))).thenReturn(Either.left("ok"));
220 when(propertyOperation.validateAndUpdatePropertyValue("string", null, "ok", map)).thenReturn(Either.left(component));
221 when(groupsOperation.addGroups(any(Resource.class), any())).thenReturn(Either.left(groupDefList));
222 when(groupsOperation.addCalculatedCapabilitiesWithProperties(anyString(), anyMap(), anyMap())).thenReturn(StorageOperationStatus.OK);
223 result = test.createGroup(componentId, compTypeEnum, grpType, userId);
224 assertThat(result.getClass()).isAssignableFrom(GroupDefinition.class);
227 private PropertyDefinition buildProperty(String name, String defaultValue, String description) {
228 PropertyDefinition property = new PropertyDefinition();
229 property.setName(name);
230 property.setDefaultValue(defaultValue);
231 property.setRequired(true);
232 property.setDescription(description);
233 property.setType(ToscaType.STRING.name().toLowerCase());
238 void testUpdateGroup() throws Exception {
240 Component component = new Resource();
241 GroupDefinition updatedGroup = new GroupDefinition();
242 List<GroupDefinition> grpdefList = new ArrayList<>();
243 updatedGroup.setName("GRP.01");
244 grpdefList.add(updatedGroup);
245 component.setUniqueId("GRP.01");
246 component.setGroups(grpdefList);
247 updatedGroup.setUniqueId("GRP.01");
248 when(accessValidations.validateUserCanWorkOnComponent("compid", ComponentTypeEnum.SERVICE, "USR01", "UpdateGroup")).thenReturn(component);
249 when(groupsOperation.updateGroup(component, updatedGroup)).thenReturn(Either.left(updatedGroup));
250 GroupDefinition Gdefinition = test.updateGroup("compid", ComponentTypeEnum.SERVICE, "GRP.01",
251 "USR01", updatedGroup);
252 Assertions.assertEquals(Gdefinition, updatedGroup);
256 void testUpdateGroup_Invalidname() throws Exception {
258 Component component = new Resource();
259 GroupDefinition updatedGroup = new GroupDefinition();
260 List<GroupDefinition> grpdefList = new ArrayList<>();
261 updatedGroup.setName("GRP~01");
262 updatedGroup.setUniqueId("GRP.01");
263 grpdefList.add(updatedGroup);
264 component.setUniqueId("GRP.01");
265 component.setGroups(grpdefList);
266 when(accessValidations.validateUserCanWorkOnComponent("compid", ComponentTypeEnum.SERVICE, "USR01", "UpdateGroup")).thenReturn(component);
267 assertThrows(ComponentException.class, () -> {
268 GroupDefinition Gdefinition = test.updateGroup("compid", ComponentTypeEnum.SERVICE, "GRP.01",
269 "USR01", updatedGroup);
274 void testDeleteGroup_exception() throws Exception {
276 Component component = new Resource();
277 GroupDefinition updatedGroup = new GroupDefinition();
278 List<GroupDefinition> grpdefList = new ArrayList<>();
279 updatedGroup.setName("GRP~01");
280 updatedGroup.setUniqueId("GRP.01");
281 grpdefList.add(updatedGroup);
282 component.setUniqueId("GRP.01");
283 component.setGroups(grpdefList);
284 when(accessValidations.validateUserCanWorkOnComponent("compid", ComponentTypeEnum.SERVICE, "USR01", "DeleteGroup")).thenReturn(component);
285 when(groupsOperation.deleteGroups(anyObject(), anyList())).thenReturn(Either.right(StorageOperationStatus.ARTIFACT_NOT_FOUND));
287 when(janusGraphDao.rollback()).thenReturn(JanusGraphOperationStatus.OK);
288 assertThrows(ComponentException.class, () -> {
289 GroupDefinition Gdefinition = test.deleteGroup("compid", ComponentTypeEnum.SERVICE, "GRP.01",
295 void testDeleteGroup() {
297 Component component = new Resource();
298 List<GroupDefinition> groupDefList = new ArrayList<>();
299 GroupDefinition updatedGroup = new GroupDefinition();
300 updatedGroup.setName("GRP~01");
301 updatedGroup.setUniqueId("GRP.01");
302 groupDefList.add(updatedGroup);
303 component.setUniqueId("GRP.01");
304 component.setGroups(groupDefList);
305 List<GroupDefinition> groupDefListCopy = new ArrayList<>();
306 groupDefListCopy.add(updatedGroup);
307 when(accessValidations.validateUserCanWorkOnComponent("compid", ComponentTypeEnum.SERVICE, "USR01", "DeleteGroup")).thenReturn(component);
308 when(groupsOperation.deleteGroups(anyObject(), anyList())).thenReturn(Either.left(groupDefListCopy));
309 when(groupsOperation.deleteCalculatedCapabilitiesWithProperties(anyString(), anyObject())).thenReturn(StorageOperationStatus.OK);
310 when(policyTargetsUpdateHandler.removePoliciesTargets(anyObject(), anyString(), anyObject())).thenReturn(ActionStatus.OK);
312 GroupDefinition Gdefinition = test.deleteGroup("compid", ComponentTypeEnum.SERVICE, "GRP.01",
314 Assertions.assertEquals(Gdefinition, updatedGroup);
318 void testValidateGenerateVfModuleGroupNames_pass() {
320 final List<ArtifactTemplateInfo> allGroups = new ArrayList<>();
321 final ArtifactTemplateInfo artifactTemplateInfo1 = new ArtifactTemplateInfo();
322 final ArtifactTemplateInfo artifactTemplateInfo2 = new ArtifactTemplateInfo();
323 artifactTemplateInfo1.setGroupName("ArtTmpInfoName1");
324 artifactTemplateInfo1.setDescription("ArtTmpInfoDesc1");
325 artifactTemplateInfo2.setGroupName("ArtTmpInfoName2");
326 artifactTemplateInfo2.setDescription("ArtTmpInfoDesc2");
327 allGroups.add(artifactTemplateInfo1);
328 allGroups.add(artifactTemplateInfo2);
330 final Either<Boolean, ResponseFormat> result = test.validateGenerateVfModuleGroupNames(allGroups, "resourceSystemName", 0);
332 Assertions.assertEquals(2, allGroups.size());
333 Assertions.assertEquals("resourceSystemName..ArtTmpInfoDesc1..module-0", allGroups.get(0).getGroupName());
334 Assertions.assertEquals("resourceSystemName..ArtTmpInfoDesc2..module-1", allGroups.get(1).getGroupName());
335 Assertions.assertTrue(result.left().value());
339 void testValidateGenerateVfModuleGroupNames_emptyArtifactDescriptionFail() {
341 final List<ArtifactTemplateInfo> allGroups = new ArrayList<>();
342 allGroups.add(new ArtifactTemplateInfo());
343 final ResponseFormat expectedResponse = new ResponseFormat(400);
344 when(componentsUtils.getResponseFormat(ActionStatus.INVALID_VF_MODULE_NAME)).thenReturn(new ResponseFormat(400));
346 final Either<Boolean, ResponseFormat> result = test.validateGenerateVfModuleGroupNames(allGroups, "resourceSystemName", 0);
348 Assertions.assertEquals(1, allGroups.size());
349 Assertions.assertNull(allGroups.get(0).getGroupName());
350 Assertions.assertEquals(expectedResponse.getStatus(), result.right().value().getStatus());
354 void testValidateGenerateVfModuleGroupNames_invalidArtifactDescriptionFail() {
356 final List<ArtifactTemplateInfo> allGroups = new ArrayList<>();
357 final ArtifactTemplateInfo artifactTemplateInfo1 = new ArtifactTemplateInfo();
358 artifactTemplateInfo1.setGroupName("ArtTmpInfoName1");
359 artifactTemplateInfo1.setDescription("!ArtTmpInfoDesc1!");
360 allGroups.add(artifactTemplateInfo1);
361 final ResponseFormat expectedResponse = new ResponseFormat(400);
362 when(componentsUtils.getResponseFormat(ActionStatus.INVALID_VF_MODULE_NAME)).thenReturn(new ResponseFormat(400));
364 final Either<Boolean, ResponseFormat> result = test.validateGenerateVfModuleGroupNames(allGroups, "resourceSystemName", 0);
366 Assertions.assertEquals(1, allGroups.size());
367 Assertions.assertEquals("ArtTmpInfoName1", allGroups.get(0).getGroupName());
368 Assertions.assertEquals(expectedResponse.getStatus(), result.right().value().getStatus());
372 void testGetNextVfModuleNameCounter_groupNull() {
374 final int resultCollection = test.getNextVfModuleNameCounter((Collection <GroupDefinition>) null);
375 final int resultMap = test.getNextVfModuleNameCounter((Map<String, GroupDefinition>) null);
377 Assertions.assertEquals(0, resultCollection);
378 Assertions.assertEquals(0, resultMap);
382 void testGetNextVfModuleNameCounter_groupEmpty() {
384 final int resultCollection = test.getNextVfModuleNameCounter(new ArrayList<>());
385 final int resultMap = test.getNextVfModuleNameCounter(new HashMap<>());
387 Assertions.assertEquals(0, resultCollection);
388 Assertions.assertEquals(0, resultMap);
392 void testGetNextVfModuleNameCounter_takesCollectionPass() {
394 final Collection<GroupDefinition> group = new ArrayList<>();
395 final GroupDefinition groupDefinition1 = new GroupDefinition();
396 final GroupDefinition groupDefinition2 = new GroupDefinition();
397 final GroupDefinition groupDefinition3 = new GroupDefinition();
398 groupDefinition1.setName("resourceSystemName..ArtTmpInfoDesc1..module-0");
399 groupDefinition2.setName("resourceSystemName..ArtTmpInfoDesc1..module-9");
400 groupDefinition3.setName("resourceSystemName..ArtTmpInfoDesc2..module-1");
401 group.add(groupDefinition1);
402 group.add(groupDefinition2);
403 group.add(groupDefinition3);
405 final int result = test.getNextVfModuleNameCounter(group);
407 Assertions.assertEquals(10, result);
411 void testGetNextVfModuleNameCounter_takesMapPass() {
413 final Map<String, GroupDefinition> group = new HashMap<>();
414 final GroupDefinition groupDefinition1 = new GroupDefinition();
415 final GroupDefinition groupDefinition2 = new GroupDefinition();
416 final GroupDefinition groupDefinition3 = new GroupDefinition();
417 groupDefinition1.setName("resourceSystemName..ArtTmpInfoDesc1..module-0");
418 groupDefinition2.setName("resourceSystemName..ArtTmpInfoDesc1..module-9");
419 groupDefinition3.setName("resourceSystemName..ArtTmpInfoDesc2..module-1");
421 group.put("first", groupDefinition1);
422 group.put("second", groupDefinition2);
423 group.put("third", groupDefinition3);
425 final int result = test.getNextVfModuleNameCounter(group);
427 Assertions.assertEquals(10, result);