re base code
[sdc.git] / catalog-be / src / test / java / org / openecomp / sdc / be / components / ResourceImportManagerTest.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  */
20
21 package org.openecomp.sdc.be.components;
22
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.jsontitan.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;
48
49 import java.io.IOException;
50 import java.util.Arrays;
51 import java.util.HashMap;
52 import java.util.List;
53 import java.util.Map;
54
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;
59
60 public class ResourceImportManagerTest {
61
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);
69
70     @BeforeClass
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);
78
79         String appConfigDir = "src/test/resources/config/catalog-be";
80         ConfigurationSource configurationSource = new FSConfigurationSource(ExternalConfiguration.getChangeListener(), appConfigDir);
81         configurationManager = new ConfigurationManager(configurationSource);
82
83         Configuration configuration = new Configuration();
84         configuration.setTitanInMemoryGraph(true);
85         configurationManager.setConfiguration(configuration);
86     }
87
88     @Before
89     public void beforeTest() {
90         Mockito.reset(auditingManager, responseFormatManager, resourceBusinessLogic, userAdmin);
91     }
92
93     @Test
94     public void testBasicResourceCreation() throws IOException {
95         UploadResourceInfo resourceMD = createDummyResourceMD();
96
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);
103
104         when(userAdmin.getUser(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(eitherUser);
105
106         setResourceBusinessLogicMock();
107
108         String jsonContent = ImportUtilsTest.loadFileNameToJsonString("normative-types-new-blockStorage.yml");
109
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;
113
114         testSetConstantMetaData(resource);
115         testSetMetaDataFromJson(resource, resourceMD);
116
117         testSetDerivedFrom(resource);
118         testSetProperties(resource);
119
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));
121     }
122
123     @Test
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();
131
132         when(responseFormatManager.getResponseFormat(ActionStatus.GENERAL_ERROR)).thenReturn(dummyResponseFormat);
133         setResourceBusinessLogicMock();
134
135         String jsonContent = "this is an invalid yml!";
136
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());
143
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));
145
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));
147
148     }
149
150     @Test
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);
156
157         when(userAdmin.getUser(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(eitherUser);
158
159         setResourceBusinessLogicMock();
160
161         String jsonContent = ImportUtilsTest.loadFileNameToJsonString("normative-types-new-webServer.yml");
162
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);
167
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);
170
171     }
172
173     @Test
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);
179
180         when(userAdmin.getUser(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(eitherUser);
181
182         setResourceBusinessLogicMock();
183
184         String jsonContent = ImportUtilsTest.loadFileNameToJsonString("normative-types-new-port.yml");
185
186         Either<ImmutablePair<Resource, ActionStatus>, ResponseFormat> createResource = importManager.importNormativeResource(jsonContent, resourceMD, user, true, true);
187         assertTrue(createResource.isLeft());
188         testSetRequirments(createResource.left().value().left);
189
190     }
191
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);
199
200                     }
201                 });
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]);
207
208                     }
209                 });
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]);
214
215             }
216         });
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]);
221
222             }
223         });
224
225         Either<Boolean, ResponseFormat> either = Either.left(true);
226         when(resourceBusinessLogic.validatePropertiesDefaultValues(Mockito.any(Resource.class))).thenReturn(either);
227     }
228
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;
233     }
234
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");
245         return resourceMD;
246     }
247
248     private void testSetProperties(Resource resource) {
249         List<PropertyDefinition> propertiesList = resource.getProperties();
250
251         Map<String, PropertyDefinition> properties = new HashMap<>();
252         for (PropertyDefinition propertyDefinition : propertiesList) {
253             properties.put(propertyDefinition.getName(), propertyDefinition);
254         }
255
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);
263
264         assertTrue(properties.containsKey("volume_id"));
265         propertyDefinition = properties.get("volume_id");
266         assertEquals("string", propertyDefinition.getType());
267         assertTrue(!propertyDefinition.isRequired());
268
269         assertTrue(properties.containsKey("snapshot_id"));
270         propertyDefinition = properties.get("snapshot_id");
271         assertEquals("string", propertyDefinition.getType());
272         assertTrue(!propertyDefinition.isRequired());
273
274     }
275
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());
284
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());
290
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());
296
297         List<String> validSourceTypes = capability.getValidSourceTypes();
298         assertEquals(1, validSourceTypes.size());
299         assertEquals("tosca.nodes.WebApplication", validSourceTypes.get(0));
300
301     }
302
303     private void testSetRequirments(Resource resource) {
304         Map<String, List<RequirementDefinition>> requirements = resource.getRequirements();
305         assertEquals(2, requirements.size());
306
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());
313
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());
320
321     }
322
323     private void testSetDerivedFrom(Resource resource) {
324         assertEquals(1, resource.getDerivedFrom().size());
325         assertEquals("tosca.nodes.Root", resource.getDerivedFrom().get(0));
326
327     }
328
329     private void testSetMetaDataFromJson(Resource resource, UploadResourceInfo resourceMD) {
330
331         // assertTrue( resource.getCategory().equals(resourceMD.getCategory())
332         // );
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());
339
340         // assertTrue( resource.isAbstract() ==
341         // Constants.ABSTRACT_CATEGORY.equals(resourceMD.getCategory()));
342
343         assertEquals(resourceMD.getTags().size(), resource.getTags().size());
344         for (String tag : resource.getTags()) {
345             assertTrue(resourceMD.getTags().contains(tag));
346         }
347
348     }
349
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);
356     }
357
358 }