vSphere Web Service SDK编程学习(二)

概要: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可以获得目标引用下的相关属性和方法,如下图所示:

img

获取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);
	}
}

作者:郑行家

链接:https://ecloud.10086.cn/api/query/developer/user/home.html?ticket=ST-10661-F0Xta3DdF4DK5IbJfcqg#L2FwaS9xdWVyeS9kZXZlbG9wZXIvYmxvZy9ibG9nZGV0YWlsLmh0bWw/YmxvZ19pZD05ZDBhNjAyMTQ4Y2E0OWQyYmQ5NDA2N2U4ZDA0Njk0Mw==

来源: 移动云开发者社区

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值