刚开始这方面开发的时候,不知道如何下手,能够查到的资料特别少,而且看到很多网友和我一样也在找这方面的资料。接下来的一段时间我就结合自己所参与的项目,完成关于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. 移动端自动化环境搭建-JDK的安装

    一.安装jdk A.安装依赖 JDK作为JAVA开发的环境,不管是做JAVA开发的学生,还是做安卓开发的同学,都必须在电脑上安装JDK. B.安装过程 安装JDK 选择安装目录 安装过程中会出现两次 ...

  2. Maven pom.xml中添加指定的中央仓库

    中央仓库就是Maven的一个默认的远程仓库,Maven的安装文件中自带了中央仓库的配置($M2_HOME/lib/maven-model-builder.jar) 在很多情况下,默认的中央仓库无法满足 ...

  3. VS2012调试时无法启动程序和拒绝访问问题汇总

    很多人在使用VS2012的时候会出现下面所示的问题,我也是,而且不止一次,也不是同样的问题,我这里就把一些常见的解决方法罗列一下.

  4. WPF TextBlock文本纵向排列

    一.将TextBlock文本纵向排列输出有两种模式. 1.文字正常放置,只是纵向排列. 2.文字同样旋转90度,纵向排列. 二.详见下文实例 1.文本正常放置,纵向排列. (1)后台代码 string ...

  5. linq to entity中遇到的问题

    当使用 from m in _db.students从数据库中获取数据时,数据库中的数据类型和C#中的不同,所以可能会出错!先作_db.students.ToList()然后select

  6. 详解log4j2(下) - Async/MongoDB/Flume Appender 按日志级别区分文件输出

    1. 按日志级别区分文件输出 有些人习惯按日志信息级别输出到不同名称的文件中,如info.log,error.log,warn.log等,在log4j2中可通过配置Filters来实现. 假定需求是把 ...

  7. B. Santa Claus and Keyboard Check 模拟

    http://codeforces.com/contest/752/problem/B uuu yyu xy xx 注意变化了之后,检查一次前面已经变化过的就好.因为可能前面的满足,但是变了后不满足. ...

  8. Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态

    一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  9. RGBA 与opacity

    RGBA是一种表示颜色的方式,初次看到觉得很奇怪,与RGB的区别是什么?后面查了下,才发现RGBA的好处. RGBA各个字母的含义为: R:红色值,正整数 | 百分数: G:绿色值,正整数 | 百分数 ...

  10. Z - Fighting 和 Depth-bias

    Depth-bias操作在clipping之后进行实施,所以depth-bias对几何clipping没有影响. 另外需要注意的是:对一个给定体元(primitive),bias值是一个常量,在进行差 ...