From 88bcb550c2efd5e43ad3d256fe075a6bf7e90538 Mon Sep 17 00:00:00 2001 From: liamfallon Date: Tue, 11 Feb 2020 16:18:32 +0000 Subject: Implement validation and hierarchical get NOTE: This review will require changes to the persistence.xml file in other policy framework components. This change brings in two changes: 1) Validation of the references betwen policies, policy types, and data types This change mans that additions to and changes to policies, policy types, and data types must be structurally correct in the change coming in and with whatever is already in the database 2) Hierarchical return of referenced entitites on policy types, policies and data types. When a policy, policy type, or data type is read from the database, the entities referenced byt the returned policy, policy type, or data type are returned as well. Tests are amended for the stricter validation and structure. Examples are corrected where they are incorrect. Issue-ID: POLICY-1402 Change-Id: Ie6a4cb7ed336562338924079114df405f0ab889f Signed-off-by: liamfallon --- .../provider/AuthorativeToscaProvider.java | 39 ++- .../tosca/simple/concepts/JpaToscaDataType.java | 36 ++- .../tosca/simple/concepts/JpaToscaEntityType.java | 8 +- .../tosca/simple/concepts/JpaToscaPolicy.java | 14 +- .../tosca/simple/concepts/JpaToscaPolicyType.java | 7 +- .../tosca/simple/concepts/JpaToscaPolicyTypes.java | 1 + .../simple/concepts/JpaToscaServiceTemplate.java | 51 +++- .../simple/concepts/JpaToscaTopologyTemplate.java | 10 + .../tosca/simple/provider/SimpleToscaProvider.java | 266 ++++++++++++--------- .../onap/policy/models/tosca/utils/ToscaUtils.java | 27 ++- .../AuthorativeToscaProviderPolicyTest.java | 12 +- .../AuthorativeToscaProviderPolicyTypeTest.java | 54 +++-- .../mapping/LegacyGuardPolicyMapperTest.java | 7 +- .../simple/concepts/JpaToscaDataTypeTest.java | 54 ++++- .../concepts/JpaToscaServiceTemplateTest.java | 97 ++++++++ .../simple/provider/SimpleToscaProviderTest.java | 42 ++-- .../policy/models/tosca/utils/ToscaUtilsTest.java | 38 ++- .../src/test/resources/META-INF/persistence.xml | 2 + .../test/resources/onap.policies.NoVersion.yaml | 4 + 19 files changed, 539 insertions(+), 230 deletions(-) (limited to 'models-tosca') diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProvider.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProvider.java index 7999f620b..6e60303a0 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProvider.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProvider.java @@ -22,15 +22,19 @@ package org.onap.policy.models.tosca.authorative.provider; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; +import javax.ws.rs.core.Response.Status; + import lombok.NonNull; import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.base.PfModelException; +import org.onap.policy.models.base.PfModelRuntimeException; import org.onap.policy.models.dao.PfDao; import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; @@ -87,8 +91,14 @@ public class AuthorativeToscaProvider { LOGGER.debug("->getPolicyTypeList: name={}, version={}", name, version); - List policyTypeList = new ArrayList<>( - new SimpleToscaProvider().getPolicyTypes(dao, name, version).toAuthorative().getPolicyTypes().values()); + List policyTypeList; + + try { + policyTypeList = new ArrayList<>(new SimpleToscaProvider().getPolicyTypes(dao, name, version) + .toAuthorative().getPolicyTypes().values()); + } catch (PfModelRuntimeException pfme) { + return handlePfModelRuntimeException(pfme); + } LOGGER.debug("<-getPolicyTypeList: name={}, version={}, policyTypeList={}", name, version, policyTypeList); return policyTypeList; @@ -136,6 +146,7 @@ public class AuthorativeToscaProvider { LOGGER.debug("<-getFilteredPolicyTypeList: filter={}, filteredPolicyTypeList={}", filter, filteredPolicyTypeList); + return filteredPolicyTypeList; } @@ -234,8 +245,14 @@ public class AuthorativeToscaProvider { throws PfModelException { LOGGER.debug("->getPolicyList: name={}, version={}", name, version); - List policyList = asConceptList(new SimpleToscaProvider().getPolicies(dao, name, version) - .toAuthorative().getToscaTopologyTemplate().getPolicies()); + List policyList; + + try { + policyList = asConceptList(new SimpleToscaProvider().getPolicies(dao, name, version).toAuthorative() + .getToscaTopologyTemplate().getPolicies()); + } catch (PfModelRuntimeException pfme) { + return handlePfModelRuntimeException(pfme); + } LOGGER.debug("<-getPolicyList: name={}, version={}, policyTypeList={}", name, version, policyList); return policyList; @@ -397,4 +414,18 @@ public class AuthorativeToscaProvider { return conceptMap; } + + /** + * Handle a PfModelRuntimeException on a list call. + * + * @param pfme the model exception + * @return an empty list on 404 + */ + private List handlePfModelRuntimeException(final PfModelRuntimeException pfme) { + if (Status.NOT_FOUND.equals(pfme.getErrorResponse().getResponseCode())) { + return Collections.emptyList(); + } else { + throw pfme; + } + } } diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaDataType.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaDataType.java index 86d67e4d8..a44d7654c 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaDataType.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaDataType.java @@ -3,7 +3,7 @@ * ONAP Policy Model * ================================================================================ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2019 Nordix Foundation. + * Modifications Copyright (C) 2019-2020 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,10 +24,13 @@ package org.onap.policy.models.tosca.simple.concepts; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import javax.persistence.ElementCollection; import javax.persistence.Entity; @@ -40,6 +43,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NonNull; +import org.apache.commons.collections4.CollectionUtils; import org.onap.policy.models.base.PfAuthorative; import org.onap.policy.models.base.PfConcept; import org.onap.policy.models.base.PfConceptKey; @@ -52,6 +56,7 @@ import org.onap.policy.models.base.PfValidationResult.ValidationResult; import org.onap.policy.models.tosca.authorative.concepts.ToscaConstraint; import org.onap.policy.models.tosca.authorative.concepts.ToscaDataType; import org.onap.policy.models.tosca.authorative.concepts.ToscaProperty; +import org.onap.policy.models.tosca.utils.ToscaUtils; /** * Class to represent custom data type in TOSCA definition. @@ -68,11 +73,11 @@ public class JpaToscaDataType extends JpaToscaEntityType implemen private static final long serialVersionUID = -3922690413436539164L; @ElementCollection - private List constraints; + private List constraints = new ArrayList<>(); @ElementCollection @Lob - private Map properties; + private Map properties = new LinkedHashMap<>(); /** * The Default Constructor creates a {@link JpaToscaDataType} object with a null key. @@ -268,4 +273,29 @@ public class JpaToscaDataType extends JpaToscaEntityType implemen return 0; } + + /** + * Get the data types referenced in a data type. + * + * @return the data types referenced in a data type + */ + public Collection getReferencedDataTypes() { + if (properties == null) { + return CollectionUtils.emptyCollection(); + } + + Set referencedDataTypes = new LinkedHashSet<>(); + + for (JpaToscaProperty property : properties.values()) { + referencedDataTypes.add(property.getType()); + + if (property.getEntrySchema() != null) { + referencedDataTypes.add(property.getEntrySchema().getType()); + } + } + + referencedDataTypes.removeAll(ToscaUtils.getPredefinedDataTypes()); + + return referencedDataTypes; + } } diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaEntityType.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaEntityType.java index 4823efc01..6544e7221 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaEntityType.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaEntityType.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019 Nordix Foundation. + * Copyright (C) 2019-2020 Nordix Foundation. * Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,15 +26,18 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; + import javax.persistence.AttributeOverride; import javax.persistence.AttributeOverrides; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.EmbeddedId; import javax.persistence.MappedSuperclass; + import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NonNull; + import org.apache.commons.lang3.ObjectUtils; import org.onap.policy.common.utils.validation.ParameterValidationUtils; import org.onap.policy.models.base.PfAuthorative; @@ -70,7 +73,7 @@ public class JpaToscaEntityType extends PfConcept impleme private PfConceptKey derivedFrom; @ElementCollection - private Map metadata; + private Map metadata = new TreeMap<>(); @Column private String description; @@ -154,7 +157,6 @@ public class JpaToscaEntityType extends PfConcept impleme key.setVersion(toscaEntity.getVersion()); } - if (toscaEntity.getDerivedFrom() != null) { // CHeck if the derived from field contains a name-version ID if (toscaEntity.getDerivedFrom().contains(":")) { diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicy.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicy.java index 36acec018..2816df004 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicy.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicy.java @@ -3,7 +3,7 @@ * ONAP Policy Model * ================================================================================ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2019 Nordix Foundation. + * Modifications Copyright (C) 2019-2020 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,10 +23,12 @@ package org.onap.policy.models.tosca.simple.concepts; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; + import javax.persistence.AttributeOverride; import javax.persistence.AttributeOverrides; import javax.persistence.Column; @@ -37,9 +39,11 @@ import javax.persistence.InheritanceType; import javax.persistence.Lob; import javax.persistence.Table; import javax.ws.rs.core.Response; + import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NonNull; + import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.common.utils.validation.ParameterValidationUtils; @@ -87,7 +91,7 @@ public class JpaToscaPolicy extends JpaToscaEntityType implements P private Map properties; @ElementCollection - private List targets; + private List targets = new ArrayList<>(); // @formatter:on /** @@ -186,15 +190,13 @@ public class JpaToscaPolicy extends JpaToscaEntityType implements P if (toscaPolicy.getType() != null) { type.setName(toscaPolicy.getType()); - } - else { + } else { type.setName(PfKey.NULL_KEY_NAME); } if (toscaPolicy.getTypeVersion() != null) { type.setVersion(toscaPolicy.getTypeVersion()); - } - else { + } else { type.setVersion(PfKey.NULL_KEY_VERSION); } diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicyType.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicyType.java index 43d7ad633..b068beaa0 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicyType.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicyType.java @@ -23,6 +23,7 @@ package org.onap.policy.models.tosca.simple.concepts; +import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -73,13 +74,13 @@ public class JpaToscaPolicyType extends JpaToscaEntityType impl @ElementCollection @Lob - private Map properties; + private Map properties = new LinkedHashMap<>(); @ElementCollection - private List targets; + private List targets = new ArrayList<>(); @ElementCollection - private List triggers; + private List triggers = new ArrayList<>(); /** * The Default Constructor creates a {@link JpaToscaPolicyType} object with a null key. diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicyTypes.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicyTypes.java index 9c059b483..00a6d6b50 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicyTypes.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicyTypes.java @@ -109,6 +109,7 @@ public class JpaToscaPolicyTypes extends PfConceptContainer dataTypeKeyCollection, final PfValidationResult result) { + for (PfConceptKey dataTypeKey : dataTypeKeyCollection) { + if (dataTypes == null || dataTypes.get(dataTypeKey) == null) { + result.addValidationMessage(new PfValidationMessage(referencingEntityKey, this.getClass(), + ValidationResult.INVALID, "referenced data type " + dataTypeKey.getId() + " not found")); + } + } + } + /** * Validate that all policy types referenced in policies exist. * @@ -364,11 +390,12 @@ public class JpaToscaServiceTemplate extends JpaToscaEntityTypegetServiceTemplate"); + + JpaToscaServiceTemplate serviceTemplate = new SimpleToscaServiceTemplateProvider().read(dao); + if (serviceTemplate == null) { + throw new PfModelRuntimeException(Response.Status.NOT_FOUND, SERVICE_TEMPLATE_NOT_FOUND_IN_DATABASE); + } + + LOGGER.debug("<-getServiceTemplate: serviceTemplate={}", serviceTemplate); + return serviceTemplate; + } + + /** + * Append a service template fragment to the service template in the database. + * + * @param dao the DAO to use to access the database + * @param incomingServiceTemplateFragment the service template containing the definition of the entities to be + * created + * @return the TOSCA service template in the database after the operation + * @throws PfModelException on errors appending a service template to the template in the database + */ + public JpaToscaServiceTemplate appendToServiceTemplate(@NonNull final PfDao dao, + @NonNull final JpaToscaServiceTemplate incomingServiceTemplateFragment) throws PfModelException { + LOGGER.debug("->appendServiceTemplateFragment: incomingServiceTemplateFragment={}", + incomingServiceTemplateFragment); + + JpaToscaServiceTemplate dbServiceTemplate = new SimpleToscaServiceTemplateProvider().read(dao); + + JpaToscaServiceTemplate serviceTemplateToWrite; + if (dbServiceTemplate == null) { + serviceTemplateToWrite = incomingServiceTemplateFragment; + } else { + serviceTemplateToWrite = + ToscaServiceTemplateUtils.addFragment(dbServiceTemplate, incomingServiceTemplateFragment); + } + + PfValidationResult result = serviceTemplateToWrite.validate(new PfValidationResult()); + if (!result.isValid()) { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, result.toString()); + } + + new SimpleToscaServiceTemplateProvider().write(dao, serviceTemplateToWrite); + + LOGGER.debug("<-appendServiceTemplateFragment: returnServiceTempalate={}", serviceTemplateToWrite); + return serviceTemplateToWrite; + } + /** * Get data types. * @@ -70,13 +128,34 @@ public class SimpleToscaProvider { throws PfModelException { LOGGER.debug("->getDataTypes: name={}, version={}", name, version); - // Create the structure of the TOSCA service template to contain the data type - JpaToscaServiceTemplate serviceTemplate = new JpaToscaServiceTemplate(); - serviceTemplate.setDataTypes(new JpaToscaDataTypes()); + JpaToscaServiceTemplate serviceTemplate = getServiceTemplate(dao); + + if (!ToscaUtils.doDataTypesExist(serviceTemplate)) { + throw new PfModelRuntimeException(Response.Status.NOT_FOUND, + "data types for " + name + ":" + version + DO_NOT_EXIST); + } - // Add the data type to the TOSCA service template - List jpaDataTypeList = dao.getFiltered(JpaToscaDataType.class, name, version); - serviceTemplate.getDataTypes().getConceptMap().putAll(asConceptMap(jpaDataTypeList)); + serviceTemplate.setPolicyTypes(null); + serviceTemplate.setTopologyTemplate(null); + + ToscaUtils.getEntityTree(serviceTemplate.getDataTypes(), name, version); + + if (!ToscaUtils.doDataTypesExist(serviceTemplate)) { + throw new PfModelRuntimeException(Response.Status.NOT_FOUND, + "data types for " + name + ":" + version + DO_NOT_EXIST); + } + + for (JpaToscaDataType dataType : serviceTemplate.getDataTypes().getConceptMap().values()) { + Collection referencedDataTypeKeys = dataType.getReferencedDataTypes(); + + for (PfConceptKey referencedDataTypeKey : referencedDataTypeKeys) { + JpaToscaServiceTemplate dataTypeEntityTreeServiceTemplate = + getDataTypes(dao, referencedDataTypeKey.getName(), referencedDataTypeKey.getVersion()); + + serviceTemplate = + ToscaServiceTemplateUtils.addFragment(serviceTemplate, dataTypeEntityTreeServiceTemplate); + } + } LOGGER.debug("<-getDataTypes: name={}, version={}, serviceTemplate={}", name, version, serviceTemplate); return serviceTemplate; @@ -86,32 +165,20 @@ public class SimpleToscaProvider { * Create data types. * * @param dao the DAO to use to access the database - * @param serviceTemplate the service template containing the definition of the data types to be created + * @param incomingServiceTemplate the service template containing the definition of the data types to be created * @return the TOSCA service template containing the created data types * @throws PfModelException on errors creating data types */ public JpaToscaServiceTemplate createDataTypes(@NonNull final PfDao dao, - @NonNull final JpaToscaServiceTemplate serviceTemplate) throws PfModelException { - LOGGER.debug("->createDataTypes: serviceTempalate={}", serviceTemplate); - - ToscaUtils.assertDataTypesExist(serviceTemplate); - - for (JpaToscaDataType dataType : serviceTemplate.getDataTypes().getAll(null)) { - dao.create(dataType); - } + @NonNull final JpaToscaServiceTemplate incomingServiceTemplate) throws PfModelException { + LOGGER.debug("->createDataTypes: incomingServiceTemplate={}", incomingServiceTemplate); - // Return the created Data types - JpaToscaDataTypes returnDataTypes = new JpaToscaDataTypes(); + ToscaUtils.assertDataTypesExist(incomingServiceTemplate); - for (PfConceptKey dataTypeKey : serviceTemplate.getDataTypes().getConceptMap().keySet()) { - returnDataTypes.getConceptMap().put(dataTypeKey, dao.get(JpaToscaDataType.class, dataTypeKey)); - } + JpaToscaServiceTemplate writtenServiceTemplate = appendToServiceTemplate(dao, incomingServiceTemplate); - JpaToscaServiceTemplate returnServiceTemplate = new JpaToscaServiceTemplate(); - returnServiceTemplate.setDataTypes(returnDataTypes); - - LOGGER.debug("<-createDataTypes: returnServiceTempalate={}", returnServiceTemplate); - return returnServiceTemplate; + LOGGER.debug("<-createDataTypes: returnServiceTempalate={}", writtenServiceTemplate); + return writtenServiceTemplate; } /** @@ -180,20 +247,33 @@ public class SimpleToscaProvider { throws PfModelException { LOGGER.debug("->getPolicyTypes: name={}, version={}", name, version); - // Create the structure of the TOSCA service template to contain the policy type - JpaToscaServiceTemplate serviceTemplate = new JpaToscaServiceTemplate(); - serviceTemplate.setPolicyTypes(new JpaToscaPolicyTypes()); + JpaToscaServiceTemplate serviceTemplate = getServiceTemplate(dao); + + serviceTemplate.setDataTypes(null); + serviceTemplate.setTopologyTemplate(null); + + if (!ToscaUtils.doPolicyTypesExist(serviceTemplate)) { + throw new PfModelRuntimeException(Response.Status.NOT_FOUND, + "policy types for " + name + ":" + version + DO_NOT_EXIST); + } + + ToscaUtils.getEntityTree(serviceTemplate.getPolicyTypes(), name, version); - // Add the policy type to the TOSCA service template - List jpaPolicyTypeList = dao.getFiltered(JpaToscaPolicyType.class, name, version); - serviceTemplate.getPolicyTypes().getConceptMap().putAll(asConceptMap(jpaPolicyTypeList)); + if (!ToscaUtils.doPolicyTypesExist(serviceTemplate)) { + throw new PfModelRuntimeException(Response.Status.NOT_FOUND, + "policy types for " + name + ":" + version + DO_NOT_EXIST); + } + + for (JpaToscaPolicyType policyType : serviceTemplate.getPolicyTypes().getConceptMap().values()) { + Collection referencedDataTypeKeys = policyType.getReferencedDataTypes(); - // Return all data types - // TODO: In an upcoming review, return just the data types used by the policy types on the policy type list - List jpaDataTypeList = dao.getFiltered(JpaToscaDataType.class, null, null); - if (!CollectionUtils.isEmpty(jpaDataTypeList)) { - serviceTemplate.setDataTypes(new JpaToscaDataTypes()); - serviceTemplate.getDataTypes().getConceptMap().putAll(asConceptMap(jpaDataTypeList)); + for (PfConceptKey referencedDataTypeKey : referencedDataTypeKeys) { + JpaToscaServiceTemplate dataTypeEntityTreeServiceTemplate = + getDataTypes(dao, referencedDataTypeKey.getName(), referencedDataTypeKey.getVersion()); + + serviceTemplate = + ToscaServiceTemplateUtils.addFragment(serviceTemplate, dataTypeEntityTreeServiceTemplate); + } } LOGGER.debug("<-getPolicyTypes: name={}, version={}, serviceTemplate={}", name, version, serviceTemplate); @@ -204,37 +284,20 @@ public class SimpleToscaProvider { * Create policy types. * * @param dao the DAO to use to access the database - * @param serviceTemplate the service template containing the definition of the policy types to be created + * @param incomingServiceTemplate the service template containing the definition of the policy types to be created * @return the TOSCA service template containing the created policy types * @throws PfModelException on errors creating policy types */ public JpaToscaServiceTemplate createPolicyTypes(@NonNull final PfDao dao, - @NonNull final JpaToscaServiceTemplate serviceTemplate) throws PfModelException { - LOGGER.debug("->createPolicyTypes: serviceTempalate={}", serviceTemplate); - - ToscaUtils.assertPolicyTypesExist(serviceTemplate); + @NonNull final JpaToscaServiceTemplate incomingServiceTemplate) throws PfModelException { + LOGGER.debug("->createPolicyTypes: serviceTempalate={}", incomingServiceTemplate); - // Create the data types on the policy type - if (ToscaUtils.doDataTypesExist(serviceTemplate)) { - createDataTypes(dao, serviceTemplate); - } + ToscaUtils.assertPolicyTypesExist(incomingServiceTemplate); - for (JpaToscaPolicyType policyType : serviceTemplate.getPolicyTypes().getAll(null)) { - dao.create(policyType); - } - - // Return the created policy types - JpaToscaPolicyTypes returnPolicyTypes = new JpaToscaPolicyTypes(); + JpaToscaServiceTemplate writtenServiceTemplate = appendToServiceTemplate(dao, incomingServiceTemplate); - for (PfConceptKey policyTypeKey : serviceTemplate.getPolicyTypes().getConceptMap().keySet()) { - returnPolicyTypes.getConceptMap().put(policyTypeKey, dao.get(JpaToscaPolicyType.class, policyTypeKey)); - } - - JpaToscaServiceTemplate returnServiceTemplate = new JpaToscaServiceTemplate(); - returnServiceTemplate.setPolicyTypes(returnPolicyTypes); - - LOGGER.debug("<-createPolicyTypes: returnServiceTempalate={}", returnServiceTemplate); - return returnServiceTemplate; + LOGGER.debug("<-createPolicyTypes: returnServiceTempalate={}", writtenServiceTemplate); + return writtenServiceTemplate; } /** @@ -309,14 +372,29 @@ public class SimpleToscaProvider { throws PfModelException { LOGGER.debug("->getPolicies: name={}, version={}", name, version); - // Create the structure of the TOSCA service template to contain the policy type - JpaToscaServiceTemplate serviceTemplate = new JpaToscaServiceTemplate(); - serviceTemplate.setTopologyTemplate(new JpaToscaTopologyTemplate()); - serviceTemplate.getTopologyTemplate().setPolicies(new JpaToscaPolicies()); + JpaToscaServiceTemplate serviceTemplate = getServiceTemplate(dao); + + if (!ToscaUtils.doPoliciesExist(serviceTemplate)) { + throw new PfModelRuntimeException(Response.Status.NOT_FOUND, + "policies for " + name + ":" + version + DO_NOT_EXIST); + } + + ToscaUtils.getEntityTree(serviceTemplate.getTopologyTemplate().getPolicies(), name, version); + + if (!ToscaUtils.doPoliciesExist(serviceTemplate)) { + throw new PfModelRuntimeException(Response.Status.NOT_FOUND, + "policies for " + name + ":" + version + DO_NOT_EXIST); + } - // Add the policy type to the TOSCA service template - List jpaPolicyList = dao.getFiltered(JpaToscaPolicy.class, name, version); - serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().putAll(asConceptMap(jpaPolicyList)); + for (JpaToscaPolicy policy : serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().values()) { + if (policy.getDerivedFrom() != null) { + JpaToscaServiceTemplate referencedEntitiesServiceTemplate = + getPolicyTypes(dao, policy.getDerivedFrom().getName(), policy.getDerivedFrom().getVersion()); + + serviceTemplate = + ToscaServiceTemplateUtils.addFragment(serviceTemplate, referencedEntitiesServiceTemplate); + } + } LOGGER.debug("<-getPolicies: name={}, version={}, serviceTemplate={}", name, version, serviceTemplate); return serviceTemplate; @@ -326,33 +404,20 @@ public class SimpleToscaProvider { * Create policies. * * @param dao the DAO to use to access the database - * @param serviceTemplate the service template containing the definitions of the new policies to be created. + * @param incomingServiceTemplate the service template containing the definitions of the new policies to be created. * @return the TOSCA service template containing the policy types that were created * @throws PfModelException on errors creating policies */ public JpaToscaServiceTemplate createPolicies(@NonNull final PfDao dao, - @NonNull final JpaToscaServiceTemplate serviceTemplate) throws PfModelException { - LOGGER.debug("->createPolicies: serviceTempalate={}", serviceTemplate); - - ToscaUtils.assertPoliciesExist(serviceTemplate); - - for (JpaToscaPolicy policy : serviceTemplate.getTopologyTemplate().getPolicies().getAll(null)) { - verifyPolicyTypeForPolicy(dao, policy); - dao.create(policy); - } - - // Return the created policy types - JpaToscaPolicies returnPolicies = new JpaToscaPolicies(); - returnPolicies.setKey(serviceTemplate.getTopologyTemplate().getPolicies().getKey()); + @NonNull final JpaToscaServiceTemplate incomingServiceTemplate) throws PfModelException { + LOGGER.debug("->createPolicies: incomingServiceTemplate={}", incomingServiceTemplate); - for (PfConceptKey policyKey : serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().keySet()) { - returnPolicies.getConceptMap().put(policyKey, dao.get(JpaToscaPolicy.class, policyKey)); - } + ToscaUtils.assertPoliciesExist(incomingServiceTemplate); - serviceTemplate.getTopologyTemplate().setPolicies(returnPolicies); + JpaToscaServiceTemplate writtenServiceTemplate = appendToServiceTemplate(dao, incomingServiceTemplate); - LOGGER.debug("<-createPolicies: serviceTemplate={}", serviceTemplate); - return serviceTemplate; + LOGGER.debug("<-createPolicies: serviceTemplate={}", writtenServiceTemplate); + return writtenServiceTemplate; } /** @@ -408,21 +473,6 @@ public class SimpleToscaProvider { return serviceTemplate; } - /** - * Convert a list of concepts to a map of concepts. - * - * @param conceptList the concept list - * @return the concept map - */ - private Map asConceptMap(List conceptList) { - Map conceptMap = new LinkedHashMap<>(); - for (T concept : conceptList) { - conceptMap.put((PfConceptKey) concept.getKey(), concept); - } - - return conceptMap; - } - /** * Verify the policy type for a policy exists. * @@ -447,7 +497,6 @@ public class SimpleToscaProvider { if (policyType == null) { String errorMessage = "policy type " + policyTypeKey.getId() + " for policy " + policy.getId() + " does not exist"; - LOGGER.warn(errorMessage); throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage); } } @@ -476,8 +525,7 @@ public class SimpleToscaProvider { // We should have one and only one returned entry if (filterdPolicyTypeList.size() != 1) { - String errorMessage = "search for lates policy type " + policyTypeName + " returned more than one entry"; - LOGGER.warn(errorMessage); + String errorMessage = "search for latest policy type " + policyTypeName + " returned more than one entry"; throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage); } diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java index 390692277..cc0431946 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java @@ -52,14 +52,18 @@ public final class ToscaUtils { // @formatter:off private static final Set PREDEFINED_TOSCA_DATA_TYPES = Set.of( - new PfConceptKey("string", PfKey.NULL_KEY_VERSION), - new PfConceptKey("integer", PfKey.NULL_KEY_VERSION), - new PfConceptKey("float", PfKey.NULL_KEY_VERSION), - new PfConceptKey("boolean", PfKey.NULL_KEY_VERSION), - new PfConceptKey("timestamp", PfKey.NULL_KEY_VERSION), - new PfConceptKey("null", PfKey.NULL_KEY_VERSION), - new PfConceptKey("list", PfKey.NULL_KEY_VERSION), - new PfConceptKey("map", PfKey.NULL_KEY_VERSION) + new PfConceptKey("string", PfKey.NULL_KEY_VERSION), + new PfConceptKey("integer", PfKey.NULL_KEY_VERSION), + new PfConceptKey("float", PfKey.NULL_KEY_VERSION), + new PfConceptKey("boolean", PfKey.NULL_KEY_VERSION), + new PfConceptKey("timestamp", PfKey.NULL_KEY_VERSION), + new PfConceptKey("null", PfKey.NULL_KEY_VERSION), + new PfConceptKey("list", PfKey.NULL_KEY_VERSION), + new PfConceptKey("map", PfKey.NULL_KEY_VERSION), + new PfConceptKey("scalar-unit.size", PfKey.NULL_KEY_VERSION), + new PfConceptKey("scalar-unit.time", PfKey.NULL_KEY_VERSION), + new PfConceptKey("scalar-unit.frequency", PfKey.NULL_KEY_VERSION), + new PfConceptKey("tosca.datatypes.TimeInterval", PfKey.NULL_KEY_VERSION) ); // @formatter:on @@ -242,17 +246,18 @@ public final class ToscaUtils { * Get the entity tree from a concept container for a given entity key. * * @param entityTypes the concept container containing entity types - * @param searchKey the key to search for + * @param entityName the name of the entity + * @param entityVersion the version of the entity */ public static void getEntityTree( @NonNull final PfConceptContainer entityTypes, - @NonNull final PfConceptKey searchKey) { + final String entityName, final String entityVersion) { PfValidationResult result = new PfValidationResult(); @SuppressWarnings("unchecked") Set> filteredEntitySet = - (Set>) entityTypes.getAll(searchKey.getName(), searchKey.getVersion()); + (Set>) entityTypes.getAll(entityName, entityVersion); for (JpaToscaEntityType filteredEntityType : filteredEntitySet) { filteredEntitySet.addAll(ToscaUtils.getEntityTypeAncestors(entityTypes, filteredEntityType, result)); } diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderPolicyTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderPolicyTest.java index 36c66546a..8b79374bc 100644 --- a/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderPolicyTest.java +++ b/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderPolicyTest.java @@ -156,8 +156,7 @@ public class AuthorativeToscaProviderPolicyTest { assertEquals(1, gotPolicyList.size()); assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, gotPolicyList.get(0))); - gotPolicyList = new AuthorativeToscaProvider().getPolicyList(pfDao, "Nonexistant", VERSION_100); - assertEquals(0, gotPolicyList.size()); + assertTrue(new AuthorativeToscaProvider().getPolicyList(pfDao, "Nonexistant", VERSION_100).isEmpty()); } @Test @@ -380,10 +379,11 @@ public class AuthorativeToscaProviderPolicyTest { assertEquals(0, beforePolicy.compareNameVersion(beforePolicy, createdPolicy)); assertTrue(beforePolicy.getType().equals(deletedPolicy.getType())); - ToscaServiceTemplate gotServiceTemplate = - new AuthorativeToscaProvider().getPolicies(pfDao, policyKey.getName(), policyKey.getVersion()); - - assertTrue(gotServiceTemplate.getToscaTopologyTemplate().getPolicies().isEmpty()); + // @formatter:off + assertThatThrownBy( + () -> new AuthorativeToscaProvider().getPolicies(pfDao, policyKey.getName(), policyKey.getVersion())) + .hasMessageMatching("policies for onap.restart.tca:1.0.0 do not exist"); + // @formatter:on } @Test diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderPolicyTypeTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderPolicyTypeTest.java index c41f5e1f4..ae350bd90 100644 --- a/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderPolicyTypeTest.java +++ b/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/provider/AuthorativeToscaProviderPolicyTypeTest.java @@ -58,8 +58,8 @@ import org.yaml.snakeyaml.Yaml; */ public class AuthorativeToscaProviderPolicyTypeTest { private static final String VERSION = "version"; - private static final String POLICY_AFFINITY_VERSION0 = "onap.policies.NoVersion:0.0.0"; - private static final String POLICY_AFFINITY = "onap.policies.NoVersion"; + private static final String POLICY_NO_VERSION_VERSION0 = "onap.policies.NoVersion:0.0.0"; + private static final String POLICY_NO_VERSION = "onap.policies.NoVersion"; private static final String MISSING_POLICY_TYPES = "no policy types specified on service template"; private static final String DAO_IS_NULL = "^dao is marked .*on.*ull but is null$"; private static final String VERSION_000 = "0.0.0"; @@ -135,7 +135,7 @@ public class AuthorativeToscaProviderPolicyTypeTest { ToscaServiceTemplate createdServiceTemplate = new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplate); - PfConceptKey policyTypeKey = new PfConceptKey(POLICY_AFFINITY_VERSION0); + PfConceptKey policyTypeKey = new PfConceptKey(POLICY_NO_VERSION_VERSION0); ToscaPolicyType beforePolicyType = toscaServiceTemplate.getPolicyTypes().get(policyTypeKey.getName()); ToscaPolicyType createdPolicyType = createdServiceTemplate.getPolicyTypes().get(policyTypeKey.getName()); @@ -150,21 +150,26 @@ public class AuthorativeToscaProviderPolicyTypeTest { assertEquals(0, ObjectUtils.compare(beforePolicyType.getDescription(), createdPolicyType.getDescription())); List gotPolicyTypeList = - new AuthorativeToscaProvider().getPolicyTypeList(pfDao, POLICY_AFFINITY, VERSION_000); - assertEquals(1, gotPolicyTypeList.size()); + new AuthorativeToscaProvider().getPolicyTypeList(pfDao, POLICY_NO_VERSION, VERSION_000); + assertEquals(2, gotPolicyTypeList.size()); assertEquals(true, beforePolicyType.getName().equals(gotPolicyType.getName())); - gotPolicyTypeList = new AuthorativeToscaProvider().getPolicyTypeList(pfDao, POLICY_AFFINITY, null); - assertEquals(1, gotPolicyTypeList.size()); + gotPolicyTypeList = new AuthorativeToscaProvider().getPolicyTypeList(pfDao, POLICY_NO_VERSION, null); + assertEquals(2, gotPolicyTypeList.size()); assertEquals(true, beforePolicyType.getName().equals(gotPolicyType.getName())); gotPolicyTypeList = new AuthorativeToscaProvider().getPolicyTypeList(pfDao, null, null); - assertEquals(1, gotPolicyTypeList.size()); + assertEquals(2, gotPolicyTypeList.size()); assertEquals(true, beforePolicyType.getName().equals(gotPolicyType.getName())); gotPolicyTypeList = new AuthorativeToscaProvider().getPolicyTypeList(pfDao, null, VERSION_000); - assertEquals(1, gotPolicyTypeList.size()); + assertEquals(2, gotPolicyTypeList.size()); assertEquals(true, beforePolicyType.getName().equals(gotPolicyType.getName())); + + assertThatThrownBy(() -> new AuthorativeToscaProvider().getPolicyTypeList(new DefaultPfDao(), POLICY_NO_VERSION, + VERSION_000)).hasMessageContaining("Policy Framework DAO has not been initialized"); + + assertTrue(new AuthorativeToscaProvider().getPolicyTypeList(pfDao, "i.dont.Exist", VERSION_000).isEmpty()); } @Test @@ -193,13 +198,21 @@ public class AuthorativeToscaProviderPolicyTypeTest { new AuthorativeToscaProvider().getFilteredPolicyTypeList(pfDao, null); }).hasMessageMatching("^filter is marked .*on.*ull but is null$"); + assertThatThrownBy(() -> new AuthorativeToscaProvider().getFilteredPolicyTypeList(new DefaultPfDao(), + ToscaPolicyTypeFilter.builder().name("i.dont.Exist").build())) + .hasMessageContaining("Policy Framework DAO has not been initialized"); + + assertTrue(new AuthorativeToscaProvider() + .getFilteredPolicyTypeList(pfDao, ToscaPolicyTypeFilter.builder().name("i.dont.Exist").build()) + .isEmpty()); + ToscaServiceTemplate toscaServiceTemplate = standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class); assertNotNull(toscaServiceTemplate); ToscaServiceTemplate createdServiceTemplate = new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplate); - PfConceptKey policyTypeKey = new PfConceptKey(POLICY_AFFINITY_VERSION0); + PfConceptKey policyTypeKey = new PfConceptKey(POLICY_NO_VERSION_VERSION0); ToscaPolicyType beforePolicyType = toscaServiceTemplate.getPolicyTypes().get(policyTypeKey.getName()); ToscaPolicyType createdPolicyType = createdServiceTemplate.getPolicyTypes().get(policyTypeKey.getName()); @@ -228,13 +241,13 @@ public class AuthorativeToscaProviderPolicyTypeTest { assertEquals(0, ObjectUtils.compare(beforePolicyType.getDescription(), gotPolicyType.getDescription())); List gotPolicyTypeList = - new AuthorativeToscaProvider().getPolicyTypeList(pfDao, POLICY_AFFINITY, VERSION_000); - assertEquals(1, gotPolicyTypeList.size()); + new AuthorativeToscaProvider().getPolicyTypeList(pfDao, POLICY_NO_VERSION, VERSION_000); + assertEquals(2, gotPolicyTypeList.size()); assertEquals(true, beforePolicyType.getName().equals(gotPolicyType.getName())); gotPolicyTypeList = new AuthorativeToscaProvider().getFilteredPolicyTypeList(pfDao, ToscaPolicyTypeFilter.builder().build()); - assertEquals(1, gotPolicyTypeList.size()); + assertEquals(2, gotPolicyTypeList.size()); assertEquals(true, beforePolicyType.getName().equals(gotPolicyType.getName())); gotPolicyTypeList = new AuthorativeToscaProvider().getFilteredPolicyTypeList(pfDao, @@ -249,7 +262,7 @@ public class AuthorativeToscaProviderPolicyTypeTest { gotPolicyTypeList = new AuthorativeToscaProvider().getFilteredPolicyTypeList(pfDao, ToscaPolicyTypeFilter.builder().version("1.0.0").build()); - assertEquals(0, gotPolicyTypeList.size()); + assertEquals(1, gotPolicyTypeList.size()); assertEquals(true, beforePolicyType.getName().equals(gotPolicyType.getName())); } @@ -283,7 +296,7 @@ public class AuthorativeToscaProviderPolicyTypeTest { ToscaServiceTemplate createdServiceTemplate = new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplate); - PfConceptKey policyTypeKey = new PfConceptKey(POLICY_AFFINITY_VERSION0); + PfConceptKey policyTypeKey = new PfConceptKey(POLICY_NO_VERSION_VERSION0); ToscaPolicyType beforePolicyType = toscaServiceTemplate.getPolicyTypes().get(policyTypeKey.getName()); ToscaPolicyType createdPolicyType = createdServiceTemplate.getPolicyTypes().get(policyTypeKey.getName()); @@ -315,7 +328,7 @@ public class AuthorativeToscaProviderPolicyTypeTest { ToscaServiceTemplate createdServiceTemplate = new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplate); - PfConceptKey policyTypeKey = new PfConceptKey(POLICY_AFFINITY_VERSION0); + PfConceptKey policyTypeKey = new PfConceptKey(POLICY_NO_VERSION_VERSION0); ToscaPolicyType beforePolicyType = toscaServiceTemplate.getPolicyTypes().get(policyTypeKey.getName()); ToscaPolicyType createdPolicyType = createdServiceTemplate.getPolicyTypes().get(policyTypeKey.getName()); @@ -366,7 +379,7 @@ public class AuthorativeToscaProviderPolicyTypeTest { ToscaServiceTemplate createdServiceTemplate = new AuthorativeToscaProvider().createPolicyTypes(pfDao, toscaServiceTemplate); - PfConceptKey policyTypeKey = new PfConceptKey(POLICY_AFFINITY_VERSION0); + PfConceptKey policyTypeKey = new PfConceptKey(POLICY_NO_VERSION_VERSION0); ToscaPolicyType beforePolicyType = toscaServiceTemplate.getPolicyTypes().get(policyTypeKey.getName()); ToscaPolicyType createdPolicyType = createdServiceTemplate.getPolicyTypes().get(policyTypeKey.getName()); @@ -380,10 +393,9 @@ public class AuthorativeToscaProviderPolicyTypeTest { assertEquals(true, beforePolicyType.getName().equals(deletedPolicy.getName())); assertEquals(0, ObjectUtils.compare(beforePolicyType.getDescription(), deletedPolicy.getDescription())); - ToscaServiceTemplate gotServiceTemplate = new AuthorativeToscaProvider().getPolicyTypes(pfDao, - policyTypeKey.getName(), policyTypeKey.getVersion()); - - assertTrue(gotServiceTemplate.getPolicyTypes().isEmpty()); + assertThatThrownBy(() -> { + new AuthorativeToscaProvider().getPolicyTypes(pfDao, policyTypeKey.getName(), policyTypeKey.getVersion()); + }).hasMessage("policy types for onap.policies.NoVersion:0.0.0 do not exist"); } @Test diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/legacy/mapping/LegacyGuardPolicyMapperTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/legacy/mapping/LegacyGuardPolicyMapperTest.java index 6d32c6d0b..62c088c83 100644 --- a/models-tosca/src/test/java/org/onap/policy/models/tosca/legacy/mapping/LegacyGuardPolicyMapperTest.java +++ b/models-tosca/src/test/java/org/onap/policy/models/tosca/legacy/mapping/LegacyGuardPolicyMapperTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019 Nordix Foundation. + * Copyright (C) 2019-2020 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import static org.junit.Assert.assertEquals; import java.util.LinkedHashMap; import java.util.Map; + import org.junit.Test; import org.onap.policy.models.base.PfConceptKey; import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyOutput; @@ -49,10 +50,6 @@ public class LegacyGuardPolicyMapperTest { JpaToscaPolicy policy = new JpaToscaPolicy(new PfConceptKey("PolicyName", "2.0.0")); serviceTemplate.getTopologyTemplate().getPolicies().getConceptMap().put(policy.getKey(), policy); - assertThatThrownBy(() -> { - new LegacyGuardPolicyMapper().fromToscaServiceTemplate(serviceTemplate); - }).hasMessageContaining("no metadata defined on TOSCA policy"); - policy.setMetadata(new LinkedHashMap<>()); assertThatThrownBy(() -> { new LegacyGuardPolicyMapper().fromToscaServiceTemplate(serviceTemplate); diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaDataTypeTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaDataTypeTest.java index 499cf72fb..d205794de 100644 --- a/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaDataTypeTest.java +++ b/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaDataTypeTest.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019=-2020 Nordix Foundation. + * Copyright (C) 2019-2020 Nordix Foundation. * Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -34,13 +34,14 @@ import java.util.Map; import org.junit.Test; import org.onap.policy.models.base.PfConceptKey; +import org.onap.policy.models.base.PfKey; import org.onap.policy.models.base.PfReferenceKey; import org.onap.policy.models.base.PfValidationResult; import org.onap.policy.models.tosca.authorative.concepts.ToscaConstraint; import org.onap.policy.models.tosca.authorative.concepts.ToscaDataType; /** - * DAO test for ToscaDatatype. + * DAO test for JpaToscaDatatype. * * @author Liam Fallon (liam.fallon@est.tech) */ @@ -140,4 +141,53 @@ public class JpaToscaDataTypeTest { ToscaDataType datOut = tdta.toAuthorative(); assertNotNull(datOut); } + + @Test + public void testGetReferencedDataTypes() { + JpaToscaDataType dt0 = new JpaToscaDataType(new PfConceptKey("dt0", "0.0.1")); + + assertTrue(dt0.getReferencedDataTypes().isEmpty()); + + dt0.setProperties(new LinkedHashMap<>()); + assertTrue(dt0.getReferencedDataTypes().isEmpty()); + + JpaToscaProperty prop0 = new JpaToscaProperty(new PfReferenceKey(dt0.getKey(), "prop0")); + prop0.setType(new PfConceptKey("string", PfKey.NULL_KEY_VERSION)); + assertTrue(prop0.validate(new PfValidationResult()).isValid()); + + dt0.getProperties().put(prop0.getKey().getLocalName(), prop0); + assertTrue(dt0.getReferencedDataTypes().isEmpty()); + + JpaToscaProperty prop1 = new JpaToscaProperty(new PfReferenceKey(dt0.getKey(), "prop1")); + prop1.setType(new PfConceptKey("the.property.Type0", "0.0.1")); + assertTrue(prop1.validate(new PfValidationResult()).isValid()); + + dt0.getProperties().put(prop1.getKey().getLocalName(), prop1); + assertEquals(1, dt0.getReferencedDataTypes().size()); + + JpaToscaProperty prop2 = new JpaToscaProperty(new PfReferenceKey(dt0.getKey(), "prop2")); + prop2.setType(new PfConceptKey("the.property.Type0", "0.0.1")); + assertTrue(prop2.validate(new PfValidationResult()).isValid()); + + dt0.getProperties().put(prop2.getKey().getLocalName(), prop2); + assertEquals(1, dt0.getReferencedDataTypes().size()); + + JpaToscaProperty prop3 = new JpaToscaProperty(new PfReferenceKey(dt0.getKey(), "prop4")); + prop3.setType(new PfConceptKey("the.property.Type1", "0.0.1")); + prop3.setEntrySchema(new JpaToscaEntrySchema()); + prop3.getEntrySchema().setType(new PfConceptKey("the.property.Type3", "0.0.1")); + assertTrue(prop3.validate(new PfValidationResult()).isValid()); + + dt0.getProperties().put(prop3.getKey().getLocalName(), prop3); + assertEquals(3, dt0.getReferencedDataTypes().size()); + + JpaToscaProperty prop4 = new JpaToscaProperty(new PfReferenceKey(dt0.getKey(), "prop4")); + prop4.setType(new PfConceptKey("the.property.Type1", "0.0.1")); + prop4.setEntrySchema(new JpaToscaEntrySchema()); + prop4.getEntrySchema().setType(new PfConceptKey("the.property.Type2", "0.0.1")); + assertTrue(prop4.validate(new PfValidationResult()).isValid()); + + dt0.getProperties().put(prop4.getKey().getLocalName(), prop4); + assertEquals(3, dt0.getReferencedDataTypes().size()); + } } diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaServiceTemplateTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaServiceTemplateTest.java index 95c51e912..5cbec008b 100644 --- a/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaServiceTemplateTest.java +++ b/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaServiceTemplateTest.java @@ -21,6 +21,7 @@ package org.onap.policy.models.tosca.simple.concepts; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -135,5 +136,101 @@ public class JpaToscaServiceTemplateTest { assertTrue(tst.validate(new PfValidationResult()).isValid()); assertThatThrownBy(() -> tst.validate(null)).hasMessageMatching("resultIn is marked .*on.*ull but is null"); + + tst.setToscaDefinitionsVersion(null); + PfValidationResult result = tst.validate(new PfValidationResult()); + assertThat(result.toString()).contains("service template tosca definitions version may not be null"); + + tst.setToscaDefinitionsVersion(JpaToscaServiceTemplate.DEFAULT_TOSCA_DEFINTIONS_VERISON); + tst.setDataTypes(null); + result = tst.validate(new PfValidationResult()); + assertTrue(result.isOk()); + + JpaToscaPolicyType pt0 = new JpaToscaPolicyType(new PfConceptKey("pt0:0.0.1")); + tst.getPolicyTypes().getConceptMap().put(pt0.getKey(), pt0); + result = tst.validate(new PfValidationResult()); + assertTrue(result.isOk()); + + JpaToscaDataType dt0 = new JpaToscaDataType(new PfConceptKey("dt0:0.0.1")); + JpaToscaProperty prop0 = new JpaToscaProperty(new PfReferenceKey(pt0.getKey(), "prop0")); + prop0.setType(dt0.getKey()); + pt0.getProperties().put(prop0.getKey().getLocalName(), prop0); + result = tst.validate(new PfValidationResult()); + assertFalse(result.isOk()); + assertThat(result.toString()).contains("referenced data type dt0:0.0.1 not found"); + + tst.setDataTypes(null); + result = tst.validate(new PfValidationResult()); + assertFalse(result.isOk()); + assertThat(result.toString()).contains("referenced data type dt0:0.0.1 not found"); + + tst.setDataTypes(new JpaToscaDataTypes()); + result = tst.validate(new PfValidationResult()); + assertFalse(result.isOk()); + assertThat(result.toString()).contains("referenced data type dt0:0.0.1 not found"); + + tst.getDataTypes().getConceptMap().put(dt0.getKey(), dt0); + result = tst.validate(new PfValidationResult()); + assertTrue(result.isOk()); + + tst.setTopologyTemplate(null); + result = tst.validate(new PfValidationResult()); + assertTrue(result.isOk()); + + tst.setTopologyTemplate(new JpaToscaTopologyTemplate()); + result = tst.validate(new PfValidationResult()); + assertTrue(result.isOk()); + + tst.getTopologyTemplate().setPolicies(new JpaToscaPolicies()); + result = tst.validate(new PfValidationResult()); + assertTrue(result.isOk()); + + tst.setPolicyTypes(null); + result = tst.validate(new PfValidationResult()); + assertTrue(result.isOk()); + + JpaToscaPolicy pol0 = new JpaToscaPolicy(new PfConceptKey("pol0:0.0.1")); + tst.getTopologyTemplate().getPolicies().getConceptMap().put(pol0.getKey(), pol0); + result = tst.validate(new PfValidationResult()); + assertFalse(result.isOk()); + assertThat(result.toString()).contains("type is null or a null key"); + + pol0.setType(new PfConceptKey("i.dont.Exist:0.0.1")); + result = tst.validate(new PfValidationResult()); + assertFalse(result.isOk()); + assertThat(result.toString()).contains( + "no policy types are defined on the service template for the policies in the topology template"); + + tst.setPolicyTypes(policyTypes); + result = tst.validate(new PfValidationResult()); + assertFalse(result.isOk()); + assertThat(result.toString()).contains("policy type i.dont.Exist:0.0.1 referenced in policy not found"); + + pol0.setType(dt0.getKey()); + result = tst.validate(new PfValidationResult()); + assertFalse(result.isOk()); + assertThat(result.toString()).contains("policy type dt0:0.0.1 referenced in policy not found"); + + pol0.setType(pt0.getKey()); + result = tst.validate(new PfValidationResult()); + assertTrue(result.isOk()); + + tst.setPolicyTypes(null); + result = tst.validate(new PfValidationResult()); + assertFalse(result.isOk()); + assertThat(result.toString()).contains( + "no policy types are defined on the service template for the policies in the topology template"); + + tst.setPolicyTypes(policyTypes); + pol0.setType(pt0.getKey()); + result = tst.validate(new PfValidationResult()); + assertTrue(result.isOk()); + + tst.setPolicyTypes(new JpaToscaPolicyTypes()); + result = tst.validate(new PfValidationResult()); + assertFalse(result.isOk()); + assertThat(result.toString()).contains( + "no policy types are defined on the service template for the policies in the topology template"); + } } diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProviderTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProviderTest.java index 03c7f9b1b..f34c0c869 100644 --- a/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProviderTest.java +++ b/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/provider/SimpleToscaProviderTest.java @@ -24,7 +24,6 @@ package org.onap.policy.models.tosca.simple.provider; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; import java.util.Properties; @@ -59,6 +58,7 @@ import org.yaml.snakeyaml.Yaml; */ public class SimpleToscaProviderTest { private static final String TEMPLATE_IS_NULL = "^serviceTemplate is marked .*on.*ull but is null$"; + private static final String INCOMING_TEMPLATE_IS_NULL = "^incomingServiceTemplate is marked .*on.*ull but is null$"; private static final String VCPE_INPUT_JSON = "policies/vCPE.policy.monitoring.input.tosca.json"; private static final String DAO_IS_NULL = "^dao is marked .*on.*ull but is null$"; @@ -140,10 +140,8 @@ public class SimpleToscaProviderTest { assertEquals(dataType0, deletedServiceTemplate.getDataTypes().get(dataType0Key)); assertEquals("Updated Description", deletedServiceTemplate.getDataTypes().get(dataType0Key).getDescription()); - JpaToscaServiceTemplate doesNotExistServiceTemplate = - new SimpleToscaProvider().deleteDataType(pfDao, dataType0Key); - - assertEquals(null, doesNotExistServiceTemplate.getDataTypes().get(dataType0Key)); + assertThatThrownBy(() -> new SimpleToscaProvider().deleteDataType(pfDao, dataType0Key)) + .hasMessage("data types for DataType0:0.0.1 do not exist"); } @Test @@ -191,10 +189,8 @@ public class SimpleToscaProviderTest { assertEquals("Updated Description", deletedServiceTemplate.getPolicyTypes().get(policyType0Key).getDescription()); - JpaToscaServiceTemplate doesNotExistServiceTemplate = - new SimpleToscaProvider().deletePolicyType(pfDao, policyType0Key); - - assertEquals(null, doesNotExistServiceTemplate.getPolicyTypes().get(policyType0Key)); + assertThatThrownBy(() -> new SimpleToscaProvider().deletePolicyType(pfDao, policyType0Key)) + .hasMessage("policy types for PolicyType0:0.0.1 do not exist"); } @Test @@ -235,10 +231,8 @@ public class SimpleToscaProviderTest { assertEquals("Updated Description", deletedServiceTemplate.getPolicyTypes().get(policyType0Key).getDescription()); - JpaToscaServiceTemplate doesNotExistServiceTemplate = - new SimpleToscaProvider().deletePolicyType(pfDao, policyType0Key); - - assertEquals(null, doesNotExistServiceTemplate.getPolicyTypes().get(policyType0Key)); + assertThatThrownBy(() -> new SimpleToscaProvider().deletePolicyType(pfDao, policyType0Key)) + .hasMessage("policy types for PolicyType0:0.0.1 do not exist"); } @Test @@ -255,7 +249,8 @@ public class SimpleToscaProviderTest { JpaToscaServiceTemplate createdServiceTemplate = new SimpleToscaProvider().createPolicies(pfDao, originalServiceTemplate); - assertEquals(originalServiceTemplate, createdServiceTemplate); + assertEquals(originalServiceTemplate.getTopologyTemplate().getPolicies(), + createdServiceTemplate.getTopologyTemplate().getPolicies()); PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0"); @@ -264,7 +259,6 @@ public class SimpleToscaProviderTest { assertEquals(originalServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey), gotServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey)); - } @Test @@ -281,7 +275,8 @@ public class SimpleToscaProviderTest { JpaToscaServiceTemplate createdServiceTemplate = new SimpleToscaProvider().createPolicies(pfDao, originalServiceTemplate); - assertEquals(originalServiceTemplate, createdServiceTemplate); + assertEquals(originalServiceTemplate.getTopologyTemplate().getPolicies(), + createdServiceTemplate.getTopologyTemplate().getPolicies()); } @Test @@ -315,7 +310,7 @@ public class SimpleToscaProviderTest { JpaToscaServiceTemplate createdServiceTemplate = new SimpleToscaProvider().createPolicies(pfDao, originalServiceTemplate); - assertEquals(originalServiceTemplate, createdServiceTemplate); + assertEquals(originalServiceTemplate.getTopologyTemplate(), createdServiceTemplate.getTopologyTemplate()); PfConceptKey policyKey = new PfConceptKey("onap.restart.tca:1.0.0"); @@ -325,8 +320,11 @@ public class SimpleToscaProviderTest { assertEquals(originalServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey), deletedServiceTemplate.getTopologyTemplate().getPolicies().get(policyKey)); - assertTrue(new SimpleToscaProvider().getPolicies(pfDao, policyKey.getName(), policyKey.getVersion()) - .getTopologyTemplate().getPolicies().getConceptMap().isEmpty()); + // @formatter:off + assertThatThrownBy( + () -> new SimpleToscaProvider().getPolicies(pfDao, policyKey.getName(), policyKey.getVersion())) + .hasMessage("policies for onap.restart.tca:1.0.0 do not exist"); + // @formatter:on } @Test @@ -361,7 +359,7 @@ public class SimpleToscaProviderTest { assertThatThrownBy(() -> { new SimpleToscaProvider().createDataTypes(pfDao, null); - }).hasMessageMatching(TEMPLATE_IS_NULL); + }).hasMessageMatching(INCOMING_TEMPLATE_IS_NULL); assertThatThrownBy(() -> { new SimpleToscaProvider().updateDataTypes(null, null); @@ -401,7 +399,7 @@ public class SimpleToscaProviderTest { assertThatThrownBy(() -> { new SimpleToscaProvider().createPolicyTypes(pfDao, null); - }).hasMessageMatching(TEMPLATE_IS_NULL); + }).hasMessageMatching(INCOMING_TEMPLATE_IS_NULL); assertThatThrownBy(() -> { new SimpleToscaProvider().updatePolicyTypes(null, null); @@ -441,7 +439,7 @@ public class SimpleToscaProviderTest { assertThatThrownBy(() -> { new SimpleToscaProvider().createPolicies(pfDao, null); - }).hasMessageMatching(TEMPLATE_IS_NULL); + }).hasMessageMatching(INCOMING_TEMPLATE_IS_NULL); assertThatThrownBy(() -> { new SimpleToscaProvider().updatePolicies(null, null); diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/utils/ToscaUtilsTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/utils/ToscaUtilsTest.java index bad89e909..a5d145e39 100644 --- a/models-tosca/src/test/java/org/onap/policy/models/tosca/utils/ToscaUtilsTest.java +++ b/models-tosca/src/test/java/org/onap/policy/models/tosca/utils/ToscaUtilsTest.java @@ -253,31 +253,23 @@ public class ToscaUtilsTest { @Test public void testgetEntityTree() { assertThatThrownBy(() -> { - ToscaUtils.getEntityTree(null, null); + ToscaUtils.getEntityTree(null, null, null); }).hasMessageMatching("entityTypes is marked .*on.*ull but is null"); - assertThatThrownBy(() -> { - ToscaUtils.getEntityTree(null, new PfConceptKey()); - }).hasMessageMatching("entityTypes is marked .*on.*ull but is null"); - - assertThatThrownBy(() -> { - ToscaUtils.getEntityTree(new JpaToscaDataTypes(), null); - }).hasMessageMatching("searchKey is marked .*on.*ull but is null"); - JpaToscaDataTypes dataTypes = new JpaToscaDataTypes(new PfConceptKey("datatypes", "0.0.1")); JpaToscaDataTypes filteredDataTypes = new JpaToscaDataTypes(new PfConceptKey("datatypes", "0.0.1")); - ToscaUtils.getEntityTree(filteredDataTypes, new PfConceptKey()); + ToscaUtils.getEntityTree(filteredDataTypes, "IDontExist", "0.0.0"); assertEquals(dataTypes, filteredDataTypes); JpaToscaDataType dt0 = new JpaToscaDataType(new PfConceptKey("dt0", "0.0.1")); dataTypes.getConceptMap().put(dt0.getKey(), dt0); filteredDataTypes.getConceptMap().put(dt0.getKey(), dt0); - ToscaUtils.getEntityTree(filteredDataTypes, new PfConceptKey()); + ToscaUtils.getEntityTree(filteredDataTypes, "IDontExist", "0.0.0"); assertNotEquals(dataTypes, filteredDataTypes); assertTrue(filteredDataTypes.getConceptMap().isEmpty()); filteredDataTypes.getConceptMap().put(dt0.getKey(), dt0); - ToscaUtils.getEntityTree(filteredDataTypes, dt0.getKey()); + ToscaUtils.getEntityTree(filteredDataTypes, dt0.getKey().getName(), dt0.getKey().getVersion()); assertEquals(dataTypes, filteredDataTypes); JpaToscaDataType dt1 = new JpaToscaDataType(new PfConceptKey("dt1", "0.0.1")); @@ -317,31 +309,31 @@ public class ToscaUtilsTest { dataTypes.getConceptMap().put(dt8.getKey(), dt8); dataTypes.getConceptMap().put(dt9.getKey(), dt9); - ToscaUtils.getEntityTree(filteredDataTypes, dt0.getKey()); + ToscaUtils.getEntityTree(filteredDataTypes, dt0.getKey().getName(), dt0.getKey().getVersion()); assertEquals(1, filteredDataTypes.getConceptMap().size()); filteredDataTypes = new JpaToscaDataTypes(dataTypes); - ToscaUtils.getEntityTree(filteredDataTypes, dt1.getKey()); + ToscaUtils.getEntityTree(filteredDataTypes, dt1.getKey().getName(), dt1.getKey().getVersion()); assertEquals(2, filteredDataTypes.getConceptMap().size()); filteredDataTypes = new JpaToscaDataTypes(dataTypes); - ToscaUtils.getEntityTree(filteredDataTypes, dt2.getKey()); + ToscaUtils.getEntityTree(filteredDataTypes, dt2.getKey().getName(), dt2.getKey().getVersion()); assertEquals(2, filteredDataTypes.getConceptMap().size()); filteredDataTypes = new JpaToscaDataTypes(dataTypes); - ToscaUtils.getEntityTree(filteredDataTypes, dt3.getKey()); + ToscaUtils.getEntityTree(filteredDataTypes, dt3.getKey().getName(), dt3.getKey().getVersion()); assertEquals(2, filteredDataTypes.getConceptMap().size()); filteredDataTypes = new JpaToscaDataTypes(dataTypes); - ToscaUtils.getEntityTree(filteredDataTypes, dt4.getKey()); + ToscaUtils.getEntityTree(filteredDataTypes, dt4.getKey().getName(), dt4.getKey().getVersion()); assertEquals(3, filteredDataTypes.getConceptMap().size()); filteredDataTypes = new JpaToscaDataTypes(dataTypes); - ToscaUtils.getEntityTree(filteredDataTypes, dt5.getKey()); + ToscaUtils.getEntityTree(filteredDataTypes, dt5.getKey().getName(), dt5.getKey().getVersion()); assertEquals(4, filteredDataTypes.getConceptMap().size()); filteredDataTypes = new JpaToscaDataTypes(dataTypes); - ToscaUtils.getEntityTree(filteredDataTypes, dt6.getKey()); + ToscaUtils.getEntityTree(filteredDataTypes, dt6.getKey().getName(), dt6.getKey().getVersion()); assertEquals(5, filteredDataTypes.getConceptMap().size()); assertTrue(filteredDataTypes.getConceptMap().containsValue(dt0)); assertFalse(filteredDataTypes.getConceptMap().containsValue(dt1)); @@ -352,15 +344,15 @@ public class ToscaUtilsTest { assertTrue(filteredDataTypes.getConceptMap().containsValue(dt6)); filteredDataTypes = new JpaToscaDataTypes(dataTypes); - ToscaUtils.getEntityTree(filteredDataTypes, dt7.getKey()); + ToscaUtils.getEntityTree(filteredDataTypes, dt7.getKey().getName(), dt7.getKey().getVersion()); assertEquals(1, filteredDataTypes.getConceptMap().size()); filteredDataTypes = new JpaToscaDataTypes(dataTypes); - ToscaUtils.getEntityTree(filteredDataTypes, dt8.getKey()); + ToscaUtils.getEntityTree(filteredDataTypes, dt8.getKey().getName(), dt8.getKey().getVersion()); assertEquals(2, filteredDataTypes.getConceptMap().size()); filteredDataTypes = new JpaToscaDataTypes(dataTypes); - ToscaUtils.getEntityTree(filteredDataTypes, dt9.getKey()); + ToscaUtils.getEntityTree(filteredDataTypes, dt9.getKey().getName(), dt9.getKey().getVersion()); assertEquals(3, filteredDataTypes.getConceptMap().size()); dt9.setDerivedFrom(new PfConceptKey("i.dont.Exist", "0.0.0")); @@ -368,7 +360,7 @@ public class ToscaUtilsTest { assertThatThrownBy(() -> { final JpaToscaDataTypes badDataTypes = new JpaToscaDataTypes(dataTypes); - ToscaUtils.getEntityTree(badDataTypes, dt9.getKey()); + ToscaUtils.getEntityTree(badDataTypes, dt9.getKey().getName(), dt9.getKey().getVersion()); }).hasMessageContaining("parent i.dont.Exist:0.0.0 of entity not found"); } } diff --git a/models-tosca/src/test/resources/META-INF/persistence.xml b/models-tosca/src/test/resources/META-INF/persistence.xml index 62e0b6046..d6fba8f8a 100644 --- a/models-tosca/src/test/resources/META-INF/persistence.xml +++ b/models-tosca/src/test/resources/META-INF/persistence.xml @@ -28,9 +28,11 @@ org.onap.policy.models.base.PfConceptKey org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes + org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes + org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate diff --git a/models-tosca/src/test/resources/onap.policies.NoVersion.yaml b/models-tosca/src/test/resources/onap.policies.NoVersion.yaml index 7d1262b7d..5923eb22d 100644 --- a/models-tosca/src/test/resources/onap.policies.NoVersion.yaml +++ b/models-tosca/src/test/resources/onap.policies.NoVersion.yaml @@ -1,5 +1,9 @@ tosca_definitions_version: tosca_simple_yaml_1_0_0 policy_types: + onap.policies.Optimization: + derived_from: tosca.policies.Root + version: 1.0.0 + description: The base policy type for all policies that govern optimization onap.policies.NoVersion: derived_from: onap.policies.Optimization properties: -- cgit 1.2.3-korg