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.model.operations.impl;
23 import static com.google.common.collect.Sets.newHashSet;
24 import static java.util.Arrays.asList;
25 import static org.assertj.core.api.Assertions.assertThat;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertTrue;
29 import org.janusgraph.core.JanusGraph;
30 import org.janusgraph.core.JanusGraphVertex;
31 import fj.data.Either;
32 import java.util.Iterator;
33 import java.util.List;
34 import java.util.stream.Stream;
35 import org.apache.commons.lang3.StringUtils;
36 import org.apache.commons.lang3.tuple.ImmutablePair;
37 import org.junit.Before;
38 import org.junit.BeforeClass;
39 import org.junit.Test;
40 import org.junit.runner.RunWith;
41 import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
42 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao;
43 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
44 import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels;
45 import org.openecomp.sdc.be.dao.janusgraph.HealingJanusGraphGenericDao;
46 import org.openecomp.sdc.be.datatypes.elements.PolicyTypeDataDefinition;
47 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
48 import org.openecomp.sdc.be.model.ModelTestBase;
49 import org.openecomp.sdc.be.model.PolicyTypeDefinition;
50 import org.openecomp.sdc.be.model.PropertyDefinition;
51 import org.openecomp.sdc.be.model.operations.StorageException;
52 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
53 import org.openecomp.sdc.be.resources.data.PolicyTypeData;
54 import org.springframework.beans.factory.annotation.Autowired;
55 import org.springframework.test.context.ContextConfiguration;
56 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
58 @RunWith(SpringJUnit4ClassRunner.class)
59 @ContextConfiguration("classpath:application-context-test.xml")
60 public class PolicyTypeOperationTest extends ModelTestBase {
62 private static final String NULL_STRING = null;
64 private PolicyTypeOperation policyTypeOperation;
67 private HealingJanusGraphGenericDao janusGraphGenericDao;
70 public static void setupBeforeClass() {
76 public void cleanUp() {
77 JanusGraphGenericDao janusGraphGenericDao = policyTypeOperation.janusGraphGenericDao;
78 Either<JanusGraph, JanusGraphOperationStatus> graphResult = janusGraphGenericDao.getGraph();
79 JanusGraph graph = graphResult.left().value();
81 Iterable<JanusGraphVertex> vertices = graph.query().vertices();
82 if (vertices != null) {
83 Iterator<JanusGraphVertex> iterator = vertices.iterator();
84 while (iterator.hasNext()) {
85 JanusGraphVertex vertex = iterator.next();
90 janusGraphGenericDao.commit();
94 public void testAddPolicyType() {
95 PolicyTypeDefinition policyTypePreCreate = createPolicyTypeDef();
96 assertTrue(StringUtils.isEmpty(policyTypePreCreate.getUniqueId()));
97 Either<PolicyTypeDefinition, StorageOperationStatus> addPolicyType = policyTypeOperation.addPolicyType(policyTypePreCreate);
98 assertTrue(addPolicyType.isLeft());
99 PolicyTypeDefinition policyTypePostCreate = addPolicyType.left().value();
100 assertThat(policyTypePostCreate.getUniqueId()).isNotEmpty();
101 assertThat(policyTypePostCreate)
102 .isEqualToComparingOnlyGivenFields(policyTypePreCreate, "name", "icon", "description", "type");
106 public void testGetLatestPolicyTypeByType() {
107 PolicyTypeDefinition policyTypeCreated = policyTypeOperation.addPolicyType(createPolicyTypeDef()).left().value();
108 Either<PolicyTypeDefinition, StorageOperationStatus> eitherPolicyTypeFetched = policyTypeOperation.getLatestPolicyTypeByType(policyTypeCreated.getType());
109 assertTrue(eitherPolicyTypeFetched.isLeft());
110 PolicyTypeDefinition policyTypeFetched = eitherPolicyTypeFetched.left().value();
111 assertEquals(policyTypeFetched.toString(), policyTypeCreated.toString());
115 public void testGetLatestPolicyTypeByType_derivedFromFetchedCorrectly() {
116 PolicyTypeDefinition rootPolicyType = createRootPolicyTypeOnGraph();
117 String derivedFromRootType = rootPolicyType.getType();
118 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", "desc1", derivedFromRootType);
119 policyTypeOperation.addPolicyType(policyType1);
120 Either<PolicyTypeDefinition, StorageOperationStatus> eitherPolicyTypeFetched = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType());
121 assertThat(eitherPolicyTypeFetched.left().value().getDerivedFrom()).isEqualTo(rootPolicyType.getType());
125 public void testGetLatestPolicyTypeByType_whenGettingTypeGetPropertiesFromAllDerivedFromChain_policyTypeHasNoDirectProps() {
126 PropertyDefinition prop1 = createSimpleProperty("val1", "prop1", "string");
127 PropertyDefinition prop2 = createSimpleProperty("val2", "prop2", "string");
128 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", null, prop1, prop2);
129 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.type2", "desc3", policyType1.getType(), null);
130 addPolicyTypesToDB(policyType1, policyType2);
131 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType2 = policyTypeOperation.getLatestPolicyTypeByType(policyType2.getType());
132 assertThat(latestPolicyType2.isLeft()).isTrue();
133 assertThat(latestPolicyType2.left().value().getProperties())
134 .usingElementComparatorOnFields("defaultValue", "name", "type")
135 .containsExactlyInAnyOrder(prop1, prop2);
139 public void testGetLatestPolicyTypeByType_whenGettingTypeGetPropertiesFromAllDerivedFromChain() {
140 PropertyDefinition prop1 = createSimpleProperty("val1", "prop1", "string");
141 PropertyDefinition prop2 = createSimpleProperty("val2", "prop2", "string");
142 PropertyDefinition prop3 = createSimpleProperty("val3", "prop3", "string");
144 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef(prop1);
145 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", "desc1", rootPolicyType.getType(), null);
146 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.type2", "desc2", policyType1.getType(), prop2);
147 PolicyTypeDefinition policyType3 = createPolicyTypeDef("tosca.policies.type3", "desc3", policyType2.getType(), null);
148 PolicyTypeDefinition policyType4 = createPolicyTypeDef("tosca.policies.type4", "desc4", policyType3.getType(), prop3);
150 addPolicyTypesToDB(rootPolicyType, policyType1, policyType2, policyType3, policyType4);
152 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType3 = policyTypeOperation.getLatestPolicyTypeByType(policyType4.getType());
153 assertThat(latestPolicyType3.isLeft()).isTrue();
154 assertThat(latestPolicyType3.left().value().getProperties())
155 .usingElementComparatorOnFields("defaultValue", "name", "type")
156 .containsExactlyInAnyOrder(prop1, prop2, prop3);
159 @Test(expected = StorageException.class)
160 public void getAllPolicyTypes_noPolicies() {
161 policyTypeOperation.getAllPolicyTypes(null);
165 public void getAllPolicyTypes() {
166 PolicyTypeDefinition policyType1 = createPolicyTypeDef();
167 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.test1", "desc1", "tosca.policies.Root");
168 addPolicyTypesToDB(policyType1, policyType2);
169 List<PolicyTypeDefinition> allPolicyTypesWithNoExcluded = policyTypeOperation.getAllPolicyTypes(null);
170 assertThat(allPolicyTypesWithNoExcluded).hasSize(2);
171 assertThat(allPolicyTypesWithNoExcluded).usingElementComparatorOnFields("uniqueId", "description", "version", "type")
172 .containsExactlyInAnyOrder(policyType1, policyType2);
176 public void getAllPolicyTypes_whenPassingExcludedTypeList_dontReturnExcludedTypes() {
177 PolicyTypeDefinition policyType1 = createPolicyTypeDef();
178 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.test1", "desc1", "tosca.policies.Root");
179 PolicyTypeDefinition policyType3 = createPolicyTypeDef("tosca.policies.test2", "desc2", "tosca.policies.Root");
180 policyTypeOperation.addPolicyType(policyType1);
181 policyTypeOperation.addPolicyType(policyType2);
182 policyTypeOperation.addPolicyType(policyType3);
183 List<PolicyTypeDefinition> allPolicyTypes = policyTypeOperation.getAllPolicyTypes(newHashSet("tosca.policies.test1", "tosca.policies.test2"));
184 assertThat(allPolicyTypes).hasSize(1);
185 assertThat(allPolicyTypes).usingElementComparatorOnFields("type")
186 .containsExactly(policyType1);
190 public void addPolicyType_whenDerivedFromNodeNotExist_returnNotFound() {
191 PolicyTypeDefinition type1 = createPolicyTypeDef("tosca.policies.type1", "desc1", "derivedFrom");
192 Either<PolicyTypeDefinition, StorageOperationStatus> addedPolicyTypeResult = policyTypeOperation.addPolicyType(type1);
193 assertThat(addedPolicyTypeResult.right().value()).isEqualTo(StorageOperationStatus.NOT_FOUND);
197 public void addPolicyType_derivedFromAddedCorrectly() {
198 PolicyTypeDefinition rootPolicyType = createRootPolicyTypeOnGraph();
199 String derivedFromRootType = rootPolicyType.getType();
200 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", "desc1", derivedFromRootType);
201 Either<PolicyTypeDefinition, StorageOperationStatus> addedPolicyTypeResult = policyTypeOperation.addPolicyType(policyType1);
202 assertThat(addedPolicyTypeResult.isLeft()).isTrue();
204 Either<PolicyTypeDefinition, StorageOperationStatus> fetchedPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType());
205 PolicyTypeDefinition fetchedPolicyTypeVal = fetchedPolicyType.left().value();
206 assertThat(fetchedPolicyTypeVal.getDerivedFrom()).isEqualTo(derivedFromRootType);
207 verifyDerivedFromNodeEqualsToRootPolicyType(rootPolicyType, fetchedPolicyTypeVal.getUniqueId());
212 public void updatePolicyType_returnNotFoundErrorIfTryingToUpdateANonExistingType() {
213 PolicyTypeDefinition currType = createPolicyTypeDef();
214 PolicyTypeDefinition updatedType = createPolicyTypeDef();
215 Either<PolicyTypeDefinition, StorageOperationStatus> updatePolicyTypeRes = policyTypeOperation.updatePolicyType(updatedType, currType);
216 assertThat(updatePolicyTypeRes.right().value()).isEqualTo(StorageOperationStatus.NOT_FOUND);
220 public void updatePolicyType_basicFields() {
221 PolicyTypeDefinition createdType = createPolicyTypeDef("type1", "description1", NULL_STRING);
222 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(createdType);
224 PolicyTypeDefinition updatedType = createPolicyTypeDef("type1", "description2", NULL_STRING);
225 updatedType.setName("newName");
226 updatedType.setIcon("icon");
227 policyTypeOperation.updatePolicyType(updatedType, currPolicyType.left().value());
229 Either<PolicyTypeDefinition, StorageOperationStatus> fetchedUpdatedType = policyTypeOperation.getLatestPolicyTypeByType(createdType.getType());
230 PolicyTypeDefinition fetchedPolicyType = fetchedUpdatedType.left().value();
231 assertThat(fetchedPolicyType.getProperties()).isEmpty();
232 assertThat(fetchedPolicyType)
233 .isEqualToIgnoringGivenFields(updatedType, "properties");
238 public void updatePolicyType_updateProperties() {
239 PropertyDefinition prop1 = createSimpleProperty("val1", "prop1", "string");
240 PropertyDefinition prop2 = createSimpleProperty("val2", "prop2", "string");
241 PolicyTypeDefinition policyType = createPolicyTypeDef(prop1);
242 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType);
244 PropertyDefinition updatedProp1 = duplicateProperty(prop1, "newVal1", "int");
245 PropertyDefinition prop3 = createSimpleProperty("val3", "prop3", "string");
246 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef(updatedProp1, prop3);
248 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
250 Either<PolicyTypeDefinition, StorageOperationStatus> fetchedUpdatedType = policyTypeOperation.getLatestPolicyTypeByType(policyType.getType());
251 assertThat(fetchedUpdatedType.left().value().getProperties())
252 .usingElementComparatorOnFields("name", "defaultValue", "type")
253 .containsExactlyInAnyOrder(updatedProp1, prop3);
258 public void updatePolicyType_derivedFrom_whenNoPrevDerivedFrom_updateToNewDerivedFrom() {
259 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
260 PolicyTypeDefinition policyType1 = createPolicyTypeDef("type1", "descr", NULL_STRING);
261 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef("type1", "descr", rootPolicyType.getType());
262 policyTypeOperation.addPolicyType(rootPolicyType);
263 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType1);
264 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
266 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType());
267 assertThat(latestPolicyType.left().value().getDerivedFrom()).isEqualTo(rootPolicyType.getType());
268 verifyDerivedFromNodeEqualsToRootPolicyType(rootPolicyType, latestPolicyType.left().value().getUniqueId());
272 public void updatePolicyType_derivedFrom_updateToNullDerivedFrom_derivedFromDeleted() {
273 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
274 PolicyTypeDefinition policyType1 = createPolicyTypeDef("type1", "descr", rootPolicyType.getType());
275 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef("type1", "descr", null, new PropertyDefinition[]{});
276 policyTypeOperation.addPolicyType(rootPolicyType);
277 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType1);
279 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
281 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType());
282 assertThat(latestPolicyType.left().value().getDerivedFrom()).isNull();
283 verifyDerivedFromRelationDoesntExist(latestPolicyType.left().value().getUniqueId());
287 public void updatePolicyType_updateDerivedFrom() {
288 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
289 PolicyTypeDefinition derivedType1 = createPolicyTypeDef("derivedType1", "descr", NULL_STRING);
290 PolicyTypeDefinition policyType1 = createPolicyTypeDef("type1", "descr", derivedType1.getType());
291 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef("type1", "descr", rootPolicyType.getType());
293 policyTypeOperation.addPolicyType(rootPolicyType);
294 policyTypeOperation.addPolicyType(derivedType1);
295 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType1);
297 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
299 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType());
300 assertThat(latestPolicyType.left().value().getDerivedFrom()).isEqualTo(rootPolicyType.getType());
301 verifyDerivedFromNodeEqualsToRootPolicyType(rootPolicyType, latestPolicyType.left().value().getUniqueId());
304 private PropertyDefinition duplicateProperty(PropertyDefinition prop1, String updatedValue, String updatedType) {
305 PropertyDefinition updatedProp1 = new PropertyDefinition(prop1);
306 updatedProp1.setUniqueId(null);
307 updatedProp1.setDefaultValue(updatedValue);
308 updatedProp1.setType(updatedType);
312 private void verifyDerivedFromNodeEqualsToRootPolicyType(PolicyTypeDefinition rootPolicyType, String parentPolicyId) {
313 Either<ImmutablePair<PolicyTypeData, GraphEdge>, JanusGraphOperationStatus> derivedFromRelation = janusGraphGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.PolicyType), parentPolicyId, GraphEdgeLabels.DERIVED_FROM,
314 NodeTypeEnum.PolicyType, PolicyTypeData.class);
315 assertThat(derivedFromRelation.left().value().getLeft().getPolicyTypeDataDefinition())
316 .isEqualToComparingFieldByField(rootPolicyType);
319 private void verifyDerivedFromRelationDoesntExist(String parentPolicyId) {
320 Either<ImmutablePair<PolicyTypeData, GraphEdge>, JanusGraphOperationStatus> derivedFromRelation = janusGraphGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.PolicyType), parentPolicyId, GraphEdgeLabels.DERIVED_FROM,
321 NodeTypeEnum.PolicyType, PolicyTypeData.class);
322 assertThat(derivedFromRelation.right().value())
323 .isEqualTo(JanusGraphOperationStatus.NOT_FOUND);
326 private PolicyTypeDefinition createRootPolicyTypeOnGraph() {
327 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
328 policyTypeOperation.addPolicyType(rootPolicyType);
329 return rootPolicyType;
333 private PolicyTypeDefinition createPolicyTypeDef() {
334 return createPolicyTypeDef("tosca.policies.Root", "description: The TOSCA Policy Type all other TOSCA Policy Types derive from", null, new PropertyDefinition[]{});
337 private PolicyTypeDefinition createPolicyTypeDef(PropertyDefinition ... props) {
338 return createPolicyTypeDef("tosca.policies.Root", null, props);
341 private PolicyTypeDefinition createPolicyTypeDef(String type, String derivedFrom, PropertyDefinition ... props) {
342 PolicyTypeDefinition policyType = createPolicyTypeDef(type, "description: The TOSCA Policy Type all other TOSCA Policy Types derive from", derivedFrom);
343 policyType.setProperties(asList(props));
347 private PolicyTypeDefinition createPolicyTypeDef(String type, String description, String derivedFrom) {
348 return createPolicyTypeDef(type, description, derivedFrom, null);
351 private PolicyTypeDefinition createPolicyTypeDef(String type, String description, String derivedFrom, PropertyDefinition ... props) {
352 PolicyTypeDataDefinition policyTypeDataDefinition = new PolicyTypeDataDefinition();
353 policyTypeDataDefinition.setDescription(description);
354 policyTypeDataDefinition.setType(type);
355 policyTypeDataDefinition.setName(type + "name");
356 policyTypeDataDefinition.setIcon(type + "icon");
357 policyTypeDataDefinition.setDerivedFrom(derivedFrom);
358 PolicyTypeDefinition policyTypeDefinition = new PolicyTypeDefinition(policyTypeDataDefinition);
359 policyTypeDefinition.setHighestVersion(true);
360 policyTypeDefinition.setVersion("1.0");
362 policyTypeDefinition.setProperties(asList(props));
364 return policyTypeDefinition;
367 private void addPolicyTypesToDB(PolicyTypeDefinition ... policyTypeDefinitions) {
368 Stream.of(policyTypeDefinitions).forEach(policyTypeOperation::addPolicyType);