/**
* 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;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.TaskExecutor;
import java.util.HashMap;
import java.util.Map;
/**
* Mock Implementation of {@link com.francetelecom.clara.cloud.paas.activation.ManagePaasActivation}
*/
public class ManagePaasActivationStubbedImplForTestsWicket implements ManagePaasActivation {
private static Logger logger = LoggerFactory.getLogger(ManagePaasActivationStubbedImplForTestsWicket.class.getName());
/**
* Private IOC attributes. Get a Task executor for async treatment with IOC
* (workwanager on was)
*/
private TaskExecutor springTaskCoreExecutor;
@Autowired
private EnvironmentRepository environmentRepository;
private Map<Long, TaskStatusActivation> taskStatus = new HashMap<Long, TaskStatusActivation>();
@Autowired
private com.francetelecom.clara.cloud.paas.activation.ActivationStubbedSideEffectsUtils activationStubbedSideEffectsUtils;
/**
* Utility method to factor out implementations of activate(tdi) and activate(td)
*/
public TaskStatusActivation activate(final int tdiId) {
logger.info("Starting TechnicalDeploymentInstance#" + tdiId + " activation");
// Prepare TaskStatus
final TaskStatusActivation statusActivate = new TaskStatusActivation(100);
taskStatus.put(statusActivate.getTaskId(), statusActivate);
statusActivate.setTitle("Activating virtual appliance TechnicalDeploymentInstance#" + tdiId);
statusActivate.setStartTime(System.currentTimeMillis());
statusActivate.setTaskStatus(TaskStatusEnum.STARTED);
final TaskStatusActivation statusIaas = new TaskStatusActivation(101);
statusIaas.setTitle("Creating virtual appliance TechnicalDeploymentInstance#" + tdiId);
statusIaas.setTaskStatus(TaskStatusEnum.TRANSIENT);
statusIaas.setMaxPercent(80);
statusActivate.addSubtask(statusIaas);
final TaskStatusActivation statusConfiguration = new TaskStatusActivation(102);
statusConfiguration.setTitle("Post configuring virtual appliance TechnicalDeploymentInstance#" + tdiId);
statusConfiguration.setTaskStatus(TaskStatusEnum.TRANSIENT);
statusConfiguration.setMaxPercent(10);
statusActivate.addSubtask(statusConfiguration);
final TaskStatusActivation statusPowerOn = new TaskStatusActivation(103);
statusPowerOn.setTitle("Powering ON virtual appliance TechnicalDeploymentInstance#" + tdiId);
statusPowerOn.setTaskStatus(TaskStatusEnum.TRANSIENT);
statusPowerOn.setMaxPercent(10);
statusActivate.addSubtask(statusPowerOn);
try {
// Create the vApp
statusActivate.setTechnicalDeploymentInstanceId(tdiId);
statusIaas.setPercent(50);
statusIaas.setPercent(100);
statusIaas.setTaskStatus(TaskStatusEnum.FINISHED_OK);
// Do post configuration
statusConfiguration.setTaskStatus(TaskStatusEnum.STARTED);
statusConfiguration.setPercent(20);
statusConfiguration.setPercent(100);
statusConfiguration.setTaskStatus(TaskStatusEnum.FINISHED_OK);
// Power on
statusPowerOn.setTaskStatus(TaskStatusEnum.STARTED);
statusPowerOn.setPercent(30);
statusPowerOn.setPercent(100);
statusPowerOn.setTaskStatus(TaskStatusEnum.FINISHED_OK);
} catch (Throwable e) {
statusActivate.setEndTime(System.currentTimeMillis());
statusActivate.setTaskStatus(TaskStatusEnum.FINISHED_FAILED);
statusActivate.setErrorMessage(e.getMessage());
}
// Commit transaction if ok
logger.info("Task is done");
return giveCurrentTaskStatus(statusActivate);
}
@Override
public TaskStatusActivation start(int tdiId) {
final TaskStatusActivation status = new TaskStatusActivation(200);
taskStatus.put(status.getTaskId(), status);
status.setTitle("Starting virtual appliance TechnicalDeploymentInstance#" + tdiId);
status.setStartTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.STARTED);
this.springTaskCoreExecutor.execute(new Runnable() {
@Override
public void run() {
logger.info("Task is starting");
status.setPercent(50);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// ignore
}
status.setPercent(100);
status.setTaskStatus(TaskStatusEnum.FINISHED_OK);
logger.info("Task is done");
}
});
return giveCurrentTaskStatus(status);
}
@Override
public TaskStatusActivation stop(int tdiId) {
final TaskStatusActivation status = new TaskStatusActivation(200);
taskStatus.put(status.getTaskId(), status);
status.setTitle("Stopping virtual appliance TechnicalDeploymentInstance#" + tdiId);
status.setStartTime(System.currentTimeMillis());
status.setTaskStatus(TaskStatusEnum.STARTED);
this.springTaskCoreExecutor.execute(new Runnable() {
@Override
public void run() {
logger.info("Task is starting");
status.setPercent(50);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// ignore
}
status.setPercent(100);
status.setTaskStatus(TaskStatusEnum.FINISHED_OK);
logger.info("Task is done");
}
});
return giveCurrentTaskStatus(status);
}
@Override
public TaskStatusActivation delete(final int tdiId) {
// Prepare TaskStatus
final TaskStatusActivation statusDelete = new TaskStatusActivation(200);
taskStatus.put(statusDelete.getTaskId(), statusDelete);
statusDelete.setTitle("Deleting virtual appliance TechnicalDeploymentInstance#" + tdiId);
statusDelete.setStartTime(System.currentTimeMillis());
statusDelete.setTaskStatus(TaskStatusEnum.STARTED);
final TaskStatusActivation statusIaas = new TaskStatusActivation(201);
statusIaas.setTitle("Deleting virtual appliance TechnicalDeploymentInstance#" + tdiId);
statusIaas.setTaskStatus(TaskStatusEnum.TRANSIENT);
statusDelete.addSubtask(statusIaas);
final TaskStatusActivation statusConfiguration = new TaskStatusActivation(202);
statusConfiguration.setTitle("Deleting post configuration of virtual appliance TechnicalDeploymentInstance#" + tdiId);
statusConfiguration.setTaskStatus(TaskStatusEnum.TRANSIENT);
statusDelete.addSubtask(statusConfiguration);
this.springTaskCoreExecutor.execute(new Runnable() {
@Override
public void run() {
logger.info("Task is starting");
// Need an entity Manager ?
// Need a transaction Manager
// Attach a transactional context + d�marcation on forked Thread
try {
statusIaas.setPercent(50);
Thread.sleep(2000);
statusIaas.setPercent(100);
statusIaas.setTaskStatus(TaskStatusEnum.FINISHED_OK);
statusConfiguration.setPercent(50);
Thread.sleep(2000);
statusConfiguration.setPercent(100);
statusConfiguration.setTaskStatus(TaskStatusEnum.FINISHED_OK);
final Environment environment = environmentRepository.findByTechnicalDeploymentInstanceId(tdiId);
environment.updateStatus(EnvironmentStatus.REMOVED, "", 100);
environmentRepository.save(environment);
} catch (Throwable e) {
statusDelete.setEndTime(System.currentTimeMillis());
statusDelete.setTaskStatus(TaskStatusEnum.FINISHED_FAILED);
statusDelete.setErrorMessage(e.getMessage());
}
// Commit transaction if ok
logger.info("Task is done");
}
});
return giveCurrentTaskStatus(statusDelete);
}
/**
* IOC
*
* @param springTaskCoreExecutor
*/
public void setSpringTaskCoreExecutor(TaskExecutor springTaskCoreExecutor) {
this.springTaskCoreExecutor = springTaskCoreExecutor;
}
/**
* {@inheritDoc}
*/
@Override
public TaskStatusActivation giveCurrentTaskStatus(TaskStatusActivation status) {
TaskStatusActivation returnedStatus = null;
TaskStatusActivation currentStatus = taskStatus.get(status.getTaskId());
if (currentStatus != null) {
returnedStatus = new TaskStatusActivation(currentStatus);
}
return returnedStatus;
}
public void setEnvironmentRepository(EnvironmentRepository environmentRepository) {
this.environmentRepository = environmentRepository;
}
}