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:
-
-Community - forums, code, bugbase, blog, events, links to outside resources, IRC, and more
-Documentation and Knowledge Base - installation steps, guides, references, troubleshooting tips
-
-
-
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: