/** * 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.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.Hashtable; import java.util.List; import java.util.Stack; import java.util.Set; import javax.servlet.ServletContext; import javax.ws.rs.Path; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.Response.Status; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.intuit.tank.api.model.v1.cloud.CloudVmStatus; import com.intuit.tank.api.model.v1.cloud.CloudVmStatusContainer; import com.intuit.tank.api.service.v1.cloud.CloudService; import com.intuit.tank.dao.SummaryDataDao; import com.intuit.tank.persistence.databases.DataBaseFactory; import com.intuit.tank.reporting.api.TPSReportingPackage; import com.intuit.tank.reporting.databases.IDatabase; import com.intuit.tank.reporting.databases.TankDatabaseType; import com.intuit.tank.reporting.factory.ReportingFactory; import com.intuit.tank.results.TankResult; import com.intuit.tank.results.TankResultPackage; import com.intuit.tank.service.util.ResponseUtil; import com.intuit.tank.service.util.ServletInjector; /** * CloudServiceV1 * * @author dangleton * */ @Path(CloudService.SERVICE_RELATIVE_PATH) public class CloudServiceV1 implements CloudService { private static final Logger LOG = LogManager.getLogger(CloudServiceV1.class); @Context private ServletContext servletContext; private DateFormat dateFormatFull = new SimpleDateFormat("MM-dd-yyyy'T'hh:mm:ss z"); private DateFormat dateFormatShort = new SimpleDateFormat("MM-dd-yyyy"); private static Hashtable<String, Stack<Integer>> stackMap = new Hashtable<String, Stack<Integer>>(); /** * @{inheritDoc */ @Override public String ping() { return "PONG " + getClass().getSimpleName(); } /** * @{inheritDoc */ @Override public String userIdFromRange(String jobId, int minValue, int maxValue) { Stack<Integer> stack = getStack(minValue, maxValue); if (stack.size() > 0) { return Integer.toString(stack.pop()); } throw new IllegalArgumentException("Exhausted random User Ids. Range not large enough for the number of calls."); } /** * @param minId * @param maxId * @return */ private synchronized Stack<Integer> getStack(Integer minId, Integer maxId) { Stack<Integer> stack = stackMap.get(minId.toString() + "-" + maxId.toString()); if (stack == null) { List<Integer> list = new ArrayList<Integer>(); for (int i = minId; i <= maxId; i++) { list.add(i); } Collections.shuffle(list); stack = new Stack<Integer>(); stack.addAll(list); } return stack; } /** * @{inheritDoc */ @Override public Response getSummaryStatus(String jobId) { ResponseBuilder responseBuilder = null; try { responseBuilder = Response.ok(); boolean hasTable = ReportingFactory.getResultsReader().hasTimingData(jobId); boolean hasEntries = new SummaryDataDao().findByJobId(Integer.parseInt(jobId)).size() != 0; String status = "Gathering"; if (hasEntries && !hasTable) { status = "Complete"; } else if (!hasTable && !hasEntries) { status = "NoData"; } responseBuilder.entity(status); } catch (Exception e) { LOG.error("Error determining status: " + e.getMessage(), e); throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR); } responseBuilder.cacheControl(ResponseUtil.getNoStoreCacheControl()); return responseBuilder.build(); } /** * @{inheritDoc */ @Override public Response getVmStatus(String instanceId) { ResponseBuilder responseBuilder = null; try { responseBuilder = Response.ok(); CloudController controller = new ServletInjector<CloudController>().getManagedBean( servletContext, CloudController.class); CloudVmStatus status = controller.getVmStatus(instanceId); responseBuilder.entity(status); } catch (Exception e) { LOG.error("Error Applying Filters: " + e.getMessage(), e); throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR); } responseBuilder.cacheControl(ResponseUtil.getNoStoreCacheControl()); return responseBuilder.build(); } /** * @{inheritDoc */ @Override public void setVmStatus(final String instanceId, final CloudVmStatus status) { CloudController controller = new ServletInjector<CloudController>().getManagedBean( servletContext, CloudController.class); controller.setVmStatus(instanceId, status); } /** * @{inheritDoc */ @Override public Response getVmStatusForJob(String jobId) { ResponseBuilder responseBuilder = null; try { responseBuilder = Response.ok(); CloudController controller = new ServletInjector<CloudController>().getManagedBean( servletContext, CloudController.class); CloudVmStatusContainer container = controller.getVmStatusForJob(jobId); responseBuilder.entity(container); } catch (Exception e) { LOG.error("Error Applying Filters: " + e.getMessage(), e); throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR); } responseBuilder.cacheControl(ResponseUtil.getNoStoreCacheControl()); return responseBuilder.build(); } /** * @{inheritDoc */ @Override public String startJob(String jobId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); return controller.startJob(jobId); } /** * @{inheritDoc */ @Override public void killJob(String jobId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.killJob(jobId); } /** * @{inheritDoc */ @Override public Set<CloudVmStatusContainer> killAllJobs() { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); return controller.killAllJobs(); } /** * @{inheritDoc */ @Override public void killInstance(String instanceId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.killInstance(instanceId); } /** * @{inheritDoc */ @Override public void killInstances(List<String> instanceIds) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.killInstances(instanceIds); } /** * @{inheritDoc */ @Override public Set<CloudVmStatusContainer> stopAllJobs() { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); return controller.stopAllJobs(); } /** * @{inheritDoc */ @Override public void stopJob(String jobId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.stopJob(jobId); } /** * @{inheritDoc */ @Override public void stopAgent(String instanceId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.stopAgent(instanceId); } /** * @{inheritDoc */ @Override public void stopAgents(List<String> instanceIds) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.stopAgents(instanceIds); } /** * @{inheritDoc */ @Override public void pauseJob(String jobId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.pauseJob(jobId); } /** * @{inheritDoc */ @Override public void pauseAgent(String instanceId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.pauseAgent(instanceId); } /** * @{inheritDoc */ @Override public void pauseAgents(List<String> instanceIds) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.pauseAgents(instanceIds); } /** * @{inheritDoc */ @Override public void restartJob(String jobId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.restartJob(jobId); } /** * @{inheritDoc */ @Override public void restartAgent(String instanceId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.restartAgent(instanceId); } /** * @{inheritDoc */ @Override public void restartAgents(List<String> instanceIds) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.restartAgents(instanceIds); } /** * @{inheritDoc */ @Override public void pauseRampInstance(String instanceId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.pauseRampInstance(instanceId); } /** * @{inheritDoc */ @Override public void pauseRampJob(String jobId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.pauseRampJob(jobId); } /** * @{inheritDoc */ @Override public void pauseRampInstances(List<String> instanceIds) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.pauseRampInstances(instanceIds); } /** * @{inheritDoc */ @Override public void resumeRampInstance(String instanceId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.resumeRampInstance(instanceId); } /** * @{inheritDoc */ @Override public void resumeRampJob(String jobId) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.resumeRampJob(jobId); } /** * @{inheritDoc */ @Override public void resumeRampInstances(List<String> instanceIds) { JobController controller = new ServletInjector<JobController>().getManagedBean( servletContext, JobController.class); controller.resumeRampInstances(instanceIds); } /** * @{inheritDoc */ @Override public String getCostingForDates(String startDate, String endDate) { // AWSCostRetriever retriever = new AWSCostRetriever(); // Calendar start = Calendar.getInstance(TimeZone.getTimeZone("GMT")); // Calendar end = Calendar.getInstance(TimeZone.getTimeZone("GMT")); // start.setTime(parseDateString(startDate)); // end.setTime(parseDateString(endDate)); // ServiceUsage usage = retriever.getCustomReport(start, end); // UsageCalculator calc = new UsageCalculator(usage); // return AwsUtil.generateReport(calc); throw new RuntimeException("Not implemented"); } /** * @{inheritDoc */ @Override public String getCostingForDates(String timePeriod) { throw new RuntimeException("Not implemented"); // AWSCostRetriever retriever = new AWSCostRetriever(); // ServiceUsage usage = retriever.getPreDefinedReport(TimePeriodSelectChoice.valueOf(timePeriod)); // UsageCalculator calc = new UsageCalculator(usage); // return AwsUtil.generateReport(calc); } }