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/api/src/com/cloud/api/BaseCmd.java b/api/src/com/cloud/api/BaseCmd.java index 30fe4be5ead..bf5cc370c97 100755 --- a/api/src/com/cloud/api/BaseCmd.java +++ b/api/src/com/cloud/api/BaseCmd.java @@ -93,7 +93,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; @@ -117,7 +118,6 @@ public abstract class BaseCmd { public static RemoteAccessVpnService _ravService; public static BareMetalVmService _bareMetalVmService; public static ProjectService _projectService; - static void setComponents(ResponseGenerator generator) { ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name); @@ -553,7 +553,16 @@ public abstract class BaseCmd { (accountType == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) || (accountType == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN)); } + public static boolean isRootAdmin(short accountType) { return ((accountType == Account.ACCOUNT_TYPE_ADMIN)); + } + + public void setFullUrlParams(Map map) { + this.fullUrlParams = map; + } + + public Map getFullUrlParams() { + return this.fullUrlParams; } } 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/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java old mode 100644 new mode 100755 index 87f23658817..be19c0ecb61 --- a/api/src/com/cloud/storage/Storage.java +++ b/api/src/com/cloud/storage/Storage.java @@ -97,8 +97,8 @@ public class Storage { SharedMountPoint(true), VMFS(true), // VMware VMFS storage PreSetup(true), // for XenServer, Storage Pool is set up by customers. - EXT(false); // XenServer local EXT SR - + EXT(false), // XenServer local EXT SR + OCFS2(true); boolean shared; diff --git a/cloud.spec b/cloud.spec index 3350327408c..c6a4f5be3b1 100644 --- a/cloud.spec +++ b/cloud.spec @@ -595,6 +595,10 @@ fi %attr(0755,root,root) %{_bindir}/%{name}-setup-agent %dir %attr(0770,root,root) %{_localstatedir}/log/%{name}/agent +%files premium-agent +%{_javadir}/cloud-agent-extras.jar +%attr(0755,root,root) %{_bindir}/mycloud-setup-agent + %files console-proxy %defattr(0644,root,root,0755) %{_javadir}/%{name}-console*.jar @@ -635,6 +639,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 diff --git a/core/src/com/cloud/agent/Listener.java b/core/src/com/cloud/agent/Listener.java index 7f4ae8b3535..7e19bd6d10f 100755 --- a/core/src/com/cloud/agent/Listener.java +++ b/core/src/com/cloud/agent/Listener.java @@ -90,7 +90,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/core/src/com/cloud/storage/template/DownloadManagerImpl.java b/core/src/com/cloud/storage/template/DownloadManagerImpl.java index e7a6d2e7ef1..f700d0f6026 100755 --- a/core/src/com/cloud/storage/template/DownloadManagerImpl.java +++ b/core/src/com/cloud/storage/template/DownloadManagerImpl.java @@ -794,6 +794,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); _templateDir = (String) params.get("public.templates.root.dir"); 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/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 25944d33b60..4fd9150e9cc 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -2075,7 +2075,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Manager { // 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/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index c5c5810a7de..1cf243558e1 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -346,7 +346,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); 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 8588962dfbc..6a8aa81ced4 --- 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/Config.java b/server/src/com/cloud/configuration/Config.java index ac83d562e8b..541068d1ccf 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -150,7 +150,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), diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index 5da5b21c2ca..87a830999c5 100755 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -108,6 +108,7 @@ import com.cloud.projects.ProjectManagerImpl; import com.cloud.projects.dao.ProjectDaoImpl; import com.cloud.resource.ResourceManagerImpl; 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; @@ -314,6 +315,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com addManager("HypervisorGuruManager", HypervisorGuruManagerImpl.class); addManager("ClusterFenceManager", ClusterFenceManagerImpl.class); addManager("ResourceManager", ResourceManagerImpl.class); + addManager("OCFS2Manager", OCFS2ManagerImpl.class); ComponentInfo info = addManager("ConsoleProxyManager", ConsoleProxyManagerImpl.class); info.addParameter("consoleproxy.sslEnabled", "true"); addManager("ClusteredAgentManager", ClusteredAgentManagerImpl.class); 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/host/dao/HostDao.java b/server/src/com/cloud/host/dao/HostDao.java index ecfe2135c19..1324a72e073 100755 --- a/server/src/com/cloud/host/dao/HostDao.java +++ b/server/src/com/cloud/host/dao/HostDao.java @@ -175,4 +175,6 @@ public interface HostDao extends GenericDao { List listAllRoutingAgents(); List findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId); + + 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 index fec371e5ff9..54e2563c37f 100755 --- a/server/src/com/cloud/host/dao/HostDaoImpl.java +++ b/server/src/com/cloud/host/dao/HostDaoImpl.java @@ -450,6 +450,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/hypervisor/XenServerGuru.java b/server/src/com/cloud/hypervisor/XenServerGuru.java index 659553e00c2..8f4c17da28a 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/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 81da6482f31..92074dc16b6 100755 --- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -601,6 +601,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 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 999cc189810..92093cad0d5 --- 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 diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index 9e6f35b37e2..fc97b8238af 100644 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -361,7 +361,7 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma 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/storage/LocalStoragePoolListener.java b/server/src/com/cloud/storage/LocalStoragePoolListener.java old mode 100644 new mode 100755 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); + } +} diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 7c18c7ff92a..401215ccdf9 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -283,6 +283,8 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag protected HypervisorGuruManager _hvGuruMgr; @Inject protected VolumeDao _volumeDao; + @Inject + protected OCFS2Manager _ocfs2Mgr; @Inject(adapter = StoragePoolAllocator.class) protected Adapters _storagePoolAllocators; @@ -1186,6 +1188,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); @@ -1233,6 +1238,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); @@ -1425,7 +1436,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 55f151ed16a..19c5e1bc646 100755 --- a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java +++ b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java @@ -32,18 +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; + 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); } @@ -67,12 +76,17 @@ 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()) { 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 2146e2f6084..98be8e35483 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 a6f9f6e49d7..691f580f437 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()); } - } diff --git a/server/src/com/cloud/template/HyervisorTemplateAdapter.java b/server/src/com/cloud/template/HyervisorTemplateAdapter.java index 8eb19c6b4ef..d6e3e9424d2 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()); } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 488d83682e4..a977ff2df5b 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2668,20 +2668,23 @@ 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; + + 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.getDataCenterIdToDeployIn()); + if (isoPathPair == null) { s_logger.warn("Couldn't get absolute iso path"); return false; } else { isoPath = isoPathPair.first(); } + if (template.isBootable()) { profile.setBootLoaderType(BootloaderType.CD); } @@ -2695,12 +2698,13 @@ 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); } - + return true; } diff --git a/ui/jsp/cluster.jsp b/ui/jsp/cluster.jsp index e3aa0232597..e13ad9a3d9b 100644 --- a/ui/jsp/cluster.jsp +++ b/ui/jsp/cluster.jsp @@ -280,6 +280,20 @@ dictionary = { +
  • + + + +
  • +
  • + + + +
  • diff --git a/ui/jsp/host.jsp b/ui/jsp/host.jsp index 593bd7ae6f7..dc75f9f2c8d 100644 --- a/ui/jsp/host.jsp +++ b/ui/jsp/host.jsp @@ -809,6 +809,20 @@ dictionary = {
  • +
  • + + + +
  • +
  • + + + +
  • diff --git a/ui/jsp/pod.jsp b/ui/jsp/pod.jsp index 12b51b7dd5d..b8c34429e75 100644 --- a/ui/jsp/pod.jsp +++ b/ui/jsp/pod.jsp @@ -506,6 +506,20 @@ dictionary = {
  • +
  • + + + +
  • +
  • + + + +
  • diff --git a/ui/jsp/resource.jsp b/ui/jsp/resource.jsp index 82c63db8574..c106a25b00d 100644 --- a/ui/jsp/resource.jsp +++ b/ui/jsp/resource.jsp @@ -984,6 +984,20 @@
  • +
  • + + + +
  • +
  • + + + +
  • diff --git a/ui/jsp/zone.jsp b/ui/jsp/zone.jsp index edb9ab19aa6..0594176ea68 100644 --- a/ui/jsp/zone.jsp +++ b/ui/jsp/zone.jsp @@ -472,6 +472,20 @@ dictionary = {
  • +
  • + + + +
  • +
  • + + + +
  • diff --git a/ui/scripts/cloud.core.pod.js b/ui/scripts/cloud.core.pod.js index c5f977773b0..caa06b43833 100644 --- a/ui/scripts/cloud.core.pod.js +++ b/ui/scripts/cloud.core.pod.js @@ -537,61 +537,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); @@ -615,17 +626,24 @@ function bindAddHostButton($leftmenuItem1) { 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; @@ -663,20 +681,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)); @@ -689,7 +695,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({ @@ -715,7 +742,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 be701f3e346..64e16ecb85a 100644 --- a/ui/scripts/cloud.core.resource.js +++ b/ui/scripts/cloud.core.resource.js @@ -845,19 +845,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) { @@ -889,16 +901,22 @@ function initAddHostShortcut() { 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) @@ -950,20 +968,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)); @@ -977,6 +983,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({ @@ -1907,6 +1934,10 @@ function bindEventHandlerToDialogAddPool($dialogAddPool) { $protocolSelector.append(''); $protocolSelector.append(''); } + else if(clusterObj.hypervisortype == "Ovm") { + $protocolSelector.empty(); + $protocolSelector.append(''); + } else { $protocolSelector.empty(); } diff --git a/ui/scripts/cloud.core.template.js b/ui/scripts/cloud.core.template.js index b1b178939b9..c73c6d3d8cc 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; }); diff --git a/ui/scripts/cloud.core.zone.js b/ui/scripts/cloud.core.zone.js index 97c517a08e9..7c697c35d5c 100644 --- a/ui/scripts/cloud.core.zone.js +++ b/ui/scripts/cloud.core.zone.js @@ -757,19 +757,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) { @@ -802,17 +814,23 @@ function bindAddHostButtonOnZonePage($button, zoneId, zoneName) { 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; @@ -862,21 +880,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)); @@ -890,6 +895,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({ diff --git a/utils/src/com/cloud/utils/SerialVersionUID.java b/utils/src/com/cloud/utils/SerialVersionUID.java index 889640ac13f..bbc401d5281 100755 --- a/utils/src/com/cloud/utils/SerialVersionUID.java +++ b/utils/src/com/cloud/utils/SerialVersionUID.java @@ -64,4 +64,5 @@ public interface SerialVersionUID { public static final long VirtualMachineMigrationException = Base | 0x24; public static final long DiscoveredWithErrorException = Base | 0x25; public static final long NoTransitionException = Base | 0x26; + public static final long CallFailedException = Base | 0x26; } diff --git a/wscript_configure b/wscript_configure index 5fb26217799..c2d957fbbbf 100644 --- a/wscript_configure +++ b/wscript_configure @@ -261,7 +261,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