From 3b0fb655a9b4d2cbdc0bf94d79e192696beb936e Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 4 May 2011 18:58:57 -0700 Subject: [PATCH 01/17] New hypervisor type --- api/src/com/cloud/hypervisor/Hypervisor.java | 3 +++ server/src/com/cloud/agent/manager/AgentManagerImpl.java | 2 +- utils/src/com/cloud/utils/SerialVersionUID.java | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/api/src/com/cloud/hypervisor/Hypervisor.java b/api/src/com/cloud/hypervisor/Hypervisor.java index 6fa1af3082a..15295727c4e 100644 --- a/api/src/com/cloud/hypervisor/Hypervisor.java +++ b/api/src/com/cloud/hypervisor/Hypervisor.java @@ -30,6 +30,7 @@ public class Hypervisor { Parralels, BareMetal, Simulator, + Ovm, Any; /*If you don't care about the hypervisor type*/ @@ -56,6 +57,8 @@ public class Hypervisor { return HypervisorType.BareMetal; } else if (hypervisor.equalsIgnoreCase("Simulator")) { return HypervisorType.Simulator; + } else if (hypervisor.equalsIgnoreCase("Ovm")) { + return HypervisorType.Ovm; } else if (hypervisor.equalsIgnoreCase("Any")) { return HypervisorType.Any; } else { diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index bca1e8ad0e5..1a5e74072c0 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -2766,7 +2766,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS // If this command is from a KVM agent, or from an agent that has a // null hypervisor type, don't do the CIDR check if (hypervisorType == null || hypervisorType == HypervisorType.KVM || hypervisorType == HypervisorType.VMware || hypervisorType == HypervisorType.BareMetal - || hypervisorType == HypervisorType.Simulator) { + || hypervisorType == HypervisorType.Simulator || hypervisorType == HypervisorType.Ovm) { doCidrCheck = false; } diff --git a/utils/src/com/cloud/utils/SerialVersionUID.java b/utils/src/com/cloud/utils/SerialVersionUID.java index 90be224df8c..a87ba507bdd 100755 --- a/utils/src/com/cloud/utils/SerialVersionUID.java +++ b/utils/src/com/cloud/utils/SerialVersionUID.java @@ -63,4 +63,5 @@ public interface SerialVersionUID { public static final long HttpCallException = Base | 0x23; public static final long VirtualMachineMigrationException = Base | 0x24; public static final long DiscoveredWithErrorException = Base | 0x25; + public static final long CallFailedException = Base | 0x26; } From a02db1d1ba6d6f9fff5ee570cb1d6a3de1733376 Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 9 May 2011 16:33:34 -0700 Subject: [PATCH 02/17] Enable UI support nfs for ovm primary storage --- ui/scripts/cloud.core.resource.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui/scripts/cloud.core.resource.js b/ui/scripts/cloud.core.resource.js index 84f40c0011d..5f06d6b7c24 100644 --- a/ui/scripts/cloud.core.resource.js +++ b/ui/scripts/cloud.core.resource.js @@ -1885,6 +1885,10 @@ function bindEventHandlerToDialogAddPool($dialogAddPool) { $protocolSelector.append(''); $protocolSelector.append(''); } + else if(clusterObj.hypervisortype == "Ovm") { + $protocolSelector.empty(); + $protocolSelector.append(''); + } else { $protocolSelector.empty(); } From 66184402021653725d1728ff86885c57338af5f8 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 31 May 2011 19:02:50 -0700 Subject: [PATCH 03/17] Add tempalte processor for ovm --- .../storage/template/DownloadManagerImpl.java | 4 ++ .../storage/template/RawImageProcessor.java | 70 +++++++++++++++++++ .../template/HyervisorTemplateAdapter.java | 3 +- 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 core/src/com/cloud/storage/template/RawImageProcessor.java diff --git a/core/src/com/cloud/storage/template/DownloadManagerImpl.java b/core/src/com/cloud/storage/template/DownloadManagerImpl.java index f141a2610e9..9a04315a6f0 100755 --- a/core/src/com/cloud/storage/template/DownloadManagerImpl.java +++ b/core/src/com/cloud/storage/template/DownloadManagerImpl.java @@ -796,6 +796,10 @@ public class DownloadManagerImpl implements DownloadManager { processor.configure("VMDK Processor", params); processors.add(new ComponentInfo("VMDK Processor", VmdkProcessor.class, processor)); + processor = new RawImageProcessor(); + processor.configure("Raw Image Processor", params); + processors.add(new ComponentInfo("Raw Image Processor", RawImageProcessor.class, processor)); + _processors = new Adapters("processors", processors); // Add more processors here. threadPool = Executors.newFixedThreadPool(numInstallThreads); diff --git a/core/src/com/cloud/storage/template/RawImageProcessor.java b/core/src/com/cloud/storage/template/RawImageProcessor.java new file mode 100644 index 00000000000..6cb4cde8509 --- /dev/null +++ b/core/src/com/cloud/storage/template/RawImageProcessor.java @@ -0,0 +1,70 @@ +package com.cloud.storage.template; + +import java.io.File; +import java.util.Map; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.exception.InternalErrorException; +import com.cloud.storage.StorageLayer; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.template.Processor.FormatInfo; + +@Local(value=Processor.class) +public class RawImageProcessor implements Processor { + private static final Logger s_logger = Logger.getLogger(RawImageProcessor.class); + String _name; + StorageLayer _storage; + + @Override + public boolean configure(String name, Map params) + throws ConfigurationException { + _name = name; + _storage = (StorageLayer)params.get(StorageLayer.InstanceConfigKey); + if (_storage == null) { + throw new ConfigurationException("Unable to get storage implementation"); + } + + return true; + } + + @Override + public String getName() { + return _name; + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public FormatInfo process(String templatePath, ImageFormat format, + String templateName) throws InternalErrorException { + if (format != null) { + s_logger.debug("We currently don't handle conversion from " + format + " to raw image."); + return null; + } + + String imgPath = templatePath + File.separator + templateName + "." + ImageFormat.RAW.getFileExtension(); + if (!_storage.exists(imgPath)) { + s_logger.debug("Unable to find raw image:" + imgPath); + } + FormatInfo info = new FormatInfo(); + info.format = ImageFormat.RAW; + info.filename = templateName + "." + ImageFormat.RAW.getFileExtension(); + info.size = _storage.getSize(imgPath); + info.virtualSize = info.size; + s_logger.debug("Process raw image " + info.filename + " successfully"); + return info; + } + +} diff --git a/server/src/com/cloud/template/HyervisorTemplateAdapter.java b/server/src/com/cloud/template/HyervisorTemplateAdapter.java index b487e205efd..63b9732c0ad 100644 --- a/server/src/com/cloud/template/HyervisorTemplateAdapter.java +++ b/server/src/com/cloud/template/HyervisorTemplateAdapter.java @@ -95,7 +95,8 @@ public class HyervisorTemplateAdapter extends TemplateAdapterBase implements Tem &&(!url.toLowerCase().endsWith("qcow2"))&&(!url.toLowerCase().endsWith("qcow2.zip")) &&(!url.toLowerCase().endsWith("qcow2.bz2"))&&(!url.toLowerCase().endsWith("qcow2.gz")) &&(!url.toLowerCase().endsWith("ova"))&&(!url.toLowerCase().endsWith("ova.zip")) - &&(!url.toLowerCase().endsWith("ova.bz2"))&&(!url.toLowerCase().endsWith("ova.gz"))){ + &&(!url.toLowerCase().endsWith("ova.bz2"))&&(!url.toLowerCase().endsWith("ova.gz")) + &&(!url.toLowerCase().endsWith("img"))&&(!url.toLowerCase().endsWith("raw"))){ throw new InvalidParameterValueException("Please specify a valid "+ cmd.getFormat().toLowerCase()); } From 741a19c94405145f49ca5ba8dc3d178184be1c51 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 1 Jun 2011 19:04:27 -0700 Subject: [PATCH 04/17] Fix vm.getPodId issue --- server/src/com/cloud/deploy/FirstFitPlanner.java | 2 +- server/src/com/cloud/vm/VirtualMachineManagerImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/deploy/FirstFitPlanner.java b/server/src/com/cloud/deploy/FirstFitPlanner.java index e37673d91f3..88c2bed0160 100644 --- a/server/src/com/cloud/deploy/FirstFitPlanner.java +++ b/server/src/com/cloud/deploy/FirstFitPlanner.java @@ -192,7 +192,7 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner { Pair> potentialResources = findPotentialDeploymentResources(suitableHosts, suitableVolumeStoragePools); if(potentialResources != null){ - Pod pod = _podDao.findById(vm.getPodId()); + Pod pod = _podDao.findById(host.getPodId()); Cluster cluster = _clusterDao.findById(host.getClusterId()); Map storageVolMap = potentialResources.second(); // remove the reused vol<->pool from destination, since we don't have to prepare this volume. diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index a9a5a3e0ea7..f3946e6856c 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1268,12 +1268,12 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene T rebootedVm = null; DataCenter dc = _configMgr.getZone(vm.getDataCenterId()); - HostPodVO pod = _configMgr.getPod(vm.getPodId()); Host host = _hostDao.findById(vm.getHostId()); Cluster cluster = null; if (host != null) { cluster = _configMgr.getCluster(host.getClusterId()); } + HostPodVO pod = _configMgr.getPod(host.getPodId()); DeployDestination dest = new DeployDestination(dc, pod, cluster, host); try { From 4a3c4815b92b4a5dd66a555e3591914279e50cc7 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 2 Jun 2011 14:34:34 -0700 Subject: [PATCH 05/17] Fix another vm.getPodId issue --- server/src/com/cloud/vm/UserVmManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index b24da40c397..1289c1da0e0 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -555,7 +555,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager /* Need to create the volume */ VMTemplateVO rootDiskTmplt = _templateDao.findById(vm.getTemplateId()); DataCenterVO dcVO = _dcDao.findById(vm.getDataCenterId()); - HostPodVO pod = _podDao.findById(vm.getPodId()); + HostPodVO pod = _podDao.findById(rootVolumeOfVm.getPodId()); StoragePoolVO rootDiskPool = _storagePoolDao.findById(rootVolumeOfVm.getPoolId()); ServiceOfferingVO svo = _serviceOfferingDao.findById(vm.getServiceOfferingId()); DiskOfferingVO diskVO = _diskOfferingDao.findById(volume.getDiskOfferingId()); From 53f807e28ca9978d9e4ab43fe7c6de7d72bdb059 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 2 Jun 2011 19:25:49 -0700 Subject: [PATCH 06/17] allow ovm migrate --- server/src/com/cloud/storage/listener/StoragePoolMonitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java index bb436a13cb5..e11544406da 100755 --- a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java +++ b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java @@ -67,7 +67,7 @@ public class StoragePoolMonitor implements Listener { if (cmd instanceof StartupRoutingCommand) { StartupRoutingCommand scCmd = (StartupRoutingCommand)cmd; if (scCmd.getHypervisorType() == HypervisorType.XenServer || scCmd.getHypervisorType() == HypervisorType.KVM || - scCmd.getHypervisorType() == HypervisorType.VMware) { + scCmd.getHypervisorType() == HypervisorType.VMware || scCmd.getHypervisorType() == HypervisorType.Ovm) { List pools = _poolDao.listBy(host.getDataCenterId(), host.getPodId(), host.getClusterId()); for (StoragePoolVO pool : pools) { if (!pool.getPoolType().isShared()) { From fda31e75ed31efcfb7d1177d49d3c055bf482db5 Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 7 Jun 2011 10:29:34 -0700 Subject: [PATCH 07/17] Add Ovm to hypervisor list --- server/src/com/cloud/configuration/Config.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 26a4a280d59..1c7e151aaca 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -145,7 +145,7 @@ public enum Config { SystemVMAutoReserveCapacity("Advanced", ManagementServer.class, Boolean.class, "system.vm.auto.reserve.capacity", "true", "Indicates whether or not to automatically reserver system VM standby capacity.", null), CPUOverprovisioningFactor("Advanced", ManagementServer.class, String.class, "cpu.overprovisioning.factor", "1", "Used for CPU overprovisioning calculation; available CPU will be (actualCpuCapacity * cpu.overprovisioning.factor)", null), LinkLocalIpNums("Advanced", ManagementServer.class, Integer.class, "linkLocalIp.nums", "10", "The number of link local ip that needed by domR(in power of 2)", null), - HypervisorList("Advanced", ManagementServer.class, String.class, "hypervisor.list", HypervisorType.KVM + "," + HypervisorType.XenServer + "," + HypervisorType.VMware + "," + HypervisorType.BareMetal, "The list of hypervisors that this deployment will use.", "hypervisorList"), + HypervisorList("Advanced", ManagementServer.class, String.class, "hypervisor.list", HypervisorType.KVM + "," + HypervisorType.XenServer + "," + HypervisorType.VMware + "," + HypervisorType.BareMetal + "," + HypervisorType.Ovm, "The list of hypervisors that this deployment will use.", "hypervisorList"), ManagementHostIPAdr("Advanced", ManagementServer.class, String.class, "host", "localhost", "The ip address of management server", null), ManagementNetwork("Advanced", ManagementServer.class, String.class, "management.network.cidr", null, "The cidr of management server network", null), EventPurgeDelay("Advanced", ManagementServer.class, Integer.class, "event.purge.delay", "15", "Events older than specified number days will be purged. Set this value to 0 to never delete events", null), From 7768ab4176e99a21fc4dda325533b43875b8ff22 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Tue, 7 Jun 2011 14:01:50 -0700 Subject: [PATCH 08/17] bug 10172: CloudStack UI - Add Host Dialog - when selected hypervisor is Ovm, show 2 more input fields "agent username", "agent password". --- ui/jsp/cluster.jsp | 14 ++++ ui/jsp/host.jsp | 14 ++++ ui/jsp/pod.jsp | 14 ++++ ui/jsp/resource.jsp | 14 ++++ ui/jsp/zone.jsp | 14 ++++ ui/scripts/cloud.core.pod.js | 117 ++++++++++++++++++------------ ui/scripts/cloud.core.resource.js | 77 +++++++++++++------- ui/scripts/cloud.core.zone.js | 84 +++++++++++++-------- 8 files changed, 249 insertions(+), 99 deletions(-) diff --git a/ui/jsp/cluster.jsp b/ui/jsp/cluster.jsp index 858a45c775f..ad256f2f87b 100644 --- a/ui/jsp/cluster.jsp +++ b/ui/jsp/cluster.jsp @@ -256,6 +256,20 @@ dictionary = { +
  • + + + +
  • +
  • + + + +
  • diff --git a/ui/jsp/host.jsp b/ui/jsp/host.jsp index 8a7d1aa054d..87d2d0ff264 100644 --- a/ui/jsp/host.jsp +++ b/ui/jsp/host.jsp @@ -807,6 +807,20 @@ dictionary = {
  • +
  • + + + +
  • +
  • + + + +
  • diff --git a/ui/jsp/pod.jsp b/ui/jsp/pod.jsp index d35f527b79c..84bdf4c9a4d 100644 --- a/ui/jsp/pod.jsp +++ b/ui/jsp/pod.jsp @@ -497,6 +497,20 @@ dictionary = {
  • +
  • + + + +
  • +
  • + + + +
  • diff --git a/ui/jsp/resource.jsp b/ui/jsp/resource.jsp index cc2dbc00b77..0eb9e6e4b2e 100644 --- a/ui/jsp/resource.jsp +++ b/ui/jsp/resource.jsp @@ -982,6 +982,20 @@
  • +
  • + + + +
  • +
  • + + + +
  • diff --git a/ui/jsp/zone.jsp b/ui/jsp/zone.jsp index 7166ee5c3a3..63d8533ccdb 100644 --- a/ui/jsp/zone.jsp +++ b/ui/jsp/zone.jsp @@ -464,6 +464,20 @@ dictionary = {
  • +
  • + + + +
  • +
  • + + + +
  • diff --git a/ui/scripts/cloud.core.pod.js b/ui/scripts/cloud.core.pod.js index 6b1001ad3e0..7446a7c529b 100644 --- a/ui/scripts/cloud.core.pod.js +++ b/ui/scripts/cloud.core.pod.js @@ -531,61 +531,72 @@ function bindAddClusterButton($leftmenuItem1) { function bindAddHostButton($leftmenuItem1) { var $button = $("#add_host_button"); - var dialogAddHost = $("#dialog_add_host"); - dialogAddHost.find("#cluster_select").change(function() { + var $dialogAddHost = $("#dialog_add_host"); + $dialogAddHost.find("#cluster_select").change(function() { var clusterId = $(this).val(); if(clusterId == null) return; var clusterObj = clustersUnderOnePod[clusterId]; if(clusterObj.hypervisortype == "VMware") { - $('li[input_group="vmware"]', dialogAddHost).show(); - $('li[input_group="general"]', dialogAddHost).hide(); - $('li[input_group="baremetal"]', dialogAddHost).hide(); - } else if (clusterObj.hypervisortype == "BareMetal") { - $('li[input_group="vmware"]', dialogAddHost).hide(); - $('li[input_group="general"]', dialogAddHost).show(); - $('li[input_group="baremetal"]', dialogAddHost).show(); - } else { - $('li[input_group="vmware"]', dialogAddHost).hide(); - $('li[input_group="general"]', dialogAddHost).show(); - $('li[input_group="baremetal"]', dialogAddHost).hide(); + $('li[input_group="vmware"]', $dialogAddHost).show(); + $('li[input_group="general"]', $dialogAddHost).hide(); + $('li[input_group="baremetal"]', $dialogAddHost).hide(); + $('li[input_group="Ovm"]', $dialogAddHost).hide(); + } + else if (clusterObj.hypervisortype == "BareMetal") { + $('li[input_group="baremetal"]', $dialogAddHost).show(); + $('li[input_group="general"]', $dialogAddHost).show(); + $('li[input_group="vmware"]', $dialogAddHost).hide(); + $('li[input_group="Ovm"]', $dialogAddHost).hide(); + } + else if (clusterObj.hypervisortype == "Ovm") { + $('li[input_group="Ovm"]', $dialogAddHost).show(); + $('li[input_group="general"]', $dialogAddHost).show(); + $('li[input_group="vmware"]', $dialogAddHost).hide(); + $('li[input_group="baremetal"]', $dialogAddHost).hide(); + } + else { + $('li[input_group="general"]', $dialogAddHost).show(); + $('li[input_group="vmware"]', $dialogAddHost).hide(); + $('li[input_group="baremetal"]', $dialogAddHost).hide(); + $('li[input_group="Ovm"]', $dialogAddHost).hide(); } }); $button.unbind("click").bind("click", function(event) { - dialogAddHost.find("#info_container").hide(); - dialogAddHost.find("#new_cluster_name").val(""); + $dialogAddHost.find("#info_container").hide(); + $dialogAddHost.find("#new_cluster_name").val(""); var zoneId, podId, clusterId; if(currentRightPanelJSP == "jsp/pod.jsp") { var podObj = $leftmenuItem1.data("jsonObj"); zoneId = podObj.zoneid; podId = podObj.id; - dialogAddHost.find("#zone_name").text(fromdb(podObj.zonename)); - dialogAddHost.find("#pod_name").text(fromdb(podObj.name)); + $dialogAddHost.find("#zone_name").text(fromdb(podObj.zonename)); + $dialogAddHost.find("#pod_name").text(fromdb(podObj.name)); } else if(currentRightPanelJSP == "jsp/cluster.jsp") { var clusterObj = $leftmenuItem1.data("jsonObj"); zoneId = clusterObj.zoneid; podId = clusterObj.podid; clusterId = clusterObj.id; - dialogAddHost.find("#zone_name").text(fromdb(clusterObj.zonename)); - dialogAddHost.find("#pod_name").text(fromdb(clusterObj.podname)); + $dialogAddHost.find("#zone_name").text(fromdb(clusterObj.zonename)); + $dialogAddHost.find("#pod_name").text(fromdb(clusterObj.podname)); } else if(currentRightPanelJSP == "jsp/host.jsp") { var clusterObj = $leftmenuItem1.data("clusterObj"); zoneId = clusterObj.zoneid; podId = clusterObj.podid; clusterId = clusterObj.id; - dialogAddHost.find("#zone_name").text(fromdb(clusterObj.zonename)); - dialogAddHost.find("#pod_name").text(fromdb(clusterObj.podname)); + $dialogAddHost.find("#zone_name").text(fromdb(clusterObj.zonename)); + $dialogAddHost.find("#pod_name").text(fromdb(clusterObj.podname)); } - refreshClsuterFieldInAddHostDialog(dialogAddHost, podId, clusterId); + refreshClsuterFieldInAddHostDialog($dialogAddHost, podId, clusterId); - dialogAddHost.find("#cluster_select").change(); + $dialogAddHost.find("#cluster_select").change(); - dialogAddHost + $dialogAddHost .dialog('option', 'buttons', { "Add": function() { var $thisDialog = $(this); @@ -605,17 +616,24 @@ function bindAddHostButton($leftmenuItem1) { isValid &= validateString("vCenter Password", $thisDialog.find("#host_vcenter_password"), $thisDialog.find("#host_vcenter_password_errormsg")); isValid &= validateString("vCenter Datacenter", $thisDialog.find("#host_vcenter_dc"), $thisDialog.find("#host_vcenter_dc_errormsg")); isValid &= validateString("vCenter Host", $thisDialog.find("#host_vcenter_host"), $thisDialog.find("#host_vcenter_host_errormsg")); - } else { + } + else { + //general + isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg")); + isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg")); + isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg")); + if (hypervisor == "BareMetal") { isValid &= validateString("CPU Cores", $thisDialog.find("#host_baremetal_cpucores"), $thisDialog.find("#host_baremetal_cpucores_errormsg")); isValid &= validateString("CPU", $thisDialog.find("#host_baremetal_cpu"), $thisDialog.find("#host_baremetal_cpu_errormsg")); isValid &= validateString("Memory", $thisDialog.find("#host_baremetal_memory"), $thisDialog.find("#host_baremetal_memory_errormsg")); isValid &= validateString("MAC", $thisDialog.find("#host_baremetal_mac"), $thisDialog.find("#host_baremetal_mac_errormsg")); } - isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg")); - isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg")); - isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg")); - } + else if(hypervisor == "Ovm") { + isValid &= validateString("Agent Username", $thisDialog.find("#agent_username"), $thisDialog.find("#agent_username_errormsg"), true); //optional + isValid &= validateString("Agent Password", $thisDialog.find("#agent_password"), $thisDialog.find("#agent_password_errormsg"), false); //required + } + } } if (!isValid) return; @@ -648,20 +666,8 @@ function bindAddHostButton($leftmenuItem1) { else url = hostname; array1.push("&url="+todb(url)); - } else { - if (hypervisor == "BareMetal") { - var cpuCores = trim($thisDialog.find("#host_baremetal_cpucores").val()); - array1.push("&cpunumber="+todb(cpuCores)); - - var cpuSpeed = trim($thisDialog.find("#host_baremetal_cpu").val()); - array1.push("&cpuspeed="+todb(cpuSpeed)); - - var memory = trim($thisDialog.find("#host_baremetal_memory").val()); - array1.push("&memory="+todb(memory)); - - var mac = trim($thisDialog.find("#host_baremetal_mac").val()); - array1.push("&hostmac="+todb(mac)); - } + } + else { var username = trim($thisDialog.find("#host_username").val()); array1.push("&username="+todb(username)); @@ -674,7 +680,28 @@ function bindAddHostButton($leftmenuItem1) { url = "http://" + todb(hostname); else url = hostname; - array1.push("&url="+todb(url)); + array1.push("&url="+todb(url)); + + if (hypervisor == "BareMetal") { + var cpuCores = trim($thisDialog.find("#host_baremetal_cpucores").val()); + array1.push("&cpunumber="+todb(cpuCores)); + + var cpuSpeed = trim($thisDialog.find("#host_baremetal_cpu").val()); + array1.push("&cpuspeed="+todb(cpuSpeed)); + + var memory = trim($thisDialog.find("#host_baremetal_memory").val()); + array1.push("&memory="+todb(memory)); + + var mac = trim($thisDialog.find("#host_baremetal_mac").val()); + array1.push("&hostmac="+todb(mac)); + } + else if(hypervisor == "Ovm") { + var agentUsername = $thisDialog.find("#agent_username").val(); + array1.push("&agentusername="+todb(agentUsername)); + + var agentPassword = $thisDialog.find("#agent_password").val(); + array1.push("&agentpassword="+todb(agentPassword)); + } } $.ajax({ @@ -700,7 +727,7 @@ function bindAddHostButton($leftmenuItem1) { }, error: function(XMLHttpResponse) { handleError(XMLHttpResponse, function() { - //refreshClsuterFieldInAddHostDialog($thisDialog, podId, clusterId, dialogAddHost.find("#host_hypervisor").val()); + //refreshClsuterFieldInAddHostDialog($thisDialog, podId, clusterId, $dialogAddHost.find("#host_hypervisor").val()); handleErrorInDialog(XMLHttpResponse, $thisDialog); }); } diff --git a/ui/scripts/cloud.core.resource.js b/ui/scripts/cloud.core.resource.js index 5f06d6b7c24..232f1f69eef 100644 --- a/ui/scripts/cloud.core.resource.js +++ b/ui/scripts/cloud.core.resource.js @@ -838,19 +838,31 @@ function initAddHostShortcut() { if(clusterId == null) return; var clusterObj = clustersUnderOnePod[clusterId]; - if(clusterObj.hypervisortype == "VMware") { + + if(clusterObj.hypervisortype == "VMware") { $('li[input_group="vmware"]', $dialogAddHost).show(); $('li[input_group="general"]', $dialogAddHost).hide(); $('li[input_group="baremetal"]', $dialogAddHost).hide(); - } else if (clusterObj.hypervisortype == "BareMetal") { + $('li[input_group="Ovm"]', $dialogAddHost).hide(); + } + else if (clusterObj.hypervisortype == "BareMetal") { + $('li[input_group="baremetal"]', $dialogAddHost).show(); + $('li[input_group="general"]', $dialogAddHost).show(); $('li[input_group="vmware"]', $dialogAddHost).hide(); + $('li[input_group="Ovm"]', $dialogAddHost).hide(); + } + else if (clusterObj.hypervisortype == "Ovm") { + $('li[input_group="Ovm"]', $dialogAddHost).show(); + $('li[input_group="general"]', $dialogAddHost).show(); + $('li[input_group="vmware"]', $dialogAddHost).hide(); + $('li[input_group="baremetal"]', $dialogAddHost).hide(); + } + else { $('li[input_group="general"]', $dialogAddHost).show(); - $('li[input_group="baremetal"]', $dialogAddHost).show(); - } else { $('li[input_group="vmware"]', $dialogAddHost).hide(); - $('li[input_group="general"]', $dialogAddHost).show(); $('li[input_group="baremetal"]', $dialogAddHost).hide(); - } + $('li[input_group="Ovm"]', $dialogAddHost).hide(); + } }); $("#add_host_shortcut").unbind("click").bind("click", function(event) { @@ -880,16 +892,22 @@ function initAddHostShortcut() { isValid &= validateString("vCenter Password", $thisDialog.find("#host_vcenter_password"), $thisDialog.find("#host_vcenter_password_errormsg")); isValid &= validateString("vCenter Datacenter", $thisDialog.find("#host_vcenter_dc"), $thisDialog.find("#host_vcenter_dc_errormsg")); isValid &= validateString("vCenter Host", $thisDialog.find("#host_vcenter_host"), $thisDialog.find("#host_vcenter_host_errormsg")); - } else { + } + else { + isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg")); + isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg")); + isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg")); + if (hypervisor == "BareMetal") { isValid &= validateString("CPU Cores", $thisDialog.find("#host_baremetal_cpucores"), $thisDialog.find("#host_baremetal_cpucores_errormsg")); isValid &= validateString("CPU", $thisDialog.find("#host_baremetal_cpu"), $thisDialog.find("#host_baremetal_cpu_errormsg")); isValid &= validateString("Memory", $thisDialog.find("#host_baremetal_memory"), $thisDialog.find("#host_baremetal_memory_errormsg")); isValid &= validateString("MAC", $thisDialog.find("#host_baremetal_mac"), $thisDialog.find("#host_baremetal_mac_errormsg")); - } - isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg")); - isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg")); - isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg")); + } + else if(hypervisor == "Ovm") { + isValid &= validateString("Agent Username", $thisDialog.find("#agent_username"), $thisDialog.find("#agent_username_errormsg"), true); //optional + isValid &= validateString("Agent Password", $thisDialog.find("#agent_password"), $thisDialog.find("#agent_password_errormsg"), false); //required + } } } if (!isValid) @@ -936,20 +954,8 @@ function initAddHostShortcut() { url = hostname; array1.push("&url="+todb(url)); - } else { - if (hypervisor == "BareMetal") { - var cpuCores = trim($thisDialog.find("#host_baremetal_cpucores").val()); - array1.push("&cpunumber="+todb(cpuCores)); - - var cpuSpeed = trim($thisDialog.find("#host_baremetal_cpu").val()); - array1.push("&cpuspeed="+todb(cpuSpeed)); - - var memory = trim($thisDialog.find("#host_baremetal_memory").val()); - array1.push("&memory="+todb(memory)); - - var mac = trim($thisDialog.find("#host_baremetal_mac").val()); - array1.push("&hostmac="+todb(mac)); - } + } + else { var username = trim($thisDialog.find("#host_username").val()); array1.push("&username="+todb(username)); @@ -963,6 +969,27 @@ function initAddHostShortcut() { else url = hostname; array1.push("&url="+todb(url)); + + if (hypervisor == "BareMetal") { + var cpuCores = trim($thisDialog.find("#host_baremetal_cpucores").val()); + array1.push("&cpunumber="+todb(cpuCores)); + + var cpuSpeed = trim($thisDialog.find("#host_baremetal_cpu").val()); + array1.push("&cpuspeed="+todb(cpuSpeed)); + + var memory = trim($thisDialog.find("#host_baremetal_memory").val()); + array1.push("&memory="+todb(memory)); + + var mac = trim($thisDialog.find("#host_baremetal_mac").val()); + array1.push("&hostmac="+todb(mac)); + } + else if(hypervisor == "Ovm") { + var agentUsername = $thisDialog.find("#agent_username").val(); + array1.push("&agentusername="+todb(agentUsername)); + + var agentPassword = $thisDialog.find("#agent_password").val(); + array1.push("&agentpassword="+todb(agentPassword)); + } } $.ajax({ diff --git a/ui/scripts/cloud.core.zone.js b/ui/scripts/cloud.core.zone.js index 0069892d483..7fff894aaab 100644 --- a/ui/scripts/cloud.core.zone.js +++ b/ui/scripts/cloud.core.zone.js @@ -699,19 +699,31 @@ function bindAddHostButtonOnZonePage($button, zoneId, zoneName) { if(clusterId == null) return; var clusterObj = clustersUnderOnePod[clusterId]; - if(clusterObj.hypervisortype == "VMware") { + + if(clusterObj.hypervisortype == "VMware") { $('li[input_group="vmware"]', $dialogAddHost).show(); $('li[input_group="general"]', $dialogAddHost).hide(); $('li[input_group="baremetal"]', $dialogAddHost).hide(); - } else if (clusterObj.hypervisortype == "BareMetal") { - $('li[input_group="vmware"]', $dialogAddHost).hide(); - $('li[input_group="general"]', $dialogAddHost).show(); - $('li[input_group="baremetal"]', $dialogAddHost).show(); - } else { - $('li[input_group="vmware"]', $dialogAddHost).hide(); - $('li[input_group="general"]', $dialogAddHost).show(); - $('li[input_group="baremetal"]', $dialogAddHost).hide(); + $('li[input_group="Ovm"]', $dialogAddHost).hide(); } + else if (clusterObj.hypervisortype == "BareMetal") { + $('li[input_group="baremetal"]', $dialogAddHost).show(); + $('li[input_group="general"]', $dialogAddHost).show(); + $('li[input_group="vmware"]', $dialogAddHost).hide(); + $('li[input_group="Ovm"]', $dialogAddHost).hide(); + } + else if (clusterObj.hypervisortype == "Ovm") { + $('li[input_group="Ovm"]', $dialogAddHost).show(); + $('li[input_group="general"]', $dialogAddHost).show(); + $('li[input_group="vmware"]', $dialogAddHost).hide(); + $('li[input_group="baremetal"]', $dialogAddHost).hide(); + } + else { + $('li[input_group="general"]', $dialogAddHost).show(); + $('li[input_group="vmware"]', $dialogAddHost).hide(); + $('li[input_group="baremetal"]', $dialogAddHost).hide(); + $('li[input_group="Ovm"]', $dialogAddHost).hide(); + } }); $button.unbind("click").bind("click", function(event) { @@ -742,17 +754,23 @@ function bindAddHostButtonOnZonePage($button, zoneId, zoneName) { isValid &= validateString("vCenter Password", $thisDialog.find("#host_vcenter_password"), $thisDialog.find("#host_vcenter_password_errormsg")); isValid &= validateString("vCenter Datacenter", $thisDialog.find("#host_vcenter_dc"), $thisDialog.find("#host_vcenter_dc_errormsg")); isValid &= validateString("vCenter Host", $thisDialog.find("#host_vcenter_host"), $thisDialog.find("#host_vcenter_host_errormsg")); - } else { + } + else { + isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg")); + isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg")); + isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg")); + if (hypervisor == "BareMetal") { isValid &= validateString("CPU Cores", $thisDialog.find("#host_baremetal_cpucores"), $thisDialog.find("#host_baremetal_cpucores_errormsg")); isValid &= validateString("CPU", $thisDialog.find("#host_baremetal_cpu"), $thisDialog.find("#host_baremetal_cpu_errormsg")); isValid &= validateString("Memory", $thisDialog.find("#host_baremetal_memory"), $thisDialog.find("#host_baremetal_memory_errormsg")); isValid &= validateString("MAC", $thisDialog.find("#host_baremetal_mac"), $thisDialog.find("#host_baremetal_mac_errormsg")); } - isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg")); - isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg")); - isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg")); - } + else if(hypervisor == "Ovm") { + isValid &= validateString("Agent Username", $thisDialog.find("#agent_username"), $thisDialog.find("#agent_username_errormsg"), true); //optional + isValid &= validateString("Agent Password", $thisDialog.find("#agent_password"), $thisDialog.find("#agent_password_errormsg"), false); //required + } + } } if (!isValid) return; @@ -797,21 +815,8 @@ function bindAddHostButtonOnZonePage($button, zoneId, zoneName) { url = hostname; array1.push("&url="+todb(url)); - } else { - if (hypervisor == "BareMetal") { - var cpuCores = trim($thisDialog.find("#host_baremetal_cpucores").val()); - array1.push("&cpunumber="+todb(cpuCores)); - - var cpuSpeed = trim($thisDialog.find("#host_baremetal_cpu").val()); - array1.push("&cpuspeed="+todb(cpuSpeed)); - - var memory = trim($thisDialog.find("#host_baremetal_memory").val()); - array1.push("&memory="+todb(memory)); - - var mac = trim($thisDialog.find("#host_baremetal_mac").val()); - array1.push("&hostmac="+todb(mac)); - } - + } + else { var username = trim($thisDialog.find("#host_username").val()); array1.push("&username="+todb(username)); @@ -825,6 +830,27 @@ function bindAddHostButtonOnZonePage($button, zoneId, zoneName) { else url = hostname; array1.push("&url="+todb(url)); + + if (hypervisor == "BareMetal") { + var cpuCores = trim($thisDialog.find("#host_baremetal_cpucores").val()); + array1.push("&cpunumber="+todb(cpuCores)); + + var cpuSpeed = trim($thisDialog.find("#host_baremetal_cpu").val()); + array1.push("&cpuspeed="+todb(cpuSpeed)); + + var memory = trim($thisDialog.find("#host_baremetal_memory").val()); + array1.push("&memory="+todb(memory)); + + var mac = trim($thisDialog.find("#host_baremetal_mac").val()); + array1.push("&hostmac="+todb(mac)); + } + else if(hypervisor == "Ovm") { + var agentUsername = $thisDialog.find("#agent_username").val(); + array1.push("&agentusername="+todb(agentUsername)); + + var agentPassword = $thisDialog.find("#agent_password").val(); + array1.push("&agentpassword="+todb(agentPassword)); + } } $.ajax({ From 379cbc1d55a29702fdd13dbd5b38d92f28929c2c Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 8 Jun 2011 10:25:15 -0700 Subject: [PATCH 09/17] Store all parameters of url call to BaseCmd.fullUrlParams so there will be no changes in future API because all parameters can be retrieve from API command itself --- api/src/com/cloud/api/BaseCmd.java | 15 ++++++++++++--- .../com/cloud/agent/manager/AgentManagerImpl.java | 2 +- server/src/com/cloud/api/ApiServer.java | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/api/src/com/cloud/api/BaseCmd.java b/api/src/com/cloud/api/BaseCmd.java index ca2dbca4423..d8231708661 100755 --- a/api/src/com/cloud/api/BaseCmd.java +++ b/api/src/com/cloud/api/BaseCmd.java @@ -89,7 +89,8 @@ public abstract class BaseCmd { private static final DateFormat _outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); private Object _responseObject = null; - + private Map fullUrlParams; + @Parameter(name="response", type=CommandType.STRING) private String responseType; @@ -112,7 +113,7 @@ public abstract class BaseCmd { public static LoadBalancingRulesService _lbService; public static RemoteAccessVpnService _ravService; public static BareMetalVmService _bareMetalVmService; - + static void setComponents(ResponseGenerator generator) { ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name); @@ -546,5 +547,13 @@ public abstract class BaseCmd { (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) || (accountType == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) || (accountType == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN)); - } + } + + public void setFullUrlParams(Map map) { + this.fullUrlParams = map; + } + + public Map getFullUrlParams() { + return this.fullUrlParams; + } } diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 1a5e74072c0..3ab34e9c04f 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -815,7 +815,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS allocationState = Host.HostAllocationState.Enabled.toString(); } - return discoverHostsFull(dcId, podId, clusterId, clusterName, url, username, password, cmd.getHypervisor(), hostTags, bareMetalParams, allocationState); + return discoverHostsFull(dcId, podId, clusterId, clusterName, url, username, password, cmd.getHypervisor(), hostTags, cmd.getFullUrlParams(), allocationState); } @Override diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 92b411144ad..a787fe2f77e 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -342,7 +342,7 @@ public class ApiServer implements HttpRequestHandler { if (cmdClassName != null) { Class cmdClass = Class.forName(cmdClassName); BaseCmd cmdObj = (BaseCmd) cmdClass.newInstance(); - + cmdObj.setFullUrlParams(paramMap); cmdObj.setResponseType(responseType); // This is where the command is either serialized, or directly dispatched response = queueCommand(cmdObj, paramMap); From 5f5509ac00cf284f58dc35579c1f8496722dcf3b Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 10 Jun 2011 14:35:46 -0700 Subject: [PATCH 10/17] use isHvm of template to decide to boot a HVM vm --- .../com/cloud/hypervisor/XenServerGuru.java | 2 +- .../src/com/cloud/vm/UserVmManagerImpl.java | 26 ++++++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/server/src/com/cloud/hypervisor/XenServerGuru.java b/server/src/com/cloud/hypervisor/XenServerGuru.java index 0702c4f9b42..a72e61bcf0d 100644 --- a/server/src/com/cloud/hypervisor/XenServerGuru.java +++ b/server/src/com/cloud/hypervisor/XenServerGuru.java @@ -46,7 +46,7 @@ public class XenServerGuru extends HypervisorGuruBase implements HypervisorGuru @Override public VirtualMachineTO implement(VirtualMachineProfile vm) { BootloaderType bt = BootloaderType.PyGrub; - if (vm.getBootLoaderType() != null) { + if (vm.getBootLoaderType() == BootloaderType.CD) { bt = vm.getBootLoaderType(); } VirtualMachineTO to = toVirtualMachineTO(vm); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 1289c1da0e0..5905171d162 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2473,13 +2473,15 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (owner.getState() == Account.State.disabled) { throw new PermissionDeniedException("The owner of " + vm + " is disabled: " + vm.getAccountId()); } - - VirtualMachineTemplate template = profile.getTemplate(); + if (vm.getIsoId() != null) { - template = _templateDao.findById(vm.getIsoId()); - } - if (template != null && template.getFormat() == ImageFormat.ISO && vm.getIsoId() != null) { - String isoPath = null; + String isoPath = null; + + VirtualMachineTemplate template = _templateDao.findById(vm.getIsoId()); + if (template == null || template.getFormat() != ImageFormat.ISO) { + throw new CloudRuntimeException("Can not find ISO in vm_template table for id " + vm.getIsoId()); + } + Pair isoPathPair = _storageMgr.getAbsoluteIsoPath(template.getId(), vm.getDataCenterId()); if (isoPathPair == null) { s_logger.warn("Couldn't get absolute iso path"); @@ -2487,6 +2489,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } else { isoPath = isoPathPair.first(); } + if (template.isBootable()) { profile.setBootLoaderType(BootloaderType.CD); } @@ -2500,12 +2503,21 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager iso.setDeviceId(3); profile.addDisk(iso); } else { + VirtualMachineTemplate template = profile.getTemplate(); /* create a iso placeholder */ VolumeTO iso = new VolumeTO(profile.getId(), Volume.Type.ISO, StoragePoolType.ISO, null, template.getName(), null, null, 0, null); iso.setDeviceId(3); profile.addDisk(iso); + + if (template != null) { + if (template.isRequiresHvm()) { + profile.setBootLoaderType(BootloaderType.HVM); + } else { + profile.setBootLoaderType(BootloaderType.PyGrub); + } + } } - + return true; } From 9b2350d074c0f7256b084af1df03b2a28a275a23 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 10 Jun 2011 15:17:35 -0700 Subject: [PATCH 11/17] CloudStack UI - Add Template dialog- When hypervisor type is "Ovm", format field should be populated with "RAW". --- ui/scripts/cloud.core.template.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/scripts/cloud.core.template.js b/ui/scripts/cloud.core.template.js index 9206cbbf7b9..65e121b0884 100644 --- a/ui/scripts/cloud.core.template.js +++ b/ui/scripts/cloud.core.template.js @@ -84,7 +84,8 @@ function afterLoadTemplateJSP() { formatSelect.append(""); else if(selectedHypervisorType == "BareMetal") formatSelect.append(""); - + else if(selectedHypervisorType == "Ovm") + formatSelect.append(""); return false; }); From 9f03d4fb90dbfcf5a5ff74ea2fd95821156faad8 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 10 Jun 2011 18:05:14 -0700 Subject: [PATCH 12/17] include cloud-ovm.jar in spec file --- cloud.spec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cloud.spec b/cloud.spec index 0a903e5bd88..2c2b80ff32f 100644 --- a/cloud.spec +++ b/cloud.spec @@ -597,7 +597,7 @@ fi %dir %attr(0770,root,root) %{_localstatedir}/log/%{name}/agent %files premium-agent -%{_javadir}/cloud-agent-extras.jar +#%{_javadir}/cloud-agent-extras.jar %attr(0755,root,root) %{_bindir}/mycloud-setup-agent %files console-proxy @@ -635,6 +635,7 @@ fi %{_javadir}/%{name}-core-extras.jar %{_javadir}/%{name}-server-extras.jar %{_javadir}/%{name}-vmware-base.jar +%{_javadir}/%{name}-ovm.jar # maintain the following list in sync with files agent-scripts %{_libdir}/%{name}/agent/premium-scripts/* %{_sysconfdir}/%{name}/management/commands-ext.properties From b406d1e1852956844a3939a292d7de1637b00575 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 10 Jun 2011 18:37:13 -0700 Subject: [PATCH 13/17] Add cloud-ovm.jar to classpath --- wscript_configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wscript_configure b/wscript_configure index 25933de6dc8..832a9a47540 100644 --- a/wscript_configure +++ b/wscript_configure @@ -252,7 +252,7 @@ depsclasspath = [ in_javadir(_basename(x)) for x in _glob(_join(conf.srcdir,"dep conf.env.DEPSCLASSPATH = pathsep.join(depsclasspath) # the MS classpath points to JARs required to run the management server -msclasspath = [ in_javadir("%s-%s.jar"%(conf.env.PACKAGE,x)) for x in "utils api core server server-extras core-extras vmware-base".split() ] +msclasspath = [ in_javadir("%s-%s.jar"%(conf.env.PACKAGE,x)) for x in "utils api core server server-extras core-extras vmware-base ovm".split() ] conf.env.MSCLASSPATH = pathsep.join(msclasspath) # the agent and simulator classpaths point to JARs required to run these two applications From c400253b54303769cb82aa1e6bf97bfd92bde9fd Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 14 Jun 2011 14:41:34 -0700 Subject: [PATCH 14/17] Ignore hvm field in template --- server/src/com/cloud/vm/UserVmManagerImpl.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 5905171d162..59aebea50cd 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2508,14 +2508,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager VolumeTO iso = new VolumeTO(profile.getId(), Volume.Type.ISO, StoragePoolType.ISO, null, template.getName(), null, null, 0, null); iso.setDeviceId(3); profile.addDisk(iso); - - if (template != null) { - if (template.isRequiresHvm()) { - profile.setBootLoaderType(BootloaderType.HVM); - } else { - profile.setBootLoaderType(BootloaderType.PyGrub); - } - } } return true; From c6fba0fd42b4b4b0615329debe48218784ec0f99 Mon Sep 17 00:00:00 2001 From: frank Date: Fri, 5 Aug 2011 17:46:29 -0700 Subject: [PATCH 15/17] Bug 8966 - Oracle VM (OVM) support OCFS2 support -- prepare OCFS2 nodes --- api/src/com/cloud/storage/Storage.java | 3 ++- core/src/com/cloud/agent/Listener.java | 2 +- .../cloud/capacity/ComputeCapacityListener.java | 0 .../cloud/capacity/StorageCapacityListener.java | 0 .../cluster/ClusterAsyncExectuionListener.java | 1 - .../configuration/DefaultComponentLibrary.java | 2 ++ .../cloud/consoleproxy/ConsoleProxyListener.java | 0 server/src/com/cloud/dc/ClusterDetailsDaoImpl.java | 1 + .../kvm/discoverer/KvmServerDiscoverer.java | 0 .../xen/discoverer/XcpServerDiscoverer.java | 3 +-- .../com/cloud/network/SshKeysDistriMonitor.java | 0 server/src/com/cloud/network/ovs/OvsListener.java | 1 - .../com/cloud/network/ovs/OvsTunnelListener.java | 1 - .../network/security/SecurityGroupListener.java | 1 - .../cloud/storage/LocalStoragePoolListener.java | 1 - .../src/com/cloud/storage/StorageManagerImpl.java | 14 +++++++++++++- .../cloud/storage/download/DownloadListener.java | 0 .../cloud/storage/listener/StoragePoolMonitor.java | 9 +++++++++ .../storage/listener/StorageSyncListener.java | 3 +-- .../secondary/SecondaryStorageListener.java | 0 .../com/cloud/storage/upload/UploadListener.java | 1 - 21 files changed, 30 insertions(+), 13 deletions(-) mode change 100644 => 100755 api/src/com/cloud/storage/Storage.java mode change 100644 => 100755 server/src/com/cloud/capacity/ComputeCapacityListener.java mode change 100644 => 100755 server/src/com/cloud/capacity/StorageCapacityListener.java mode change 100644 => 100755 server/src/com/cloud/cluster/ClusterAsyncExectuionListener.java mode change 100644 => 100755 server/src/com/cloud/configuration/DefaultComponentLibrary.java mode change 100644 => 100755 server/src/com/cloud/consoleproxy/ConsoleProxyListener.java mode change 100644 => 100755 server/src/com/cloud/dc/ClusterDetailsDaoImpl.java mode change 100644 => 100755 server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java mode change 100644 => 100755 server/src/com/cloud/network/SshKeysDistriMonitor.java mode change 100644 => 100755 server/src/com/cloud/network/ovs/OvsListener.java mode change 100644 => 100755 server/src/com/cloud/network/ovs/OvsTunnelListener.java mode change 100644 => 100755 server/src/com/cloud/network/security/SecurityGroupListener.java mode change 100644 => 100755 server/src/com/cloud/storage/LocalStoragePoolListener.java mode change 100644 => 100755 server/src/com/cloud/storage/download/DownloadListener.java mode change 100644 => 100755 server/src/com/cloud/storage/secondary/SecondaryStorageListener.java diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java old mode 100644 new mode 100755 index 66b4c1c0a8e..01077426268 --- a/api/src/com/cloud/storage/Storage.java +++ b/api/src/com/cloud/storage/Storage.java @@ -96,7 +96,8 @@ public class Storage { LVM(false), // XenServer local LVM SR SharedMountPoint(true), VMFS(true), // VMware VMFS storage - PreSetup(true); // for XenServer, Storage Pool is set up by customers. + PreSetup(true), // for XenServer, Storage Pool is set up by customers. + OCFS2(true); boolean shared; diff --git a/core/src/com/cloud/agent/Listener.java b/core/src/com/cloud/agent/Listener.java index 6b5619cdf56..4f330fcad86 100755 --- a/core/src/com/cloud/agent/Listener.java +++ b/core/src/com/cloud/agent/Listener.java @@ -89,7 +89,7 @@ public interface Listener { * @param state the current state of the agent. */ boolean processDisconnect(long agentId, Status state); - + /** * If this Listener is passed to the send() method, this method * is called by AgentManager after processing an answer diff --git a/server/src/com/cloud/capacity/ComputeCapacityListener.java b/server/src/com/cloud/capacity/ComputeCapacityListener.java old mode 100644 new mode 100755 diff --git a/server/src/com/cloud/capacity/StorageCapacityListener.java b/server/src/com/cloud/capacity/StorageCapacityListener.java old mode 100644 new mode 100755 diff --git a/server/src/com/cloud/cluster/ClusterAsyncExectuionListener.java b/server/src/com/cloud/cluster/ClusterAsyncExectuionListener.java old mode 100644 new mode 100755 index 61a1272b757..b435ea5504f --- a/server/src/com/cloud/cluster/ClusterAsyncExectuionListener.java +++ b/server/src/com/cloud/cluster/ClusterAsyncExectuionListener.java @@ -76,6 +76,5 @@ public class ClusterAsyncExectuionListener implements Listener { public int getTimeout() { return -1; } - } diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java old mode 100644 new mode 100755 index 59989d90381..d2dc34fd055 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -105,6 +105,7 @@ import com.cloud.network.security.dao.VmRulesetLogDaoImpl; import com.cloud.network.vpn.RemoteAccessVpnManagerImpl; import com.cloud.offerings.dao.NetworkOfferingDaoImpl; import com.cloud.service.dao.ServiceOfferingDaoImpl; +import com.cloud.storage.OCFS2ManagerImpl; import com.cloud.storage.StorageManagerImpl; import com.cloud.storage.dao.DiskOfferingDaoImpl; import com.cloud.storage.dao.GuestOSCategoryDaoImpl; @@ -319,6 +320,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com addManager("VirtualMachineManager", ClusteredVirtualMachineManagerImpl.class); addManager("HypervisorGuruManager", HypervisorGuruManagerImpl.class); addManager("ClusterFenceManager", ClusterFenceManagerImpl.class); + addManager("OCFS2Manager", OCFS2ManagerImpl.class); ComponentInfo info = addManager("ConsoleProxyManager", ConsoleProxyManagerImpl.class); info.addParameter("consoleproxy.sslEnabled", "true"); diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyListener.java b/server/src/com/cloud/consoleproxy/ConsoleProxyListener.java old mode 100644 new mode 100755 diff --git a/server/src/com/cloud/dc/ClusterDetailsDaoImpl.java b/server/src/com/cloud/dc/ClusterDetailsDaoImpl.java old mode 100644 new mode 100755 index a06c207e004..d93d8b9dbc5 --- a/server/src/com/cloud/dc/ClusterDetailsDaoImpl.java +++ b/server/src/com/cloud/dc/ClusterDetailsDaoImpl.java @@ -53,6 +53,7 @@ public class ClusterDetailsDaoImpl extends GenericDaoBase findDetails(long clusterId) { diff --git a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java old mode 100644 new mode 100755 diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index 435297c2c6a..a56fa09b1d6 100755 --- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -575,6 +575,5 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L @Override public boolean processTimeout(long agentId, long seq) { return false; - } - + } } diff --git a/server/src/com/cloud/network/SshKeysDistriMonitor.java b/server/src/com/cloud/network/SshKeysDistriMonitor.java old mode 100644 new mode 100755 diff --git a/server/src/com/cloud/network/ovs/OvsListener.java b/server/src/com/cloud/network/ovs/OvsListener.java old mode 100644 new mode 100755 index 58455984ced..beea162db75 --- a/server/src/com/cloud/network/ovs/OvsListener.java +++ b/server/src/com/cloud/network/ovs/OvsListener.java @@ -181,5 +181,4 @@ public class OvsListener implements Listener { public boolean processTimeout(long agentId, long seq) { return true; } - } diff --git a/server/src/com/cloud/network/ovs/OvsTunnelListener.java b/server/src/com/cloud/network/ovs/OvsTunnelListener.java old mode 100644 new mode 100755 index 36d3dc6cacb..f8aefecb3f8 --- a/server/src/com/cloud/network/ovs/OvsTunnelListener.java +++ b/server/src/com/cloud/network/ovs/OvsTunnelListener.java @@ -130,5 +130,4 @@ public class OvsTunnelListener implements Listener { // TODO Auto-generated method stub return true; } - } diff --git a/server/src/com/cloud/network/security/SecurityGroupListener.java b/server/src/com/cloud/network/security/SecurityGroupListener.java old mode 100644 new mode 100755 index 9b0c94ab259..59eeecd13e8 --- a/server/src/com/cloud/network/security/SecurityGroupListener.java +++ b/server/src/com/cloud/network/security/SecurityGroupListener.java @@ -152,5 +152,4 @@ public class SecurityGroupListener implements Listener { public boolean processTimeout(long agentId, long seq) { return true; } - } diff --git a/server/src/com/cloud/storage/LocalStoragePoolListener.java b/server/src/com/cloud/storage/LocalStoragePoolListener.java old mode 100644 new mode 100755 index da7e045e62c..6f290c158c9 --- a/server/src/com/cloud/storage/LocalStoragePoolListener.java +++ b/server/src/com/cloud/storage/LocalStoragePoolListener.java @@ -134,5 +134,4 @@ public class LocalStoragePoolListener implements Listener { public boolean processTimeout(long agentId, long seq) { return false; } - } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index de95531fb71..1d18cadfa66 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -279,6 +279,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag protected StoragePoolWorkDao _storagePoolWorkDao; @Inject protected HypervisorGuruManager _hvGuruMgr; + + @Inject + protected OCFS2Manager _ocfs2Mgr; @Inject(adapter = StoragePoolAllocator.class) protected Adapters _storagePoolAllocators; @@ -1109,6 +1112,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag pool = new StoragePoolVO(StoragePoolType.ISO, storageHost, port, hostPath); } else if (scheme.equalsIgnoreCase("vmfs")) { pool = new StoragePoolVO(StoragePoolType.VMFS, "VMFS datastore: " + hostPath, 0, hostPath); + } else if (scheme.equalsIgnoreCase("ocfs2")) { + port = 7777; + pool = new StoragePoolVO(StoragePoolType.OCFS2, "clustered", port, hostPath); } else { s_logger.warn("Unable to figure out the scheme for URI: " + uri); throw new IllegalArgumentException("Unable to figure out the scheme for URI: " + uri); @@ -1156,6 +1162,12 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag pool.setStatus(StoragePoolStatus.Up); pool = _storagePoolDao.persist(pool, details); + if (pool.getPoolType() == StoragePoolType.OCFS2 && !_ocfs2Mgr.prepareNodes(allHosts, pool, cmd.getFullUrlParams())) { + s_logger.warn("Can not create storage pool " + pool + " on cluster " + clusterId); + _storagePoolDao.expunge(pool.getId()); + return null; + } + boolean success = false; for (HostVO h : allHosts) { success = createStoragePool(h.getId(), pool); @@ -1348,7 +1360,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag s_logger.debug("creating pool " + pool.getName() + " on host " + hostId); if (pool.getPoolType() != StoragePoolType.NetworkFilesystem && pool.getPoolType() != StoragePoolType.Filesystem && pool.getPoolType() != StoragePoolType.IscsiLUN && pool.getPoolType() != StoragePoolType.Iscsi && pool.getPoolType() != StoragePoolType.VMFS && pool.getPoolType() != StoragePoolType.SharedMountPoint - && pool.getPoolType() != StoragePoolType.PreSetup) { + && pool.getPoolType() != StoragePoolType.PreSetup && pool.getPoolType() != StoragePoolType.OCFS2) { s_logger.warn(" Doesn't support storage pool type " + pool.getPoolType()); return false; } diff --git a/server/src/com/cloud/storage/download/DownloadListener.java b/server/src/com/cloud/storage/download/DownloadListener.java old mode 100644 new mode 100755 diff --git a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java index e11544406da..045789bb32c 100755 --- a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java +++ b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java @@ -32,14 +32,18 @@ import com.cloud.exception.ConnectionException; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.storage.OCFS2Manager; import com.cloud.storage.StorageManagerImpl; import com.cloud.storage.StoragePoolVO; +import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.dao.StoragePoolDao; +import com.cloud.utils.component.Inject; public class StoragePoolMonitor implements Listener { private static final Logger s_logger = Logger.getLogger(StoragePoolMonitor.class); private final StorageManagerImpl _storageManager; private final StoragePoolDao _poolDao; + @Inject OCFS2Manager _ocfs2Mgr; public StoragePoolMonitor(StorageManagerImpl mgr, StoragePoolDao poolDao) { this._storageManager = mgr; @@ -73,6 +77,11 @@ public class StoragePoolMonitor implements Listener { if (!pool.getPoolType().isShared()) { continue; } + + if (pool.getPoolType() == StoragePoolType.OCFS2 && !_ocfs2Mgr.prepareNodes(pool.getClusterId())) { + throw new ConnectionException(true, "Unable to prepare OCFS2 nodes for pool " + pool.getId()); + } + Long hostId = host.getId(); s_logger.debug("Host " + hostId + " connected, sending down storage pool information ..."); try { diff --git a/server/src/com/cloud/storage/listener/StorageSyncListener.java b/server/src/com/cloud/storage/listener/StorageSyncListener.java index 9cf1be2ad89..e8b2c8b0fda 100755 --- a/server/src/com/cloud/storage/listener/StorageSyncListener.java +++ b/server/src/com/cloud/storage/listener/StorageSyncListener.java @@ -79,6 +79,5 @@ public class StorageSyncListener implements Listener { @Override public int getTimeout() { return -1; - } - + } } diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageListener.java b/server/src/com/cloud/storage/secondary/SecondaryStorageListener.java old mode 100644 new mode 100755 diff --git a/server/src/com/cloud/storage/upload/UploadListener.java b/server/src/com/cloud/storage/upload/UploadListener.java index 0ccbf6f0ebc..44b2591006f 100755 --- a/server/src/com/cloud/storage/upload/UploadListener.java +++ b/server/src/com/cloud/storage/upload/UploadListener.java @@ -446,5 +446,4 @@ public class UploadListener implements Listener { public void setCurrState(Status uploadState) { this.currState = getState(currState.toString()); } - } From c881bae64ef28f32b015c343bed6ddda7f41dedd Mon Sep 17 00:00:00 2001 From: frank Date: Mon, 8 Aug 2011 13:30:15 -0700 Subject: [PATCH 16/17] Bug 8966 - Oracle VM (OVM) support OCFS2 support -- use ComponentLocater to load OCFS2 manager --- server/src/com/cloud/host/dao/HostDao.java | 4 +++- server/src/com/cloud/host/dao/HostDaoImpl.java | 17 +++++++++++++++++ .../storage/listener/StoragePoolMonitor.java | 7 ++++++- 3 files changed, 26 insertions(+), 2 deletions(-) mode change 100644 => 100755 server/src/com/cloud/host/dao/HostDao.java mode change 100644 => 100755 server/src/com/cloud/host/dao/HostDaoImpl.java diff --git a/server/src/com/cloud/host/dao/HostDao.java b/server/src/com/cloud/host/dao/HostDao.java old mode 100644 new mode 100755 index f7e4bef5d66..ff27b84e5ae --- a/server/src/com/cloud/host/dao/HostDao.java +++ b/server/src/com/cloud/host/dao/HostDao.java @@ -165,5 +165,7 @@ public interface HostDao extends GenericDao { long countRoutingHostsByDataCenter(long dcId); - List listSecondaryStorageHosts(long dataCenterId); + List listSecondaryStorageHosts(long dataCenterId); + + List listByInAllStatus(Type type, Long clusterId, Long podId, long dcId); } diff --git a/server/src/com/cloud/host/dao/HostDaoImpl.java b/server/src/com/cloud/host/dao/HostDaoImpl.java old mode 100644 new mode 100755 index 6d95cb5e68a..5c8515f14e0 --- a/server/src/com/cloud/host/dao/HostDaoImpl.java +++ b/server/src/com/cloud/host/dao/HostDaoImpl.java @@ -332,6 +332,23 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao return listBy(sc); } + @Override + public List listByInAllStatus(Host.Type type, Long clusterId, Long podId, long dcId) { + SearchCriteria sc = TypePodDcStatusSearch.create(); + if ( type != null ) { + sc.setParameters("type", type.toString()); + } + if (clusterId != null) { + sc.setParameters("cluster", clusterId); + } + if (podId != null ) { + sc.setParameters("pod", podId); + } + sc.setParameters("dc", dcId); + + return listBy(sc); + } + @Override public List listBy(Long clusterId, Long podId, long dcId) { SearchCriteria sc = TypePodDcStatusSearch.create(); diff --git a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java index 045789bb32c..5652915c214 100755 --- a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java +++ b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java @@ -32,22 +32,27 @@ import com.cloud.exception.ConnectionException; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.server.ManagementService; import com.cloud.storage.OCFS2Manager; import com.cloud.storage.StorageManagerImpl; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.dao.StoragePoolDao; +import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; public class StoragePoolMonitor implements Listener { private static final Logger s_logger = Logger.getLogger(StoragePoolMonitor.class); private final StorageManagerImpl _storageManager; private final StoragePoolDao _poolDao; - @Inject OCFS2Manager _ocfs2Mgr; + OCFS2Manager _ocfs2Mgr; public StoragePoolMonitor(StorageManagerImpl mgr, StoragePoolDao poolDao) { this._storageManager = mgr; this._poolDao = poolDao; + + ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name); + this._ocfs2Mgr = locator.getManager(OCFS2Manager.class); } From c89425325b6020cc1cc3985979158a057150c66d Mon Sep 17 00:00:00 2001 From: frank Date: Mon, 8 Aug 2011 13:32:27 -0700 Subject: [PATCH 17/17] Bug 8966 - Oracle VM (OVM) support OCFS2 support -- add files --- .../agent/api/PrepareOCFS2NodesCommand.java | 28 ++++ .../src/com/cloud/storage/OCFS2Manager.java | 15 ++ .../com/cloud/storage/OCFS2ManagerImpl.java | 140 ++++++++++++++++++ 3 files changed, 183 insertions(+) create mode 100755 api/src/com/cloud/agent/api/PrepareOCFS2NodesCommand.java create mode 100755 server/src/com/cloud/storage/OCFS2Manager.java create mode 100755 server/src/com/cloud/storage/OCFS2ManagerImpl.java diff --git a/api/src/com/cloud/agent/api/PrepareOCFS2NodesCommand.java b/api/src/com/cloud/agent/api/PrepareOCFS2NodesCommand.java new file mode 100755 index 00000000000..11a57448770 --- /dev/null +++ b/api/src/com/cloud/agent/api/PrepareOCFS2NodesCommand.java @@ -0,0 +1,28 @@ +package com.cloud.agent.api; + +import java.util.List; + +import com.cloud.utils.Ternary; + +public class PrepareOCFS2NodesCommand extends Command { + List> nodes; + String clusterName; + + @Override + public boolean executeInSequence() { + return true; + } + + public PrepareOCFS2NodesCommand(String clusterName, List> nodes) { + this.nodes = nodes; + this.clusterName = clusterName; + } + + public List> getNodes() { + return nodes; + } + + public String getClusterName() { + return clusterName; + } +} diff --git a/server/src/com/cloud/storage/OCFS2Manager.java b/server/src/com/cloud/storage/OCFS2Manager.java new file mode 100755 index 00000000000..ed38f89ca85 --- /dev/null +++ b/server/src/com/cloud/storage/OCFS2Manager.java @@ -0,0 +1,15 @@ +package com.cloud.storage; + +import java.util.List; +import java.util.Map; + +import com.cloud.host.HostVO; +import com.cloud.utils.component.Manager; + +public interface OCFS2Manager extends Manager { + static final String CLUSTER_NAME = "clusterName"; + + boolean prepareNodes(List hosts, StoragePool pool, Map params); + + boolean prepareNodes(Long clusterId); +} diff --git a/server/src/com/cloud/storage/OCFS2ManagerImpl.java b/server/src/com/cloud/storage/OCFS2ManagerImpl.java new file mode 100755 index 00000000000..8f9391ca456 --- /dev/null +++ b/server/src/com/cloud/storage/OCFS2ManagerImpl.java @@ -0,0 +1,140 @@ +package com.cloud.storage; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.PrepareOCFS2NodesCommand; +import com.cloud.dc.ClusterDetailsDao; +import com.cloud.dc.ClusterVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.dao.ClusterDao; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.storage.Storage.StoragePoolType; +import com.cloud.storage.dao.StoragePoolDetailsDao; +import com.cloud.utils.Pair; +import com.cloud.utils.Ternary; +import com.cloud.utils.component.Inject; +import com.cloud.utils.exception.CloudRuntimeException; + +@Local(value ={OCFS2Manager.class}) +public class OCFS2ManagerImpl implements OCFS2Manager { + String _name; + private static final Logger s_logger = Logger.getLogger(OCFS2ManagerImpl.class); + + @Inject ClusterDetailsDao _clusterDetailsDao; + @Inject AgentManager _agentMgr; + @Inject HostDao _hostDao; + @Inject ClusterDao _clusterDao; + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + _name = name; + return true; + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public String getName() { + return _name; + } + + private List> marshalNodes(List hosts) { + Integer i = 0; + List> lst = new ArrayList>(); + for (HostVO h : hosts) { + String nodeName = "node_" + h.getPrivateIpAddress().replace(".", "_"); + Ternary node = new Ternary(i, h.getPrivateIpAddress(), nodeName); + lst.add(node); + i ++; + } + return lst; + } + + + private boolean prepareNodes(String clusterName, List hosts) { + PrepareOCFS2NodesCommand cmd = new PrepareOCFS2NodesCommand(clusterName, marshalNodes(hosts)); + for (HostVO h : hosts) { + Answer ans = _agentMgr.easySend(h.getId(), cmd); + if (ans == null) { + s_logger.debug("Host " + h.getId() + " is not in UP state, skip preparing OCFS2 node on it"); + continue; + } + if (!ans.getResult()) { + s_logger.warn("PrepareOCFS2NodesCommand failed on host " + h.getId() + " " + ans.getDetails()); + return false; + } + } + + return true; + } + + @Override + public boolean prepareNodes(List hosts, StoragePool pool, Map params) { + if (pool.getPoolType() != StoragePoolType.OCFS2) { + throw new CloudRuntimeException("None OCFS2 storage pool is getting into OCFS2 manager!"); + } + + /* + String clusterName = params.get(OCFS2Manager.CLUSTER_NAME); + if (clusterName == null) { + throw new CloudRuntimeException("Cannot get OCFS2 cluster name"); + } + */ + String clusterName = "ofcs2"; + + Map details = _clusterDetailsDao.findDetails(pool.getClusterId()); + String currentClusterName = details.get(OCFS2Manager.CLUSTER_NAME); + if (currentClusterName == null) { + details.put(OCFS2Manager.CLUSTER_NAME, clusterName); + /* This is actual _clusterDetailsDao.update() */ + _clusterDetailsDao.persist(pool.getClusterId(), details); + } else { + if (!currentClusterName.equals(clusterName)) { + throw new CloudRuntimeException("Cluster already has name " + currentClusterName + " while name you giving is " + clusterName); + } + } + + return prepareNodes(clusterName, hosts); + } + + @Override + public boolean prepareNodes(Long clusterId) { + Map details = _clusterDetailsDao.findDetails(clusterId); + String clusterName = details.get(OCFS2Manager.CLUSTER_NAME); + if (clusterName == null) { + throw new CloudRuntimeException("Cannot find OCFS2 cluster name for cluster " + clusterId); + } + + ClusterVO cluster = _clusterDao.findById(clusterId); + if (cluster == null) { + throw new CloudRuntimeException("Cannot find cluster for ID " + clusterId); + } + + List hosts = _hostDao.listByInAllStatus(Host.Type.Routing, clusterId, cluster.getPodId(), cluster.getDataCenterId()); + if (hosts.isEmpty()) { + throw new CloudRuntimeException("No host up to associate a storage pool with in cluster " + clusterId); + } + + return prepareNodes(clusterName, hosts); + } +}