package alien4cloud.rest.topology; import javax.annotation.Resource; import javax.inject.Inject; import alien4cloud.repository.model.AvailableTopologyRepositories; import alien4cloud.repository.model.AvailableTopologyRepository; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import io.swagger.annotations.Api; import org.alien4cloud.tosca.editor.EditionContextManager; import org.alien4cloud.tosca.editor.EditorService; import org.alien4cloud.tosca.model.definitions.DeploymentArtifact; import org.alien4cloud.tosca.topology.TopologyDTOBuilder; import org.alien4cloud.tosca.model.templates.NodeTemplate; import org.alien4cloud.tosca.model.templates.Topology; import org.alien4cloud.tosca.model.types.NodeType; import org.apache.commons.collections4.CollectionUtils; import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import alien4cloud.rest.model.RestResponse; import alien4cloud.rest.model.RestResponseBuilder; import alien4cloud.topology.TopologyDTO; import alien4cloud.topology.TopologyService; import alien4cloud.topology.TopologyServiceCore; import alien4cloud.topology.TopologyValidationResult; import alien4cloud.topology.TopologyValidationService; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import java.util.List; import java.util.Set; @Slf4j @RestController @RequestMapping({ "/rest/topologies", "/rest/v1/topologies", "/rest/latest/topologies" }) @Api public class TopologyController { @Resource private TopologyService topologyService; @Resource private TopologyServiceCore topologyServiceCore; @Resource private TopologyValidationService topologyValidationService; @Resource private EditionContextManager topologyEditionContextManager; @Inject private TopologyDTOBuilder dtoBuilder; @Inject private EditorService editorService; /** * Retrieve an existing {@link Topology} * * @param topologyId The id of the topology to retrieve. * @return {@link RestResponse}<{@link TopologyDTO}> containing the {@link Topology} and the {@link NodeType} related * to his {@link NodeTemplate}s */ @ApiOperation(value = "Retrieve a topology from it's id.", notes = "Returns a topology with it's details. Application role required [ APPLICATION_MANAGER | APPLICATION_DEVOPS ]") @RequestMapping(value = "/{topologyId:.+}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("isAuthenticated()") public RestResponse<TopologyDTO> get(@PathVariable String topologyId) { Topology topology = topologyServiceCore.getOrFail(topologyId); topologyService.checkAccessAuthorizations(topology); try { topologyEditionContextManager.init(topologyId); editorService.checkTopologyRecovery(); return RestResponseBuilder.<TopologyDTO> builder().data(dtoBuilder.buildTopologyDTO(EditionContextManager.get())).build(); } finally { topologyEditionContextManager.destroy(); } } /** * Check if a topology is valid or not. * * @param topologyId The id of the topology to check. * @return a boolean rest response that says if the topology is valid or not. */ @ApiOperation(value = "Check if a topology is valid or not.", notes = "Returns true if valid, false if not. Application role required [ APPLICATION_MANAGER | APPLICATION_DEVOPS ]") @RequestMapping(value = "/{topologyId:.+}/isvalid", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("isAuthenticated()") public RestResponse<TopologyValidationResult> isTopologyValid(@PathVariable String topologyId, @RequestParam(required = false) String environmentId) { Topology topology = topologyServiceCore.getOrFail(topologyId); topologyService.checkAccessAuthorizations(topology); TopologyValidationResult dto = topologyValidationService.validateTopology(topology); return RestResponseBuilder.<TopologyValidationResult> builder().data(dto).build(); } }