From d32241ec9cbdfbe084e6361296289574ad3f17f4 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 c28f4195bb8..01801469037 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; @@ -187,6 +188,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; @@ -3282,7 +3285,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; @@ -3789,7 +3792,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); @@ -3809,8 +3834,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 16c005597f1..79e5fb48b5f 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -224,7 +224,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 {