/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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 org.kie.server.controller.rest; import java.util.Collection; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.kie.server.controller.api.KieServerControllerException; import org.kie.server.controller.api.KieServerControllerNotFoundException; import org.kie.server.controller.api.model.spec.Capability; import org.kie.server.controller.api.model.spec.ContainerConfig; import org.kie.server.controller.api.model.spec.ContainerSpecKey; import org.kie.server.controller.api.model.spec.ContainerSpecList; import org.kie.server.controller.api.model.spec.RuleConfig; import org.kie.server.controller.api.model.spec.ServerTemplateKey; import org.kie.server.controller.api.model.spec.ServerTemplateList; import org.kie.server.controller.impl.service.SpecManagementServiceImpl; import org.kie.server.controller.api.model.spec.ContainerSpec; import org.kie.server.controller.api.model.spec.ProcessConfig; import org.kie.server.controller.api.model.spec.ServerTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.kie.server.controller.rest.ControllerUtils.*; @Path("/controller/management") public class RestSpecManagementServiceImpl extends SpecManagementServiceImpl { private static final Logger logger = LoggerFactory.getLogger(RestSpecManagementServiceImpl.class); private static final String REQUEST_FAILED_TOBE_PROCESSED = "Request failed to be processed due to: "; @PUT @Path("servers/{id}/containers/{containerId}") @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response saveContainerSpec(@Context HttpHeaders headers, @PathParam("id") String serverTemplateId, @PathParam("containerId") String containerId, String containerSpecPayload) { String contentType = getContentType(headers); try { logger.debug("Received save container spec request for server template with id {}", serverTemplateId); ContainerSpec containerSpec = unmarshal(containerSpecPayload, contentType, ContainerSpec.class); logger.debug("Container spec is {}", containerSpec); super.saveContainerSpec(serverTemplateId, containerSpec); logger.debug("Returning response for save container spec request for server template with id '{}': CREATED", serverTemplateId); return createCorrectVariant("", headers, Response.Status.CREATED); } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (KieServerControllerException e){ return createCorrectVariant(REQUEST_FAILED_TOBE_PROCESSED + e.getMessage(), headers, Response.Status.BAD_REQUEST); } catch (Exception e) { logger.error("Save container spec request for server template id {} failed due to {}", serverTemplateId, e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } @POST @Path("servers/{id}/containers/{containerId}") @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response updateContainerSpec(@Context HttpHeaders headers, @PathParam("id") String serverTemplateId, @PathParam("containerId") String containerId, String containerSpecPayload) { String contentType = getContentType(headers); try { logger.debug("Received update container spec request for server template with id {}", serverTemplateId); ContainerSpec containerSpec = unmarshal(containerSpecPayload, contentType, ContainerSpec.class); logger.debug("Container spec is {}", containerSpec); super.updateContainerSpec(serverTemplateId, containerId, containerSpec); logger.debug("Returning response for update container spec request for server template with id '{}': CREATED", serverTemplateId); return createCorrectVariant("", headers, Response.Status.CREATED); } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (KieServerControllerException e){ return createCorrectVariant(REQUEST_FAILED_TOBE_PROCESSED + e.getMessage(), headers, Response.Status.BAD_REQUEST); } catch (Exception e) { logger.error("Save container spec request for server template id {} failed due to {}", serverTemplateId, e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } @PUT @Path("servers/{id}") @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response saveServerTemplate(@Context HttpHeaders headers, @PathParam("id") String serverTemplateId, String serverTemplatePayload) { String contentType = getContentType(headers); try { if (super.getServerTemplate(serverTemplateId) != null) { return createCorrectVariant("Server template " + serverTemplateId + " already registered", headers, Response.Status.NOT_FOUND); } logger.debug("Received save server template with id {}", serverTemplateId); ServerTemplate serverTemplate = unmarshal(serverTemplatePayload, contentType, ServerTemplate.class); if (serverTemplate == null) { return createCorrectVariant("Server template " + serverTemplateId + " not found", headers, Response.Status.NOT_FOUND); } logger.debug("Server template is {}", serverTemplate); super.saveServerTemplate(serverTemplate); logger.debug("Returning response for save server template with id '{}': CREATED", serverTemplateId); return createCorrectVariant("", headers, Response.Status.CREATED); } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (KieServerControllerException e){ return createCorrectVariant(REQUEST_FAILED_TOBE_PROCESSED + e.getMessage(), headers, Response.Status.BAD_REQUEST); } catch (Exception e) { logger.error("Save server template id {} failed due to {}", serverTemplateId, e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } @GET @Path("servers/{id}") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getServerTemplate(@Context HttpHeaders headers, @PathParam("id") String serverTemplateId) { String contentType = getContentType(headers); try { logger.debug("Received get server template with id {}", serverTemplateId); ServerTemplate serverTemplate = super.getServerTemplate(serverTemplateId); if (serverTemplate == null) { return createCorrectVariant("Server template " + serverTemplateId + " not found", headers, Response.Status.NOT_FOUND); } String response = marshal(contentType, serverTemplate); logger.debug("Returning response for get server template with id '{}': {}", serverTemplateId, response); return createCorrectVariant(response, headers, Response.Status.OK); } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (KieServerControllerException e){ return createCorrectVariant(REQUEST_FAILED_TOBE_PROCESSED + e.getMessage(), headers, Response.Status.BAD_REQUEST); } catch (Exception e) { logger.error("Get server template id {} failed due to {}", serverTemplateId, e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } @GET @Path("servers") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response listServerTemplates(@Context HttpHeaders headers) { String contentType = getContentType(headers); try { logger.debug("Received get server templates"); Collection<ServerTemplate> servers = super.listServerTemplates(); String response = marshal(contentType, new ServerTemplateList(servers)); logger.debug("Returning response for get server templates: {}", response); return createCorrectVariant(response, headers, Response.Status.OK); } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (KieServerControllerException e){ return createCorrectVariant(REQUEST_FAILED_TOBE_PROCESSED + e.getMessage(), headers, Response.Status.BAD_REQUEST); } catch (Exception e) { logger.error("Get server templates failed due to {}", e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } @GET @Path("servers/{id}/containers") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response listContainerSpec(@Context HttpHeaders headers, @PathParam("id") String serverTemplateId) { String contentType = getContentType(headers); try { logger.debug("Received get containers for server template with id {}", serverTemplateId); Collection<ContainerSpec> containerSpecs = super.listContainerSpec(serverTemplateId); String response = marshal(contentType, new ContainerSpecList(containerSpecs)); logger.debug("Returning response for get containers for server templates with id {}: {}", serverTemplateId, response); return createCorrectVariant(response, headers, Response.Status.OK); } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (KieServerControllerException e){ return createCorrectVariant(REQUEST_FAILED_TOBE_PROCESSED + e.getMessage(), headers, Response.Status.BAD_REQUEST); } catch (Exception e) { logger.error("Get server templates failed due to {}", e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } @GET @Path("servers/{id}/containers/{containerId}") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getContainerSpec(@Context HttpHeaders headers, @PathParam("id") String serverTemplateId, @PathParam("containerId") String containerId) { String contentType = getContentType(headers); try { logger.debug("Received get container {} for server template with id {}", containerId, serverTemplateId); ServerTemplate serverTemplate = super.getServerTemplate(serverTemplateId); if (serverTemplate == null) { return createCorrectVariant("Server template " + serverTemplateId + " not found", headers, Response.Status.NOT_FOUND); } ContainerSpec containerSpec = serverTemplate.getContainerSpec(containerId); if (containerSpec == null) { return createCorrectVariant("Server template " + serverTemplateId + " does not have container with id " + containerId, headers, Response.Status.NOT_FOUND); } // set it as server template key only to avoid cyclic references between containers and templates containerSpec.setServerTemplateKey(new ServerTemplateKey(serverTemplate.getId(), serverTemplate.getName())); String response = marshal(contentType, containerSpec); logger.debug("Returning response for get container {} for server templates with id {}: {}", containerId, serverTemplateId, response); return createCorrectVariant(response, headers, Response.Status.OK); } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (KieServerControllerException e){ return createCorrectVariant(REQUEST_FAILED_TOBE_PROCESSED + e.getMessage(), headers, Response.Status.BAD_REQUEST); } catch (Exception e) { logger.error("Get server templates failed due to {}", e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } @DELETE @Path("servers/{id}/containers/{containerId}") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response deleteContainerSpec(@Context HttpHeaders headers, @PathParam("id") String serverTemplateId, @PathParam("containerId") String containerSpecId) { try { super.deleteContainerSpec(serverTemplateId, containerSpecId); // return null to produce 204 return null; } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (KieServerControllerException e){ return createCorrectVariant(REQUEST_FAILED_TOBE_PROCESSED + e.getMessage(), headers, Response.Status.BAD_REQUEST); } catch (Exception e) { logger.error("Remove container with id {} from server template with id {} failed due to {}", containerSpecId, serverTemplateId, e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } @DELETE @Path("servers/{id}") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response deleteServerTemplate(@Context HttpHeaders headers, @PathParam("id") String serverTemplateId) { try { super.deleteServerTemplate(serverTemplateId); // return null to produce 204 return null; } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (KieServerControllerException e){ return createCorrectVariant(REQUEST_FAILED_TOBE_PROCESSED + e.getMessage(), headers, Response.Status.BAD_REQUEST); } catch (Exception e) { logger.error("Remove server template with id {} failed due to {}", serverTemplateId, e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } @POST @Path("servers/{id}/containers/{containerId}/config/{capability}") @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response updateContainerConfig(@Context HttpHeaders headers, @PathParam("id") String serverTemplateId, @PathParam("containerId") String containerSpecId, @PathParam("capability") String capabilityStr, String containerConfigPayload) { String contentType = getContentType(headers); try { ContainerConfig containerConfig; Capability capability; if (capabilityStr.equals(Capability.PROCESS.name())) { capability = Capability.PROCESS; logger.debug("Received update container (with id {}) process config request for server template with id {}", containerSpecId , serverTemplateId); containerConfig = unmarshal(containerConfigPayload, contentType, ProcessConfig.class); } else if (capabilityStr.equals(Capability.RULE.name())) { capability = Capability.RULE; logger.debug("Received update container (with id {}) rule config request for server template with id {}", containerSpecId, serverTemplateId); containerConfig = unmarshal(containerConfigPayload, contentType, RuleConfig.class); } else { logger.debug("Not supported configuration type {}, returning bad request response", capabilityStr); return createCorrectVariant("Not supported configuration " + capabilityStr, headers, Response.Status.BAD_REQUEST); } logger.debug("Container configuration is {}", containerConfig); super.updateContainerConfig(serverTemplateId, containerSpecId, capability, containerConfig); logger.debug("Returning response for update container (with id {}) config '{}': CREATED", containerSpecId); return createCorrectVariant("", headers, Response.Status.CREATED); } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (KieServerControllerException e){ return createCorrectVariant(REQUEST_FAILED_TOBE_PROCESSED + e.getMessage(), headers, Response.Status.BAD_REQUEST); } catch (Exception e) { logger.error("Remove server template with id {} failed due to {}", serverTemplateId, e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } @POST @Path("servers/{id}/containers/{containerId}/status/stopped") @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response stopContainer(@Context HttpHeaders headers, @PathParam("id") String serverTemplateId, @PathParam("containerId") String containerId) { logger.debug("Requesting stop container with id {} server instance: {}", containerId, serverTemplateId); try { ContainerSpecKey containerSpecKey = new ContainerSpecKey(); containerSpecKey.setId(containerId); containerSpecKey.setServerTemplateKey(new ServerTemplateKey(serverTemplateId, "")); super.stopContainer(containerSpecKey); logger.debug("Returning response for stop container with id {} server instance: {}", containerId, serverTemplateId); return createCorrectVariant("", headers, Response.Status.OK); } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (Exception e) { logger.error("Stop container failed due to {}", e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } @POST @Path("servers/{id}/containers/{containerId}/status/started") @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response startContainer(@Context HttpHeaders headers, @PathParam("id") String serverTemplateId, @PathParam("containerId") String containerId) { logger.debug("Requesting start container with id {} server instance: {}", containerId, serverTemplateId); try { ContainerSpecKey containerSpecKey = new ContainerSpecKey(); containerSpecKey.setId(containerId); containerSpecKey.setServerTemplateKey(new ServerTemplateKey(serverTemplateId, "")); super.startContainer(containerSpecKey); logger.debug("Returning response for start container with id {} server instance: {}", containerId, serverTemplateId); return createCorrectVariant("", headers, Response.Status.OK); } catch (KieServerControllerNotFoundException e) { return createCorrectVariant(e.getMessage(), headers, Response.Status.NOT_FOUND); } catch (Exception e) { logger.error("Start container failed due to {}", e.getMessage(), e); return createCorrectVariant("Unknown error " + e.getMessage(), headers, Response.Status.INTERNAL_SERVER_ERROR); } } }