/** * Copyright (C) 2015 Orange * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.francetelecom.clara.cloud.paas.activation.v1; import com.francetelecom.clara.cloud.commons.NotFoundException; import com.francetelecom.clara.cloud.commons.TechnicalException; import com.francetelecom.clara.cloud.commons.tasks.TaskStatus; import com.francetelecom.clara.cloud.commons.tasks.TaskStatusEnum; import com.francetelecom.clara.cloud.coremodel.Environment; import com.francetelecom.clara.cloud.coremodel.EnvironmentRepository; import com.francetelecom.clara.cloud.coremodel.EnvironmentStatus; import com.francetelecom.clara.cloud.model.TechnicalDeploymentInstance; import com.francetelecom.clara.cloud.model.TechnicalDeploymentInstanceRepository; import com.francetelecom.clara.cloud.model.XaasSubscription; import com.francetelecom.clara.cloud.paas.activation.ActivationStepEnum; import com.francetelecom.clara.cloud.paas.activation.ManagePaasActivation; import org.activiti.bpmn.model.BpmnModel; import org.activiti.bpmn.model.Process; import org.activiti.engine.ProcessEngine; import org.activiti.engine.runtime.ProcessInstance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import javax.xml.bind.JAXBException; import java.io.IOException; /** * Implementation of {@link ManagePaasActivation} for vCloud API */ public class ManagePaasActivationActivitiUtilsImpl { private static Logger logger = LoggerFactory.getLogger(ManagePaasActivationActivitiUtilsImpl.class.getName()); /** TDI manager */ @Autowired private TechnicalDeploymentInstanceRepository technicalDeploymentInstanceRepository; @Autowired private EnvironmentRepository environmentRepository; /** BPMN2.0 process generator */ @Autowired ActivitiProcessFactory activitiProcessFactory; /** Activiti */ @Autowired protected ProcessEngine processEngine; public void setEnvironmentRepository(EnvironmentRepository environmentdao) { this.environmentRepository = environmentdao; } public String createProcess(TechnicalDeploymentInstance tdi, ActivationStepEnum processType) { String processName = "activate-" + tdi.getName() + "-" + processType.getName() + "-" + System.currentTimeMillis(); Process process; try { process = activitiProcessFactory.generateProcessFromTDI(processType, tdi); } catch (JAXBException | IOException e) { throw new TechnicalException("unable to generate process from TDI", e); } BpmnModel model = new BpmnModel(); model.addProcess(process); processEngine.getRepositoryService().createDeployment().addBpmnModel(processName +".bpmn", model).name("Activate " + tdi.getName()).deploy(); return process.getId(); } @Transactional public TechnicalDeploymentInstance getTDI(int tdiId) throws NotFoundException { TechnicalDeploymentInstance tdi = technicalDeploymentInstanceRepository.findOne(tdiId); if (tdi ==null) throw new NotFoundException("tdi <"+tdiId+"> not found"); // parse mandatory lazy attributes for (XaasSubscription subs : tdi.getTechnicalDeployment().listXaasSubscriptionTemplates()) { subs.getName(); subs.listDepedencies(); } return tdi; } @Transactional public void handleError(String action, Throwable exc, TaskStatus status, int tdiId) { String errorMessage = "Internal error while " + action; String endUserErrorMessage = "INTERNAL ERROR DURING ACTIVATION PROCESS " + exc.getMessage(); logger.error(errorMessage, exc); status.setTaskStatus(TaskStatusEnum.FINISHED_FAILED); status.setEndTime(System.currentTimeMillis()); status.setErrorMessage(endUserErrorMessage); final Environment environment = environmentRepository.findByTechnicalDeploymentInstanceId(tdiId); environment.updateStatus(EnvironmentStatus.FAILED, endUserErrorMessage, -1); } public ProcessInstance runProcess(int tdiId, ActivationStepEnum processType, String processId) { logger.debug("Starting process "+processType.getName()+" for TechnicalDeploymentInstance#" + tdiId); ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processId); logger.info("Process "+processType.getName()+" for TechnicalDeploymentInstance#" + tdiId + " is started with id=" + processInstance.getId()); return processInstance; } }