diff --git a/README.html b/README.html deleted file mode 100644 index a91198561c1..00000000000 --- a/README.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -

Welcome to CloudStack. Here's where you can find more information:

- - - diff --git a/README.md b/README.md index 2ac663c233e..a672397c31a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,29 @@ +Apache CloudStack (Incubating) Version 4.0.0 + +# About Apache CloudStack (Incubating) + +Apache CloudStack (Incubating) is software designed to deploy +and manage large networks of virtual machines, as a highly +available, highly scalable Infrastructure as a Service (IaaS) +cloud computing platform. CloudStack is used by a number of +service providers to offer public cloud services, and by many +companies to provide an on-premises (private) cloud offering. + +Apache CloudStack currently supports the most popular hypervisors: +VMware, Oracle VM, KVM, XenServer and Xen Cloud Platform. +CloudStack also offers bare metal management of servers, +using PXE to provision OS images and IPMI to manage the server. +Apache CloudStack offers three methods for managing cloud +computing environments: an easy to use Web interface, command +line tools, and a full-featured RESTful API. + +Visit us at [cloudstack.org](http://incubator.apache.org/cloudstack). + +## Mailing lists +[Development Mailing List](mailto:cloudstack-dev-subscribe@incubator.apache.org) +[Users Mailing list](mailto:cloudstack-users-subscribe@incubator.apache.org) +[Commits mailing list](mailto:cloudstack-commits-subscribe@incubator.apache.org) + # License Licensed to the Apache Software Foundation (ASF) under one @@ -17,42 +43,88 @@ KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -# Apache CloudStack +# Building CloudStack -Apache CloudStack is a massively scalable free/libre open source Infrastructure as a Service cloud platform. +By default, CloudStack will only build with supporting packages +that are appropved by the ASF as being compatible with the Apache +Software License Version 2. -Visit us at [cloudstack.org](http://cloudstack.org) or join #cloudstack on irc.freenode.net +## Default build -## Binary Downloads +To build the default build target, use maven3 and execute: -Downloads are available from: -http://cloudstack.org/download.html +maven install -## Supported Hypervisors +## Including optional third party libraries in your build -* XenServer -* KVM -* VMware ESX/ESXi (via vCenter) -* Oracle VM -* XCP +If you want to build this software against one of the optional +third party libraries, follow the instructions below: -## Mailing lists -[Development Mailing List](mailto:cloudstack-dev-subscribe@incubator.apache.org) -[Users Mailing list](mailto:cloudstack-users-subscribe@incubator.apache.org) -[Commits mailing list](mailto:cloudstack-commits-subscribe@incubator.apache.org) +These third parties jars are non available in Maven central, and +need to be located and downloaded by the developer themselves. +The libraries to download are listed below, by the feature that +they support. -#Maven build -Some third parties jars are non available in Maven central. -So install it with: cd deps&&sh ./install-non-oss.sh -Now you are able to activate nonoss build with adding -Dnonoss to maven cli. +For F5 load balancing support: +cloud-iControl.jar + +For Netscaler support: +cloud-netscaler.jar +cloud-netscaler-sdx.jar + +For NetApp Storage Support: +cloud-manageontap.jar + +For VMware Support: +vmware-vim.jar +vmware-vim25.jar +vmware-apputils.jar + +Once downloaded (and named the same as listed above), they can be +installed into your local maven repository with the following command: + +cd deps&&sh ./install-non-oss.sh + +To perform the build, run the following command: + +mvn -Dnonoss install + +## Running a developer environment + +To run the webapp client: + +mvn org.apache.tomcat.maven:tomcat7-maven-plugin:2.0-beta-1:run -pl :cloud-client-ui -am -Pclient + +Then hit: http://localhost:8080/cloud-client-ui/ -to run webapp client: -mvn org.apache.tomcat.maven:tomcat7-maven-plugin:2.0-beta-1:run -pl :cloud-client-ui -am -Pclient -Dnonoss -then hit: http://localhost:8080/cloud-client-ui/ or add in your ~/.m2/settings.xml org.apache.tomcat.maven -and save your fingers with mvn tomcat7:run -pl :cloud-client-ui -am -Pclient -Dnonoss +and save your fingers with mvn tomcat7:run -pl :cloud-client-ui -am -Pclient + +Optionally add -Dnonoss to either of the commands above. If you want to use ide debug: replace mvn with mvnDebug and attach your ide debugger to port 8000 + +# Notice of Cryptographic Software + +This distribution includes cryptographic software. The country in which you currently +reside may have restrictions on the import, possession, use, and/or re-export to another +country, of encryption software. BEFORE using any encryption software, please check your +country's laws, regulations and policies concerning the import, possession, or use, and +re-export of encryption software, to see if this is permitted. See http://www.wassenaar.org/ +for more information. + +The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has +classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which +includes information security software using or performing cryptographic functions with +asymmetric algorithms. The form and manner of this Apache Software Foundation distribution +makes it eligible for export under the License Exception ENC Technology Software +Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section +740.13) for both object code and source code. + +The following provides more details on the included cryptographic software: + +TODO + diff --git a/agent-simulator/db/create-schema-simulator.sql b/agent-simulator/db/create-schema-simulator.sql deleted file mode 100644 index 09da344dc42..00000000000 --- a/agent-simulator/db/create-schema-simulator.sql +++ /dev/null @@ -1,89 +0,0 @@ --- Licensed to the Apache Software Foundation (ASF) under one --- or more contributor license agreements. See the NOTICE file --- distributed with this work for additional information --- regarding copyright ownership. The ASF licenses this file --- to you under the Apache License, Version 2.0 (the --- "License"); you may not use this file except in compliance --- with the License. You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, --- software distributed under the License is distributed on an --- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY --- KIND, either express or implied. See the License for the --- specific language governing permissions and limitations --- under the License. -DROP TABLE IF EXISTS `cloud`.`mockhost`; -DROP TABLE IF EXISTS `cloud`.`mocksecstorage`; -DROP TABLE IF EXISTS `cloud`.`mockstoragepool`; -DROP TABLE IF EXISTS `cloud`.`mockvm`; -DROP TABLE IF EXISTS `cloud`.`mockvolume`; - -CREATE TABLE `cloud`.`mockhost` ( - `id` bigint unsigned NOT NULL auto_increment, - `name` varchar(255) NOT NULL, - `private_ip_address` char(40), - `private_mac_address` varchar(17), - `private_netmask` varchar(15), - `storage_ip_address` char(40), - `storage_netmask` varchar(15), - `storage_mac_address` varchar(17), - `public_ip_address` char(40), - `public_netmask` varchar(15), - `public_mac_address` varchar(17), - `guid` varchar(255) UNIQUE, - `version` varchar(40) NOT NULL, - `data_center_id` bigint unsigned NOT NULL, - `pod_id` bigint unsigned, - `cluster_id` bigint unsigned COMMENT 'foreign key to cluster', - `cpus` int(10) unsigned, - `speed` int(10) unsigned, - `ram` bigint unsigned, - `capabilities` varchar(255) COMMENT 'host capabilities in comma separated list', - `vm_id` bigint unsigned, - `resource` varchar(255) DEFAULT NULL COMMENT 'If it is a local resource, this is the class name', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`mocksecstorage` ( - `id` bigint unsigned NOT NULL auto_increment, - `url` varchar(255), - `capacity` bigint unsigned, - `mount_point` varchar(255), - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`mockstoragepool` ( - `id` bigint unsigned NOT NULL auto_increment, - `guid` varchar(255), - `mount_point` varchar(255), - `capacity` bigint, - `pool_type` varchar(40), - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`mockvm` ( - `id` bigint unsigned NOT NULL auto_increment, - `name` varchar(255), - `host_id` bigint unsigned, - `type` varchar(40), - `state` varchar(40), - `vnc_port` bigint unsigned, - `memory` bigint unsigned, - `cpu` bigint unsigned, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`mockvolume` ( - `id` bigint unsigned NOT NULL auto_increment, - `name` varchar(255), - `size` bigint unsigned, - `path` varchar(255), - `pool_id` bigint unsigned, - `type` varchar(40), - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - diff --git a/agent-simulator/src/com/cloud/agent/manager/MockAgentManager.java b/agent-simulator/src/com/cloud/agent/manager/MockAgentManager.java index 993217362d0..7db5b20f55c 100644 --- a/agent-simulator/src/com/cloud/agent/manager/MockAgentManager.java +++ b/agent-simulator/src/com/cloud/agent/manager/MockAgentManager.java @@ -33,28 +33,34 @@ import com.cloud.simulator.MockHost; import com.cloud.utils.component.Manager; public interface MockAgentManager extends Manager { - public static final long DEFAULT_HOST_MEM_SIZE = 8 * 1024 * 1024 * 1024L; // 8G, unit of - // Mbytes - public static final int DEFAULT_HOST_CPU_CORES = 4; // 2 dual core CPUs (2 x - // 2) - public static final int DEFAULT_HOST_SPEED_MHZ = 8000; // 1 GHz CPUs - boolean configure(String name, Map params) throws ConfigurationException; + public static final long DEFAULT_HOST_MEM_SIZE = 8 * 1024 * 1024 * 1024L; // 8G, + // unit + // of + // Mbytes + public static final int DEFAULT_HOST_CPU_CORES = 4; // 2 dual core CPUs (2 x + // 2) + public static final int DEFAULT_HOST_SPEED_MHZ = 8000; // 1 GHz CPUs - Map> createServerResources(Map params); + boolean configure(String name, Map params) throws ConfigurationException; - boolean handleSystemVMStart(long vmId, String privateIpAddress, String privateMacAddress, String privateNetMask, long dcId, long podId, String name, String vmType, String url); + Map> createServerResources(Map params); - boolean handleSystemVMStop(long vmId); + boolean handleSystemVMStart(long vmId, String privateIpAddress, String privateMacAddress, String privateNetMask, + long dcId, long podId, String name, String vmType, String url); - GetHostStatsAnswer getHostStatistic(GetHostStatsCommand cmd); - Answer checkHealth(CheckHealthCommand cmd); - Answer pingTest(PingTestCommand cmd); - - Answer prepareForMigrate(PrepareForMigrationCommand cmd); - - MockHost getHost(String guid); + boolean handleSystemVMStop(long vmId); - Answer maintain(MaintainCommand cmd); + GetHostStatsAnswer getHostStatistic(GetHostStatsCommand cmd); + + Answer checkHealth(CheckHealthCommand cmd); + + Answer pingTest(PingTestCommand cmd); + + Answer prepareForMigrate(PrepareForMigrationCommand cmd); + + MockHost getHost(String guid); + + Answer maintain(MaintainCommand cmd); Answer checkNetworkCommand(CheckNetworkCommand cmd); } diff --git a/agent-simulator/src/com/cloud/agent/manager/MockAgentManagerImpl.java b/agent-simulator/src/com/cloud/agent/manager/MockAgentManagerImpl.java index 0dd8f05737f..cb992979e07 100755 --- a/agent-simulator/src/com/cloud/agent/manager/MockAgentManagerImpl.java +++ b/agent-simulator/src/com/cloud/agent/manager/MockAgentManagerImpl.java @@ -61,321 +61,408 @@ import com.cloud.utils.Pair; import com.cloud.utils.component.Inject; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; @Local(value = { MockAgentManager.class }) public class MockAgentManagerImpl implements MockAgentManager { - private static final Logger s_logger = Logger.getLogger(MockAgentManagerImpl.class); - @Inject HostPodDao _podDao = null; - @Inject MockHostDao _mockHostDao = null; - @Inject MockVMDao _mockVmDao = null; - @Inject SimulatorManager _simulatorMgr = null; - @Inject AgentManager _agentMgr = null; - @Inject MockStorageManager _storageMgr = null; - @Inject ResourceManager _resourceMgr; - private SecureRandom random; - private Map _resources = new ConcurrentHashMap(); - private ThreadPoolExecutor _executor; + private static final Logger s_logger = Logger.getLogger(MockAgentManagerImpl.class); + @Inject + HostPodDao _podDao = null; + @Inject + MockHostDao _mockHostDao = null; + @Inject + MockVMDao _mockVmDao = null; + @Inject + SimulatorManager _simulatorMgr = null; + @Inject + AgentManager _agentMgr = null; + @Inject + MockStorageManager _storageMgr = null; + @Inject + ResourceManager _resourceMgr; + private SecureRandom random; + private Map _resources = new ConcurrentHashMap(); + private ThreadPoolExecutor _executor; - private Pair getPodCidr(long podId, long dcId) { - try { - - HashMap> podMap = _podDao - .getCurrentPodCidrSubnets(dcId, 0); - List cidrPair = podMap.get(podId); - String cidrAddress = (String) cidrPair.get(0); - Long cidrSize = (Long)cidrPair.get(1); - return new Pair(cidrAddress, cidrSize); - } catch (PatternSyntaxException e) { - s_logger.error("Exception while splitting pod cidr"); - return null; - } catch(IndexOutOfBoundsException e) { - s_logger.error("Invalid pod cidr. Please check"); - return null; - } - } - + private Pair getPodCidr(long podId, long dcId) { + try { - private String getIpAddress(long instanceId, long dcId, long podId) { - Pair cidr = this.getPodCidr(podId, dcId); - return NetUtils.long2Ip(NetUtils.ip2Long(cidr.first()) + instanceId); - } - - private String getMacAddress(long dcId, long podId, long clusterId, int instanceId) { - return NetUtils.long2Mac((dcId << 40 + podId << 32 + clusterId << 24 + instanceId)); - } - public synchronized int getNextAgentId(long cidrSize) { - return random.nextInt((int)cidrSize); - } - - @Override - @DB - public Map> createServerResources( - Map params) { - - Map args = new HashMap(); - Map> newResources = new HashMap>(); - AgentResourceBase agentResource; - long cpuCore = Long.parseLong((String)params.get("cpucore")); - long cpuSpeed = Long.parseLong((String)params.get("cpuspeed")); - long memory = Long.parseLong((String)params.get("memory")); - long localStorageSize = Long.parseLong((String)params.get("localstorage")); - synchronized (this) { - long dataCenterId = Long.parseLong((String)params.get("zone")); - long podId = Long.parseLong((String)params.get("pod")); - long clusterId = Long.parseLong((String)params.get("cluster")); - long cidrSize = getPodCidr(podId, dataCenterId).second(); + HashMap> podMap = _podDao.getCurrentPodCidrSubnets(dcId, 0); + List cidrPair = podMap.get(podId); + String cidrAddress = (String) cidrPair.get(0); + Long cidrSize = (Long) cidrPair.get(1); + return new Pair(cidrAddress, cidrSize); + } catch (PatternSyntaxException e) { + s_logger.error("Exception while splitting pod cidr"); + return null; + } catch (IndexOutOfBoundsException e) { + s_logger.error("Invalid pod cidr. Please check"); + return null; + } + } - int agentId = getNextAgentId(cidrSize); - String ipAddress = getIpAddress(agentId, dataCenterId, podId); - String macAddress = getMacAddress(dataCenterId, podId, clusterId, agentId); - MockHostVO mockHost = new MockHostVO(); - mockHost.setDataCenterId(dataCenterId); - mockHost.setPodId(podId); - mockHost.setClusterId(clusterId); - mockHost.setCapabilities("hvm"); - mockHost.setCpuCount(cpuCore); - mockHost.setCpuSpeed(cpuSpeed); - mockHost.setMemorySize(memory); - String guid = UUID.randomUUID().toString(); - mockHost.setGuid(guid); - mockHost.setName("SimulatedAgent." + guid); - mockHost.setPrivateIpAddress(ipAddress); - mockHost.setPublicIpAddress(ipAddress); - mockHost.setStorageIpAddress(ipAddress); - mockHost.setPrivateMacAddress(macAddress); - mockHost.setPublicMacAddress(macAddress); - mockHost.setStorageMacAddress(macAddress); - mockHost.setVersion(this.getClass().getPackage().getImplementationVersion()); - mockHost.setResource("com.cloud.agent.AgentRoutingResource"); - mockHost = _mockHostDao.persist(mockHost); - - _storageMgr.getLocalStorage(guid, localStorageSize); + private String getIpAddress(long instanceId, long dcId, long podId) { + Pair cidr = this.getPodCidr(podId, dcId); + return NetUtils.long2Ip(NetUtils.ip2Long(cidr.first()) + instanceId); + } - agentResource = new AgentRoutingResource(); - if (agentResource != null) { - try { - params.put("guid", mockHost.getGuid()); - agentResource.start(); - agentResource.configure(mockHost.getName(), - params); + private String getMacAddress(long dcId, long podId, long clusterId, int instanceId) { + return NetUtils.long2Mac((dcId << 40 + podId << 32 + clusterId << 24 + instanceId)); + } - newResources.put(agentResource, args); - } catch (ConfigurationException e) { - s_logger - .error("error while configuring server resource" - + e.getMessage()); - } - } - } - return newResources; - } - - - @Override - public boolean configure(String name, Map params) - throws ConfigurationException { - try { - random = SecureRandom.getInstance("SHA1PRNG"); - _executor = new ThreadPoolExecutor(1, 5, 1, TimeUnit.DAYS, new LinkedBlockingQueue(), new NamedThreadFactory("Simulator-Agent-Mgr")); - //ComponentLocator locator = ComponentLocator.getCurrentLocator(); - //_simulatorMgr = (SimulatorManager) locator.getComponent(SimulatorManager.Name); - } catch (NoSuchAlgorithmException e) { - s_logger.debug("Failed to initialize random:" + e.toString()); - return false; - } - return true; - } - - @Override - public boolean handleSystemVMStart(long vmId, String privateIpAddress, String privateMacAddress, String privateNetMask, long dcId, long podId, String name, String vmType, String url) { - _executor.execute(new SystemVMHandler(vmId, privateIpAddress, privateMacAddress, privateNetMask, dcId, podId, name, vmType, _simulatorMgr, url)); - return true; - } - - @Override - public boolean handleSystemVMStop(long vmId) { - _executor.execute(new SystemVMHandler(vmId)); - return true; - } - - private class SystemVMHandler implements Runnable { - private long vmId; - private String privateIpAddress; - private String privateMacAddress; - private String privateNetMask; - private long dcId; - private long podId; - private String guid; - private String name; - private String vmType; - private SimulatorManager mgr; - private String mode; - private String url; - public SystemVMHandler(long vmId, String privateIpAddress, String privateMacAddress, String privateNetMask, long dcId, long podId, String name, String vmType, - SimulatorManager mgr, String url) { - this.vmId = vmId; - this.privateIpAddress = privateIpAddress; - this.privateMacAddress = privateMacAddress; - this.privateNetMask = privateNetMask; - this.dcId = dcId; - this.guid = "SystemVM-" + UUID.randomUUID().toString(); - this.name = name; - this.vmType = vmType; - this.mgr = mgr; - this.mode = "Start"; - this.url = url; - this.podId = podId; - } - - public SystemVMHandler(long vmId) { - this.vmId = vmId; - this.mode = "Stop"; - } - - @Override - @DB - public void run() { - if (this.mode.equalsIgnoreCase("Stop")) { - MockHost host = _mockHostDao.findByVmId(this.vmId); - if (host != null) { - String guid = host.getGuid(); - if (guid != null) { - AgentResourceBase res = _resources.get(guid); - if (res != null) { - res.stop(); - _resources.remove(guid); - } - } - } - return; - } - - String resource = null; - if (vmType.equalsIgnoreCase("secstorage")) { - resource = "com.cloud.agent.AgentStorageResource"; - } - MockHostVO mockHost = new MockHostVO(); - mockHost.setDataCenterId(this.dcId); - mockHost.setPodId(this.podId); - mockHost.setCpuCount(DEFAULT_HOST_CPU_CORES); - mockHost.setCpuSpeed(DEFAULT_HOST_SPEED_MHZ); - mockHost.setMemorySize(DEFAULT_HOST_MEM_SIZE); - mockHost.setGuid(this.guid); - mockHost.setName(name); - mockHost.setPrivateIpAddress(this.privateIpAddress); - mockHost.setPublicIpAddress(this.privateIpAddress); - mockHost.setStorageIpAddress(this.privateIpAddress); - mockHost.setPrivateMacAddress(this.privateMacAddress); - mockHost.setPublicMacAddress(this.privateMacAddress); - mockHost.setStorageMacAddress(this.privateMacAddress); - mockHost.setVersion(this.getClass().getPackage().getImplementationVersion()); - mockHost.setResource(resource); - mockHost.setVmId(vmId); - mockHost = _mockHostDao.persist(mockHost); - - if (vmType.equalsIgnoreCase("secstorage")) { - AgentStorageResource storageResource = new AgentStorageResource(); - try { - Map params = new HashMap(); - Map details = new HashMap(); - params.put("guid", this.guid); - details.put("guid", this.guid); - storageResource.configure("secondaryStorage", params); - storageResource.start(); - //on the simulator the ssvm is as good as a direct agent - _resourceMgr.addHost(mockHost.getDataCenterId(), storageResource, Host.Type.SecondaryStorageVM, details); - _resources.put(this.guid, storageResource); - } catch (ConfigurationException e) { - s_logger.debug("Failed to load secondary storage resource: " + e.toString()); - return; - } - } - } - } + public synchronized int getNextAgentId(long cidrSize) { + return random.nextInt((int) cidrSize); + } - @Override - public MockHost getHost(String guid) { - return _mockHostDao.findByGuid(guid); - } + @Override + @DB + public Map> createServerResources(Map params) { - @Override - public GetHostStatsAnswer getHostStatistic(GetHostStatsCommand cmd) { - String hostGuid = cmd.getHostGuid(); - MockHost host = _mockHostDao.findByGuid(hostGuid); - if (host == null) { - return null; - } - List vms = _mockVmDao.findByHostId(host.getId()); - double usedMem = 0.0; - double usedCpu = 0.0; - for (MockVMVO vm : vms) { - usedMem += vm.getMemory(); - usedCpu += vm.getCpu(); - } - - HostStatsEntry hostStats = new HostStatsEntry(); - hostStats.setTotalMemoryKBs(host.getMemorySize()); - hostStats.setFreeMemoryKBs(host.getMemorySize() - usedMem); - hostStats.setNetworkReadKBs(32768); - hostStats.setNetworkWriteKBs(16384); - hostStats.setCpuUtilization(usedCpu/(host.getCpuCount() * host.getCpuSpeed())); - hostStats.setEntityType("simulator-host"); - hostStats.setHostId(cmd.getHostId()); - return new GetHostStatsAnswer(cmd, hostStats); - } + Map args = new HashMap(); + Map> newResources = new HashMap>(); + AgentResourceBase agentResource; + long cpuCore = Long.parseLong((String) params.get("cpucore")); + long cpuSpeed = Long.parseLong((String) params.get("cpuspeed")); + long memory = Long.parseLong((String) params.get("memory")); + long localStorageSize = Long.parseLong((String) params.get("localstorage")); + synchronized (this) { + long dataCenterId = Long.parseLong((String) params.get("zone")); + long podId = Long.parseLong((String) params.get("pod")); + long clusterId = Long.parseLong((String) params.get("cluster")); + long cidrSize = getPodCidr(podId, dataCenterId).second(); + int agentId = getNextAgentId(cidrSize); + String ipAddress = getIpAddress(agentId, dataCenterId, podId); + String macAddress = getMacAddress(dataCenterId, podId, clusterId, agentId); + MockHostVO mockHost = new MockHostVO(); + mockHost.setDataCenterId(dataCenterId); + mockHost.setPodId(podId); + mockHost.setClusterId(clusterId); + mockHost.setCapabilities("hvm"); + mockHost.setCpuCount(cpuCore); + mockHost.setCpuSpeed(cpuSpeed); + mockHost.setMemorySize(memory); + String guid = UUID.randomUUID().toString(); + mockHost.setGuid(guid); + mockHost.setName("SimulatedAgent." + guid); + mockHost.setPrivateIpAddress(ipAddress); + mockHost.setPublicIpAddress(ipAddress); + mockHost.setStorageIpAddress(ipAddress); + mockHost.setPrivateMacAddress(macAddress); + mockHost.setPublicMacAddress(macAddress); + mockHost.setStorageMacAddress(macAddress); + mockHost.setVersion(this.getClass().getPackage().getImplementationVersion()); + mockHost.setResource("com.cloud.agent.AgentRoutingResource"); - @Override - public Answer checkHealth(CheckHealthCommand cmd) { - return new Answer(cmd); - } + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + mockHost = _mockHostDao.persist(mockHost); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + s_logger.error("Error while configuring mock agent " + ex.getMessage()); + throw new CloudRuntimeException("Error configuring agent", ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + _storageMgr.getLocalStorage(guid, localStorageSize); - @Override - public Answer pingTest(PingTestCommand cmd) { - return new Answer(cmd); - } + agentResource = new AgentRoutingResource(); + if (agentResource != null) { + try { + params.put("guid", mockHost.getGuid()); + agentResource.start(); + agentResource.configure(mockHost.getName(), params); + newResources.put(agentResource, args); + } catch (ConfigurationException e) { + s_logger.error("error while configuring server resource" + e.getMessage()); + } + } + } + return newResources; + } - @Override - public PrepareForMigrationAnswer prepareForMigrate(PrepareForMigrationCommand cmd) { - VirtualMachineTO vm = cmd.getVirtualMachine(); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Preparing host for migrating " + vm); - } - return new PrepareForMigrationAnswer(cmd); - } + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + try { + random = SecureRandom.getInstance("SHA1PRNG"); + _executor = new ThreadPoolExecutor(1, 5, 1, TimeUnit.DAYS, new LinkedBlockingQueue(), + new NamedThreadFactory("Simulator-Agent-Mgr")); + // ComponentLocator locator = ComponentLocator.getCurrentLocator(); + // _simulatorMgr = (SimulatorManager) + // locator.getComponent(SimulatorManager.Name); + } catch (NoSuchAlgorithmException e) { + s_logger.debug("Failed to initialize random:" + e.toString()); + return false; + } + return true; + } + @Override + public boolean handleSystemVMStart(long vmId, String privateIpAddress, String privateMacAddress, + String privateNetMask, long dcId, long podId, String name, String vmType, String url) { + _executor.execute(new SystemVMHandler(vmId, privateIpAddress, privateMacAddress, privateNetMask, dcId, podId, + name, vmType, _simulatorMgr, url)); + return true; + } - @Override - public boolean start() { - return true; - } + @Override + public boolean handleSystemVMStop(long vmId) { + _executor.execute(new SystemVMHandler(vmId)); + return true; + } + private class SystemVMHandler implements Runnable { + private long vmId; + private String privateIpAddress; + private String privateMacAddress; + private String privateNetMask; + private long dcId; + private long podId; + private String guid; + private String name; + private String vmType; + private SimulatorManager mgr; + private String mode; + private String url; - @Override - public boolean stop() { - return true; - } + public SystemVMHandler(long vmId, String privateIpAddress, String privateMacAddress, String privateNetMask, + long dcId, long podId, String name, String vmType, SimulatorManager mgr, String url) { + this.vmId = vmId; + this.privateIpAddress = privateIpAddress; + this.privateMacAddress = privateMacAddress; + this.privateNetMask = privateNetMask; + this.dcId = dcId; + this.guid = "SystemVM-" + UUID.randomUUID().toString(); + this.name = name; + this.vmType = vmType; + this.mgr = mgr; + this.mode = "Start"; + this.url = url; + this.podId = podId; + } + public SystemVMHandler(long vmId) { + this.vmId = vmId; + this.mode = "Stop"; + } - @Override - public String getName() { - return this.getClass().getSimpleName(); - } + @Override + @DB + public void run() { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + if (this.mode.equalsIgnoreCase("Stop")) { + txn.start(); + MockHost host = _mockHostDao.findByVmId(this.vmId); + if (host != null) { + String guid = host.getGuid(); + if (guid != null) { + AgentResourceBase res = _resources.get(guid); + if (res != null) { + res.stop(); + _resources.remove(guid); + } + } + } + txn.commit(); + return; + } + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Unable to get host " + guid + " due to " + ex.getMessage(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } - @Override - public MaintainAnswer maintain(com.cloud.agent.api.MaintainCommand cmd) { - return new MaintainAnswer(cmd); - } + String resource = null; + if (vmType.equalsIgnoreCase("secstorage")) { + resource = "com.cloud.agent.AgentStorageResource"; + } + MockHostVO mockHost = new MockHostVO(); + mockHost.setDataCenterId(this.dcId); + mockHost.setPodId(this.podId); + mockHost.setCpuCount(DEFAULT_HOST_CPU_CORES); + mockHost.setCpuSpeed(DEFAULT_HOST_SPEED_MHZ); + mockHost.setMemorySize(DEFAULT_HOST_MEM_SIZE); + mockHost.setGuid(this.guid); + mockHost.setName(name); + mockHost.setPrivateIpAddress(this.privateIpAddress); + mockHost.setPublicIpAddress(this.privateIpAddress); + mockHost.setStorageIpAddress(this.privateIpAddress); + mockHost.setPrivateMacAddress(this.privateMacAddress); + mockHost.setPublicMacAddress(this.privateMacAddress); + mockHost.setStorageMacAddress(this.privateMacAddress); + mockHost.setVersion(this.getClass().getPackage().getImplementationVersion()); + mockHost.setResource(resource); + mockHost.setVmId(vmId); + Transaction simtxn = Transaction.open(Transaction.SIMULATOR_DB); + try { + simtxn.start(); + mockHost = _mockHostDao.persist(mockHost); + simtxn.commit(); + } catch (Exception ex) { + simtxn.rollback(); + throw new CloudRuntimeException("Unable to persist host " + mockHost.getGuid() + " due to " + + ex.getMessage(), ex); + } finally { + simtxn.close(); + simtxn = Transaction.open(Transaction.CLOUD_DB); + simtxn.close(); + } + + if (vmType.equalsIgnoreCase("secstorage")) { + AgentStorageResource storageResource = new AgentStorageResource(); + try { + Map params = new HashMap(); + Map details = new HashMap(); + params.put("guid", this.guid); + details.put("guid", this.guid); + storageResource.configure("secondaryStorage", params); + storageResource.start(); + // on the simulator the ssvm is as good as a direct + // agent + _resourceMgr.addHost(mockHost.getDataCenterId(), storageResource, Host.Type.SecondaryStorageVM, + details); + _resources.put(this.guid, storageResource); + } catch (ConfigurationException e) { + s_logger.debug("Failed to load secondary storage resource: " + e.toString()); + return; + } + } + } + } + + @Override + public MockHost getHost(String guid) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + MockHost _host = _mockHostDao.findByGuid(guid); + txn.commit(); + if (_host != null) { + return _host; + } else { + s_logger.error("Host with guid " + guid + " was not found"); + return null; + } + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Unable to get host " + guid + " due to " + ex.getMessage(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } + + @Override + public GetHostStatsAnswer getHostStatistic(GetHostStatsCommand cmd) { + String hostGuid = cmd.getHostGuid(); + MockHost host = null; + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + host = _mockHostDao.findByGuid(hostGuid); + txn.commit(); + if (host == null) { + return null; + } + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Unable to get host " + hostGuid + " due to " + ex.getMessage(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + Transaction vmtxn = Transaction.open(Transaction.SIMULATOR_DB); + try { + vmtxn.start(); + List vms = _mockVmDao.findByHostId(host.getId()); + vmtxn.commit(); + double usedMem = 0.0; + double usedCpu = 0.0; + for (MockVMVO vm : vms) { + usedMem += vm.getMemory(); + usedCpu += vm.getCpu(); + } + + HostStatsEntry hostStats = new HostStatsEntry(); + hostStats.setTotalMemoryKBs(host.getMemorySize()); + hostStats.setFreeMemoryKBs(host.getMemorySize() - usedMem); + hostStats.setNetworkReadKBs(32768); + hostStats.setNetworkWriteKBs(16384); + hostStats.setCpuUtilization(usedCpu / (host.getCpuCount() * host.getCpuSpeed())); + hostStats.setEntityType("simulator-host"); + hostStats.setHostId(cmd.getHostId()); + return new GetHostStatsAnswer(cmd, hostStats); + } catch (Exception ex) { + vmtxn.rollback(); + throw new CloudRuntimeException("Unable to get Vms on host " + host.getGuid() + " due to " + + ex.getMessage(), ex); + } finally { + vmtxn.close(); + vmtxn = Transaction.open(Transaction.CLOUD_DB); + vmtxn.close(); + } + } + + @Override + public Answer checkHealth(CheckHealthCommand cmd) { + return new Answer(cmd); + } + + @Override + public Answer pingTest(PingTestCommand cmd) { + return new Answer(cmd); + } + + @Override + public PrepareForMigrationAnswer prepareForMigrate(PrepareForMigrationCommand cmd) { + VirtualMachineTO vm = cmd.getVirtualMachine(); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Preparing host for migrating " + vm); + } + return new PrepareForMigrationAnswer(cmd); + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public MaintainAnswer maintain(com.cloud.agent.api.MaintainCommand cmd) { + return new MaintainAnswer(cmd); + } @Override public Answer checkNetworkCommand(CheckNetworkCommand cmd) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Checking if network name setup is done on the resource"); - } - return new CheckNetworkAnswer(cmd, true , "Network Setup check by names is done"); + s_logger.debug("Checking if network name setup is done on the resource"); + } + return new CheckNetworkAnswer(cmd, true, "Network Setup check by names is done"); } } diff --git a/agent-simulator/src/com/cloud/agent/manager/MockStorageManagerImpl.java b/agent-simulator/src/com/cloud/agent/manager/MockStorageManagerImpl.java index 7b096fbd845..cc15b206738 100644 --- a/agent-simulator/src/com/cloud/agent/manager/MockStorageManagerImpl.java +++ b/agent-simulator/src/com/cloud/agent/manager/MockStorageManagerImpl.java @@ -84,650 +84,1215 @@ import com.cloud.simulator.dao.MockSecStorageDao; import com.cloud.simulator.dao.MockStoragePoolDao; import com.cloud.simulator.dao.MockVMDao; import com.cloud.simulator.dao.MockVolumeDao; +import com.cloud.storage.Storage; import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.template.TemplateInfo; import com.cloud.utils.component.Inject; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.DiskProfile; import com.cloud.vm.VirtualMachine.State; - @Local(value = { MockStorageManager.class }) public class MockStorageManagerImpl implements MockStorageManager { - private static final Logger s_logger = Logger.getLogger(MockStorageManagerImpl.class); - @Inject MockStoragePoolDao _mockStoragePoolDao = null; - @Inject MockSecStorageDao _mockSecStorageDao = null; - @Inject MockVolumeDao _mockVolumeDao = null; - @Inject MockVMDao _mockVMDao = null; - @Inject MockHostDao _mockHostDao = null; + private static final Logger s_logger = Logger.getLogger(MockStorageManagerImpl.class); + @Inject + MockStoragePoolDao _mockStoragePoolDao = null; + @Inject + MockSecStorageDao _mockSecStorageDao = null; + @Inject + MockVolumeDao _mockVolumeDao = null; + @Inject + MockVMDao _mockVMDao = null; + @Inject + MockHostDao _mockHostDao = null; - private MockVolumeVO findVolumeFromSecondary(String path, String ssUrl, MockVolumeType type) { - - String volumePath = path.replaceAll(ssUrl, ""); - - MockSecStorageVO secStorage = _mockSecStorageDao.findByUrl(ssUrl); - if (secStorage == null) { - return null; - } - - volumePath = secStorage.getMountPoint() + volumePath; - volumePath = volumePath.replaceAll("//", "/"); - - MockVolumeVO volume = _mockVolumeDao.findByStoragePathAndType(volumePath); - if (volume == null) { - return null; - } - - return volume; - } - @Override - public PrimaryStorageDownloadAnswer primaryStorageDownload(PrimaryStorageDownloadCommand cmd) { - MockVolumeVO template = findVolumeFromSecondary(cmd.getUrl(),cmd.getSecondaryStorageUrl(), MockVolumeType.TEMPLATE); - if (template == null) { - return new PrimaryStorageDownloadAnswer("Can't find primary storage"); - } - - MockStoragePoolVO primaryStorage = _mockStoragePoolDao.findByUuid(cmd.getPoolUuid()); - if (primaryStorage == null) { - return new PrimaryStorageDownloadAnswer("Can't find primary storage"); - } - - String volumeName = UUID.randomUUID().toString(); - MockVolumeVO newVolume = new MockVolumeVO(); - newVolume.setName(volumeName); - newVolume.setPath(primaryStorage.getMountPoint() + volumeName); - newVolume.setPoolId(primaryStorage.getId()); - newVolume.setSize(template.getSize()); - newVolume.setType(MockVolumeType.VOLUME); - _mockVolumeDao.persist(newVolume); - - - return new PrimaryStorageDownloadAnswer(newVolume.getPath(), newVolume.getSize()); - } + private MockVolumeVO findVolumeFromSecondary(String path, String ssUrl, MockVolumeType type) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + String volumePath = path.replaceAll(ssUrl, ""); + MockSecStorageVO secStorage = _mockSecStorageDao.findByUrl(ssUrl); + if (secStorage == null) { + return null; + } + volumePath = secStorage.getMountPoint() + volumePath; + volumePath = volumePath.replaceAll("//", "/"); + MockVolumeVO volume = _mockVolumeDao.findByStoragePathAndType(volumePath); + txn.commit(); + if (volume == null) { + return null; + } + return volume; + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Unable to find volume " + path + " on secondary " + ssUrl, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } - @Override - public CreateAnswer createVolume(CreateCommand cmd) { - StorageFilerTO sf = cmd.getPool(); - DiskProfile dskch = cmd.getDiskCharacteristics(); - MockStoragePoolVO storagePool = _mockStoragePoolDao.findByUuid(sf.getUuid()); - if (storagePool == null) { - return new CreateAnswer(cmd, "Failed to find storage pool: " + sf.getUuid()); - } - - String volumeName = UUID.randomUUID().toString(); - MockVolumeVO volume = new MockVolumeVO(); - volume.setPoolId(storagePool.getId()); - volume.setName(volumeName); - volume.setPath(storagePool.getMountPoint() + volumeName); - volume.setSize(dskch.getSize()); - volume.setType(MockVolumeType.VOLUME); - volume = _mockVolumeDao.persist(volume); - - VolumeTO volumeTo = new VolumeTO(cmd.getVolumeId(), dskch.getType(), sf.getType(), sf.getUuid(), - volume.getName(), storagePool.getMountPoint(), volume.getPath(), volume.getSize(), null); - - return new CreateAnswer(cmd, volumeTo); - } + @Override + public PrimaryStorageDownloadAnswer primaryStorageDownload(PrimaryStorageDownloadCommand cmd) { + MockVolumeVO template = findVolumeFromSecondary(cmd.getUrl(), cmd.getSecondaryStorageUrl(), + MockVolumeType.TEMPLATE); + if (template == null) { + return new PrimaryStorageDownloadAnswer("Can't find primary storage"); + } - @Override - public AttachVolumeAnswer AttachVolume(AttachVolumeCommand cmd) { - String poolid = cmd.getPoolUuid(); - String volumeName = cmd.getVolumeName(); - MockVolumeVO volume = _mockVolumeDao.findByStoragePathAndType(cmd.getVolumePath()); - if (volume == null) { - return new AttachVolumeAnswer(cmd, "Can't find volume:" + volumeName + "on pool:" + poolid); - } - - String vmName = cmd.getVmName(); - MockVMVO vm = _mockVMDao.findByVmName(vmName); - if (vm == null) { - return new AttachVolumeAnswer(cmd, "can't vm :" + vmName); - } - - return new AttachVolumeAnswer(cmd, cmd.getDeviceId()); - } + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockStoragePoolVO primaryStorage = null; + try { + txn.start(); + primaryStorage = _mockStoragePoolDao.findByUuid(cmd.getPoolUuid()); + txn.commit(); + if (primaryStorage == null) { + return new PrimaryStorageDownloadAnswer("Can't find primary storage"); + } + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when finding primary storagee " + cmd.getPoolUuid(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } - @Override - public Answer AttachIso(AttachIsoCommand cmd) { - MockVolumeVO iso = findVolumeFromSecondary(cmd.getIsoPath(), cmd.getStoreUrl(), MockVolumeType.ISO); - if (iso == null) { - return new Answer(cmd, false, "Failed to find the iso: " + cmd.getIsoPath() + "on secondary storage " + cmd.getStoreUrl()); - } - - String vmName = cmd.getVmName(); - MockVMVO vm = _mockVMDao.findByVmName(vmName); - if (vm == null) { - return new Answer(cmd, false, "can't vm :" + vmName); - } - - return new Answer(cmd); - } + String volumeName = UUID.randomUUID().toString(); + MockVolumeVO newVolume = new MockVolumeVO(); + newVolume.setName(volumeName); + newVolume.setPath(primaryStorage.getMountPoint() + volumeName); + newVolume.setPoolId(primaryStorage.getId()); + newVolume.setSize(template.getSize()); + newVolume.setType(MockVolumeType.VOLUME); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + _mockVolumeDao.persist(newVolume); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when saving volume " + newVolume, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return new PrimaryStorageDownloadAnswer(newVolume.getPath(), newVolume.getSize()); + } - @Override - public Answer DeleteStoragePool(DeleteStoragePoolCommand cmd) { - MockStoragePoolVO storage = _mockStoragePoolDao.findByUuid(cmd.getPool().getUuid()); - if (storage == null) { - return new Answer(cmd, false, "can't find storage pool:" + cmd.getPool().getUuid()); - } - _mockStoragePoolDao.remove(storage.getId()); - return new Answer(cmd); - } + @Override + public CreateAnswer createVolume(CreateCommand cmd) { + StorageFilerTO sf = cmd.getPool(); + DiskProfile dskch = cmd.getDiskCharacteristics(); + MockStoragePoolVO storagePool = null; + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + storagePool = _mockStoragePoolDao.findByUuid(sf.getUuid()); + txn.commit(); + if (storagePool == null) { + return new CreateAnswer(cmd, "Failed to find storage pool: " + sf.getUuid()); + } + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when finding storage " + sf.getUuid(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } - @Override - public ModifyStoragePoolAnswer ModifyStoragePool(ModifyStoragePoolCommand cmd) { - StorageFilerTO sf = cmd.getPool(); - MockStoragePoolVO storagePool = _mockStoragePoolDao.findByUuid(sf.getUuid()); - if (storagePool == null) { - storagePool = new MockStoragePoolVO(); - storagePool.setUuid(sf.getUuid()); - storagePool.setMountPoint("/mnt/" + sf.getUuid() + File.separator); - - Long size = DEFAULT_HOST_STORAGE_SIZE; - String path = sf.getPath(); - int index = path.lastIndexOf("/"); - if (index != -1) { - path = path.substring(index+1); - if (path != null) { - String values[] = path.split("="); - if (values.length > 1 && values[0].equalsIgnoreCase("size")) { - size = Long.parseLong(values[1]); - } - } - } - - storagePool.setCapacity(size); - - storagePool.setStorageType(sf.getType()); - storagePool = _mockStoragePoolDao.persist(storagePool); - } + String volumeName = UUID.randomUUID().toString(); + MockVolumeVO volume = new MockVolumeVO(); + volume.setPoolId(storagePool.getId()); + volume.setName(volumeName); + volume.setPath(storagePool.getMountPoint() + volumeName); + volume.setSize(dskch.getSize()); + volume.setType(MockVolumeType.VOLUME); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + volume = _mockVolumeDao.persist(volume); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when saving volume " + volume, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } - return new ModifyStoragePoolAnswer(cmd, storagePool.getCapacity(), 0, new HashMap()); - } + VolumeTO volumeTo = new VolumeTO(cmd.getVolumeId(), dskch.getType(), sf.getType(), sf.getUuid(), + volume.getName(), storagePool.getMountPoint(), volume.getPath(), volume.getSize(), null); - @Override - public Answer CreateStoragePool(CreateStoragePoolCommand cmd) { - StorageFilerTO sf = cmd.getPool(); - MockStoragePoolVO storagePool = _mockStoragePoolDao.findByUuid(sf.getUuid()); - if (storagePool == null) { - storagePool = new MockStoragePoolVO(); - storagePool.setUuid(sf.getUuid()); - storagePool.setMountPoint("/mnt/" + sf.getUuid() + File.separator); + return new CreateAnswer(cmd, volumeTo); + } - Long size = DEFAULT_HOST_STORAGE_SIZE; - String path = sf.getPath(); - int index = path.lastIndexOf("/"); - if (index != -1) { - path = path.substring(index+1); - if (path != null) { - String values[] = path.split("="); - if (values.length > 1 && values[0].equalsIgnoreCase("size")) { - size = Long.parseLong(values[1]); - } - } - } - storagePool.setCapacity(size); - - storagePool.setStorageType(sf.getType()); - storagePool = _mockStoragePoolDao.persist(storagePool); - } + @Override + public AttachVolumeAnswer AttachVolume(AttachVolumeCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + String poolid = cmd.getPoolUuid(); + String volumeName = cmd.getVolumeName(); + MockVolumeVO volume = _mockVolumeDao.findByStoragePathAndType(cmd.getVolumePath()); + if (volume == null) { + return new AttachVolumeAnswer(cmd, "Can't find volume:" + volumeName + "on pool:" + poolid); + } - return new ModifyStoragePoolAnswer(cmd, storagePool.getCapacity(), 0, new HashMap()); - } + String vmName = cmd.getVmName(); + MockVMVO vm = _mockVMDao.findByVmName(vmName); + if (vm == null) { + return new AttachVolumeAnswer(cmd, "can't vm :" + vmName); + } + txn.commit(); - @Override - public Answer SecStorageSetup(SecStorageSetupCommand cmd) { - MockSecStorageVO storage = _mockSecStorageDao.findByUrl(cmd.getSecUrl()); - if (storage == null) { - return new Answer(cmd, false, "can't find the storage"); - } - return new SecStorageSetupAnswer(storage.getMountPoint()); - } + return new AttachVolumeAnswer(cmd, cmd.getDeviceId()); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when attaching volume " + cmd.getVolumeName() + " to VM " + + cmd.getVmName(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } - @Override - public Answer ListTemplates(ListTemplateCommand cmd) { - MockSecStorageVO storage = _mockSecStorageDao.findByUrl(cmd.getSecUrl()); - if (storage == null) { - return new Answer(cmd, false, "Failed to get secondary storage"); - } - - List templates = _mockVolumeDao.findByStorageIdAndType(storage.getId(), MockVolumeType.TEMPLATE); - Map templateInfos = new HashMap(); - for (MockVolumeVO template : templates) { - templateInfos.put(template.getName(), new TemplateInfo(template.getName(), template.getPath().replaceAll(storage.getMountPoint(), ""), template.getSize(), template.getSize(), true, false)); - } - - return new ListTemplateAnswer(cmd.getSecUrl(), templateInfos); - - } + @Override + public Answer AttachIso(AttachIsoCommand cmd) { + MockVolumeVO iso = findVolumeFromSecondary(cmd.getIsoPath(), cmd.getStoreUrl(), MockVolumeType.ISO); + if (iso == null) { + return new Answer(cmd, false, "Failed to find the iso: " + cmd.getIsoPath() + "on secondary storage " + + cmd.getStoreUrl()); + } - @Override - public Answer Destroy(DestroyCommand cmd) { + String vmName = cmd.getVmName(); + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockVMVO vm = null; + try { + txn.start(); + vm = _mockVMDao.findByVmName(vmName); + txn.commit(); + if (vm == null) { + return new Answer(cmd, false, "can't vm :" + vmName); + } + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when attaching iso to vm " + vm.getName(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return new Answer(cmd); + } - MockVolumeVO volume = _mockVolumeDao.findByStoragePathAndType(cmd.getVolume().getPath()); - if (volume != null) { - _mockVolumeDao.remove(volume.getId()); - } - - if (cmd.getVmName() != null) { - MockVm vm = _mockVMDao.findByVmName(cmd.getVmName()); - vm.setState(State.Expunging); - if (vm != null ) { - MockVMVO vmVo = _mockVMDao.createForUpdate(vm.getId()); - _mockVMDao.update(vm.getId(), vmVo); - } - } - return new Answer(cmd); - } + @Override + public Answer DeleteStoragePool(DeleteStoragePoolCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + MockStoragePoolVO storage = _mockStoragePoolDao.findByUuid(cmd.getPool().getUuid()); + if (storage == null) { + return new Answer(cmd, false, "can't find storage pool:" + cmd.getPool().getUuid()); + } + _mockStoragePoolDao.remove(storage.getId()); + txn.commit(); + return new Answer(cmd); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when deleting storage pool " + cmd.getPool().getPath(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } - @Override - public DownloadAnswer Download(DownloadCommand cmd) { - MockSecStorageVO ssvo = _mockSecStorageDao.findByUrl(cmd.getSecUrl()); - if (ssvo == null) { - return new DownloadAnswer("can't find secondary storage", VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR); - } - - MockVolumeVO volume = new MockVolumeVO(); - volume.setPoolId(ssvo.getId()); - volume.setName(cmd.getName()); - volume.setPath(ssvo.getMountPoint() + cmd.getName()); - volume.setSize(0); - volume.setType(MockVolumeType.TEMPLATE); - volume.setStatus(Status.DOWNLOAD_IN_PROGRESS); - volume = _mockVolumeDao.persist(volume); - - return new DownloadAnswer(String.valueOf(volume.getId()), 0, "Downloading", Status.DOWNLOAD_IN_PROGRESS, cmd.getName(), cmd.getName(), volume.getSize(), volume.getSize(), null); - } + @Override + public ModifyStoragePoolAnswer ModifyStoragePool(ModifyStoragePoolCommand cmd) { + StorageFilerTO sf = cmd.getPool(); + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockStoragePoolVO storagePool = null; + try { + txn.start(); + storagePool = _mockStoragePoolDao.findByUuid(sf.getUuid()); + if (storagePool == null) { + storagePool = new MockStoragePoolVO(); + storagePool.setUuid(sf.getUuid()); + storagePool.setMountPoint("/mnt/" + sf.getUuid() + File.separator); - @Override - public DownloadAnswer DownloadProcess(DownloadProgressCommand cmd) { - String volumeId = cmd.getJobId(); - MockVolumeVO volume = _mockVolumeDao.findById(Long.parseLong(volumeId)); - if (volume == null) { - return new DownloadAnswer("Can't find the downloading volume", Status.ABANDONED); - } - - long size = Math.min(volume.getSize() + DEFAULT_TEMPLATE_SIZE/5, DEFAULT_TEMPLATE_SIZE); - volume.setSize(size); - - double volumeSize = volume.getSize(); - double pct = volumeSize/DEFAULT_TEMPLATE_SIZE; - if (pct >= 1.0) { - volume.setStatus(Status.DOWNLOADED); - _mockVolumeDao.update(volume.getId(), volume); - return new DownloadAnswer(cmd.getJobId(), 100, cmd, com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOADED, volume.getPath(), volume.getName()); - } else { - _mockVolumeDao.update(volume.getId(), volume); - return new DownloadAnswer(cmd.getJobId(), (int)(pct*100.0) , cmd, com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOAD_IN_PROGRESS, volume.getPath(), volume.getName()); - } - } + Long size = DEFAULT_HOST_STORAGE_SIZE; + String path = sf.getPath(); + int index = path.lastIndexOf("/"); + if (index != -1) { + path = path.substring(index + 1); + if (path != null) { + String values[] = path.split("="); + if (values.length > 1 && values[0].equalsIgnoreCase("size")) { + size = Long.parseLong(values[1]); + } + } + } + storagePool.setCapacity(size); + storagePool.setStorageType(sf.getType()); + storagePool = _mockStoragePoolDao.persist(storagePool); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when modifying storage pool " + cmd.getPool().getPath(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return new ModifyStoragePoolAnswer(cmd, storagePool.getCapacity(), 0, new HashMap()); + } - @Override - public GetStorageStatsAnswer GetStorageStats(GetStorageStatsCommand cmd) { - String uuid = cmd.getStorageId(); - if (uuid == null) { - String secUrl = cmd.getSecUrl(); - MockSecStorageVO secondary = _mockSecStorageDao.findByUrl(secUrl); - if (secondary == null) { - return new GetStorageStatsAnswer(cmd, "Can't find the secondary storage:" + secUrl); - } - Long totalUsed = _mockVolumeDao.findTotalStorageId(secondary.getId()); - return new GetStorageStatsAnswer(cmd, secondary.getCapacity(), totalUsed); - } else { - MockStoragePoolVO pool = _mockStoragePoolDao.findByUuid(uuid); - if (pool == null) { - return new GetStorageStatsAnswer(cmd, "Can't find the pool"); - } - Long totalUsed = _mockVolumeDao.findTotalStorageId(pool.getId()); - if (totalUsed == null) { - totalUsed = 0L; - } - return new GetStorageStatsAnswer(cmd, pool.getCapacity(), totalUsed); - } - } + @Override + public Answer CreateStoragePool(CreateStoragePoolCommand cmd) { + StorageFilerTO sf = cmd.getPool(); + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockStoragePoolVO storagePool = null; + try { + txn.start(); + storagePool = _mockStoragePoolDao.findByUuid(sf.getUuid()); + if (storagePool == null) { + storagePool = new MockStoragePoolVO(); + storagePool.setUuid(sf.getUuid()); + storagePool.setMountPoint("/mnt/" + sf.getUuid() + File.separator); - @Override - public ManageSnapshotAnswer ManageSnapshot(ManageSnapshotCommand cmd) { - String volPath = cmd.getVolumePath(); - - MockVolumeVO volume = _mockVolumeDao.findByStoragePathAndType(volPath); - if (volume == null) { - return new ManageSnapshotAnswer(cmd, false, "Can't find the volume"); - } - MockStoragePoolVO storagePool = _mockStoragePoolDao.findById(volume.getPoolId()); - if (storagePool == null) { - return new ManageSnapshotAnswer(cmd, false, "Can't find the storage pooll"); - } - - String mountPoint = storagePool.getMountPoint(); - MockVolumeVO snapshot = new MockVolumeVO(); - - snapshot.setName(cmd.getSnapshotName()); - snapshot.setPath(mountPoint + cmd.getSnapshotName()); - snapshot.setSize(volume.getSize()); - snapshot.setPoolId(storagePool.getId()); - snapshot.setType(MockVolumeType.SNAPSHOT); - snapshot.setStatus(Status.DOWNLOADED); - - snapshot = _mockVolumeDao.persist(snapshot); - - return new ManageSnapshotAnswer(cmd, snapshot.getId(), snapshot.getPath(), true, ""); - } + Long size = DEFAULT_HOST_STORAGE_SIZE; + String path = sf.getPath(); + int index = path.lastIndexOf("/"); + if (index != -1) { + path = path.substring(index + 1); + if (path != null) { + String values[] = path.split("="); + if (values.length > 1 && values[0].equalsIgnoreCase("size")) { + size = Long.parseLong(values[1]); + } + } + } + storagePool.setCapacity(size); + storagePool.setStorageType(sf.getType()); + storagePool = _mockStoragePoolDao.persist(storagePool); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when creating storage pool " + cmd.getPool().getPath(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return new ModifyStoragePoolAnswer(cmd, storagePool.getCapacity(), 0, new HashMap()); + } - @Override - public BackupSnapshotAnswer BackupSnapshot(BackupSnapshotCommand cmd, SimulatorInfo info) { - //emulate xenserver backupsnapshot, if the base volume is deleted, then backupsnapshot failed - MockVolumeVO volume = _mockVolumeDao.findByStoragePathAndType(cmd.getVolumePath()); - if (volume == null) { - return new BackupSnapshotAnswer(cmd, false, "Can't find base volume: " + cmd.getVolumePath(), null, true); - } - String snapshotPath = cmd.getSnapshotUuid(); - MockVolumeVO snapshot = _mockVolumeDao.findByStoragePathAndType(snapshotPath); - if (snapshot == null) { - return new BackupSnapshotAnswer(cmd, false, "can't find snapshot" + snapshotPath, null, true); - } - - String secStorageUrl = cmd.getSecondaryStorageUrl(); - MockSecStorageVO secStorage = _mockSecStorageDao.findByUrl(secStorageUrl); - if (secStorage == null) { - return new BackupSnapshotAnswer(cmd, false, "can't find sec storage" + snapshotPath, null, true); - } - MockVolumeVO newsnapshot = new MockVolumeVO(); - String name = UUID.randomUUID().toString(); - newsnapshot.setName(name); - newsnapshot.setPath(secStorage.getMountPoint() + name); - newsnapshot.setPoolId(secStorage.getId()); - newsnapshot.setSize(snapshot.getSize()); - newsnapshot.setStatus(Status.DOWNLOADED); - newsnapshot.setType(MockVolumeType.SNAPSHOT); - newsnapshot = _mockVolumeDao.persist(newsnapshot); - - return new BackupSnapshotAnswer(cmd, true, null, newsnapshot.getName(), true); - } + @Override + public Answer SecStorageSetup(SecStorageSetupCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockSecStorageVO storage = null; + try { + txn.start(); + storage = _mockSecStorageDao.findByUrl(cmd.getSecUrl()); + if (storage == null) { + return new Answer(cmd, false, "can't find the storage"); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when setting up sec storage" + cmd.getSecUrl(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return new SecStorageSetupAnswer(storage.getMountPoint()); + } - @Override - public Answer DeleteSnapshotBackup(DeleteSnapshotBackupCommand cmd) { - - MockVolumeVO backSnapshot = _mockVolumeDao.findByName(cmd.getSnapshotUuid()); - if (backSnapshot == null) { - return new Answer(cmd, false, "can't find the backupsnapshot: " + cmd.getSnapshotUuid()); - } - - _mockVolumeDao.remove(backSnapshot.getId()); - - return new Answer(cmd); - } + @Override + public Answer ListTemplates(ListTemplateCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockSecStorageVO storage = null; + try { + txn.start(); + storage = _mockSecStorageDao.findByUrl(cmd.getSecUrl()); + if (storage == null) { + return new Answer(cmd, false, "Failed to get secondary storage"); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when finding sec storage " + cmd.getSecUrl(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } - @Override - public CreateVolumeFromSnapshotAnswer CreateVolumeFromSnapshot(CreateVolumeFromSnapshotCommand cmd) { - MockVolumeVO backSnapshot = _mockVolumeDao.findByName(cmd.getSnapshotUuid()); - if (backSnapshot == null) { - return new CreateVolumeFromSnapshotAnswer(cmd, false, "can't find the backupsnapshot: " + cmd.getSnapshotUuid(), null); - } - - MockStoragePoolVO primary = _mockStoragePoolDao.findByUuid(cmd.getPrimaryStoragePoolNameLabel()); - if (primary == null) { - return new CreateVolumeFromSnapshotAnswer(cmd, false, "can't find the primary storage: " + cmd.getPrimaryStoragePoolNameLabel(), null); - } - - String uuid = UUID.randomUUID().toString(); - MockVolumeVO volume = new MockVolumeVO(); - - volume.setName(uuid); - volume.setPath(primary.getMountPoint() + uuid); - volume.setPoolId(primary.getId()); - volume.setSize(backSnapshot.getSize()); - volume.setStatus(Status.DOWNLOADED); - volume.setType(MockVolumeType.VOLUME); - _mockVolumeDao.persist(volume); - - return new CreateVolumeFromSnapshotAnswer(cmd, true, null, volume.getPath()); - } + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + List templates = _mockVolumeDao.findByStorageIdAndType(storage.getId(), + MockVolumeType.TEMPLATE); - @Override - public Answer DeleteTemplate(DeleteTemplateCommand cmd) { - MockVolumeVO template = _mockVolumeDao.findByStoragePathAndType(cmd.getTemplatePath()); - if (template == null) { - return new Answer(cmd, false, "can't find template:" + cmd.getTemplatePath()); - } - - _mockVolumeDao.remove(template.getId()); - - return new Answer(cmd); - } + Map templateInfos = new HashMap(); + for (MockVolumeVO template : templates) { + templateInfos.put(template.getName(), new TemplateInfo(template.getName(), template.getPath() + .replaceAll(storage.getMountPoint(), ""), template.getSize(), template.getSize(), true, false)); + } + txn.commit(); + return new ListTemplateAnswer(cmd.getSecUrl(), templateInfos); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when finding template on sec storage " + storage.getId(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } - @Override - public Answer SecStorageVMSetup(SecStorageVMSetupCommand cmd) { - return new Answer(cmd); - } + @Override + public Answer Destroy(DestroyCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + MockVolumeVO volume = _mockVolumeDao.findByStoragePathAndType(cmd.getVolume().getPath()); + if (volume != null) { + _mockVolumeDao.remove(volume.getId()); + } - @Override - public boolean configure(String name, Map params) throws ConfigurationException { - // TODO Auto-generated method stub - return true; - } + if (cmd.getVmName() != null) { + MockVm vm = _mockVMDao.findByVmName(cmd.getVmName()); + vm.setState(State.Expunging); + if (vm != null) { + MockVMVO vmVo = _mockVMDao.createForUpdate(vm.getId()); + _mockVMDao.update(vm.getId(), vmVo); + } + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when destroying volume " + cmd.getVolume().getPath(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return new Answer(cmd); + } - @Override - public boolean start() { - // TODO Auto-generated method stub - return true; - } + @Override + public DownloadAnswer Download(DownloadCommand cmd) { + MockSecStorageVO ssvo = null; + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + ssvo = _mockSecStorageDao.findByUrl(cmd.getSecUrl()); + if (ssvo == null) { + return new DownloadAnswer("can't find secondary storage", + VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error accessing secondary storage " + cmd.getSecUrl(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } - @Override - public boolean stop() { - // TODO Auto-generated method stub - return true; - } + MockVolumeVO volume = new MockVolumeVO(); + volume.setPoolId(ssvo.getId()); + volume.setName(cmd.getName()); + volume.setPath(ssvo.getMountPoint() + cmd.getName()); + volume.setSize(0); + volume.setType(MockVolumeType.TEMPLATE); + volume.setStatus(Status.DOWNLOAD_IN_PROGRESS); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + volume = _mockVolumeDao.persist(volume); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when saving volume " + volume, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return new DownloadAnswer(String.valueOf(volume.getId()), 0, "Downloading", Status.DOWNLOAD_IN_PROGRESS, + cmd.getName(), cmd.getName(), volume.getSize(), volume.getSize(), null); + } - @Override - public String getName() { - return this.getClass().getSimpleName(); - } + @Override + public DownloadAnswer DownloadProcess(DownloadProgressCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + String volumeId = cmd.getJobId(); + MockVolumeVO volume = _mockVolumeDao.findById(Long.parseLong(volumeId)); + if (volume == null) { + return new DownloadAnswer("Can't find the downloading volume", Status.ABANDONED); + } - @Override - public void preinstallTemplates(String url, long zoneId) { - MockSecStorageVO storage = _mockSecStorageDao.findByUrl(url); - if (storage == null) { - storage = new MockSecStorageVO(); - URI uri; - try { - uri = new URI(url); - } catch (URISyntaxException e) { - return; - } - - String nfsHost = uri.getHost(); - String nfsPath = uri.getPath(); - String path = nfsHost + ":" + nfsPath; - String dir = "/mnt/" + UUID.nameUUIDFromBytes(path.getBytes()).toString() + File.separator; - - storage.setUrl(url); - storage.setCapacity(DEFAULT_HOST_STORAGE_SIZE); - - storage.setMountPoint(dir); - - storage = _mockSecStorageDao.persist(storage); - - //preinstall default templates into secondary storage - long defaultTemplateSize = 2 * 1024 * 1024 * 1024L; - MockVolumeVO template = new MockVolumeVO(); - template.setName("simulator-domR"); - template.setPath(storage.getMountPoint() + "template/tmpl/1/9/" + UUID.randomUUID().toString()); - template.setPoolId(storage.getId()); - template.setSize(defaultTemplateSize); - template.setType(MockVolumeType.TEMPLATE); - template.setStatus(Status.DOWNLOADED); - _mockVolumeDao.persist(template); - - template = new MockVolumeVO(); - template.setName("simulator-Centos"); - template.setPath(storage.getMountPoint() + "template/tmpl/1/10/" + UUID.randomUUID().toString()); - template.setPoolId(storage.getId()); - template.setSize(defaultTemplateSize); - template.setType(MockVolumeType.TEMPLATE); - template.setStatus(Status.DOWNLOADED); - _mockVolumeDao.persist(template); - } - - } - - @Override - public StoragePoolInfo getLocalStorage(String hostGuid) { - MockHost host = _mockHostDao.findByGuid(hostGuid); - - MockStoragePoolVO storagePool = _mockStoragePoolDao.findByHost(hostGuid); - if (storagePool == null) { - String uuid = UUID.randomUUID().toString(); - storagePool = new MockStoragePoolVO(); - storagePool.setUuid(uuid); - storagePool.setMountPoint("/mnt/" + uuid + File.separator); - storagePool.setCapacity(DEFAULT_HOST_STORAGE_SIZE); - storagePool.setHostGuid(hostGuid); - storagePool.setStorageType(StoragePoolType.Filesystem); - storagePool = _mockStoragePoolDao.persist(storagePool); - } - - - return new StoragePoolInfo(storagePool.getUuid(), host.getPrivateIpAddress(), storagePool.getMountPoint(), storagePool.getMountPoint(), storagePool.getPoolType(), storagePool.getCapacity(), 0 ); - } - - @Override - public StoragePoolInfo getLocalStorage(String hostGuid, Long storageSize) { - MockHost host = _mockHostDao.findByGuid(hostGuid); - if (storageSize == null) { - storageSize = DEFAULT_HOST_STORAGE_SIZE; - } - MockStoragePoolVO storagePool = _mockStoragePoolDao.findByHost(hostGuid); - if (storagePool == null) { - String uuid = UUID.randomUUID().toString(); - storagePool = new MockStoragePoolVO(); - storagePool.setUuid(uuid); - storagePool.setMountPoint("/mnt/" + uuid + File.separator); - storagePool.setCapacity(storageSize); - storagePool.setHostGuid(hostGuid); - storagePool.setStorageType(StoragePoolType.Filesystem); - storagePool = _mockStoragePoolDao.persist(storagePool); - } - - - return new StoragePoolInfo(storagePool.getUuid(), host.getPrivateIpAddress(), storagePool.getMountPoint(), storagePool.getMountPoint(), storagePool.getPoolType(), storagePool.getCapacity(), 0 ); - } - - @Override - public CreatePrivateTemplateAnswer CreatePrivateTemplateFromSnapshot(CreatePrivateTemplateFromSnapshotCommand cmd) { - String snapshotUUId = cmd.getSnapshotUuid(); - MockVolumeVO snapshot = _mockVolumeDao.findByName(snapshotUUId); - if (snapshot == null) { - snapshotUUId = cmd.getSnapshotName(); - snapshot = _mockVolumeDao.findByName(snapshotUUId); - if (snapshot == null) { - return new CreatePrivateTemplateAnswer(cmd, false, "can't find snapshot:" + snapshotUUId); - } - } - - MockSecStorageVO sec = _mockSecStorageDao.findByUrl(cmd.getSecondaryStorageUrl()); - if (sec == null) { - return new CreatePrivateTemplateAnswer(cmd, false, "can't find secondary storage"); - } - - MockVolumeVO template = new MockVolumeVO(); - String uuid = UUID.randomUUID().toString(); - template.setName(uuid); - template.setPath(sec.getMountPoint() + uuid); - template.setPoolId(sec.getId()); - template.setSize(snapshot.getSize()); - template.setStatus(Status.DOWNLOADED); - template.setType(MockVolumeType.TEMPLATE); - template = _mockVolumeDao.persist(template); - - return new CreatePrivateTemplateAnswer(cmd, true, "", template.getName(), template.getSize(), template.getSize(), template.getName(), ImageFormat.QCOW2); - } - - @Override - public Answer ComputeChecksum(ComputeChecksumCommand cmd) { - MockVolumeVO volume = _mockVolumeDao.findByName(cmd.getTemplatePath()); - if (volume == null) { - return new Answer(cmd, false, "cant' find volume:" + cmd.getTemplatePath()); - } - String md5 = null; - try { - MessageDigest md = MessageDigest.getInstance("md5"); - md5 = String.format("%032x", new BigInteger(1, md.digest(cmd.getTemplatePath().getBytes()))); - } catch (NoSuchAlgorithmException e) { - s_logger.debug("failed to gernerate md5:" + e.toString()); - } - - return new Answer(cmd, true, md5); - } - @Override - public CreatePrivateTemplateAnswer CreatePrivateTemplateFromVolume(CreatePrivateTemplateFromVolumeCommand cmd) { - MockVolumeVO volume = _mockVolumeDao.findByStoragePathAndType(cmd.getVolumePath()); - if (volume == null) { - return new CreatePrivateTemplateAnswer(cmd, false, "cant' find volume" + cmd.getVolumePath()); - } - - MockSecStorageVO sec = _mockSecStorageDao.findByUrl(cmd.getSecondaryStorageUrl()); - if (sec == null) { - return new CreatePrivateTemplateAnswer(cmd, false, "can't find secondary storage"); - } - - MockVolumeVO template = new MockVolumeVO(); - String uuid = UUID.randomUUID().toString(); - template.setName(uuid); - template.setPath(sec.getMountPoint() + uuid); - template.setPoolId(sec.getId()); - template.setSize(volume.getSize()); - template.setStatus(Status.DOWNLOADED); - template.setType(MockVolumeType.TEMPLATE); - template = _mockVolumeDao.persist(template); - - return new CreatePrivateTemplateAnswer(cmd, true, "", template.getName(), template.getSize(), template.getSize(), template.getName(), ImageFormat.QCOW2); - } - - @Override - public CopyVolumeAnswer CopyVolume(CopyVolumeCommand cmd) { - boolean toSecondaryStorage = cmd.toSecondaryStorage(); - MockSecStorageVO sec = _mockSecStorageDao.findByUrl(cmd.getSecondaryStorageURL()); - if (sec == null) { - return new CopyVolumeAnswer(cmd, false, "can't find secondary storage", null, null); - } - MockStoragePoolVO primaryStorage = _mockStoragePoolDao.findByUuid(cmd.getPool().getUuid()); - if (primaryStorage == null) { - return new CopyVolumeAnswer(cmd, false, "Can't find primary storage", null, null); - } - - MockVolumeVO volume = _mockVolumeDao.findByStoragePathAndType(cmd.getVolumePath()); - if (volume == null) { - return new CopyVolumeAnswer(cmd, false, "cant' find volume" + cmd.getVolumePath(), null, null); - } - - String name = UUID.randomUUID().toString(); - if (toSecondaryStorage) { - - MockVolumeVO vol = new MockVolumeVO(); - - vol.setName(name); - vol.setPath(sec.getMountPoint() + name); - vol.setPoolId(sec.getId()); - vol.setSize(volume.getSize()); - vol.setStatus(Status.DOWNLOADED); - vol.setType(MockVolumeType.VOLUME); - vol = _mockVolumeDao.persist(vol); - return new CopyVolumeAnswer(cmd, true, null, sec.getMountPoint(), vol.getPath()); - } - else { - MockVolumeVO vol = new MockVolumeVO(); - vol.setName(name); - vol.setPath(primaryStorage.getMountPoint() + name); - vol.setPoolId(primaryStorage.getId()); - vol.setSize(volume.getSize()); - vol.setStatus(Status.DOWNLOADED); - vol.setType(MockVolumeType.VOLUME); - vol = _mockVolumeDao.persist(vol); - return new CopyVolumeAnswer(cmd, true, null, primaryStorage.getMountPoint(), vol.getPath()); - } - } - + long size = Math.min(volume.getSize() + DEFAULT_TEMPLATE_SIZE / 5, DEFAULT_TEMPLATE_SIZE); + volume.setSize(size); + + double volumeSize = volume.getSize(); + double pct = volumeSize / DEFAULT_TEMPLATE_SIZE; + if (pct >= 1.0) { + volume.setStatus(Status.DOWNLOADED); + _mockVolumeDao.update(volume.getId(), volume); + txn.commit(); + return new DownloadAnswer(cmd.getJobId(), 100, cmd, + com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOADED, volume.getPath(), + volume.getName()); + } else { + _mockVolumeDao.update(volume.getId(), volume); + txn.commit(); + return new DownloadAnswer(cmd.getJobId(), (int) (pct * 100.0), cmd, + com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOAD_IN_PROGRESS, volume.getPath(), + volume.getName()); + } + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error during download job " + cmd.getJobId(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } + + @Override + public GetStorageStatsAnswer GetStorageStats(GetStorageStatsCommand cmd) { + String uuid = cmd.getStorageId(); + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + if (uuid == null) { + String secUrl = cmd.getSecUrl(); + MockSecStorageVO secondary = _mockSecStorageDao.findByUrl(secUrl); + if (secondary == null) { + return new GetStorageStatsAnswer(cmd, "Can't find the secondary storage:" + secUrl); + } + Long totalUsed = _mockVolumeDao.findTotalStorageId(secondary.getId()); + txn.commit(); + return new GetStorageStatsAnswer(cmd, secondary.getCapacity(), totalUsed); + } else { + MockStoragePoolVO pool = _mockStoragePoolDao.findByUuid(uuid); + if (pool == null) { + return new GetStorageStatsAnswer(cmd, "Can't find the pool"); + } + Long totalUsed = _mockVolumeDao.findTotalStorageId(pool.getId()); + if (totalUsed == null) { + totalUsed = 0L; + } + txn.commit(); + return new GetStorageStatsAnswer(cmd, pool.getCapacity(), totalUsed); + } + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("DBException during storage stats collection for pool " + uuid, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } + + @Override + public ManageSnapshotAnswer ManageSnapshot(ManageSnapshotCommand cmd) { + String volPath = cmd.getVolumePath(); + MockVolumeVO volume = null; + MockStoragePoolVO storagePool = null; + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + volume = _mockVolumeDao.findByStoragePathAndType(volPath); + if (volume == null) { + return new ManageSnapshotAnswer(cmd, false, "Can't find the volume"); + } + storagePool = _mockStoragePoolDao.findById(volume.getPoolId()); + if (storagePool == null) { + return new ManageSnapshotAnswer(cmd, false, "Can't find the storage pooll"); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Unable to perform snapshot", ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + String mountPoint = storagePool.getMountPoint(); + MockVolumeVO snapshot = new MockVolumeVO(); + + snapshot.setName(cmd.getSnapshotName()); + snapshot.setPath(mountPoint + cmd.getSnapshotName()); + snapshot.setSize(volume.getSize()); + snapshot.setPoolId(storagePool.getId()); + snapshot.setType(MockVolumeType.SNAPSHOT); + snapshot.setStatus(Status.DOWNLOADED); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + snapshot = _mockVolumeDao.persist(snapshot); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when saving snapshot " + snapshot, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + return new ManageSnapshotAnswer(cmd, snapshot.getId(), snapshot.getPath(), true, ""); + } + + @Override + public BackupSnapshotAnswer BackupSnapshot(BackupSnapshotCommand cmd, SimulatorInfo info) { + // emulate xenserver backupsnapshot, if the base volume is deleted, then + // backupsnapshot failed + MockVolumeVO volume = null; + MockVolumeVO snapshot = null; + MockSecStorageVO secStorage = null; + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + volume = _mockVolumeDao.findByStoragePathAndType(cmd.getVolumePath()); + if (volume == null) { + return new BackupSnapshotAnswer(cmd, false, "Can't find base volume: " + cmd.getVolumePath(), null, + true); + } + String snapshotPath = cmd.getSnapshotUuid(); + snapshot = _mockVolumeDao.findByStoragePathAndType(snapshotPath); + if (snapshot == null) { + return new BackupSnapshotAnswer(cmd, false, "can't find snapshot" + snapshotPath, null, true); + } + + String secStorageUrl = cmd.getSecondaryStorageUrl(); + secStorage = _mockSecStorageDao.findByUrl(secStorageUrl); + if (secStorage == null) { + return new BackupSnapshotAnswer(cmd, false, "can't find sec storage" + snapshotPath, null, true); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when backing up snapshot"); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + MockVolumeVO newsnapshot = new MockVolumeVO(); + String name = UUID.randomUUID().toString(); + newsnapshot.setName(name); + newsnapshot.setPath(secStorage.getMountPoint() + name); + newsnapshot.setPoolId(secStorage.getId()); + newsnapshot.setSize(snapshot.getSize()); + newsnapshot.setStatus(Status.DOWNLOADED); + newsnapshot.setType(MockVolumeType.SNAPSHOT); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + snapshot = _mockVolumeDao.persist(snapshot); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when backing up snapshot " + newsnapshot, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + return new BackupSnapshotAnswer(cmd, true, null, newsnapshot.getName(), true); + } + + @Override + public Answer DeleteSnapshotBackup(DeleteSnapshotBackupCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + MockVolumeVO backSnapshot = _mockVolumeDao.findByName(cmd.getSnapshotUuid()); + if (backSnapshot == null) { + return new Answer(cmd, false, "can't find the backupsnapshot: " + cmd.getSnapshotUuid()); + } + _mockVolumeDao.remove(backSnapshot.getId()); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when deleting snapshot"); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return new Answer(cmd); + } + + @Override + public CreateVolumeFromSnapshotAnswer CreateVolumeFromSnapshot(CreateVolumeFromSnapshotCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockVolumeVO backSnapshot = null; + MockStoragePoolVO primary = null; + try { + txn.start(); + backSnapshot = _mockVolumeDao.findByName(cmd.getSnapshotUuid()); + if (backSnapshot == null) { + return new CreateVolumeFromSnapshotAnswer(cmd, false, "can't find the backupsnapshot: " + + cmd.getSnapshotUuid(), null); + } + + primary = _mockStoragePoolDao.findByUuid(cmd.getPrimaryStoragePoolNameLabel()); + if (primary == null) { + return new CreateVolumeFromSnapshotAnswer(cmd, false, "can't find the primary storage: " + + cmd.getPrimaryStoragePoolNameLabel(), null); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when creating volume from snapshot", ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + String uuid = UUID.randomUUID().toString(); + MockVolumeVO volume = new MockVolumeVO(); + + volume.setName(uuid); + volume.setPath(primary.getMountPoint() + uuid); + volume.setPoolId(primary.getId()); + volume.setSize(backSnapshot.getSize()); + volume.setStatus(Status.DOWNLOADED); + volume.setType(MockVolumeType.VOLUME); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + _mockVolumeDao.persist(volume); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when creating volume from snapshot " + volume, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + return new CreateVolumeFromSnapshotAnswer(cmd, true, null, volume.getPath()); + } + + @Override + public Answer DeleteTemplate(DeleteTemplateCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + MockVolumeVO template = _mockVolumeDao.findByStoragePathAndType(cmd.getTemplatePath()); + if (template == null) { + return new Answer(cmd, false, "can't find template:" + cmd.getTemplatePath()); + } + _mockVolumeDao.remove(template.getId()); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when deleting template"); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return new Answer(cmd); + } + + @Override + public Answer SecStorageVMSetup(SecStorageVMSetupCommand cmd) { + return new Answer(cmd); + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean start() { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean stop() { + // TODO Auto-generated method stub + return true; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public void preinstallTemplates(String url, long zoneId) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockSecStorageVO storage = null; + try { + txn.start(); + storage = _mockSecStorageDao.findByUrl(url); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Unable to find sec storage at " + url, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + if (storage == null) { + storage = new MockSecStorageVO(); + URI uri; + try { + uri = new URI(url); + } catch (URISyntaxException e) { + return; + } + + String nfsHost = uri.getHost(); + String nfsPath = uri.getPath(); + String path = nfsHost + ":" + nfsPath; + String dir = "/mnt/" + UUID.nameUUIDFromBytes(path.getBytes()).toString() + File.separator; + + storage.setUrl(url); + storage.setCapacity(DEFAULT_HOST_STORAGE_SIZE); + + storage.setMountPoint(dir); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + storage = _mockSecStorageDao.persist(storage); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when saving storage " + storage, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + // preinstall default templates into secondary storage + long defaultTemplateSize = 2 * 1024 * 1024 * 1024L; + MockVolumeVO template = new MockVolumeVO(); + template.setName("simulator-domR"); + template.setPath(storage.getMountPoint() + "template/tmpl/1/9/" + UUID.randomUUID().toString()); + template.setPoolId(storage.getId()); + template.setSize(defaultTemplateSize); + template.setType(MockVolumeType.TEMPLATE); + template.setStatus(Status.DOWNLOADED); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + template = _mockVolumeDao.persist(template); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when saving template " + template, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + template = new MockVolumeVO(); + template.setName("simulator-Centos"); + template.setPath(storage.getMountPoint() + "template/tmpl/1/10/" + UUID.randomUUID().toString()); + template.setPoolId(storage.getId()); + template.setSize(defaultTemplateSize); + template.setType(MockVolumeType.TEMPLATE); + template.setStatus(Status.DOWNLOADED); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + template = _mockVolumeDao.persist(template); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when saving template " + template, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } + + } + + @Override + public StoragePoolInfo getLocalStorage(String hostGuid) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockHost host = null; + MockStoragePoolVO storagePool = null; + try { + txn.start(); + host = _mockHostDao.findByGuid(hostGuid); + storagePool = _mockStoragePoolDao.findByHost(hostGuid); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Unable to find host " + hostGuid, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + if (storagePool == null) { + String uuid = UUID.randomUUID().toString(); + storagePool = new MockStoragePoolVO(); + storagePool.setUuid(uuid); + storagePool.setMountPoint("/mnt/" + uuid + File.separator); + storagePool.setCapacity(DEFAULT_HOST_STORAGE_SIZE); + storagePool.setHostGuid(hostGuid); + storagePool.setStorageType(StoragePoolType.Filesystem); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + storagePool = _mockStoragePoolDao.persist(storagePool); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when saving storagePool " + storagePool, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } + return new StoragePoolInfo(storagePool.getUuid(), host.getPrivateIpAddress(), storagePool.getMountPoint(), + storagePool.getMountPoint(), storagePool.getPoolType(), storagePool.getCapacity(), 0); + } + + @Override + public StoragePoolInfo getLocalStorage(String hostGuid, Long storageSize) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockHost host = null; + try { + txn.start(); + host = _mockHostDao.findByGuid(hostGuid); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Unable to find host " + hostGuid, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + if (storageSize == null) { + storageSize = DEFAULT_HOST_STORAGE_SIZE; + } + txn = Transaction.open(Transaction.SIMULATOR_DB); + MockStoragePoolVO storagePool = null; + try { + txn.start(); + storagePool = _mockStoragePoolDao.findByHost(hostGuid); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when finding storagePool " + storagePool, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + if (storagePool == null) { + String uuid = UUID.randomUUID().toString(); + storagePool = new MockStoragePoolVO(); + storagePool.setUuid(uuid); + storagePool.setMountPoint("/mnt/" + uuid + File.separator); + storagePool.setCapacity(storageSize); + storagePool.setHostGuid(hostGuid); + storagePool.setStorageType(StoragePoolType.Filesystem); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + storagePool = _mockStoragePoolDao.persist(storagePool); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when saving storagePool " + storagePool, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } + return new StoragePoolInfo(storagePool.getUuid(), host.getPrivateIpAddress(), storagePool.getMountPoint(), + storagePool.getMountPoint(), storagePool.getPoolType(), storagePool.getCapacity(), 0); + } + + @Override + public CreatePrivateTemplateAnswer CreatePrivateTemplateFromSnapshot(CreatePrivateTemplateFromSnapshotCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockVolumeVO snapshot = null; + MockSecStorageVO sec = null; + try { + txn.start(); + String snapshotUUId = cmd.getSnapshotUuid(); + snapshot = _mockVolumeDao.findByName(snapshotUUId); + if (snapshot == null) { + snapshotUUId = cmd.getSnapshotName(); + snapshot = _mockVolumeDao.findByName(snapshotUUId); + if (snapshot == null) { + return new CreatePrivateTemplateAnswer(cmd, false, "can't find snapshot:" + snapshotUUId); + } + } + + sec = _mockSecStorageDao.findByUrl(cmd.getSecondaryStorageUrl()); + if (sec == null) { + return new CreatePrivateTemplateAnswer(cmd, false, "can't find secondary storage"); + } + txn.commit(); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + MockVolumeVO template = new MockVolumeVO(); + String uuid = UUID.randomUUID().toString(); + template.setName(uuid); + template.setPath(sec.getMountPoint() + uuid); + template.setPoolId(sec.getId()); + template.setSize(snapshot.getSize()); + template.setStatus(Status.DOWNLOADED); + template.setType(MockVolumeType.TEMPLATE); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + template = _mockVolumeDao.persist(template); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when saving template " + template, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + return new CreatePrivateTemplateAnswer(cmd, true, "", template.getName(), template.getSize(), + template.getSize(), template.getName(), ImageFormat.QCOW2); + } + + @Override + public Answer ComputeChecksum(ComputeChecksumCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + MockVolumeVO volume = _mockVolumeDao.findByName(cmd.getTemplatePath()); + if (volume == null) { + return new Answer(cmd, false, "cant' find volume:" + cmd.getTemplatePath()); + } + String md5 = null; + try { + MessageDigest md = MessageDigest.getInstance("md5"); + md5 = String.format("%032x", new BigInteger(1, md.digest(cmd.getTemplatePath().getBytes()))); + } catch (NoSuchAlgorithmException e) { + s_logger.debug("failed to gernerate md5:" + e.toString()); + } + txn.commit(); + return new Answer(cmd, true, md5); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } + + @Override + public CreatePrivateTemplateAnswer CreatePrivateTemplateFromVolume(CreatePrivateTemplateFromVolumeCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockVolumeVO volume = null; + MockSecStorageVO sec = null; + try { + txn.start(); + volume = _mockVolumeDao.findByStoragePathAndType(cmd.getVolumePath()); + if (volume == null) { + return new CreatePrivateTemplateAnswer(cmd, false, "cant' find volume" + cmd.getVolumePath()); + } + + sec = _mockSecStorageDao.findByUrl(cmd.getSecondaryStorageUrl()); + if (sec == null) { + return new CreatePrivateTemplateAnswer(cmd, false, "can't find secondary storage"); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Error when creating private template from volume"); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + MockVolumeVO template = new MockVolumeVO(); + String uuid = UUID.randomUUID().toString(); + template.setName(uuid); + template.setPath(sec.getMountPoint() + uuid); + template.setPoolId(sec.getId()); + template.setSize(volume.getSize()); + template.setStatus(Status.DOWNLOADED); + template.setType(MockVolumeType.TEMPLATE); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + template = _mockVolumeDao.persist(template); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Encountered " + ex.getMessage() + " when persisting template " + + template.getName(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + return new CreatePrivateTemplateAnswer(cmd, true, "", template.getName(), template.getSize(), + template.getSize(), template.getName(), ImageFormat.QCOW2); + } + + @Override + public CopyVolumeAnswer CopyVolume(CopyVolumeCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + boolean toSecondaryStorage = cmd.toSecondaryStorage(); + MockSecStorageVO sec = null; + MockStoragePoolVO primaryStorage = null; + try { + txn.start(); + sec = _mockSecStorageDao.findByUrl(cmd.getSecondaryStorageURL()); + if (sec == null) { + return new CopyVolumeAnswer(cmd, false, "can't find secondary storage", null, null); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Encountered " + ex.getMessage() + " when accessing secondary at " + + cmd.getSecondaryStorageURL(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + primaryStorage = _mockStoragePoolDao.findByUuid(cmd.getPool().getUuid()); + if (primaryStorage == null) { + return new CopyVolumeAnswer(cmd, false, "Can't find primary storage", null, null); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Encountered " + ex.getMessage() + " when accessing primary at " + + cmd.getPool(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + MockVolumeVO volume = null; + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + volume = _mockVolumeDao.findByStoragePathAndType(cmd.getVolumePath()); + if (volume == null) { + return new CopyVolumeAnswer(cmd, false, "cant' find volume" + cmd.getVolumePath(), null, null); + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Encountered " + ex.getMessage() + " when accessing volume at " + + cmd.getVolumePath(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + + String name = UUID.randomUUID().toString(); + if (toSecondaryStorage) { + MockVolumeVO vol = new MockVolumeVO(); + vol.setName(name); + vol.setPath(sec.getMountPoint() + name); + vol.setPoolId(sec.getId()); + vol.setSize(volume.getSize()); + vol.setStatus(Status.DOWNLOADED); + vol.setType(MockVolumeType.VOLUME); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + vol = _mockVolumeDao.persist(vol); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Encountered " + ex.getMessage() + " when persisting volume " + + vol.getName(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return new CopyVolumeAnswer(cmd, true, null, sec.getMountPoint(), vol.getPath()); + } else { + MockVolumeVO vol = new MockVolumeVO(); + vol.setName(name); + vol.setPath(primaryStorage.getMountPoint() + name); + vol.setPoolId(primaryStorage.getId()); + vol.setSize(volume.getSize()); + vol.setStatus(Status.DOWNLOADED); + vol.setType(MockVolumeType.VOLUME); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + vol = _mockVolumeDao.persist(vol); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Encountered " + ex.getMessage() + " when persisting volume " + + vol.getName(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return new CopyVolumeAnswer(cmd, true, null, primaryStorage.getMountPoint(), vol.getPath()); + } + } } - diff --git a/agent-simulator/src/com/cloud/agent/manager/MockVmManagerImpl.java b/agent-simulator/src/com/cloud/agent/manager/MockVmManagerImpl.java index 9f420beffed..d740ab77eaf 100644 --- a/agent-simulator/src/com/cloud/agent/manager/MockVmManagerImpl.java +++ b/agent-simulator/src/com/cloud/agent/manager/MockVmManagerImpl.java @@ -75,6 +75,8 @@ import com.cloud.simulator.dao.MockVMDao; import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.component.Inject; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.VirtualMachine.State; @Local(value = { MockVmManager.class }) @@ -85,7 +87,7 @@ public class MockVmManagerImpl implements MockVmManager { @Inject MockAgentManager _mockAgentMgr = null; @Inject MockHostDao _mockHostDao = null; @Inject MockSecurityRulesDao _mockSecurityDao = null; - private Map>> _securityRules = new ConcurrentHashMap>>(); + private Map>> _securityRules = new ConcurrentHashMap>>(); public MockVmManagerImpl() { } @@ -101,12 +103,27 @@ public class MockVmManagerImpl implements MockVmManager { int cpuHz, long ramSize, String bootArgs, String hostGuid) { - MockHost host = _mockHostDao.findByGuid(hostGuid); - if (host == null) { - return "can't find host"; - } - - MockVm vm = _mockVmDao.findByVmName(vmName); + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + MockHost host = null; + MockVm vm = null; + try { + txn.start(); + host = _mockHostDao.findByGuid(hostGuid); + if (host == null) { + return "can't find host"; + } + + vm = _mockVmDao.findByVmName(vmName); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Unable to start VM " + vmName, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + if(vm == null) { int vncPort = 0; if(vncPort < 0) @@ -127,11 +144,35 @@ public class MockVmManagerImpl implements MockVmManager { } else if (vmName.startsWith("i-")) { vm.setType("User"); } - vm = _mockVmDao.persist((MockVMVO)vm); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + vm = _mockVmDao.persist((MockVMVO) vm); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("unable to save vm to db " + vm.getName(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } } else { if(vm.getState() == State.Stopped) { vm.setState(State.Running); - _mockVmDao.update(vm.getId(), (MockVMVO)vm); + txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + _mockVmDao.update(vm.getId(), (MockVMVO)vm); + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("unable to update vm " + vm.getName(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } } } @@ -179,37 +220,73 @@ public class MockVmManagerImpl implements MockVmManager { } public boolean rebootVM(String vmName) { - MockVm vm = _mockVmDao.findByVmName(vmName); - if(vm != null) { - vm.setState(State.Running); - _mockVmDao.update(vm.getId(), (MockVMVO)vm); - } - return true; + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + MockVm vm = _mockVmDao.findByVmName(vmName); + if (vm != null) { + vm.setState(State.Running); + _mockVmDao.update(vm.getId(), (MockVMVO) vm); + + } + txn.commit(); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("unable to reboot vm " + vmName, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + return true; } @Override - public Map getVms(String hostGuid) { - List vms = _mockVmDao.findByHostGuid(hostGuid); - Map vmMap = new HashMap(); - for (MockVMVO vm : vms) { - vmMap.put(vm.getName(), vm); + public Map getVms(String hostGuid) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + List vms = _mockVmDao.findByHostGuid(hostGuid); + Map vmMap = new HashMap(); + for (MockVMVO vm : vms) { + vmMap.put(vm.getName(), vm); + } + txn.commit(); + return vmMap; + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("unable to fetch vms from host " + hostGuid, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); } - return vmMap; } @Override - public Map getVmStates(String hostGuid) { - Map states = new HashMap(); - List vms = _mockVmDao.findByHostGuid(hostGuid); - if (vms.isEmpty()) { - return states; + public Map getVmStates(String hostGuid) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + Map states = new HashMap(); + List vms = _mockVmDao.findByHostGuid(hostGuid); + if (vms.isEmpty()) { + txn.commit(); + return states; + } + for (MockVm vm : vms) { + states.put(vm.getName(), vm.getState()); + } + txn.commit(); + return states; + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("unable to fetch vms from host " + hostGuid, ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); } - - for(MockVm vm : vms) { - states.put(vm.getName(), vm.getState()); - } - - return states; } @Override @@ -243,14 +320,26 @@ public class MockVmManagerImpl implements MockVmManager { } @Override - public CheckVirtualMachineAnswer checkVmState(CheckVirtualMachineCommand cmd) { - MockVMVO vm = _mockVmDao.findByVmName(cmd.getVmName()); - if (vm == null) { - return new CheckVirtualMachineAnswer(cmd, "can't find vm:" + cmd.getVmName()); - } - - return new CheckVirtualMachineAnswer(cmd, vm.getState(), vm.getVncPort()); - } + public CheckVirtualMachineAnswer checkVmState(CheckVirtualMachineCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + MockVMVO vm = _mockVmDao.findByVmName(cmd.getVmName()); + if (vm == null) { + return new CheckVirtualMachineAnswer(cmd, "can't find vm:" + cmd.getVmName()); + } + + txn.commit(); + return new CheckVirtualMachineAnswer(cmd, vm.getState(), vm.getVncPort()); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("unable to fetch vm state " + cmd.getVmName(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } @Override public Answer startVM(StartCommand cmd, SimulatorInfo info) { @@ -290,22 +379,34 @@ public class MockVmManagerImpl implements MockVmManager { } @Override - public MigrateAnswer Migrate(MigrateCommand cmd, SimulatorInfo info) { - String vmName = cmd.getVmName(); - String destGuid = cmd.getHostGuid(); - MockVMVO vm = _mockVmDao.findByVmNameAndHost(vmName, info.getHostUuid()); - if (vm == null) { - return new MigrateAnswer(cmd, false, "can;t find vm:" + vmName + " on host:" + info.getHostUuid(), null); - } - - MockHost destHost = _mockHostDao.findByGuid(destGuid); - if (destHost == null) { - return new MigrateAnswer(cmd, false, "can;t find host:" + info.getHostUuid(), null); - } - vm.setHostId(destHost.getId()); - _mockVmDao.update(vm.getId(), vm); - return new MigrateAnswer(cmd, true,null, 0); - } + public MigrateAnswer Migrate(MigrateCommand cmd, SimulatorInfo info) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + String vmName = cmd.getVmName(); + String destGuid = cmd.getHostGuid(); + MockVMVO vm = _mockVmDao.findByVmNameAndHost(vmName, info.getHostUuid()); + if (vm == null) { + return new MigrateAnswer(cmd, false, "can;t find vm:" + vmName + " on host:" + info.getHostUuid(), null); + } + + MockHost destHost = _mockHostDao.findByGuid(destGuid); + if (destHost == null) { + return new MigrateAnswer(cmd, false, "can;t find host:" + info.getHostUuid(), null); + } + vm.setHostId(destHost.getId()); + _mockVmDao.update(vm.getId(), vm); + txn.commit(); + return new MigrateAnswer(cmd, true, null, 0); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("unable to migrate vm " + cmd.getVmName(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } @Override public Answer IpAssoc(IpAssocCommand cmd) { @@ -328,37 +429,77 @@ public class MockVmManagerImpl implements MockVmManager { } @Override - public Answer CleanupNetworkRules(CleanupNetworkRulesCmd cmd, SimulatorInfo info) { - List rules = _mockSecurityDao.findByHost(info.getHostUuid()); - for (MockSecurityRulesVO rule : rules) { - MockVMVO vm = _mockVmDao.findByVmNameAndHost(rule.getVmName(), info.getHostUuid()); - if (vm == null) { - _mockSecurityDao.remove(rule.getId()); - } - } - return new Answer(cmd); - } + public Answer CleanupNetworkRules(CleanupNetworkRulesCmd cmd, SimulatorInfo info) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + List rules = _mockSecurityDao.findByHost(info.getHostUuid()); + for (MockSecurityRulesVO rule : rules) { + MockVMVO vm = _mockVmDao.findByVmNameAndHost(rule.getVmName(), info.getHostUuid()); + if (vm == null) { + _mockSecurityDao.remove(rule.getId()); + } + } + txn.commit(); + return new Answer(cmd); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("unable to clean up rules", ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } @Override - public Answer stopVM(StopCommand cmd) { - String vmName = cmd.getVmName(); - MockVm vm = _mockVmDao.findByVmName(vmName); - if(vm != null) { - vm.setState(State.Stopped); - _mockVmDao.update(vm.getId(), (MockVMVO)vm); - } + public Answer stopVM(StopCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + String vmName = cmd.getVmName(); + MockVm vm = _mockVmDao.findByVmName(vmName); + if (vm != null) { + vm.setState(State.Stopped); + _mockVmDao.update(vm.getId(), (MockVMVO) vm); + } - if (vmName.startsWith("s-")) { - _mockAgentMgr.handleSystemVMStop(vm.getId()); - } - - return new StopAnswer(cmd, null, new Integer(0), true); - } + if (vmName.startsWith("s-")) { + _mockAgentMgr.handleSystemVMStop(vm.getId()); + } + txn.commit(); + return new StopAnswer(cmd, null, new Integer(0), true); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("unable to stop vm " + cmd.getVmName(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } @Override - public Answer rebootVM(RebootCommand cmd) { - return new RebootAnswer(cmd, "Rebooted "+cmd.getVmName(), false); - } + public Answer rebootVM(RebootCommand cmd) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + MockVm vm = _mockVmDao.findByVmName(cmd.getVmName()); + if (vm != null) { + vm.setState(State.Running); + _mockVmDao.update(vm.getId(), (MockVMVO) vm); + } + txn.commit(); + return new RebootAnswer(cmd, "Rebooted " + cmd.getVmName(), true); + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("unable to stop vm " + cmd.getVmName(), ex); + } finally { + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + } + } @Override public Answer getVncPort(GetVncPortCommand cmd) { diff --git a/agent-simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java b/agent-simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java index b980939e387..60f76fd7482 100644 --- a/agent-simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java +++ b/agent-simulator/src/com/cloud/agent/manager/SimulatorManagerImpl.java @@ -34,6 +34,7 @@ import com.cloud.agent.api.CheckHealthCommand; import com.cloud.agent.api.CheckNetworkCommand; import com.cloud.agent.api.CheckVirtualMachineCommand; import com.cloud.agent.api.CleanupNetworkRulesCmd; +import com.cloud.agent.api.ClusterSyncAnswer; import com.cloud.agent.api.ClusterSyncCommand; import com.cloud.agent.api.Command; import com.cloud.agent.api.ComputeChecksumCommand; @@ -111,11 +112,11 @@ public class SimulatorManagerImpl implements SimulatorManager { public boolean configure(String name, Map params) throws ConfigurationException { /* try { - Connection conn = Transaction.getStandaloneConnectionWithException(); + Connection conn = Transaction.getStandaloneSimulatorConnection(); conn.setAutoCommit(true); _concierge = new ConnectionConcierge("SimulatorConnection", conn, true); } catch (SQLException e) { - throw new CloudRuntimeException("Unable to get a db connection", e); + throw new CloudRuntimeException("Unable to get a db connection to simulator", e); } */ return true; @@ -295,17 +296,20 @@ public class SimulatorManagerImpl implements SimulatorManager { return _mockVmMgr.getDomRVersion((GetDomRVersionCmd)cmd); } else if (cmd instanceof ClusterSyncCommand) { return new Answer(cmd); + //return new ClusterSyncAnswer(((ClusterSyncCommand) cmd).getClusterId(), this.getVmStates(hostGuid)); } else if (cmd instanceof CopyVolumeCommand) { return _mockStorageMgr.CopyVolume((CopyVolumeCommand)cmd); } else { return Answer.createUnsupportedCommandAnswer(cmd); } } catch(Exception e) { - s_logger.debug("Failed execute cmd: " + e.toString()); + s_logger.error("Failed execute cmd: " + e.toString()); txn.rollback(); return new Answer(cmd, false, e.toString()); } finally { - txn.transitToAutoManagedConnection(Transaction.CLOUD_DB); + txn.close(); + txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); } } @@ -315,53 +319,50 @@ public class SimulatorManagerImpl implements SimulatorManager { } @Override - public boolean configureSimulator(Long zoneId, Long podId, Long clusterId, Long hostId, String command, String values) { - MockConfigurationVO config = _mockConfigDao.findByCommand(zoneId, podId, clusterId, hostId, command); - if (config == null) { - config = new MockConfigurationVO(); - config.setClusterId(clusterId); - config.setDataCenterId(zoneId); - config.setPodId(podId); - config.setHostId(hostId); - config.setName(command); - config.setValues(values); - _mockConfigDao.persist(config); - } else { - config.setValues(values); - _mockConfigDao.update(config.getId(), config); - } - return true; - } - - @Override - @DB public Map getVmStates(String hostGuid) { - Transaction txn = Transaction.currentTxn(); - txn.transitToUserManagedConnection(_concierge.conn()); - try { - return _mockVmMgr.getVmStates(hostGuid); - } finally { - txn.transitToAutoManagedConnection(Transaction.CLOUD_DB); - } + return _mockVmMgr.getVmStates(hostGuid); } @Override - @DB public Map getVms(String hostGuid) { - Transaction txn = Transaction.currentTxn(); - txn.transitToUserManagedConnection(_concierge.conn()); - try { - return _mockVmMgr.getVms(hostGuid); - } finally { - txn.transitToAutoManagedConnection(Transaction.CLOUD_DB); - } + return _mockVmMgr.getVms(hostGuid); } - + @Override public HashMap> syncNetworkGroups(String hostGuid) { SimulatorInfo info = new SimulatorInfo(); info.setHostUuid(hostGuid); - return _mockVmMgr.syncNetworkGroups(info); + return _mockVmMgr.syncNetworkGroups(info); } + @Override + public boolean configureSimulator(Long zoneId, Long podId, Long clusterId, Long hostId, String command, + String values) { + Transaction txn = Transaction.open(Transaction.SIMULATOR_DB); + try { + txn.start(); + MockConfigurationVO config = _mockConfigDao.findByCommand(zoneId, podId, clusterId, hostId, command); + if (config == null) { + config = new MockConfigurationVO(); + config.setClusterId(clusterId); + config.setDataCenterId(zoneId); + config.setPodId(podId); + config.setHostId(hostId); + config.setName(command); + config.setValues(values); + _mockConfigDao.persist(config); + txn.commit(); + } else { + config.setValues(values); + _mockConfigDao.update(config.getId(), config); + txn.commit(); + } + } catch (Exception ex) { + txn.rollback(); + throw new CloudRuntimeException("Unable to configure simulator because of " + ex.getMessage(), ex); + } finally { + txn.close(); + } + return true; + } } diff --git a/agent-simulator/src/com/cloud/simulator/SimulatorRuntimeException.java b/agent-simulator/src/com/cloud/simulator/SimulatorRuntimeException.java new file mode 100644 index 00000000000..96a1e244584 --- /dev/null +++ b/agent-simulator/src/com/cloud/simulator/SimulatorRuntimeException.java @@ -0,0 +1,24 @@ +package com.cloud.simulator; + +import com.cloud.utils.SerialVersionUID; +import com.cloud.utils.exception.RuntimeCloudException; + +/** + * wrap exceptions that you know there's no point in dealing with. + */ +public class SimulatorRuntimeException extends RuntimeCloudException { + + private static final long serialVersionUID = SerialVersionUID.CloudRuntimeException; + + public SimulatorRuntimeException(String message) { + super(message); + } + + public SimulatorRuntimeException(String message, Throwable th) { + super(message, th); + } + + protected SimulatorRuntimeException() { + super(); + } +} \ No newline at end of file diff --git a/agent/distro/centos/SYSCONFDIR/rc.d/init.d/cloud-agent.in b/agent/distro/centos/SYSCONFDIR/rc.d/init.d/cloud-agent.in index 14b19e1d57e..fb82ebfab99 100755 --- a/agent/distro/centos/SYSCONFDIR/rc.d/init.d/cloud-agent.in +++ b/agent/distro/centos/SYSCONFDIR/rc.d/init.d/cloud-agent.in @@ -67,7 +67,7 @@ export CLASSPATH="$SCP:$DCP:$ACP:$JCP:@AGENTSYSCONFDIR@:@AGENTLIBDIR@" start() { echo -n $"Starting $PROGNAME: " if hostname --fqdn >/dev/null 2>&1 ; then - $JSVC -cp "$CLASSPATH" -pidfile "$PIDFILE" $CLASS + $JSVC -cp "$CLASSPATH" -pidfile "$PIDFILE" -errfile SYSLOG $CLASS RETVAL=$? echo else diff --git a/agent/distro/fedora/SYSCONFDIR/rc.d/init.d/cloud-agent.in b/agent/distro/fedora/SYSCONFDIR/rc.d/init.d/cloud-agent.in index 14b19e1d57e..fb82ebfab99 100755 --- a/agent/distro/fedora/SYSCONFDIR/rc.d/init.d/cloud-agent.in +++ b/agent/distro/fedora/SYSCONFDIR/rc.d/init.d/cloud-agent.in @@ -67,7 +67,7 @@ export CLASSPATH="$SCP:$DCP:$ACP:$JCP:@AGENTSYSCONFDIR@:@AGENTLIBDIR@" start() { echo -n $"Starting $PROGNAME: " if hostname --fqdn >/dev/null 2>&1 ; then - $JSVC -cp "$CLASSPATH" -pidfile "$PIDFILE" $CLASS + $JSVC -cp "$CLASSPATH" -pidfile "$PIDFILE" -errfile SYSLOG $CLASS RETVAL=$? echo else diff --git a/agent/distro/opensuse/sles/SYSCONFDIR/init.d/cloud-agent.in b/agent/distro/opensuse/sles/SYSCONFDIR/init.d/cloud-agent.in index 01606c72a0d..ea1c6059b60 100644 --- a/agent/distro/opensuse/sles/SYSCONFDIR/init.d/cloud-agent.in +++ b/agent/distro/opensuse/sles/SYSCONFDIR/init.d/cloud-agent.in @@ -97,7 +97,7 @@ start() { wait_for_network - if jsvc -cp "$CLASSPATH" -pidfile "$PIDFILE" $CLASS + if jsvc -cp "$CLASSPATH" -pidfile "$PIDFILE" -errfile SYSLOG $CLASS RETVAL=$? then rc=0 diff --git a/agent/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-agent.in b/agent/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-agent.in index 14b19e1d57e..fb82ebfab99 100644 --- a/agent/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-agent.in +++ b/agent/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-agent.in @@ -67,7 +67,7 @@ export CLASSPATH="$SCP:$DCP:$ACP:$JCP:@AGENTSYSCONFDIR@:@AGENTLIBDIR@" start() { echo -n $"Starting $PROGNAME: " if hostname --fqdn >/dev/null 2>&1 ; then - $JSVC -cp "$CLASSPATH" -pidfile "$PIDFILE" $CLASS + $JSVC -cp "$CLASSPATH" -pidfile "$PIDFILE" -errfile SYSLOG $CLASS RETVAL=$? echo else diff --git a/agent/distro/sles/SYSCONFDIR/init.d/cloud-agent.in b/agent/distro/sles/SYSCONFDIR/init.d/cloud-agent.in index 01606c72a0d..ea1c6059b60 100644 --- a/agent/distro/sles/SYSCONFDIR/init.d/cloud-agent.in +++ b/agent/distro/sles/SYSCONFDIR/init.d/cloud-agent.in @@ -97,7 +97,7 @@ start() { wait_for_network - if jsvc -cp "$CLASSPATH" -pidfile "$PIDFILE" $CLASS + if jsvc -cp "$CLASSPATH" -pidfile "$PIDFILE" -errfile SYSLOG $CLASS RETVAL=$? then rc=0 diff --git a/agent/distro/ubuntu/SYSCONFDIR/init.d/cloud-agent.in b/agent/distro/ubuntu/SYSCONFDIR/init.d/cloud-agent.in index c657ed2887d..0e8705307e8 100755 --- a/agent/distro/ubuntu/SYSCONFDIR/init.d/cloud-agent.in +++ b/agent/distro/ubuntu/SYSCONFDIR/init.d/cloud-agent.in @@ -99,7 +99,7 @@ start() { wait_for_network - if start_daemon -p $PIDFILE $DAEMON -cp "$CLASSPATH" -pidfile "$PIDFILE" $CLASS + if start_daemon -p $PIDFILE $DAEMON -cp "$CLASSPATH" -pidfile "$PIDFILE" -errfile SYSLOG $CLASS RETVAL=$? then rc=0 @@ -170,4 +170,4 @@ case "$1" in RETVAL=3 esac -exit $RETVAL \ No newline at end of file +exit $RETVAL diff --git a/awsapi/pom.xml b/awsapi/pom.xml index 2cd968dbbd9..dec3a827e18 100644 --- a/awsapi/pom.xml +++ b/awsapi/pom.xml @@ -93,7 +93,7 @@ org.apache.rampart rahas - 1.5 + ${cs.rampart.version} mar @@ -105,7 +105,7 @@ org.apache.rampart rampart - 1.5 + ${cs.rampart.version} mar @@ -117,19 +117,19 @@ org.apache.rampart rampart-core - 1.5 + ${cs.rampart.version} runtime org.apache.rampart rampart-policy - 1.5 + ${cs.rampart.version} runtime org.apache.rampart rampart-trust - 1.5 + ${cs.rampart.version} runtime diff --git a/client/tomcatconf/db.properties.in b/client/tomcatconf/db.properties.in index ba51b7282c8..f39d8fe4097 100644 --- a/client/tomcatconf/db.properties.in +++ b/client/tomcatconf/db.properties.in @@ -69,3 +69,15 @@ db.usage.autoReconnect=true # awsapi database settings db.awsapi.name=cloudbridge + +# Simulator database settings +db.simulator.username=@DBUSER@ +db.simulator.password=@DBPW@ +db.simulator.host=@DBHOST@ +db.simulator.port=3306 +db.simulator.name=simulator +db.simulator.maxActive=250 +db.simulator.maxIdle=30 +db.simulator.maxWait=10000 +db.simulator.autoReconnect=true + diff --git a/cloud.spec b/cloud.spec index 0fdebc1cbcf..724f8577a2e 100644 --- a/cloud.spec +++ b/cloud.spec @@ -218,6 +218,7 @@ Requires: /sbin/chkconfig Requires: jna Requires: ebtables Requires: jsvc +Requires: jakarta-commons-daemon Group: System Environment/Libraries Requires: kvm @@ -576,7 +577,10 @@ fi %attr(0755,root,root) %{_bindir}/cloud-setup-bridge %changelog -* Thu Aug 16 2012 Marcus Sorense 4.0 +* Fri Sep 14 2012 Marcus Sorensen 4.0.1 +- adding dependency jakarta-commons-daemon to fix "cannot find daemon loader" + +* Thu Aug 16 2012 Marcus Sorensen 4.0 - rearranged files sections to match currently built files * Mon May 3 2010 Manuel Amador (Rudd-O) 1.9.12 diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMGuestOsMapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMGuestOsMapper.java index 88bb0f5f060..b4771cacb10 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMGuestOsMapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMGuestOsMapper.java @@ -105,7 +105,7 @@ public class KVMGuestOsMapper { s_mapper.put("Ubuntu 8.04 (64-bit)", "Other Linux"); s_mapper.put("Debian GNU/Linux 5(32-bit)", "Debian GNU/Linux 5"); s_mapper.put("Debian GNU/Linux 5(64-bit)", "Debian GNU/Linux 5"); - s_mapper.put("Debian GNU/Linux 5.0(32-bit)", "Debian GNU/Linux 5"); + s_mapper.put("Debian GNU/Linux 5.0 (32-bit)", "Debian GNU/Linux 5"); s_mapper.put("Debian GNU/Linux 4(32-bit)", "Debian GNU/Linux 4"); s_mapper.put("Debian GNU/Linux 4(64-bit)", "Debian GNU/Linux 4"); s_mapper.put("Debian GNU/Linux 6(64-bit)", "Debian GNU/Linux 6"); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 93125193d31..65742d8a784 100755 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -2587,7 +2587,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements if (disk.getDeviceType() == DiskDef.deviceType.CDROM && disk.getDiskPath() != null) { cleanupDisk(conn, disk); - } else if (disk.getDiskPath().contains(vmName + "-patchdisk") + } else if (disk.getDiskPath() != null + && disk.getDiskPath().contains(vmName + "-patchdisk") && vmName.matches("^[rsv]-\\d+-VM$")) { if (!_storagePoolMgr.deleteVbdByPath(disk.getDiskPath())) { s_logger.warn("failed to delete patch disk " + disk.getDiskPath()); diff --git a/pom.xml b/pom.xml index 17ea0502fcb..ef478a3ed11 100644 --- a/pom.xml +++ b/pom.xml @@ -74,6 +74,7 @@ 1.4 1.4 1.5.1 + 1.6.2 1.2.8 2.0.4 2.4 diff --git a/python/lib/cloudutils/utilities.py b/python/lib/cloudutils/utilities.py index 12e9729d262..adf81fcbd4c 100755 --- a/python/lib/cloudutils/utilities.py +++ b/python/lib/cloudutils/utilities.py @@ -106,7 +106,7 @@ class Distribution: self.distro = "Fedora" elif os.path.exists("/etc/redhat-release"): version = file("/etc/redhat-release").readline() - if version.find("Red Hat Enterprise Linux Server release 6") != -1 or version.find("Scientific Linux release 6") != -1 or version.find("CentOS Linux release 6") != -1 or version.find("CentOS release 6.2") != -1: + if version.find("Red Hat Enterprise Linux Server release 6") != -1 or version.find("Scientific Linux release 6") != -1 or version.find("CentOS Linux release 6") != -1 or version.find("CentOS release 6.2") or version.find("CentOS release 6.3") != -1: self.distro = "RHEL6" elif version.find("CentOS release") != -1: self.distro = "CentOS" diff --git a/scripts/storage/secondary/cloud-install-sys-tmplt b/scripts/storage/secondary/cloud-install-sys-tmplt index 188896e28f9..63a04d8cb07 100755 --- a/scripts/storage/secondary/cloud-install-sys-tmplt +++ b/scripts/storage/secondary/cloud-install-sys-tmplt @@ -33,7 +33,7 @@ failed() { mflag= fflag= ext="vhd" -templateId=1 +templateId= hyper= msKey=password DISKSPACE=5120000 #free disk space required in kilobytes @@ -143,21 +143,24 @@ else fi fi -if [ "$hyper" == "kvm" ] +if [ "$templateId" == "" ] then - ext="qcow2" - templateId=(`mysql -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"KVM\" and removed is null"`) -elif [ "$hyper" == "xenserver" ] -then - ext="vhd" - templateId=(`mysql -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"XenServer\" and removed is null"`) -elif [ "$hyper" == "vmware" ] -then - ext="ova" - templateId=(`mysql -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"VMware\" and removed is null"`) -else - usage - failed 2 + if [ "$hyper" == "kvm" ] + then + ext="qcow2" + templateId=(`mysql -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"KVM\" and removed is null"`) + elif [ "$hyper" == "xenserver" ] + then + ext="vhd" + templateId=(`mysql -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"XenServer\" and removed is null"`) + elif [ "$hyper" == "vmware" ] + then + ext="ova" + templateId=(`mysql -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"VMware\" and removed is null"`) + else + usage + failed 2 + fi fi if [ ! $templateId ] diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 292a25987ba..7a11525720d 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -4846,11 +4846,19 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } private String getDomainNetworkDomain(long domainId, long zoneId) { - String networkDomain = _domainDao.findById(domainId).getNetworkDomain(); + String networkDomain = null; + Long searchDomainId = domainId; + while(searchDomainId != null){ + DomainVO domain = _domainDao.findById(searchDomainId); + if(domain.getNetworkDomain() != null){ + networkDomain = domain.getNetworkDomain(); + break; + } + searchDomainId = domain.getParent(); + } if (networkDomain == null) { return getZoneNetworkDomain(zoneId); } - return networkDomain; } diff --git a/server/src/com/cloud/upgrade/dao/Upgrade302to40.java b/server/src/com/cloud/upgrade/dao/Upgrade302to40.java index 0a836e92620..753f64ec682 100644 --- a/server/src/com/cloud/upgrade/dao/Upgrade302to40.java +++ b/server/src/com/cloud/upgrade/dao/Upgrade302to40.java @@ -31,6 +31,7 @@ import org.apache.log4j.Logger; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.script.Script; +import com.cloud.dc.DataCenter.NetworkType; public class Upgrade302to40 extends Upgrade30xBase implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade302to40.class); @@ -68,6 +69,8 @@ public class Upgrade302to40 extends Upgrade30xBase implements DbUpgrade { addVpcProvider(conn); updateRouterNetworkRef(conn); fixForeignKeys(conn); + setupExternalNetworkDevices(conn); + fixZoneUsingExternalDevices(conn); } @Override @@ -681,4 +684,350 @@ public class Upgrade302to40 extends Upgrade30xBase implements DbUpgrade { throw new CloudRuntimeException("Unable to execute ssh_keypairs table update for adding domain_id foreign key", e); } } + + // upgrades deployment with F5 and SRX devices, to 3.0's Network offerings & service providers paradigm + private void setupExternalNetworkDevices(Connection conn) { + PreparedStatement zoneSearchStmt = null, pNetworkStmt = null, f5DevicesStmt = null, srxDevicesStmt = null; + ResultSet zoneResults = null, pNetworksResults = null, f5DevicesResult = null, srxDevicesResult = null; + + try { + zoneSearchStmt = conn.prepareStatement("SELECT id, networktype FROM `cloud`.`data_center`"); + zoneResults = zoneSearchStmt.executeQuery(); + while (zoneResults.next()) { + long zoneId = zoneResults.getLong(1); + String networkType = zoneResults.getString(2); + + if (!NetworkType.Advanced.toString().equalsIgnoreCase(networkType)) { + continue; + } + + pNetworkStmt = conn.prepareStatement("SELECT id FROM `cloud`.`physical_network` where data_center_id=?"); + pNetworkStmt.setLong(1, zoneId); + pNetworksResults = pNetworkStmt.executeQuery(); + while (pNetworksResults.next()) { + long physicalNetworkId = pNetworksResults.getLong(1); + PreparedStatement fetchF5NspStmt = conn.prepareStatement("SELECT id from `cloud`.`physical_network_service_providers` where physical_network_id=" + physicalNetworkId + + " and provider_name = 'F5BigIp'"); + ResultSet rsF5NSP = fetchF5NspStmt.executeQuery(); + boolean hasF5Nsp = rsF5NSP.next(); + fetchF5NspStmt.close(); + + if (!hasF5Nsp) { + f5DevicesStmt = conn.prepareStatement("SELECT id FROM host WHERE data_center_id=? AND type = 'ExternalLoadBalancer' AND removed IS NULL"); + f5DevicesStmt.setLong(1, zoneId); + f5DevicesResult = f5DevicesStmt.executeQuery(); + + while (f5DevicesResult.next()) { + long f5HostId = f5DevicesResult.getLong(1);; + // add F5BigIP provider and provider instance to physical network + addF5ServiceProvider(conn, physicalNetworkId, zoneId); + addF5LoadBalancer(conn, f5HostId, physicalNetworkId); + } + } + + PreparedStatement fetchSRXNspStmt = conn.prepareStatement("SELECT id from `cloud`.`physical_network_service_providers` where physical_network_id=" + physicalNetworkId + + " and provider_name = 'JuniperSRX'"); + ResultSet rsSRXNSP = fetchSRXNspStmt.executeQuery(); + boolean hasSrxNsp = rsSRXNSP.next(); + fetchSRXNspStmt.close(); + + if (!hasSrxNsp) { + srxDevicesStmt = conn.prepareStatement("SELECT id FROM host WHERE data_center_id=? AND type = 'ExternalFirewall' AND removed IS NULL"); + srxDevicesStmt.setLong(1, zoneId); + srxDevicesResult = srxDevicesStmt.executeQuery(); + + while (srxDevicesResult.next()) { + long srxHostId = srxDevicesResult.getLong(1); + // add SRX provider and provider instance to physical network + addSrxServiceProvider(conn, physicalNetworkId, zoneId); + addSrxFirewall(conn, srxHostId, physicalNetworkId); + } + } + } + } + + if (zoneResults != null) { + try { + zoneResults.close(); + } catch (SQLException e) { + } + } + if (zoneSearchStmt != null) { + try { + zoneSearchStmt.close(); + } catch (SQLException e) { + } + } + } catch (SQLException e) { + throw new CloudRuntimeException("Exception while adding PhysicalNetworks", e); + } finally { + + } + } + + private void addF5LoadBalancer(Connection conn, long hostId, long physicalNetworkId){ + PreparedStatement pstmtUpdate = null; + try{ + s_logger.debug("Adding F5 Big IP load balancer with host id " + hostId + " in to physical network" + physicalNetworkId); + String insertF5 = "INSERT INTO `cloud`.`external_load_balancer_devices` (physical_network_id, host_id, provider_name, " + + "device_name, capacity, is_dedicated, device_state, allocation_state, is_inline, is_managed, uuid) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + pstmtUpdate = conn.prepareStatement(insertF5); + pstmtUpdate.setLong(1, physicalNetworkId); + pstmtUpdate.setLong(2, hostId); + pstmtUpdate.setString(3, "F5BigIp"); + pstmtUpdate.setString(4, "F5BigIpLoadBalancer"); + pstmtUpdate.setLong(5, 0); + pstmtUpdate.setBoolean(6, false); + pstmtUpdate.setString(7, "Enabled"); + pstmtUpdate.setString(8, "Shared"); + pstmtUpdate.setBoolean(9, false); + pstmtUpdate.setBoolean(10, false); + pstmtUpdate.setString(11, UUID.randomUUID().toString()); + pstmtUpdate.executeUpdate(); + }catch (SQLException e) { + throw new CloudRuntimeException("Exception while adding F5 load balancer device" , e); + } finally { + if (pstmtUpdate != null) { + try { + pstmtUpdate.close(); + } catch (SQLException e) { + } + } + } + } + + private void addSrxFirewall(Connection conn, long hostId, long physicalNetworkId){ + PreparedStatement pstmtUpdate = null; + try{ + s_logger.debug("Adding SRX firewall device with host id " + hostId + " in to physical network" + physicalNetworkId); + String insertSrx = "INSERT INTO `cloud`.`external_firewall_devices` (physical_network_id, host_id, provider_name, " + + "device_name, capacity, is_dedicated, device_state, allocation_state, uuid) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + pstmtUpdate = conn.prepareStatement(insertSrx); + pstmtUpdate.setLong(1, physicalNetworkId); + pstmtUpdate.setLong(2, hostId); + pstmtUpdate.setString(3, "JuniperSRX"); + pstmtUpdate.setString(4, "JuniperSRXFirewall"); + pstmtUpdate.setLong(5, 0); + pstmtUpdate.setBoolean(6, false); + pstmtUpdate.setString(7, "Enabled"); + pstmtUpdate.setString(8, "Shared"); + pstmtUpdate.setString(9, UUID.randomUUID().toString()); + pstmtUpdate.executeUpdate(); + }catch (SQLException e) { + throw new CloudRuntimeException("Exception while adding SRX firewall device ", e); + } finally { + if (pstmtUpdate != null) { + try { + pstmtUpdate.close(); + } catch (SQLException e) { + } + } + } + } + + private void addF5ServiceProvider(Connection conn, long physicalNetworkId, long zoneId){ + PreparedStatement pstmtUpdate = null; + try{ + // add physical network service provider - F5BigIp + s_logger.debug("Adding PhysicalNetworkServiceProvider F5BigIp" + " in to physical network" + physicalNetworkId); + String insertPNSP = "INSERT INTO `cloud`.`physical_network_service_providers` (`uuid`, `physical_network_id` , `provider_name`, `state` ," + + "`destination_physical_network_id`, `vpn_service_provided`, `dhcp_service_provided`, `dns_service_provided`, `gateway_service_provided`," + + "`firewall_service_provided`, `source_nat_service_provided`, `load_balance_service_provided`, `static_nat_service_provided`," + + "`port_forwarding_service_provided`, `user_data_service_provided`, `security_group_service_provided`) VALUES (?,?,?,?,0,0,0,0,0,0,0,1,0,0,0,0)"; + + pstmtUpdate = conn.prepareStatement(insertPNSP); + pstmtUpdate.setString(1, UUID.randomUUID().toString()); + pstmtUpdate.setLong(2, physicalNetworkId); + pstmtUpdate.setString(3, "F5BigIp"); + pstmtUpdate.setString(4, "Enabled"); + pstmtUpdate.executeUpdate(); + }catch (SQLException e) { + throw new CloudRuntimeException("Exception while adding PhysicalNetworkServiceProvider F5BigIp", e); + } finally { + if (pstmtUpdate != null) { + try { + pstmtUpdate.close(); + } catch (SQLException e) { + } + } + } + } + + private void addSrxServiceProvider(Connection conn, long physicalNetworkId, long zoneId){ + PreparedStatement pstmtUpdate = null; + try{ + // add physical network service provider - JuniperSRX + s_logger.debug("Adding PhysicalNetworkServiceProvider JuniperSRX"); + String insertPNSP = "INSERT INTO `cloud`.`physical_network_service_providers` (`uuid`, `physical_network_id` , `provider_name`, `state` ," + + "`destination_physical_network_id`, `vpn_service_provided`, `dhcp_service_provided`, `dns_service_provided`, `gateway_service_provided`," + + "`firewall_service_provided`, `source_nat_service_provided`, `load_balance_service_provided`, `static_nat_service_provided`," + + "`port_forwarding_service_provided`, `user_data_service_provided`, `security_group_service_provided`) VALUES (?,?,?,?,0,0,0,0,1,1,1,0,1,1,0,0)"; + + pstmtUpdate = conn.prepareStatement(insertPNSP); + pstmtUpdate.setString(1, UUID.randomUUID().toString()); + pstmtUpdate.setLong(2, physicalNetworkId); + pstmtUpdate.setString(3, "JuniperSRX"); + pstmtUpdate.setString(4, "Enabled"); + pstmtUpdate.executeUpdate(); + }catch (SQLException e) { + throw new CloudRuntimeException("Exception while adding PhysicalNetworkServiceProvider JuniperSRX" , e); + } finally { + if (pstmtUpdate != null) { + try { + pstmtUpdate.close(); + } catch (SQLException e) { + } + } + } + } + + // 1) ensure that networks using external load balancer/firewall in 2.2.14 or prior releases deployments + // has entry in network_external_lb_device_map and network_external_firewall_device_map + // + // 2) Some keys of host details for F5 and SRX devices were stored in Camel Case in 2.x releases. From 3.0 + // they are made in lowercase. On upgrade change the host details name to lower case + private void fixZoneUsingExternalDevices(Connection conn) { + //Get zones to upgrade + List zoneIds = new ArrayList(); + PreparedStatement pstmt = null; + PreparedStatement pstmtUpdate = null; + ResultSet rs = null; + long networkOfferingId, networkId; + long f5DeviceId, f5HostId; + long srxDevivceId, srxHostId; + + try { + pstmt = conn.prepareStatement("select id from `cloud`.`data_center` where lb_provider='F5BigIp' or firewall_provider='JuniperSRX' or gateway_provider='JuniperSRX'"); + rs = pstmt.executeQuery(); + while (rs.next()) { + zoneIds.add(rs.getLong(1)); + } + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to create network to LB & firewalla device mapping for networks that use them", e); + } + + if (zoneIds.size() == 0) { + return; // no zones using F5 and SRX devices so return + } + + // find the default network offering created for external devices during upgrade from 2.2.14 + try { + pstmt = conn.prepareStatement("select id from `cloud`.`network_offerings` where unique_name='Isolated with external providers' "); + rs = pstmt.executeQuery(); + if (rs.first()) { + networkOfferingId = rs.getLong(1); + } else { + throw new CloudRuntimeException("Cannot upgrade as there is no 'Isolated with external providers' network offering crearted ."); + } + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to create network to LB & firewalla device mapping for networks that use them", e); + } + + for (Long zoneId : zoneIds) { + try { + // find the F5 device id in the zone + pstmt = conn.prepareStatement("SELECT id FROM host WHERE data_center_id=? AND type = 'ExternalLoadBalancer' AND removed IS NULL"); + pstmt.setLong(1, zoneId); + rs = pstmt.executeQuery(); + if (rs.first()) { + f5HostId = rs.getLong(1); + } else { + throw new CloudRuntimeException("Cannot upgrade as there is no F5 load balancer device found in data center " + zoneId); + } + pstmt = conn.prepareStatement("SELECT id FROM external_load_balancer_devices WHERE host_id=?"); + pstmt.setLong(1, f5HostId); + rs = pstmt.executeQuery(); + if (rs.first()) { + f5DeviceId = rs.getLong(1); + } else { + throw new CloudRuntimeException("Cannot upgrade as there is no F5 load balancer device with host ID " + f5HostId + " found in external_load_balancer_device"); + } + + // find the SRX device id in the zone + pstmt = conn.prepareStatement("SELECT id FROM host WHERE data_center_id=? AND type = 'ExternalFirewall' AND removed IS NULL"); + pstmt.setLong(1, zoneId); + rs = pstmt.executeQuery(); + if (rs.first()) { + srxHostId = rs.getLong(1); + } else { + throw new CloudRuntimeException("Cannot upgrade as there is no SRX firewall device found in data center " + zoneId); + } + pstmt = conn.prepareStatement("SELECT id FROM external_firewall_devices WHERE host_id=?"); + pstmt.setLong(1, srxHostId); + rs = pstmt.executeQuery(); + if (rs.first()) { + srxDevivceId = rs.getLong(1); + } else { + throw new CloudRuntimeException("Cannot upgrade as there is no SRX firewall device found with host ID " + srxHostId + " found in external_firewall_devices"); + } + + // check if network any uses F5 or SRX devices in the zone + pstmt = conn.prepareStatement("select id from `cloud`.`networks` where guest_type='Virtual' and data_center_id=? and network_offering_id=? and removed IS NULL"); + pstmt.setLong(1, zoneId); + pstmt.setLong(2, networkOfferingId); + rs = pstmt.executeQuery(); + while (rs.next()) { + // get the network Id + networkId = rs.getLong(1); + + // add mapping for the network in network_external_lb_device_map + String insertLbMapping = "INSERT INTO `cloud`.`network_external_lb_device_map` (uuid, network_id, external_load_balancer_device_id, created) VALUES ( ?, ?, ?, now())"; + pstmtUpdate = conn.prepareStatement(insertLbMapping); + pstmtUpdate.setString(1, UUID.randomUUID().toString()); + pstmtUpdate.setLong(2, networkId); + pstmtUpdate.setLong(3, f5DeviceId); + pstmtUpdate.executeUpdate(); + s_logger.debug("Successfully added entry in network_external_lb_device_map for network " + networkId + " and F5 device ID " + f5DeviceId); + + // add mapping for the network in network_external_firewall_device_map + String insertFwMapping = "INSERT INTO `cloud`.`network_external_firewall_device_map` (uuid, network_id, external_firewall_device_id, created) VALUES ( ?, ?, ?, now())"; + pstmtUpdate = conn.prepareStatement(insertFwMapping); + pstmtUpdate.setString(1, UUID.randomUUID().toString()); + pstmtUpdate.setLong(2, networkId); + pstmtUpdate.setLong(3, srxDevivceId); + pstmtUpdate.executeUpdate(); + s_logger.debug("Successfully added entry in network_external_firewall_device_map for network " + networkId + " and SRX device ID " + srxDevivceId); + } + + // update host details for F5 and SRX devices + s_logger.debug("Updating the host details for F5 and SRX devices"); + pstmt = conn.prepareStatement("SELECT host_id, name FROM `cloud`.`host_details` WHERE host_id=? OR host_id=?"); + pstmt.setLong(1, f5HostId); + pstmt.setLong(2, srxHostId); + rs = pstmt.executeQuery(); + while (rs.next()) { + long hostId = rs.getLong(1); + String camlCaseName = rs.getString(2); + if (!(camlCaseName.equalsIgnoreCase("numRetries") || + camlCaseName.equalsIgnoreCase("publicZone") || + camlCaseName.equalsIgnoreCase("privateZone") || + camlCaseName.equalsIgnoreCase("publicInterface") || + camlCaseName.equalsIgnoreCase("privateInterface") || + camlCaseName.equalsIgnoreCase("usageInterface") )) { + continue; + } + String lowerCaseName = camlCaseName.toLowerCase(); + pstmt = conn.prepareStatement("update `cloud`.`host_details` set name=? where host_id=? AND name=?"); + pstmt.setString(1, lowerCaseName); + pstmt.setLong(2, hostId); + pstmt.setString(3, camlCaseName); + pstmt.executeUpdate(); + } + s_logger.debug("Successfully updated host details for F5 and SRX devices"); + } catch (SQLException e) { + throw new CloudRuntimeException("Unable create a mapping for the networks in network_external_lb_device_map and network_external_firewall_device_map", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + s_logger.info("Successfully upgraded networks using F5 and SRX devices to have a entry in the network_external_lb_device_map and network_external_firewall_device_map"); + } + } } diff --git a/setup/db/create-database-simulator.sql b/setup/db/create-database-simulator.sql new file mode 100644 index 00000000000..8924eda3ff5 --- /dev/null +++ b/setup/db/create-database-simulator.sql @@ -0,0 +1,29 @@ +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + + +DROP DATABASE IF EXISTS `simulator`; + +CREATE DATABASE `simulator`; + +GRANT ALL ON simulator.* to cloud@`localhost` identified by 'cloud'; +GRANT ALL ON simulator.* to cloud@`%` identified by 'cloud'; + +GRANT process ON *.* TO cloud@`localhost`; +GRANT process ON *.* TO cloud@`%`; + +commit; diff --git a/setup/db/create-schema-simulator.sql b/setup/db/create-schema-simulator.sql index b8168aaa3c9..1ab838b1e73 100644 --- a/setup/db/create-schema-simulator.sql +++ b/setup/db/create-schema-simulator.sql @@ -15,14 +15,14 @@ -- specific language governing permissions and limitations -- under the License. -DROP TABLE IF EXISTS `cloud`.`mockhost`; -DROP TABLE IF EXISTS `cloud`.`mocksecstorage`; -DROP TABLE IF EXISTS `cloud`.`mockstoragepool`; -DROP TABLE IF EXISTS `cloud`.`mockvm`; -DROP TABLE IF EXISTS `cloud`.`mockvolume`; -DROP TABLE IF EXISTS `cloud`.`mocksecurityrules`; +DROP TABLE IF EXISTS `simulator`.`mockhost`; +DROP TABLE IF EXISTS `simulator`.`mocksecstorage`; +DROP TABLE IF EXISTS `simulator`.`mockstoragepool`; +DROP TABLE IF EXISTS `simulator`.`mockvm`; +DROP TABLE IF EXISTS `simulator`.`mockvolume`; +DROP TABLE IF EXISTS `simulator`.`mocksecurityrules`; -CREATE TABLE `cloud`.`mockhost` ( +CREATE TABLE `simulator`.`mockhost` ( `id` bigint unsigned NOT NULL auto_increment, `name` varchar(255) NOT NULL, `private_ip_address` char(40), @@ -48,7 +48,7 @@ CREATE TABLE `cloud`.`mockhost` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `cloud`.`mocksecstorage` ( +CREATE TABLE `simulator`.`mocksecstorage` ( `id` bigint unsigned NOT NULL auto_increment, `url` varchar(255), `capacity` bigint unsigned, @@ -56,7 +56,7 @@ CREATE TABLE `cloud`.`mocksecstorage` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `cloud`.`mockstoragepool` ( +CREATE TABLE `simulator`.`mockstoragepool` ( `id` bigint unsigned NOT NULL auto_increment, `guid` varchar(255), `mount_point` varchar(255), @@ -67,7 +67,7 @@ CREATE TABLE `cloud`.`mockstoragepool` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `cloud`.`mockvm` ( +CREATE TABLE `simulator`.`mockvm` ( `id` bigint unsigned NOT NULL auto_increment, `name` varchar(255), `host_id` bigint unsigned, @@ -83,7 +83,7 @@ CREATE TABLE `cloud`.`mockvm` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `cloud`.`mockvolume` ( +CREATE TABLE `simulator`.`mockvolume` ( `id` bigint unsigned NOT NULL auto_increment, `name` varchar(255), `size` bigint unsigned, @@ -97,7 +97,7 @@ CREATE TABLE `cloud`.`mockvolume` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `cloud`.`mockconfiguration` ( +CREATE TABLE `simulator`.`mockconfiguration` ( `id` bigint unsigned NOT NULL auto_increment, `data_center_id` bigint unsigned, `pod_id` bigint unsigned, @@ -108,7 +108,7 @@ CREATE TABLE `cloud`.`mockconfiguration` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `cloud`.`mocksecurityrules` ( +CREATE TABLE `simulator`.`mocksecurityrules` ( `id` bigint unsigned NOT NULL auto_increment, `vmid` bigint unsigned, `signature` varchar(255), diff --git a/setup/db/deploy-db-simulator.sh b/setup/db/deploy-db-simulator.sh index fe21c819e13..4f8c14ebfe5 100644 --- a/setup/db/deploy-db-simulator.sh +++ b/setup/db/deploy-db-simulator.sh @@ -87,6 +87,10 @@ echo "Recreating Database cloud_usage." mysql --user=root --password=$3 < create-database-premium.sql > /dev/null 2>/dev/null handle_error create-database-premium.sql +echo "Recreating Database simulator." +mysql --user=root --password=$3 < create-database-simulator.sql > /dev/null 2>/dev/null +handle_error create-database-simulator.sql + mysql --user=cloud --password=cloud cloud < create-schema.sql if [ $? -ne 0 ]; then printf "Error: Cannot execute create-schema.sql\n" diff --git a/tools/marvin/marvin/sandbox/advanced/tests/test_scenarios.py b/tools/marvin/marvin/sandbox/advanced/tests/test_scenarios.py deleted file mode 100644 index 7f552c33615..00000000000 --- a/tools/marvin/marvin/sandbox/advanced/tests/test_scenarios.py +++ /dev/null @@ -1,145 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - - - -#!/usr/bin/env python -try: - import unittest2 as unittest -except ImportError: - import unittest - -import random -import hashlib -from cloudstackTestCase import * -import remoteSSHClient - -class SampleScenarios(cloudstackTestCase): - ''' - ''' - def setUp(self): - pass - - - def tearDown(self): - pass - - - def test_1_createAccounts(self, numberOfAccounts=2): - ''' - Create a bunch of user accounts - ''' - mdf = hashlib.md5() - mdf.update('password') - mdf_pass = mdf.hexdigest() - api = self.testClient.getApiClient() - for i in range(1, numberOfAccounts + 1): - acct = createAccount.createAccountCmd() - acct.accounttype = 0 - acct.firstname = 'user' + str(i) - acct.lastname = 'user' + str(i) - acct.password = mdf_pass - acct.username = 'user' + str(i) - acct.email = 'user@example.com' - acct.account = 'user' + str(i) - acct.domainid = 1 - acctResponse = api.createAccount(acct) - self.debug("successfully created account: %s, user: %s, id: %s"%(acctResponse.account, acctResponse.username, acctResponse.id)) - - - def test_2_createServiceOffering(self): - apiClient = self.testClient.getApiClient() - createSOcmd=createServiceOffering.createServiceOfferingCmd() - createSOcmd.name='Sample SO' - createSOcmd.displaytext='Sample SO' - createSOcmd.storagetype='shared' - createSOcmd.cpunumber=1 - createSOcmd.cpuspeed=100 - createSOcmd.memory=128 - createSOcmd.offerha='false' - createSOresponse = apiClient.createServiceOffering(createSOcmd) - return createSOresponse.id - - def deployCmd(self, account, service): - deployVmCmd = deployVirtualMachine.deployVirtualMachineCmd() - deployVmCmd.zoneid = 1 - deployVmCmd.account=account - deployVmCmd.domainid=1 - deployVmCmd.templateid=2 - deployVmCmd.serviceofferingid=service - return deployVmCmd - - def listVmsInAccountCmd(self, acct): - api = self.testClient.getApiClient() - listVmCmd = listVirtualMachines.listVirtualMachinesCmd() - listVmCmd.account = acct - listVmCmd.zoneid = 1 - listVmCmd.domainid = 1 - listVmResponse = api.listVirtualMachines(listVmCmd) - return listVmResponse - - - def destroyVmCmd(self, key): - api = self.testClient.getApiClient() - destroyVmCmd = destroyVirtualMachine.destroyVirtualMachineCmd() - destroyVmCmd.id = key - api.destroyVirtualMachine(destroyVmCmd) - - - def test_3_stressDeploy(self): - ''' - Deploy 5 Vms in each account - ''' - service_id = self.test_2_createServiceOffering() - api = self.testClient.getApiClient() - for acct in range(1, 5): - [api.deployVirtualMachine(self.deployCmd('user'+str(acct), service_id)) for x in range(0,5)] - - @unittest.skip("skipping destroys") - def test_4_stressDestroy(self): - ''' - Cleanup all Vms in every account - ''' - api = self.testClient.getApiClient() - for acct in range(1, 6): - for vm in self.listVmsInAccountCmd('user'+str(acct)): - if vm is not None: - self.destroyVmCmd(vm.id) - - @unittest.skip("skipping destroys") - def test_5_combineStress(self): - for i in range(0, 5): - self.test_3_stressDeploy() - self.test_4_stressDestroy() - - def deployN(self,nargs=300,batchsize=0): - ''' - Deploy Nargs number of VMs concurrently in batches of size {batchsize}. - When batchsize is 0 all Vms are deployed in one batch - VMs will be deployed in 5:2:6 ratio - ''' - cmds = [] - - if batchsize == 0: - self.testClient.submitCmdsAndWait(cmds) - else: - while len(z) > 0: - try: - newbatch = [cmds.pop() for b in range(batchsize)] #pop batchsize items - self.testClient.submitCmdsAndWait(newbatch) - except IndexError: - break diff --git a/tools/marvin/marvin/sandbox/run-marvin.sh b/tools/marvin/marvin/sandbox/run-marvin.sh old mode 100644 new mode 100755 diff --git a/utils/src/com/cloud/utils/db/Transaction.java b/utils/src/com/cloud/utils/db/Transaction.java index 755de8b55df..bcf7ae1257a 100755 --- a/utils/src/com/cloud/utils/db/Transaction.java +++ b/utils/src/com/cloud/utils/db/Transaction.java @@ -80,6 +80,7 @@ public class Transaction { public static final short CLOUD_DB = 0; public static final short USAGE_DB = 1; public static final short AWSAPI_DB = 2; + public static final short SIMULATOR_DB = 3; public static final short CONNECTED_DB = -1; private static AtomicLong s_id = new AtomicLong(); @@ -224,6 +225,7 @@ public class Transaction { return null; } } + public static Connection getStandaloneAwsapiConnection() { try { Connection conn = s_awsapiDS.getConnection(); @@ -235,7 +237,21 @@ public class Transaction { s_logger.warn("Unexpected exception: ", e); return null; } -} + } + + public static Connection getStandaloneSimulatorConnection() { + try { + Connection conn = s_simulatorDS.getConnection(); + if (s_connLogger.isTraceEnabled()) { + s_connLogger.trace("Retrieving a standalone connection for simulator: dbconn" + System.identityHashCode(conn)); + } + return conn; + } catch (SQLException e) { + s_logger.warn("Unexpected exception: ", e); + return null; + } + } + protected void attach(TransactionAttachment value) { _stack.push(new StackElement(ATTACHMENT, value)); } @@ -546,6 +562,14 @@ public class Transaction { } break; + case SIMULATOR_DB: + if(s_simulatorDS != null) { + _conn = s_simulatorDS.getConnection(); + } else { + s_logger.warn("A static-initialized variable becomes null, process is dying?"); + throw new CloudRuntimeException("Database is not initialized, process is dying?"); + } + break; default: throw new CloudRuntimeException("No database selected for the transaction"); @@ -976,6 +1000,7 @@ public class Transaction { private static DataSource s_ds; private static DataSource s_usageDS; private static DataSource s_awsapiDS; + private static DataSource s_simulatorDS; static { try { final File dbPropsFile = PropertiesUtil.findConfigFile("db.properties"); @@ -1069,6 +1094,27 @@ public class Transaction { new StackKeyedObjectPoolFactory(), null, false, false); s_awsapiDS = new PoolingDataSource(awsapiPoolableConnectionFactory.getPool()); + try{ + // configure the simulator db + final int simulatorMaxActive = Integer.parseInt(dbProps.getProperty("db.simulator.maxActive")); + final int simulatorMaxIdle = Integer.parseInt(dbProps.getProperty("db.simulator.maxIdle")); + final long simulatorMaxWait = Long.parseLong(dbProps.getProperty("db.simulator.maxWait")); + final String simulatorUsername = dbProps.getProperty("db.simulator.username"); + final String simulatorPassword = dbProps.getProperty("db.simulator.password"); + final String simulatorHost = dbProps.getProperty("db.simulator.host"); + final int simulatorPort = Integer.parseInt(dbProps.getProperty("db.simulator.port")); + final String simulatorDbName = dbProps.getProperty("db.simulator.name"); + final boolean simulatorAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.simulator.autoReconnect")); + final GenericObjectPool simulatorConnectionPool = new GenericObjectPool(null, simulatorMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION, + simulatorMaxWait, simulatorMaxIdle); + final ConnectionFactory simulatorConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://"+simulatorHost + ":" + simulatorPort + "/" + simulatorDbName + + "?autoReconnect="+simulatorAutoReconnect, simulatorUsername, simulatorPassword); + final PoolableConnectionFactory simulatorPoolableConnectionFactory = new PoolableConnectionFactory(simulatorConnectionFactory, simulatorConnectionPool, + new StackKeyedObjectPoolFactory(), null, false, false); + s_simulatorDS = new PoolingDataSource(simulatorPoolableConnectionFactory.getPool()); + } catch (Exception e){ + s_logger.debug("Simulator DB properties are not available. Not initializing simulator DS"); + } } catch (final Exception e) { final GenericObjectPool connectionPool = new GenericObjectPool(null, 5); final ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://localhost:3306/cloud", "cloud", "cloud"); @@ -1079,6 +1125,11 @@ public class Transaction { final ConnectionFactory connectionFactoryUsage = new DriverManagerConnectionFactory("jdbc:mysql://localhost:3306/cloud_usage", "cloud", "cloud"); final PoolableConnectionFactory poolableConnectionFactoryUsage = new PoolableConnectionFactory(connectionFactoryUsage, connectionPoolUsage, null, null, false, true); s_usageDS = new PoolingDataSource(poolableConnectionFactoryUsage.getPool()); + + final GenericObjectPool connectionPoolsimulator = new GenericObjectPool(null, 5); + final ConnectionFactory connectionFactorysimulator = new DriverManagerConnectionFactory("jdbc:mysql://localhost:3306/cloud_simulator", "cloud", "cloud"); + final PoolableConnectionFactory poolableConnectionFactorysimulator = new PoolableConnectionFactory(connectionFactorysimulator, connectionPoolsimulator, null, null, false, true); + s_simulatorDS = new PoolingDataSource(poolableConnectionFactorysimulator.getPool()); s_logger.warn("Unable to load db configuration, using defaults with 5 connections. Please check your configuration", e); } } diff --git a/wscript_build b/wscript_build index 42a3a2b91d2..4264822cb51 100644 --- a/wscript_build +++ b/wscript_build @@ -164,7 +164,7 @@ def build_dependences (): bld.install_files('${JAVADIR}',start_path.ant_glob(["CAStorSDK-*.jar", "javax.persistence-2.0.0.jar", "apache-log4j-extras-1.1.jar", "libvirt-0.4.9.jar", "axis2-1.5.1.jar", "jstl-1.2.jar", "commons-discovery-0.5.jar", "commons-codec-1.6.jar", "ejb-api-3.0.jar", "xmlrpc-client-3.1.3.jar", "commons-dbcp-1.4.jar", "commons-pool-1.6.jar", "gson-1.7.1.jar", "netscaler-1.0.jar", "netscaler-sdx-1.0.jar", "backport-util-concurrent-3.1.jar", "ehcache-1.5.0.jar", "httpcore-4.0.jar", "log4j-1.2.16.jar", "trilead-ssh2-build213-svnkit-1.3-patch.jar", "cglib-nodep-2.2.2.jar", "xmlrpc-common-3.*.jar", - "xmlrpc-client-3.*.jar", "axis-1.4.jar", "wsdl4j-1.6.2.jar", "bcprov-jdk16-1.45.jar", "jsch-0.1.42.jar", "jasypt-1.9.0.jar", "commons-configuration-1.8.jar", "commons-lang-2.6.jar", "mail-1.4.jar", "activation-1.1.jar", "xapi-5.6.100-1-SNAPSHOT.jar"], excl = excludes), cwd=start_path) + "xmlrpc-client-3.*.jar", "wsdl4j-1.6.2.jar", "bcprov-jdk16-1.45.jar", "jsch-0.1.42.jar", "jasypt-1.9.0.jar", "commons-configuration-1.8.jar", "mail-1.4.jar", "activation-1.1.jar", "xapi-5.6.100-1-SNAPSHOT.jar"], excl = excludes), cwd=start_path) #def build_console_proxy (): # binary unsubstitutable files: