使用VMware VSphere WebService SDK进行开发 (四)——获取集群(Cluster, ComputeResource)的相关信息

使用VMware VSphere WebService SDK进行开发 (四)——获取集群(Cluster, ComputeResource)的相关信息

获取集群的信息不再过多的赘述,详细读过前面两篇文章的读者已经很快上路子了~

疯狂罗列代码:

private static TraversalSpec getComputeResourceTraversalSpec()
{
SelectionSpec ss = new SelectionSpec();
ss.setName("VisitFolders");

TraversalSpec hostFolderToComputeResource = new TraversalSpec();
hostFolderToComputeResource.setName("hostFolderToComputeResource");
hostFolderToComputeResource.setType("Folder");
hostFolderToComputeResource.setPath("childEntity");
hostFolderToComputeResource.setSkip(false);
hostFolderToComputeResource.getSelectSet().add(ss);

TraversalSpec dataCenterToHostFolder = new TraversalSpec();
dataCenterToHostFolder.setName("DataCenterToHostFolder");
dataCenterToHostFolder.setType("Datacenter");
dataCenterToHostFolder.setPath("hostFolder");
dataCenterToHostFolder.setSkip(false);
dataCenterToHostFolder.getSelectSet().add(ss);

TraversalSpec traversalSpec = new TraversalSpec();
traversalSpec.setName("VisitFolders");
traversalSpec.setType("Folder");
traversalSpec.setPath("childEntity");
traversalSpec.setSkip(false);

List<SelectionSpec> sSpecArr = new ArrayList<SelectionSpec>();
sSpecArr.add(ss);
sSpecArr.add(dataCenterToHostFolder);
sSpecArr.add(hostFolderToComputeResource);
traversalSpec.getSelectSet().addAll(sSpecArr);
return traversalSpec;
}
private static ManagedObjectReference getDatacenterByName(String datacenterName)
{
ManagedObjectReference retVal = null;
ManagedObjectReference rootFolder = serviceContent.getRootFolder();
try
{
TraversalSpec tSpec = getDatacenterTraversalSpec();
PropertySpec propertySpec = new PropertySpec();
propertySpec.setAll(Boolean.FALSE);
propertySpec.getPathSet().add("name");
propertySpec.setType("Datacenter");

ObjectSpec objectSpec = new ObjectSpec();
objectSpec.setObj(rootFolder);
objectSpec.setSkip(Boolean.TRUE);
objectSpec.getSelectSet().add(tSpec);

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 = retrievePropertiesAllObjects(listfps);

if (listobcont != null)
{
for (ObjectContent oc : listobcont)
{
ManagedObjectReference mr = oc.getObj();
String dcnm = null;
List<DynamicProperty> dps = oc.getPropSet();
if (dps != null)
{
for (DynamicProperty dp : dps)
{
dcnm = (String) dp.getVal();
}
}

if (dcnm != null && dcnm.equals(datacenterName))
{
retVal = mr;
break;
}
}
}
}
catch (SOAPFaultException sfe)
{
printSoapFaultException(sfe);
}
catch (Exception e)
{
e.printStackTrace();
}
return retVal;
}

private static List<List<Long>> getClusterData(String clusterName, String nameInfo, String groupInfo) throws RuntimeFaultFaultMsg, DatatypeConfigurationException
{
List<List<Long>> list = new ArrayList<List<Long>>();
ManagedObjectReference vmmor = getComputeResouceByCrName(clusterName);
if (vmmor != null)
{
List<PerfCounterInfo> cInfo = getPerfCounters();
List<PerfCounterInfo> vmCpuCounters = new ArrayList<PerfCounterInfo>();
for (int i = 0; i < cInfo.size(); ++i)
{
vmCpuCounters.add(cInfo.get(i));
}

int i = 0;
Map<Integer, PerfCounterInfo> counters = new HashMap<Integer, PerfCounterInfo>();
for (Iterator<PerfCounterInfo> it = vmCpuCounters.iterator(); it.hasNext();)
{
PerfCounterInfo pcInfo = (PerfCounterInfo) it.next();
counters.put(new Integer(pcInfo.getKey()), pcInfo);
}

XMLGregorianCalendar beginTime = DateConvert.convertToXMLGregorianCalendar(new Date(new Date().getTime() - 1000 * 60 * 5));
XMLGregorianCalendar endTime = DateConvert.convertToXMLGregorianCalendar(new Date());
List<PerfMetricId> listpermeid = vimPort.queryAvailablePerfMetric(perfManager, vmmor, null, null, null);

ArrayList<PerfMetricId> mMetrics = new ArrayList<PerfMetricId>();
if (listpermeid != null)
{
for (int index = 0; index < listpermeid.size(); ++index)
{
if (counters.containsKey(new Integer(listpermeid.get(index).getCounterId())))
{
mMetrics.add(listpermeid.get(index));
}
}
}

PerfQuerySpec qSpec = new PerfQuerySpec();
qSpec.setEntity(vmmor);
qSpec.getMetricId().addAll(mMetrics);
qSpec.setEndTime(endTime);
qSpec.setStartTime(beginTime);

List<PerfQuerySpec> qSpecs = new ArrayList<PerfQuerySpec>();
qSpecs.add(qSpec);

List<PerfEntityMetricBase> listpemb = vimPort.queryPerf(perfManager, qSpecs);
List<PerfEntityMetricBase> pValues = listpemb;

for (i = 0; i < pValues.size(); i++)
{
List<PerfMetricSeries> listpems = ((PerfEntityMetric) pValues.get(i)).getValue();
for (int vi = 0; vi < listpems.size(); ++vi)
{
String printInf = "";
PerfCounterInfo pci = (PerfCounterInfo) counters.get(new Integer(listpems.get(vi).getId().getCounterId()));

if (pci != null)
{
if (pci.getNameInfo().getKey().equalsIgnoreCase(nameInfo) && pci.getGroupInfo().getKey().equalsIgnoreCase(groupInfo))
{
printInf += vi + ":" + pci.getNameInfo().getSummary() + ":" + pci.getNameInfo().getKey() + ":" + pci.getNameInfo().getLabel() + ":"
+ pci.getGroupInfo().getKey() + ":" + pci.getGroupInfo().getLabel() + ":" + pci.getGroupInfo().getSummary() + " ";

if (listpems.get(vi) instanceof PerfMetricIntSeries)
{
PerfMetricIntSeries val = (PerfMetricIntSeries) listpems.get(vi);
List<Long> lislon = val.getValue();
for (Long k : lislon)
{
printInf += k + " ";
}
list.add(lislon);
}
printInf += " " + pci.getUnitInfo().getKey() + " " + pci.getUnitInfo().getLabel() + " " + pci.getUnitInfo().getSummary();
System.out.println(printInf);
}
}
}
}

}

return list;
}

