From dea492719ee88e006f60d98b80c6cc7acbd73851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Constantino=20V=C3=A1zquez=20Blanco?= Date: Thu, 2 Apr 2009 18:07:56 +0000 Subject: [PATCH] [VMWare] Initial commit of Transfer Manager git-svn-id: http://svn.opennebula.org/one/trunk@451 3034c82b-c49b-4eb3-8279-a7acafdc01c0 --- src/tm_mad/vmware/TMClone.java | 324 +++++++++++++++++++++++++++++++++ src/tm_mad/vmware/tm_clone.sh | 62 +++++++ src/tm_mad/vmware/tm_vmwarerc | 25 +++ 3 files changed, 411 insertions(+) create mode 100644 src/tm_mad/vmware/TMClone.java create mode 100644 src/tm_mad/vmware/tm_clone.sh create mode 100644 src/tm_mad/vmware/tm_vmwarerc diff --git a/src/tm_mad/vmware/TMClone.java b/src/tm_mad/vmware/TMClone.java new file mode 100644 index 0000000000..35b8826b50 --- /dev/null +++ b/src/tm_mad/vmware/TMClone.java @@ -0,0 +1,324 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2009, Distributed Systems Architecture Group, Universidad */ +/* Complutense de Madrid (dsa-research.org) */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ +/* not use this file except in compliance with the License. You may obtain */ +/* a copy of the License at */ +/* */ +/* 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. */ +/* -------------------------------------------------------------------------- */ + + +import com.vmware.vim.*; +import com.vmware.apputils.*; +import com.vmware.apputils.vim.*; + +import java.util.*; +import java.net.*; +import java.io.*; +import javax.net.ssl.*; + +import org.w3c.dom.Document; +import org.w3c.dom.*; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.DocumentBuilder; + + +/* + * Used to stage VMs in the ESXi Server + * Accepts a Source and Destination, of the form + * machineSource:path_to_source machineDest:path_to_dest + * although the path to dest will be used to extract the one-id + * and files stored in datastore/one-id + */ + +public class TMClone +{ + // TODO set oneID from remotepath + private String oneID = ""; + //private ArrayList diskNames = new ArrayList(); + + // Helpers from VI samples + private static ServiceContent content; + private static AppUtil cb = null; + private static VimPortType service; + + private String datastore = ""; + private String datacenter = ""; + + private String pathToVm = ""; + + /* Copies a VM from local FS to ESXi + * @param pathToVm localpath of the VM + */ + private void copyVM() throws Exception + { + String [] listOfVMFiles = getDirFiles(pathToVm); + + for(int i=0; i 0) + { + out.write(buf, 0, len); + } + conn.getResponseMessage(); + conn.disconnect(); + out.close(); + } + + /* Returns list of files available on a folder + * @param localDir local path containing files to be listed + * @return list of files or null if none + */ + private String [] getDirFiles(String localDir) throws Exception + { + File temp = new File(localDir); + String [] listOfFiles = temp.list(); + + if(listOfFiles != null) + { + return listOfFiles; + } + else + { + return null; + } + } + + /* + * Gets http connection to ESXi server + * @param urlString contact point to the ESXi server + * @returns http connection to ESXi server + */ + private HttpURLConnection getConnection(String urlString) throws Exception + { + String cookieString = getCookie(); + trustAllHttpsCertificates(); + + HostnameVerifier hv = new HostnameVerifier() + { + public boolean verify(String urlHostName, SSLSession session) + { + return true; + } + }; + + HttpsURLConnection.setDefaultHostnameVerifier(hv); + URL url = new URL(urlString); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setDoOutput(true); + + conn.setRequestProperty( + org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE, + cookieString); + + conn.setRequestProperty( + org.apache.axis.transport.http.HTTPConstants.HEADER_CONTENT_TYPE, + "application/octet-stream"); + + conn.setRequestProperty( + org.apache.axis.transport.http.HTTPConstants.HEADER_EXPECT, + "100-continue"); + conn.setRequestMethod("PUT"); + return conn; + } + + private static void trustAllHttpsCertificates() throws Exception + { + javax.net.ssl.TrustManager[] trustAllCerts = + new javax.net.ssl.TrustManager[1]; + javax.net.ssl.TrustManager tm = new myTMan(); + trustAllCerts[0] = tm; + javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL"); + sc.init(null, trustAllCerts, null); + javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + + + /* + * Get ESXi cookie + * @return string ESXi cookie + */ + private String getCookie() throws Exception + { + com.vmware.vim.VimPortType test = cb.getConnection().getService(); + org.apache.axis.client.Stub st = (org.apache.axis.client.Stub)test; + org.apache.axis.client.Call callObj = st._getCall(); + org.apache.axis.MessageContext msgContext = callObj.getMessageContext(); + String cookieString + = (String)msgContext.getProperty( + org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE); + return cookieString; + } + + + + TMClone(String source, String destiny) throws Exception + { + String[] connectionArgs = new String[6]; + + String hostName = destiny.substring(0,destiny.indexOf(":")); + pathToVm = source.substring(source.indexOf(":")+1, + source.length()); + oneID = destiny.substring(destiny.indexOf(":")+1, + destiny.length()); + oneID = oneID.substring(0,oneID.lastIndexOf("/") ); + oneID = oneID.substring(0,oneID.lastIndexOf("/") ); + oneID = oneID.substring(oneID.lastIndexOf("/")+1 ); + + connectionArgs[0]="--url"; + connectionArgs[1]="https://" + hostName + ":8008/sdk"; + connectionArgs[2]="--username"; + connectionArgs[3]= System.getProperty("username"); + connectionArgs[4]="--password"; + connectionArgs[5]= System.getProperty("password"); + + cb = AppUtil.initialize("TMClone", null, connectionArgs); + cb.connect(); + + // Todo change hardcoding + ManagedObjectReference hostMor = + cb.getServiceUtil().getDecendentMoRef(null, + "HostSystem", + "ursa09.localdomain"); + + // TODO make this dymamic. + datacenter = "ha-datacenter"; + + datastore = "datastore1"; + + com.vmware.apputils.vim.ServiceConnection sc = cb.getConnection(); + content = sc.getServiceContent(); + service = sc.getService(); + } + + protected void finalize() throws Throwable + { + cb.disConnect(); + } + + public static void main(String[] args) + { + boolean success = true; + + // first, make redirection + + PrintStream stdout = System.out; + PrintStream stderr = System.err; + + System.setOut(stderr); + System.setErr(stdout); + + if(args.length!=2) + { + success = false; + } + else + { + try + { + TMClone tmc = new TMClone(args[0],args[1]); + tmc.copyVM(); + } + catch(Exception e) + { + e.printStackTrace(); + success = false; + } + } + + if (success) + { + System.exit(0); + } + else + { + System.exit(-1); + } + } + + + public static class myTMan implements javax.net.ssl.TrustManager, + javax.net.ssl.X509TrustManager + { + public java.security.cert.X509Certificate[] getAcceptedIssuers() + { + return null; + } + public boolean isServerTrusted( + java.security.cert.X509Certificate[] certs) + { + return true; + } + public boolean isClientTrusted( + java.security.cert.X509Certificate[] certs) + { + return true; + } + public void checkServerTrusted( + java.security.cert.X509Certificate[] certs, String authType) + throws java.security.cert.CertificateException + { + return; + } + public void checkClientTrusted( + java.security.cert.X509Certificate[] certs, String authType) + throws java.security.cert.CertificateException + { + return; + } + } +} \ No newline at end of file diff --git a/src/tm_mad/vmware/tm_clone.sh b/src/tm_mad/vmware/tm_clone.sh new file mode 100644 index 0000000000..cdaf747e64 --- /dev/null +++ b/src/tm_mad/vmware/tm_clone.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +# -------------------------------------------------------------------------- # +# Copyright 2002-2009, Distributed Systems Architecture Group, Universidad # +# Complutense de Madrid (dsa-research.org) # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); you may # +# not use this file except in compliance with the License. You may obtain # +# a copy of the License at # +# # +# 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. # +#--------------------------------------------------------------------------- # + + +#Setup driver variables +DRIVER_NAME="tm_vmware" + +if [ -z "${ONE_LOCATION}" ]; then + DRIVERRC=/etc/one/${DRIVER_NAME}/${DRIVER_NAME}rc + TMCOMMON=/usr/lib/one/mads/tm_common.sh +else + DRIVERRC=$ONE_LOCATION/etc/${DRIVER_NAME}/${DRIVER_NAME}rc + TMCOMMON=$ONE_LOCATION/lib/mads/tm_common.sh +fi + +. $TMCOMMON + +# Export the im_mad specific rc + +export_rc_vars $DRIVERRC + +echo $VMWARE_TRUSTORE + +LOG_FILE=$DRIVER_NAME + +MAD_FILE="TMClone" + +if [ -z "${ONE_LOCATION}" ]; then + MAD_LOG_PATH=/var/log/one/$LOG_FILE.log +else + MAD_LOG_PATH=$ONE_LOCATION/var/$LOG_FILE.log +fi + +# Execute the actual MAD +if [ -n "${ONE_MAD_DEBUG}" ]; then + exec_and_log "exec nice -n $PRIORITY java -cp .:$CLASSPATH \ + -Djavax.net.ssl.trustStore=$VMWARE_TRUSTORE -Dusername=$USERNAME \ + -Dpassword=$PASSWORD -Xmx1024M $MAD_FILE $*" +else + exec nice -n $PRIORITY java -cp .:$CLASSPATH \ + -Djavax.net.ssl.trustStore=$VMWARE_TRUSTORE -Dusername=$USERNAME \ + -Dpassword=$PASSWORD -Xmx1024M $MAD_FILE $* 2> /dev/null +fi + + + diff --git a/src/tm_mad/vmware/tm_vmwarerc b/src/tm_mad/vmware/tm_vmwarerc new file mode 100644 index 0000000000..38bee07952 --- /dev/null +++ b/src/tm_mad/vmware/tm_vmwarerc @@ -0,0 +1,25 @@ +# -------------------------------------------------------------------------- # +# Copyright 2002-2009, Distributed Systems Architecture Group, Universidad # +# Complutense de Madrid (dsa-research.org) # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); you may # +# not use this file except in compliance with the License. You may obtain # +# a copy of the License at # +# # +# 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. # +#--------------------------------------------------------------------------- # + +#VMWARE_TRUSTORE= + +# Uncomment the following line to active MAD debug +#ONE_MAD_DEBUG=1 + +VMWARE_TRUSTORE=/home/tinova/.vmware-certs/vmware.keystore +USERNAME=root +PASSWORD=pantufla \ No newline at end of file