在开发我们的云管平台中,有时候发现虚拟机创建出来后,进行配置的时候,发现连接不上的问题;发现之前我们是在虚拟机创建出来后,就立即进行配置。此时虚拟机可能正处于开机状态或者某些网络相关的服务正在启动,这个时候远程是无法连接此虚拟机的。因此,改进的方案是: 在连接虚拟机进行配置之前,先验证一下网卡是否都连接好了 ,再进行后续配置。下面是检查网卡是否连通,并自动重连的代码:
public void checkVmNetworks(ServiceInstance serviceInstance,String vmId,String vmName){
Folder rooterFolder = serviceInstance.getRootFolder();
VirtualMachine vm = (VirtualMachine) new InventoryNavigator(rootFolder).searchManagedEntity("VirtualMachine",vmName);
if(null != vm){
VirtualMachineDeviceManager vmdm = new VirtualMachineDeviceManager(vm);
List<VirtualEthernetCard> vics = vmdm.getVirtualDeviceOfType(VirtualEthernetCard.class);
for(VirtualEthernetCard vic:vics){
String ethernetCardName = vic.getDeviceInfo().getLabel();
//开机自连
boolean startConnected = vic.getConnectable().startConnected;
//网卡是否已连接
boolean connected = vic.getConnectable().connected;
if(!startConnected || !connected){
//重连网卡
VirtualDeviceConfigSpec vdc = new VirtualDeviceConfigSpec();
vdc.setOperation(VirtualDeviceConfigSpecOperation.edit);
VirtualDeviceConnectInfo vdConn = new VirtualDeviceConnectInfo();
vdConn.setStartConnected(true);
vdConn.setConnected(true);
vic.setConnectable(vdConn);
vdc.setDevice(vic);
VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec();
vmConfigSpec.setDeviceChange(new VirtualDeviceConfigSpec[]{vdc});
Task reconnectTask = vm.reconfigVM_Task(vmConfigSpec);
String result = reconnectTask.waitForTask();
System.out.println(result);
}
}
}
}