Constraint validation for instance properties in a service
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / impl / ResourceInstanceBusinessLogicTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 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  * Modifications copyright (c) 2019 Nokia
20  * ================================================================================
21  */
22
23 package org.openecomp.sdc.be.components.impl;
24
25 import static org.junit.jupiter.api.Assertions.assertEquals;
26 import static org.junit.jupiter.api.Assertions.assertNotNull;
27 import static org.junit.jupiter.api.Assertions.assertNull;
28 import static org.mockito.ArgumentMatchers.any;
29 import static org.mockito.ArgumentMatchers.anyString;
30 import static org.mockito.Mockito.doNothing;
31 import static org.mockito.Mockito.mock;
32 import static org.mockito.Mockito.never;
33 import static org.mockito.Mockito.verify;
34 import static org.mockito.Mockito.when;
35
36 import fj.data.Either;
37 import java.util.ArrayList;
38 import java.util.HashMap;
39 import java.util.List;
40 import java.util.Map;
41 import org.junit.jupiter.api.BeforeEach;
42 import org.junit.jupiter.api.Test;
43 import org.mockito.MockitoAnnotations;
44 import org.openecomp.sdc.be.components.impl.instance.ComponentInstanceChangeOperationOrchestrator;
45 import org.openecomp.sdc.be.components.merge.instance.ComponentInstanceMergeDataBusinessLogic;
46 import org.openecomp.sdc.be.config.ConfigurationManager;
47 import org.openecomp.sdc.be.dao.api.ActionStatus;
48 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
49 import org.openecomp.sdc.be.impl.ComponentsUtils;
50 import org.openecomp.sdc.be.model.ArtifactDefinition;
51 import org.openecomp.sdc.be.model.Component;
52 import org.openecomp.sdc.be.model.ComponentInstance;
53 import org.openecomp.sdc.be.model.GroupInstance;
54 import org.openecomp.sdc.be.model.HeatParameterDefinition;
55 import org.openecomp.sdc.be.model.Resource;
56 import org.openecomp.sdc.be.model.Service;
57 import org.openecomp.sdc.be.model.User;
58 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ForwardingPathOperation;
59 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
60 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
61 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
62 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
63 import org.openecomp.sdc.be.model.operations.impl.ComponentInstanceOperation;
64 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
65 import org.openecomp.sdc.be.model.validation.ToscaFunctionValidator;
66 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
67 import org.openecomp.sdc.be.resources.data.auditing.model.ResourceCommonInfo;
68 import org.openecomp.sdc.be.resources.data.auditing.model.ResourceVersionInfo;
69 import org.openecomp.sdc.be.user.UserBusinessLogic;
70 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
71 import org.openecomp.sdc.exception.ResponseFormat;
72
73 class ResourceInstanceBusinessLogicTest extends BaseBusinessLogicMock {
74
75     private static final String RESOURCE_ID_WITH_HEAT_PARAMS = "MyResourceId";
76     private static final String RESOURCE_ID_NO_PAYLOAD = "NoHeatPayload";
77     private static final String RESOURCE_ID_NO_HEAT_PARAMS = "NoHeatParams";
78     private static final String RESOURCE_INSTANCE_ID = "MyResourceInstanceId";
79     private static final String SERVICE_ID = "MyServiceId";
80     private static final String HEAT_LABEL = "myHeat";
81     private static final String HEAT_ENV_LABEL = HEAT_LABEL + "Env";
82     private static final String USER_ID = "jh0003";
83     private static final long ARTIFACT_CREATION_TIME = System.currentTimeMillis();
84
85     private final ComponentInstanceOperation componentInstanceOperation = mock(ComponentInstanceOperation.class);
86     private final ArtifactsBusinessLogic artifactBusinessLogic = mock(ArtifactsBusinessLogic.class);
87     private final ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL = mock(ComponentInstanceMergeDataBusinessLogic.class);
88     private final ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator =
89         mock(ComponentInstanceChangeOperationOrchestrator.class);
90     private final ForwardingPathOperation forwardingPathOperation = mock(ForwardingPathOperation.class);
91     private final NodeFilterOperation serviceFilterOperation = mock(NodeFilterOperation.class);
92     private final ToscaFunctionValidator toscaFunctionValidator = mock(ToscaFunctionValidator.class);
93     private final PropertyBusinessLogic propertyBusinessLogic = mock(PropertyBusinessLogic.class);
94     private static final UserBusinessLogic userAdminManager = mock(UserBusinessLogic.class);
95     public static final ComponentsUtils componentsUtils = mock(ComponentsUtils.class);
96     public static final IGroupInstanceOperation groupInstanceOperation = mock(IGroupInstanceOperation.class);
97     public static final ToscaOperationFacade toscaOperationFacade = mock(ToscaOperationFacade.class);
98
99     static User adminUser = new User("John", "Doh", USER_ID, "", "ADMIN", null);
100
101     private final ComponentInstanceBusinessLogic bl = new ComponentInstanceBusinessLogic(elementDao, groupOperation, groupInstanceOperation,
102         groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation,
103         componentInstanceOperation, artifactBusinessLogic, compInstMergeDataBL, onChangeInstanceOperationOrchestrator,
104         forwardingPathOperation, serviceFilterOperation, artifactToscaOperation, toscaFunctionValidator, propertyBusinessLogic);
105
106     @BeforeEach
107     void setUp() throws Exception {
108         MockitoAnnotations.openMocks(this);
109         Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration()
110             .getDeploymentResourceInstanceArtifacts();
111         Map<String, Object> placeHolderData = (Map<String, Object>) deploymentResourceArtifacts.get(ArtifactsBusinessLogic.HEAT_ENV_NAME);
112
113         ArtifactDefinition heatArtifact = getHeatArtifactDefinition(USER_ID, RESOURCE_ID_WITH_HEAT_PARAMS, HEAT_LABEL, ARTIFACT_CREATION_TIME, false,
114             true);
115         Map<String, ArtifactDefinition> artifacts = new HashMap<>();
116         artifacts.put(HEAT_LABEL.toLowerCase(), heatArtifact);
117         Either<Map<String, ArtifactDefinition>, StorageOperationStatus> eitherGetResourceArtifact = Either.left(artifacts);
118         when(artifactBusinessLogic.getArtifacts(RESOURCE_ID_WITH_HEAT_PARAMS, NodeTypeEnum.Resource, ArtifactGroupTypeEnum.DEPLOYMENT,
119             null)).thenReturn(eitherGetResourceArtifact);
120
121         ArtifactDefinition heatArtifactNoPayload = getHeatArtifactDefinition(USER_ID, RESOURCE_ID_NO_PAYLOAD, HEAT_LABEL, ARTIFACT_CREATION_TIME,
122             true, false);
123         Map<String, ArtifactDefinition> artifactsNoPayload = new HashMap<>();
124         artifactsNoPayload.put(HEAT_LABEL.toLowerCase(), heatArtifactNoPayload);
125         Either<Map<String, ArtifactDefinition>, StorageOperationStatus> eitherGetResourceArtifactNoPayload = Either.left(artifactsNoPayload);
126         when(artifactBusinessLogic.getArtifacts(RESOURCE_ID_NO_PAYLOAD, NodeTypeEnum.Resource, ArtifactGroupTypeEnum.DEPLOYMENT, null)).thenReturn(
127             eitherGetResourceArtifactNoPayload);
128
129         ArtifactDefinition heatArtifactNoParams = getHeatArtifactDefinition(USER_ID, RESOURCE_ID_NO_HEAT_PARAMS, HEAT_LABEL, ARTIFACT_CREATION_TIME,
130             false, false);
131         Map<String, ArtifactDefinition> artifactsNoParams = new HashMap<>();
132         artifactsNoParams.put(HEAT_LABEL.toLowerCase(), heatArtifactNoParams);
133         Either<Map<String, ArtifactDefinition>, StorageOperationStatus> eitherGetResourceArtifactNoParams = Either.left(artifactsNoParams);
134         when(
135             artifactBusinessLogic.getArtifacts(RESOURCE_ID_NO_HEAT_PARAMS, NodeTypeEnum.Resource, ArtifactGroupTypeEnum.DEPLOYMENT, null)).thenReturn(
136             eitherGetResourceArtifactNoParams);
137
138         ArtifactDefinition eitherPlaceHolder = getArtifactPlaceHolder(RESOURCE_INSTANCE_ID, HEAT_ENV_LABEL);
139         when(artifactBusinessLogic.createArtifactPlaceHolderInfo(RESOURCE_INSTANCE_ID, HEAT_ENV_LABEL.toLowerCase(), placeHolderData, USER_ID,
140             ArtifactGroupTypeEnum.DEPLOYMENT, false)).thenReturn(eitherPlaceHolder);
141
142         when(userAdminManager.getUser(USER_ID, false)).thenReturn(adminUser);
143
144         doNothing().when(componentsUtils)
145             .auditComponent(any(ResponseFormat.class), any(User.class), any(Component.class), any(AuditingActionEnum.class),
146                 any(ResourceCommonInfo.class), any(ResourceVersionInfo.class));
147
148         ArtifactDefinition heatEnvEither = getHeatArtifactDefinition(USER_ID, RESOURCE_INSTANCE_ID, HEAT_ENV_LABEL, ARTIFACT_CREATION_TIME, true,
149             false);
150
151         when(artifactBusinessLogic.createHeatEnvPlaceHolder(any(ArrayList.class), any(ArtifactDefinition.class), anyString(),
152             anyString(), any(NodeTypeEnum.class), anyString(), any(User.class),
153             any(Component.class), any())).thenReturn(heatEnvEither);
154
155         Either<List<GroupInstance>, StorageOperationStatus> groupInstanceEitherLeft = Either.left(new ArrayList<>());
156         when(groupInstanceOperation.getAllGroupInstances(anyString(), any(NodeTypeEnum.class))).thenReturn(groupInstanceEitherLeft);
157
158         bl.setToscaOperationFacade(toscaOperationFacade);
159
160         StorageOperationStatus status = StorageOperationStatus.OK;
161         when(toscaOperationFacade.addDeploymentArtifactsToInstance(any(String.class), any(ComponentInstance.class),
162             any(Map.class))).thenReturn(status);
163         when(
164                 toscaOperationFacade.addInformationalArtifactsToInstance(any(String.class), any(ComponentInstance.class), any()))
165             .thenReturn(status);
166         when(toscaOperationFacade.addGroupInstancesToComponentInstance(any(Component.class), any(ComponentInstance.class),
167             any(), any(Map.class))).thenReturn(status);
168     }
169
170     @Test
171     void testAddResourceInstanceArtifacts() {
172         ComponentInstance resourceInstance = new ComponentInstance();
173         resourceInstance.setName(RESOURCE_INSTANCE_ID);
174         resourceInstance.setComponentUid(RESOURCE_ID_WITH_HEAT_PARAMS);
175         resourceInstance.setUniqueId(RESOURCE_INSTANCE_ID);
176         Service service = new Service();
177         service.setUniqueId(SERVICE_ID);
178
179         Map<String, String> existingEnvVersions = new HashMap<>();
180         Resource originResource = new Resource();
181         originResource.setUniqueId(RESOURCE_ID_NO_PAYLOAD);
182         ActionStatus addArtifactsRes = bl.addComponentInstanceArtifacts(service, resourceInstance, originResource, adminUser, existingEnvVersions);
183         assertEquals(ActionStatus.OK, addArtifactsRes);
184
185         Map<String, ArtifactDefinition> deploymentArtifacts = resourceInstance.getDeploymentArtifacts();
186         assertNotNull(deploymentArtifacts);
187
188         ArtifactDefinition heatDefinition = deploymentArtifacts.get(HEAT_LABEL.toLowerCase());
189         assertNotNull(heatDefinition);
190     }
191
192     @Test
193     void testAddResourceInstanceArtifactsNoParams() {
194         ComponentInstance resourceInstance = new ComponentInstance();
195         resourceInstance.setName(RESOURCE_INSTANCE_ID);
196         resourceInstance.setComponentUid(RESOURCE_ID_NO_HEAT_PARAMS);
197         resourceInstance.setUniqueId(RESOURCE_INSTANCE_ID);
198         Service service = new Service();
199         service.setUniqueId(SERVICE_ID);
200         Map<String, String> existingEnvVersions = new HashMap<>();
201         Resource originResource = new Resource();
202         originResource.setUniqueId(RESOURCE_ID_NO_PAYLOAD);
203         ActionStatus addArtifactsRes = bl.addComponentInstanceArtifacts(service, resourceInstance, originResource, adminUser, existingEnvVersions);
204          assertEquals(ActionStatus.OK, addArtifactsRes);
205
206         Map<String, ArtifactDefinition> deploymentArtifacts = resourceInstance.getDeploymentArtifacts();
207         assertNotNull(deploymentArtifacts);
208
209         ArtifactDefinition heatDefinition = deploymentArtifacts.get(HEAT_LABEL.toLowerCase());
210         assertNotNull(heatDefinition);
211
212         List<HeatParameterDefinition> heatParameters = heatDefinition.getListHeatParameters();
213         assertNull(heatParameters);
214     }
215
216     @SuppressWarnings("unchecked")
217     @Test
218     void testAddResourceInstanceArtifactsNoArtifacts() {
219         ComponentInstance resourceInstance = new ComponentInstance();
220         resourceInstance.setName(RESOURCE_INSTANCE_ID);
221         resourceInstance.setComponentUid(RESOURCE_ID_NO_PAYLOAD);
222         resourceInstance.setUniqueId(RESOURCE_INSTANCE_ID);
223         Service service = new Service();
224         service.setUniqueId(SERVICE_ID);
225         Map<String, String> existingEnvVersions = new HashMap<>();
226         Resource originResource = new Resource();
227         originResource.setUniqueId(RESOURCE_ID_NO_PAYLOAD);
228
229         ActionStatus addArtifactsRes = bl.addComponentInstanceArtifacts(service, resourceInstance, originResource, adminUser, existingEnvVersions);
230         assertEquals(ActionStatus.OK, addArtifactsRes);
231
232         Map<String, ArtifactDefinition> deploymentArtifacts = resourceInstance.getDeploymentArtifacts();
233         assertNotNull(deploymentArtifacts);
234         assertEquals(0, deploymentArtifacts.size());
235
236         verify(artifactBusinessLogic, never()).addHeatEnvArtifact(any(ArtifactDefinition.class), any(ArtifactDefinition.class), any(Service.class),
237             any(NodeTypeEnum.class), anyString());
238     }
239
240     private static ArtifactDefinition getHeatArtifactDefinition(String userId, String resourceId, String artifactName, long time,
241                                                                 boolean placeholderOnly, boolean withHeatParams) {
242         ArtifactDefinition artifactInfo = new ArtifactDefinition();
243
244         artifactInfo.setArtifactName(artifactName + ".yml");
245         artifactInfo.setArtifactType("HEAT");
246         artifactInfo.setDescription("hdkfhskdfgh");
247         artifactInfo.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
248
249         artifactInfo.setUserIdCreator(userId);
250         String fullName = "Jim H";
251         artifactInfo.setUpdaterFullName(fullName);
252         artifactInfo.setCreatorFullName(fullName);
253         artifactInfo.setCreationDate(time);
254         artifactInfo.setLastUpdateDate(time);
255         artifactInfo.setUserIdLastUpdater(userId);
256         artifactInfo.setArtifactLabel(HEAT_LABEL.toLowerCase());
257         artifactInfo.setUniqueId(UniqueIdBuilder.buildPropertyUniqueId(resourceId, artifactInfo.getArtifactLabel()));
258
259         if (!placeholderOnly) {
260             artifactInfo.setEsId(artifactInfo.getUniqueId());
261             artifactInfo.setArtifactChecksum("UEsDBAoAAAAIAAeLb0bDQz");
262
263             if (withHeatParams) {
264                 List<HeatParameterDefinition> heatParams = new ArrayList<>();
265                 HeatParameterDefinition heatParam = new HeatParameterDefinition();
266                 heatParam.setCurrentValue("11");
267                 heatParam.setDefaultValue("22");
268                 heatParam.setDescription("desc");
269                 heatParam.setName("myParam");
270                 heatParam.setType("number");
271                 heatParams.add(heatParam);
272                 artifactInfo.setListHeatParameters(heatParams);
273             }
274         }
275
276         return artifactInfo;
277     }
278
279     private static ArtifactDefinition getArtifactPlaceHolder(String resourceId, String logicalName) {
280         ArtifactDefinition artifact = new ArtifactDefinition();
281
282         artifact.setUniqueId(UniqueIdBuilder.buildPropertyUniqueId(resourceId, logicalName.toLowerCase()));
283         artifact.setArtifactLabel(logicalName.toLowerCase());
284
285         return artifact;
286     }
287 }