/** * Copyright 2011 Intuit Inc. All Rights Reserved */ package com.intuit.tank.service.impl.v1.agent; /* * #%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.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.annotation.Nonnull; 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 javax.ws.rs.core.StreamingOutput; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.intuit.tank.api.model.v1.agent.TankHttpClientDefinition; import com.intuit.tank.api.model.v1.agent.TankHttpClientDefinitionContainer; import com.intuit.tank.api.service.v1.agent.AgentService; import com.intuit.tank.perfManager.workLoads.JobManager; import com.intuit.tank.service.util.ResponseUtil; import com.intuit.tank.service.util.ServletInjector; import com.intuit.tank.storage.FileData; import com.intuit.tank.storage.FileStorage; import com.intuit.tank.storage.FileStorageFactory; import com.intuit.tank.vm.agent.messages.AgentAvailability; import com.intuit.tank.vm.agent.messages.AgentData; import com.intuit.tank.vm.agent.messages.AgentTestStartData; import com.intuit.tank.vm.agent.messages.Header; import com.intuit.tank.vm.agent.messages.Headers; import com.intuit.tank.vm.perfManager.StandaloneAgentTracker; import com.intuit.tank.vm.settings.AgentConfig; import com.intuit.tank.vm.settings.TankConfig; /** * CloudServiceV1 * * @author dangleton * */ @Path(AgentService.SERVICE_RELATIVE_PATH) public class AgentServiceV1 implements AgentService { private static final String HARNESS_JAR = "apiharness-1.0-all.jar"; private static final Logger LOG = LogManager.getLogger(AgentServiceV1.class); @Context private ServletContext servletContext; /** * @{inheritDoc */ @Override public String ping() { return "PONG " + getClass().getSimpleName(); } /** * @{inheritDoc */ @Override public Response agentReady(AgentData data) { LOG.info("Agent ready: " + data); ResponseBuilder responseBuilder = null; try { responseBuilder = Response.ok(); JobManager jobManager = new ServletInjector<JobManager>().getManagedBean(servletContext, JobManager.class); AgentTestStartData response = jobManager.registerAgentForJob(data); responseBuilder.entity(response); } 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(); } @Override public Response getSettings() { ResponseBuilder responseBuilder = null; try { responseBuilder = Response.ok(); File configFile = new TankConfig().getSourceConfigFile(); File agentConfigFile = new File(configFile.getParentFile(), "agent-settings.xml"); if (agentConfigFile.exists() && agentConfigFile.isFile()) { configFile = agentConfigFile; } responseBuilder.entity(FileUtils.readFileToString(configFile)); } catch (Exception e) { LOG.error("Error reading settings: " + e.getMessage(), e); throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR); } responseBuilder.cacheControl(ResponseUtil.getNoStoreCacheControl()); return responseBuilder.build(); } @Override @Nonnull public Response getSupportFiles() { ResponseBuilder responseBuilder = Response.ok(); // AuthUtil.checkLoggedIn(servletContext); final FileStorage fileStorage = FileStorageFactory.getFileStorage(new TankConfig().getJarDir(), false); final File harnessJar = new File(servletContext.getRealPath("/tools/" + HARNESS_JAR)); LOG.info("harnessJar = " + harnessJar.getAbsolutePath()); final List<FileData> files = fileStorage.listFileData(""); StreamingOutput streamingOutput = new StreamingOutput() { @Override public void write(OutputStream output) throws IOException, WebApplicationException { ZipOutputStream zip = new ZipOutputStream(output); try { boolean harnessJarExists = harnessJar.exists(); if (harnessJarExists) { addFileToZip(HARNESS_JAR, new FileInputStream(harnessJar), zip); zip.flush(); } for (FileData fileData : files) { if (harnessJarExists && fileData.getFileName().equals(HARNESS_JAR)) { LOG.info("Not adding harness because we found it in the war."); } else { addFileToZip(fileData.getFileName(), fileStorage.readFileData(fileData), zip); zip.flush(); } } } catch (Exception e) { throw new RuntimeException(e); } finally { IOUtils.closeQuietly(zip); } } }; String filename = "agent-support-files.zip"; responseBuilder.header("Content-Disposition", "attachment; filename=\"" + filename + "\""); responseBuilder.entity(streamingOutput); return responseBuilder.build(); } private void addFileToZip(String name, InputStream in, ZipOutputStream zip) throws Exception { try { zip.putNextEntry(new ZipEntry(name)); IOUtils.copy(in, zip); } finally { IOUtils.closeQuietly(in); } } @Override public Response standaloneAgentAvailable(@Nonnull AgentAvailability availability) { StandaloneAgentTracker tracker = new ServletInjector<StandaloneAgentTracker>().getManagedBean(servletContext, StandaloneAgentTracker.class); LOG.info("Adding agent availability: " + availability); tracker.addAvailability(availability); return Response.noContent().build(); } @Override public Response getHeaders() { ResponseBuilder responseBuilder = Response.ok(); Headers headers = new Headers(); Map<String, String> requestHeaderMap = new TankConfig().getAgentConfig().getRequestHeaderMap(); if (requestHeaderMap != null) { for (Entry<String, String> entry : requestHeaderMap.entrySet()) { headers.getHeaders().add(new Header(entry.getKey(), entry.getValue())); } } responseBuilder.entity(headers); return responseBuilder.build(); } @Override public Response getClients() { ResponseBuilder responseBuilder = Response.ok(); AgentConfig config = new TankConfig().getAgentConfig(); Map<String, String> map = config.getTankClientMap(); List<TankHttpClientDefinition> definitions = new ArrayList<TankHttpClientDefinition>(); for (Entry<String, String> entry : map.entrySet()) { definitions.add(new TankHttpClientDefinition(entry.getKey(), entry.getValue())); } String defaultDefinition = config.getTankClientDefault(); if (defaultDefinition == null && definitions.size() > 0) { defaultDefinition = definitions.get(0).getName(); } TankHttpClientDefinitionContainer container = new TankHttpClientDefinitionContainer(definitions, defaultDefinition); responseBuilder.entity(container); return responseBuilder.build(); } }