刚开始这方面开发的时候,不知道如何下手,能够查到的资料特别少,而且看到很多网友和我一样也在找这方面的资料。接下来的一段时间我就结合自己所参与的项目,完成关于Vmware Vsphere WebService SDK开发的一系列教程(java),分享自己在Vmware开发过程中学习到的知识,希望能和大家一起进步。

今天先和大家学习下一些基本知识,我参考官方6.0英文文档,SDK版本:VMware-vSphere-SDK-6.0.0-2561048。

Managed Object: 代表服务端对象,在vSphere server(ESX/ESXi 或 vCenter Server system)上,代表着vSphere的服务和组件,都直接或间接继承自 ManagedEntity 抽象类。

Managed Object refereneces:代表客户端对服务端对象的引用,客户端应用程序通过使用ManagedObjectReference objects来向服务器发送请求操作。

Data objects:包含着关于managed objects的信息,你的客户端通过发送data objects和接收data objects与服务端进行通信(通过键值对的形式)。

图示为三者之间的关系:

接下来贴上认证、连接、断开vcenter server的代码(java):这个代码在官方的例子中也有,直接拿过来用替换掉里面的url、username、password即可,代码可以直接运行。

 import java.util.ArrayList;
import java.util.List;
import java.util.Map; import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.soap.SOAPFaultException; import com.vmware.vim25.ManagedObjectReference;
import com.vmware.vim25.ObjectContent;
import com.vmware.vim25.PropertyFilterSpec;
import com.vmware.vim25.RetrieveOptions;
import com.vmware.vim25.RetrieveResult;
import com.vmware.vim25.ServiceContent;
import com.vmware.vim25.VimPortType;
import com.vmware.vim25.VimService; /**
* @author Di
* @功能描述 服务器的连接、认证、断开
* @date 创建时间:2016年12月8日 下午3:37:18
* @version 1.0
*/
public class MoniterWsInterface
{
private static String url = "";
private static String userName = "";
private static String password = ""; private static final ManagedObjectReference SVC_INST_REF = new ManagedObjectReference();
public static VimService vimService;
public static VimPortType vimPort; public static ServiceContent serviceContent;
private static final String SVC_INST_NAME = "ServiceInstance";
private static Boolean isConnected = false;
public static ManagedObjectReference perfManager;
public static ManagedObjectReference propCollectorRef; private static class TrustAllTrustManager 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;
}
} private static void trustAllHttpsCertificates() throws Exception
{
javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
javax.net.ssl.TrustManager tm = new TrustAllTrustManager();
trustAllCerts[0] = tm;
javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");
javax.net.ssl.SSLSessionContext sslsc = sc.getServerSessionContext();
sslsc.setSessionTimeout(0);
sc.init(null, trustAllCerts, null);
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} /**
* @功能描述 连接认证
*/
public static void connect() throws Exception
{
HostnameVerifier hv = new HostnameVerifier()
{
public boolean verify(String urlHostName, SSLSession session)
{
return true;
}
};
trustAllHttpsCertificates(); HttpsURLConnection.setDefaultHostnameVerifier(hv); SVC_INST_REF.setType(SVC_INST_NAME);
SVC_INST_REF.setValue(SVC_INST_NAME); vimService = new VimService();
vimPort = vimService.getVimPort();
Map<String, Object> ctxt = ((BindingProvider) vimPort).getRequestContext(); ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
ctxt.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true); serviceContent = vimPort.retrieveServiceContent(SVC_INST_REF);
vimPort.login(serviceContent.getSessionManager(), userName, password, null);
isConnected = true; perfManager = serviceContent.getPerfManager();
propCollectorRef = serviceContent.getPropertyCollector(); System.out.println(serviceContent.getAbout().getFullName());
System.out.println("Server type is " + serviceContent.getAbout().getApiType());
} /**
* @功能描述 断开连接
* @return
* @throws Exception
*/
public static void disconnect() throws Exception
{
if (isConnected)
{
vimPort.logout(serviceContent.getSessionManager());
}
isConnected = false;
} /**
* @功能描述 打印错误信息
* @param
* @param sfe
*/
public static void printSoapFaultException(SOAPFaultException sfe)
{
System.out.println("Soap fault: ");
if (sfe.getFault().hasDetail())
{
System.out.println(sfe.getFault().getDetail().getFirstChild().getLocalName());
}
if (sfe.getFault().getFaultString() != null)
{
System.out.println("Message: " + sfe.getFault().getFaultString());
}
} /**
* @功能描述 根据属性检索要查询的对象信息
* @param listpfs 属性过滤器集合
* @throws Exception
*/
public static List<ObjectContent> retrievePropertiesAllObjects(List<PropertyFilterSpec> listpfs) throws Exception
{
RetrieveOptions propObjectRetrieveOpts = new RetrieveOptions();
List<ObjectContent> listobjcontent = new ArrayList<ObjectContent>();
try
{
RetrieveResult rslts = vimPort.retrievePropertiesEx(propCollectorRef, listpfs, propObjectRetrieveOpts);
if (rslts != null && rslts.getObjects() != null && !rslts.getObjects().isEmpty())
{
listobjcontent.addAll(rslts.getObjects());
}
String token = null;
if (rslts != null && rslts.getToken() != null)
{
token = rslts.getToken();
}
while (token != null && !token.isEmpty())
{
rslts = vimPort.continueRetrievePropertiesEx(propCollectorRef, token);
token = null;
if (rslts != null)
{
token = rslts.getToken();
if (rslts.getObjects() != null && !rslts.getObjects().isEmpty())
{
listobjcontent.addAll(rslts.getObjects());
}
}
}
}
catch (SOAPFaultException sfe)
{
printSoapFaultException(sfe);
}
catch (Exception e)
{
e.printStackTrace();
} return listobjcontent;
} /**
* @see main测试方法
* */
public static void main(String[] args)
{
new MoniterWsInterface();
try
{
connect();
}
catch (SOAPFaultException sfe)
{
printSoapFaultException(sfe);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
disconnect();
}
catch (SOAPFaultException sfe)
{
printSoapFaultException(sfe);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}

现在我们对Vcenter中涉及的三种数据类型有了一定的认识,接下来学习重要的清单遍历知识。

清单层次和servicetInstance:

Serviceinstance:Serviceinstance是清单根对象,从这里开始访问清单的各个层次,通常一个serviceinstance会绑定一个session,当开启session时,vsphere会创建一个具有rootFolder,和四个不同类型Folder的serviceInstance。

rootFolder:清单遍历根目录。

Datacenter:rootFolder下就是数据中心,数据中心可以创建多个,一个session会自带一个。

hostFolder(左一):包含ComputeResource(计算资源)的目录,ComputeResource下还有HostSystem(主机)、ResourcePool(资源池)对象,如果想获取计算资源、主机、资源池、集群的对象及其信息,就需要通过此条路径遍历获取。

vmFolder(左二):包含VirtualMachine(虚拟机)、VirtualApp(虚拟应用),如果想获取虚拟机对象或虚拟机相关信息,就需要通过此遍历层次遍历获取。

networkFolder(右二):包含Network(网络),此条遍历路径便是获取Network的。

datastoreFolder(右一):包含Datastore(数据存储),通过此遍历路径获取和数据存储相关的所有信息。

                        图一

访问具体清单元素的遍历路径:

从清单的根元素ServiceInstance开始,通过带有(Property collector)属性收集器的TraversalSpec和对象的属性确定对象在清单中的位置。

ServiceInstance具有content的属性:content属性是ServiceContent对象,serviceContent中包含很多重要的属性和服务的引用。

ServiceContent具有rootFolder属性:属性是rootFolder。

rootFolder有childEntity属性:属性指向的对象便是Datacenter(数据中心)。

Datacenter用于四个不同的Folder属性:分别指向四个不同的Folder对象,hostFolder、vmFolder、networkFolder、datastoreFolder(参照图一)。

每一个Folder对应childEntity属性:hostFolder对应ComputeResource等,vmFolder对象VirtualMachine等,networkFolder对应NetWork,datastoreFolder对应DataStore等。(可参考图一)

前面讲了这么多清单遍历的知识,接下来就和大家演示下如何获取Datacenter对象及其属性,代码可以直接运行。

 import java.util.ArrayList;
import java.util.List; import javax.xml.ws.soap.SOAPFaultException; import com.vmware.vim25.DynamicProperty;
import com.vmware.vim25.ManagedObjectReference;
import com.vmware.vim25.ObjectContent;
import com.vmware.vim25.ObjectSpec;
import com.vmware.vim25.PropertyFilterSpec;
import com.vmware.vim25.PropertySpec;
import com.vmware.vim25.SelectionSpec;
import com.vmware.vim25.TraversalSpec; /**
* @author Di
* @see 获取数据中心对象引用及name属性
* @date 创建时间:2016年12月8日 下午4:01:33
* @version 1.0
*/
public class GetDataCenter { /**
* @see 获取遍历数据中心的TraversalSpec
* @explain:清单遍历一定要结合清单遍历结构图。
* @return TraversalSpec:清单遍历对象,明确属性收集的对象类型,同事提供对象遍历的路径。
* */
public static TraversalSpec getDatacenterTraversalSpec()
{
//SelectionSpec是TraversalSpec的一个引用。
SelectionSpec sSpec = new SelectionSpec();
sSpec.setName("VisitFolders"); TraversalSpec traversalSpec = new TraversalSpec();
//给traversalSpec设置名称
traversalSpec.setName("VisitFolders");
//从rootFolder开始遍历,rootFolder类型是Folder
traversalSpec.setType("Folder");
//rootFolder拥有childEntity属性,清单结构图中指向的便是Datacenter
traversalSpec.setPath("childEntity");
//false表示不对其本身进行收集,只对其下对象进行收集
traversalSpec.setSkip(false);
//将sSpec添加到SelectionSpec集合中
traversalSpec.getSelectSet().add(sSpec);
return traversalSpec;
} /**
* @see 获取出所有的数据中心
* @return retVal:数据中心对象引用list。
* */
public static List<ManagedObjectReference> getAllDatacenter()
{
List<ManagedObjectReference> retVal = new ArrayList<ManagedObjectReference>();
//获取根目录对象引用
ManagedObjectReference rootFolder = MoniterWsInterface.serviceContent.getRootFolder();
try
{
TraversalSpec tSpec = getDatacenterTraversalSpec(); /**
* ObjectSpec:定义对象详述,明确清单导航起始点。
* obj:定义遍历起始对象为根目录rootFolder
* true:表示只收集Datacenter的数据,不收集containerView的数据。
* */
ObjectSpec objectSpec = new ObjectSpec();
objectSpec.setObj(rootFolder);
objectSpec.setSkip(Boolean.TRUE); /** 添加 tSpec到 ObjectSpec.selectSet队列中 */
objectSpec.getSelectSet().add(tSpec); /**
* PropertySpec:定义一个属性收集器详述,明确收集的具体对象(Datacenter)和属性(Datacenter中的name,可以为多个)
* Type:具体的对象类型为Datacenter
* pathset:明确对象Datacenter中的属性,可以为多个。
* */
PropertySpec propertySpec = new PropertySpec();
propertySpec.setAll(Boolean.FALSE);
propertySpec.getPathSet().add("name");
propertySpec.setType("Datacenter"); /**
* PropertyFilterSpec:定义一个属性过滤器详述,添加对象详述和属性收集器详述到过率中
* */
PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
propertyFilterSpec.getPropSet().add(propertySpec);
propertyFilterSpec.getObjectSet().add(objectSpec); /** 添加属性过滤器详述到属性过滤器集合中 */
List<PropertyFilterSpec> listfps = new ArrayList<PropertyFilterSpec>(1);
listfps.add(propertyFilterSpec); /** 调用方法获取ObjectContent对象集合 */
List<ObjectContent> listobcont = MoniterWsInterface.retrievePropertiesAllObjects(listfps); if (listobcont != null)
{
for (ObjectContent oc : listobcont)
{
//根据object对象获得MOR对象
ManagedObjectReference mr = oc.getObj(); String dcnm = null;
//获取属性集合(此处只有一个name属性)
List<DynamicProperty> dps = oc.getPropSet();
if (dps != null)
{
for (DynamicProperty dp : dps)
{
//获取到具体的数据中心(Datacenter)的名称
dcnm = (String) dp.getVal();
//System.out.println("数据中心名称"+dcnm);
retVal.add(mr);
}
}
}
}
}
catch (SOAPFaultException sfe)
{
MoniterWsInterface.printSoapFaultException(sfe);
}
catch (Exception e)
{
e.printStackTrace();
}
return retVal;
} /**
* @see 获取出所有的数据中心,和上面方法一样,只是最后返回值取得是Datacenter的属性name的值,而非Datacenter的对象引用。
* @return retVal:数据中心名称list。
* */
public static List<String> getDatacenterName()
{
List<String> retVal = new ArrayList<String>();
ManagedObjectReference rootFolder = MoniterWsInterface.serviceContent.getRootFolder();
try
{
TraversalSpec tSpec = getDatacenterTraversalSpec(); ObjectSpec objectSpec = new ObjectSpec();
objectSpec.setObj(rootFolder);
objectSpec.setSkip(Boolean.TRUE);
objectSpec.getSelectSet().add(tSpec); PropertySpec propertySpec = new PropertySpec();
propertySpec.setAll(Boolean.FALSE);
propertySpec.getPathSet().add("name");
propertySpec.setType("Datacenter"); //添加对象和属性声明到 PropertyFilterSpec。
PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
propertyFilterSpec.getPropSet().add(propertySpec);
propertyFilterSpec.getObjectSet().add(objectSpec); List<PropertyFilterSpec> listfps = new ArrayList<PropertyFilterSpec>(1);
listfps.add(propertyFilterSpec); List<ObjectContent> listobcont = MoniterWsInterface.retrievePropertiesAllObjects(listfps); if (listobcont != null)
{
for (ObjectContent oc : listobcont)
{
//根据object对象获得MOR对象
ManagedObjectReference mr = oc.getObj(); String dcnm = null;
List<DynamicProperty> dps = oc.getPropSet();
if (dps != null)
{
for (DynamicProperty dp : dps)
{
dcnm = (String) dp.getVal();
retVal.add(dcnm);
}
}
}
}
}
catch (SOAPFaultException sfe)
{
MoniterWsInterface.printSoapFaultException(sfe);
}
catch (Exception e)
{
e.printStackTrace();
}
return retVal;
} /**
* @see main测试方法
* */
public static void main(String[] args) throws Exception {
MoniterWsInterface moniterWsInterface = new MoniterWsInterface();
moniterWsInterface.connect(); /* List<ManagedObjectReference> allDatacenter = getAllDatacenter();
for (ManagedObjectReference dataCenter : allDatacenter) {
System.out.println(dataCenter.getType());
}*/
List<String> datacenterName = getDatacenterName();
for (String name : datacenterName) {
System.out.println(name);
}
moniterWsInterface.disconnect();
}
}

今天的入门知识就先讲这么多,新手一定要先学习下文档掌握基本的知识,然后结合代码练手,这样的可以更快的掌握套路。

关于主机、虚拟机、存储、集群等等其他的操作,我会在之后的文章为大家呈现,敬请期待。如果对哪块资源的操作需求特别紧急,可以给我评论留言。

Vmware Vsphere WebService SDK开发(第一讲)-基本知识学习的更多相关文章

  1. Vmware vsphere webservice sdk 连接打开慢的问题

    还在为VimService实例化速度慢的问题烦恼吗?这有一篇文章可以帮你解决问题,英文水平所限,就不翻译了,原文地址http://kb.vmware.com/selfservice/microsite ...

  2. Vmware Vsphere WebService之vijava 开发(二)一性能信息的采集(实时监控)

    最近一直没有更新这部分的内容,会利用五一时间完成vcenter这一个系列. 这里先给大家一本关于vijava开发的书,比较实用. 地址:http://pan.baidu.com/s/1gfkl9mj. ...

  3. Vmware Vsphere WebService之vijava 开发一-vcenter连接、及集群信息获取

    开始是通过java代码调用vsphere提供的原始接口,从而控制vcenter的操作.当第一个版本做完之后发现代码执行的速度特别慢,后来在网上看到有人用vijava(对vsphere原始接口封装)编程 ...

  4. Android开发第一讲之目录结构和程序的执行流程

    1.如何在eclipse当中,修改字体 下面的这种办法,可以更改xml的字体 窗口--首选项--常规--外观--颜色和字体--基本--文本字体--编辑Window --> Preferences ...

  5. 第一讲 新手如何学习HTTP协议之实践项目多开微信机器人

    上一篇做了一个smart qq机器人. 前几天,因为突然上不了  smart qq,以为TX 要抛弃了..所以就没有接着完善smart 机器人.应朋友要求,做一个多开微信. 做了几天已经做好了,理论上 ...

  6. VMware 虚拟化编程(3) —VMware vSphere Web Service API 解析

    目录 目录 前文列表 VMware vSphere Web Services API VMware vSphere Web Services SDK vSphere WS API 中的托管对象 Man ...

  7. 《ArcGIS Engine+C#实例开发教程》第一讲桌面GIS应用程序框架的建立

    原文:<ArcGIS Engine+C#实例开发教程>第一讲桌面GIS应用程序框架的建立 摘要:本讲主要是使用MapControl.PageLayoutControl.ToolbarCon ...

  8. 内核开发知识第一讲.内核中的数据类型.重要数据结构.常用内核API函数.

    一丶内核中的数据类型 在内核中.程序的编写不能简单的用基本数据类型了. 因为操作系统不同.很有可能造成数据类型的长度不一.而产生重大问题.所以在内核中. 数据类型都一定重定义了. 数据类型 重定义数据 ...

  9. vmware开发包之vSphere Management SDK

    vSphere Management SDK关于vmware管理等相关功能的.net和java的代码示例. 在其5.5的解压包中 eam:esx agent management表示esx虚机生产环境 ...

随机推荐

  1. mysql主从复制的一些东西的整理

    最近给新上线的项目进行主从结构的搭建,因此整理些有用的东西出来,供作记录: 一.mysql主从复制的一般配置步骤: 1.准备两台数据库环境,或者单台多实例的环境,能够正常的启动和登陆. 2.配置my. ...

  2. 使用history.back()出现"警告: 网页已过期的解决办法"

    原因: 表单提交页面中使用了 session_start 函数.由于我们后退浏览的是缓存页,而该函数会强制当前页面不被缓存. 解决: PHP: 此提示出现在一个POST提交的页面,点到其它页面后,通过 ...

  3. Changing SharePoint Default port ( 80 ) to another port ( 79 ).

      Introduction In this How-To I will change my port from 80 to 79, probably because I want to host s ...

  4. markdown 的基本操作

    文档 http://mux.alimama.com/posts/620?spm=0.0.0.0.4VVnvp http://www.jianshu.com/p/1e402922ee32/ MdChar ...

  5. 无法连接到已配置的开发web服务器

    http://jingyan.baidu.com/article/29697b91099847ab20de3c8b.html 这是防火墙造成的,将防火墙关闭即可

  6. 循序渐进Python3(三) -- 1 -- 内置函数

    对函数有了一定了解之后,我们来看看Python的内置函数.下图是Python所有的内置函数,共68个.

  7. source : not found 原因及解决办法

    解决方案来自网络: debian中shell脚本无法使用source的原因及解决方法 现象: shell脚本中source aaa.sh时提示 source: not found 原因: ls -l ...

  8. JavaScript初学者应注意的七个细节(转)

    http://www.cnblogs.com/lhb25/archive/2011/01/10/1932284.html 每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任 ...

  9. 使用jquery form插件进行异步带文件的表单提交

    引入form插件与jquery 的js文件后 获取表单的jq对象 然后.ajaxSubmit提交表单即可 实现添加品牌的异步表单提交 function addBarandImg(formId) { $ ...

  10. JDBC连接数据库(SQLServer和MySQL)配置总结

    [JDBC连接SQL Server] [准备工作] 1.下载Eclipse-JavaEE: 2.下载Tomcat8.0: 3.下载Microsoft JDBCDriver 4.1 for SQL Se ...