private static String getClusterPropertyByClusterName(String property, String clusterName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg
{
String ans = null;
RetrieveResult props = getRetrieveResultObjectWithProperty("ComputeResource", property);

if (props != null)
{
Boolean flag = false;
if (property.compareToIgnoreCase("name") < 0)
{
for (ObjectContent oc : props.getObjects())
{
if (flag == true)
{
break;
}
String path = null;
List<DynamicProperty> dps = oc.getPropSet();

if (dps != null)
{
for (DynamicProperty dp : dps)
{
path = dp.getName();
if (path.equalsIgnoreCase(property))
{
String val = String.valueOf(dp.getVal());
ans = val;
}
if (path.equalsIgnoreCase("name"))
{
String value = (String) dp.getVal();
if (value.equals(clusterName))
{
flag = true;
break;
}
}
}
}
}
}
else
{
for (ObjectContent oc : props.getObjects())
{
if (flag == true)
{
break;
}
String path = null;
List<DynamicProperty> dps = oc.getPropSet();

if (dps != null)
{
for (DynamicProperty dp : dps)
{
path = dp.getName();
if (path.equalsIgnoreCase("name"))
{
String value = (String) dp.getVal();
if (value.equals(clusterName))
{
flag = true;
}
}
if (path.equalsIgnoreCase(property))
{
String val = String.valueOf(dp.getVal());
if (flag == true)
{
ans = val;
break;
}
}
}
}
}
}
}

return ans;
}
public static double getClusterCpuUsageByClusterName(String clusterName) throws RuntimeFaultFaultMsg, DatatypeConfigurationException
{
double ans = 0.0;
List<List<Long>> list = getClusterData(clusterName, "usage", "cpu");
long maxInner = 0;
int times = 0;
for (List<Long> listOuter : list)
{
long tempInner = 0;
for (long inner : listOuter)
{
tempInner += inner;
}
if (tempInner > maxInner)
{
maxInner = tempInner;
times = listOuter.size();
}
}
if (times != 0)
{
ans = (double) maxInner / times;
}
ans = ans / 100;
return ans;
}
public static long getClusterEffectiveMemoryByClusterName(String clusterName) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg
{
long ans = 0;
String ret = getClusterPropertyByClusterName("summary.effectiveMemory", clusterName);
ans = Long.valueOf(ret);
return ans;
}

同样以罗列集群名称的代码结束:

public static List<String> getClusterNames()
{
List<String> list = new ArrayList<String>();
ManagedObjectReference rootFolder = serviceContent.getRootFolder();
try
{
TraversalSpec tSpec = getComputeResourceTraversalSpec();
PropertySpec propertySpec = new PropertySpec();
propertySpec.setAll(Boolean.FALSE);
propertySpec.getPathSet().add("name");
propertySpec.setType("ClusterComputeResource");

ObjectSpec objectSpec = new ObjectSpec();
objectSpec.setObj(rootFolder);
objectSpec.setSkip(Boolean.TRUE);
objectSpec.getSelectSet().add(tSpec);

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 = retrievePropertiesAllObjects(listfps);

if (listobcont != null)
{
for (ObjectContent oc : listobcont)
{
String dcnm = null;
List<DynamicProperty> dps = oc.getPropSet();
if (dps != null)
{
for (DynamicProperty dp : dps)
{
dcnm = (String) dp.getVal();
if (dcnm != null)
{
list.add(dcnm);
}
}
}
}
}
}
catch (SOAPFaultException sfe)
{
printSoapFaultException(sfe);
}
catch (Exception e)
{
e.printStackTrace();
}

return list;
}

欢迎支持笔者的作品《深入理解Kafka: 核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客(ID: hiddenkafka)。
本文作者: 朱小厮

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×