private void updateServiceRelationship(ServiceResource serviceResource, Topology topology) { Map<String, RelationshipType> relationshipTypeMap = Maps.newHashMap(); // we also want to configure the service relationships for exposed capabilities for (Entry<String, SubstitutionTarget> substitutionTargetEntry : safe(topology.getSubstitutionMapping().getCapabilities()).entrySet()) { if (serviceResource.getCapabilitiesRelationshipTypes() == null) { serviceResource.setCapabilitiesRelationshipTypes(Maps.newHashMap()); } if (substitutionTargetEntry.getValue().getServiceRelationshipType() == null) { serviceResource.getCapabilitiesRelationshipTypes().remove(substitutionTargetEntry.getKey()); } else { String relationshipId = getRelationshipId(relationshipTypeMap, topology, substitutionTargetEntry.getValue().getServiceRelationshipType()); serviceResource.getCapabilitiesRelationshipTypes().put(substitutionTargetEntry.getKey(), relationshipId); } } for (Entry<String, SubstitutionTarget> substitutionTargetEntry : safe(topology.getSubstitutionMapping().getRequirements()).entrySet()) { if (serviceResource.getRequirementsRelationshipTypes() == null) { serviceResource.setRequirementsRelationshipTypes(Maps.newHashMap()); } if (substitutionTargetEntry.getValue().getServiceRelationshipType() == null) { serviceResource.getRequirementsRelationshipTypes().remove(substitutionTargetEntry.getKey()); } else { String relationshipId = getRelationshipId(relationshipTypeMap, topology, substitutionTargetEntry.getValue().getServiceRelationshipType()); serviceResource.getRequirementsRelationshipTypes().put(substitutionTargetEntry.getKey(), relationshipId); } } serviceResourceService.save(serviceResource); }
if (topology.getSubstitutionMapping() != null && topology.getSubstitutionMapping().getSubstitutionType() != null) { for (SubstitutionTarget substitutionTarget : safe(topology.getSubstitutionMapping().getCapabilities()).values()) { addRelationshipTypeFromSubstitutionTarget(topology, relationshipTypes, substitutionTarget, failOnTypeNotFound); for (SubstitutionTarget substitutionTarget : safe(topology.getSubstitutionMapping().getRequirements()).values()) { addRelationshipTypeFromSubstitutionTarget(topology, relationshipTypes, substitutionTarget, failOnTypeNotFound);
@Override public void process(Csar csar, Topology topology, RemoveRequirementSubstitutionTypeOperation operation) { if (topology.getSubstitutionMapping() == null || topology.getSubstitutionMapping().getSubstitutionType() == null) { throw new NotFoundException("No substitution type has been found"); } Map<String, SubstitutionTarget> substitutionRequirements = topology.getSubstitutionMapping().getRequirements(); if (substitutionRequirements == null) { throw new NotFoundException("No requirements has been found"); } SubstitutionTarget target = substitutionRequirements.remove(operation.getSubstitutionRequirementId()); if (target == null) { throw new NotFoundException("No substitution requirement has been found for key " + operation.getSubstitutionRequirementId()); } } }
@Override public void process(Csar csar, Topology topology, RemoveCapabilitySubstitutionTypeOperation operation) { if (topology.getSubstitutionMapping() == null || topology.getSubstitutionMapping().getSubstitutionType() == null) { throw new NotFoundException("No substitution type has been found"); } Map<String, SubstitutionTarget> substitutionCapabilities = topology.getSubstitutionMapping().getCapabilities(); if (substitutionCapabilities == null) { throw new NotFoundException("No substitution capabilities has been found"); } SubstitutionTarget target = substitutionCapabilities.remove(operation.getSubstitutionCapabilityId()); if (target == null) { throw new NotFoundException("No substitution capability has been found for key " + operation.getSubstitutionCapabilityId()); } } }
return null; SubstitutionMapping result = new SubstitutionMapping(); MappingNode mappingNode = ((MappingNode) node); List<NodeTuple> nodeTuples = mappingNode.getValue(); case NODE_TYPE: String nodeTypeName = scalarParser.parse(valueNode, context); result.setSubstitutionType(nodeTypeName); break; case CAPABILITIES: result.setCapabilities(parseSubstitutionTargets(valueNode, context)); break; case REQUIREMENTS: result.setRequirements(parseSubstitutionTargets(valueNode, context)); break; default:
@Override public void process(Csar csar, Topology topology, AddCapabilitySubstitutionTypeOperation operation) { if (topology.getNodeTemplates() == null || !topology.getNodeTemplates().containsKey(operation.getNodeTemplateName())) { throw new NotFoundException("Node " + operation.getNodeTemplateName() + " do not exist"); } NodeTemplate nodeTemplate = topology.getNodeTemplates().get(operation.getNodeTemplateName()); if (nodeTemplate.getCapabilities() == null || !nodeTemplate.getCapabilities().containsKey(operation.getCapabilityId())) { throw new NotFoundException("Capability " + operation.getCapabilityId() + " do not exist for node " + operation.getNodeTemplateName()); } if (topology.getSubstitutionMapping() == null || topology.getSubstitutionMapping().getSubstitutionType() == null) { throw new NotFoundException("No substitution type has been found"); } Map<String, SubstitutionTarget> substitutionCapabilities = topology.getSubstitutionMapping().getCapabilities(); if (substitutionCapabilities == null) { substitutionCapabilities = Maps.newHashMap(); topology.getSubstitutionMapping().setCapabilities(substitutionCapabilities); } else if (substitutionCapabilities.containsKey(operation.getSubstitutionCapabilityId())) { // ensure name unicity throw new AlreadyExistException(String.format("A substitution with capability id <%s> already exists", operation.getSubstitutionCapabilityId())); } substitutionCapabilities.put(operation.getSubstitutionCapabilityId(), new SubstitutionTarget(operation.getNodeTemplateName(), operation.getCapabilityId())); } }
@Override public void process(Csar csar, Topology topology, AddRequirementSubstitutionTypeOperation operation) { if (topology.getNodeTemplates() == null || !topology.getNodeTemplates().containsKey(operation.getNodeTemplateName())) { throw new NotFoundException("Node " + operation.getNodeTemplateName() + " do not exist"); } NodeTemplate nodeTemplate = topology.getNodeTemplates().get(operation.getNodeTemplateName()); if (nodeTemplate.getRequirements() == null || !nodeTemplate.getRequirements().containsKey(operation.getRequirementId())) { throw new NotFoundException("Requirement " + operation.getRequirementId() + " do not exist for node " + operation.getNodeTemplateName()); } if (topology.getSubstitutionMapping() == null || topology.getSubstitutionMapping().getSubstitutionType() == null) { throw new NotFoundException("No substitution type has been found"); } Map<String, SubstitutionTarget> substitutionRequirements = topology.getSubstitutionMapping().getRequirements(); if (substitutionRequirements == null) { substitutionRequirements = Maps.newHashMap(); topology.getSubstitutionMapping().setRequirements(substitutionRequirements); } else if (substitutionRequirements.containsKey(operation.getSubstitutionRequirementId())) { // ensure name unicity throw new AlreadyExistException(String.format("The substitution requirement <%s> already exists", operation.getSubstitutionRequirementId())); } substitutionRequirements.put(operation.getSubstitutionRequirementId(), new SubstitutionTarget(operation.getNodeTemplateName(), operation.getRequirementId())); } }
@Override public void process(Csar csar, Topology topology, AddSubstitutionTypeOperation operation) { if (topology.getSubstitutionMapping() == null) { topology.setSubstitutionMapping(new SubstitutionMapping()); } NodeType nodeType = toscaTypeSearchService.getElementInDependencies(NodeType.class, operation.getElementId(), topology.getDependencies()); // if not null the node type exists in the dependencies, there is no choices for this type version if (nodeType == null) { // the node type does'nt exist in this topology dependencies // we need to find the latest version of this component and use it as default nodeType = toscaTypeSearchService.findMostRecent(NodeType.class, operation.getElementId()); if (nodeType == null) { throw new NotFoundException("Node type with name <" + operation.getElementId() + "> cannot be found in the catalog."); } topologyService.loadType(topology, nodeType); } topology.getSubstitutionMapping().setSubstitutionType(operation.getElementId()); } }
private void fillCapabilities(Topology topology, NodeType substituteNodeType) { if (topology.getSubstitutionMapping().getCapabilities() != null) { for (Map.Entry<String, SubstitutionTarget> e : topology.getSubstitutionMapping().getCapabilities().entrySet()) { String key = e.getKey(); String nodeName = e.getValue().getNodeTemplateName(); String capabilityName = e.getValue().getTargetId(); NodeTemplate nodeTemplate = topology.getNodeTemplates().get(nodeName); NodeType nodeTemplateType = ToscaContext.getOrFail(NodeType.class, nodeTemplate.getType()); CapabilityDefinition capabilityDefinition = IndexedModelUtils.getCapabilityDefinitionById(nodeTemplateType.getCapabilities(), capabilityName); // We cannot change the capability definition here or we will change the original one so we need a clone capabilityDefinition = CloneUtil.clone(capabilityDefinition); capabilityDefinition.setId(key); substituteNodeType.getCapabilities().add(capabilityDefinition); } } }
@Override public void process(SubstitutionMapping instance) { if (instance == null) { // no substitution mapping. return; } NodeType substitutionDerivedFrom = ToscaContext.get(NodeType.class, instance.getSubstitutionType()); Node node = ParsingContextExecution.getObjectToNodeMap().get(instance.getSubstitutionType()); if (substitutionDerivedFrom == null) { addError(ErrorCode.TYPE_NOT_FOUND, "Type not found", "The type from the element is not found neither in the archive or it's dependencies or is not defined while required.", instance.getSubstitutionType(), node); } else if (!substitutionDerivedFrom.isAbstract()) { addError(ErrorCode.DERIVED_FROM_CONCRETE_TYPE_SUBSTITUTION, "Substitution cannot derive from concrete type", "The substitution derives from " + instance.getSubstitutionType() + " which is not abstract.", instance.getSubstitutionType(), node); } } }
private void fillRequirements(Topology topology, NodeType substituteNodeType) { if (topology.getSubstitutionMapping().getRequirements() != null) { for (Map.Entry<String, SubstitutionTarget> e : topology.getSubstitutionMapping().getRequirements().entrySet()) { String key = e.getKey(); String nodeName = e.getValue().getNodeTemplateName(); String requirementName = e.getValue().getTargetId(); NodeTemplate nodeTemplate = topology.getNodeTemplates().get(nodeName); NodeType nodeTemplateType = ToscaContext.getOrFail(NodeType.class, nodeTemplate.getType()); RequirementDefinition requirementDefinition = IndexedModelUtils.getRequirementDefinitionById(nodeTemplateType.getRequirements(), requirementName); // We cannot change the capability definition here or we will change the original one so we need a clone requirementDefinition = CloneUtil.clone(requirementDefinition); requirementDefinition.setId(key); substituteNodeType.getRequirements().add(requirementDefinition); } } }
@Override public void process(Csar csar, Topology topology, UpdateCapabilitySubstitutionTypeOperation operation) { if (topology.getSubstitutionMapping() == null || topology.getSubstitutionMapping().getSubstitutionType() == null) { throw new NotFoundException("No substitution type has been found"); } Map<String, SubstitutionTarget> substitutionCapabilities = topology.getSubstitutionMapping().getCapabilities(); if (substitutionCapabilities == null) { throw new NotFoundException("No substitution capabilities has been found"); } SubstitutionTarget target = substitutionCapabilities.remove(operation.getSubstitutionCapabilityId()); if (target == null) { throw new NotFoundException("No substitution capability has been found for key " + operation.getSubstitutionCapabilityId()); } if (substitutionCapabilities.containsKey(operation.getNewCapabilityId())) { throw new AlreadyExistException( String.format("Can not rename from <%s> to <%s> since capability <%s> already exists", operation.getSubstitutionCapabilityId(), operation.getNewCapabilityId(), operation.getNewCapabilityId())); } substitutionCapabilities.put(operation.getNewCapabilityId(), target); } }
@Override public void process(Csar csar, Topology topology, UpdateRequirementSubstitutionTypeOperation operation) { if (topology.getSubstitutionMapping() == null || topology.getSubstitutionMapping().getSubstitutionType() == null) { throw new NotFoundException("No substitution type has been found"); } Map<String, SubstitutionTarget> substitutionRequirements = topology.getSubstitutionMapping().getRequirements(); if (substitutionRequirements == null) { throw new NotFoundException("No substitution requirement has been found"); } SubstitutionTarget target = substitutionRequirements.remove(operation.getSubstitutionRequirementId()); if (target == null) { throw new NotFoundException("No substitution requirement has been found for key " + operation.getSubstitutionRequirementId()); } if (substitutionRequirements.containsKey(operation.getNewRequirementId())) { throw new AlreadyExistException( String.format("Can not rename from <%s> to <%s> since requirement <%s> already exists", operation.getSubstitutionRequirementId(), operation.getNewRequirementId(), operation.getNewRequirementId())); } substitutionRequirements.put(operation.getNewRequirementId(), target); } }
@Test public void testServiceRelationshipSubstitution() throws FileNotFoundException, ParsingException { Mockito.reset(csarRepositorySearchService); Mockito.when(csarRepositorySearchService.getArchive("tosca-normative-types", "1.0.0-ALIEN14")).thenReturn(Mockito.mock(Csar.class)); NodeType mockRoot = Mockito.mock(NodeType.class); Mockito.when(mockRoot.isAbstract()).thenReturn(true); Mockito.when(csarRepositorySearchService.getElementInDependencies(Mockito.eq(NodeType.class), Mockito.eq("tosca.nodes.Root"), Mockito.any(Set.class))) .thenReturn(mockRoot); Mockito.when(csarRepositorySearchService.getElementInDependencies(Mockito.eq(CapabilityType.class), Mockito.eq("tosca.capabilities.Root"), Mockito.any(Set.class))).thenReturn(Mockito.mock(CapabilityType.class)); Mockito.when(csarRepositorySearchService.getElementInDependencies(Mockito.eq(RelationshipType.class), Mockito.eq("tosca.relationships.Root"), Mockito.any(Set.class))).thenReturn(Mockito.mock(RelationshipType.class)); ParsingResult<ArchiveRoot> parsingResult = parser.parseFile(Paths.get(getRootDirectory(), "substitution_mapping_service_relationship.yml")); Assert.assertEquals(0, parsingResult.getContext().getParsingErrors().size()); ArchiveRoot archiveRoot = parsingResult.getResult(); Assert.assertNotNull(archiveRoot.getArchive()); Assert.assertEquals(getToscaVersion(), archiveRoot.getArchive().getToscaDefinitionsVersion()); Assert.assertEquals("org.alien4cloud.relationships.test.MyRelationship", archiveRoot.getTopology().getSubstitutionMapping().getCapabilities().get("subst_capa").getServiceRelationshipType()); }
/** * Get the indexed node types used in a topology. * * @param topology The topology for which to get indexed node types. * @param abstractOnly If true, only abstract types will be retrieved. * @param useTemplateNameAsKey If true the name of the node template will be used as key for the type in the returned map, if not the type will be used as * key. * @param failOnTypeNotFound * @return A map of indexed node types. */ public Map<String, NodeType> getIndexedNodeTypesFromTopology(Topology topology, boolean abstractOnly, boolean useTemplateNameAsKey, boolean failOnTypeNotFound) { Map<String, NodeType> nodeTypeMap = getIndexedNodeTypesFromDependencies(topology.getNodeTemplates(), topology.getDependencies(), abstractOnly, useTemplateNameAsKey, failOnTypeNotFound); if (!useTemplateNameAsKey && topology.getSubstitutionMapping() != null && topology.getSubstitutionMapping().getSubstitutionType() != null) { NodeType nodeType = getFromContextIfDefined(NodeType.class, topology.getSubstitutionMapping().getSubstitutionType(), topology.getDependencies(), failOnTypeNotFound); nodeTypeMap.put(topology.getSubstitutionMapping().getSubstitutionType(), nodeType); } return nodeTypeMap; }
@Override public void process(Csar csar, Topology topology, SetSubstitutionRequirementServiceRelationshipOperation operation) { if (topology.getSubstitutionMapping() == null) { throw new NotFoundException("The substitution requirement with id <" + operation.getSubstitutionRequirementId() + "> cannot be found."); } SubstitutionTarget substitutionTarget = safe(topology.getSubstitutionMapping().getRequirements()).get(operation.getSubstitutionRequirementId()); if (substitutionTarget == null) { throw new NotFoundException("The substitution requirement with id <" + operation.getSubstitutionRequirementId() + "> cannot be found."); } super.process(csar, topology, substitutionTarget, operation.getRelationshipType(), operation.getRelationshipVersion()); } }
/** * Update properties in a topology */ private static void updateOnNodeTemplateNameChange(String oldNodeTemplateName, String newNodeTemplateName, Topology topology) { // Output properties updateKey(topology.getOutputProperties(), oldNodeTemplateName, newNodeTemplateName); // output capabilities properties updateKey(topology.getOutputCapabilityProperties(), oldNodeTemplateName, newNodeTemplateName); // output attributes updateKey(topology.getOutputAttributes(), oldNodeTemplateName, newNodeTemplateName); // substitution mapping if (topology.getSubstitutionMapping() != null) { if (topology.getSubstitutionMapping().getCapabilities() != null) { for (SubstitutionTarget st : topology.getSubstitutionMapping().getCapabilities().values()) { if (st.getNodeTemplateName().equals(oldNodeTemplateName)) { st.setNodeTemplateName(newNodeTemplateName); } } } if (topology.getSubstitutionMapping().getRequirements() != null) { for (SubstitutionTarget st : topology.getSubstitutionMapping().getRequirements().values()) { if (st.getNodeTemplateName().equals(oldNodeTemplateName)) { st.setNodeTemplateName(newNodeTemplateName); } } } } }
if (topology.getSubstitutionMapping() != null && topology.getSubstitutionMapping().getSubstitutionType() != null) { NodeType substitutionType = nodeTypes.get(topology.getSubstitutionMapping().getSubstitutionType()); loader.loadType(substitutionType.getElementId(), csarDependencyLoader.buildDependencyBean(substitutionType.getArchiveName(), substitutionType.getArchiveVersion())); for (SubstitutionTarget substitutionTarget : safe(topology.getSubstitutionMapping().getCapabilities()).values()) { initializeSubstitutionTarget(loader, relationshipTypes, substitutionTarget); for (SubstitutionTarget substitutionTarget : safe(topology.getSubstitutionMapping().getRequirements()).values()) { initializeSubstitutionTarget(loader, relationshipTypes, substitutionTarget);
@Override public void process(Csar csar, Topology topology, SetSubstitutionCapabilityServiceRelationshipOperation operation) { if (topology.getSubstitutionMapping() == null) { throw new NotFoundException("The substitution capability with id <" + operation.getSubstitutionCapabilityId() + "> cannot be found."); } SubstitutionTarget substitutionTarget = safe(topology.getSubstitutionMapping().getCapabilities()).get(operation.getSubstitutionCapabilityId()); if (substitutionTarget == null) { throw new NotFoundException("The substitution capability with id <" + operation.getSubstitutionCapabilityId() + "> cannot be found."); } super.process(csar, topology, substitutionTarget, operation.getRelationshipType(), operation.getRelationshipVersion()); } }
@Override public void process(Csar csar, Topology topology, RemoveSubstitutionTypeOperation operation) { if (topology.getSubstitutionMapping() == null || topology.getSubstitutionMapping().getSubstitutionType() == null) { throw new NotFoundException("No substitution type has been found"); } // FIXME check also on live edited topologies. // the substitute type os within the topology's archive if (hasArchiveUsing(csar.getName(), csar.getVersion())) { throw new DeleteReferencedObjectException("The substitution can not be removed since it's type is already used in at least another topology"); } topologyService.unloadType(topology, topology.getSubstitutionMapping().getSubstitutionType()); topology.setSubstitutionMapping(null); }