/** * Copyright 2011 Intuit Inc. All Rights Reserved */ package com.intuit.tank.service.impl.v1.cloud; /* * #%L * Cloud Rest Service * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Set; import java.util.Iterator; import javax.enterprise.event.Event; import javax.inject.Inject; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.intuit.tank.api.cloud.VMTracker; import com.intuit.tank.api.model.v1.cloud.CloudVmStatus; import com.intuit.tank.api.model.v1.cloud.CloudVmStatusContainer; import com.intuit.tank.api.model.v1.cloud.VMStatus; import com.intuit.tank.dao.JobInstanceDao; import com.intuit.tank.perfManager.workLoads.JobManager; import com.intuit.tank.project.JobInstance; import com.intuit.tank.vm.api.enumerated.JobLifecycleEvent; import com.intuit.tank.vm.api.enumerated.JobQueueStatus; import com.intuit.tank.vm.api.enumerated.JobStatus; import com.intuit.tank.vm.event.JobEvent; import com.intuit.tank.vm.perfManager.AgentChannel; import com.intuit.tank.vm.vmManager.VMChannel; import com.intuit.tank.vmManager.environment.amazon.AmazonInstance; /** * CloudServiceV1 * * @author dangleton * */ public class JobController { @SuppressWarnings("unused") private static final Logger LOG = LogManager.getLogger(JobController.class); @Inject private VMTracker vmTracker; // @Inject // private PerfManagerJobListener perfManagerJobListener; @Inject private JobManager jobManager; @Inject private AgentChannel agentChannel; @Inject private VMChannel channel; @Inject private Event<JobEvent> jobEventProducer; @Inject private CloudController cloudController; /** * @{inheritDoc */ public String startJob(String jobId) { JobInstanceDao jobInstanceDao = new JobInstanceDao(); JobInstance job = jobInstanceDao.findById(Integer.valueOf(jobId)); synchronized (jobId) { if (job.getStatus() == JobQueueStatus.Created) {// only start if new job // save the job job.setStatus(JobQueueStatus.Starting); jobInstanceDao.saveOrUpdate(job); vmTracker.removeStatusForJob(Integer.toString(job.getId())); jobManager.startJob(job.getId()); jobEventProducer.fire(new JobEvent(jobId, "", JobLifecycleEvent.JOB_STARTED)); } } return Integer.toString(job.getId()); } /** * @{inheritDoc */ public void killJob(String jobId, boolean fireEvent) { List<String> instanceIds = getInstancesForJob(jobId); vmTracker.stopJob(jobId); killInstances(instanceIds); if (fireEvent) { jobEventProducer.fire(new JobEvent(jobId, "", JobLifecycleEvent.JOB_KILLED)); } } /** * @{inheritDoc */ public void killJob(String jobId) { killJob(jobId, true); } /** * @{inheritDoc */ public Set<CloudVmStatusContainer> killAllJobs() { Set<CloudVmStatusContainer> jobs = vmTracker.getAllJobs(); Iterator iter = jobs.iterator(); while (iter.hasNext()) { String jobId = ((CloudVmStatusContainer)iter.next()).getJobId(); killJob(jobId, true); } return jobs; } /** * @{inheritDoc */ public void killInstance(String instanceId) { killInstances(Arrays.asList(new String[] { instanceId })); } /** * @{inheritDoc */ public void killInstances(List<String> instanceIds) { agentChannel.killAgents(instanceIds); if (!vmTracker.isDevMode()) { AmazonInstance amzInstance = new AmazonInstance(null, null); amzInstance.kill(instanceIds); } String jobId = null; for (String instanceId : instanceIds) { CloudVmStatus status = new CloudVmStatus(vmTracker.getStatus(instanceId)); status.setCurrentUsers(0); status.setEndTime(new Date()); status.setJobStatus(JobStatus.Completed); status.setVmStatus(VMStatus.terminated); vmTracker.setStatus(status); jobId = status.getJobId(); } if (jobId != null) { cloudController.checkJobStatus(jobId); } } /** * @{inheritDoc */ public Set<CloudVmStatusContainer> stopAllJobs() { Set<CloudVmStatusContainer> jobs = vmTracker.getAllJobs(); Iterator iter = jobs.iterator(); while (iter.hasNext()) { String jobId = ((CloudVmStatusContainer)iter.next()).getJobId(); List<String> instanceIds = getInstancesForJob(jobId); vmTracker.stopJob(jobId); stopAgents(instanceIds); jobEventProducer.fire(new JobEvent(jobId, "", JobLifecycleEvent.JOB_STOPPED)); } return jobs; } /** * @{inheritDoc */ public void stopJob(String jobId) { List<String> instanceIds = getInstancesForJob(jobId); vmTracker.stopJob(jobId); stopAgents(instanceIds); jobEventProducer.fire(new JobEvent(jobId, "", JobLifecycleEvent.JOB_STOPPED)); } /** * @{inheritDoc */ public void stopAgent(String instanceId) { stopAgents(Arrays.asList(new String[] { instanceId })); } /** * @{inheritDoc */ public void stopAgents(List<String> instanceIds) { agentChannel.stopAgents(instanceIds); } /** * @{inheritDoc */ public void pauseJob(String jobId) { List<String> instanceIds = getInstancesForJob(jobId); pauseAgents(instanceIds); jobEventProducer.fire(new JobEvent(jobId, "", JobLifecycleEvent.JOB_PAUSED)); } /** * @{inheritDoc */ public void pauseAgent(String instanceId) { pauseAgents(Arrays.asList(new String[] { instanceId })); } /** * @{inheritDoc */ public void pauseAgents(List<String> instanceIds) { agentChannel.pauseAgents(instanceIds); } /** * @{inheritDoc */ public void restartJob(String jobId) { List<String> instanceIds = getInstancesForJob(jobId); restartAgents(instanceIds); jobEventProducer.fire(new JobEvent(jobId, "", JobLifecycleEvent.JOB_RESUMED)); } /** * @{inheritDoc */ public void restartAgent(String instanceId) { restartAgents(Arrays.asList(new String[] { instanceId })); } /** * @{inheritDoc */ public void restartAgents(List<String> instanceIds) { agentChannel.restartAgents(instanceIds); } /** * @{inheritDoc */ public void pauseRampInstance(String instanceId) { pauseRampInstances(Arrays.asList(new String[] { instanceId })); } /** * @{inheritDoc */ public void pauseRampJob(String jobId) { List<String> instanceIds = getInstancesForJob(jobId); pauseRampInstances(instanceIds); jobEventProducer.fire(new JobEvent(jobId, "", JobLifecycleEvent.RAMP_PAUSED)); } /** * @{inheritDoc */ public void pauseRampInstances(List<String> instanceIds) { agentChannel.pauseRamp(instanceIds); } /** * @{inheritDoc */ public void resumeRampInstance(String instanceId) { resumeRampInstances(Arrays.asList(new String[] { instanceId })); } /** * @{inheritDoc */ public void resumeRampJob(String jobId) { List<String> instanceIds = getInstancesForJob(jobId); resumeRampInstances(instanceIds); jobEventProducer.fire(new JobEvent(jobId, "", JobLifecycleEvent.RAMP_RESUMED)); } /** * @{inheritDoc */ public void resumeRampInstances(List<String> instanceIds) { agentChannel.resumeRamp(instanceIds); } /** * @param jobId * @return */ private List<String> getInstancesForJob(String jobId) { List<String> instanceIds = new ArrayList<String>(); CloudVmStatusContainer statuses = vmTracker.getVmStatusForJob(jobId); if (statuses != null) { for (CloudVmStatus status : statuses.getStatuses()) { instanceIds.add(status.getInstanceId()); } } return instanceIds; } }