package com.sobey.cmop.mvc.service.vm;
import java.util.ArrayList;
import java.util.HashMap;
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 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.RetrieveOptions;
import com.vmware.vim25.RetrieveResult;
import com.vmware.vim25.SelectionSpec;
import com.vmware.vim25.ServiceContent;
import com.vmware.vim25.TraversalSpec;
import com.vmware.vim25.VimPortType;
import com.vmware.vim25.VimService;
import com.vmware.vim25.VirtualDevice;
import com.vmware.vim25.VirtualDisk;
import com.vmware.vim25.VirtualHardware;
import com.vmware.vim25.VirtualMachineConfigInfo;
import com.vmware.vim25.VirtualMachineRuntimeInfo;
/**
* 获取宿主机及其虚拟机的列表
*
* @author wenlp
*/
public class HostTree {
/**
* 初始化设置
*
* @param sContent
* @return
*/
private static ObjectSpec init(ServiceContent sContent) {
// 设置数据中心节点
TraversalSpec datacenterHostTraversalSpec = new TraversalSpec();
datacenterHostTraversalSpec.setName("datacenterHostTraversalSpec");
datacenterHostTraversalSpec.setType("Datacenter");
datacenterHostTraversalSpec.setPath("hostFolder");
datacenterHostTraversalSpec.setSkip(false);
SelectionSpec sSpecF = new SelectionSpec();
sSpecF.setName("folderTraversalSpec");
datacenterHostTraversalSpec.getSelectSet().add(sSpecF);
// 设置文件夹节点
TraversalSpec folderTraversalSpec = new TraversalSpec();
folderTraversalSpec.setName("folderTraversalSpec");
folderTraversalSpec.setType("Folder");
folderTraversalSpec.setPath("childEntity");
folderTraversalSpec.setSkip(false);
folderTraversalSpec.getSelectSet().add(sSpecF);
folderTraversalSpec.getSelectSet().add(datacenterHostTraversalSpec);
// 设置计算资源节点
TraversalSpec computeResourceHostTraversalSpec = new TraversalSpec();
computeResourceHostTraversalSpec.setName("computeResourceHostTraversalSpec");
computeResourceHostTraversalSpec.setType("ComputeResource");
computeResourceHostTraversalSpec.setPath("host");
computeResourceHostTraversalSpec.setSkip(false);
folderTraversalSpec.getSelectSet().add(computeResourceHostTraversalSpec);
ObjectSpec oSpec = new ObjectSpec();
oSpec.setObj(sContent.getRootFolder());
oSpec.setSkip(false);
oSpec.getSelectSet().add(folderTraversalSpec);
return oSpec;
}
/**
* 宿主机过滤条件
*
* @param mObj
* @return
*/
private static List<PropertyFilterSpec> createHostFilterSpec(ManagedObjectReference mObj) {
PropertySpec pSpec = new PropertySpec();
pSpec.setAll(Boolean.FALSE);
pSpec.setType("VirtualMachine");
pSpec.getPathSet().add("runtime");
pSpec.getPathSet().add("config");
pSpec.getPathSet().add("network");
ObjectSpec oSpec = new ObjectSpec();
oSpec.setObj(mObj);
oSpec.setSkip(Boolean.FALSE);
TraversalSpec tSpec = new TraversalSpec();
tSpec.setType("HostSystem");
tSpec.setPath("vm");
tSpec.setSkip(Boolean.FALSE);
oSpec.getSelectSet().add(tSpec);
PropertyFilterSpec pfSpec = new PropertyFilterSpec();
pfSpec.getObjectSet().add(oSpec);
pfSpec.getPropSet().add(pSpec);
List<PropertyFilterSpec> fSpecList = new ArrayList<PropertyFilterSpec>();
fSpecList.add(pfSpec);
return fSpecList;
}
/**
* 集群过滤条件
*
* @param mObj
* @return
*/
private static List<PropertyFilterSpec> createClusterFilterSpec(ManagedObjectReference mObj) {
ObjectSpec oSpec = new ObjectSpec();
oSpec.setObj(mObj);
oSpec.setSkip(Boolean.FALSE);
TraversalSpec tSpec = new TraversalSpec();
tSpec.setType("ClusterComputeResource");
tSpec.setPath("host");
tSpec.setSkip(Boolean.FALSE);
oSpec.getSelectSet().add(tSpec);
PropertySpec pSpec = new PropertySpec();
pSpec.setType("HostSystem");
pSpec.getPathSet().add("name");
pSpec.setAll(Boolean.FALSE);
PropertyFilterSpec pfSpec = new PropertyFilterSpec();
pfSpec.getObjectSet().add(oSpec);
pfSpec.getPropSet().add(pSpec);
List<PropertyFilterSpec> fSpecList = new ArrayList<PropertyFilterSpec>();
fSpecList.add(pfSpec);
return fSpecList;
}
/**
* 获取宿主机及其虚拟机的属性
*
* @param methods
* @param sContent
* @return
* @throws Exception
*/
private static List collectHostProperties(VimPortType methods, ServiceContent sContent) throws Exception {
ObjectSpec oSpec = init(sContent);
PropertySpec pSpec = new PropertySpec();
pSpec.setType("HostSystem");
pSpec.getPathSet().add("name");
PropertyFilterSpec spec = new PropertyFilterSpec();
spec.getPropSet().add(pSpec);
spec.getObjectSet().add(oSpec);
List<PropertyFilterSpec> fSpecList = new ArrayList<PropertyFilterSpec>();
fSpecList.add(spec);
// 调用接口,获取查询结果
RetrieveOptions ro = new RetrieveOptions();
RetrieveResult hosts = methods.retrievePropertiesEx(sContent.getPropertyCollector(), fSpecList, ro);
List<Map> hostListMap = new ArrayList<Map>();
List<String> hostList = new ArrayList<String>();
if (hosts != null) {
// 解析宿主机
int countHost = 0;
for (ObjectContent oc : hosts.getObjects()) {
ManagedObjectReference mor = oc.getObj();
String host = null;
List<DynamicProperty> dps = oc.getPropSet();
if (dps != null) {
for (DynamicProperty dp : dps) {
host = (String) dp.getVal();
hostList.add(host);
System.out.println(host);
}
// 查询每个宿主机下的虚拟机
try {
List<PropertyFilterSpec> hostFilterSpec = createHostFilterSpec(mor);
RetrieveResult vms = methods.retrievePropertiesEx(sContent.getPropertyCollector(),
hostFilterSpec, ro);
// 解析虚拟机
VirtualMachineConfigInfo vmConfig;
VirtualHardware vHardware;
List<VirtualDevice> vDevice;
VirtualDisk vDisk = null;
int countVm = 0;
String ecs;
List<String> ecsList = new ArrayList<String>();
if (vms != null) {
ecsList = new ArrayList<String>();
for (ObjectContent ocHost : vms.getObjects()) {
List<DynamicProperty> dpsHost = ocHost.getPropSet();
if (dpsHost != null) {
for (DynamicProperty dp : dpsHost) {
if ("config".equals(dp.getName())) {
vmConfig = (VirtualMachineConfigInfo) dp.getVal();
vHardware = vmConfig.getHardware();
vDevice = vHardware.getDevice();
for (int i = 0; i < vDevice.size(); i++) {
if (vDevice.get(i) instanceof VirtualDisk) {
vDisk = (VirtualDisk) vDevice.get(i);
break;
}
}
ecs = vmConfig.getName();
System.out.print("--" + ecs);
// 过滤不符合要求的虚拟机,名称规则:IP_说明
if (ecs.length() > 0 && ecs.indexOf("_") > 0) {
ecs = ecs.substring(0, ecs.indexOf("_"));
}
if (ecs.length() > 0 && ecs.length() <= 15 && ecs.split("\\.").length == 4
&& ecs.replaceAll("\\.", "").matches("[0-9]+")) {
ecsList.add(ecs);
System.out.println("-->" + ecs);
} else {
System.out.println();
}
}
}
}
countVm++;
}
}
Map hostMap = new HashMap();
hostMap.put(host, ecsList);
hostListMap.add(hostMap);
} catch (Exception e) {
e.printStackTrace();
}
}
countHost++;
}
}
List list = new ArrayList();
list.add(hostList);
list.add(hostListMap);
return list;
}
/**
* 获取集群下的宿主机及其虚拟机的属性
*
* @param methods
* @param sContent
* @return
* @throws Exception
*/
private static List collectClusterProperties(VimPortType methods, ServiceContent sContent, String cluster)
throws Exception {
ManagedObjectReference mor = new ManagedObjectReference();
mor.setType("ClusterComputeResource");
mor.setValue(cluster);
List<PropertyFilterSpec> hostFilterSpec = createClusterFilterSpec(mor);
RetrieveOptions ro = new RetrieveOptions();
RetrieveResult hosts = methods.retrievePropertiesEx(sContent.getPropertyCollector(), hostFilterSpec, ro);
List<Map> hostListMap = new ArrayList<Map>();
List<String> hostList = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
int countHost = 0;
String host = "";
for (ObjectContent ocHost : hosts.getObjects()) {
ManagedObjectReference morHost = ocHost.getObj();
List<DynamicProperty> dpHost = ocHost.getPropSet();
if (dpHost != null) {
for (DynamicProperty dp : dpHost) {
host = (String) dp.getVal();
hostList.add(host);
System.out.println(host);
}
// 查询每个宿主机下的虚拟机
try {
List<PropertyFilterSpec> vmFilterSpec = createHostFilterSpec(morHost);
RetrieveResult vms = methods
.retrievePropertiesEx(sContent.getPropertyCollector(), vmFilterSpec, ro);
VirtualMachineConfigInfo vmConfig;
VirtualMachineRuntimeInfo vmRuntime;
VirtualHardware vHardware;
List<VirtualDevice> vDevice;
VirtualDisk vDisk = null;
int countVm = 0;
String ecs;
List<String> ecsList = new ArrayList<String>();
if (vms != null) {
for (ObjectContent ocVm : vms.getObjects()) {
List<DynamicProperty> dpVms = ocVm.getPropSet();
if (dpVms != null) {
for (DynamicProperty dpVm : dpVms) {
if ("config".equals(dpVm.getName())) {
vmConfig = (VirtualMachineConfigInfo) dpVm.getVal();
vHardware = vmConfig.getHardware();
vDevice = vHardware.getDevice();
for (int i = 0; i < vDevice.size(); i++) {
if (vDevice.get(i) instanceof VirtualDisk) {
vDisk = (VirtualDisk) vDevice.get(i);
break;
}
}
ecs = vmConfig.getName();
System.out.print("--" + ecs);
// 过滤不符合要求的虚拟机,名称规则:IP_说明
if (ecs.length() > 0 && ecs.indexOf("_") > 0) {
ecs = ecs.substring(0, ecs.indexOf("_"));
}
if (ecs.length() > 0 && ecs.length() <= 15 && ecs.split("\\.").length == 4
&& ecs.replaceAll("\\.", "").matches("[0-9]+")) {
ecsList.add(ecs);
System.out.println("-->" + ecs);
} else {
System.out.println();
}
}
}
}
countVm++;
}
}
Map hostMap = new HashMap();
hostMap.put(host, ecsList);
hostListMap.add(hostMap);
} catch (Exception e) {
e.printStackTrace();
}
}
countHost++;
}
List list = new ArrayList();
list.add(hostList);
list.add(hostListMap);
return list;
}
/**
* 外部调用方法
*
* @return
* @throws Exception
*/
public static List call() throws Exception {
long start = System.currentTimeMillis();
String url = "https://172.20.0.20/sdk/vimService";
ManagedObjectReference SVC_INST_REF = new ManagedObjectReference();
VimService vimService;
VimPortType vimPort;
ServiceContent serviceContent;
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
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());
HttpsURLConnection.setDefaultHostnameVerifier(hv);
SVC_INST_REF.setType("ServiceInstance");
SVC_INST_REF.setValue("ServiceInstance");
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(), "administrator", "Newmed!ad3v@s0bey", null);
// List list1 = collectHostProperties(vimPort, serviceContent);
List list2 = collectClusterProperties(vimPort, serviceContent, "domain-c1543"); // 云生产集群
List list3 = collectClusterProperties(vimPort, serviceContent, "domain-c1508"); // SMG集群
List list = new ArrayList();
// list.add(list1);
list.add(list2);
list.add(list3);
vimPort.logout(serviceContent.getSessionManager());
System.out.println("同步耗时:" + (System.currentTimeMillis() - start) / 1000 + "s");
return list;
}
public static void main(String[] args) throws Exception {
call();
}
/**
* 信任证书
*/
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;
}
}
}