2 * ============LICENSE_START=======================================================
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
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.be.components.impl;
23 import com.fasterxml.jackson.annotation.JsonInclude;
24 import com.fasterxml.jackson.databind.DeserializationFeature;
25 import com.fasterxml.jackson.databind.ObjectMapper;
26 import com.fasterxml.jackson.databind.SerializationFeature;
27 import com.google.gson.Gson;
28 import com.google.gson.GsonBuilder;
29 import com.google.gson.JsonElement;
30 import fj.data.Either;
31 import org.junit.Before;
32 import org.junit.Test;
33 import org.mockito.InjectMocks;
34 import org.mockito.Mock;
35 import org.mockito.Mockito;
36 import org.mockito.MockitoAnnotations;
37 import org.openecomp.sdc.be.components.utils.ArtifactBuilder;
38 import org.openecomp.sdc.be.components.utils.ObjectGenerator;
39 import org.openecomp.sdc.be.config.Configuration.ArtifactTypeConfig;
40 import org.openecomp.sdc.be.config.ConfigurationManager;
41 import org.openecomp.sdc.be.dao.api.ActionStatus;
42 import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
43 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
44 import org.openecomp.sdc.be.dao.jsongraph.TitanDao;
45 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
46 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
47 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
48 import org.openecomp.sdc.be.impl.ComponentsUtils;
49 import org.openecomp.sdc.be.model.ArtifactDefinition;
50 import org.openecomp.sdc.be.model.ArtifactType;
51 import org.openecomp.sdc.be.model.HeatParameterDefinition;
52 import org.openecomp.sdc.be.model.InterfaceDefinition;
53 import org.openecomp.sdc.be.model.Resource;
54 import org.openecomp.sdc.be.model.Service;
55 import org.openecomp.sdc.be.model.User;
56 import org.openecomp.sdc.be.model.jsontitan.operations.ArtifactsOperations;
57 import org.openecomp.sdc.be.model.jsontitan.operations.NodeTemplateOperation;
58 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
59 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
60 import org.openecomp.sdc.be.model.operations.api.IGraphLockOperation;
61 import org.openecomp.sdc.be.model.operations.api.IInterfaceLifecycleOperation;
62 import org.openecomp.sdc.be.model.operations.api.IUserAdminOperation;
63 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
64 import org.openecomp.sdc.be.model.operations.impl.ArtifactOperation;
65 import org.openecomp.sdc.be.resources.data.ESArtifactData;
66 import org.openecomp.sdc.be.servlets.RepresentationUtils;
67 import org.openecomp.sdc.be.user.UserBusinessLogic;
68 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
69 import org.openecomp.sdc.common.api.ArtifactTypeEnum;
70 import org.openecomp.sdc.common.api.ConfigurationSource;
71 import org.openecomp.sdc.common.impl.ExternalConfiguration;
72 import org.openecomp.sdc.common.impl.FSConfigurationSource;
73 import org.openecomp.sdc.exception.ResponseFormat;
75 import java.io.IOException;
76 import java.util.ArrayList;
77 import java.util.Collections;
78 import java.util.HashMap;
79 import java.util.List;
82 import static org.junit.Assert.assertEquals;
83 import static org.junit.Assert.assertNull;
84 import static org.junit.Assert.assertTrue;
85 import static org.mockito.ArgumentMatchers.any;
86 import static org.mockito.ArgumentMatchers.anyBoolean;
87 import static org.mockito.ArgumentMatchers.anyString;
88 import static org.mockito.ArgumentMatchers.eq;
89 import static org.mockito.Mockito.times;
90 import static org.mockito.Mockito.verify;
91 import static org.mockito.Mockito.when;
92 import static org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic.HEAT_ENV_NAME;
93 import static org.openecomp.sdc.be.components.impl.ArtifactsBusinessLogic.HEAT_VF_ENV_NAME;
95 public class ArtifactBusinessLogicTest {
97 public static final User USER = new User("John", "Doh", "jh0003", "jh0003@gmail.com", "ADMIN", System.currentTimeMillis());
98 private final static String RESOURCE_INSTANCE_NAME = "Service-111";
99 private final static String INSTANCE_ID = "S-123-444-ghghghg";
101 private final static String ARTIFACT_NAME = "service-Myservice-template.yml";
102 private final static String ARTIFACT_LABEL = "assettoscatemplate";
103 private final static String ES_ARTIFACT_ID = "123123dfgdfgd0";
104 private final static byte[] PAYLOAD = "some payload".getBytes();
106 static ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), "src/test/resources/config/catalog-be");
107 static ConfigurationManager configurationManager = new ConfigurationManager(configurationSource);
110 private static ArtifactsBusinessLogic artifactBL;
112 private ArtifactOperation artifactOperation;
114 public ComponentsUtils componentsUtils;
116 private IInterfaceLifecycleOperation lifecycleOperation;
118 private IUserAdminOperation userOperation;
120 private IElementOperation elementOperation;
122 private ArtifactCassandraDao artifactCassandraDao;
124 public ToscaOperationFacade toscaOperationFacade;
126 private UserBusinessLogic userBusinessLogic;
128 private NodeTemplateOperation nodeTemplateOperation;
130 private ArtifactsOperations artifactsOperations;
132 private IGraphLockOperation graphLockOperation;
136 // public static final InformationDeployedArtifactsBusinessLogic
137 // informationDeployedArtifactsBusinessLogic =
138 // Mockito.mock(InformationDeployedArtifactsBusinessLogic.class);
140 public static final Resource resource = Mockito.mock(Resource.class);
141 private Gson gson = new GsonBuilder().setPrettyPrinting().create();
144 private static List<ArtifactType> getAllTypes() {
145 List<ArtifactType> artifactTypes = new ArrayList<ArtifactType>();
146 List<String> artifactTypesList = ConfigurationManager.getConfigurationManager().getConfiguration().getArtifactTypes();
147 for (String artifactType : artifactTypesList) {
148 ArtifactType artifactT = new ArtifactType();
149 artifactT.setName(artifactType);
150 artifactTypes.add(artifactT);
152 return artifactTypes;
156 public void initMocks() {
157 MockitoAnnotations.initMocks(this);
158 Either<ArtifactDefinition, StorageOperationStatus> NotFoundResult = Either.right(StorageOperationStatus.NOT_FOUND);
160 Either<Map<String, ArtifactDefinition>, StorageOperationStatus> NotFoundResult2 = Either.right(StorageOperationStatus.NOT_FOUND);
161 when(artifactOperation.getArtifacts(Mockito.anyString(), eq(NodeTypeEnum.Service), Mockito.anyBoolean())).thenReturn(NotFoundResult2);
162 when(artifactOperation.getArtifacts(Mockito.anyString(), eq(NodeTypeEnum.Resource), Mockito.anyBoolean())).thenReturn(NotFoundResult2);
164 Either<Map<String, InterfaceDefinition>, StorageOperationStatus> notFoundInterfaces = Either.right(StorageOperationStatus.NOT_FOUND);
165 when(lifecycleOperation.getAllInterfacesOfResource(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(notFoundInterfaces);
167 Either<User, ActionStatus> getUserResult = Either.left(USER);
169 when(userOperation.getUserData("jh0003", false)).thenReturn(getUserResult);
171 Either<List<ArtifactType>, ActionStatus> getType = Either.left(getAllTypes());
172 when(elementOperation.getAllArtifactTypes()).thenReturn(getType);
174 when(resource.getResourceType()).thenReturn(ResourceTypeEnum.VFC);
178 public void testValidJson() {
179 ArtifactDefinition ad = createArtifactDef();
181 String jsonArtifact = "";
183 ObjectMapper mapper = new ObjectMapper();
184 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
185 mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
186 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
189 jsonArtifact = mapper.writeValueAsString(ad);
190 } catch (IOException e) {
191 // TODO Auto-generated catch block
195 ArtifactDefinition afterConvert = RepresentationUtils.convertJsonToArtifactDefinition(jsonArtifact, ArtifactDefinition.class);
196 assertEquals(ad, afterConvert);
199 private ArtifactDefinition createArtifactDef() {
200 ArtifactDefinition ad = new ArtifactDefinition();
201 ad.setArtifactName("artifact1.yaml");
202 ad.setArtifactLabel("label1");
203 ad.setDescription("description");
204 ad.setArtifactType(ArtifactTypeEnum.HEAT.getType());
205 ad.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
206 ad.setCreationDate(System.currentTimeMillis());
207 ad.setMandatory(false);
213 public void testInvalidStringGroupType() {
214 ArtifactDefinition ad = new ArtifactDefinition();
215 ad.setArtifactName("artifact1");
216 ad.setCreationDate(System.currentTimeMillis());
217 ad.setMandatory(false);
220 JsonElement jsonArtifact = gson.toJsonTree(ad);
221 jsonArtifact.getAsJsonObject().addProperty("artifactGroupType", "www");
223 ArtifactDefinition afterConvert = RepresentationUtils.convertJsonToArtifactDefinition(jsonArtifact.toString(), ArtifactDefinition.class);
224 assertNull(afterConvert);
228 public void testInvalidNumberGroupType() {
229 ArtifactDefinition ad = new ArtifactDefinition();
230 ad.setArtifactName("artifact1");
231 ad.setCreationDate(System.currentTimeMillis());
232 ad.setMandatory(false);
235 JsonElement jsonArtifact = gson.toJsonTree(ad);
236 jsonArtifact.getAsJsonObject().addProperty("artifactGroupType", 123);
238 ArtifactDefinition afterConvert = RepresentationUtils.convertJsonToArtifactDefinition(jsonArtifact.toString(), ArtifactDefinition.class);
239 assertNull(afterConvert);
243 public void testInvalidGroupTypeWithSpace() {
244 ArtifactDefinition ad = new ArtifactDefinition();
245 ad.setArtifactName("artifact1");
246 ad.setCreationDate(System.currentTimeMillis());
247 ad.setMandatory(false);
250 JsonElement jsonArtifact = gson.toJsonTree(ad);
251 jsonArtifact.getAsJsonObject().addProperty("artifactGroupType", " DEPLOYMENT");
253 ArtifactDefinition afterConvert = RepresentationUtils.convertJsonToArtifactDefinition(jsonArtifact.toString(), ArtifactDefinition.class);
254 assertNull(afterConvert);
258 public void testInvalidTimeoutWithSpace() {
259 ArtifactDefinition ad = new ArtifactDefinition();
260 ad.setArtifactName("artifact1");
261 ad.setArtifactGroupType(ArtifactGroupTypeEnum.DEPLOYMENT);
262 ad.setCreationDate(System.currentTimeMillis());
263 ad.setMandatory(false);
265 JsonElement jsonArtifact = gson.toJsonTree(ad);
266 jsonArtifact.getAsJsonObject().addProperty("timeout", "dfsdf15");
268 ArtifactDefinition afterConvert = RepresentationUtils.convertJsonToArtifactDefinition(jsonArtifact.toString(), ArtifactDefinition.class);
269 assertNull(afterConvert);
273 public void testValidMibAritactsConfiguration() {
274 Map<String, ArtifactTypeConfig> componentDeploymentArtifacts =
275 ConfigurationManager.getConfigurationManager().getConfiguration().getResourceDeploymentArtifacts();
276 Map<String, ArtifactTypeConfig> componentInstanceDeploymentArtifacts =
277 ConfigurationManager.getConfigurationManager().getConfiguration().getResourceInstanceDeploymentArtifacts();
278 assertTrue(componentDeploymentArtifacts.containsKey(ArtifactTypeEnum.SNMP_POLL.getType()));
279 assertTrue(componentDeploymentArtifacts.containsKey(ArtifactTypeEnum.SNMP_TRAP.getType()));
280 assertTrue(componentInstanceDeploymentArtifacts.containsKey(ArtifactTypeEnum.SNMP_POLL.getType()));
281 assertTrue(componentInstanceDeploymentArtifacts.containsKey(ArtifactTypeEnum.SNMP_TRAP.getType()));
285 public void testDownloadServiceArtifactByNames() {
286 Service service = new Service();
287 String serviceName = "myService";
288 String serviceVersion = "1.0";
289 String serviceId = "serviceId";
290 service.setName(serviceName);
291 service.setVersion(serviceVersion);
292 service.setUniqueId(serviceId);
294 String artifactName = "service-Myservice-template.yml";
295 String artifactLabel = "assettoscatemplate";
296 String esArtifactId = "123123dfgdfgd0";
297 byte[] payload = "some payload".getBytes();
298 ArtifactDefinition toscaTemplateArtifact = new ArtifactDefinition();
299 toscaTemplateArtifact.setArtifactName(artifactName);
300 toscaTemplateArtifact.setArtifactType(ArtifactTypeEnum.TOSCA_TEMPLATE.getType());
301 toscaTemplateArtifact.setArtifactLabel(artifactLabel);
302 toscaTemplateArtifact.setEsId(esArtifactId);
303 toscaTemplateArtifact.setPayload(payload);
305 Map<String, ArtifactDefinition> toscaArtifacts = new HashMap<>();
306 toscaArtifacts.put(artifactLabel, toscaTemplateArtifact);
307 service.setToscaArtifacts(toscaArtifacts);
309 ESArtifactData esArtifactData =new ESArtifactData(esArtifactId);
310 esArtifactData.setDataAsArray(payload);
311 Either<ESArtifactData, CassandraOperationStatus> artifactfromESres = Either.left(esArtifactData);
312 when(artifactCassandraDao.getArtifact(esArtifactId)).thenReturn(artifactfromESres);
313 List<org.openecomp.sdc.be.model.Component> serviceList = new ArrayList<>();
314 serviceList.add(service);
315 Either<List<org.openecomp.sdc.be.model.Component>, StorageOperationStatus> getServiceRes = Either.left(serviceList);
316 when(toscaOperationFacade.getBySystemName(ComponentTypeEnum.SERVICE, serviceName)).thenReturn(getServiceRes);
317 Either<byte[], ResponseFormat> downloadServiceArtifactByNamesRes =
318 artifactBL.downloadServiceArtifactByNames(serviceName, serviceVersion, artifactName);
319 assertTrue(downloadServiceArtifactByNamesRes.isLeft());
320 assertTrue(downloadServiceArtifactByNamesRes.left().value() !=null && downloadServiceArtifactByNamesRes.left().value().length == payload.length);
324 public void createHeatEnvPlaceHolder_vf_emptyHeatParameters() throws Exception {
325 ArtifactDefinition heatArtifact = new ArtifactBuilder()
326 .addHeatParam(ObjectGenerator.buildHeatParam("defVal1", "val1"))
327 .addHeatParam(ObjectGenerator.buildHeatParam("defVal2", "val2"))
330 Resource component = new Resource();
331 when(userBusinessLogic.getUser(anyString(), anyBoolean())).thenReturn(Either.left(USER));
332 when(artifactsOperations.addHeatEnvArtifact(any(ArtifactDefinition.class), any(ArtifactDefinition.class), eq(component.getUniqueId()), eq(NodeTypeEnum.Resource), eq(true), eq("parentId")))
333 .thenReturn(Either.left(new ArtifactDefinition()));
334 Either<ArtifactDefinition, ResponseFormat> heatEnvPlaceHolder = artifactBL.createHeatEnvPlaceHolder(heatArtifact, HEAT_VF_ENV_NAME, "parentId", NodeTypeEnum.Resource, "parentName", USER, component, Collections.emptyMap());
335 assertTrue(heatEnvPlaceHolder.isLeft());
336 assertNull(heatEnvPlaceHolder.left().value().getListHeatParameters());
340 public void createHeatEnvPlaceHolder_resourceInstance_copyHeatParamasCurrValuesToHeatEnvDefaultVal() throws Exception {
341 HeatParameterDefinition heatParam1 = ObjectGenerator.buildHeatParam("defVal1", "val1");
342 HeatParameterDefinition heatParam2 = ObjectGenerator.buildHeatParam("defVal2", "val2");
343 HeatParameterDefinition heatParam3 = ObjectGenerator.buildHeatParam("defVal3", "val3");
344 ArtifactDefinition heatArtifact = new ArtifactBuilder()
345 .addHeatParam(heatParam1)
346 .addHeatParam(heatParam2)
347 .addHeatParam(heatParam3)
350 Resource component = new Resource();
352 when(userBusinessLogic.getUser(anyString(), anyBoolean())).thenReturn(Either.left(USER));
353 when(artifactsOperations.addHeatEnvArtifact(any(ArtifactDefinition.class), any(ArtifactDefinition.class), eq(component.getUniqueId()), eq(NodeTypeEnum.Resource), eq(true), eq("parentId")))
354 .thenReturn(Either.left(new ArtifactDefinition()));
356 Either<ArtifactDefinition, ResponseFormat> heatEnvPlaceHolder = artifactBL.createHeatEnvPlaceHolder(heatArtifact, HEAT_ENV_NAME, "parentId", NodeTypeEnum.ResourceInstance, "parentName", USER, component, Collections.emptyMap());
358 assertTrue(heatEnvPlaceHolder.isLeft());
359 ArtifactDefinition heatEnvArtifact = heatEnvPlaceHolder.left().value();
360 List<HeatParameterDefinition> listHeatParameters = heatEnvArtifact.getListHeatParameters();
361 assertEquals(listHeatParameters.size(), 3);
362 verifyHeatParam(listHeatParameters.get(0), heatParam1);
363 verifyHeatParam(listHeatParameters.get(1), heatParam2);
364 verifyHeatParam(listHeatParameters.get(2), heatParam3);
368 public void buildArtifactPayloadWhenShouldLockAndInTransaction() {
369 ArtifactDefinition artifactDefinition = new ArtifactDefinition();
370 artifactDefinition.setArtifactName(ARTIFACT_NAME);
371 artifactDefinition.setArtifactType(ArtifactTypeEnum.TOSCA_TEMPLATE.getType());
372 artifactDefinition.setArtifactLabel(ARTIFACT_LABEL);
373 artifactDefinition.setEsId(ES_ARTIFACT_ID);
374 artifactDefinition.setPayload(PAYLOAD);
375 artifactDefinition.setArtifactGroupType(ArtifactGroupTypeEnum.TOSCA);
377 when(graphLockOperation.lockComponent(any(), any())).thenReturn(StorageOperationStatus.OK);
378 when(artifactsOperations.updateArifactOnResource(any(ArtifactDefinition.class), any(), any(), any(NodeTypeEnum.class)
379 , any(String.class))).thenReturn(Either.left(artifactDefinition));
380 when(artifactCassandraDao.saveArtifact(any())).thenReturn(CassandraOperationStatus.OK);
381 when(componentsUtils.getResponseFormat(any(ActionStatus.class))).thenReturn(new ResponseFormat());
382 artifactBL.generateAndSaveHeatEnvArtifact(artifactDefinition, String.valueOf(PAYLOAD), ComponentTypeEnum.SERVICE, new Service(), RESOURCE_INSTANCE_NAME,
383 USER, INSTANCE_ID, true, true);
387 public void buildArtifactPayloadWhenShouldLockAndNotInTransaction() {
388 ArtifactDefinition artifactDefinition = new ArtifactDefinition();
389 artifactDefinition.setArtifactName(ARTIFACT_NAME);
390 artifactDefinition.setArtifactType(ArtifactTypeEnum.TOSCA_TEMPLATE.getType());
391 artifactDefinition.setArtifactLabel(ARTIFACT_LABEL);
392 artifactDefinition.setEsId(ES_ARTIFACT_ID);
393 artifactDefinition.setPayload(PAYLOAD);
394 artifactDefinition.setArtifactGroupType(ArtifactGroupTypeEnum.TOSCA);
396 when(graphLockOperation.lockComponent(any(), any())).thenReturn(StorageOperationStatus.OK);
397 when(artifactsOperations.updateArifactOnResource(any(ArtifactDefinition.class), any(), any(), any(NodeTypeEnum.class)
398 , any(String.class))).thenReturn(Either.left(artifactDefinition));
399 when(artifactCassandraDao.saveArtifact(any())).thenReturn(CassandraOperationStatus.OK);
400 when(componentsUtils.getResponseFormat(any(ActionStatus.class))).thenReturn(new ResponseFormat());
401 artifactBL.generateAndSaveHeatEnvArtifact(artifactDefinition, String.valueOf(PAYLOAD), ComponentTypeEnum.SERVICE, new Service(), RESOURCE_INSTANCE_NAME,
402 USER, INSTANCE_ID, true, false);
403 verify(titanDao, times(1)).commit();
406 private void verifyHeatParam(HeatParameterDefinition heatEnvParam, HeatParameterDefinition heatYamlParam) {
407 assertEquals(heatEnvParam.getDefaultValue(), heatYamlParam.getCurrentValue());
408 assertNull(heatEnvParam.getCurrentValue());
414 // public void convertAndValidateDeploymentArtifactNonHeatSuccess(){
415 // ArtifactDefinition createArtifactDef = createArtifactDef();
416 // createArtifactDef.setArtifactType(ArtifactTypeEnum.YANG_XML.getType());
418 // Either<ArtifactDefinition, ResponseFormat> validateResult = artifactBL
420 // assertTrue(validateResult.isLeft());
421 // ArtifactDefinition validatedArtifact = validateResult.left().value();
423 // assertEquals(createArtifactDef.getArtifactGroupType(),
424 // validatedArtifact.getArtifactGroupType());
425 // assertEquals(new Integer(0), validatedArtifact.getTimeout());
426 // assertFalse(validatedArtifact.getMandatory());
427 // assertFalse(validatedArtifact.getServiceApi());