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 fj.data.Either;
30 import java.util.Iterator;
31 import java.util.List;
32 import java.util.stream.Stream;
33 import org.apache.commons.lang3.StringUtils;
34 import org.apache.commons.lang3.tuple.ImmutablePair;
35 import org.janusgraph.core.JanusGraph;
36 import org.janusgraph.core.JanusGraphVertex;
37 import org.junit.jupiter.api.BeforeAll;
38 import org.junit.jupiter.api.BeforeEach;
39 import org.junit.jupiter.api.Test;
40 import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge;
41 import org.openecomp.sdc.be.dao.janusgraph.HealingJanusGraphGenericDao;
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.datatypes.elements.PolicyTypeDataDefinition;
46 import org.openecomp.sdc.be.datatypes.enums.ModelTypeEnum;
47 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
48 import org.openecomp.sdc.be.model.Model;
49 import org.openecomp.sdc.be.model.ModelTestBase;
50 import org.openecomp.sdc.be.model.PolicyTypeDefinition;
51 import org.openecomp.sdc.be.model.PropertyDefinition;
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.junit.jupiter.SpringJUnitConfig;
57 @SpringJUnitConfig(locations = "classpath:application-context-test.xml")
58 public class PolicyTypeOperationTest extends ModelTestBase {
60 private static final String NULL_STRING = null;
62 private PolicyTypeOperation policyTypeOperation;
64 private ModelOperation modelOperation;
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(
109 policyTypeCreated.getType(), policyTypeCreated.getModel());
110 assertTrue(eitherPolicyTypeFetched.isLeft());
111 PolicyTypeDefinition policyTypeFetched = eitherPolicyTypeFetched.left().value();
112 assertEquals(policyTypeFetched.toString(), policyTypeCreated.toString());
116 public void testAddPolicyTypeWithModel() {
117 PolicyTypeDefinition policyTypeDefinition = createPolicyTypeDef();
118 policyTypeDefinition.setModel("testModel");
119 Model model = new Model("testModel", ModelTypeEnum.NORMATIVE);
120 modelOperation.createModel(model, true);
122 Either<PolicyTypeDefinition, StorageOperationStatus> addPolicyType = policyTypeOperation.addPolicyType(policyTypeDefinition);
123 assertTrue(addPolicyType.isLeft());
124 Either<PolicyTypeDefinition, StorageOperationStatus> eitherPolicyTypeFetched =
125 policyTypeOperation.getLatestPolicyTypeByType(policyTypeDefinition.getType(), policyTypeDefinition.getModel());
126 assertTrue(eitherPolicyTypeFetched.isLeft());
127 assertEquals(policyTypeDefinition.getModel(), eitherPolicyTypeFetched.left().value().getModel());
131 public void testGetLatestPolicyTypeByType_derivedFromFetchedCorrectly() {
132 PolicyTypeDefinition rootPolicyType = createRootPolicyTypeOnGraph();
133 String derivedFromRootType = rootPolicyType.getType();
134 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", "desc1", derivedFromRootType);
135 policyTypeOperation.addPolicyType(policyType1);
136 Either<PolicyTypeDefinition, StorageOperationStatus> eitherPolicyTypeFetched = policyTypeOperation.getLatestPolicyTypeByType(
137 policyType1.getType(), policyType1.getModel());
138 assertThat(eitherPolicyTypeFetched.left().value().getDerivedFrom()).isEqualTo(rootPolicyType.getType());
142 public void testGetLatestPolicyTypeByType_whenGettingTypeGetPropertiesFromAllDerivedFromChain_policyTypeHasNoDirectProps() {
143 PropertyDefinition prop1 = createSimpleProperty("val1", "prop1", "string");
144 PropertyDefinition prop2 = createSimpleProperty("val2", "prop2", "string");
145 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", null, prop1, prop2);
146 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.type2", "desc3", policyType1.getType(), null);
147 addPolicyTypesToDB(policyType1, policyType2);
148 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType2 = policyTypeOperation.getLatestPolicyTypeByType(policyType2.getType(),
149 policyType2.getModel());
150 assertThat(latestPolicyType2.isLeft()).isTrue();
151 assertThat(latestPolicyType2.left().value().getProperties())
152 .usingElementComparatorOnFields("defaultValue", "name", "type")
153 .containsExactlyInAnyOrder(prop1, prop2);
157 public void testGetLatestPolicyTypeByType_whenGettingTypeGetPropertiesFromAllDerivedFromChain() {
158 PropertyDefinition prop1 = createSimpleProperty("val1", "prop1", "string");
159 PropertyDefinition prop2 = createSimpleProperty("val2", "prop2", "string");
160 PropertyDefinition prop3 = createSimpleProperty("val3", "prop3", "string");
162 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef(prop1);
163 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", "desc1", rootPolicyType.getType(), null);
164 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.type2", "desc2", policyType1.getType(), prop2);
165 PolicyTypeDefinition policyType3 = createPolicyTypeDef("tosca.policies.type3", "desc3", policyType2.getType(), null);
166 PolicyTypeDefinition policyType4 = createPolicyTypeDef("tosca.policies.type4", "desc4", policyType3.getType(), prop3);
168 addPolicyTypesToDB(rootPolicyType, policyType1, policyType2, policyType3, policyType4);
170 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType3 = policyTypeOperation.getLatestPolicyTypeByType(policyType4.getType(),
171 policyType4.getModel());
172 assertThat(latestPolicyType3.isLeft()).isTrue();
173 assertThat(latestPolicyType3.left().value().getProperties())
174 .usingElementComparatorOnFields("defaultValue", "name", "type")
175 .containsExactlyInAnyOrder(prop1, prop2, prop3);
179 public void getAllPolicyTypes_noPolicies() {
180 final List<PolicyTypeDefinition> result = policyTypeOperation.getAllPolicyTypes(null, null);
181 assertThat(result).isEmpty();
185 public void getAllPolicyTypes() {
186 PolicyTypeDefinition policyType1 = createPolicyTypeDef();
187 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.test1", "desc1", "tosca.policies.Root");
188 addPolicyTypesToDB(policyType1, policyType2);
189 List<PolicyTypeDefinition> allPolicyTypesWithNoExcluded = policyTypeOperation.getAllPolicyTypes(null, null);
190 assertThat(allPolicyTypesWithNoExcluded).hasSize(2);
191 assertThat(allPolicyTypesWithNoExcluded).usingElementComparatorOnFields("uniqueId", "description", "version", "type")
192 .containsExactlyInAnyOrder(policyType1, policyType2);
196 public void getAllPolicyTypes_whenPassingExcludedTypeList_dontReturnExcludedTypes() {
197 PolicyTypeDefinition policyType1 = createPolicyTypeDef();
198 PolicyTypeDefinition policyType2 = createPolicyTypeDef("tosca.policies.test1", "desc1", "tosca.policies.Root");
199 PolicyTypeDefinition policyType3 = createPolicyTypeDef("tosca.policies.test2", "desc2", "tosca.policies.Root");
200 policyTypeOperation.addPolicyType(policyType1);
201 policyTypeOperation.addPolicyType(policyType2);
202 policyTypeOperation.addPolicyType(policyType3);
203 List<PolicyTypeDefinition> allPolicyTypes = policyTypeOperation.getAllPolicyTypes(newHashSet("tosca.policies.test1", "tosca.policies.test2"),
205 assertThat(allPolicyTypes).hasSize(1);
206 assertThat(allPolicyTypes).usingElementComparatorOnFields("type")
207 .containsExactly(policyType1);
211 public void addPolicyType_whenDerivedFromNodeNotExist_returnNotFound() {
212 PolicyTypeDefinition type1 = createPolicyTypeDef("tosca.policies.type1", "desc1", "derivedFrom");
213 Either<PolicyTypeDefinition, StorageOperationStatus> addedPolicyTypeResult = policyTypeOperation.addPolicyType(type1);
214 assertThat(addedPolicyTypeResult.right().value()).isEqualTo(StorageOperationStatus.NOT_FOUND);
218 public void addPolicyType_derivedFromAddedCorrectly() {
219 PolicyTypeDefinition rootPolicyType = createRootPolicyTypeOnGraph();
220 String derivedFromRootType = rootPolicyType.getType();
221 PolicyTypeDefinition policyType1 = createPolicyTypeDef("tosca.policies.type1", "desc1", derivedFromRootType);
222 Either<PolicyTypeDefinition, StorageOperationStatus> addedPolicyTypeResult = policyTypeOperation.addPolicyType(policyType1);
223 assertThat(addedPolicyTypeResult.isLeft()).isTrue();
225 Either<PolicyTypeDefinition, StorageOperationStatus> fetchedPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType(),
226 policyType1.getModel());
227 PolicyTypeDefinition fetchedPolicyTypeVal = fetchedPolicyType.left().value();
228 assertThat(fetchedPolicyTypeVal.getDerivedFrom()).isEqualTo(derivedFromRootType);
229 verifyDerivedFromNodeEqualsToRootPolicyType(rootPolicyType, fetchedPolicyTypeVal.getUniqueId());
234 public void updatePolicyType_returnNotFoundErrorIfTryingToUpdateANonExistingType() {
235 PolicyTypeDefinition currType = createPolicyTypeDef();
236 PolicyTypeDefinition updatedType = createPolicyTypeDef();
237 Either<PolicyTypeDefinition, StorageOperationStatus> updatePolicyTypeRes = policyTypeOperation.updatePolicyType(updatedType, currType);
238 assertThat(updatePolicyTypeRes.right().value()).isEqualTo(StorageOperationStatus.NOT_FOUND);
242 public void updatePolicyType_basicFields() {
243 PolicyTypeDefinition createdType = createPolicyTypeDef("type1", "description1", NULL_STRING);
244 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(createdType);
246 PolicyTypeDefinition updatedType = createPolicyTypeDef("type1", "description2", NULL_STRING);
247 updatedType.setName("newName");
248 updatedType.setIcon("icon");
249 policyTypeOperation.updatePolicyType(updatedType, currPolicyType.left().value());
251 Either<PolicyTypeDefinition, StorageOperationStatus> fetchedUpdatedType = policyTypeOperation.getLatestPolicyTypeByType(createdType.getType(),
252 createdType.getModel());
253 PolicyTypeDefinition fetchedPolicyType = fetchedUpdatedType.left().value();
254 assertThat(fetchedPolicyType.getProperties()).isEmpty();
255 assertThat(fetchedPolicyType)
256 .isEqualToIgnoringGivenFields(updatedType, "properties");
261 public void updatePolicyType_updateProperties() {
262 PropertyDefinition prop1 = createSimpleProperty("val1", "prop1", "string");
263 PropertyDefinition prop2 = createSimpleProperty("val2", "prop2", "string");
264 PolicyTypeDefinition policyType = createPolicyTypeDef(prop1);
265 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType);
267 PropertyDefinition updatedProp1 = duplicateProperty(prop1, "newVal1", "int");
268 PropertyDefinition prop3 = createSimpleProperty("val3", "prop3", "string");
269 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef(updatedProp1, prop3);
271 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
273 Either<PolicyTypeDefinition, StorageOperationStatus> fetchedUpdatedType = policyTypeOperation.getLatestPolicyTypeByType(policyType.getType(),
274 policyType.getModel());
275 assertThat(fetchedUpdatedType.left().value().getProperties())
276 .usingElementComparatorOnFields("name", "defaultValue", "type")
277 .containsExactlyInAnyOrder(updatedProp1, prop3);
282 public void updatePolicyType_derivedFrom_whenNoPrevDerivedFrom_updateToNewDerivedFrom() {
283 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
284 PolicyTypeDefinition policyType1 = createPolicyTypeDef("type1", "descr", NULL_STRING);
285 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef("type1", "descr", rootPolicyType.getType());
286 policyTypeOperation.addPolicyType(rootPolicyType);
287 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType1);
288 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
290 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType(),
291 policyType1.getModel());
292 assertThat(latestPolicyType.left().value().getDerivedFrom()).isEqualTo(rootPolicyType.getType());
293 verifyDerivedFromNodeEqualsToRootPolicyType(rootPolicyType, latestPolicyType.left().value().getUniqueId());
297 public void updatePolicyType_derivedFrom_updateToNullDerivedFrom_derivedFromDeleted() {
298 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
299 PolicyTypeDefinition policyType1 = createPolicyTypeDef("type1", "descr", rootPolicyType.getType());
300 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef("type1", "descr", null, new PropertyDefinition[]{});
301 policyTypeOperation.addPolicyType(rootPolicyType);
302 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType1);
304 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
306 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType(),
307 policyType1.getModel());
308 assertThat(latestPolicyType.left().value().getDerivedFrom()).isNull();
309 verifyDerivedFromRelationDoesntExist(latestPolicyType.left().value().getUniqueId());
313 public void updatePolicyType_updateDerivedFrom() {
314 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
315 PolicyTypeDefinition derivedType1 = createPolicyTypeDef("derivedType1", "descr", NULL_STRING);
316 PolicyTypeDefinition policyType1 = createPolicyTypeDef("type1", "descr", derivedType1.getType());
317 PolicyTypeDefinition updatedPolicyType = createPolicyTypeDef("type1", "descr", rootPolicyType.getType());
319 policyTypeOperation.addPolicyType(rootPolicyType);
320 policyTypeOperation.addPolicyType(derivedType1);
321 Either<PolicyTypeDefinition, StorageOperationStatus> currPolicyType = policyTypeOperation.addPolicyType(policyType1);
323 policyTypeOperation.updatePolicyType(updatedPolicyType, currPolicyType.left().value());
325 Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyType = policyTypeOperation.getLatestPolicyTypeByType(policyType1.getType(),
326 policyType1.getModel());
327 assertThat(latestPolicyType.left().value().getDerivedFrom()).isEqualTo(rootPolicyType.getType());
328 verifyDerivedFromNodeEqualsToRootPolicyType(rootPolicyType, latestPolicyType.left().value().getUniqueId());
331 private PropertyDefinition duplicateProperty(PropertyDefinition prop1, String updatedValue, String updatedType) {
332 PropertyDefinition updatedProp1 = new PropertyDefinition(prop1);
333 updatedProp1.setUniqueId(null);
334 updatedProp1.setDefaultValue(updatedValue);
335 updatedProp1.setType(updatedType);
339 private void verifyDerivedFromNodeEqualsToRootPolicyType(PolicyTypeDefinition rootPolicyType, String parentPolicyId) {
340 Either<ImmutablePair<PolicyTypeData, GraphEdge>, JanusGraphOperationStatus> derivedFromRelation = janusGraphGenericDao.getChild(
341 UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.PolicyType), parentPolicyId, GraphEdgeLabels.DERIVED_FROM,
342 NodeTypeEnum.PolicyType, PolicyTypeData.class);
343 assertThat(derivedFromRelation.left().value().getLeft().getPolicyTypeDataDefinition())
344 .isEqualToComparingFieldByField(rootPolicyType);
347 private void verifyDerivedFromRelationDoesntExist(String parentPolicyId) {
348 Either<ImmutablePair<PolicyTypeData, GraphEdge>, JanusGraphOperationStatus> derivedFromRelation = janusGraphGenericDao.getChild(
349 UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.PolicyType), parentPolicyId, GraphEdgeLabels.DERIVED_FROM,
350 NodeTypeEnum.PolicyType, PolicyTypeData.class);
351 assertThat(derivedFromRelation.right().value())
352 .isEqualTo(JanusGraphOperationStatus.NOT_FOUND);
355 private PolicyTypeDefinition createRootPolicyTypeOnGraph() {
356 PolicyTypeDefinition rootPolicyType = createPolicyTypeDef();
357 policyTypeOperation.addPolicyType(rootPolicyType);
358 return rootPolicyType;
362 private PolicyTypeDefinition createPolicyTypeDef() {
363 return createPolicyTypeDef("tosca.policies.Root", "description: The TOSCA Policy Type all other TOSCA Policy Types derive from", null,
364 new PropertyDefinition[]{});
367 private PolicyTypeDefinition createPolicyTypeDef(PropertyDefinition... props) {
368 return createPolicyTypeDef("tosca.policies.Root", null, props);
371 private PolicyTypeDefinition createPolicyTypeDef(String type, String derivedFrom, PropertyDefinition... props) {
372 PolicyTypeDefinition policyType = createPolicyTypeDef(type, "description: The TOSCA Policy Type all other TOSCA Policy Types derive from",
374 policyType.setProperties(asList(props));
378 private PolicyTypeDefinition createPolicyTypeDef(String type, String description, String derivedFrom) {
379 return createPolicyTypeDef(type, description, derivedFrom, null);
382 private PolicyTypeDefinition createPolicyTypeDef(String type, String description, String derivedFrom, PropertyDefinition... props) {
383 PolicyTypeDataDefinition policyTypeDataDefinition = new PolicyTypeDataDefinition();
384 policyTypeDataDefinition.setDescription(description);
385 policyTypeDataDefinition.setType(type);
386 policyTypeDataDefinition.setName(type + "name");
387 policyTypeDataDefinition.setIcon(type + "icon");
388 policyTypeDataDefinition.setDerivedFrom(derivedFrom);
389 PolicyTypeDefinition policyTypeDefinition = new PolicyTypeDefinition(policyTypeDataDefinition);
390 policyTypeDefinition.setHighestVersion(true);
391 policyTypeDefinition.setVersion("1.0");
393 policyTypeDefinition.setProperties(asList(props));
395 return policyTypeDefinition;
398 private void addPolicyTypesToDB(PolicyTypeDefinition... policyTypeDefinitions) {
399 Stream.of(policyTypeDefinitions).forEach(policyTypeOperation::addPolicyType);