zoukankan      html  css  js  c++  java
  • Vmware Vsphere WebService SDK开发(第一讲)-基本知识学习

    刚开始这方面开发的时候,不知道如何下手,能够查到的资料特别少,而且看到很多网友和我一样也在找这方面的资料。接下来的一段时间我就结合自己所参与的项目,完成关于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即可,代码可以直接运行。

      1 import java.util.ArrayList;
      2 import java.util.List;
      3 import java.util.Map;
      4 
      5 import javax.net.ssl.HostnameVerifier;
      6 import javax.net.ssl.HttpsURLConnection;
      7 import javax.net.ssl.SSLSession;
      8 import javax.xml.ws.BindingProvider;
      9 import javax.xml.ws.soap.SOAPFaultException;
     10 
     11 import com.vmware.vim25.ManagedObjectReference;
     12 import com.vmware.vim25.ObjectContent;
     13 import com.vmware.vim25.PropertyFilterSpec;
     14 import com.vmware.vim25.RetrieveOptions;
     15 import com.vmware.vim25.RetrieveResult;
     16 import com.vmware.vim25.ServiceContent;
     17 import com.vmware.vim25.VimPortType;
     18 import com.vmware.vim25.VimService;
     19 
     20 /** 
     21 * @author Di
     22 * @功能描述 服务器的连接、认证、断开
     23 * @date 创建时间:2016年12月8日 下午3:37:18 
     24 * @version 1.0   
     25 */
     26 public class MoniterWsInterface
     27 {
     28     private static String url = "";
     29     private static String userName = "";
     30     private static String password = "";
     31 
     32     private static final ManagedObjectReference SVC_INST_REF = new ManagedObjectReference();
     33     public static VimService vimService;
     34     public static VimPortType vimPort;
     35 
     36     public static ServiceContent serviceContent;
     37     private static final String SVC_INST_NAME = "ServiceInstance";
     38     private static Boolean isConnected = false;
     39     public static ManagedObjectReference perfManager;
     40     public static ManagedObjectReference propCollectorRef;
     41 
     42     private static class TrustAllTrustManager implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager
     43     {
     44         public java.security.cert.X509Certificate[] getAcceptedIssuers()
     45         {
     46             return null;
     47         }
     48 
     49         public boolean isServerTrusted(java.security.cert.X509Certificate[] certs)
     50         {
     51             return true;
     52         }
     53 
     54         public boolean isClientTrusted(java.security.cert.X509Certificate[] certs)
     55         {
     56             return true;
     57         }
     58 
     59         public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException
     60         {
     61             return;
     62         }
     63 
     64         public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException
     65         {
     66             return;
     67         }
     68     }
     69 
     70     private static void trustAllHttpsCertificates() throws Exception
     71     {
     72         javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
     73         javax.net.ssl.TrustManager tm = new TrustAllTrustManager();
     74         trustAllCerts[0] = tm;
     75         javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");
     76         javax.net.ssl.SSLSessionContext sslsc = sc.getServerSessionContext();
     77         sslsc.setSessionTimeout(0);
     78         sc.init(null, trustAllCerts, null);
     79         javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
     80     }
     81 
     82     /**
     83      * @功能描述 连接认证
     84      */
     85     public static void connect() throws Exception
     86     {
     87         HostnameVerifier hv = new HostnameVerifier()
     88         {
     89             public boolean verify(String urlHostName, SSLSession session)
     90             {
     91                 return true;
     92             }
     93         };
     94         trustAllHttpsCertificates();
     95 
     96         HttpsURLConnection.setDefaultHostnameVerifier(hv);
     97 
     98         SVC_INST_REF.setType(SVC_INST_NAME);
     99         SVC_INST_REF.setValue(SVC_INST_NAME);
    100 
    101         vimService = new VimService();
    102         vimPort = vimService.getVimPort();
    103         Map<String, Object> ctxt = ((BindingProvider) vimPort).getRequestContext();
    104 
    105         ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
    106         ctxt.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);
    107 
    108         serviceContent = vimPort.retrieveServiceContent(SVC_INST_REF);
    109         vimPort.login(serviceContent.getSessionManager(), userName, password, null);
    110         isConnected = true;
    111 
    112         perfManager = serviceContent.getPerfManager();
    113         propCollectorRef = serviceContent.getPropertyCollector();
    114         
    115         System.out.println(serviceContent.getAbout().getFullName());
    116         System.out.println("Server type is " + serviceContent.getAbout().getApiType());
    117     }
    118 
    119     /**
    120      * @功能描述 断开连接
    121      * @return
    122      * @throws Exception
    123      */
    124     public static void disconnect() throws Exception
    125     {
    126         if (isConnected)
    127         {
    128             vimPort.logout(serviceContent.getSessionManager());
    129         }
    130         isConnected = false;
    131     }
    132 
    133     /**
    134      * @功能描述 打印错误信息
    135      * @param
    136      * @param sfe
    137      */
    138     public static void printSoapFaultException(SOAPFaultException sfe)
    139     {
    140         System.out.println("Soap fault: ");
    141         if (sfe.getFault().hasDetail())
    142         {
    143             System.out.println(sfe.getFault().getDetail().getFirstChild().getLocalName());
    144         }
    145         if (sfe.getFault().getFaultString() != null)
    146         {
    147             System.out.println("Message: " + sfe.getFault().getFaultString());
    148         }
    149     }
    150         
    151     /**
    152      * @功能描述 根据属性检索要查询的对象信息
    153      * @param listpfs 属性过滤器集合
    154      * @throws Exception
    155      */
    156     public static List<ObjectContent> retrievePropertiesAllObjects(List<PropertyFilterSpec> listpfs) throws Exception
    157     {
    158         RetrieveOptions propObjectRetrieveOpts = new RetrieveOptions();
    159         List<ObjectContent> listobjcontent = new ArrayList<ObjectContent>();
    160         try
    161         {
    162             RetrieveResult rslts = vimPort.retrievePropertiesEx(propCollectorRef, listpfs, propObjectRetrieveOpts);
    163             if (rslts != null && rslts.getObjects() != null && !rslts.getObjects().isEmpty())
    164             {
    165                 listobjcontent.addAll(rslts.getObjects());
    166             }
    167             String token = null;
    168             if (rslts != null && rslts.getToken() != null)
    169             {
    170                 token = rslts.getToken();
    171             }
    172             while (token != null && !token.isEmpty())
    173             {
    174                 rslts = vimPort.continueRetrievePropertiesEx(propCollectorRef, token);
    175                 token = null;
    176                 if (rslts != null)
    177                 {
    178                     token = rslts.getToken();
    179                     if (rslts.getObjects() != null && !rslts.getObjects().isEmpty())
    180                     {
    181                         listobjcontent.addAll(rslts.getObjects());
    182                     }
    183                 }
    184             }
    185         }
    186         catch (SOAPFaultException sfe)
    187         {
    188             printSoapFaultException(sfe);
    189         }
    190         catch (Exception e)
    191         {
    192             e.printStackTrace();
    193         }
    194 
    195         return listobjcontent;
    196     }
    197     
    198     /**
    199      * @see main测试方法
    200      * */
    201     public static void main(String[] args)
    202     {
    203         new MoniterWsInterface();
    204         try
    205         {
    206             connect();
    207         }
    208         catch (SOAPFaultException sfe)
    209         {
    210             printSoapFaultException(sfe);
    211         }
    212         catch (Exception e)
    213         {
    214             e.printStackTrace();
    215         }
    216         finally
    217         {
    218             try
    219             {
    220                 disconnect();
    221             }
    222             catch (SOAPFaultException sfe)
    223             {
    224                 printSoapFaultException(sfe);
    225             }
    226             catch (Exception e)
    227             {
    228                 e.printStackTrace();
    229             }
    230         }
    231     }
    232 }

    现在我们对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对象及其属性,代码可以直接运行。

      1 import java.util.ArrayList;
      2 import java.util.List;
      3 
      4 import javax.xml.ws.soap.SOAPFaultException;
      5 
      6 import com.vmware.vim25.DynamicProperty;
      7 import com.vmware.vim25.ManagedObjectReference;
      8 import com.vmware.vim25.ObjectContent;
      9 import com.vmware.vim25.ObjectSpec;
     10 import com.vmware.vim25.PropertyFilterSpec;
     11 import com.vmware.vim25.PropertySpec;
     12 import com.vmware.vim25.SelectionSpec;
     13 import com.vmware.vim25.TraversalSpec;
     14 
     15 /** 
     16 * @author Di
     17 * @see 获取数据中心对象引用及name属性
     18 * @date 创建时间:2016年12月8日 下午4:01:33 
     19 * @version 1.0   
     20 */
     21 public class GetDataCenter {
     22     
     23     /**
     24      * @see 获取遍历数据中心的TraversalSpec
     25      * @explain:清单遍历一定要结合清单遍历结构图。
     26      * @return TraversalSpec:清单遍历对象,明确属性收集的对象类型,同事提供对象遍历的路径。
     27      * */
     28     public static TraversalSpec getDatacenterTraversalSpec()  
     29     {  
     30         //SelectionSpec是TraversalSpec的一个引用。
     31         SelectionSpec sSpec = new SelectionSpec();  
     32         sSpec.setName("VisitFolders");  
     33         
     34         TraversalSpec traversalSpec = new TraversalSpec();  
     35         //给traversalSpec设置名称
     36         traversalSpec.setName("VisitFolders");    
     37         //从rootFolder开始遍历,rootFolder类型是Folder
     38         traversalSpec.setType("Folder");  
     39         //rootFolder拥有childEntity属性,清单结构图中指向的便是Datacenter
     40         traversalSpec.setPath("childEntity");
     41         //false表示不对其本身进行收集,只对其下对象进行收集
     42         traversalSpec.setSkip(false);
     43         //将sSpec添加到SelectionSpec集合中
     44         traversalSpec.getSelectSet().add(sSpec);  
     45         return traversalSpec;  
     46     }
     47     
     48     /**
     49      * @see 获取出所有的数据中心
     50      * @return retVal:数据中心对象引用list。
     51      * */
     52     public static List<ManagedObjectReference> getAllDatacenter()
     53     {
     54         List<ManagedObjectReference> retVal = new ArrayList<ManagedObjectReference>();
     55         //获取根目录对象引用
     56         ManagedObjectReference rootFolder = MoniterWsInterface.serviceContent.getRootFolder();
     57         try
     58         {
     59             TraversalSpec tSpec = getDatacenterTraversalSpec();
     60             
     61             /** 
     62              * ObjectSpec:定义对象详述,明确清单导航起始点。
     63              * obj:定义遍历起始对象为根目录rootFolder
     64              * true:表示只收集Datacenter的数据,不收集containerView的数据。
     65              * */
     66             ObjectSpec objectSpec = new ObjectSpec();
     67             objectSpec.setObj(rootFolder);
     68             objectSpec.setSkip(Boolean.TRUE);
     69             
     70             /** 添加 tSpec到 ObjectSpec.selectSet队列中 */
     71             objectSpec.getSelectSet().add(tSpec);
     72 
     73             /**
     74              * PropertySpec:定义一个属性收集器详述,明确收集的具体对象(Datacenter)和属性(Datacenter中的name,可以为多个)
     75              * Type:具体的对象类型为Datacenter
     76              * pathset:明确对象Datacenter中的属性,可以为多个。
     77              * */
     78             PropertySpec propertySpec = new PropertySpec();
     79             propertySpec.setAll(Boolean.FALSE);
     80             propertySpec.getPathSet().add("name");
     81             propertySpec.setType("Datacenter");
     82             
     83             /**
     84              * PropertyFilterSpec:定义一个属性过滤器详述,添加对象详述和属性收集器详述到过率中
     85              * */ 
     86             PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
     87             propertyFilterSpec.getPropSet().add(propertySpec);
     88             propertyFilterSpec.getObjectSet().add(objectSpec);
     89 
     90             /** 添加属性过滤器详述到属性过滤器集合中 */
     91             List<PropertyFilterSpec> listfps = new ArrayList<PropertyFilterSpec>(1);
     92             listfps.add(propertyFilterSpec);
     93             
     94             /** 调用方法获取ObjectContent对象集合 */
     95             List<ObjectContent> listobcont = MoniterWsInterface.retrievePropertiesAllObjects(listfps);
     96 
     97             if (listobcont != null)
     98             {
     99                 for (ObjectContent oc : listobcont)
    100                 {
    101                     //根据object对象获得MOR对象
    102                     ManagedObjectReference mr = oc.getObj();
    103                     
    104                     String dcnm = null;
    105                     //获取属性集合(此处只有一个name属性)
    106                     List<DynamicProperty> dps = oc.getPropSet();
    107                     if (dps != null)
    108                     {
    109                         for (DynamicProperty dp : dps)
    110                         {
    111                             //获取到具体的数据中心(Datacenter)的名称
    112                             dcnm = (String) dp.getVal();
    113                             //System.out.println("数据中心名称"+dcnm);
    114                             retVal.add(mr);
    115                         }
    116                     }
    117                 }
    118             }
    119         }
    120         catch (SOAPFaultException sfe)
    121         {
    122             MoniterWsInterface.printSoapFaultException(sfe);
    123         }
    124         catch (Exception e)
    125         {
    126             e.printStackTrace();
    127         }
    128         return retVal;
    129     }
    130 
    131     /**
    132      * @see 获取出所有的数据中心,和上面方法一样,只是最后返回值取得是Datacenter的属性name的值,而非Datacenter的对象引用。
    133      * @return retVal:数据中心名称list。
    134      * */
    135     public static List<String> getDatacenterName()
    136     {
    137         List<String> retVal = new ArrayList<String>();
    138         ManagedObjectReference rootFolder = MoniterWsInterface.serviceContent.getRootFolder();
    139         try
    140         {
    141             TraversalSpec tSpec = getDatacenterTraversalSpec();
    142             
    143             ObjectSpec objectSpec = new ObjectSpec();
    144             objectSpec.setObj(rootFolder);
    145             objectSpec.setSkip(Boolean.TRUE);
    146             objectSpec.getSelectSet().add(tSpec);
    147             
    148             PropertySpec propertySpec = new PropertySpec();
    149             propertySpec.setAll(Boolean.FALSE);
    150             propertySpec.getPathSet().add("name");
    151             propertySpec.setType("Datacenter");
    152 
    153             //添加对象和属性声明到 PropertyFilterSpec。 
    154             PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
    155             propertyFilterSpec.getPropSet().add(propertySpec);
    156             propertyFilterSpec.getObjectSet().add(objectSpec);
    157 
    158             List<PropertyFilterSpec> listfps = new ArrayList<PropertyFilterSpec>(1);
    159             listfps.add(propertyFilterSpec);
    160             
    161             List<ObjectContent> listobcont = MoniterWsInterface.retrievePropertiesAllObjects(listfps);
    162 
    163             if (listobcont != null)
    164             {
    165                 for (ObjectContent oc : listobcont)
    166                 {
    167                     //根据object对象获得MOR对象
    168                     ManagedObjectReference mr = oc.getObj();
    169                     
    170                     String dcnm = null;
    171                     List<DynamicProperty> dps = oc.getPropSet();
    172                     if (dps != null)
    173                     {
    174                         for (DynamicProperty dp : dps)
    175                         {
    176                             dcnm = (String) dp.getVal();
    177                             retVal.add(dcnm);
    178                         }
    179                     }
    180                 }
    181             }
    182         }
    183         catch (SOAPFaultException sfe)
    184         {
    185             MoniterWsInterface.printSoapFaultException(sfe);
    186         }
    187         catch (Exception e)
    188         {
    189             e.printStackTrace();
    190         }
    191         return retVal;
    192     }
    193     
    194     /**
    195      * @see main测试方法
    196      * */
    197     public static void main(String[] args) throws Exception {
    198         MoniterWsInterface moniterWsInterface = new MoniterWsInterface();
    199         moniterWsInterface.connect();
    200         
    201        /* List<ManagedObjectReference> allDatacenter = getAllDatacenter();
    202         for (ManagedObjectReference dataCenter : allDatacenter) {
    203             System.out.println(dataCenter.getType());
    204         }*/
    205         List<String> datacenterName = getDatacenterName();
    206         for (String name : datacenterName) {
    207             System.out.println(name);
    208         }
    209         moniterWsInterface.disconnect();
    210     }
    211 }

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

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

  • 相关阅读:
    react native android 应用状态(前端或后台)的判断
    react native native module
    Nodejs项目重复文件扫描
    clipboard.js文本复制到剪贴板的现代方法
    微信小程序如何跳转到另一个小程序
    百度小程序button去掉默认边框
    下拉框select中option居中样式
    css中如何实现左边的高度随着右边改变而改变
    js判断是否手机自动跳转移动端
    webpack安装整理
  • 原文地址:https://www.cnblogs.com/xiaodige/p/6256252.html
Copyright © 2011-2022 走看看