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;
23 import fj.data.Either;
24 import org.apache.commons.lang3.tuple.ImmutablePair;
25 import org.junit.Before;
26 import org.junit.BeforeClass;
27 import org.junit.Test;
28 import org.mockito.Mockito;
29 import org.mockito.invocation.InvocationOnMock;
30 import org.mockito.stubbing.Answer;
31 import org.openecomp.sdc.be.auditing.impl.AuditingManager;
32 import org.openecomp.sdc.be.components.impl.*;
33 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
34 import org.openecomp.sdc.be.config.Configuration;
35 import org.openecomp.sdc.be.config.ConfigurationManager;
36 import org.openecomp.sdc.be.dao.api.ActionStatus;
37 import org.openecomp.sdc.be.model.*;
38 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
39 import org.openecomp.sdc.be.model.tosca.constraints.GreaterOrEqualConstraint;
40 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
41 import org.openecomp.sdc.be.user.UserBusinessLogic;
42 import org.openecomp.sdc.be.utils.TypeUtils;
43 import org.openecomp.sdc.common.api.ConfigurationSource;
44 import org.openecomp.sdc.common.impl.ExternalConfiguration;
45 import org.openecomp.sdc.common.impl.FSConfigurationSource;
46 import org.openecomp.sdc.exception.PolicyException;
47 import org.openecomp.sdc.exception.ResponseFormat;
49 import java.io.IOException;
50 import java.util.Arrays;
51 import java.util.HashMap;
52 import java.util.List;
55 import static org.junit.Assert.assertEquals;
56 import static org.junit.Assert.assertSame;
57 import static org.junit.Assert.assertTrue;
58 import static org.mockito.Mockito.when;
60 public class ResourceImportManagerTest {
62 private static ConfigurationManager configurationManager;
63 static ResourceImportManager importManager;
64 static AuditingManager auditingManager = Mockito.mock(AuditingManager.class);
65 static ResponseFormatManager responseFormatManager = Mockito.mock(ResponseFormatManager.class);
66 static ResourceBusinessLogic resourceBusinessLogic = Mockito.mock(ResourceBusinessLogic.class);
67 static UserBusinessLogic userAdmin = Mockito.mock(UserBusinessLogic.class);
68 static ToscaOperationFacade toscaOperationFacade = Mockito.mock(ToscaOperationFacade.class);
71 public static void beforeClass() throws IOException {
72 importManager = new ResourceImportManager();
73 importManager.setAuditingManager(auditingManager);
74 when(toscaOperationFacade.getLatestByToscaResourceName(Mockito.anyString())).thenReturn(Either.left(null));
75 importManager.setResponseFormatManager(responseFormatManager);
76 importManager.setResourceBusinessLogic(resourceBusinessLogic);
77 importManager.setToscaOperationFacade(toscaOperationFacade);
79 String appConfigDir = "src/test/resources/config/catalog-be";
80 ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
81 configurationManager = new ConfigurationManager(configurationSource);
83 Configuration configuration = new Configuration();
84 configuration.setJanusGraphInMemoryGraph(true);
85 configurationManager.setConfiguration(configuration);
89 public void beforeTest() {
90 Mockito.reset(auditingManager, responseFormatManager, resourceBusinessLogic, userAdmin);
94 public void testBasicResourceCreation() throws IOException {
95 UploadResourceInfo resourceMD = createDummyResourceMD();
97 User user = new User();
98 user.setUserId(resourceMD.getContactId());
99 user.setRole("ADMIN");
100 user.setFirstName("Jhon");
101 user.setLastName("Doh");
102 Either<User, ActionStatus> eitherUser = Either.left(user);
104 when(userAdmin.getUser(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(eitherUser);
106 setResourceBusinessLogicMock();
108 String jsonContent = ImportUtilsTest.loadFileNameToJsonString("normative-types-new-blockStorage.yml");
110 Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> createResource = importManager.importNormativeResource(jsonContent, resourceMD, user, true, true);
111 assertTrue(createResource.isLeft());
112 Resource resource = createResource.left().value().left;
114 testSetConstantMetaData(resource);
115 testSetMetaDataFromJson(resource, resourceMD);
117 testSetDerivedFrom(resource);
118 testSetProperties(resource);
120 Mockito.verify(resourceBusinessLogic, Mockito.times(1)).propagateStateToCertified(Mockito.eq(user), Mockito.eq(resource), Mockito.any(LifecycleChangeInfoWithAction.class), Mockito.eq(false), Mockito.eq(true), Mockito.eq(false));
124 public void testResourceCreationFailed() throws IOException {
125 UploadResourceInfo resourceMD = createDummyResourceMD();
126 User user = new User();
127 user.setUserId(resourceMD.getContactId());
128 Either<User, ActionStatus> eitherUser = Either.left(user);
129 when(userAdmin.getUser(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(eitherUser);
130 ResponseFormat dummyResponseFormat = createGeneralErrorInfo();
132 when(responseFormatManager.getResponseFormat(ActionStatus.GENERAL_ERROR)).thenReturn(dummyResponseFormat);
133 setResourceBusinessLogicMock();
135 String jsonContent = "this is an invalid yml!";
137 Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> createResource = importManager.importNormativeResource(jsonContent, resourceMD, user, true, true);
138 assertTrue(createResource.isRight());
139 ResponseFormat errorInfoFromTest = createResource.right().value();
140 assertEquals(errorInfoFromTest.getStatus(), dummyResponseFormat.getStatus());
141 assertEquals(errorInfoFromTest.getMessageId(), dummyResponseFormat.getMessageId());
142 assertEquals(errorInfoFromTest.getFormattedMessage(), dummyResponseFormat.getFormattedMessage());
144 Mockito.verify(resourceBusinessLogic, Mockito.times(0)).createOrUpdateResourceByImport(Mockito.any(Resource.class), Mockito.eq(user), Mockito.eq(true), Mockito.eq(false), Mockito.eq(true), Mockito.eq(null), Mockito.eq(null), Mockito.eq(false));
146 Mockito.verify(resourceBusinessLogic, Mockito.times(0)).propagateStateToCertified(Mockito.eq(user), Mockito.any(Resource.class), Mockito.any(LifecycleChangeInfoWithAction.class), Mockito.eq(false), Mockito.eq(true), Mockito.eq(false));
151 public void testResourceCreationWithCapabilities() throws IOException {
152 UploadResourceInfo resourceMD = createDummyResourceMD();
153 User user = new User();
154 user.setUserId(resourceMD.getContactId());
155 Either<User, ActionStatus> eitherUser = Either.left(user);
157 when(userAdmin.getUser(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(eitherUser);
159 setResourceBusinessLogicMock();
161 String jsonContent = ImportUtilsTest.loadFileNameToJsonString("normative-types-new-webServer.yml");
163 Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> createResource = importManager.importNormativeResource(jsonContent, resourceMD, user, true, true);
164 assertTrue(createResource.isLeft());
165 Resource resource = createResource.left().value().left;
166 testSetCapabilities(resource);
168 Mockito.verify(resourceBusinessLogic, Mockito.times(1)).propagateStateToCertified(Mockito.eq(user), Mockito.eq(resource), Mockito.any(LifecycleChangeInfoWithAction.class), Mockito.eq(false), Mockito.eq(true), Mockito.eq(false));
169 Mockito.verify(resourceBusinessLogic, Mockito.times(1)).createOrUpdateResourceByImport(resource, user, true, false, true, null, null, false);
174 public void testResourceCreationWithRequirments() throws IOException {
175 UploadResourceInfo resourceMD = createDummyResourceMD();
176 User user = new User();
177 user.setUserId(resourceMD.getContactId());
178 Either<User, ActionStatus> eitherUser = Either.left(user);
180 when(userAdmin.getUser(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(eitherUser);
182 setResourceBusinessLogicMock();
184 String jsonContent = ImportUtilsTest.loadFileNameToJsonString("normative-types-new-port.yml");
186 Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> createResource = importManager.importNormativeResource(jsonContent, resourceMD, user, true, true);
187 assertTrue(createResource.isLeft());
188 testSetRequirments(createResource.left().value().left);
192 private void setResourceBusinessLogicMock() {
193 when(resourceBusinessLogic.getUserAdmin()).thenReturn(userAdmin);
194 when(resourceBusinessLogic.createOrUpdateResourceByImport(Mockito.any(Resource.class), Mockito.any(User.class), Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.eq(null), Mockito.eq(null), Mockito.eq(false)))
195 .thenAnswer(new Answer<ImmutablePair<Resource, ActionStatus>>() {
196 public ImmutablePair<Resource, ActionStatus> answer(InvocationOnMock invocation) throws Throwable {
197 Object[] args = invocation.getArguments();
198 return new ImmutablePair<>((Resource) args[0], ActionStatus.CREATED);
202 when(resourceBusinessLogic.propagateStateToCertified(Mockito.any(User.class), Mockito.any(Resource.class), Mockito.any(LifecycleChangeInfoWithAction.class), Mockito.eq(false), Mockito.eq(true), Mockito.eq(false)))
203 .thenAnswer(new Answer<Either<Resource, ResponseFormat>>() {
204 public Either<Resource, ResponseFormat> answer(InvocationOnMock invocation) throws Throwable {
205 Object[] args = invocation.getArguments();
206 return Either.left((Resource) args[1]);
210 when(resourceBusinessLogic.createResourceByDao(Mockito.any(Resource.class), Mockito.any(User.class), Mockito.any(AuditingActionEnum.class), Mockito.anyBoolean(), Mockito.anyBoolean())).thenAnswer(new Answer<Either<Resource, ResponseFormat>>() {
211 public Either<Resource, ResponseFormat> answer(InvocationOnMock invocation) throws Throwable {
212 Object[] args = invocation.getArguments();
213 return Either.left((Resource) args[0]);
217 when(resourceBusinessLogic.validateResourceBeforeCreate(Mockito.any(Resource.class), Mockito.any(User.class), Mockito.any(AuditingActionEnum.class), Mockito.eq(false), Mockito.eq(null))).thenAnswer(new Answer<Either<Resource, ResponseFormat>>() {
218 public Either<Resource, ResponseFormat> answer(InvocationOnMock invocation) throws Throwable {
219 Object[] args = invocation.getArguments();
220 return Either.left((Resource) args[0]);
225 Either<Boolean, ResponseFormat> either = Either.left(true);
226 when(resourceBusinessLogic.validatePropertiesDefaultValues(Mockito.any(Resource.class))).thenReturn(either);
229 public ResponseFormat createGeneralErrorInfo() {
230 ResponseFormat responseFormat = new ResponseFormat(500);
231 responseFormat.setPolicyException(new PolicyException("POL5000", "Error: Internal Server Error. Please try again later", null));
232 return responseFormat;
235 private UploadResourceInfo createDummyResourceMD() {
236 UploadResourceInfo resourceMD = new UploadResourceInfo();
237 resourceMD.setName("tosca.nodes.BlockStorage");
238 resourceMD.setPayloadName("payLoad");
239 resourceMD.addSubCategory("Generic", "Infrastructure");
240 resourceMD.setContactId("ya107f");
241 resourceMD.setResourceIconPath("defaulticon");
242 resourceMD.setTags(Arrays.asList(new String[] { "BlockStorage" }));
243 resourceMD.setDescription("Represents a server-local block storage device (i.e., not shared) offering evenly sized blocks of data from which raw storage volumes can be created.");
244 resourceMD.setResourceVendorModelNumber("vendorReleaseNumber");
248 private void testSetProperties(Resource resource) {
249 List<PropertyDefinition> propertiesList = resource.getProperties();
251 Map<String, PropertyDefinition> properties = new HashMap<>();
252 for (PropertyDefinition propertyDefinition : propertiesList) {
253 properties.put(propertyDefinition.getName(), propertyDefinition);
256 assertEquals(3, properties.size());
257 assertTrue(properties.containsKey("size"));
258 PropertyDefinition propertyDefinition = properties.get("size");
259 assertEquals("scalar-unit.size", propertyDefinition.getType());
260 assertEquals(1, propertyDefinition.getConstraints().size());
261 PropertyConstraint propertyConstraint = propertyDefinition.getConstraints().get(0);
262 assertTrue(propertyConstraint instanceof GreaterOrEqualConstraint);
264 assertTrue(properties.containsKey("volume_id"));
265 propertyDefinition = properties.get("volume_id");
266 assertEquals("string", propertyDefinition.getType());
267 assertTrue(!propertyDefinition.isRequired());
269 assertTrue(properties.containsKey("snapshot_id"));
270 propertyDefinition = properties.get("snapshot_id");
271 assertEquals("string", propertyDefinition.getType());
272 assertTrue(!propertyDefinition.isRequired());
276 private void testSetCapabilities(Resource resource) {
277 Map<String, List<CapabilityDefinition>> capabilities = resource.getCapabilities();
278 assertEquals(3, capabilities.size());
279 assertTrue(capabilities.containsKey("tosca.capabilities.Endpoint"));
280 List<CapabilityDefinition> capabilityList = capabilities.get("tosca.capabilities.Endpoint");
281 CapabilityDefinition capability = capabilityList.get(0);
282 assertEquals("tosca.capabilities.Endpoint", capability.getType());
283 assertEquals("data_endpoint", capability.getName());
285 assertTrue(capabilities.containsKey("tosca.capabilities.Endpoint.Admin"));
286 capabilityList = capabilities.get("tosca.capabilities.Endpoint.Admin");
287 capability = capabilityList.get(0);
288 assertEquals("tosca.capabilities.Endpoint.Admin", capability.getType());
289 assertEquals("admin_endpoint", capability.getName());
291 assertTrue(capabilities.containsKey("tosca.capabilities.Container"));
292 capabilityList = capabilities.get("tosca.capabilities.Container");
293 capability = capabilityList.get(0);
294 assertEquals("tosca.capabilities.Container", capability.getType());
295 assertEquals("host", capability.getName());
297 List<String> validSourceTypes = capability.getValidSourceTypes();
298 assertEquals(1, validSourceTypes.size());
299 assertEquals("tosca.nodes.WebApplication", validSourceTypes.get(0));
303 private void testSetRequirments(Resource resource) {
304 Map<String, List<RequirementDefinition>> requirements = resource.getRequirements();
305 assertEquals(2, requirements.size());
307 assertTrue(requirements.containsKey("tosca.capabilities.network.Linkable"));
308 List<RequirementDefinition> requirementList = requirements.get("tosca.capabilities.network.Linkable");
309 RequirementDefinition requirement = requirementList.get(0);
310 assertEquals("tosca.capabilities.network.Linkable", requirement.getCapability());
311 assertEquals("tosca.relationships.network.LinksTo", requirement.getRelationship());
312 assertEquals("link", requirement.getName());
314 assertTrue(requirements.containsKey("tosca.capabilities.network.Bindable"));
315 requirementList = requirements.get("tosca.capabilities.network.Bindable");
316 requirement = requirementList.get(0);
317 assertEquals("tosca.capabilities.network.Bindable", requirement.getCapability());
318 assertEquals("tosca.relationships.network.BindsTo", requirement.getRelationship());
319 assertEquals("binding", requirement.getName());
323 private void testSetDerivedFrom(Resource resource) {
324 assertEquals(1, resource.getDerivedFrom().size());
325 assertEquals("tosca.nodes.Root", resource.getDerivedFrom().get(0));
329 private void testSetMetaDataFromJson(Resource resource, UploadResourceInfo resourceMD) {
331 // assertTrue( resource.getCategory().equals(resourceMD.getCategory())
333 assertEquals(resource.getDescription(), resourceMD.getDescription());
334 assertEquals(resource.getIcon(), resourceMD.getResourceIconPath());
335 assertEquals(resource.getName(), resourceMD.getName());
336 assertEquals(resource.getResourceVendorModelNumber(), resourceMD.getResourceVendorModelNumber());
337 assertEquals(resource.getContactId(), resourceMD.getContactId());
338 assertEquals(resource.getCreatorUserId(), resourceMD.getContactId());
340 // assertTrue( resource.isAbstract() ==
341 // Constants.ABSTRACT_CATEGORY.equals(resourceMD.getCategory()));
343 assertEquals(resourceMD.getTags().size(), resource.getTags().size());
344 for (String tag : resource.getTags()) {
345 assertTrue(resourceMD.getTags().contains(tag));
350 private void testSetConstantMetaData(Resource resource) {
351 assertEquals(resource.getVersion(), TypeUtils.FIRST_CERTIFIED_VERSION_VERSION);
352 assertSame(resource.getLifecycleState(), ImportUtils.Constants.NORMATIVE_TYPE_LIFE_CYCLE);
353 assertEquals((boolean) resource.isHighestVersion(), ImportUtils.Constants.NORMATIVE_TYPE_HIGHEST_VERSION);
354 assertEquals(resource.getVendorName(), ImportUtils.Constants.VENDOR_NAME);
355 assertEquals(resource.getVendorRelease(), ImportUtils.Constants.VENDOR_RELEASE);