package com.telefonica.claudia.slm.paas.vmiHandler; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.xml.bind.Binder; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.parsers.ParserConfigurationException; import org.apache.log4j.Logger; import org.dmtf.schemas.ovf.envelope._1.EnvelopeType; import org.restlet.Client; import org.restlet.data.MediaType; import org.restlet.data.Protocol; import org.restlet.data.Response; import org.restlet.resource.DomRepresentation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import com.abiquo.ovf.exceptions.XMLException; import com.abiquo.ovf.xml.OVFSerializer; import com.telefonica.claudia.slm.vmiHandler.exceptions.AccessDeniedException; import com.telefonica.claudia.slm.vmiHandler.exceptions.CommunicationErrorException; import com.telefonica.schemas.nuba_model.exp.CIMUserEntityType; public class PlacementModuleClient { private static final long POLLING_INTERVAL = 15000; private Client client; private String serverURL; private static Logger logger = Logger.getLogger(PlacementModuleClient.class); public PlacementModuleClient (String url) { logger.info("PlacementModuleClient Url " + url); if (url.charAt(url.length()-1) == '/') serverURL = url.substring(0, url.length()-1); else serverURL = url; client = new Client(Protocol.HTTP); } public String bestOVFProvider(String filename) throws JAXBException, AccessDeniedException, CommunicationErrorException, XMLException, IOException{ String url = serverURL+ "/api/org/1/vdc/1/action/providermapping"; logger.info("Url operation " + url); url = "http://109.231.81.30:8892/placement/api/org/1/vdc/1/action/ovfprovidermapping"; /* Reader reader = new BufferedReader(new InputStreamReader( getClass().getClassLoader().getResourceAsStream( filename))); JAXBContext context = JAXBContext.newInstance(EnvelopeType.class); Unmarshaller unmarshaller = context.createUnmarshaller(); JAXBElement<EnvelopeType> obj = (JAXBElement<EnvelopeType>) unmarshaller.unmarshal( reader ); com.sun.jersey.api.client.Client c = com.sun.jersey.api.client.Client.create(); WebResource r = c.resource(filename); CIMUserEntityType response = r.accept(javax.ws.rs.core.MediaType.APPLICATION_XML_TYPE). type(javax.ws.rs.core.MediaType.APPLICATION_XML_TYPE). post(CIMUserEntityType.class, obj); System.out.println("response testOVFProviderMappingJersey ->" + response); System.out.println("Response id:"+response.getId()); System.out.println("Response URL:"+response.getURLDRP());*/ return sendingOperation (filename, url); } public String sendingOperation(String filename, String url) throws JAXBException, AccessDeniedException, CommunicationErrorException, XMLException, IOException{ File xmlFile = new File(filename); OVFSerializer ovfSerializer = OVFSerializer.getInstance(); ovfSerializer.setValidateXML(false); EnvelopeType envelope = ovfSerializer.readXMLEnvelope(new FileInputStream( xmlFile)); DomRepresentation data; try { Document doc = OVFSerializer.getInstance().bindToDocument(envelope, false); Element root = doc.getDocumentElement(); String s = root.toString(); System.out.println (s); data = new DomRepresentation(MediaType.APPLICATION_XML,doc); } catch (ParserConfigurationException e) { logger.error("Error creating parser: " + e.getMessage()); return null; } Response response = client.post(url, data); // Depending on the response code, return with an error, or wait for a response System.out.println ("Response " + response.getStatus().getCode()); switch (response.getStatus().getCode()) { case 401: // Unauthorized case 403: // Forbidden // Throw an Access Denied Exception logger.error("Not enough privileges to access the VM information."); throw new AccessDeniedException(response.getStatus().getDescription(), null, null); case 400: // Bad Request case 404: // Not found logger.error("The resource was not found on the server; the tcloud server may be misconfigured, or the URL may be wrong."); throw new CommunicationErrorException(response.getStatus().getDescription(), new Exception(response.getStatus().getName())); case 501: case 500: logger.error("Internal error in the VEEM tcloud server: " + response.getStatus().getDescription()); throw new CommunicationErrorException(response.getStatus().getDescription(), new Exception(response.getStatus().getName())); case 202: case 201: case 200: case 204: logger.info("Operation suceesfully done."); DomRepresentation dataresponse = response.getEntityAsDom(); JAXBContext contextEnvelope = JAXBContext.newInstance(CIMUserEntityType.class); Binder<Node> binder = contextEnvelope.createBinder(); JAXBElement<CIMUserEntityType> jaxb = binder.unmarshal(dataresponse.getDocument(), CIMUserEntityType.class); CIMUserEntityType provider = jaxb.getValue(); System.out.println("response testOVFProviderMappingJersey ->" + response); System.out.println("Response id:"+provider.getId()); System.out.println("Response URL:"+provider.getURLDRP()); return provider.getURLDRP(); } return null; } }