用JAVA控制ESXi虚拟机
免费版的VMWare ESXi 从v3.5 u3开始,禁止了SDK和vCli的“写”调用。也就是说,从ESXi 3.5u3开始,我们不能用SDK或者vCLI命令行,控制免费版ESXi上运行的虚拟机了,不能对其进行重起,关机等任何“写”操作。
后来无意中在网上发现了一个叫esxi-control.pl的脚本,可以用来控制免费版ESXi上的虚拟机,地址如下
http://blog.peacon.co.uk/esxi-control-pl-script-vm-actions-on-free-licensed-esxi/
脚本是用Perl写的,通过模拟vSphere Client发出的SOAP消息来控制ESXi.但是这个Perl脚本 仍然需要调用Perl-vCLI去获得虚拟机的id信息。我想既然能够模拟SOAP的控制消息,那也一定能模拟读取虚拟机信息的消息啊,但是平时用Perl很少,所以干脆就用JAVA写了一个实现。
先说说程序的原理,
程序调用Apache的httpclient来完成SOAP消息的发送与接受。
第一步,发送下列SOAP消息来建立连接与身份认证,$USERNAME$和$PASSWORD$为ESXi主机的登陆用户名和密码
[*]<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
[*]<soap:Body>
[*]<Login xmlns="urn:internalvim25">
[*]<_this xsi:type="SessionManager"type="SessionManager"serverGuid="">ha-sessionmgr</_this>
[*]<userName>$USERNAME$</userName>
[*]<password>$PASSWORD$</password>
[*]<locale>en_US</locale>
[*]</Login>
[*]</soap:Body>
[*]</soap:Envelope>
第二步,获取当前已连接主机上的虚拟机列表,SOAP消息如下
[*]<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
[*]<soapenv:Body>
[*]<RetrieveProperties xmlns="urn:vim25">
[*]<_this type="PropertyCollector">ha-property-collector</_this>
[*]<specSet>
[*]<propSet>
[*]<type>HostSystem</type>
[*]<all>0</all>
[*]<pathSet>vm</pathSet>
[*]</propSet>
[*]<objectSet>
[*]<obj type="HostSystem">ha-host</obj>
[*]</objectSet>
[*]</specSet>
[*]</RetrieveProperties>
[*]</soapenv:Body>
[*]</soapenv:Envelope>
第三步,第二步返回的消息里面只有虚拟机的ID,但是用户一般是不知道虚拟机的ID是干啥的,所以,我们需要虚拟机的名称等其它信息,所以发送下面的消息用来获取虚拟机其它的信息,包括虚拟机的名称,虚拟机的网络名称,IP地址,开关机状态以及VMWareTool的运行情况。
其中的$VMID$就是要获取具体信息的虚拟机ID
可以有多个<objectSet>,用来一次性获取多台虚拟机的信息
[*]<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
[*]<soapenv:Body>
[*]<RetrieveProperties xmlns="urn:vim25">
[*]<_this type="PropertyCollector">ha-property-collector</_this>
[*]<specSet>
[*]<propSet>
[*]<type>VirtualMachine</type>
[*]<all>0</all>
[*]<pathSet>name</pathSet>
[*]<pathSet>guest.hostName</pathSet>
[*]<pathSet>runtime.powerState</pathSet>
[*]<pathSet>guest.ipAddress</pathSet>
[*]<pathSet>guest.toolsRunningStatus</pathSet>
[*]</propSet>
[*]<objectSet>
[*]<obj type="VirtualMachine">$VM1ID$</obj>
[*]</objectSet>
[*]<objectSet>
[*]<obj type="VirtualMachine">$VM2ID$</obj>
[*]</objectSet>
[*]</specSet>
[*]</RetrieveProperties>
[*]</soapenv:Body>
[*]</soapenv:Envelope>
第四步,到这里,我们的准备工作就结束了,可以发送SOAP的控制消息,控制虚拟机的开关机/重起等操作了,这部分SOAP消息esxi-control.pl做得比较深入,值得借鉴。
这里只举一个重起虚拟机的SOAP消息做例子, $VMID$就是要被重起的虚拟机的ID
[*]<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
[*]<soap:Body>
[*]<ResetVM_Task xmlns="urn:internalvim25">
[*]<_this xsi:type="VirtualMachine"type="VirtualMachine"serverGuid="">$VMID$</_this>
[*]</ResetVM_Task>
[*]</soap:Body>
[*]</soap:Envelope>
第五步,断开连接
[*]<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
[*]<soap:Body>
[*]<Logout xmlns="urn:internalvim25">
[*]<_this xsi:type="ManagedObjectReference"type="SessionManager"serverGuid="">ha-sessionmgr</_this>
[*]</Logout>
[*]</soap:Body>
[*]</soap:Envelope>
JAVA实现代码如下
[*]packagejava_vc;
[*]
[*]/**
[*]*
[*]* @author yyz_tj_cn@sina.com.cn
[*]*/
[*]
[*]importorg.apache.http.Header;
[*]importorg.apache.http.HttpEntity;
[*]importorg.apache.http.HttpResponse;
[*]importorg.apache.http.client.methods.HttpPost;
[*]importorg.apache.http.impl.client.DefaultHttpClient;
[*]importorg.apache.http.util.EntityUtils;
[*]importjavax.net.ssl.SSLContext;
[*]importorg.apache.http.conn.ssl.SSLSocketFactory;
[*]importjavax.net.ssl.TrustManager;
[*]importjavax.net.ssl.X509TrustManager;
[*]importjava.security.cert.X509Certificate;
[*]importjava.security.cert.CertificateException;
[*]importorg.apache.http.conn.scheme.Scheme;
[*]importorg.apache.http.entity.StringEntity;
[*]importorg.apache.http.client.params.ClientPNames;
[*]importorg.apache.http.client.params.CookiePolicy;
[*]importorg.w3c.dom.Document;
[*]importorg.w3c.dom.NodeList;
[*]importjavax.xml.parsers.*;
[*]importjava.util.*;
[*]
[*]
[*]publicclassVmoperation {
[*]
[*]//This Embeded Class is used to store Virtual Machine information
[*]publicclassVminfo {
[*]privateStringid=null;
[*]privateStringname=null;
[*]privateStringnetworkName =null;
[*]privateStringipv4 =null;
[*]privateStringpowerState =null;
[*]privateStringvmToolRunningSattus =null;
[*]
[*]publicVminfo(){
[*]
[*]}
[*]publicStringgetID(){
[*]returnid;
[*]}
[*]publicvoidsetID(Stringval){
[*]id=val.trim();
[*]}
[*]
[*]publicStringgetName(){
[*]returnname;
[*]}
[*]publicvoidsetName(Stringval){
[*]name=val.trim();
[*]}
[*]
[*]publicStringgetNetworkName(){
[*]returnnetworkName;
[*]}
[*]publicvoidsetNetworkName(Stringval){
[*]networkName=val.trim();
[*]}
[*]
[*]publicStringgetIpAddress(){
[*]returnipv4;
[*]}
[*]publicvoidsetIpAddress(Stringval){
[*]ipv4=val.trim();
[*]}
[*]
[*]publicStringgetPowerState(){
[*]returnpowerState;
[*]}
[*]publicvoidsetPowerState(Stringval){
[*]powerState=val.trim();
[*]}
[*]
[*]publicStringgetVMToolRunningSattus(){
[*]returnvmToolRunningSattus;
[*]}
[*]publicvoidsetVMToolRunningSattus(Stringval){
[*]vmToolRunningSattus=val.trim();
[*]}
[*]}
[*]
[*]//Vmoperation Class start...
[*]privatebooleandebug =true;
[*]privatebooleanconnected =false;
[*]privateDefaultHttpClient httpclient =null;
[*]privateTrustManagereasyTrustManager =null;
[*]privateArrayListvmList =null;
[*]privateStringhostURL =null;
[*]privateStringxml_login ="<soap:Envelopexmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" xmlns:soap=/"http://schemas.xmlsoap.org/soap/envelope//"> "+
[*]"<soap:Body>"+
[*]"<Login xmlns=/"urn:internalvim25/">"+
[*]"<_this xsi:type=/"SessionManager/" type=/"SessionManager/" serverGuid=/"/">ha-sessionmgr</_this>"+
[*]"<userName>$USERNAME$</userName>"+
[*]"<password>$PASSWORD$</password>"+
[*]"<locale>en_US</locale>"+
[*]"</Login>"+
[*]"</soap:Body>"+
[*]"</soap:Envelope>";
[*]privateStringxml_logout ="<soap:Envelopexmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" xmlns:soap=/"http://schemas.xmlsoap.org/soap/envelope//">"+
[*]"<soap:Body>"+
[*]"<Logout xmlns=/"urn:internalvim25/">"+
[*]"<_this xsi:type=/"ManagedObjectReference/" type=/"SessionManager/" serverGuid=/"/">ha-sessionmgr</_this>"+
[*]"</Logout>"+
[*]"</soap:Body>"+
[*]"</soap:Envelope>";
[*]privateStringxml_poweroff ="<soap:Envelopexmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" xmlns:soap=/"http://schemas.xmlsoap.org/soap/envelope//">"+
[*]"<soap:Body>"+
[*]"<PowerOffVM_Task xmlns=/"urn:internalvim25/">"+
[*]"<_this xsi:type=/"VirtualMachine/" type=/"VirtualMachine/" serverGuid=/"/">$VMID$</_this>"+
[*]"</PowerOffVM_Task>"+
[*]"</soap:Body>"+
[*]"</soap:Envelope>";
[*]privateStringxml_poweron ="<soap:Envelopexmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" xmlns:soap=/"http://schemas.xmlsoap.org/soap/envelope//">"+
[*]"<soap:Body>"+
[*]"<PowerOnVM_Task xmlns=/"urn:internalvim25/">"+
[*]"<_this xsi:type=/"VirtualMachine/" type=/"VirtualMachine/" serverGuid=/"/">$VMID$</_this>"+
[*]"</PowerOnVM_Task>"+
[*]"</soap:Body>"+
[*]"</soap:Envelope>";
[*]privateStringxml_reset ="<soap:Envelopexmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" xmlns:soap=/"http://schemas.xmlsoap.org/soap/envelope//">"+
[*]"<soap:Body>"+
[*]"<ResetVM_Task xmlns=/"urn:internalvim25/">"+
[*]"<_this xsi:type=/"VirtualMachine/" type=/"VirtualMachine/" serverGuid=/"/">$VMID$</_this>"+
[*]"</ResetVM_Task>"+
[*]"</soap:Body>"+
[*]"</soap:Envelope>";
[*]
[*]privateStringxml_getVMIDs ="<soapenv:Envelopexmlns:soapenv=/"http://schemas.xmlsoap.org/soap/envelope//" xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/">"+
[*]"<soapenv:Body>"+
[*]"<RetrieveProperties xmlns=/"urn:vim25/">"+
[*]"<_this type=/"PropertyCollector/">ha-property-collector</_this>"+
[*]"<specSet>"+
[*]"<propSet>"+
[*]"<type>HostSystem</type>"+
[*]"<all>0</all>"+
[*]"<pathSet>vm</pathSet>"+
[*]"</propSet>"+
[*]"<objectSet>"+
[*]"<obj type=/"HostSystem/">ha-host</obj>"+
[*]"</objectSet>"+
[*]"</specSet>"+
[*]"</RetrieveProperties>"+
[*]"</soapenv:Body>"+
[*]"</soapenv:Envelope>";
[*]
[*]privateStringxml_getVMInfo ="<soapenv:Envelopexmlns:soapenv=/"http://schemas.xmlsoap.org/soap/envelope//" xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/">"+
[*]"<soapenv:Body>"+
[*]"<RetrieveProperties xmlns=/"urn:vim25/">"+
[*]"<_this type=/"PropertyCollector/">ha-property-collector</_this>"+
[*]"<specSet>"+
[*]"<propSet>"+
[*]"<type>VirtualMachine</type>"+
[*]"<all>0</all>"+
[*]"<pathSet>name</pathSet>"+
[*]"<pathSet>guest.hostName</pathSet>"+
[*]"<pathSet>runtime.powerState</pathSet>"+
[*]"<pathSet>guest.ipAddress</pathSet>"+
[*]"<pathSet>guest.toolsRunningStatus</pathSet>"+
[*]"</propSet>"+
[*]"$VMIDLISTOBJ$"+
[*]"</specSet>"+
[*]"</RetrieveProperties>"+
[*]"</soapenv:Body>"+
[*]"</soapenv:Envelope>";
[*]
[*]
[*]//Connect to ESXi Host
[*]publicStringConnect(StringIPAddress,StringUsername,StringPassword)throwsException{
[*]
[*]//Clear previous connection, if any.
[*]if(connected){
[*]Disconnect();
[*]finalCleanup();
[*]}
[*]
[*]debugOutput("Connecting to host "+ip2URL(IPAddress));
[*]//Init new connection
[*]hostURL =ip2URL(IPAddress);
[*]httpclient =newDefaultHttpClient();
[*]//Init a customer X509TrustManager to trust any certificates
[*]easyTrustManager =newX509TrustManager(){
[*]@Override
[*]publicvoidcheckClientTrusted(
[*]X509Certificate[]chain,
[*]StringauthType)throwsCertificateException{
[*]// Oh, I am easy!
[*]}
[*]@Override
[*]publicvoidcheckServerTrusted(
[*]X509Certificate[]chain,
[*]StringauthType)throwsCertificateException{
[*]// Oh, I am easy!
[*]}
[*]@Override
[*]publicX509Certificate[]getAcceptedIssuers(){
[*]returnnull;
[*]}
[*]};
[*]
[*]SSLContextsslcontext=SSLContext.getInstance("TLS");
[*]sslcontext.init(null,newTrustManager[]{easyTrustManager },null);
[*]//Init SSLSocketFactory to accept any hostname and any certificates
[*]SSLSocketFactorysf =newSSLSocketFactory(sslcontext,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
[*]Scheme sch =newScheme("https",443,sf);
[*]httpclient.getConnectionManager().getSchemeRegistry().register(sch);
[*]httpclient.getParams().setParameter(ClientPNames.COOKIE_POLICY,CookiePolicy.BROWSER_COMPATIBILITY);
[*]
[*]//Send Hello Message
[*]xml_login =xml_login.replace("$USERNAME$",Username);
[*]xml_login =xml_login.replace("$PASSWORD$",Password);
[*]HttpResponse result;
[*]result=sendXML(hostURL,xml_login);
[*]if(debug)dispalyHttpResponse(result);elseEntityUtils.consume(result.getEntity());
[*]
[*]//If not HTTP 200 returned, error occured.
[*]if(result.getStatusLine().toString().trim().equals("HTTP/1.1 200 OK"))connected=true;
[*]
[*]//Get Virtual Machine List
[*]if(connected)vmList=getVMList();
[*]
[*]//Return connect result
[*]returnresult.getStatusLine().toString();
[*]}
[*]
[*]//disconnect from ESXi Host
[*]publicStringDisconnect()throwsException{
[*]Stringret =null;
[*]if(debug)System.out.println("Disconnecting from host "+hostURL);
[*]if(connected){
[*]HttpResponse result=null;
[*]result=sendXML(hostURL,xml_logout);
[*]if(debug)dispalyHttpResponse(result);elseEntityUtils.consume(result.getEntity());
[*]//If not HTTP 200 returned, error occured.
[*]if(result.getStatusLine().toString().trim().equals("HTTP/1.1 200 OK")){
[*]finalCleanup();
[*]}
[*]ret =result.getStatusLine().toString();
[*]}
[*]//Return connect result
[*]returnret;
[*]}
[*]
[*]//Display Virtual Machine List on connected ESXi Host
[*]publicvoidDisplayVMList (){
[*]debugOutput("Displaying Virtual Machine List...");
[*]//init Column Width
[*]intwidth1=3,width2=12,width3=12,width4=10,width5=12,width6=21;
[*]
[*]if(vmList !=null){
[*]//Get Col width
[*]for(inti=0;i<vmList.size();i++){
[*]Vminfo VMNode=null;
[*]VMNode=(Vminfo)vmList.get(i);
[*]if(VMNode.getID()!=null)width1 =Math.max(VMNode.getID().length(),width1);
[*]if(VMNode.getName()!=null)width2 =Math.max(VMNode.getName().length(),width2);
[*]if(VMNode.getNetworkName()!=null)width3 =Math.max(VMNode.getNetworkName().length(),width3);
[*]if(VMNode.getIpAddress()!=null)width4 =Math.max(VMNode.getIpAddress().length(),width4);
[*]if(VMNode.getPowerState()!=null)width5 =Math.max(VMNode.getPowerState().length(),width5);
[*]if(VMNode.getVMToolRunningSattus()!=null)width6 =Math.max(VMNode.getVMToolRunningSattus().length(),width6);
[*]}
[*]//Output Result
[*]//Title
[*]Stringtitle ="";
[*]title +=formatData("ID",width1);
[*]title +=formatData("Machine Name",width2);
[*]title +=formatData("Network Name",width3);
[*]title +=formatData("IP Address",width4);
[*]title +=formatData("Power Status",width5);
[*]title +=formatData("VMTool running Status",width6);
[*]title +="/n";
[*]for(inti=0;i<=width1+width2+width3+width4+width5+width6+6;i++){
[*]title +="-";
[*]}
[*]System.out.println(title);
[*]//Data
[*]for(inti=0;i<vmList.size();i++){
[*]Vminfo VMNode=null;
[*]Stringoutput="";
[*]VMNode=(Vminfo)vmList.get(i);
[*]output+=formatData(VMNode.getID(),width1);
[*]output+=formatData(VMNode.getName(),width2);
[*]output+=formatData(VMNode.getNetworkName(),width3);
[*]output+=formatData(VMNode.getIpAddress(),width4);
[*]output+=formatData(VMNode.getPowerState(),width5);
[*]output+=formatData(VMNode.getVMToolRunningSattus(),width6);
[*]System.out.println(output);
[*]}
[*]}
[*]}
[*]
[*]//Power-Off virtual machine on connected ESXi host
[*]publicStringPowerOffVM (StringVMName)throwsException{
[*]Stringret =null;
[*]debugOutput("Powering Off "+VMName);
[*]if(connected){
[*]Stringxmldata =xml_poweroff.replace("$VMID$",getVMId(VMName));
[*]HttpResponse result;
[*]result=sendXML(hostURL,xmldata);
[*]if(debug)dispalyHttpResponse(result);elseEntityUtils.consume(result.getEntity());
[*]ret =result.getStatusLine().toString();
[*]}
[*]//Return result
[*]returnret;
[*]}
[*]
[*]//Power-On virtual machine on connected ESXi host
[*]publicStringPowerOnVM (StringVMName)throwsException{
[*]Stringret =null;
[*]debugOutput("Powering On "+VMName);
[*]if(connected){
[*]Stringxmldata =xml_poweron.replace("$VMID$",getVMId(VMName));
[*]HttpResponse result;
[*]result=sendXML(hostURL,xmldata);
[*]if(debug)dispalyHttpResponse(result);elseEntityUtils.consume(result.getEntity());
[*]ret =result.getStatusLine().toString();
[*]}
[*]//Return result
[*]returnret;
[*]}
[*]
[*]//Reset virtual machine on connected ESXi host
[*]publicStringResetVM (StringVMName)throwsException{
[*]Stringret =null;
[*]debugOutput("Reseting "+VMName);
[*]if(connected){
[*]Stringxmldata =xml_reset.replace("$VMID$",getVMId(VMName));
[*]HttpResponse result;
[*]result=sendXML(hostURL,xmldata);
[*]if(debug)dispalyHttpResponse(result);elseEntityUtils.consume(result.getEntity());
[*]ret =result.getStatusLine().toString();
[*]}
[*]//Return result
[*]returnret;
[*]}
[*]
[*]publicbooleangetConnected(){
[*]returnthis.connected;
[*]}
[*]
[*]privatevoidfinalCleanup(){
[*]if(httpclient!=null)httpclient.getConnectionManager().shutdown();
[*]connected=false;
[*]vmList=null;
[*]httpclient =null;
[*]easyTrustManager =null;
[*]hostURL =null;
[*]}
[*]//Get VMID from given virtual machine name
[*]privateStringgetVMId(StringVMName){
[*]Stringresult=null;
[*]Iteratorit =vmList.iterator();
[*]while(it.hasNext()){
[*]Vminfo VMNode =null;
[*]VMNode =(Vminfo)it.next();
[*]if(VMName.toLowerCase().trim().equals(VMNode.getName().toLowerCase())){
[*]result=VMNode.getID();
[*]break;
[*]}
[*]}
[*]returnresult;
[*]}
[*]//Get All Virtual Machine Information on connected ESXi host
[*]privateArrayListgetVMList()throwsException{
[*]ArrayListresult=newArrayList();
[*]Vminfo VMNode =null;
[*]HttpResponse rspVMList =sendXML(hostURL,genXML_getVMInfo(getVMIDs ()));
[*]//Parse returned XML and store information in vmList
[*]//NEED MORE SMART!!!
[*]
[*]//Returned XML sample
[*]/*
[*]<returnval>
[*]<obj type="VirtualMachine">128</obj>
[*]<propSet><name>guest.hostName</name><val xsi:type="xsd:string">aaa.ccc.bbb</val></propSet>
[*]<propSet><name>guest.ipAddress</name><val xsi:type="xsd:string">aaa.ccc.bbb</val></propSet>
[*]<propSet><name>guest.toolsRunningStatus</name><valxsi:type="xsd:string">guestToolsRunning</val></propSet>
[*]<propSet><name>name</name><val xsi:type="xsd:string">aaa.ccc.bbb</val></propSet>
[*]<propSet><name>runtime.powerState</name><valxsi:type="VirtualMachinePowerState">poweredOn</val></propSet>
[*]</returnval>
[*]
[*]
[*]<returnval>
[*]<obj type="VirtualMachine">240</obj>
[*]<propSet><name>guest.toolsRunningStatus</name><valxsi:type="xsd:string">guestToolsNotRunning</val></propSet>
[*]<propSet><name>name</name><val xsi:type="xsd:string">vSphere Management Assistant (vMA)</val></propSet>
[*]<propSet><name>runtime.powerState</name><valxsi:type="VirtualMachinePowerState">poweredOff</val></propSet>
[*]</returnval>
[*]*
[*]*
[*]*/
[*]DocumentBuilderFactorydbf =DocumentBuilderFactory.newInstance();
[*]DocumentBuilderdb =dbf.newDocumentBuilder();
[*]Documentdoc=db.parse(rspVMList.getEntity().getContent());
[*]NodeListnl1 =doc.getElementsByTagName("returnval");
[*]//<returnval>
[*]for(inti=0;i<nl1.getLength();i++){
[*]if(nl1.item(i).hasChildNodes()){
[*]VMNode =newVminfo();
[*]NodeListnl2 =nl1.item(i).getChildNodes();
[*]//<obj>&<proSet>
[*]for(intj=0;j<nl2.getLength();j++){
[*]if(nl2.item(j).getNodeName().trim().equals("obj")){
[*]VMNode.setID(nl2.item(j).getTextContent());
[*]}
[*]else{
[*]if(nl2.item(j).hasChildNodes()){
[*]NodeListnl3 =nl2.item(j).getChildNodes();
[*]//<proset>
[*]//There are 2 childnodes in <proset>, one is for value name, another is value, it's a pair. so k+=2
[*]for(intk=0;k<nl3.getLength();k+=2){
[*]if(nl3.item(k).getTextContent().trim().toLowerCase().equals("name")&&nl3.item(k+1).getNodeName().trim().toLowerCase().equals("val")){
[*]VMNode.setName(nl3.item(k+1).getTextContent());
[*]}elseif(nl3.item(k).getTextContent().trim().toLowerCase().equals("guest.hostname")&&nl3.item(k+1).getNodeName().trim().toLowerCase().equals("val")){
[*]VMNode.setNetworkName(nl3.item(k+1).getTextContent());
[*]}elseif(nl3.item(k).getTextContent().trim().toLowerCase().equals("runtime.powerstate")&&nl3.item(k+1).getNodeName().trim().toLowerCase().equals("val")){
[*]VMNode.setPowerState(nl3.item(k+1).getTextContent());
[*]}elseif(nl3.item(k).getTextContent().trim().toLowerCase().equals("guest.toolsrunningstatus")&&nl3.item(k+1).getNodeName().trim().toLowerCase().equals("val")){
[*]VMNode.setVMToolRunningSattus(nl3.item(k+1).getTextContent());
[*]}elseif(nl3.item(k).getTextContent().trim().toLowerCase().equals("guest.ipaddress")&&nl3.item(k+1).getNodeName().trim().toLowerCase().equals("val")){
[*]VMNode.setIpAddress(nl3.item(k+1).getTextContent());
[*]}
[*]}
[*]}
[*]}
[*]}
[*]result.add(VMNode);
[*]debugOutput ("1 VM Added. VMID="+VMNode.getID()+" VMName="+VMNode.getName()+" VMNetworkName="+VMNode.getNetworkName()+" VMIP="+VMNode.getIpAddress()+" VMPower="+VMNode.getPowerState()+" ToolStatus="+VMNode.getVMToolRunningSattus());
[*]}
[*]}
[*]returnresult;
[*]}
[*]
[*]privatevoiddebugOutput (Stringmsg){
[*]if(debug)System.out.println("/n<DEBUG TYPE=MSG>/n"+msg+"/n</DEBUG>");
[*]}
[*]//Get VMID list on a connected ESXi
[*]privateString[]getVMIDs ()throwsException{
[*]String[]result=null;
[*]//Sent xml to host to get VM ID list
[*]HttpResponse rspVMIDList =sendXML(hostURL,xml_getVMIDs);
[*]//Parse returned XML
[*]DocumentBuilderFactorydbf =DocumentBuilderFactory.newInstance();
[*]DocumentBuilderdb =dbf.newDocumentBuilder();
[*]Documentdoc=db.parse(rspVMIDList.getEntity().getContent());
[*]NodeListnl1 =doc.getElementsByTagName("ManagedObjectReference");
[*]//init the return value array
[*]result=newString[nl1.getLength()];
[*]//set return array
[*]for(inti=0;i<nl1.getLength();i++){
[*]//make sure the ID is for Virtual Machine
[*]if(nl1.item(i).hasChildNodes()&&
[*]nl1.item(i).getAttributes().getNamedItem("type").toString().trim().equals("type=/"VirtualMachine/"")){
[*]result[i]=nl1.item(i).getFirstChild().getNodeValue().toString().trim();
[*]debugOutput("VMID="+result[i]);
[*]}
[*]}
[*]returnresult;
[*]}
[*]privateStringgenXML_getVMInfo(String[]vmIDList){
[*]Stringresult;
[*]Stringtmpxml="";
[*]for(inti=0;i<vmIDList.length;i++){
[*]tmpxml +="<objectSet><obj type=/"VirtualMachine/">"+vmIDList[i]+"</obj></objectSet>";
[*]}
[*]result=xml_getVMInfo.replace("$VMIDLISTOBJ$",tmpxml);
[*]debugOutput(result);
[*]returnresult;
[*]}
[*]privatevoiddispalyHttpResponse (HttpResponse rsp)throwsException{
[*]HttpEntity entity=rsp.getEntity();
[*]System.out.println("********************<HTTP Response>********************");
[*]System.out.println("----------------------<HEADERS>------------------------");
[*]System.out.println(rsp.getStatusLine());
[*]Header[]headers =rsp.getAllHeaders();
[*]for(inti =0;i <headers.length;i++){
[*]System.out.println(headers[i]);
[*]}
[*]System.out.println("-----------------------<BODYS>-------------------------");
[*]if(entity!=null){
[*]System.out.println(EntityUtils.toString(entity));
[*]}
[*]System.out.println("************************<END>*************************");
[*]System.out.println();
[*]System.out.println();
[*]}
[*]privateHttpResponse sendXML(StringURL,Stringxml)throwsException{
[*]HttpPost httppost =newHttpPost(URL);
[*]StringEntity myEntity =newStringEntity(xml);
[*]httppost.addHeader("Content-Type","text/xml; charset=/"utf-8/"");
[*]httppost.addHeader("User-Agent","VMware VI Client/4.1.0");
[*]httppost.addHeader("SOAPAction","/"urn:internalvim25/4.0/"");
[*]httppost.setEntity(myEntity);
[*]if(debug)System.out.println("executing request to "+httppost);
[*]HttpResponse rsp =httpclient.execute(httppost);
[*]returnrsp;
[*]}
[*]privateStringip2URL (StringIPAddress){
[*]return"HTTPS://"+IPAddress+"/sdk/";
[*]}
[*]privateStringformatData (Stringdata,intwidth){
[*]Stringresult;
[*]
[*]if(data!=null){
[*]result=data;
[*]}else{
[*]result="N/A";
[*]}
[*]//Append space
[*]for(inti=result.length();i<=width;i++){
[*]result+=" ";
[*]}
[*]returnresult;
[*]}
[*]
[*]publicstaticvoidmain(String[]args)throwsException{
[*]
[*]Vmoperation temp =newVmoperation();
[*]
[*]
[*]System.out.println(temp.Connect("<Your ESXi IP>","<Username>","<Password>"));
[*]System.in.read();
[*]System.out.println(temp.PowerOffVM("New Virtual Machine"));
[*]System.in.read();
[*]temp.DisplayVMList();
[*]System.in.read();
[*]System.out.println(temp.PowerOnVM("New Virtual Machine"));
[*]System.in.read();
[*]System.out.println(temp.ResetVM("New Virtual Machine"));
[*]System.in.read();
[*]System.out.println(temp.Disconnect());
[*]
[*]}
[*]}
注:以上仅用于学术研究,禁止用于实际生产环境。否则将导致违反VMWare License Agreement. VMWare可能随时改变XML的定义,导致程序不能正常工作。
页:
[1]