/* (c) Copyright 2011 Telefonica, I+D. Printed in Spain (Europe). All Righ Reserved. The copyright to the software program(s) is property of Telefonica I+D. The program(s) may be used and or copied only with the express written consent of Telefonica I+D or in accordance with the terms and conditions stipulated in the agreement/contract under which the program(s) have been supplied. */ package com.telefonica.claudia.smi.templateManagement.resources; import static com.telefonica.claudia.smi.ExceptionMessages.ERROR_VM_COMMUNICATION; import java.io.IOException; import org.apache.log4j.Logger; import org.restlet.Context; import org.restlet.data.MediaType; import org.restlet.data.Request; import org.restlet.data.Response; import org.restlet.data.Status; import org.restlet.resource.DomRepresentation; import org.restlet.resource.Representation; import org.restlet.resource.Resource; import org.restlet.resource.ResourceException; import org.restlet.resource.Variant; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import com.telefonica.claudia.smi.ExceptionMessages; import com.telefonica.claudia.smi.URICreation; import com.telefonica.claudia.smi.task.TaskManager; import com.telefonica.claudia.smi.templateManagement.TemplateManagementApplication; import com.telefonica.claudia.smi.templateManagement.TemplateManagementDriver; public class TemplatizeResource extends Resource { String vdcId; String vappId; String veeId; String vmId; String orgId; private static Logger log = Logger.getLogger("com.telefonica.claudia.vmi"); public TemplatizeResource(Context context, Request request, Response response) { super(context, request, response); this.vappId = (String) getRequest().getAttributes().get("vapp-id"); this.veeId = (String) getRequest().getAttributes().get("vee-id"); this.vdcId = (String) getRequest().getAttributes().get("vdc-id"); this.orgId = (String) getRequest().getAttributes().get("org-id"); this.vmId = (String) getRequest().getAttributes().get("vm-id"); if (vdcId != null && orgId != null && vappId!=null && vmId != null && veeId != null) { // Define the supported variant. getVariants().add(new Variant(MediaType.TEXT_XML)); // By default a resource cannot be updated. setModifiable(true); } else { // This resource is not available. setAvailable(false); } log.info("Power resource created"); } /** * Handle POST requests: handle Templatize action (Create a template from a VM) * */ public void acceptRepresentation(Representation entity) throws ResourceException { String fqn = URICreation.getFQN(orgId, vdcId, vappId, veeId, vmId); log.info("Create Template request recieved for vm: " + fqn); // If the content is XML, process the representation if (entity.getMediaType().equals(MediaType.APPLICATION_XML)) { // Get new TemplateName from the received data. DomRepresentation domR = new DomRepresentation(entity); long taskId; Document doc; try { log.debug("Data recieved [" + domR.getText() + "]"); String templateName=null; doc = domR.getDocument(); NodeList nameNodes = doc.getElementsByTagName("Name"); if (nameNodes.getLength()==1){ templateName= ((Element)nameNodes.item(0)).getTextContent(); } TemplateManagementDriver actualDriver= (TemplateManagementDriver) getContext().getAttributes().get(TemplateManagementApplication.ATTR_PLUGIN_TEMPLATEMANAGEMENT); taskId = actualDriver.takeTemplate(fqn, templateName); } catch (IOException e) { log.error(ERROR_VM_COMMUNICATION + e.getMessage()); getResponse().setStatus(Status.SERVER_ERROR_INTERNAL, e); return; } // Send the response try { DomRepresentation responseXml = new DomRepresentation(MediaType.APPLICATION_XML, TaskManager.getInstance().getTask(taskId).getXmlDescription()); getResponse().setEntity(responseXml); getResponse().setStatus(Status.SUCCESS_OK); log.info("Request succesful"); } catch (IOException e) { getResponse().setStatus(Status.SERVER_ERROR_INTERNAL); log.info("Error creating the Task document to return"); } } else { getResponse().setStatus(Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE, ExceptionMessages.ERROR_BAD_MEDIA_TYPE); } } }