diff options
Diffstat (limited to 'main/src/main/java/org/onap/policy/api/main/service/ToscaServiceTemplateService.java')
-rw-r--r-- | main/src/main/java/org/onap/policy/api/main/service/ToscaServiceTemplateService.java | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/main/src/main/java/org/onap/policy/api/main/service/ToscaServiceTemplateService.java b/main/src/main/java/org/onap/policy/api/main/service/ToscaServiceTemplateService.java index 0fa02258..d578d0dc 100644 --- a/main/src/main/java/org/onap/policy/api/main/service/ToscaServiceTemplateService.java +++ b/main/src/main/java/org/onap/policy/api/main/service/ToscaServiceTemplateService.java @@ -1,6 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2022 Bell Canada. All rights reserved. + * Modifications Copyright (C) 2022 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +21,10 @@ package org.onap.policy.api.main.service; +import java.util.ArrayList; import java.util.List; import java.util.Optional; +import javax.annotation.Nonnull; import javax.ws.rs.core.Response; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -33,10 +36,14 @@ 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.tosca.authorative.concepts.ToscaEntityFilter; +import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType; import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate; import org.onap.policy.models.tosca.authorative.concepts.ToscaTypedEntityFilter; +import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate; +import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates; +import org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes; import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies; import org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes; import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate; @@ -63,6 +70,7 @@ public class ToscaServiceTemplateService { public static final String DO_NOT_EXIST_MSG = " do not exist"; private final ToscaServiceTemplateRepository toscaServiceTemplateRepository; + private final NodeTemplateService nodeTemplateService; private final PdpGroupService pdpGroupService; private final PolicyTypeService policyTypeService; private final PolicyService policyService; @@ -429,6 +437,142 @@ public class ToscaServiceTemplateService { } /** + * Write a node template to the database. + * + * @param serviceTemplate the service template to be written + * @return the service template created by this method + * @throws PfModelException on errors writing the metadataSets + */ + public ToscaServiceTemplate createToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate) + throws PfModelException { + + LOGGER.debug("->write: tosca nodeTemplates={}", serviceTemplate); + final var incomingServiceTemplate = new JpaToscaServiceTemplate(serviceTemplate); + + ToscaUtils.assertNodeTemplatesExist(incomingServiceTemplate); + + Optional<JpaToscaNodeTypes> nodeTypes = Optional.ofNullable(incomingServiceTemplate.getNodeTypes()); + for (JpaToscaNodeTemplate nodeTemplate : incomingServiceTemplate.getTopologyTemplate().getNodeTemplates() + .getAll(null)) { + // verify node types in the db if mismatch/empty entities in the template + if (! (nodeTypes.isPresent() && nodeTypes.get().getKeys().contains(nodeTemplate.getType()))) { + nodeTemplateService.verifyNodeTypeInDbTemplate(nodeTemplate); + } + } + // append the incoming fragment to the DB TOSCA service template + final var serviceTemplateToWrite = + ToscaServiceTemplateUtils.addFragment(getDefaultJpaToscaServiceTemplate(), incomingServiceTemplate); + + final var result = serviceTemplateToWrite.validate("service template."); + if (!result.isValid()) { + throw new PfModelRuntimeException(Response.Status.NOT_ACCEPTABLE, result.getResult()); + } + toscaServiceTemplateRepository.save(serviceTemplateToWrite); + LOGGER.debug("<-createdToscaNodeTemplates: writtenServiceTemplate={}", serviceTemplateToWrite); + + return serviceTemplate; + } + + /** + * Update tosca node template. + * + * @param serviceTemplate the service template containing the definitions of the node templates to be updated. + * @return the TOSCA service template containing the node templates that were updated + * @throws PfModelRuntimeException on errors updating node templates + */ + public ToscaServiceTemplate updateToscaNodeTemplates(@NonNull final ToscaServiceTemplate serviceTemplate) + throws PfModelException { + LOGGER.debug("->updateToscaNodeTemplates: serviceTemplate={}", serviceTemplate); + final var incomingServiceTemplate = new JpaToscaServiceTemplate(serviceTemplate); + + ToscaUtils.assertNodeTemplatesExist(incomingServiceTemplate); + nodeTemplateService.updateToscaNodeTemplates(incomingServiceTemplate); + + LOGGER.debug("<-updatedToscaNodeTemplates: serviceTemplate={}", serviceTemplate); + return incomingServiceTemplate.toAuthorative(); + } + + + /** + * Delete a tosca node template. + * + * @param name the name of node template + * @param version the version of node template + * @return the TOSCA service template containing the node template that were deleted + * @throws PfModelException on errors deleting node templates + */ + public ToscaServiceTemplate deleteToscaNodeTemplate(@NonNull final String name, @Nonnull final String version) + throws PfModelException { + LOGGER.debug("->deleteToscaNodeTemplate: name={}, version={}", name, version); + + JpaToscaServiceTemplate dbServiceTemplate = getDefaultJpaToscaServiceTemplate(); + final var nodeTemplateKey = new PfConceptKey(name, version); + + if (!ToscaUtils.doNodeTemplatesExist(dbServiceTemplate)) { + throw new PfModelRuntimeException(Response.Status.NOT_FOUND, "no node templates found"); + } + JpaToscaNodeTemplate nodeTemplate4Deletion = dbServiceTemplate.getTopologyTemplate().getNodeTemplates() + .get(new PfConceptKey(name, version)); + if (nodeTemplate4Deletion == null) { + throw new PfModelRuntimeException(Response.Status.NOT_FOUND, "node template " + name + ":" + version + + NOT_FOUND); + } + //Verify if the node template is referenced in the metadata of created policies + nodeTemplateService.assertNodeTemplateNotUsedInPolicy(name, version, dbServiceTemplate); + + dbServiceTemplate.getTopologyTemplate().getNodeTemplates().getConceptMap().remove(nodeTemplateKey); + toscaServiceTemplateRepository.save(dbServiceTemplate); + + // remove the entry from the tosca node template table + nodeTemplateService.deleteNodeTemplate(nodeTemplateKey); + + // prepare the return service template + var deletedServiceTemplate = new JpaToscaServiceTemplate(); + deletedServiceTemplate.setTopologyTemplate(new JpaToscaTopologyTemplate()); + deletedServiceTemplate.getTopologyTemplate().setNodeTemplates(new JpaToscaNodeTemplates()); + deletedServiceTemplate.getTopologyTemplate().getNodeTemplates().getConceptMap() + .put(nodeTemplateKey, nodeTemplate4Deletion); + + LOGGER.debug("<-deleteToscaNodeTemplate: key={}, serviceTemplate={}", nodeTemplateKey, deletedServiceTemplate); + return deletedServiceTemplate.toAuthorative(); + } + + + /** + * Get tosca node templates. + * + * @param name the name of the node template to get, set to null to get all node templates + * @param version the version of the node template to get, set to null to get all versions + * @return the node templates with the specified key + * @throws PfModelException on errors getting node templates + */ + public List<ToscaNodeTemplate> fetchToscaNodeTemplates(final String name, final String version) + throws PfModelException { + LOGGER.debug("->getNodeTemplate: name={}, version={}", name, version); + List<ToscaNodeTemplate> nodeTemplates = new ArrayList<>(); + var jpaNodeTemplates = new JpaToscaNodeTemplates(); + + var dbServiceTemplate = getDefaultJpaToscaServiceTemplate(); + //Return empty if no nodeTemplates present in db + if (!ToscaUtils.doNodeTemplatesExist(dbServiceTemplate)) { + return nodeTemplates; + } + jpaNodeTemplates = dbServiceTemplate.getTopologyTemplate().getNodeTemplates(); + + //Filter specific nodeTemplates + if (name != null && version != null) { + var filterKey = new PfConceptKey(name, version); + jpaNodeTemplates.getConceptMap().entrySet().removeIf(entity -> !entity.getKey().equals(filterKey)); + } + jpaNodeTemplates.getConceptMap().forEach((key, value) -> nodeTemplates.add(value.toAuthorative())); + LOGGER.debug("<-getNodeTemplateMetadataSet: name={}, version={}, nodeTemplates={}", name, version, + nodeTemplates); + + return nodeTemplates; + } + + + /** * Get Service Template. * * @return the Service Template read from the database |