From 6fdbd309c380b868d9fcdd22d07d5fe496942a50 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Mon, 26 Sep 2011 12:15:26 -0700 Subject: [PATCH] bug 10971: support vSphere 5 --- .../vmware/resource/VmwareResource.java | 33 ++++++++++++++++--- .../hypervisor/vmware/mo/TestVmwareMO.java | 12 ++++--- .../src/com/cloud/configuration/Config.java | 2 +- .../hypervisor/vmware/VmwareManagerImpl.java | 19 +++++++---- .../vmware/mo/HostFirewallSystemMO.java | 10 ++++++ 5 files changed, 60 insertions(+), 16 deletions(-) diff --git a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 45a99643ac4..6495354f7c4 100755 --- a/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/core/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -143,6 +143,7 @@ import com.cloud.hypervisor.vmware.mo.CustomFieldConstants; import com.cloud.hypervisor.vmware.mo.CustomFieldsManagerMO; import com.cloud.hypervisor.vmware.mo.DatacenterMO; import com.cloud.hypervisor.vmware.mo.DatastoreMO; +import com.cloud.hypervisor.vmware.mo.HostFirewallSystemMO; import com.cloud.hypervisor.vmware.mo.HostMO; import com.cloud.hypervisor.vmware.mo.HostVirtualNicType; import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper; @@ -186,6 +187,8 @@ import com.vmware.vim25.ClusterDasConfigInfo; import com.vmware.vim25.ComputeResourceSummary; import com.vmware.vim25.DatastoreSummary; import com.vmware.vim25.DynamicProperty; +import com.vmware.vim25.HostFirewallInfo; +import com.vmware.vim25.HostFirewallRuleset; import com.vmware.vim25.HostNetworkTrafficShapingPolicy; import com.vmware.vim25.HostPortGroupSpec; import com.vmware.vim25.ManagedObjectReference; @@ -3275,7 +3278,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa Collection existingPorts = portInfo.values(); int val = random.nextInt(maxVncPorts); int startVal = val; - do { + do { if (!existingPorts.contains(5900 + val)) { vncPort = 5900 + val; break; @@ -3782,7 +3785,29 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa public synchronized VmwareContext getServiceContext(Command cmd) { if (_serviceContext == null) { try { - _serviceContext = VmwareContextFactory.create(_vCenterAddress, _username, _password); + _serviceContext = VmwareContextFactory.create(_vCenterAddress, _username, _password); + VmwareHypervisorHost hyperHost = getHyperHost(_serviceContext, cmd); + assert(hyperHost instanceof HostMO); + + HostFirewallSystemMO firewallMo = ((HostMO)hyperHost).getHostFirewallSystemMO(); + boolean bRefresh = false; + if(firewallMo != null) { + HostFirewallInfo firewallInfo = firewallMo.getFirewallInfo(); + if(firewallInfo != null) { + for(HostFirewallRuleset rule : firewallInfo.getRuleset()) { + if("vncServer".equalsIgnoreCase(rule.getKey())) { + bRefresh = true; + firewallMo.enableRuleset("vncServer"); + } else if("gdbserver".equalsIgnoreCase(rule.getKey())) { + bRefresh = true; + firewallMo.enableRuleset("gdbserver"); + } + } + } + + if(bRefresh) + firewallMo.refreshFirewall(); + } } catch (Exception e) { s_logger.error("Unable to connect to vSphere server: " + _vCenterAddress, e); throw new CloudRuntimeException("Unable to connect to vSphere server: " + _vCenterAddress); @@ -3802,8 +3827,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa @Override public VmwareHypervisorHost getHyperHost(VmwareContext context, Command cmd) { - if (_morHyperHost.getType().equalsIgnoreCase("HostSystem")) { - return new HostMO(context, _morHyperHost); + if (_morHyperHost.getType().equalsIgnoreCase("HostSystem")) { + return new HostMO(context, _morHyperHost); } return new ClusterMO(context, _morHyperHost); } diff --git a/core/test/com/cloud/hypervisor/vmware/mo/TestVmwareMO.java b/core/test/com/cloud/hypervisor/vmware/mo/TestVmwareMO.java index b5be56ff0de..125d0592b54 100755 --- a/core/test/com/cloud/hypervisor/vmware/mo/TestVmwareMO.java +++ b/core/test/com/cloud/hypervisor/vmware/mo/TestVmwareMO.java @@ -7,6 +7,7 @@ package com.cloud.hypervisor.vmware.mo; import org.apache.log4j.Logger; import com.cloud.hypervisor.vmware.util.VmwareContext; +import com.cloud.serializer.GsonHelper; import com.cloud.utils.testcase.Log4jEnabledTestCase; import com.google.gson.Gson; import com.vmware.vim25.ManagedObjectReference; @@ -15,16 +16,17 @@ import com.vmware.vim25.VirtualMachineConfigSpec; // This test case needs a particular setup, only used for my own test public class TestVmwareMO extends Log4jEnabledTestCase { private static final Logger s_logger = Logger.getLogger(TestVmwareMO.class); - + public void test() { try { VmwareContext context = TestVmwareContextFactory.create( - "192.168.190.18", "Administrator", "Suite219"); + "10.223.80.29", "Administrator", "Suite219"); - VirtualMachineMO vmMo = new VirtualMachineMO(context, "VirtualMachine", "vm-700"); - - System.out.println("state " + vmMo.getPowerState().toString()); + HostMO hostMo = new HostMO(context, "HostSystem", "host-9"); + System.out.println("host Type " + hostMo.getHostType()); + Gson gson = GsonHelper.getGsonLogger(); + System.out.println(gson.toJson(hostMo.getHostFirewallSystemMO().getFirewallInfo())); context.close(); } catch(Exception e) { diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index e5e21bf51b5..7149aa85f6d 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -222,7 +222,7 @@ public enum Config { VmwareGuestNetworkVSwitch("Advanced", ManagementServer.class, String.class, "vmware.guest.vswitch", null, "Specify the vSwitch on host for guest network", null), VmwareServiceConsole("Advanced", ManagementServer.class, String.class, "vmware.service.console", "Service Console", "Specify the service console network name(for ESX hosts)", null), VmwareManagementPortGroup("Advanced", ManagementServer.class, String.class, "vmware.management.portgroup", "Management Network", "Specify the management network name(for ESXi hosts)", null), - VmwareAdditionalVncPortRangeStart("Advanced", ManagementServer.class, Integer.class, "vmware.additional.vnc.portrange.start", "59000", "Start port number of additional VNC port range", null), + VmwareAdditionalVncPortRangeStart("Advanced", ManagementServer.class, Integer.class, "vmware.additional.vnc.portrange.start", "50000", "Start port number of additional VNC port range", null), VmwareAdditionalVncPortRangeSize("Advanced", ManagementServer.class, Integer.class, "vmware.additional.vnc.portrange.size", "1000", "Start port number of additional VNC port range", null), //VmwareGuestNicDeviceType("Advanced", ManagementServer.class, String.class, "vmware.guest.nic.device.type", "E1000", "Ethernet card type used in guest VM, valid values are E1000, PCNet32, Vmxnet2, Vmxnet3", null), VmwarePerClusterHostMax("Advanced", ManagementServer.class, Integer.class, "vmware.percluster.host.max", "8", "maxmium hosts per vCenter cluster(do not let it grow over 8)", "1-8"), diff --git a/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java b/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java index 511ce2e25ca..992b3449425 100755 --- a/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java +++ b/server/src/com/cloud/hypervisor/vmware/VmwareManagerImpl.java @@ -75,6 +75,7 @@ import com.cloud.utils.script.Script; import com.cloud.vm.DomainRouterVO; import com.google.gson.Gson; import com.vmware.apputils.vim25.ServiceUtil; +import com.vmware.vim25.AboutInfo; import com.vmware.vim25.HostConnectSpec; import com.vmware.vim25.HostPortGroupSpec; import com.vmware.vim25.ManagedObjectReference; @@ -301,8 +302,10 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis HostMO hostMo = new HostMO(serviceContext, hosts[0]); HostFirewallSystemMO firewallMo = hostMo.getHostFirewallSystemMO(); if(firewallMo != null) { - firewallMo.enableRuleset("vncServer"); - firewallMo.refreshFirewall(); + if(hostMo.getHostType() == VmwareHostType.ESX) { + firewallMo.enableRuleset("vncServer"); + firewallMo.refreshFirewall(); + } } // prepare at least one network on the vswitch to enable OVF importing @@ -332,8 +335,10 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis HostMO hostMo = new HostMO(serviceContext, morHost); HostFirewallSystemMO firewallMo = hostMo.getHostFirewallSystemMO(); if(firewallMo != null) { - firewallMo.enableRuleset("vncServer"); - firewallMo.refreshFirewall(); + if(hostMo.getHostType() == VmwareHostType.ESX) { + firewallMo.enableRuleset("vncServer"); + firewallMo.refreshFirewall(); + } } String managementPortGroupName = hostMo.getPortGroupNameByNicType(HostVirtualNicType.management); @@ -354,8 +359,10 @@ public class VmwareManagerImpl implements VmwareManager, VmwareStorageMount, Lis HostMO hostMo = new HostMO(serviceContext, mor); HostFirewallSystemMO firewallMo = hostMo.getHostFirewallSystemMO(); if(firewallMo != null) { - firewallMo.enableRuleset("vncServer"); - firewallMo.refreshFirewall(); + if(hostMo.getHostType() == VmwareHostType.ESX) { + firewallMo.enableRuleset("vncServer"); + firewallMo.refreshFirewall(); + } } String managementPortGroupName = hostMo.getPortGroupNameByNicType(HostVirtualNicType.management); diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostFirewallSystemMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostFirewallSystemMO.java index 2d222eaf24d..20b6c1b1659 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostFirewallSystemMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostFirewallSystemMO.java @@ -7,6 +7,8 @@ package com.cloud.hypervisor.vmware.mo; import org.apache.log4j.Logger; import com.cloud.hypervisor.vmware.util.VmwareContext; +import com.vmware.vim25.HostFirewallDefaultPolicy; +import com.vmware.vim25.HostFirewallInfo; import com.vmware.vim25.ManagedObjectReference; public class HostFirewallSystemMO extends BaseMO { @@ -18,6 +20,14 @@ public class HostFirewallSystemMO extends BaseMO { public HostFirewallSystemMO(VmwareContext context, String morType, String morValue) { super(context, morType, morValue); + } + + public HostFirewallInfo getFirewallInfo() throws Exception { + return (HostFirewallInfo)_context.getServiceUtil().getDynamicProperty(_mor, "firewallInfo"); + } + + public void updateDefaultPolicy(HostFirewallDefaultPolicy policy) throws Exception { + _context.getService().updateDefaultPolicy(_mor, policy); } public void enableRuleset(String rulesetName) throws Exception {