概要:VMware是当前主流的桌面虚拟化厂商之一,VMware vSphere是VMware套件的商业名称,包含了虚拟化、管理和界面等。VMware官方提供了vSphere Web Service SDK方便开发者客户端开发,调用vmware API进行开发,vSphere Web Services SDK是目前api中最全面的。本文主要根据官方的sdk、官方的guid文档和网上的分享展开sdk的编程学习。sdk源码提供c#和java两种编译方式,本文主要使用java进行相关说明。
ws超时设置
vmware vcenter sdk提供的接口都是通过ws的形式,默认设置的超时时间是60秒,实际操作底层资源的时候很容易就会返回类似read time out这样的错误,需要手动设置下ws的超时时间。
Map var1 = ((BindingProvider)basicConnection.getVimPort()).getRequestContext();
var1.put("com.sun.xml.internal.ws.connection.timeout", 3600000);
var1.put("com.sun.xml.internal.ws.request.timeout", 3600000);
获取MOR信息
访问网址https://vcenterIP/mob/?moid=MOR可以获得目标引用下的相关属性和方法,如下图所示:
获取host引用下的configManger的代码示例
final GetMOREF getMOREF = new GetMOREF(connection);
final HostConfigManager configManager =(HostConfigManager) getMOREF.entityProps(host, new String[]{"configManager"}).get("configManager");
当获取的内容是数组时:
final GetMOREF getMOREF = new GetMOREF(connection);
final ArrayOfHostVirtualNic hostVirtualNicArray = (ArrayOfHostVirtualNic) getMOREF.entityProps(networkSystem,new String[]{"networkInfo.vnic"}).get("networkInfo.vnic");
获取根目录下的数据中心:
BasicConnection basicConnection=initConnection();
GetMOREF getMOREF=new GetMOREF(basicConnection);
//获取数据中心MAP
Map<String, ManagedObjectReference> dcResults = getMOREF.inFolderByType(basicConnection.getServiceContent().getRootFolder(), "Datacenter", new RetrieveOptions());
简单示例
通过mob页面我们可以看到host下设置的虚拟网卡和分布式交换机,我们通过代码来删除这些虚拟网卡和交换机,方便后续主机迁移操作
删除虚拟网卡
## ManagedObjectReference host
## Connection connection
final GetMOREF getMOREF = new GetMOREF(connection);
final VimPortType vimPort = connection.getVimPort();
## 获取networkSystem
final HostConfigManager configManager = (HostConfigManager) getMOREF.entityProps(host, new String[]{"configManager"}).get("configManager");
final ManagedObjectReference networkSystem = configManager.getNetworkSystem();
## 获取主机的虚拟网卡
final ArrayOfHostVirtualNic hostVirtualNicArray = (ArrayOfHostVirtualNic) getMOREF.entityProps(networkSystem, new String[]{"networkInfo.vnic"}).get("networkInfo.vnic");
final List hostVirtualNicList = hostVirtualNicArray.getHostVirtualNic();
final Iterator iterator = hostVirtualNicList.iterator();
//保留管理网的网卡
final String keepNicName = "Management Network";
while (iterator.hasNext()) {
final HostVirtualNic hostVirtualNic = (HostVirtualNic) iterator.next();
final String portGourpName = hostVirtualNic.getPortgroup();
//保留管理网nic,删除其他网卡
if(!keepNicName.equals(portGourpName)) {
log.info("删除虚拟网卡 {}", hostVirtualNic.getDevice());
vimPort.removeVirtualNic(networkSystem, hostVirtualNic.getDevice());
}
}
删除分布式逻辑交换机
## ManagedObjectReference host
## Connection connection
final GetMOREF getMOREF = new GetMOREF(connection);
final VimPortType vimPort = connection.getVimPort();
final ServiceContent serviceContent = connection.getServiceContent();
//获取分布式逻辑交换机管理的引用
final ManagedObjectReference dvSwitchManager = serviceContent.getDvSwitchManager();
//获取主机上DistributedVirtualSwitch配置
//第三个参数传null时获取所有的配置
final DVSManagerDvsConfigTarget dvsConfigTarget = vimPort.queryDvsConfigTarget(dvSwitchManager, host, null);
final List<DistributedVirtualSwitchInfo> switchInfos = dvsConfigTarget.getDistributedVirtualSwitch();
for (final DistributedVirtualSwitchInfo switchInfo : switchInfos) {
log.info("删除分布式交换机switch name:{}, uuid:{}", switchInfo.getSwitchName(), switchInfo.getSwitchUuid());
final DistributedVirtualSwitchHostMemberConfigSpec hostSpec = new DistributedVirtualSwitchHostMemberConfigSpec();
## 操作为移除
hostSpec.setOperation("remove");
hostSpec.setHost(host);
final List<DistributedVirtualSwitchHostMemberConfigSpec> hostSpecs = new ArrayList<>(1);
hostSpecs.add(hostSpec);
//通过反射塞值
Class clazz = DVSConfigSpec.class;
final DVSConfigSpec dvsConfigSpec = (DVSConfigSpec) clazz.newInstance();
Field declaredField = clazz.getDeclaredField("host");
declaredField.setAccessible(true);
declaredField.set(dvsConfigSpec, hostSpecs);
//获取configVersion,重新配置时需要保持configVersion一致,否则会提示异常
final DVSConfigInfo dvsConfigInfo = (DVSConfigInfo) getMOREF.entityProps(switchInfo.getDistributedVirtualSwitch(), new String[]{"config"}).get("config");
log.info("dvsConfigInfo version {}" , dvsConfigInfo.getConfigVersion());
dvsConfigSpec.setConfigVersion(dvsConfigInfo.getConfigVersion());
vimPort.reconfigureDvsTask( switchInfo.getDistributedVirtualSwitch(), dvsConfigSpec);
}
}
作者:郑行家
来源: 移动云开发者社区