diff --git a/HACKING b/HACKING index 140ae446134..990e6898c4f 100644 --- a/HACKING +++ b/HACKING @@ -1,49 +1,24 @@ --------------------------------------------------------------------- -THE QUICK GUIDE TO CLOUDSTACK DEVELOPMENT +QUICK GUIDE TO DEVELOPING, BUILDING AND INSTALLING FROM SOURCE --------------------------------------------------------------------- -=== Overview of the development lifecycle === - -To hack on a CloudStack component, you will generally: - -1. Configure the source code: - ./waf configure --prefix=/home/youruser/cloudstack - (see below, "./waf configure") - -2. Build and install the CloudStack - ./waf install - (see below, "./waf install") - -3. Set the CloudStack component up - (see below, "Running the CloudStack components from source") - -4. Run the CloudStack component - (see below, "Running the CloudStack components from source") - -5. Modify the source code - -6. Build and install the CloudStack again - ./waf install --preserve-config - (see below, "./waf install") - -7. GOTO 4 - - -=== What is this waf thing in my development lifecycle? === - -waf is a self-contained, advanced build system written by Thomas Nagy, -in the spirit of SCons or the GNU autotools suite. - -* To run waf on Linux / Mac: ./waf [...commands...] -* To run waf on Windows: waf.bat [...commands...] +It all starts with waf. ./waf --help should be your first discovery point to find out both the configure-time options and the different processes that you can run -using waf. +using waf. Your second discovery point should be the files: +1. wscript: contains the processes you can run when invoking waf +2. wscript_build: contains a manifest of *what* is built and installed -=== What do the different waf commands above do? === +Your normal development process should be: + +1. ./waf configure --prefix=/some/path, ONCE +2. ./waf, then hack, then ./waf, then hack, then ./waf +3. ./waf install, then hack, then ./waf install + +In detail: 1. ./waf configure --prefix=/some/path @@ -54,10 +29,15 @@ using waf. variables and options that waf will use for compilation and installation, including the installation directory (PREFIX). + If you have already configured your source, and you are reconfiguring + it, then you *must* run ./waf clean so the source files are rebuilt + with the proper variables. Otherwise, ./waf install will install + stale files. + For convenience reasons, if you forget to run configure, waf will proceed with some default configuration options. By default, PREFIX is /usr/local, but you can set it e.g. to - /home/youruser/cloudstack if you plan to do a non-root + /home/yourusername/cloudstack if you plan to do a non-root install. Be ware that you can later install the stack as a regular user, but most components need to *run* as root. @@ -130,64 +110,65 @@ using waf. === Running the CloudStack components from source (for debugging / coding) === It is not technically possible to run the CloudStack components from -the source. That, however, is fine -- each component can be run -independently from the install directory: +the source. That, however, is fine -- you do not have to stop and start +the services each time you run ./waf install. Each component can be run +independently: - Management Server - 1) Execute ./waf install as your current user (or as root if the + Execute ./waf install as your current user (or as root if the installation path is only writable by root). - WARNING: if any CloudStack configuration files have been - already configured / altered, they will be *overwritten* by this - process. Append --preserve-config to ./waf install to prevent this - from happening. Or resort to the override method discussed - above (search for "override" in this document). - - 2) If you haven't done so yet, set up the management server database: - - - either run ./waf deploydb_kvm, or - - run $BINDIR/cloud-setup-databases - - 3) Execute ./waf run as your current user (or as root if the + Then execute ./waf run as your current user (or as root if the installation path is only writable by root). Alternatively, you can use ./waf debug and this will run with debugging enabled. + This will compile the stack, reinstall it, then run the Management + Server in the installed environment, as your current user, in + the foreground. -- Agent (Linux-only): - - 1) Execute ./waf install as your current user (or as root if the - installation path is only writable by root). + NOTE: if you have not yet deployed a database to the local MySQL + server, you should ./waf deploydb_kvm once so the database is + deployed. Failure to do that will cause the Management Server + to fail on startup. WARNING: if any CloudStack configuration files have been already configured / altered, they will be *overwritten* by this process. Append --preserve-config to ./waf install to prevent this from happening. Or resort to the override method discussed above (search for "override" in this document). - - 2) If you haven't done so yet, set the Console Proxy up: - - - run $BINDIR/cloud-setup-agent - - 3) Execute $LIBEXECDIR/agent-runner as root +- Agent: -- Console Proxy (Linux-only): - - 1) Execute ./waf install as your current user (or as root if the + Execute ./waf install as your current user (or as root if the installation path is only writable by root). + Then execute $LIBEXECDIR/agent-runner as root + + These steps, will compile, reinstall and run the Agent in the + foreground. You must run this runner as root. + WARNING: if any CloudStack configuration files have been already configured / altered, they will be *overwritten* by this process. Append --preserve-config to ./waf install to prevent this from happening. Or resort to the override method discussed above (search for "override" in this document). - - 2) If you haven't done so yet, set the Console Proxy up: - - run $BINDIR/cloud-setup-console-proxy +- Console Proxy: - 3) Execute $LIBEXECDIR/console-proxy-runner as root + Execute ./waf install as your current user (or as root if the + installation path is only writable by root). + + Then execute $LIBEXECDIR/console-proxy-runner as root + + These steps, will compile, reinstall and run the Console Proxy in the + foreground. You must run this runner as root. + + WARNING: if any CloudStack configuration files have been + already configured / altered, they will be *overwritten* by this + process. Append --preserve-config to ./waf install to prevent this + from happening. Or resort to the override method discussed + above (search for "override" in this document). --------------------------------------------------------------------- @@ -219,17 +200,6 @@ other later-generation build systems: language is available to use in the build process. -=== Hacking on the build system: what are these wscript files? === - -1. wscript: contains most commands you can run from within waf -2. wscript_configure: contains the process that discovers the software - on the system and configures the build to fit that -2. wscript_build: contains a manifest of *what* is built and installed - -Refer to the waf book for general information on waf: - http://freehackers.org/~tnagy/wafbook/index.html - - === What happens when waf runs === When you run waf, this happens behind the scenes: diff --git a/agent/.classpath b/agent/.classpath index f36c50ee1f6..109ab5e2e8c 100644 --- a/agent/.classpath +++ b/agent/.classpath @@ -1,16 +1,15 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/agent/bindir/cloud-setup-agent.in b/agent/bindir/cloud-setup-agent.in index c9aeea6d146..be8b4123017 100755 --- a/agent/bindir/cloud-setup-agent.in +++ b/agent/bindir/cloud-setup-agent.in @@ -83,7 +83,7 @@ try: stderr(str(e)) bail(cloud_utils.E_SETUPFAILED,"Cloud Agent setup failed") - setup_agent_config(configfile) + setup_agent_config(configfile,brname) stderr("Enabling and starting the Cloud Agent") stop_service(servicename) enable_service(servicename) diff --git a/agent/conf/agent.properties b/agent/conf/agent.properties index 60222277f33..7ce362493aa 100644 --- a/agent/conf/agent.properties +++ b/agent/conf/agent.properties @@ -19,12 +19,10 @@ pod=default zone=default #private.network.device= the private nic device -# if this is commented, it is autodetected on service startup -# private.network.device=cloudbr0 +private.network.device=cloudbr0 #public.network.device= the public nic device -# if this is commented, it is autodetected on service startup -# public.network.device=cloudbr0 +public.network.device=cloudbr0 #guid= a GUID to identify the agent 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 old mode 100755 new mode 100644 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 old mode 100755 new mode 100644 diff --git a/agent/libexec/agent-runner.in b/agent/libexec/agent-runner.in index fd2819b84f9..1dbd4f01d77 100755 --- a/agent/libexec/agent-runner.in +++ b/agent/libexec/agent-runner.in @@ -23,20 +23,6 @@ cd "@AGENTLIBDIR@" echo Current directory is "$PWD" echo CLASSPATH to run the agent: "$CLASSPATH" -export PATH=/sbin:/usr/sbin:"$PATH" -SERVICEARGS= -for x in private public ; do - configuration=`grep -q "^$x.network.device" "@AGENTSYSCONFDIR@"/agent.properties || true` - if [ -n "$CONFIGURATION" ] ; then - echo "Using manually-configured network device $CONFIGURATION" - else - defaultroute=`ip route | grep ^default | cut -d ' ' -f 5` - test -n "$defaultroute" - echo "Using auto-discovered network device $defaultroute which is the default route" - SERVICEARGS="$SERVICEARGS -D$x.network.device="$defaultroute - fi -done - function termagent() { if [ "$agentpid" != "" ] ; then echo Killing VMOps Agent "(PID $agentpid)" with SIGTERM >&2 @@ -52,7 +38,7 @@ function termagent() { trap termagent TERM while true ; do - java -Xms128M -Xmx384M -cp "$CLASSPATH" $SERVICEARGS "$@" com.cloud.agent.AgentShell & + java -Xms128M -Xmx384M -cp "$CLASSPATH" "$@" com.cloud.agent.AgentShell & agentpid=$! echo "Agent started. PID: $!" >&2 wait $agentpid diff --git a/agent/scripts/run.sh b/agent/scripts/run.sh index 3acaf64f128..69c93378a9d 100755 --- a/agent/scripts/run.sh +++ b/agent/scripts/run.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash #run.sh runs the agent client. -java $1 -Xms128M -Xmx384M -cp cglib-nodep-2.2.jar:xenserver-5.5.0-1.jar:trilead-ssh2-build213.jar:cloud-api.jar:cloud-core-extras.jar:cloud-utils.jar:cloud-agent.jar:cloud-console-proxy.jar:cloud-console-common.jar:freemarker.jar:log4j-1.2.15.jar:ws-commons-util-1.0.2.jar:xmlrpc-client-3.1.3.jar:cloud-core.jar:xmlrpc-common-3.1.3.jar:javaee-api-5.0-1.jar:gson-1.3.jar:commons-httpclient-3.1.jar:commons-logging-1.1.1.jar:commons-codec-1.4.jar:commons-collections-3.2.1.jar:commons-pool-1.4.jar:apache-log4j-extras-1.0.jar:libvirt-0.4.5.jar:jna.jar:.:/etc/cloud:./conf com.cloud.agent.AgentShell +java $1 -Xms128M -Xmx384M -cp cglib-nodep-2.2.jar:xenserver-5.5.0-1.jar:trilead-ssh2-build213.jar:cloud-core-extras.jar:cloud-utils.jar:cloud-agent.jar:cloud-console-proxy.jar:cloud-console-common.jar:freemarker.jar:log4j-1.2.15.jar:ws-commons-util-1.0.2.jar:xmlrpc-client-3.1.3.jar:cloud-core.jar:xmlrpc-common-3.1.3.jar:javaee-api-5.0-1.jar:gson-1.3.jar:commons-httpclient-3.1.jar:commons-logging-1.1.1.jar:commons-codec-1.4.jar:commons-collections-3.2.1.jar:commons-pool-1.4.jar:apache-log4j-extras-1.0.jar:libvirt-0.4.5.jar:jna.jar:.:/etc/cloud:./conf com.cloud.agent.AgentShell diff --git a/agent/src/com/cloud/agent/Agent.java b/agent/src/com/cloud/agent/Agent.java index 6d3f9df9403..eed1c63855f 100755 --- a/agent/src/com/cloud/agent/Agent.java +++ b/agent/src/com/cloud/agent/Agent.java @@ -157,8 +157,7 @@ public class Agent implements HandlerFactory, IAgentControl { _shell.getPort(), _shell.getWorkers(), this); - - // ((NioClient)_connection).setBindAddress(_shell.getPrivateIp()); + ((NioClient)_connection).setBindAddress(_shell.getPrivateIp()); s_logger.debug("Adding shutdown hook"); Runtime.getRuntime().addShutdownHook(new ShutdownThread(this)); diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index 0421dcfbeb3..2fff2c9a9ce 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -55,7 +55,6 @@ import org.libvirt.Connect; import org.libvirt.Domain; import org.libvirt.DomainInfo; import org.libvirt.DomainInterfaceStats; -import org.libvirt.DomainSnapshot; import org.libvirt.LibvirtException; import org.libvirt.Network; import org.libvirt.NodeInfo; @@ -69,20 +68,12 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.AttachIsoCommand; import com.cloud.agent.api.AttachVolumeAnswer; import com.cloud.agent.api.AttachVolumeCommand; -import com.cloud.agent.api.BackupSnapshotAnswer; -import com.cloud.agent.api.BackupSnapshotCommand; import com.cloud.agent.api.CheckHealthAnswer; import com.cloud.agent.api.CheckHealthCommand; import com.cloud.agent.api.CheckStateCommand; import com.cloud.agent.api.CheckVirtualMachineAnswer; import com.cloud.agent.api.CheckVirtualMachineCommand; import com.cloud.agent.api.Command; -import com.cloud.agent.api.CreatePrivateTemplateFromSnapshotCommand; -import com.cloud.agent.api.CreateVolumeFromSnapshotAnswer; -import com.cloud.agent.api.CreateVolumeFromSnapshotCommand; -import com.cloud.agent.api.DeleteSnapshotBackupAnswer; -import com.cloud.agent.api.DeleteSnapshotBackupCommand; -import com.cloud.agent.api.DeleteSnapshotsDirCommand; import com.cloud.agent.api.DeleteStoragePoolCommand; import com.cloud.agent.api.GetHostStatsAnswer; import com.cloud.agent.api.GetHostStatsCommand; @@ -159,7 +150,6 @@ import com.cloud.hypervisor.Hypervisor; import com.cloud.network.NetworkEnums.RouterPrivateIpStrategy; import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResourceBase; -import com.cloud.storage.StorageLayer; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; @@ -167,15 +157,9 @@ import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Volume.StorageResourceType; import com.cloud.storage.Volume.VolumeType; -import com.cloud.storage.template.Processor; -import com.cloud.storage.template.QCOW2Processor; import com.cloud.storage.template.TemplateInfo; -import com.cloud.storage.template.TemplateLocation; -import com.cloud.storage.template.Processor.FormatInfo; import com.cloud.utils.NumbersUtil; -import com.cloud.utils.Pair; import com.cloud.utils.PropertiesUtil; -import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.cloud.utils.script.OutputInterpreter; @@ -214,8 +198,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv private String _versionstringpath; private String _patchdomrPath; private String _createvmPath; - private String _manageSnapshotPath; - private String _createTmplPath; private String _host; private String _dcId; private String _pod; @@ -224,7 +206,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv private final String _SSHPRVKEYPATH = _SSHKEYSPATH + File.separator + "id_rsa.cloud"; private final String _SSHPUBKEYPATH = _SSHKEYSPATH + File.separator + "id_rsa.pub.cloud"; private final String _mountPoint = "/mnt"; - StorageLayer _storage; private static final class KeyValueInterpreter extends OutputInterpreter { private final Map map = new HashMap(); @@ -400,14 +381,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv " " + " "); - protected static MessageFormat SnapshotXML = new MessageFormat( - " " + - " {0}" + - " " + - " {1}" + - " " + - " "); - protected Connect _conn; protected String _hypervisorType; protected String _hypervisorURI; @@ -422,7 +395,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv protected String _domrRamdisk; protected String _pool; private boolean _can_bridge_firewall; - private Pair _pifs; private final Map _vmStats = new ConcurrentHashMap(); protected boolean _disconnected = true; @@ -588,16 +560,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv if (_createvmPath == null) { throw new ConfigurationException("Unable to find the createvm.sh"); } - - _manageSnapshotPath = Script.findScript(storageScriptsDir, "managesnapshot.sh"); - if (_manageSnapshotPath == null) { - throw new ConfigurationException("Unable to find the managesnapshot.sh"); - } - - _createTmplPath = Script.findScript(storageScriptsDir, "createtmplt.sh"); - if (_createTmplPath == null) { - throw new ConfigurationException("Unable to find the createtmplt.sh"); - } + s_logger.info("createvm.sh found in " + _createvmPath); String value = (String)params.get("developer"); boolean isDeveloper = Boolean.parseBoolean(value); @@ -719,15 +682,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } - try { - Class clazz = Class.forName("com.cloud.storage.JavaStorageLayer"); - _storage = (StorageLayer)ComponentLocator.inject(clazz); - _storage.configure("StorageLayer", params); - } catch (ClassNotFoundException e) { - throw new ConfigurationException("Unable to find class " + "com.cloud.storage.JavaStorageLayer"); - } - - //_can_bridge_firewall = can_bridge_firewall(); + _can_bridge_firewall = can_bridge_firewall(); Network vmopsNw = null; try { @@ -763,34 +718,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv s_logger.info("Found private network " + _privNwName + " already defined"); } - _pifs = getPifs(); - if (_pifs.first() == null) { - s_logger.debug("Failed to get private nic name"); - throw new ConfigurationException("Failed to get private nic name"); - } - - if (_pifs.second() == null) { - s_logger.debug("Failed to get public nic name"); - throw new ConfigurationException("Failed to get public nic name"); - } - s_logger.debug("Found pif: " + _pifs.first() + " on " + _privBridgeName + ", pif: " + _pifs.second() + " on " + _publicBridgeName); return true; } - private Pair getPifs() { - /*get pifs from bridge*/ - String pubPif = null; - String privPif = null; - if (_publicBridgeName != null) { - pubPif = Script.runSimpleBashScript("ls /sys/class/net/" + _publicBridgeName + "/brif/ |egrep eth[0-9]+"); - } - if (_privBridgeName != null) { - privPif = Script.runSimpleBashScript("ls /sys/class/net/" + _privBridgeName + "/brif/ |egrep eth[0-9]+"); - } - return new Pair(privPif, pubPif); - } private String getVnetId(String vnetId) { - return vnetId; + String id = "0000" + vnetId; + return id.substring(id.length() - 4); } private void patchSystemVm(String cmdLine, String dataDiskPath, String vmName) throws InternalErrorException { @@ -914,7 +847,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv guestDef guest = new guestDef(); guest.setGuestType(guestDef.guestType.KVM); guest.setGuestArch(arch); - guest.setMachineType("pc"); + guest.setBootOrder(guestDef.bootOrder.CDROM); guest.setBootOrder(guestDef.bootOrder.HARDISK); @@ -1057,6 +990,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv s_logger.info("Rule " + (created?" ":" not ") + " created"); test.stop(); + } @Override @@ -1119,16 +1053,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return execute((GetStorageStatsCommand) cmd); } else if (cmd instanceof ManageSnapshotCommand) { return execute((ManageSnapshotCommand) cmd); - } else if (cmd instanceof BackupSnapshotCommand) { - return execute((BackupSnapshotCommand) cmd); - } else if (cmd instanceof DeleteSnapshotBackupCommand) { - return execute((DeleteSnapshotBackupCommand) cmd); - } else if (cmd instanceof DeleteSnapshotsDirCommand) { - return execute((DeleteSnapshotsDirCommand) cmd); - } else if (cmd instanceof CreateVolumeFromSnapshotCommand) { - return execute((CreateVolumeFromSnapshotCommand) cmd); - } else if (cmd instanceof CreatePrivateTemplateFromSnapshotCommand) { - return execute((CreatePrivateTemplateFromSnapshotCommand) cmd); } else if (cmd instanceof ModifyStoragePoolCommand) { return execute((ModifyStoragePoolCommand) cmd); } else if (cmd instanceof NetworkIngressRulesCmd) { @@ -1222,127 +1146,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } } protected ManageSnapshotAnswer execute(final ManageSnapshotCommand cmd) { - String snapshotName = cmd.getSnapshotName(); - String VolPath = cmd.getVolumePath(); - try { - StorageVol vol = getVolume(VolPath); - if (vol == null) { - return new ManageSnapshotAnswer(cmd, false, null); - } - Domain vm = getDomain(cmd.getVmName()); - String vmUuid = vm.getUUIDString(); - Object[] args = new Object[] {snapshotName, vmUuid}; - String snapshot = SnapshotXML.format(args); - s_logger.debug(snapshot); - if (cmd.getCommandSwitch().equalsIgnoreCase(ManageSnapshotCommand.CREATE_SNAPSHOT)) { - vm.snapshotCreateXML(snapshot); - } else { - DomainSnapshot snap = vm.snapshotLookupByName(snapshotName); - snap.delete(0); - } - } catch (LibvirtException e) { - s_logger.debug("Failed to manage snapshot: " + e.toString()); - return new ManageSnapshotAnswer(cmd, false, "Failed to manage snapshot: " + e.toString()); - } + /*TODO: no snapshot support for KVM right now, but create_private_template needs us to return true here*/ return new ManageSnapshotAnswer(cmd, cmd.getSnapshotId(), cmd.getVolumePath(), true, null); } - protected BackupSnapshotAnswer execute(final BackupSnapshotCommand cmd) { - Long dcId = cmd.getDataCenterId(); - Long accountId = cmd.getAccountId(); - Long volumeId = cmd.getVolumeId(); - String secondaryStoragePoolURL = cmd.getSecondaryStoragePoolURL(); - String snapshotName = cmd.getSnapshotName(); - String snapshotPath = cmd.getSnapshotUuid(); - String snapshotDestPath = null; - - try { - StoragePool secondaryStoragePool = getNfsSPbyURI(_conn, new URI(secondaryStoragePoolURL)); - String ssPmountPath = _mountPoint + File.separator + secondaryStoragePool.getUUIDString(); - snapshotDestPath = ssPmountPath + File.separator + dcId + File.separator + "snapshots" + File.separator + accountId + File.separator + volumeId; - final Script command = new Script(_manageSnapshotPath, _timeout, s_logger); - command.add("-b", snapshotPath); - command.add("-n", snapshotName); - command.add("-p", snapshotDestPath); - String result = command.execute(); - if (result != null) { - s_logger.debug("Failed to backup snaptshot: " + result); - return new BackupSnapshotAnswer(cmd, false, result, null); - } - } catch (LibvirtException e) { - return new BackupSnapshotAnswer(cmd, false, e.toString(), null); - } catch (URISyntaxException e) { - return new BackupSnapshotAnswer(cmd, false, e.toString(), null); - } - return new BackupSnapshotAnswer(cmd, true, null, snapshotDestPath + File.separator + snapshotName); - } - - protected DeleteSnapshotBackupAnswer execute(final DeleteSnapshotBackupCommand cmd) { - return new DeleteSnapshotBackupAnswer(cmd, true, null); - } - - protected Answer execute(DeleteSnapshotsDirCommand cmd) { - return new Answer(cmd, true, null); - } - - protected CreateVolumeFromSnapshotAnswer execute(final CreateVolumeFromSnapshotCommand cmd) { - String snapshotPath = cmd.getSnapshotUuid(); - String primaryUuid = cmd.getPrimaryStoragePoolNameLabel(); - String primaryPath = _mountPoint + File.separator + primaryUuid; - String volUuid = UUID.randomUUID().toString(); - String volPath = primaryPath + File.separator + volUuid; - String result = Script.runSimpleBashScript("cp " + snapshotPath + " " + volPath); - if (result != null) { - return new CreateVolumeFromSnapshotAnswer(cmd, false, result, null); - } - return new CreateVolumeFromSnapshotAnswer(cmd, true, "", volPath); - } - - protected CreatePrivateTemplateAnswer execute(final CreatePrivateTemplateFromSnapshotCommand cmd) { - String orignalTmplPath = cmd.getOrigTemplateInstallPath(); - String templateFolder = cmd.getAccountId() + File.separator + cmd.getNewTemplateId(); - String templateInstallFolder = "template/tmpl/" + templateFolder; - String snapshotPath = cmd.getSnapshotUuid(); - String tmplName = UUID.randomUUID().toString(); - String tmplFileName = tmplName + ".qcow2"; - StoragePool secondaryPool; - try { - secondaryPool = getNfsSPbyURI(_conn, new URI(cmd.getSecondaryStoragePoolURL())); - /*TODO: assuming all the storage pools mounted under _mountPoint, the mount point should be got from pool.dumpxml*/ - String templatePath = _mountPoint + File.separator + secondaryPool.getUUIDString() + File.separator + templateInstallFolder; - String tmplPath = templateInstallFolder + File.separator + tmplFileName; - Script command = new Script(_createTmplPath, _timeout, s_logger); - command.add("-t", templatePath); - command.add("-n", tmplFileName); - command.add("-f", snapshotPath); - String result = command.execute(); - - Map params = new HashMap(); - params.put(StorageLayer.InstanceConfigKey, _storage); - Processor qcow2Processor = new QCOW2Processor(); - qcow2Processor.configure("QCOW2 Processor", params); - FormatInfo info = qcow2Processor.process(templatePath, null, tmplName); - - TemplateLocation loc = new TemplateLocation(_storage, templatePath); - loc.create(1, true, tmplName); - loc.addFormat(info); - loc.save(); - - return new CreatePrivateTemplateAnswer(cmd, true, "", tmplPath, info.virtualSize, tmplName, info.format); - } catch (LibvirtException e) { - return new CreatePrivateTemplateAnswer(cmd, false, e.getMessage(), null, 0, null, null); - } catch (URISyntaxException e) { - return new CreatePrivateTemplateAnswer(cmd, false, e.getMessage(), null, 0, null, null); - } catch (ConfigurationException e) { - return new CreatePrivateTemplateAnswer(cmd, false, e.getMessage(), null, 0, null, null); - } catch (InternalErrorException e) { - return new CreatePrivateTemplateAnswer(cmd, false, e.getMessage(), null, 0, null, null); - } catch (IOException e) { - return new CreatePrivateTemplateAnswer(cmd, false, e.getMessage(), null, 0, null, null); - } - } - - protected GetStorageStatsAnswer execute(final GetStorageStatsCommand cmd) { StoragePool sp = null; StoragePoolInfo spi = null; @@ -1483,6 +1290,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv if (primaryPool == null) { return new Answer(cmd, false, " Can't find primary storage pool"); } + LibvirtStorageVolumeDef vol = new LibvirtStorageVolumeDef(UUID.randomUUID().toString(), tmplVol.getInfo().capacity, volFormat.QCOW2, null, null); s_logger.debug(vol.toString()); primaryVol = copyVolume(primaryPool, vol, tmplVol); @@ -1908,7 +1716,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv final String vnet = getVnetId(cmd.getVnet()); if (vnet != null) { try { - createVnet(vnet, _pifs.first()); /*TODO: Need to add public network for domR*/ + createVnet(vnet); } catch (InternalErrorException e) { return new PrepareForMigrationAnswer(cmd, false, result); } @@ -1922,11 +1730,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return new PrepareForMigrationAnswer(cmd, result == null, result); } - public void createVnet(String vnetId, String pif) throws InternalErrorException { - final Script command = new Script(_modifyVlanPath, _timeout, s_logger); + public void createVnet(String vnetId) throws InternalErrorException { + final Script command = new Script(_createvnetPath, _timeout, s_logger); command.add("-v", vnetId); - command.add("-p", pif); - command.add("-o", "add"); final String result = command.execute(); if (result != null) { @@ -2263,12 +2069,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv isoPath = isoVol.getPath(); diskDef iso = new diskDef(); - iso.defFileBasedDisk(isoPath, "hdc", diskDef.diskBus.IDE, diskDef.diskFmtType.RAW); + iso.defFileBasedDisk(isoPath, "hdc", diskDef.diskBus.IDE); iso.setDeviceType(diskDef.deviceType.CDROM); isoXml = iso.toString(); } else { diskDef iso = new diskDef(); - iso.defFileBasedDisk(null, "hdc", diskDef.diskBus.IDE, diskDef.diskFmtType.RAW); + iso.defFileBasedDisk(null, "hdc", diskDef.diskBus.IDE); iso.setDeviceType(diskDef.deviceType.CDROM); isoXml = iso.toString(); } @@ -2320,9 +2126,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv diskDef disk = new diskDef(); String guestOSType = getGuestType(vmName); if (isGuestPVEnabled(guestOSType)) { - disk.defFileBasedDisk(sourceFile, diskDev, diskDef.diskBus.VIRTIO, diskDef.diskFmtType.QCOW2); + disk.defFileBasedDisk(sourceFile, diskDev, diskDef.diskBus.VIRTIO); } else { - disk.defFileBasedDisk(sourceFile, diskDev, diskDef.diskBus.SCSI, diskDef.diskFmtType.QCOW2); + disk.defFileBasedDisk(sourceFile, diskDev, diskDef.diskBus.SCSI); } String xml = disk.toString(); return attachOrDetachDevice(attach, vmName, xml); @@ -2822,8 +2628,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } } - final Script command = new Script(_modifyVlanPath, _timeout, s_logger); - command.add("-o", "delete"); + final Script command = new Script(_vnetcleanupPath, _timeout, s_logger); command.add("-v", vnetId); return command.execute(); } @@ -2887,21 +2692,16 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } private String getHypervisorPath() { - File f =new File("/usr/bin/cloud-qemu-kvm"); - if (f.exists()) { - return "/usr/bin/cloud-qemu-kvm"; - } else { - if (_conn == null) - return null; + if (_conn == null) + return null; + + LibvirtCapXMLParser parser = new LibvirtCapXMLParser(); + try { + parser.parseCapabilitiesXML(_conn.getCapabilities()); + } catch (LibvirtException e) { - LibvirtCapXMLParser parser = new LibvirtCapXMLParser(); - try { - parser.parseCapabilitiesXML(_conn.getCapabilities()); - } catch (LibvirtException e) { - - } - return parser.getEmulator(); } + return parser.getEmulator(); } private String getGuestType(String vmName) { @@ -2992,10 +2792,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } private String setVnetBrName(String vnetId) { - return "cloudVirBr" + vnetId; + return "vnbr" + vnetId; } private String getVnetIdFromBrName(String vnetBrName) { - return vnetBrName.replaceAll("cloudVirBr", ""); + return vnetBrName.replaceAll("vnbr", ""); } private List createUserVMNetworks(StartCommand cmd) throws InternalErrorException { List nics = new ArrayList(); @@ -3015,8 +2815,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv /*guest network is vnet*/ String vnetId = getVnetId(cmd.getGuestNetworkId()); brName = setVnetBrName(vnetId); - createVnet(vnetId, _pifs.first()); - pubNic.setHostNetType(hostNicType.VLAN); + createVnet(vnetId); + pubNic.setHostNetType(hostNicType.VNET); } pubNic.defBridgeNet(brName, null, guestMac, nicModel); nics.add(pubNic); @@ -3033,35 +2833,33 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv interfaceDef pubNic = new interfaceDef(); interfaceDef privNic = new interfaceDef(); interfaceDef vnetNic = new interfaceDef(); - - /*nic 0, guest network*/ if ("untagged".equalsIgnoreCase(router.getVnet())){ + /*guest network is direct attached with domr DHCP server*/ + /*0 is on private nic, 1 is link local*/ vnetNic.defBridgeNet(_privBridgeName, null, guestMac, interfaceDef.nicModel.VIRTIO); - + vnetNic.setHostNetType(hostNicType.DIRECT_ATTACHED_WITH_DHCP); + nics.add(vnetNic); + + privNic.defPrivateNet(_privNwName, null, privateMac, interfaceDef.nicModel.VIRTIO); + privNic.setHostNetType(hostNicType.DIRECT_ATTACHED_WITH_DHCP); + nics.add(privNic); } else { + /*guest network is vnet: 0 is vnet, 1 is link local, 2 is pub nic*/ String vnetId = getVnetId(router.getVnet()); brName = setVnetBrName(vnetId); String vnetDev = "vtap" + vnetId; - createVnet(vnetId, _pifs.first()); + createVnet(vnetId); vnetNic.defBridgeNet(brName, vnetDev, guestMac, interfaceDef.nicModel.VIRTIO); + vnetNic.setHostNetType(hostNicType.VNET); + nics.add(vnetNic); + + privNic.defPrivateNet(_privNwName, null, privateMac, interfaceDef.nicModel.VIRTIO); + nics.add(privNic); + + String pubDev = "tap" + vnetId; + pubNic.defBridgeNet(_publicBridgeName, pubDev, pubMac, interfaceDef.nicModel.VIRTIO); + nics.add(pubNic); } - nics.add(vnetNic); - - /*nic 1: link local*/ - privNic.defPrivateNet(_privNwName, null, privateMac, interfaceDef.nicModel.VIRTIO); - nics.add(privNic); - - /*nic 2: public */ - if ("untagged".equalsIgnoreCase(router.getVlanId())) { - pubNic.defBridgeNet(_publicBridgeName, null, pubMac, interfaceDef.nicModel.VIRTIO); - } else { - String vnetId = getVnetId(router.getVlanId()); - brName = setVnetBrName(vnetId); - String vnetDev = "vtap" + vnetId; - createVnet(vnetId, _pifs.second()); - pubNic.defBridgeNet(brName, vnetDev, pubMac, interfaceDef.nicModel.VIRTIO); - } - nics.add(pubNic); return nics; } @@ -3078,7 +2876,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv vnetNic.defPrivateNet("default", null, null, interfaceDef.nicModel.VIRTIO); nics.add(vnetNic); - privNic.defPrivateNet(_privNwName, null, privateMac, interfaceDef.nicModel.VIRTIO); + privNic.defPrivateNet(_linkLocalBridgeName, null, privateMac, interfaceDef.nicModel.VIRTIO); nics.add(privNic); pubNic.defBridgeNet(_publicBridgeName, null, pubMac, interfaceDef.nicModel.VIRTIO); @@ -3111,11 +2909,11 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv String datadiskPath = tmplVol.getKey(); diskDef hda = new diskDef(); - hda.defFileBasedDisk(rootkPath, "vda", diskDef.diskBus.IDE, diskDef.diskFmtType.QCOW2); + hda.defFileBasedDisk(rootkPath, "hda", diskDef.diskBus.IDE); disks.add(hda); diskDef hdb = new diskDef(); - hdb.defFileBasedDisk(datadiskPath, "vdb", diskDef.diskBus.IDE, diskDef.diskFmtType.QCOW2); + hdb.defFileBasedDisk(datadiskPath, "hdb", diskDef.diskBus.IDE); disks.add(hdb); return disks; @@ -3150,13 +2948,13 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv diskDef hda = new diskDef(); - hda.defFileBasedDisk(rootVolume.getPath(), "vda", diskBusType, diskDef.diskFmtType.QCOW2); + hda.defFileBasedDisk(rootVolume.getPath(), "hda", diskBusType); disks.add(hda); /*Centos doesn't support scsi hotplug. For other host OSes, we attach the disk after the vm is running, so that we can hotplug it.*/ if (dataVolume != null) { diskDef hdb = new diskDef(); - hdb.defFileBasedDisk(dataVolume.getPath(), "vdb", diskBusType, diskDef.diskFmtType.QCOW2); + hdb.defFileBasedDisk(dataVolume.getPath(), "hdb", diskBusType); if (!isCentosHost()) { hdb.setAttachDeferred(true); } @@ -3165,7 +2963,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv if (isoPath != null) { diskDef hdc = new diskDef(); - hdc.defFileBasedDisk(isoPath, "hdc", diskDef.diskBus.IDE, diskDef.diskFmtType.RAW); + hdc.defFileBasedDisk(isoPath, "hdc", diskDef.diskBus.IDE); hdc.setDeviceType(diskDef.deviceType.CDROM); disks.add(hdc); } @@ -3469,9 +3267,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return vol; } - private StorageVol getVolume(String volKey) throws LibvirtException{ + private StorageVol getVolume(String volKey) { StorageVol vol = null; - try { vol = _conn.storageVolLookupByKey(volKey); } catch (LibvirtException e) { @@ -3479,16 +3276,31 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } if (vol == null) { StoragePool pool = null; - String token[] = volKey.split("/"); - if (token.length <= 2) { - s_logger.debug("what the heck of volkey: " + volKey); + try { + String token[] = volKey.split("/"); + if (token.length <= 2) { + s_logger.debug("what the heck of volkey: " + volKey); + return null; + } + String poolUUID = token[token.length - 2]; + pool = _conn.storagePoolLookupByUUIDString(poolUUID); + + } catch (LibvirtException e) { + s_logger.debug("Failed to get pool, with volKey: " + volKey + "due to" + e.toString()); return null; } - String poolUUID = token[token.length - 2]; - pool = _conn.storagePoolLookupByUUIDString(poolUUID); - pool.refresh(0); - vol = _conn.storageVolLookupByKey(volKey); - + + try { + pool.refresh(0); + } catch (LibvirtException e) { + + } + + try { + vol = _conn.storageVolLookupByKey(volKey); + } catch (LibvirtException e) { + + } } return vol; } diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtVMDef.java b/agent/src/com/cloud/agent/resource/computing/LibvirtVMDef.java index 4d0ab0ccbcc..369b3d10ced 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtVMDef.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtVMDef.java @@ -248,37 +248,23 @@ public class LibvirtVMDef { return _bus; } } - enum diskFmtType { - RAW("raw"), - QCOW2("qcow2"); - String _fmtType; - diskFmtType(String fmt) { - _fmtType = fmt; - } - @Override - public String toString() { - return _fmtType; - } - } private deviceType _deviceType; /*floppy, disk, cdrom*/ private diskType _diskType; private String _sourcePath; private String _diskLabel; private diskBus _bus; - private diskFmtType _diskFmtType; /*qcow2, raw etc.*/ private boolean _readonly = false; private boolean _shareable = false; private boolean _deferAttach = false; public void setDeviceType(deviceType deviceType) { _deviceType = deviceType; } - public void defFileBasedDisk(String filePath, String diskLabel, diskBus bus, diskFmtType diskFmtType) { + public void defFileBasedDisk(String filePath, String diskLabel, diskBus bus) { _diskType = diskType.FILE; _deviceType = deviceType.DISK; _sourcePath = filePath; _diskLabel = diskLabel; - _diskFmtType = diskFmtType; _bus = bus; } @@ -316,7 +302,6 @@ public class LibvirtVMDef { } diskBuilder.append(" type='" + _diskType + "'"); diskBuilder.append(">\n"); - diskBuilder.append("\n"); if (_diskType == diskType.FILE) { diskBuilder.append(" - - - - - - - - - + @@ -29,57 +21,57 @@ - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + diff --git a/build/build-cloud.xml b/build/build-cloud.xml index 416ab36ee1b..221e23d19ea 100755 --- a/build/build-cloud.xml +++ b/build/build-cloud.xml @@ -60,9 +60,7 @@ - - - + @@ -119,7 +117,6 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/build/deploy/production/consoleproxy/conf/consoleproxy.properties b/build/deploy/production/consoleproxy/conf/consoleproxy.properties deleted file mode 100644 index 743db37ce54..00000000000 --- a/build/deploy/production/consoleproxy/conf/consoleproxy.properties +++ /dev/null @@ -1,6 +0,0 @@ -consoleproxy.tcpListenPort=0 -consoleproxy.httpListenPort=80 -consoleproxy.httpCmdListenPort=8001 -consoleproxy.jarDir=./applet/ -consoleproxy.viewerLinger=180 -consoleproxy.reconnectMaxRetry=5 diff --git a/build/deploy/production/db/server-setup-dev.xml b/build/deploy/production/db/server-setup-dev.xml deleted file mode 100644 index 429764a6e3e..00000000000 --- a/build/deploy/production/db/server-setup-dev.xml +++ /dev/null @@ -1,532 +0,0 @@ - - - 2.0 - - - 1 - AH - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 100-199 - 10.1.1.0/24 - - - 2 - KM - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 200-299 - 10.1.1.0/24 - - - 3 - KY - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 300-399 - 10.1.1.0/24 - - - 4 - WC - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 400-499 - 10.1.1.0/24 - - - 5 - CV - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 500-599 - 10.1.1.0/24 - - - 6 - KS - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 600-699 - 10.1.1.0/24 - - - 7 - ES - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 700-799 - 10.1.1.0/24 - - - 8 - RC - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 800-899 - 10.1.1.0/24 - - - 9 - AX - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 900-999 - 10.1.1.0/24 - - - 10 - JW - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 900-999 - 10.1.1.0/24 - - - 11 - AJ - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 1000-1099 - 10.1.1.0/24 - - - - - - - 1 - 31 - VirtualNetwork - 192.168.31.1 - 255.255.255.0 - 192.168.31.150-192.168.31.159 - - - 2 - 32 - VirtualNetwork - 192.168.32.1 - 255.255.255.0 - 192.168.32.150-192.168.32.159 - - - 3 - 33 - VirtualNetwork - 192.168.33.1 - 255.255.255.0 - 192.168.33.150-192.168.33.159 - - - 4 - 34 - VirtualNetwork - 192.168.34.1 - 255.255.255.0 - 192.168.34.150-192.168.34.159 - - - 5 - 35 - VirtualNetwork - 192.168.35.1 - 255.255.255.0 - 192.168.35.150-192.168.35.159 - - - 6 - 36 - VirtualNetwork - 192.168.36.1 - 255.255.255.0 - 192.168.36.150-192.168.36.159 - - - 7 - 37 - VirtualNetwork - 192.168.37.1 - 255.255.255.0 - 192.168.37.150-192.168.37.159 - - - 8 - 38 - VirtualNetwork - 192.168.38.1 - 255.255.255.0 - 192.168.38.150-192.168.38.159 - - - 9 - 39 - VirtualNetwork - 192.168.39.1 - 255.255.255.0 - 192.168.39.150-192.168.39.159 - - - 10 - 40 - VirtualNetwork - 192.168.40.1 - 255.255.255.0 - 192.168.40.150-192.168.40.159 - - - 11 - 41 - VirtualNetwork - 192.168.41.1 - 255.255.255.0 - 192.168.41.150-192.168.41.159 - - - - - - 1 - AH - 1 - 192.168.10.20-192.168.10.24 - 192.168.10.0/24 - - - 2 - KM - 2 - 192.168.10.25-192.168.10.29 - 192.168.10.0/24 - - - 3 - KY - 3 - 192.168.10.30-192.168.10.34 - 192.168.10.0/24 - - - 4 - WC - 4 - 192.168.10.35-192.168.10.39 - 192.168.10.0/24 - - - 5 - CV - 5 - 192.168.10.40-192.168.10.44 - 192.168.10.0/24 - - - 6 - KS - 6 - 192.168.10.45-192.168.10.49 - 192.168.10.0/24 - - - 7 - ES - 7 - 192.168.10.50-192.168.10.54 - 192.168.10.0/24 - - - 8 - RC - 8 - 192.168.10.55-192.168.10.59 - 192.168.10.0/24 - - - 9 - AX - 9 - 192.168.10.62-192.168.10.64 - 192.168.10.0/24 - - - 10 - JW - 10 - 192.168.10.65-192.168.10.69 - 192.168.10.0/24 - - - 11 - AJ - 11 - 192.168.10.70-192.168.10.74 - 192.168.10.0/24 - - - - - - - 1 - Small Instance - Small Instance [500MHZ CPU, 512MB MEM, 16GB Disk] - $0.10 per hour - 1 - 512 - 500 - false - - - 2 - Medium Instance - Medium Instance [500MHZ CPU, 1GB MEM, 32GB Disk] - $0.20 per hour - 1 - 1024 - 512 - - - 3 - Large Instance - Large Instance [2GHZ CPU, 4GB MEM, 64GB Disk] - $0.30 per hour - 2 - 4096 - 2000 - - - - - - 1 - 1 - Small Disk - Small Disk [16GB Disk] - 16000 - - - 2 - 1 - Medium Disk - Medium Disk [32GB Disk] - 32000 - - - 3 - 1 - Large Disk - Large Disk [64GB Disk] - 64000 - - - - - - - 2 - admin - password - Admin - User - admin@mailprovider.com - - - - - - default.zone - AH - - - domain.suffix - cloud-test.cloud.com - - - instance.name - AH - - - consoleproxy.ram.size - 256 - - - host.stats.interval - 3600000 - - - storage.stats.interval - 120000 - - - volume.stats.interval - -1 - - - ping.interval - 60 - - - alert.wait - 1800 - - - expunge.interval - 86400 - - - usage.aggregation.timezone - GMT - - - - ssh.privatekey - -----BEGIN RSA PRIVATE KEY-----\nMIIEoQIBAAKCAQEAnNUMVgQS87EzAQN9ufGgH3T1kOpqcvTmUrp8RVZyeA5qwptS\nrZxONRbhLK709pZFBJLmeFqiqciWoA/srVIFk+rPmBlVsMw8BK53hTGoax7iSe8s\nLFCAATm6vp0HnZzYqNfrzR2by36ET5aQD/VAyA55u+uUgAlxQuhKff2xjyahEHs+\nUiRlReiAgItygm9g3co3+8fJDOuRse+s0TOip1D0jPdo2AJFscyxrG9hWqQH86R/\nZlLJ7DqsiaAcUmn52u6Nsmd3BkRmGVx/D35Mq6upJqrk/QDfug9LF66yiIP/BEIn\n08N/wQ6m/O37WUtqqyl3rRKqs5TJ9ZnhsqeO9QIBIwKCAQA6QIDsv69EkkYk8qsK\njPJU06uq2rnS7T+bEhDmjdK+4MiRbOQx2vh6HnDktgM3BJ1K13oss/NGYHJ190lH\nsMA+QUXKx5TbRItSMixkrAta/Ne1D7FSScklBtBVbYZ8XtQhdMVML5GjWuCv2NZs\nU8eaw4xNHPyklcr7mBurI7b6p13VK5BNUWR/VNuigT4U89YzRcoEZ/sTlR+4ACYr\nxbUJJGBA03+NhdSAe2vodlMh5lGflD0JmHMFqqg9BcAtVb73JsOsxFQArbXwRd/q\nNckdoAvgJfhTOvXF5GMPLI0lGb6skJkS229F4GaBB2Iz4A9O0aHZob8I8zsWUbiu\npvBrAoGBAMjUDfF2x13NjH1cFHietO5O1oM0nZaAxKodxoAUvHVMUd5DIY50tqYw\n7ecKi2Cw43ONpdj0nP9Nc2NV3NDRqLopwkKUsTtq9AKQ2cIuw3+uS5vm0VZBzmTP\nuF04Qo4bXh/jFRA62u9bXsmIFtaehKxE1Gp6zi393GcbWP4HX/3dAoGBAMfq0KD3\ngeU1PHi9uI3Ss89nXzJsiGcwC5Iunu1aTzJCYhMlJkfmRcXYMAqSfg0nGWnfvlDh\nuOO26CHKjG182mTwYXdgQzIPpBc8suvgUWDBTrIzJI+zuyBLtPbd9DJEVrZkRVQX\nXrOV3Y5oOWsba4F+b20jaaHFAiY7s6OtrX/5AoGBAMMXI3zZyPwJgSlSIoPNX03m\nL3gke9QID4CvNduB26UlkVuRq5GzNRZ4rJdMEl3tqcC1fImdKswfWiX7o06ChqY3\nMb0FePfkPX7V2tnkSOJuzRsavLoxTCdqsxi6T0g318c0XZq81K4A/P5Jr8ksRl40\nPA+qfyVdAf3Cy3ptkHLzAoGASkFGLSi7N+CSzcLPhSJgCzUGGgsOF7LCeB/x4yGL\nIUvbSPCKj7vuB6gR2AqGlyvHnFprQpz7h8eYDI0PlmGS8kqn2+HtEpgYYGcAoMEI\nSIJQbhL+84vmaxTOL87IanEnhZL1LdzLZ0ZK+mE55fQ936P9gE77WVfNmSweJtob\n3xMCgYAl0aLeGf4oUZbI56eEaCbu8U7dEe6MF54VbozyiXqbp455QnUpuBrRn5uf\nc079dNcqTNDuk1+hYX9qNn1aXsvWeuofBXqWoFXu/c4yoWxJAPhEVhzZ9xrXI76I\nBKiPCyKrOa7bSLvs6SQPpuf5AQ8+NJrOxkEB9hbMuaAr2N5rCw==\n-----END RSA PRIVATE KEY----- - - Hidden - - - ssh.publickey - - ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnNUMVgQS87EzAQN9ufGgH3T1kOpqcvTmUrp8RVZyeA5qwptSrZxONRbhLK709pZFBJLmeFqiqciWoA/srVIFk+rPmBlVsMw8BK53hTGoax7iSe8sLFCAATm6vp0HnZzYqNfrzR2by36ET5aQD/VAyA55u+uUgAlxQuhKff2xjyahEHs+UiRlReiAgItygm9g3co3+8fJDOuRse+s0TOip1D0jPdo2AJFscyxrG9hWqQH86R/ZlLJ7DqsiaAcUmn52u6Nsmd3BkRmGVx/D35Mq6upJqrk/QDfug9LF66yiIP/BEIn08N/wQ6m/O37WUtqqyl3rRKqs5TJ9ZnhsqeO9Q== root@test2.lab.vmops.com - - Hidden - - - - - memory.capacity.threshold - 0.85 - - - cpu.capacity.threshold - 0.85 - - - storage.capacity.threshold - 0.85 - - - storage.allocated.capacity.threshold - 0.85 - - - capacity.check.period - 3600000 - - - wait - 240 - - - network.throttling.rate - 200 - - - multicast.throttling.rate - 10 - - - - - - - diff --git a/build/deploy/production/db/templates-dev.sql b/build/deploy/production/db/templates-dev.sql deleted file mode 100644 index a12d5e14bbe..00000000000 --- a/build/deploy/production/db/templates-dev.sql +++ /dev/null @@ -1,14 +0,0 @@ -INSERT INTO `vmops`.`vm_template` (id, unique_name, name, public, path, created, type, hvm, bits, created_by, url, checksum, ready, display_text, enable_password) - VALUES (1, 'routing', 'DomR Template', 0, 'tank/volumes/demo/template/private/u000000/os/routing', now(), 'ext3', 0, 64, 1, 'http://vmopsserver.lab.vmops.com/images/routing/vmi-root-fc8-x86_64-domR.img.bz2', 'd00927f863a23b98cc6df6e377c9d0c6', 0, 'DomR Template', 0); -INSERT INTO `vmops`.`vm_template` (id, unique_name, name, public, path, created, type, hvm, bits, created_by, url, checksum, ready, display_text, enable_password) - VALUES (3, 'centos53-x86_64', 'Centos 5.3(x86_64) no GUI', 1, 'tank/volumes/demo/template/public/os/centos53-x86_64', now(), 'ext3', 0, 64, 1, 'http://vmopsserver.lab.vmops.com/images/centos52-x86_64/vmi-root-centos.5-2.64.pv.img.gz', 'd4ca80825d936db00eedf26620f13d69', 0, 'Centos 5.3(x86_64) no GUI', 0); -#INSERT INTO `vmops`.`vm_template` (id, unique_name, name, public, path, created, type, hvm, bits, created_by, url, checksum, ready, display_text, enable_password) -# VALUES (4, 'centos52-x86_64-gui', 'Centos 5.2(x86_64) GUI', 1, 'tank/volumes/demo/template/public/os/centos52-x86_64-gui', now(), 'ext3', 0, 64, 1, 'http://vmopsserver.lab.vmops.com/images/centos52-x86_64/vmi-root-centos.5-2.64.pv.img.gz', 'd4ca80825d936db00eedf26620f13d69', 0, 'Centos 5.2(x86_64) GUI', 0); -INSERT INTO `vmops`.`vm_template` (id, unique_name, name, public, path, created, type, hvm, bits, created_by, url, checksum, ready, display_text, enable_password) - VALUES (5, 'winxpsp3', 'Windows XP SP3 (32-bit)', 1, 'tank/volumes/demo/template/public/os/winxpsp3', now(), 'ntfs', 1, 32, 1, 'http://vmopsserver.lab.vmops.com/images/fedora10-x86_64/vmi-root-fedora10.64.img.gz', 'c76d42703f14108b15acc9983307c759', 0, 'Windows XP SP3 (32-bit)', 0); -INSERT INTO `vmops`.`vm_template` (id, unique_name, name, public, path, created, type, hvm, bits, created_by, url, checksum, ready, display_text, enable_password) - VALUES (7, 'win2003sp2', 'Windows 2003 SP2 (32-bit)', 1, 'tank/volumes/demo/template/public/os/win2003sp2', now(), 'ntfs', 1, 32, 1, 'http://vmopsserver.lab.vmops.com/images/win2003sp2/vmi-root-win2003sp2.img.gz', '4d2cc51898d05c0f7a2852c15bcdc77b', 0, 'Windows 2003 SP2 (32-bit)', 0); -INSERT INTO `vmops`.`vm_template` (id, unique_name, name, public, path, created, type, hvm, bits, created_by, url, checksum, ready, display_text, enable_password) - VALUES (8, 'win2003sp2-x64', 'Windows 2003 SP2 (64-bit)', 1, 'tank/volumes/demo/template/public/os/win2003sp2-x64', now(), 'ntfs', 1, 64, 1, 'http://vmopsserver.lab.vmops.com/images/win2003sp2-x86_64/vmi-root-win2003sp2-x64.img.gz', '35d4de1c38eb4fb9d81a31c1d989c482', 0, 'Windows 2003 SP2 (64-bit)', 0); -INSERT INTO `vmops`.`vm_template` (id, unique_name, name, public, path, created, type, hvm, bits, created_by, url, checksum, ready, display_text, enable_password) - VALUES (9, 'fedora12-GUI-x86_64', 'Fedora 12 Desktop(64-bit)', 1, 'tank/volumes/demo/template/public/os/fedora12-GUI-x86_64', now(), 'ext3', 1, 64, 1, 'http://vmopsserver.lab.vmops.com/images/fedora12-GUI-x86_64/vmi-root-fedora12-GUI-x86_64.qcow2.gz', '', 0, 'Fedora 12 Desktop (with httpd,java and mysql)', 0); diff --git a/build/deploy/production/premium/conf/log4j-cloud_usage.xml b/build/deploy/production/premium/conf/log4j-cloud_usage.xml deleted file mode 100644 index 46500faad81..00000000000 --- a/build/deploy/production/premium/conf/log4j-cloud_usage.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/deploy/production/premium/conf/log4j-cloud_usage.xml.template b/build/deploy/production/premium/conf/log4j-cloud_usage.xml.template deleted file mode 100644 index 7c94e594c93..00000000000 --- a/build/deploy/production/premium/conf/log4j-cloud_usage.xml.template +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/deploy/production/premium/conf/usage-components.xml b/build/deploy/production/premium/conf/usage-components.xml deleted file mode 100644 index 5e178302819..00000000000 --- a/build/deploy/production/premium/conf/usage-components.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - 50 - -1 - - - - - - - - - - - - - - - DAILY - - - diff --git a/build/deploy/production/server/conf/agent-update.properties b/build/deploy/production/server/conf/agent-update.properties deleted file mode 100644 index 6b42aa8b6f5..00000000000 --- a/build/deploy/production/server/conf/agent-update.properties +++ /dev/null @@ -1 +0,0 @@ -agent.minimal.version=@agent.min.version@ diff --git a/build/deploy/production/server/conf/cloud-localhost.pk12 b/build/deploy/production/server/conf/cloud-localhost.pk12 deleted file mode 100644 index 79dfc4d7aa6..00000000000 Binary files a/build/deploy/production/server/conf/cloud-localhost.pk12 and /dev/null differ diff --git a/build/deploy/production/server/conf/ehcache.xml b/build/deploy/production/server/conf/ehcache.xml deleted file mode 100755 index c65deeacdb9..00000000000 --- a/build/deploy/production/server/conf/ehcache.xml +++ /dev/null @@ -1,527 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/deploy/production/server/conf/log4j-cloud.xml b/build/deploy/production/server/conf/log4j-cloud.xml deleted file mode 100755 index 2142d81eaaa..00000000000 --- a/build/deploy/production/server/conf/log4j-cloud.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/deploy/production/server/conf/log4j-cloud.xml.template b/build/deploy/production/server/conf/log4j-cloud.xml.template deleted file mode 100644 index 5e1e6598884..00000000000 --- a/build/deploy/production/server/conf/log4j-cloud.xml.template +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/deploy/production/server/conf/server.xml b/build/deploy/production/server/conf/server.xml deleted file mode 100755 index 99ea003791c..00000000000 --- a/build/deploy/production/server/conf/server.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/package.xml b/build/package.xml index 4d15dd2021a..354b5ebee07 100755 --- a/build/package.xml +++ b/build/package.xml @@ -72,7 +72,6 @@ - @@ -134,7 +133,9 @@ - + + + @@ -164,7 +165,6 @@ - @@ -232,8 +232,7 @@ - - + diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index fb62d18615e..d5ace796fe4 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -70,8 +70,6 @@ registerIso=com.cloud.api.commands.RegisterIsoCmd;15 updateIso=com.cloud.api.commands.UpdateIsoCmd;15 deleteIso=com.cloud.api.commands.DeleteIsoCmd;15 copyIso=com.cloud.api.commands.CopyIsoCmd;15 -updateIsoPermissions=com.cloud.api.commands.UpdateIsoPermissionsCmd;15 -listIsoPermissions=com.cloud.api.commands.ListIsoPermissionsCmd;15 #### guest OS commands listOsTypes=com.cloud.api.commands.ListGuestOsCmd;15 @@ -138,7 +136,6 @@ listSystemVms=com.cloud.api.commands.ListSystemVMsCmd;1 #### configuration commands updateConfiguration=com.cloud.api.commands.UpdateCfgCmd;1 listConfigurations=com.cloud.api.commands.ListCfgsByCmd;1 -addConfig=com.cloud.api.commands.AddConfigCmd;15 #### pod commands createPod=com.cloud.api.commands.CreatePodCmd;1 @@ -195,8 +192,6 @@ createStoragePool=com.cloud.api.commands.CreateStoragePoolCmd;1 updateStoragePool=com.cloud.api.commands.UpdateStoragePoolCmd;1 deleteStoragePool=com.cloud.api.commands.DeletePoolCmd;1 listClusters=com.cloud.api.commands.ListClustersCmd;1 -enableStorageMaintenance=com.cloud.api.commands.PreparePrimaryStorageForMaintenanceCmd;1 -cancelStorageMaintenance=com.cloud.api.commands.CancelPrimaryStorageMaintenanceCmd;1 #### network group commands createNetworkGroup=com.cloud.api.commands.CreateNetworkGroupCmd;11 diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index 293f580c184..ecac928d1bc 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -34,10 +34,7 @@ 50 -1 - - 50 - -1 - + 50 -1 @@ -80,6 +77,7 @@ + @@ -146,7 +144,6 @@ - @@ -224,7 +221,6 @@ -1 - diff --git a/cloud.spec b/cloud.spec index 1e010c9c814..8bb8752b8b8 100644 --- a/cloud.spec +++ b/cloud.spec @@ -4,7 +4,7 @@ # DISABLE the post-percentinstall java repacking and line number stripping # we need to find a way to just disable the java repacking and line number stripping, but not the autodeps -%define _ver 2.1.98 +%define _ver 2.1.2.1 %define _rel 1 Name: cloud @@ -35,7 +35,7 @@ BuildRequires: jpackage-utils BuildRequires: gcc BuildRequires: glibc-devel -%global _premium %(tar jtvmf %{SOURCE0} '*/cloudstack-proprietary/' --occurrence=1 2>/dev/null | wc -l) +%global _premium %(tar jtvmf %{SOURCE0} '*/premium/' --occurrence=1 2>/dev/null | wc -l) %description This is the Cloud.com Stack, a highly-scalable elastic, open source, @@ -190,22 +190,6 @@ Group: System Environment/Libraries %description setup The Cloud.com setup tools let you set up your Management Server and Usage Server. -%package agent-libs -Summary: Cloud.com agent libraries -Requires: java >= 1.6.0 -Requires: %{name}-utils = %{version}-%{release}, %{name}-core = %{version}-%{release}, %{name}-deps = %{version}-%{release} -Requires: commons-httpclient -#Requires: commons-codec -Requires: commons-collections -Requires: commons-pool -Requires: commons-dbcp -Requires: jakarta-commons-logging -Requires: jpackage-utils -Group: System Environment/Libraries -%description agent-libs -The Cloud.com agent libraries are used by the Cloud Agent and the Cloud -Console Proxy. - %package agent Summary: Cloud.com agent Obsoletes: vmops-agent < %{version}-%{release} @@ -213,10 +197,8 @@ Obsoletes: vmops-console < %{version}-%{release} Obsoletes: cloud-console < %{version}-%{release} Requires: java >= 1.6.0 Requires: %{name}-utils = %{version}-%{release}, %{name}-core = %{version}-%{release}, %{name}-deps = %{version}-%{release} -Requires: %{name}-agent-libs = %{version}-%{release} Requires: %{name}-agent-scripts = %{version}-%{release} Requires: %{name}-vnet = %{version}-%{release} -Requires: python Requires: %{name}-python = %{version}-%{release} Requires: commons-httpclient #Requires: commons-codec @@ -235,8 +217,6 @@ Requires: libcgroup Requires: /usr/bin/uuidgen Requires: augeas >= 0.7.1 Requires: rsync -Requires: /bin/egrep -Requires: /sbin/ip Group: System Environment/Libraries %description agent The Cloud.com agent is in charge of managing shared computing resources in @@ -246,9 +226,7 @@ will participate in your cloud. %package console-proxy Summary: Cloud.com console proxy Requires: java >= 1.6.0 -Requires: %{name}-utils = %{version}-%{release}, %{name}-core = %{version}-%{release}, %{name}-deps = %{version}-%{release}, %{name}-agent-libs = %{version}-%{release} -Requires: python -Requires: %{name}-python = %{version}-%{release} +Requires: %{name}-utils = %{version}-%{release}, %{name}-core = %{version}-%{release}, %{name}-deps = %{version}-%{release}, %{name}-agent = %{version}-%{release} Requires: commons-httpclient #Requires: commons-codec Requires: commons-collections @@ -261,8 +239,6 @@ Requires: /sbin/service Requires: /sbin/chkconfig Requires: /usr/bin/uuidgen Requires: augeas >= 0.7.1 -Requires: /bin/egrep -Requires: /sbin/ip Group: System Environment/Libraries %description console-proxy The Cloud.com console proxy is the service in charge of granting console @@ -445,9 +421,7 @@ fi %files utils %defattr(0644,root,root,0755) %{_javadir}/%{name}-utils.jar -%{_javadir}/%{name}-api.jar %doc %{_docdir}/%{name}-%{version}/sccs-info -%doc %{_docdir}/%{name}-%{version}/version-info %doc %{_docdir}/%{name}-%{version}/configure-info %doc README %doc HACKING @@ -485,17 +459,19 @@ fi %{_libdir}/%{name}/agent/scripts/installer/* %{_libdir}/%{name}/agent/scripts/network/domr/*.sh %{_libdir}/%{name}/agent/scripts/storage/*.sh +%{_libdir}/%{name}/agent/scripts/storage/zfs/* %{_libdir}/%{name}/agent/scripts/storage/qcow2/* %{_libdir}/%{name}/agent/scripts/storage/secondary/* %{_libdir}/%{name}/agent/scripts/util/* %{_libdir}/%{name}/agent/scripts/vm/*.sh %{_libdir}/%{name}/agent/scripts/vm/storage/nfs/* +%{_libdir}/%{name}/agent/scripts/vm/storage/iscsi/* %{_libdir}/%{name}/agent/scripts/vm/network/* %{_libdir}/%{name}/agent/scripts/vm/hypervisor/*.sh %{_libdir}/%{name}/agent/scripts/vm/hypervisor/kvm/* +%{_libdir}/%{name}/agent/scripts/vm/hypervisor/xen/* %{_libdir}/%{name}/agent/vms/systemvm.zip %{_libdir}/%{name}/agent/scripts/vm/hypervisor/xenserver/* -%{_libdir}/%{name}/agent/vms/systemvm-premium.zip %doc README %doc HACKING %doc debian/copyright @@ -617,15 +593,9 @@ fi %doc HACKING %doc debian/copyright -%files agent-libs -%defattr(0644,root,root,0755) -%{_javadir}/%{name}-agent.jar -%doc README -%doc HACKING -%doc debian/copyright - %files agent %defattr(0644,root,root,0755) +%{_javadir}/%{name}-agent.jar %config(noreplace) %{_sysconfdir}/%{name}/agent/agent.properties %config %{_sysconfdir}/%{name}/agent/developer.properties.template %config %{_sysconfdir}/%{name}/agent/environment.properties diff --git a/console-proxy/bindir/cloud-setup-console-proxy.in b/console-proxy/bindir/cloud-setup-console-proxy.in index 9079c229ebb..6ce89909cc4 100755 --- a/console-proxy/bindir/cloud-setup-console-proxy.in +++ b/console-proxy/bindir/cloud-setup-console-proxy.in @@ -2,19 +2,6 @@ import sys, os, subprocess, errno, re -# ---- This snippet of code adds the sources path and the waf configured PYTHONDIR to the Python path ---- -# ---- We do this so cloud_utils can be looked up in the following order: -# ---- 1) Sources directory -# ---- 2) waf configured PYTHONDIR -# ---- 3) System Python path -for pythonpath in ( - "@PYTHONDIR@", - os.path.join(os.path.dirname(__file__),os.path.pardir,os.path.pardir,"python","lib"), - ): - if os.path.isdir(pythonpath): sys.path.insert(0,pythonpath) -# ---- End snippet of code ---- -import cloud_utils - E_GENERIC= 1 E_NOKVM = 2 E_NODEFROUTE = 3 @@ -131,57 +118,98 @@ CentOS = os.path.exists("/etc/centos-release") or ( os.path.exists("/etc/redhat- #--------------- procedure starts here ------------ -def main(): - - servicename = "@PACKAGE@-console-proxy" - - stderr("Welcome to the Cloud Console Proxy setup") - stderr("") +stderr("Welcome to the Cloud Console Proxy setup") +stderr("") - try: - check_hostname() - stderr("The hostname of this machine is properly set up") - except CalledProcessError,e: - bail(E_NOFQDN,"This machine does not have an FQDN (fully-qualified domain name) for a hostname") +try: + check_hostname() + stderr("The hostname of this machine is properly set up") +except CalledProcessError,e: + bail(E_NOFQDN,"This machine does not have an FQDN (fully-qualified domain name) for a hostname") +try: + service("@PACKAGE@-console-proxy","status") +except CalledProcessError,e: stderr("Stopping the Cloud Console Proxy") - cloud_utils.stop_service(servicename) + m = service("@PACKAGE@-console-proxy","stop") + print m.stdout + m.stderr stderr("Cloud Console Proxy stopped") - ports = "8002".split() - if Fedora or CentOS: - try: - o = chkconfig("--list","iptables") - if ":on" in o.stdout and os.path.exists("/etc/sysconfig/iptables"): - stderr("Setting up firewall rules to permit traffic to Cloud services") - service.iptables.start() ; print o.stdout + o.stderr - for p in ports: iptables("-I","INPUT","1","-p","tcp","--dport",p,'-j','ACCEPT') - o = service.iptables.save() ; print o.stdout + o.stderr - except CalledProcessError,e: - print e.stdout+e.stderr - bail(E_FWRECONFIGFAILED,"Firewall rules could not be set") - else: - stderr("Setting up firewall rules to permit traffic to Cloud services") - try: - for p in ports: ufw.allow(p) - stderr("Rules set") - except CalledProcessError,e: - print e.stdout+e.stderr - bail(E_FWRECONFIGFAILED,"Firewall rules could not be set") +stderr("Determining default route") +routes = ip.route().stdout.splitlines() +defaultroute = [ x for x in routes if x.startswith("default") ] +if not defaultroute: bail(E_NODEFROUTE,"Your network configuration does not have a default route") +dev = defaultroute[0].split()[4] +stderr("Default route assigned to device %s"%dev) + +ports = "8002".split() +if Fedora or CentOS: + try: + o = chkconfig("--list","iptables") + if ":on" in o.stdout and os.path.exists("/etc/sysconfig/iptables"): + stderr("Setting up firewall rules to permit traffic to Cloud services") + service.iptables.start() ; print o.stdout + o.stderr + for p in ports: iptables("-I","INPUT","1","-p","tcp","--dport",p,'-j','ACCEPT') + o = service.iptables.save() ; print o.stdout + o.stderr + except CalledProcessError,e: + print e.stdout+e.stderr + bail(E_FWRECONFIGFAILED,"Firewall rules could not be set") +else: + stderr("Setting up firewall rules to permit traffic to Cloud services") + try: + for p in ports: ufw.allow(p) + stderr("Rules set") + except CalledProcessError,e: + print e.stdout+e.stderr + bail(E_FWRECONFIGFAILED,"Firewall rules could not be set") - stderr("We are going to enable ufw now. This may disrupt network connectivity and service availability. See the ufw documentation for information on how to manage ufw firewall policies.") - try: - o = ufw.enable < "y\n" ; print o.stdout + o.stderr - except CalledProcessError,e: - print e.stdout+e.stderr - bail(E_FWRECONFIGFAILED,"Firewall could not be enabled") + stderr("We are going to enable ufw now. This may disrupt network connectivity and service availability. See the ufw documentation for information on how to manage ufw firewall policies.") + try: + o = ufw.enable < "y\n" ; print o.stdout + o.stderr + except CalledProcessError,e: + print e.stdout+e.stderr + bail(E_FWRECONFIGFAILED,"Firewall could not be enabled") - cloud_utils.setup_consoleproxy_config("@CPSYSCONFDIR@/agent.properties") - stderr("Enabling and starting the Cloud Console Proxy") - cloud_utils.enable_service(servicename) - stderr("Cloud Console Proxy restarted") +stderr("Examining console-proxy configuration") +fn = "@CPSYSCONFDIR@/agent.properties" +text = file(fn).read(-1) +lines = [ s.strip() for s in text.splitlines() ] +confopts = dict([ m.split("=",1) for m in lines if "=" in m and not m.startswith("#") ]) +confposes = dict([ (m.split("=",1)[0],n) for n,m in enumerate(lines) if "=" in m and not m.startswith("#") ]) + +if not "guid" in confopts: + stderr("Generating GUID for this console-proxy") + confopts['guid'] = uuidgen().stdout.strip() + +try: host = confopts["host"] +except KeyError: host = "localhost" +stderr("Please enter the host name of the management server that this console-proxy will connect to: (just hit ENTER to go with %s)",host) +newhost = raw_input().strip() +if newhost: host = newhost +confopts["host"] = host + +confopts["private.network.device"] = dev +confopts["public.network.device"] = dev + +for opt,val in confopts.items(): + line = "=".join([opt,val]) + if opt not in confposes: lines.append(line) + else: lines[confposes[opt]] = line + +text = "\n".join(lines) +try: file(fn,"w").write(text) +except Exception: bail(E_CPRECONFIGFAILED,"Console Proxy configuration failed") + +stderr("") +stderr("Cloud Console Proxy setup completed successfully") + +stderr("Starting the Cloud Console Proxy") +try: + m = service("@PACKAGE@-console-proxy","start") + print m.stdout + m.stderr +except CalledProcessError,e: + print e.stdout + e.stderr + bail(E_CPFAILEDTOSTART,"@PACKAGE@-console-proxy failed to start") -if __name__ == "__main__": - main() # FIXMES: 1) nullify networkmanager on ubuntu (asking the user first) and enable the networking service permanently diff --git a/console-proxy/conf.dom0/agent.properties.in b/console-proxy/conf.dom0/agent.properties.in index 100f6532af8..9124d6c4de6 100644 --- a/console-proxy/conf.dom0/agent.properties.in +++ b/console-proxy/conf.dom0/agent.properties.in @@ -19,11 +19,9 @@ pod=default zone=default #private.network.device= the private nic device -# if this is commented, it is autodetected on service startup -# private.network.device=cloudbr0 +private.network.device=cloudbr0 #public.network.device= the public nic device -# if this is commented, it is autodetected on service startup -# public.network.device=cloudbr0 +public.network.device=cloudbr0 #guid= a GUID to identify the agent diff --git a/console-proxy/libexec/console-proxy-runner.in b/console-proxy/libexec/console-proxy-runner.in index 8ff9987b795..a95b7200bd7 100755 --- a/console-proxy/libexec/console-proxy-runner.in +++ b/console-proxy/libexec/console-proxy-runner.in @@ -21,21 +21,7 @@ export CLASSPATH set -e cd "@CPLIBDIR@" echo Current directory is "$PWD" -echo CLASSPATH to run the console proxy: "$CLASSPATH" - -export PATH=/sbin:/usr/sbin:"$PATH" -SERVICEARGS= -for x in private public ; do - configuration=`grep -q "^$x.network.device" "@CPSYSCONFDIR@"/agent.properties || true` - if [ -n "$CONFIGURATION" ] ; then - echo "Using manually-configured network device $CONFIGURATION" - else - defaultroute=`ip route | grep ^default | cut -d ' ' -f 5` - test -n "$defaultroute" - echo "Using auto-discovered network device $defaultroute which is the default route" - SERVICEARGS="$SERVICEARGS -D$x.network.device="$defaultroute - fi -done +echo CLASSPATH to run the agent: "$CLASSPATH" function termagent() { if [ "$agentpid" != "" ] ; then @@ -52,7 +38,7 @@ function termagent() { trap termagent TERM while true ; do - java -Xms128M -Xmx384M -cp "$CLASSPATH" $SERVICEARGS "$@" com.cloud.agent.AgentShell & + java -Xms128M -Xmx384M -cp "$CLASSPATH" "$@" com.cloud.agent.AgentShell & agentpid=$! echo "Console Proxy started. PID: $!" >&2 wait $agentpid diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyViewer.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyViewer.java index 754d8f6727e..7966f22f953 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyViewer.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyViewer.java @@ -145,8 +145,7 @@ public class ConsoleProxyViewer implements java.lang.Runnable, RfbViewer, RfbPro if(rfbThread.isAlive()) { dropMe = true; viewerInReuse = true; - if(rfb != null) - rfb.close(); + rfb.close(); try { rfbThread.join(); @@ -159,7 +158,8 @@ public class ConsoleProxyViewer implements java.lang.Runnable, RfbViewer, RfbPro dropMe = false; rfbThread = new Thread(this); - rfbThread.setName("RFB Thread " + rfbThread.getId() + " >" + host + ":" + port); + rfbThread.setName("RFB Thread " + rfbThread.getId() + " >" + host + ":" + + port); rfbThread.start(); tileDirtyEvent = new Object(); diff --git a/core/.classpath b/core/.classpath index d6c04820681..11f8e9d85ff 100644 --- a/core/.classpath +++ b/core/.classpath @@ -17,6 +17,5 @@ - diff --git a/core/src/com/cloud/agent/AgentManager.java b/core/src/com/cloud/agent/AgentManager.java index 08e9a30a4ee..c87c193b2df 100755 --- a/core/src/com/cloud/agent/AgentManager.java +++ b/core/src/com/cloud/agent/AgentManager.java @@ -35,14 +35,14 @@ import com.cloud.host.HostStats; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.Status.Event; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VirtualMachineTemplate; -import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.utils.component.Manager; +import com.cloud.vm.UserVm; import com.cloud.vm.VMInstanceVO; /** diff --git a/core/src/com/cloud/agent/api/BackupSnapshotCommand.java b/core/src/com/cloud/agent/api/BackupSnapshotCommand.java index edf68518eb2..72c24317395 100644 --- a/core/src/com/cloud/agent/api/BackupSnapshotCommand.java +++ b/core/src/com/cloud/agent/api/BackupSnapshotCommand.java @@ -51,14 +51,13 @@ public class BackupSnapshotCommand extends SnapshotCommand { Long accountId, Long volumeId, String snapshotUuid, - String snapshotName, String prevSnapshotUuid, String prevBackupUuid, String firstBackupUuid, boolean isFirstSnapshotOfRootVolume, boolean isVolumeInactive) { - super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, snapshotUuid, snapshotName, dcId, accountId, volumeId); + super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, snapshotUuid, dcId, accountId, volumeId); this.prevSnapshotUuid = prevSnapshotUuid; this.prevBackupUuid = prevBackupUuid; this.firstBackupUuid = firstBackupUuid; diff --git a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java index 13581099af9..d7454fa258a 100644 --- a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java +++ b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java @@ -49,12 +49,11 @@ public class CreatePrivateTemplateFromSnapshotCommand extends SnapshotCommand { Long accountId, Long volumeId, String backedUpSnapshotUuid, - String backedUpSnapshotName, String origTemplateInstallPath, Long newTemplateId, String templateName) { - super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, backedUpSnapshotUuid, backedUpSnapshotName, dcId, accountId, volumeId); + super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, backedUpSnapshotUuid, dcId, accountId, volumeId); this.origTemplateInstallPath = origTemplateInstallPath; this.newTemplateId = newTemplateId; this.templateName = templateName; diff --git a/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java b/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java index 2894c76d2c9..e2874916b6d 100644 --- a/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java +++ b/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java @@ -51,10 +51,9 @@ public class CreateVolumeFromSnapshotCommand extends SnapshotCommand { Long accountId, Long volumeId, String backedUpSnapshotUuid, - String backedUpSnapshotName, String templatePath) { - super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, backedUpSnapshotUuid, backedUpSnapshotName, dcId, accountId, volumeId); + super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, backedUpSnapshotUuid, dcId, accountId, volumeId); this.templatePath = templatePath; } diff --git a/core/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java b/core/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java index 600477bd7ec..1f6cd9624f8 100644 --- a/core/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java +++ b/core/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java @@ -59,10 +59,9 @@ public class DeleteSnapshotBackupCommand extends SnapshotCommand { Long accountId, Long volumeId, String backupUUID, - String backupName, String childUUID) { - super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, backupUUID, backupName, dcId, accountId, volumeId); + super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, backupUUID, dcId, accountId, volumeId); this.childUUID = childUUID; } diff --git a/core/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java b/core/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java index 2073019e61e..6544d6f1a23 100644 --- a/core/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java +++ b/core/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java @@ -57,10 +57,9 @@ public class DeleteSnapshotsDirCommand extends SnapshotCommand { Long dcId, Long accountId, Long volumeId, - String snapshotUUID, - String snapshotName) + String snapshotUUID) { - super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, snapshotUUID, snapshotName, dcId, accountId, volumeId); + super(primaryStoragePoolNameLabel, secondaryStoragePoolURL, snapshotUUID, dcId, accountId, volumeId); } } \ No newline at end of file diff --git a/core/src/com/cloud/agent/api/ManageSnapshotCommand.java b/core/src/com/cloud/agent/api/ManageSnapshotCommand.java index 57497bc478b..d3509c0cabc 100644 --- a/core/src/com/cloud/agent/api/ManageSnapshotCommand.java +++ b/core/src/com/cloud/agent/api/ManageSnapshotCommand.java @@ -33,12 +33,11 @@ public class ManageSnapshotCommand extends Command { // Information about the snapshot private String _snapshotPath = null; private String _snapshotName = null; - private long _snapshotId; - private String _vmName = null; + private long _snapshotId; public ManageSnapshotCommand() {} - public ManageSnapshotCommand(String commandSwitch, long snapshotId, String path, String snapshotName, String vmName) { + public ManageSnapshotCommand(String commandSwitch, long snapshotId, String path, String snapshotName) { _commandSwitch = commandSwitch; if (commandSwitch.equals(ManageSnapshotCommand.CREATE_SNAPSHOT)) { _volumePath = path; @@ -47,8 +46,7 @@ public class ManageSnapshotCommand extends Command { _snapshotPath = path; } _snapshotName = snapshotName; - _snapshotId = snapshotId; - _vmName = vmName; + _snapshotId = snapshotId; } @Override @@ -74,10 +72,6 @@ public class ManageSnapshotCommand extends Command { public long getSnapshotId() { return _snapshotId; - } - - public String getVmName() { - return _vmName; } } \ No newline at end of file diff --git a/core/src/com/cloud/agent/api/SnapshotCommand.java b/core/src/com/cloud/agent/api/SnapshotCommand.java index 72722b06778..e967d0b8eb6 100644 --- a/core/src/com/cloud/agent/api/SnapshotCommand.java +++ b/core/src/com/cloud/agent/api/SnapshotCommand.java @@ -27,7 +27,6 @@ package com.cloud.agent.api; public class SnapshotCommand extends Command { private String primaryStoragePoolNameLabel; private String snapshotUuid; - private String snapshotName; private String secondaryStoragePoolURL; private Long dcId; private Long accountId; @@ -47,7 +46,6 @@ public class SnapshotCommand extends Command { public SnapshotCommand(String primaryStoragePoolNameLabel, String secondaryStoragePoolURL, String snapshotUuid, - String snapshotName, Long dcId, Long accountId, Long volumeId) @@ -58,7 +56,6 @@ public class SnapshotCommand extends Command { this.dcId = dcId; this.accountId = accountId; this.volumeId = volumeId; - this.snapshotName = snapshotName; } /** @@ -75,10 +72,6 @@ public class SnapshotCommand extends Command { return snapshotUuid; } - public String getSnapshotName() { - return snapshotName; - } - /** * @return the secondaryStoragePoolURL */ diff --git a/core/src/com/cloud/agent/api/StartCommand.java b/core/src/com/cloud/agent/api/StartCommand.java index 56747c8f6e6..966cc33e537 100755 --- a/core/src/com/cloud/agent/api/StartCommand.java +++ b/core/src/com/cloud/agent/api/StartCommand.java @@ -20,10 +20,10 @@ package com.cloud.agent.api; import java.util.List; import java.util.Map; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.storage.VolumeVO; -import com.cloud.uservm.UserVm; import com.cloud.vm.DomainRouter; +import com.cloud.vm.UserVm; import com.cloud.vm.UserVmVO; public class StartCommand extends AbstractStartCommand { diff --git a/core/src/com/cloud/agent/api/StopCommand.java b/core/src/com/cloud/agent/api/StopCommand.java index f4e3d24d092..4d8274f778a 100755 --- a/core/src/com/cloud/agent/api/StopCommand.java +++ b/core/src/com/cloud/agent/api/StopCommand.java @@ -17,6 +17,7 @@ */ package com.cloud.agent.api; +import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.VirtualMachine; public class StopCommand extends RebootCommand { @@ -26,7 +27,6 @@ public class StopCommand extends RebootCommand { private String vncPort=null; private String urlPort=null; private String publicConsoleProxyIpAddress=null; - private String privateRouterIpAddress=null; protected StopCommand() { } @@ -42,17 +42,15 @@ public class StopCommand extends RebootCommand { public StopCommand(VirtualMachine vm, String vnet) { super(vm); this.vnet = vnet; + this.mirroredVolumes = vm.isMirroredVols(); } public StopCommand(VirtualMachine vm, String vmName, String vnet) { super(vmName); this.vnet = vnet; - } - - public StopCommand(VirtualMachine vm, String vmName, String vnet, String privateRouterIpAddress) { - super(vmName); - this.vnet = vnet; - this.privateRouterIpAddress = privateRouterIpAddress; + if (vm != null) { + this.mirroredVolumes = vm.isMirroredVols(); + } } public String getVnet() { @@ -87,9 +85,5 @@ public class StopCommand extends RebootCommand { public String getPublicConsoleProxyIpAddress() { return this.publicConsoleProxyIpAddress; } - - public String getPrivateRouterIpAddress() { - return privateRouterIpAddress; - } } diff --git a/core/src/com/cloud/agent/api/WatchNetworkAnswer.java b/core/src/com/cloud/agent/api/WatchNetworkAnswer.java new file mode 100755 index 00000000000..5a6a4d32497 --- /dev/null +++ b/core/src/com/cloud/agent/api/WatchNetworkAnswer.java @@ -0,0 +1,52 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.agent.api; + +import java.util.Collection; +import java.util.HashMap; + +public class WatchNetworkAnswer extends Answer { + HashMap transmitted; + HashMap received; + + protected WatchNetworkAnswer() { + } + + public WatchNetworkAnswer(WatchNetworkCommand cmd) { + super(cmd); + transmitted = new HashMap(); + received = new HashMap(); + } + + public void addStats(String vmName, long txn, long rcvd) { + transmitted.put(vmName, txn); + received.put(vmName, rcvd); + } + + public long[] getStats(String vmName) { + long[] stats = new long[2]; + stats[0] = transmitted.get(vmName); + stats[1] = received.get(vmName); + return stats; + } + + public Collection getAllVms() { + return transmitted.keySet(); + } + +} diff --git a/core/src/com/cloud/agent/api/NetworkUsageCommand.java b/core/src/com/cloud/agent/api/WatchNetworkCommand.java old mode 100644 new mode 100755 similarity index 74% rename from core/src/com/cloud/agent/api/NetworkUsageCommand.java rename to core/src/com/cloud/agent/api/WatchNetworkCommand.java index c9c88279f6d..20cca08eb79 --- a/core/src/com/cloud/agent/api/NetworkUsageCommand.java +++ b/core/src/com/cloud/agent/api/WatchNetworkCommand.java @@ -17,29 +17,22 @@ */ package com.cloud.agent.api; - -public class NetworkUsageCommand extends Command { - private String privateIP; +public class WatchNetworkCommand extends Command implements CronCommand { + int interval; - protected NetworkUsageCommand() { - + protected WatchNetworkCommand() { } - public NetworkUsageCommand(String privateIP) - { - this.privateIP = privateIP; - } - - public String getPrivateIP() { - return privateIP; + public WatchNetworkCommand(int interval) { + this.interval = interval; + } + + public int getInterval() { + return interval; } - /** - * {@inheritDoc} - */ @Override public boolean executeInSequence() { return false; } - -} \ No newline at end of file +} diff --git a/core/src/com/cloud/alert/dao/AlertDaoImpl.java b/core/src/com/cloud/alert/dao/AlertDaoImpl.java index c79c6c48b9c..631abda39aa 100644 --- a/core/src/com/cloud/alert/dao/AlertDaoImpl.java +++ b/core/src/com/cloud/alert/dao/AlertDaoImpl.java @@ -18,10 +18,10 @@ package com.cloud.alert.dao; -import java.util.List; - -import javax.ejb.Local; - +import java.util.List; + +import javax.ejb.Local; + import com.cloud.alert.AlertVO; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; @@ -32,7 +32,7 @@ public class AlertDaoImpl extends GenericDaoBase implements Alert @Override public AlertVO getLastAlert(short type, long dataCenterId, Long podId) { Filter searchFilter = new Filter(AlertVO.class, "createdDate", Boolean.FALSE, Long.valueOf(1), Long.valueOf(1)); - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("type", SearchCriteria.Op.EQ, Short.valueOf(type)); sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, Long.valueOf(dataCenterId)); diff --git a/core/src/com/cloud/async/dao/AsyncJobDaoImpl.java b/core/src/com/cloud/async/dao/AsyncJobDaoImpl.java index 24cacaa8cc3..9534484d271 100644 --- a/core/src/com/cloud/async/dao/AsyncJobDaoImpl.java +++ b/core/src/com/cloud/async/dao/AsyncJobDaoImpl.java @@ -19,12 +19,12 @@ package com.cloud.async.dao; import java.util.Date; -import java.util.List; - -import javax.ejb.Local; - -import org.apache.log4j.Logger; - +import java.util.List; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + import com.cloud.async.AsyncJobResult; import com.cloud.async.AsyncJobVO; import com.cloud.utils.db.Filter; @@ -56,7 +56,7 @@ public class AsyncJobDaoImpl extends GenericDaoBase implements } public AsyncJobVO findInstancePendingAsyncJob(String instanceType, long instanceId) { - SearchCriteria sc = pendingAsyncJobSearch.create(); + SearchCriteria sc = pendingAsyncJobSearch.create(); sc.setParameters("instanceType", instanceType); sc.setParameters("instanceId", instanceId); sc.setParameters("status", AsyncJobResult.STATUS_IN_PROGRESS); @@ -73,7 +73,7 @@ public class AsyncJobDaoImpl extends GenericDaoBase implements } public List getExpiredJobs(Date cutTime, int limit) { - SearchCriteria sc = expiringAsyncJobSearch.create(); + SearchCriteria sc = expiringAsyncJobSearch.create(); sc.setParameters("created", cutTime); Filter filter = new Filter(AsyncJobVO.class, "created", true, 0L, (long)limit); return listBy(sc, filter); diff --git a/core/src/com/cloud/async/dao/SyncQueueDaoImpl.java b/core/src/com/cloud/async/dao/SyncQueueDaoImpl.java index d009866e9e0..760fa384483 100644 --- a/core/src/com/cloud/async/dao/SyncQueueDaoImpl.java +++ b/core/src/com/cloud/async/dao/SyncQueueDaoImpl.java @@ -18,15 +18,15 @@ package com.cloud.async.dao; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.util.Date; -import java.util.TimeZone; - -import javax.ejb.Local; - -import org.apache.log4j.Logger; - +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.Date; +import java.util.TimeZone; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + import com.cloud.async.SyncQueueVO; import com.cloud.utils.DateUtil; import com.cloud.utils.db.GenericDaoBase; @@ -36,9 +36,7 @@ import com.cloud.utils.db.Transaction; @Local(value = { SyncQueueDao.class }) public class SyncQueueDaoImpl extends GenericDaoBase implements SyncQueueDao { - private static final Logger s_logger = Logger.getLogger(SyncQueueDaoImpl.class.getName()); - - SearchBuilder TypeIdSearch = createSearchBuilder(); + private static final Logger s_logger = Logger.getLogger(SyncQueueDaoImpl.class.getName()); @Override public void ensureQueue(String syncObjType, long syncObjId) { @@ -63,17 +61,15 @@ public class SyncQueueDaoImpl extends GenericDaoBase implemen @Override public SyncQueueVO find(String syncObjType, long syncObjId) { - SearchCriteria sc = TypeIdSearch.create(); + + SearchBuilder sb = createSearchBuilder(); + sb.and("syncObjType", sb.entity().getSyncObjType(), SearchCriteria.Op.EQ); + sb.and("syncObjId", sb.entity().getSyncObjId(), SearchCriteria.Op.EQ); + sb.done(); + + SearchCriteria sc = sb.create(); sc.setParameters("syncObjType", syncObjType); sc.setParameters("syncObjId", syncObjId); return findOneActiveBy(sc); - } - - protected SyncQueueDaoImpl() { - super(); - TypeIdSearch = createSearchBuilder(); - TypeIdSearch.and("syncObjType", TypeIdSearch.entity().getSyncObjType(), SearchCriteria.Op.EQ); - TypeIdSearch.and("syncObjId", TypeIdSearch.entity().getSyncObjId(), SearchCriteria.Op.EQ); - TypeIdSearch.done(); } } diff --git a/core/src/com/cloud/async/dao/SyncQueueItemDaoImpl.java b/core/src/com/cloud/async/dao/SyncQueueItemDaoImpl.java index a0b4df70074..752b4e5b1f6 100644 --- a/core/src/com/cloud/async/dao/SyncQueueItemDaoImpl.java +++ b/core/src/com/cloud/async/dao/SyncQueueItemDaoImpl.java @@ -46,10 +46,11 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase SearchBuilder sb = createSearchBuilder(); sb.and("queueId", sb.entity().getQueueId(), SearchCriteria.Op.EQ); - sb.and("lastProcessNumber", sb.entity().getLastProcessNumber(), SearchCriteria.Op.NULL); + sb.and("lastProcessNumber", sb.entity().getLastProcessNumber(), + SearchCriteria.Op.NULL); sb.done(); - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); sc.setParameters("queueId", queueId); Filter filter = new Filter(SyncQueueItemVO.class, "created", true, 0L, 1L); @@ -101,7 +102,7 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase SearchCriteria.Op.EQ); sb.done(); - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); sc.setParameters("lastProcessMsid", msid); Filter filter = new Filter(SyncQueueItemVO.class, "created", true, 0L, 1L); diff --git a/core/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java b/core/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java index 8fb19e21942..cdbf6f3714b 100644 --- a/core/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java +++ b/core/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java @@ -18,15 +18,15 @@ package com.cloud.cluster.dao; -import java.sql.PreparedStatement; -import java.util.Date; -import java.util.List; -import java.util.TimeZone; - -import javax.ejb.Local; - -import org.apache.log4j.Logger; - +import java.sql.PreparedStatement; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + import com.cloud.cluster.ManagementServerHostVO; import com.cloud.utils.DateUtil; import com.cloud.utils.db.GenericDaoBase; @@ -41,7 +41,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase MsIdSearch; public ManagementServerHostVO findByMsid(long msid) { - SearchCriteria sc = MsIdSearch.create(); + SearchCriteria sc = MsIdSearch.create(); sc.setParameters("msid", msid); List l = listBy(sc); @@ -98,7 +98,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase sc = activeSearch.create(); + SearchCriteria sc = activeSearch.create(); sc.setParameters("lastUpdateTime", cutTime); return listBy(sc); diff --git a/core/src/com/cloud/configuration/ResourceCount.java b/core/src/com/cloud/configuration/ResourceCount.java index b9efaf45859..59cd7de5e46 100644 --- a/core/src/com/cloud/configuration/ResourceCount.java +++ b/core/src/com/cloud/configuration/ResourceCount.java @@ -36,13 +36,9 @@ public interface ResourceCount { public void setType(ResourceType type); - public Long getAccountId(); + public long getAccountId(); - public void setAccountId(Long accountId); - - public Long getDomainId(); - - public void setDomainId(Long domainId); + public void setAccountId(long accountId); public long getCount(); diff --git a/core/src/com/cloud/configuration/ResourceCountVO.java b/core/src/com/cloud/configuration/ResourceCountVO.java index 99cc29ac8a3..d5612156601 100644 --- a/core/src/com/cloud/configuration/ResourceCountVO.java +++ b/core/src/com/cloud/configuration/ResourceCountVO.java @@ -27,6 +27,8 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; +import com.cloud.configuration.ResourceCount.ResourceType; + @Entity @Table(name="resource_count") public class ResourceCountVO implements ResourceCount { @@ -41,19 +43,15 @@ public class ResourceCountVO implements ResourceCount { private ResourceCount.ResourceType type; @Column(name="account_id") - private Long accountId; - - @Column(name="domain_id") - private Long domainId; + private long accountId; @Column(name="count") private long count; public ResourceCountVO() {} - public ResourceCountVO(Long accountId, Long domainId, ResourceCount.ResourceType type, long count) { + public ResourceCountVO(long accountId, ResourceCount.ResourceType type, long count) { this.accountId = accountId; - this.domainId = domainId; this.type = type; this.count = count; } @@ -74,22 +72,14 @@ public class ResourceCountVO implements ResourceCount { this.type = type; } - public Long getAccountId() { + public long getAccountId() { return accountId; } - public void setAccountId(Long accountId) { + public void setAccountId(long accountId) { this.accountId = accountId; } - - public Long getDomainId() { - return domainId; - } - - public void setDomainId(Long domainId) { - this.domainId = domainId; - } - + public long getCount() { return count; } @@ -97,4 +87,5 @@ public class ResourceCountVO implements ResourceCount { public void setCount(long count) { this.count = count; } + } diff --git a/core/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java b/core/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java index 54930bcb1dc..83c751a47f0 100644 --- a/core/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java +++ b/core/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java @@ -58,7 +58,7 @@ public class ConfigurationDaoImpl extends GenericDaoBase(); - SearchCriteria sc = InstanceSearch.create(); + SearchCriteria sc = InstanceSearch.create(); sc.setParameters("instance", "DEFAULT"); List configurations = listBy(sc); @@ -124,7 +124,7 @@ public class ConfigurationDaoImpl extends GenericDaoBase sc = NameSearch.create(); + SearchCriteria sc = NameSearch.create(); sc.setParameters("name", name); List configurations = listBy(sc); diff --git a/core/src/com/cloud/configuration/dao/ResourceCountDao.java b/core/src/com/cloud/configuration/dao/ResourceCountDao.java index 6925f5c08b2..99f85d62ba3 100644 --- a/core/src/com/cloud/configuration/dao/ResourceCountDao.java +++ b/core/src/com/cloud/configuration/dao/ResourceCountDao.java @@ -24,37 +24,6 @@ import com.cloud.utils.db.GenericDao; public interface ResourceCountDao extends GenericDao { - /** - * Get the count of in use resources for an account by type - * @param accountId the id of the account to get the resource count - * @param type the type of resource (e.g. user_vm, public_ip, volume) - * @return the count of resources in use for the given type and account - */ - public long getAccountCount(long accountId, ResourceType type); - - /** - * Get the count of in use resources for a domain by type - * @param domainId the id of the domain to get the resource count - * @param type the type of resource (e.g. user_vm, public_ip, volume) - * @return the count of resources in use for the given type and domain - */ - public long getDomainCount(long domainId, ResourceType type); - - /** - * Update the count of resources in use for the given account and given resource type - * @param accountId the id of the account to update resource count - * @param type the type of resource (e.g. user_vm, public_ip, volume) - * @param increment whether the change is adding or subtracting from the current count - * @param delta the number of resources being added/released - */ - public void updateAccountCount(long accountId, ResourceType type, boolean increment, long delta); - - /** - * Update the count of resources in use for the given domain and given resource type - * @param domainId the id of the domain to update resource count - * @param type the type of resource (e.g. user_vm, public_ip, volume) - * @param increment whether the change is adding or subtracting from the current count - * @param delta the number of resources being added/released - */ - public void updateDomainCount(long domainId, ResourceType type, boolean increment, long delta); + public long getCount(long accountId, ResourceType type); + public void updateCount(long accountId, ResourceType type, boolean increment, long delta); } diff --git a/core/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java b/core/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java index e7921449ff2..d20aadbe753 100644 --- a/core/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java +++ b/core/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java @@ -20,88 +20,48 @@ package com.cloud.configuration.dao; import javax.ejb.Local; -import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.ResourceCountVO; +import com.cloud.configuration.ResourceLimitVO; +import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; @Local(value={ResourceCountDao.class}) public class ResourceCountDaoImpl extends GenericDaoBase implements ResourceCountDao { - private SearchBuilder IdTypeSearch; - private SearchBuilder DomainIdTypeSearch; + SearchBuilder IdTypeSearch; + public ResourceCountDaoImpl() { IdTypeSearch = createSearchBuilder(); IdTypeSearch.and("type", IdTypeSearch.entity().getType(), SearchCriteria.Op.EQ); IdTypeSearch.and("accountId", IdTypeSearch.entity().getAccountId(), SearchCriteria.Op.EQ); IdTypeSearch.done(); - - DomainIdTypeSearch = createSearchBuilder(); - DomainIdTypeSearch.and("type", DomainIdTypeSearch.entity().getType(), SearchCriteria.Op.EQ); - DomainIdTypeSearch.and("domainId", DomainIdTypeSearch.entity().getDomainId(), SearchCriteria.Op.EQ); - DomainIdTypeSearch.done(); } - + private ResourceCountVO findByAccountIdAndType(long accountId, ResourceType type) { if (type == null) { return null; } - - SearchCriteria sc = IdTypeSearch.create(); + + SearchCriteria sc = IdTypeSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("type", type); - + return findOneBy(sc); } - - private ResourceCountVO findByDomainIdAndType(long domainId, ResourceType type) { - if (type == null) { - return null; - } - - SearchCriteria sc = DomainIdTypeSearch.create(); - sc.setParameters("domainId", domainId); - sc.setParameters("type", type); - - return findOneBy(sc); - } - - @Override - public long getAccountCount(long accountId, ResourceType type) { + + public long getCount(long accountId, ResourceType type) { ResourceCountVO resourceCountVO = findByAccountIdAndType(accountId, type); return (resourceCountVO != null) ? resourceCountVO.getCount() : 0; } - - @Override - public long getDomainCount(long domainId, ResourceType type) { - ResourceCountVO resourceCountVO = findByDomainIdAndType(domainId, type); - return (resourceCountVO != null) ? resourceCountVO.getCount() : 0; - } - - @Override - public void updateAccountCount(long accountId, ResourceType type, boolean increment, long delta) { - delta = increment ? delta : delta * -1; - - ResourceCountVO resourceCountVO = findByAccountIdAndType(accountId, type); - - if (resourceCountVO == null) { - resourceCountVO = new ResourceCountVO(accountId, null, type, 0); - resourceCountVO.setCount(resourceCountVO.getCount() + delta); - persist(resourceCountVO); - } else { - resourceCountVO.setCount(resourceCountVO.getCount() + delta); - update(resourceCountVO.getId(), resourceCountVO); - } - } - - @Override - public void updateDomainCount(long domainId, ResourceType type, boolean increment, long delta) { + + public void updateCount(long accountId, ResourceType type, boolean increment, long delta) { + ResourceCountVO resourceCountVO = findByAccountIdAndType(accountId, type); delta = increment ? delta : delta * -1; - - ResourceCountVO resourceCountVO = findByDomainIdAndType(domainId, type); + if (resourceCountVO == null) { - resourceCountVO = new ResourceCountVO(null, domainId, type, 0); + resourceCountVO = new ResourceCountVO(accountId, type, 0); resourceCountVO.setCount(resourceCountVO.getCount() + delta); persist(resourceCountVO); } else { @@ -109,4 +69,5 @@ public class ResourceCountDaoImpl extends GenericDaoBase update(resourceCountVO.getId(), resourceCountVO); } } + } \ No newline at end of file diff --git a/core/src/com/cloud/configuration/dao/ResourceLimitDao.java b/core/src/com/cloud/configuration/dao/ResourceLimitDao.java index 6f48d331c65..811c1b26cdd 100644 --- a/core/src/com/cloud/configuration/dao/ResourceLimitDao.java +++ b/core/src/com/cloud/configuration/dao/ResourceLimitDao.java @@ -22,6 +22,7 @@ import java.util.List; import com.cloud.configuration.ResourceCount; import com.cloud.configuration.ResourceLimitVO; +import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.utils.db.GenericDao; public interface ResourceLimitDao extends GenericDao { @@ -32,4 +33,5 @@ public interface ResourceLimitDao extends GenericDao { public List listByDomainId(Long domainId); public boolean update(Long id, Long max); public ResourceCount.ResourceType getLimitType(String type); + } diff --git a/core/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java b/core/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java index d6b4a002f22..c745c4e058c 100644 --- a/core/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java +++ b/core/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java @@ -30,8 +30,9 @@ import com.cloud.utils.db.SearchCriteria; @Local(value={ResourceLimitDao.class}) public class ResourceLimitDaoImpl extends GenericDaoBase implements ResourceLimitDao { - private SearchBuilder IdTypeSearch; + SearchBuilder IdTypeSearch; + public ResourceLimitDaoImpl () { IdTypeSearch = createSearchBuilder(); IdTypeSearch.and("type", IdTypeSearch.entity().getType(), SearchCriteria.Op.EQ); @@ -39,12 +40,12 @@ public class ResourceLimitDaoImpl extends GenericDaoBase IdTypeSearch.and("accountId", IdTypeSearch.entity().getAccountId(), SearchCriteria.Op.EQ); IdTypeSearch.done(); } - + public ResourceLimitVO findByDomainIdAndType(Long domainId, ResourceCount.ResourceType type) { if (domainId == null || type == null) return null; - SearchCriteria sc = IdTypeSearch.create(); + SearchCriteria sc = IdTypeSearch.create(); sc.setParameters("domainId", domainId); sc.setParameters("type", type); @@ -55,7 +56,7 @@ public class ResourceLimitDaoImpl extends GenericDaoBase if (domainId == null) return null; - SearchCriteria sc = IdTypeSearch.create(); + SearchCriteria sc = IdTypeSearch.create(); sc.setParameters("domainId", domainId); return listBy(sc); @@ -65,7 +66,7 @@ public class ResourceLimitDaoImpl extends GenericDaoBase if (accountId == null || type == null) return null; - SearchCriteria sc = IdTypeSearch.create(); + SearchCriteria sc = IdTypeSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("type", type); @@ -76,7 +77,7 @@ public class ResourceLimitDaoImpl extends GenericDaoBase if (accountId == null) return null; - SearchCriteria sc = IdTypeSearch.create(); + SearchCriteria sc = IdTypeSearch.create(); sc.setParameters("accountId", accountId); return listBy(sc); diff --git a/core/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java b/core/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java index a59d622090e..ccbc195f77b 100644 --- a/core/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java +++ b/core/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java @@ -36,21 +36,21 @@ public class AccountVlanMapDaoImpl extends GenericDaoBase listAccountVlanMapsByAccount(long accountId) { - SearchCriteria sc = AccountSearch.create(); + SearchCriteria sc = AccountSearch.create(); sc.setParameters("accountId", accountId); return listBy(sc); } @Override public List listAccountVlanMapsByVlan(long vlanDbId) { - SearchCriteria sc = VlanSearch.create(); + SearchCriteria sc = VlanSearch.create(); sc.setParameters("vlanDbId", vlanDbId); return listBy(sc); } @Override public AccountVlanMapVO findAccountVlanMap(long accountId, long vlanDbId) { - SearchCriteria sc = AccountVlanSearch.create(); + SearchCriteria sc = AccountVlanSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("vlanDbId", vlanDbId); return findOneBy(sc); diff --git a/core/src/com/cloud/dc/dao/ClusterDaoImpl.java b/core/src/com/cloud/dc/dao/ClusterDaoImpl.java index e1d8ffe4b05..aebd29cf3a2 100644 --- a/core/src/com/cloud/dc/dao/ClusterDaoImpl.java +++ b/core/src/com/cloud/dc/dao/ClusterDaoImpl.java @@ -42,7 +42,7 @@ public class ClusterDaoImpl extends GenericDaoBase implements C @Override public List listByPodId(long podId) { - SearchCriteria sc = PodSearch.create(); + SearchCriteria sc = PodSearch.create(); sc.setParameters("pod", podId); return listActiveBy(sc); @@ -50,7 +50,7 @@ public class ClusterDaoImpl extends GenericDaoBase implements C @Override public ClusterVO findBy(String name, long podId) { - SearchCriteria sc = PodSearch.create(); + SearchCriteria sc = PodSearch.create(); sc.setParameters("pod", podId); sc.setParameters("name", name); diff --git a/core/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/core/src/com/cloud/dc/dao/DataCenterDaoImpl.java index a7d4b088ce8..faa9abb161e 100644 --- a/core/src/com/cloud/dc/dao/DataCenterDaoImpl.java +++ b/core/src/com/cloud/dc/dao/DataCenterDaoImpl.java @@ -64,7 +64,7 @@ public class DataCenterDaoImpl extends GenericDaoBase implem @Override public DataCenterVO findByName(String name) { - SearchCriteria sc = NameSearch.create(); + SearchCriteria sc = NameSearch.create(); sc.setParameters("name", name); return findOneActiveBy(sc); } diff --git a/core/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java b/core/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java index 06cb6726af8..4978f2a128f 100755 --- a/core/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java +++ b/core/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java @@ -49,7 +49,7 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase FreePodDcIpSearch; public DataCenterIpAddressVO takeIpAddress(long dcId, long podId, long instanceId) { - SearchCriteria sc = FreeIpSearch.create(); + SearchCriteria sc = FreeIpSearch.create(); sc.setParameters("dc", dcId); sc.setParameters("pod", podId); @@ -86,7 +86,7 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase sc = FreePodDcIpSearch.create(); + SearchCriteria sc = FreePodDcIpSearch.create(); sc.setParameters("podId", podId); sc.setParameters("dcId", dcId); sc.setParameters("ipAddress", ip); @@ -124,7 +124,7 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase sc = IpDcSearch.create(); + SearchCriteria sc = IpDcSearch.create(); sc.setParameters("ip", ipAddress); sc.setParameters("dc", dcId); sc.setParameters("instance", instanceId); @@ -170,14 +170,14 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase listByPodIdDcId(long podId, long dcId) { - SearchCriteria sc = PodDcSearch.create(); + SearchCriteria sc = PodDcSearch.create(); sc.setParameters("podId", podId); sc.setParameters("dataCenterId", dcId); return listBy(sc); } public List listByPodIdDcIdIpAddress(long podId, long dcId, String ipAddress) { - SearchCriteria sc = PodDcIpSearch.create(); + SearchCriteria sc = PodDcIpSearch.create(); sc.setParameters("dcId", dcId); sc.setParameters("podId", podId); sc.setParameters("ipAddress", ipAddress); diff --git a/core/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java b/core/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java index 359cd6d0958..17414e28d58 100644 --- a/core/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java +++ b/core/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java @@ -49,7 +49,7 @@ public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase FreePodDcIpSearch; public DataCenterLinkLocalIpAddressVO takeIpAddress(long dcId, long podId, long instanceId) { - SearchCriteria sc = FreeIpSearch.create(); + SearchCriteria sc = FreeIpSearch.create(); sc.setParameters("dc", dcId); sc.setParameters("pod", podId); @@ -86,7 +86,7 @@ public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase sc = FreePodDcIpSearch.create(); + SearchCriteria sc = FreePodDcIpSearch.create(); sc.setParameters("podId", podId); sc.setParameters("dcId", dcId); sc.setParameters("ipAddress", ip); @@ -124,7 +124,7 @@ public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase sc = IpDcSearch.create(); + SearchCriteria sc = IpDcSearch.create(); sc.setParameters("ip", ipAddress); sc.setParameters("dc", dcId); sc.setParameters("instance", instanceId); @@ -170,14 +170,14 @@ public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase listByPodIdDcId(long podId, long dcId) { - SearchCriteria sc = PodDcSearch.create(); + SearchCriteria sc = PodDcSearch.create(); sc.setParameters("podId", podId); sc.setParameters("dataCenterId", dcId); return listBy(sc); } public List listByPodIdDcIdIpAddress(long podId, long dcId, String ipAddress) { - SearchCriteria sc = PodDcIpSearch.create(); + SearchCriteria sc = PodDcIpSearch.create(); sc.setParameters("dcId", dcId); sc.setParameters("podId", podId); sc.setParameters("ipAddress", ipAddress); diff --git a/core/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/core/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java index e641c6c62a2..abe940f090a 100755 --- a/core/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java +++ b/core/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java @@ -20,9 +20,11 @@ package com.cloud.dc.dao; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Date; +import java.util.Formatter; import java.util.List; import com.cloud.dc.DataCenterVnetVO; +import com.cloud.exception.InternalErrorException; import com.cloud.utils.db.GenericDao; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -41,13 +43,13 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase DcSearchAllocated; public List listAllocatedVnets(long dcId) { - SearchCriteria sc = DcSearchAllocated.create(); + SearchCriteria sc = DcSearchAllocated.create(); sc.setParameters("dc", dcId); return listActiveBy(sc); } public List findVnet(long dcId, String vnet) { - SearchCriteria sc = VnetDcSearch.create();; + SearchCriteria sc = VnetDcSearch.create();; sc.setParameters("dc", dcId); sc.setParameters("vnet", vnet); return listActiveBy(sc); @@ -86,7 +88,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase sc = FreeVnetSearch.create(); + SearchCriteria sc = FreeVnetSearch.create(); sc.setParameters("dc", dcId); Date now = new Date(); Transaction txn = Transaction.currentTxn(); @@ -109,7 +111,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase sc = VnetDcSearchAllocated.create(); + SearchCriteria sc = VnetDcSearchAllocated.create(); sc.setParameters("vnet", vnet); sc.setParameters("dc", dcId); sc.setParameters("account", accountId); diff --git a/core/src/com/cloud/dc/dao/HostPodDaoImpl.java b/core/src/com/cloud/dc/dao/HostPodDaoImpl.java index 03bd0d1e1a9..b12b5a997de 100644 --- a/core/src/com/cloud/dc/dao/HostPodDaoImpl.java +++ b/core/src/com/cloud/dc/dao/HostPodDaoImpl.java @@ -57,14 +57,14 @@ public class HostPodDaoImpl extends GenericDaoBase implements H } public List listByDataCenterId(long id) { - SearchCriteria sc = DataCenterIdSearch.create(); + SearchCriteria sc = DataCenterIdSearch.create(); sc.setParameters("dcId", id); return listActiveBy(sc); } public HostPodVO findByName(String name, long dcId) { - SearchCriteria sc = DataCenterAndNameSearch.create(); + SearchCriteria sc = DataCenterAndNameSearch.create(); sc.setParameters("dc", dcId); sc.setParameters("name", name); diff --git a/core/src/com/cloud/dc/dao/PodVlanDaoImpl.java b/core/src/com/cloud/dc/dao/PodVlanDaoImpl.java index f29e7bd7070..95f1ac84452 100755 --- a/core/src/com/cloud/dc/dao/PodVlanDaoImpl.java +++ b/core/src/com/cloud/dc/dao/PodVlanDaoImpl.java @@ -40,7 +40,7 @@ public class PodVlanDaoImpl extends GenericDaoBase implements G private final SearchBuilder PodSearchAllocated; public List listAllocatedVnets(long podId) { - SearchCriteria sc = PodSearchAllocated.create(); + SearchCriteria sc = PodSearchAllocated.create(); sc.setParameters("podId", podId); return listActiveBy(sc); } @@ -78,7 +78,7 @@ public class PodVlanDaoImpl extends GenericDaoBase implements G } public PodVlanVO take(long podId, long accountId) { - SearchCriteria sc = FreeVlanSearch.create(); + SearchCriteria sc = FreeVlanSearch.create(); sc.setParameters("podId", podId); Date now = new Date(); Transaction txn = Transaction.currentTxn(); @@ -101,7 +101,7 @@ public class PodVlanDaoImpl extends GenericDaoBase implements G } public void release(String vlan, long podId, long accountId) { - SearchCriteria sc = VlanPodSearch.create(); + SearchCriteria sc = VlanPodSearch.create(); sc.setParameters("vlan", vlan); sc.setParameters("podId", podId); sc.setParameters("account", accountId); diff --git a/core/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java b/core/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java index 617a084a64b..4720b599570 100644 --- a/core/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java +++ b/core/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java @@ -36,21 +36,21 @@ public class PodVlanMapDaoImpl extends GenericDaoBase implem @Override public List listPodVlanMapsByPod(long podId) { - SearchCriteria sc = PodSearch.create(); + SearchCriteria sc = PodSearch.create(); sc.setParameters("podId", podId); return listBy(sc); } @Override public List listPodVlanMapsByVlan(long vlanDbId) { - SearchCriteria sc = VlanSearch.create(); + SearchCriteria sc = VlanSearch.create(); sc.setParameters("vlanDbId", vlanDbId); return listBy(sc); } @Override public PodVlanMapVO findPodVlanMap(long podId, long vlanDbId) { - SearchCriteria sc = PodVlanSearch.create(); + SearchCriteria sc = PodVlanSearch.create(); sc.setParameters("podId", podId); sc.setParameters("vlanDbId", vlanDbId); return findOneBy(sc); diff --git a/core/src/com/cloud/dc/dao/VlanDaoImpl.java b/core/src/com/cloud/dc/dao/VlanDaoImpl.java index 76e78b7b6f7..05ce742f826 100644 --- a/core/src/com/cloud/dc/dao/VlanDaoImpl.java +++ b/core/src/com/cloud/dc/dao/VlanDaoImpl.java @@ -25,6 +25,8 @@ import java.util.Map; import javax.ejb.Local; import javax.naming.ConfigurationException; +import org.apache.log4j.Logger; + import com.cloud.dc.AccountVlanMapVO; import com.cloud.dc.PodVlanMapVO; import com.cloud.dc.Vlan; @@ -53,7 +55,7 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao @Override public VlanVO findByZoneAndVlanId(long zoneId, String vlanId) { - SearchCriteria sc = ZoneVlanIdSearch.create(); + SearchCriteria sc = ZoneVlanIdSearch.create(); sc.setParameters("zoneId", zoneId); sc.setParameters("vlanId", vlanId); return findOneActiveBy(sc); @@ -61,7 +63,7 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao @Override public List findByZone(long zoneId) { - SearchCriteria sc = ZoneSearch.create(); + SearchCriteria sc = ZoneSearch.create(); sc.setParameters("zoneId", zoneId); return listBy(sc); } @@ -84,7 +86,7 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao @Override public List listByZoneAndType(long zoneId, VlanType vlanType) { - SearchCriteria sc = ZoneTypeSearch.create(); + SearchCriteria sc = ZoneTypeSearch.create(); sc.setParameters("zoneId", zoneId); sc.setParameters("vlanType", vlanType); return listBy(sc); @@ -226,7 +228,7 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao @Override public boolean zoneHasDirectAttachUntaggedVlans(long zoneId) { - SearchCriteria sc = ZoneTypeAllPodsSearch.create(); + SearchCriteria sc = ZoneTypeAllPodsSearch.create(); sc.setParameters("zoneId", zoneId); sc.setParameters("vlanType", VlanType.DirectAttached); @@ -237,7 +239,7 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao @Override public Pair assignPodDirectAttachIpAddress(long zoneId, long podId, long accountId, long domainId) { - SearchCriteria sc = ZoneTypePodSearch.create(); + SearchCriteria sc = ZoneTypePodSearch.create(); sc.setParameters("zoneId", zoneId); sc.setParameters("vlanType", VlanType.DirectAttached); sc.setJoinParameters("vlan", "podId", podId); diff --git a/core/src/com/cloud/domain/dao/DomainDaoImpl.java b/core/src/com/cloud/domain/dao/DomainDaoImpl.java index dc2633cdd6f..b56eb9cb7f6 100644 --- a/core/src/com/cloud/domain/dao/DomainDaoImpl.java +++ b/core/src/com/cloud/domain/dao/DomainDaoImpl.java @@ -186,7 +186,7 @@ public class DomainDaoImpl extends GenericDaoBase implements Dom @Override public DomainVO findDomainByPath(String domainPath) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("path", SearchCriteria.Op.EQ, domainPath); return findOneActiveBy(sc); } @@ -202,7 +202,7 @@ public class DomainDaoImpl extends GenericDaoBase implements Dom } boolean result = false; - SearchCriteria sc = DomainPairSearch.create(); + SearchCriteria sc = DomainPairSearch.create(); sc.setParameters("id", parentId, childId); List domainPair = listActiveBy(sc); diff --git a/core/src/com/cloud/event/dao/EventDao.java b/core/src/com/cloud/event/dao/EventDao.java index 58390bb58ff..1491aae0658 100644 --- a/core/src/com/cloud/event/dao/EventDao.java +++ b/core/src/com/cloud/event/dao/EventDao.java @@ -19,15 +19,15 @@ package com.cloud.event.dao; import java.util.Date; -import java.util.List; - +import java.util.List; + import com.cloud.event.EventVO; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDao; import com.cloud.utils.db.SearchCriteria; public interface EventDao extends GenericDao { - public List searchAllEvents(SearchCriteria sc, Filter filter); + public List searchAllEvents(SearchCriteria sc, Filter filter); public List listOlderEvents(Date oldTime); diff --git a/core/src/com/cloud/event/dao/EventDaoImpl.java b/core/src/com/cloud/event/dao/EventDaoImpl.java index 45b34d5c3e1..c1d9be149e5 100644 --- a/core/src/com/cloud/event/dao/EventDaoImpl.java +++ b/core/src/com/cloud/event/dao/EventDaoImpl.java @@ -19,14 +19,15 @@ package com.cloud.event.dao; import java.util.Date; -import java.util.List; - -import javax.ejb.Local; - -import org.apache.log4j.Logger; - +import java.util.List; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + import com.cloud.event.EventState; import com.cloud.event.EventVO; +import com.cloud.utils.db.DB; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -52,14 +53,20 @@ public class EventDaoImpl extends GenericDaoBase implements Event } @Override - public List searchAllEvents(SearchCriteria sc, Filter filter) { + @DB + public List searchAllEvents(SearchCriteria sc, Filter filter) { return listBy(sc, filter); } + @Override + public List search(final SearchCriteria sc, final Filter filter) { + return super.search(sc, filter); + } + @Override public List listOlderEvents(Date oldTime) { if (oldTime == null) return null; - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("createDate", SearchCriteria.Op.LT, oldTime); return listBy(sc, null); @@ -68,7 +75,7 @@ public class EventDaoImpl extends GenericDaoBase implements Event @Override public List listStartedEvents(Date minTime, Date maxTime) { if (minTime == null || maxTime == null) return null; - SearchCriteria sc = StartedEventsSearch.create(); + SearchCriteria sc = StartedEventsSearch.create(); sc.setParameters("state", EventState.Completed); sc.setParameters("startId", 0); sc.setParameters("createDate", minTime, maxTime); @@ -77,7 +84,7 @@ public class EventDaoImpl extends GenericDaoBase implements Event @Override public EventVO findCompletedEvent(long startId) { - SearchCriteria sc = CompletedEventSearch.create(); + SearchCriteria sc = CompletedEventSearch.create(); sc.setParameters("state", EventState.Completed); sc.setParameters("startId", startId); return findOneBy(sc); diff --git a/core/src/com/cloud/agent/api/NetworkUsageAnswer.java b/core/src/com/cloud/exception/AgentUnavailableException.java similarity index 53% rename from core/src/com/cloud/agent/api/NetworkUsageAnswer.java rename to core/src/com/cloud/exception/AgentUnavailableException.java index bf4a4d5a7a9..2e6632c58a3 100644 --- a/core/src/com/cloud/agent/api/NetworkUsageAnswer.java +++ b/core/src/com/cloud/exception/AgentUnavailableException.java @@ -15,35 +15,31 @@ * along with this program. If not, see . * */ -package com.cloud.agent.api; +package com.cloud.exception; -public class NetworkUsageAnswer extends Answer { - Long bytesSent; - Long bytesReceived; +import com.cloud.utils.SerialVersionUID; + +/** + * This exception is thrown when the agent is unavailable to accept an + * command. + * + */ +public class AgentUnavailableException extends Exception { - protected NetworkUsageAnswer() { + private static final long serialVersionUID = SerialVersionUID.AgentUnavailableException; + + long _agentId; + + public AgentUnavailableException(String msg, long agentId) { + super("Host " + agentId + ": " + msg); + _agentId = agentId; } - public NetworkUsageAnswer(NetworkUsageCommand cmd, String details, Long bytesSent, Long bytesReceived) { - super(cmd, true, details); - this.bytesReceived = bytesReceived; - this.bytesSent = bytesSent; + public AgentUnavailableException(long agentId) { + this("Unable to reach host.", agentId); } - - public void setBytesReceived(Long bytesReceived) { - this.bytesReceived = bytesReceived; - } - - public Long getBytesReceived() { - return bytesReceived; - } - - public void setBytesSent(Long bytesSent) { - this.bytesSent = bytesSent; - } - - public Long getBytesSent() { - return bytesSent; + public long getAgentId() { + return _agentId; } } diff --git a/core/src/com/cloud/exception/ConcurrentOperationException.java b/core/src/com/cloud/exception/ConcurrentOperationException.java new file mode 100644 index 00000000000..43b85014443 --- /dev/null +++ b/core/src/com/cloud/exception/ConcurrentOperationException.java @@ -0,0 +1,29 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.exception; + +import com.cloud.utils.SerialVersionUID; + +public class ConcurrentOperationException extends Exception { + + private static final long serialVersionUID = SerialVersionUID.ConcurrentOperationException; + + public ConcurrentOperationException(String msg) { + super(msg); + } +} diff --git a/core/src/com/cloud/exception/DiscoveryException.java b/core/src/com/cloud/exception/DiscoveryException.java new file mode 100644 index 00000000000..c6481d828e4 --- /dev/null +++ b/core/src/com/cloud/exception/DiscoveryException.java @@ -0,0 +1,33 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.exception; + +import com.cloud.utils.SerialVersionUID; + +public class DiscoveryException extends Exception { + + private static final long serialVersionUID = SerialVersionUID.DiscoveryException; + + public DiscoveryException(String msg) { + this(msg, null); + } + + public DiscoveryException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/core/src/com/cloud/exception/HAStateException.java b/core/src/com/cloud/exception/HAStateException.java new file mode 100644 index 00000000000..3b1bf24ec99 --- /dev/null +++ b/core/src/com/cloud/exception/HAStateException.java @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.exception; + +import com.cloud.utils.SerialVersionUID; + +/** + * This exception is thrown when a machine is in HA State and a operation, + * such as start or stop, is attempted on it. Machines that are in HA + * states need to be properly cleaned up before anything special can be + * done with it. Hence this special state. + */ +public class HAStateException extends ManagementServerException { + + private static final long serialVersionUID = SerialVersionUID.HAStateException; + + public HAStateException(String msg) { + super(msg); + } +} diff --git a/server/src/com/cloud/api/Parameter.java b/core/src/com/cloud/exception/InsufficientAddressCapacityException.java similarity index 63% rename from server/src/com/cloud/api/Parameter.java rename to core/src/com/cloud/exception/InsufficientAddressCapacityException.java index a1fe480f641..1cca265f1ec 100644 --- a/server/src/com/cloud/api/Parameter.java +++ b/core/src/com/cloud/exception/InsufficientAddressCapacityException.java @@ -16,22 +16,23 @@ * */ -package com.cloud.api; +package com.cloud.exception; -import static java.lang.annotation.ElementType.FIELD; +import com.cloud.utils.SerialVersionUID; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +/** + * Exception thrown when the end there's not enough ip addresses in the system. + */ +public class InsufficientAddressCapacityException extends InsufficientCapacityException { -import com.cloud.api.BaseCmd.CommandType; + private static final long serialVersionUID = SerialVersionUID.InsufficientAddressCapacityException; + + public InsufficientAddressCapacityException(String msg) { + super(msg); + } + + protected InsufficientAddressCapacityException() { + super(); + } -@Retention(RetentionPolicy.RUNTIME) -@Target({FIELD}) -public @interface Parameter { - String name() default ""; - boolean required() default false; - CommandType type() default CommandType.OBJECT; - CommandType collectionType() default CommandType.OBJECT; } - diff --git a/core/src/com/cloud/exception/InsufficientCapacityException.java b/core/src/com/cloud/exception/InsufficientCapacityException.java new file mode 100755 index 00000000000..233306b6000 --- /dev/null +++ b/core/src/com/cloud/exception/InsufficientCapacityException.java @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.exception; + +import com.cloud.utils.SerialVersionUID; + +/** + * Generic parent exception class for capacity being reached. + * + */ +public abstract class InsufficientCapacityException extends Exception { + private static final long serialVersionUID = SerialVersionUID.InsufficientCapacityException; + + protected InsufficientCapacityException() { + } + + public InsufficientCapacityException(String msg) { + super(msg); + } +} diff --git a/core/src/com/cloud/exception/InsufficientVirtualNetworkCapcityException.java b/core/src/com/cloud/exception/InsufficientVirtualNetworkCapcityException.java new file mode 100644 index 00000000000..ded4f9fd966 --- /dev/null +++ b/core/src/com/cloud/exception/InsufficientVirtualNetworkCapcityException.java @@ -0,0 +1,28 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.exception; + +import com.cloud.utils.SerialVersionUID; + +public class InsufficientVirtualNetworkCapcityException extends InsufficientCapacityException { + private static final long serialVersionUID = SerialVersionUID.InsufficientCapacityException; + + public InsufficientVirtualNetworkCapcityException(String msg) { + super(msg); + } +} diff --git a/utils/src/com/cloud/utils/db/DataStore.java b/core/src/com/cloud/exception/InternalErrorException.java similarity index 74% rename from utils/src/com/cloud/utils/db/DataStore.java rename to core/src/com/cloud/exception/InternalErrorException.java index 071322f35fd..9acc31ded00 100644 --- a/utils/src/com/cloud/utils/db/DataStore.java +++ b/core/src/com/cloud/exception/InternalErrorException.java @@ -1,7 +1,7 @@ /** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. * - * This software is licensed under the GNU General Public License v3 or later. + * This software is licensed under the GNU General Public License v3 or later. * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,13 +15,18 @@ * along with this program. If not, see . * */ -package com.cloud.utils.db; -import java.util.HashMap; -import java.util.Map; +package com.cloud.exception; + +public class InternalErrorException extends ManagementServerException { + + + private static final long serialVersionUID = -3070582946175427902L; + + public InternalErrorException(String message) { + super(message); + } + + -public class DataStore { - - private final static Map, GenericDao> s_daos = new HashMap, GenericDao>(101); - } diff --git a/core/src/com/cloud/exception/InvalidParameterValueException.java b/core/src/com/cloud/exception/InvalidParameterValueException.java new file mode 100644 index 00000000000..e6b2dcd2a4a --- /dev/null +++ b/core/src/com/cloud/exception/InvalidParameterValueException.java @@ -0,0 +1,34 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.exception; + +/** + * @author chiradeep + * + */ +public class InvalidParameterValueException extends ManagementServerException { + + private static final long serialVersionUID = -2232066904895010203L; + + public InvalidParameterValueException(String message) { + super(message); + + } + +} diff --git a/core/src/com/cloud/exception/ManagementServerException.java b/core/src/com/cloud/exception/ManagementServerException.java new file mode 100644 index 00000000000..41ba73d138a --- /dev/null +++ b/core/src/com/cloud/exception/ManagementServerException.java @@ -0,0 +1,44 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.exception; + +import com.cloud.utils.SerialVersionUID; + +/** + * @author chiradeep + * + */ +public class ManagementServerException extends Exception { + + + private static final long serialVersionUID = SerialVersionUID.ManagementServerException; + + + public ManagementServerException() { + + } + + + public ManagementServerException(String message) { + super(message); + } + + + + +} diff --git a/utils/src/com/cloud/utils/db/DaoSearch.java b/core/src/com/cloud/exception/NetworkRuleConflictException.java similarity index 73% rename from utils/src/com/cloud/utils/db/DaoSearch.java rename to core/src/com/cloud/exception/NetworkRuleConflictException.java index bfe1536cdf3..fe8781b4487 100644 --- a/utils/src/com/cloud/utils/db/DaoSearch.java +++ b/core/src/com/cloud/exception/NetworkRuleConflictException.java @@ -1,7 +1,7 @@ /** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. * - * This software is licensed under the GNU General Public License v3 or later. + * This software is licensed under the GNU General Public License v3 or later. * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,7 +15,16 @@ * along with this program. If not, see . * */ -package com.cloud.utils.db; -public interface DaoSearch { +package com.cloud.exception; + +public class NetworkRuleConflictException extends + ManagementServerException { + + private static final long serialVersionUID = -294905017911859479L; + + public NetworkRuleConflictException(String message) { + super(message); + } + } diff --git a/core/src/com/cloud/exception/PermissionDeniedException.java b/core/src/com/cloud/exception/PermissionDeniedException.java new file mode 100644 index 00000000000..25f02f57fc0 --- /dev/null +++ b/core/src/com/cloud/exception/PermissionDeniedException.java @@ -0,0 +1,33 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.exception; + +/** + * @author chiradeep + * + */ +public class PermissionDeniedException extends ManagementServerException { + + private static final long serialVersionUID = -4631412831814398074L; + + public PermissionDeniedException(String message) { + super(message); + // TODO Auto-generated constructor stub + } + +} diff --git a/core/src/com/cloud/exception/ResourceAllocationException.java b/core/src/com/cloud/exception/ResourceAllocationException.java new file mode 100644 index 00000000000..be0c2bb7c72 --- /dev/null +++ b/core/src/com/cloud/exception/ResourceAllocationException.java @@ -0,0 +1,38 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.exception; + +public class ResourceAllocationException extends ManagementServerException { + + private static final long serialVersionUID = -2232066904895010203L; + private String resourceType; + + public ResourceAllocationException(String message) { + super(message); + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getResourceType() { + return this.resourceType; + } + +} diff --git a/core/src/com/cloud/exception/ResourceInUseException.java b/core/src/com/cloud/exception/ResourceInUseException.java new file mode 100644 index 00000000000..d622b4cc924 --- /dev/null +++ b/core/src/com/cloud/exception/ResourceInUseException.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.exception; + +/** + * @author chiradeep + * + */ +public class ResourceInUseException extends ManagementServerException { + + private static final long serialVersionUID = 1383416910411639324L; + private String resourceType; + private String resourceName; + + public ResourceInUseException(String message) { + super(message); + } + + public ResourceInUseException(String message, String resourceType, + String resourceName) { + super(message); + this.resourceType = resourceType; + this.resourceName = resourceName; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getResourceType() { + return this.resourceType; + } + + public void setResourceName(String resourceName) { + this.resourceName = resourceName; + } + + public String getResourceName() { + return resourceName; + } +} diff --git a/core/src/com/cloud/exception/StorageUnavailableException.java b/core/src/com/cloud/exception/StorageUnavailableException.java new file mode 100644 index 00000000000..d6ed0265d88 --- /dev/null +++ b/core/src/com/cloud/exception/StorageUnavailableException.java @@ -0,0 +1,37 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.exception; + +import com.cloud.utils.SerialVersionUID; + +/** + * This exception is thrown when the storage device can not be reached. + * + */ +public class StorageUnavailableException extends AgentUnavailableException { + + private static final long serialVersionUID = SerialVersionUID.StorageUnavailableException; + + public StorageUnavailableException(long hostId) { + super(hostId); + } + + public StorageUnavailableException(String msg) { + super(msg, -1); + } +} diff --git a/core/src/com/cloud/exception/UnableToExecuteException.java b/core/src/com/cloud/exception/UnableToExecuteException.java new file mode 100755 index 00000000000..0bba6b0dd5e --- /dev/null +++ b/core/src/com/cloud/exception/UnableToExecuteException.java @@ -0,0 +1,55 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.exception; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import com.cloud.utils.SerialVersionUID; + +public class UnableToExecuteException extends Exception { + private static final long serialVersionUID = SerialVersionUID.UnableToExecuteException; + + Command _cmd; + Answer _answer; + + public UnableToExecuteException(Command cmd, String msg) { + this(cmd, msg, null); + } + + public UnableToExecuteException(Command cmd, String msg, Throwable cause) { + this(cmd, null, msg, cause); + } + + public UnableToExecuteException(Command cmd, Answer answer, String msg, Throwable cause) { + super(msg, cause); + _cmd = cmd; + _answer = answer; + } + + public Command getCommand() { + return _cmd; + } + + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Msg: ").append(getMessage()).append("; "); + builder.append("Cmd: ").append(_cmd.toString()).append("; "); + builder.append("Ans: ").append(_answer != null ? _answer.toString() : "").append("; "); + return builder.toString(); + } +} diff --git a/core/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java b/core/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java index 9d5e5c85773..ec4492aeb2a 100644 --- a/core/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java +++ b/core/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java @@ -89,7 +89,7 @@ public class HighAvailabilityDaoImpl extends GenericDaoBase implem public WorkVO take(final long serverId) { final Transaction txn = Transaction.currentTxn(); try { - final SearchCriteria sc = TBASearch.create(); + final SearchCriteria sc = TBASearch.create(); sc.setParameters("time", System.currentTimeMillis() >> 10); final Filter filter = new Filter(WorkVO.class, null, true, 0l, 1l); @@ -118,14 +118,14 @@ public class HighAvailabilityDaoImpl extends GenericDaoBase implem @Override public List findPreviousHA(final long instanceId) { - final SearchCriteria sc = PreviousInstanceSearch.create(); + final SearchCriteria sc = PreviousInstanceSearch.create(); sc.setParameters("instance", instanceId); return listBy(sc); } @Override public void cleanup(final long time) { - final SearchCriteria sc = CleanupSearch.create(); + final SearchCriteria sc = CleanupSearch.create(); sc.setParameters("time", time); sc.setParameters("step", HighAvailabilityManager.Step.Done, HighAvailabilityManager.Step.Cancelled); delete(sc); @@ -133,7 +133,7 @@ public class HighAvailabilityDaoImpl extends GenericDaoBase implem @Override public void deleteMigrationWorkItems(final long hostId, final WorkType type, final long serverId) { - final SearchCriteria sc = UntakenMigrationSearch.create(); + final SearchCriteria sc = UntakenMigrationSearch.create(); sc.setParameters("host", hostId); sc.setParameters("type", type.toString()); @@ -148,7 +148,7 @@ public class HighAvailabilityDaoImpl extends GenericDaoBase implem @Override public List findTakenWorkItems(WorkType type) { - SearchCriteria sc = TakenWorkSearch.create(); + SearchCriteria sc = TakenWorkSearch.create(); sc.setParameters("type", type); sc.setParameters("step", Step.Done, Step.Cancelled, Step.Error); @@ -158,7 +158,7 @@ public class HighAvailabilityDaoImpl extends GenericDaoBase implem @Override public boolean delete(long instanceId, WorkType type) { - SearchCriteria sc = PreviousWorkSearch.create(); + SearchCriteria sc = PreviousWorkSearch.create(); sc.setParameters("instance", instanceId); sc.setParameters("type", type); return delete(sc) > 0; @@ -166,7 +166,7 @@ public class HighAvailabilityDaoImpl extends GenericDaoBase implem @Override public boolean hasBeenScheduled(long instanceId, WorkType type) { - SearchCriteria sc = PreviousWorkSearch.create(); + SearchCriteria sc = PreviousWorkSearch.create(); sc.setParameters("instance", instanceId); sc.setParameters("type", type); return listActiveBy(sc, null).size() > 0; diff --git a/core/src/com/cloud/host/HostVO.java b/core/src/com/cloud/host/HostVO.java index c6c05672bac..c26f998e0fe 100644 --- a/core/src/com/cloud/host/HostVO.java +++ b/core/src/com/cloud/host/HostVO.java @@ -315,6 +315,9 @@ public class HostVO implements Host { @Column(name="version") private String version; + @Column(name="sequence") + private long sequence; + @Column(name=GenericDao.CREATED_COLUMN) private Date created; @@ -326,6 +329,7 @@ public class HostVO implements Host { this.status = Status.Up; this.totalMemory = 0; this.dom0MinMemory = 0; + this.sequence = 1; } protected HostVO() { @@ -421,6 +425,10 @@ public class HostVO implements Host { this.storageUrl = url; } + public long getSequence() { + return sequence; + } + public void setPodId(Long podId) { this.podId = podId; diff --git a/core/src/com/cloud/host/Status.java b/core/src/com/cloud/host/Status.java index 5adf487445e..30274622d27 100644 --- a/core/src/com/cloud/host/Status.java +++ b/core/src/com/cloud/host/Status.java @@ -167,7 +167,6 @@ public enum Status { s_fsm.addTransition(Status.Disconnected, Event.Ping, Status.Up); s_fsm.addTransition(Status.Disconnected, Event.ManagementServerDown, Status.Disconnected); s_fsm.addTransition(Status.Disconnected, Event.WaitedTooLong, Status.Alert); - s_fsm.addTransition(Status.Disconnected, Event.Remove, Status.Removed); s_fsm.addTransition(Status.Down, Event.MaintenanceRequested, Status.PrepareForMaintenance); s_fsm.addTransition(Status.Down, Event.AgentConnected, Status.Connecting); s_fsm.addTransition(Status.Down, Event.Remove, Status.Removed); diff --git a/core/src/com/cloud/host/VmHostVO.java b/core/src/com/cloud/host/VmHostVO.java new file mode 100755 index 00000000000..c70562fae7b --- /dev/null +++ b/core/src/com/cloud/host/VmHostVO.java @@ -0,0 +1,85 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.host; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "op_vm_host") +public class VmHostVO { + @Id + @Column(name = "id", updatable = false, nullable = false) + long id; + + @Column(name = "vnc_ports", nullable = false) + long vncPorts; + + @Column(name = "start_at", nullable = false) + int startAt; + + public VmHostVO(long id, long vncPorts, int startAt) { + super(); + this.id = id; + this.vncPorts = vncPorts; + this.startAt = startAt; + } + + protected VmHostVO() { + } + + public VmHostVO(long id, int[] vncPorts) { + this.id = id; + + for (int port : vncPorts) { + this.vncPorts = markPortUsed(this.vncPorts, port); + } + } + + public long getVncPorts() { + return vncPorts; + } + + public void setVncPorts(long vncPorts) { + this.vncPorts = vncPorts; + } + + public int getStartAt() { + return startAt; + } + + public void setStartAt(int startAt) { + this.startAt = startAt; + } + + public long getId() { + return id; + } + + public static long markPortAvailable(long ports, int port) { + assert (port < 63) : "Only supports 63 ports"; + return ports & ~(1l << port); + } + + public static long markPortUsed(long ports, int port) { + assert (port < 63) : "Only supports 63 ports"; + return ports | (1l << port); + } +} diff --git a/core/src/com/cloud/host/dao/DetailsDaoImpl.java b/core/src/com/cloud/host/dao/DetailsDaoImpl.java index 6bd554b683d..d624d1d9d3d 100644 --- a/core/src/com/cloud/host/dao/DetailsDaoImpl.java +++ b/core/src/com/cloud/host/dao/DetailsDaoImpl.java @@ -47,7 +47,7 @@ public class DetailsDaoImpl extends GenericDaoBase implements De @Override public DetailVO findDetail(long hostId, String name) { - SearchCriteria sc = DetailSearch.create(); + SearchCriteria sc = DetailSearch.create(); sc.setParameters("hostId", hostId); sc.setParameters("name", name); @@ -56,7 +56,7 @@ public class DetailsDaoImpl extends GenericDaoBase implements De @Override public Map findDetails(long hostId) { - SearchCriteria sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("hostId", hostId); List results = search(sc, null); @@ -71,7 +71,7 @@ public class DetailsDaoImpl extends GenericDaoBase implements De public void persist(long hostId, Map details) { Transaction txn = Transaction.currentTxn(); txn.start(); - SearchCriteria sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("hostId", hostId); delete(sc); diff --git a/core/src/com/cloud/host/dao/HostDaoImpl.java b/core/src/com/cloud/host/dao/HostDaoImpl.java index a58178f9c36..9368812718f 100644 --- a/core/src/com/cloud/host/dao/HostDaoImpl.java +++ b/core/src/com/cloud/host/dao/HostDaoImpl.java @@ -14,14 +14,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - */ -package com.cloud.host.dao; - + */ +package com.cloud.host.dao; + import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TimeZone; @@ -44,144 +45,145 @@ import com.cloud.utils.db.Attribute; import com.cloud.utils.db.DB; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.db.UpdateBuilder; import com.cloud.utils.db.SearchCriteria.Func; -import com.cloud.utils.exception.CloudRuntimeException; - + @Local(value = { HostDao.class }) @DB(txn=false) -@TableGenerator(name="host_req_sq", table="op_host", pkColumnName="id", valueColumnName="sequence", allocationSize=1) -public class HostDaoImpl extends GenericDaoBase implements HostDao { +@TableGenerator(name="host_req_sq", table="host", pkColumnName="id", valueColumnName="sequence", allocationSize=1) +public class HostDaoImpl extends GenericDaoBase implements HostDao { private static final Logger s_logger = Logger.getLogger(HostDaoImpl.class); - - protected final SearchBuilder TypePodDcStatusSearch; - - protected final SearchBuilder IdStatusSearch; - protected final SearchBuilder TypeDcSearch; - protected final SearchBuilder TypeDcStatusSearch; - protected final SearchBuilder LastPingedSearch; - protected final SearchBuilder LastPingedSearch2; - protected final SearchBuilder MsStatusSearch; - protected final SearchBuilder DcPrivateIpAddressSearch; - protected final SearchBuilder DcStorageIpAddressSearch; - - protected final SearchBuilder GuidSearch; - protected final SearchBuilder DcSearch; - protected final SearchBuilder PodSearch; - protected final SearchBuilder TypeSearch; - protected final SearchBuilder StatusSearch; - protected final SearchBuilder NameLikeSearch; - protected final SearchBuilder SequenceSearch; + protected final VmHostDaoImpl _vmHostDao; + + protected final SearchBuilder TypePodDcStatusSearch; + + protected final SearchBuilder IdStatusSearch; + protected final SearchBuilder TypeDcSearch; + protected final SearchBuilder TypeDcStatusSearch; + protected final SearchBuilder LastPingedSearch; + protected final SearchBuilder LastPingedSearch2; + protected final SearchBuilder MsStatusSearch; + protected final SearchBuilder DcPrivateIpAddressSearch; + protected final SearchBuilder DcStorageIpAddressSearch; + + protected final SearchBuilder GuidSearch; + protected final SearchBuilder DcSearch; + protected final SearchBuilder PodSearch; + protected final SearchBuilder TypeSearch; + protected final SearchBuilder StatusSearch; + protected final SearchBuilder NameLikeSearch; + protected final SearchBuilder SequenceSearch; protected final SearchBuilder DirectlyConnectedSearch; protected final SearchBuilder UnmanagedDirectConnectSearch; - protected final GenericSearchBuilder MaintenanceCountSearch; + protected final SearchBuilder MaintenanceCountSearch; protected final SearchBuilder ClusterSearch; - - protected final Attribute _statusAttr; - protected final Attribute _msIdAttr; - protected final Attribute _pingTimeAttr; - - protected final DetailsDaoImpl _detailsDao = ComponentLocator.inject(DetailsDaoImpl.class); - - public HostDaoImpl() { - MaintenanceCountSearch = createSearchBuilder(Long.class); + protected final Attribute _statusAttr; + protected final Attribute _msIdAttr; + protected final Attribute _pingTimeAttr; + protected final Attribute _sequenceAttr; + + protected final DetailsDaoImpl _detailsDao = ComponentLocator.inject(DetailsDaoImpl.class); + + public HostDaoImpl() { + _vmHostDao = ComponentLocator.inject(VmHostDaoImpl.class); + + MaintenanceCountSearch = createSearchBuilder(); MaintenanceCountSearch.and("pod", MaintenanceCountSearch.entity().getPodId(), SearchCriteria.Op.EQ); - MaintenanceCountSearch.select(null, Func.COUNT, null); + MaintenanceCountSearch.select(Func.COUNT); MaintenanceCountSearch.and("status", MaintenanceCountSearch.entity().getStatus(), SearchCriteria.Op.IN); MaintenanceCountSearch.done(); - - TypePodDcStatusSearch = createSearchBuilder(); - HostVO entity = TypePodDcStatusSearch.entity(); - TypePodDcStatusSearch.and("type", entity.getType(), SearchCriteria.Op.EQ); - TypePodDcStatusSearch.and("pod", entity.getPodId(), SearchCriteria.Op.EQ); + + TypePodDcStatusSearch = createSearchBuilder(); + HostVO entity = TypePodDcStatusSearch.entity(); + TypePodDcStatusSearch.and("type", entity.getType(), SearchCriteria.Op.EQ); + TypePodDcStatusSearch.and("pod", entity.getPodId(), SearchCriteria.Op.EQ); TypePodDcStatusSearch.and("dc", entity.getDataCenterId(), SearchCriteria.Op.EQ); - TypePodDcStatusSearch.and("cluster", entity.getClusterId(), SearchCriteria.Op.EQ); - TypePodDcStatusSearch.and("status", entity.getStatus(), SearchCriteria.Op.EQ); - TypePodDcStatusSearch.done(); - - LastPingedSearch = createSearchBuilder(); - LastPingedSearch.and("ping", LastPingedSearch.entity().getLastPinged(), SearchCriteria.Op.LT); - LastPingedSearch.and("state", LastPingedSearch.entity().getStatus(), SearchCriteria.Op.IN); - LastPingedSearch.done(); - - LastPingedSearch2 = createSearchBuilder(); - LastPingedSearch2.and("ping", LastPingedSearch2.entity().getLastPinged(), SearchCriteria.Op.LT); - LastPingedSearch2.and("type", LastPingedSearch2.entity().getType(), SearchCriteria.Op.EQ); - LastPingedSearch2.done(); - - MsStatusSearch = createSearchBuilder(); - MsStatusSearch.and("ms", MsStatusSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ); - MsStatusSearch.and("statuses", MsStatusSearch.entity().getStatus(), SearchCriteria.Op.IN); - MsStatusSearch.done(); - - TypeDcSearch = createSearchBuilder(); - TypeDcSearch.and("type", TypeDcSearch.entity().getType(), SearchCriteria.Op.EQ); - TypeDcSearch.and("dc", TypeDcSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); - TypeDcSearch.done(); - - TypeDcStatusSearch = createSearchBuilder(); - TypeDcStatusSearch.and("type", TypeDcStatusSearch.entity().getType(), SearchCriteria.Op.EQ); - TypeDcStatusSearch.and("dc", TypeDcStatusSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); - TypeDcStatusSearch.and("status", TypeDcStatusSearch.entity().getStatus(), SearchCriteria.Op.EQ); - TypeDcStatusSearch.done(); - - IdStatusSearch = createSearchBuilder(); - IdStatusSearch.and("id", IdStatusSearch.entity().getId(), SearchCriteria.Op.EQ); - IdStatusSearch.and("states", IdStatusSearch.entity().getStatus(), SearchCriteria.Op.IN); - IdStatusSearch.done(); - - DcPrivateIpAddressSearch = createSearchBuilder(); - DcPrivateIpAddressSearch.and("privateIpAddress", DcPrivateIpAddressSearch.entity().getPrivateIpAddress(), SearchCriteria.Op.EQ); - DcPrivateIpAddressSearch.and("dc", DcPrivateIpAddressSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); - DcPrivateIpAddressSearch.done(); - - DcStorageIpAddressSearch = createSearchBuilder(); - DcStorageIpAddressSearch.and("storageIpAddress", DcStorageIpAddressSearch.entity().getStorageIpAddress(), SearchCriteria.Op.EQ); - DcStorageIpAddressSearch.and("dc", DcStorageIpAddressSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); - DcStorageIpAddressSearch.done(); - - GuidSearch = createSearchBuilder(); - GuidSearch.and("guid", GuidSearch.entity().getGuid(), SearchCriteria.Op.EQ); - GuidSearch.done(); - - DcSearch = createSearchBuilder(); - DcSearch.and("dc", DcSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); + TypePodDcStatusSearch.and("cluster", entity.getClusterId(), SearchCriteria.Op.EQ); + TypePodDcStatusSearch.and("status", entity.getStatus(), SearchCriteria.Op.EQ); + TypePodDcStatusSearch.done(); + + LastPingedSearch = createSearchBuilder(); + LastPingedSearch.and("ping", LastPingedSearch.entity().getLastPinged(), SearchCriteria.Op.LT); + LastPingedSearch.and("state", LastPingedSearch.entity().getStatus(), SearchCriteria.Op.IN); + LastPingedSearch.done(); + + LastPingedSearch2 = createSearchBuilder(); + LastPingedSearch2.and("ping", LastPingedSearch2.entity().getLastPinged(), SearchCriteria.Op.LT); + LastPingedSearch2.and("type", LastPingedSearch2.entity().getType(), SearchCriteria.Op.EQ); + LastPingedSearch2.done(); + + MsStatusSearch = createSearchBuilder(); + MsStatusSearch.and("ms", MsStatusSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ); + MsStatusSearch.and("statuses", MsStatusSearch.entity().getStatus(), SearchCriteria.Op.IN); + MsStatusSearch.done(); + + TypeDcSearch = createSearchBuilder(); + TypeDcSearch.and("type", TypeDcSearch.entity().getType(), SearchCriteria.Op.EQ); + TypeDcSearch.and("dc", TypeDcSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); + TypeDcSearch.done(); + + TypeDcStatusSearch = createSearchBuilder(); + TypeDcStatusSearch.and("type", TypeDcStatusSearch.entity().getType(), SearchCriteria.Op.EQ); + TypeDcStatusSearch.and("dc", TypeDcStatusSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); + TypeDcStatusSearch.and("status", TypeDcStatusSearch.entity().getStatus(), SearchCriteria.Op.EQ); + TypeDcStatusSearch.done(); + + IdStatusSearch = createSearchBuilder(); + IdStatusSearch.and("id", IdStatusSearch.entity().getId(), SearchCriteria.Op.EQ); + IdStatusSearch.and("states", IdStatusSearch.entity().getStatus(), SearchCriteria.Op.IN); + IdStatusSearch.done(); + + DcPrivateIpAddressSearch = createSearchBuilder(); + DcPrivateIpAddressSearch.and("privateIpAddress", DcPrivateIpAddressSearch.entity().getPrivateIpAddress(), SearchCriteria.Op.EQ); + DcPrivateIpAddressSearch.and("dc", DcPrivateIpAddressSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); + DcPrivateIpAddressSearch.done(); + + DcStorageIpAddressSearch = createSearchBuilder(); + DcStorageIpAddressSearch.and("storageIpAddress", DcStorageIpAddressSearch.entity().getStorageIpAddress(), SearchCriteria.Op.EQ); + DcStorageIpAddressSearch.and("dc", DcStorageIpAddressSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); + DcStorageIpAddressSearch.done(); + + GuidSearch = createSearchBuilder(); + GuidSearch.and("guid", GuidSearch.entity().getGuid(), SearchCriteria.Op.EQ); + GuidSearch.done(); + + DcSearch = createSearchBuilder(); + DcSearch.and("dc", DcSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); DcSearch.done(); ClusterSearch = createSearchBuilder(); ClusterSearch.and("cluster", ClusterSearch.entity().getClusterId(), SearchCriteria.Op.EQ); - ClusterSearch.done(); - - PodSearch = createSearchBuilder(); - PodSearch.and("pod", PodSearch.entity().getPodId(), SearchCriteria.Op.EQ); - PodSearch.done(); - - TypeSearch = createSearchBuilder(); - TypeSearch.and("type", TypeSearch.entity().getType(), SearchCriteria.Op.EQ); - TypeSearch.done(); - - StatusSearch =createSearchBuilder(); - StatusSearch.and("status", StatusSearch.entity().getStatus(), SearchCriteria.Op.IN); - StatusSearch.done(); - - NameLikeSearch = createSearchBuilder(); - NameLikeSearch.and("name", NameLikeSearch.entity().getName(), SearchCriteria.Op.LIKE); - NameLikeSearch.done(); - - SequenceSearch = createSearchBuilder(); - SequenceSearch.and("id", SequenceSearch.entity().getId(), SearchCriteria.Op.EQ); -// SequenceSearch.addRetrieve("sequence", SequenceSearch.entity().getSequence()); - SequenceSearch.done(); - - DirectlyConnectedSearch = createSearchBuilder(); - DirectlyConnectedSearch.and("resource", DirectlyConnectedSearch.entity().getResource(), SearchCriteria.Op.NNULL); + ClusterSearch.done(); + + PodSearch = createSearchBuilder(); + PodSearch.and("pod", PodSearch.entity().getPodId(), SearchCriteria.Op.EQ); + PodSearch.done(); + + TypeSearch = createSearchBuilder(); + TypeSearch.and("type", TypeSearch.entity().getType(), SearchCriteria.Op.EQ); + TypeSearch.done(); + + StatusSearch =createSearchBuilder(); + StatusSearch.and("status", StatusSearch.entity().getStatus(), SearchCriteria.Op.IN); + StatusSearch.done(); + + NameLikeSearch = createSearchBuilder(); + NameLikeSearch.and("name", NameLikeSearch.entity().getName(), SearchCriteria.Op.LIKE); + NameLikeSearch.done(); + + SequenceSearch = createSearchBuilder(); + SequenceSearch.and("id", SequenceSearch.entity().getId(), SearchCriteria.Op.EQ); +// SequenceSearch.addRetrieve("sequence", SequenceSearch.entity().getSequence()); + SequenceSearch.done(); + + DirectlyConnectedSearch = createSearchBuilder(); + DirectlyConnectedSearch.and("resource", DirectlyConnectedSearch.entity().getResource(), SearchCriteria.Op.NNULL); DirectlyConnectedSearch.done(); - UnmanagedDirectConnectSearch = createSearchBuilder(); + UnmanagedDirectConnectSearch = createSearchBuilder(); UnmanagedDirectConnectSearch.and("resource", UnmanagedDirectConnectSearch.entity().getResource(), SearchCriteria.Op.NNULL); UnmanagedDirectConnectSearch.and("server", UnmanagedDirectConnectSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL); /* @@ -191,404 +193,402 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao UnmanagedDirectConnectSearch.cp(); */ UnmanagedDirectConnectSearch.done(); - - _statusAttr = _allAttributes.get("status"); - _msIdAttr = _allAttributes.get("managementServerId"); - _pingTimeAttr = _allAttributes.get("lastPinged"); - - assert (_statusAttr != null && _msIdAttr != null && _pingTimeAttr != null) : "Couldn't find one of these attributes"; + + _statusAttr = _allAttributes.get("status"); + _msIdAttr = _allAttributes.get("managementServerId"); + _pingTimeAttr = _allAttributes.get("lastPinged"); + _sequenceAttr = _allAttributes.get("sequence"); + + assert (_statusAttr != null && _msIdAttr != null && _pingTimeAttr != null && _sequenceAttr != null) : "Couldn't find one of these attributes"; } @Override public long countBy(long podId, Status... statuses) { - SearchCriteria sc = MaintenanceCountSearch.create(); + SearchCriteria sc = MaintenanceCountSearch.create(); sc.setParameters("status", (Object[])statuses); sc.setParameters("pod", podId); - List rs = searchAll(sc, null); + List rs = searchAll(sc, null); if (rs.size() == 0) { return 0; } - return rs.get(0); - } - - @Override - public HostVO findSecondaryStorageHost(long dcId) { - SearchCriteria sc = TypeDcSearch.create(); - sc.setParameters("type", Host.Type.SecondaryStorage); - sc.setParameters("dc", dcId); - List storageHosts = listActiveBy(sc); - - if (storageHosts == null || storageHosts.size() != 1) { - return null; - } else { - return storageHosts.get(0); - } - } - - @Override - public List listSecondaryStorageHosts() { - SearchCriteria sc = TypeSearch.create(); - sc.setParameters("type", Host.Type.SecondaryStorage); - List secondaryStorageHosts = listBy(sc); - - return secondaryStorageHosts; - } - - @Override - public List findDirectlyConnectedHosts() { - SearchCriteria sc = DirectlyConnectedSearch.create(); - return search(sc, null); - } - - @Override - public List findDirectAgentToLoad(long msid, long lastPingSecondsAfter, Long limit) { - SearchCriteria sc = UnmanagedDirectConnectSearch.create(); + return (Long)(rs.get(0)[0]); + } + + @Override + public HostVO findSecondaryStorageHost(long dcId) { + SearchCriteria sc = TypeDcSearch.create(); + sc.setParameters("type", Host.Type.SecondaryStorage); + sc.setParameters("dc", dcId); + List storageHosts = listActiveBy(sc); + + if (storageHosts == null || storageHosts.size() != 1) { + return null; + } else { + return storageHosts.get(0); + } + } + + @Override + public List listSecondaryStorageHosts() { + SearchCriteria sc = TypeSearch.create(); + sc.setParameters("type", Host.Type.SecondaryStorage); + List secondaryStorageHosts = listBy(sc); + + return secondaryStorageHosts; + } + + @Override + public List findDirectlyConnectedHosts() { + SearchCriteria sc = DirectlyConnectedSearch.create(); + return search(sc, null); + } + + @Override + public List findDirectAgentToLoad(long msid, long lastPingSecondsAfter, Long limit) { + SearchCriteria sc = UnmanagedDirectConnectSearch.create(); // sc.setParameters("lastPinged", lastPingSecondsAfter); //sc.setParameters("managementServerId", msid); - - return search(sc, new Filter(HostVO.class, "id", true, 0L, limit)); - } - - @Override - public void markHostsAsDisconnected(long msId, Status... states) { - SearchCriteria sc = MsStatusSearch.create(); - sc.setParameters("ms", msId); - sc.setParameters("statuses", (Object[])states); - - HostVO host = createForUpdate(); - host.setManagementServerId(null); - host.setDisconnectedOn(new Date()); - - UpdateBuilder ub = getUpdateBuilder(host); - ub.set(host, "status", Status.Disconnected); - - update(ub, sc, null); - } - - @Override - public List listBy(Host.Type type, Long clusterId, Long podId, long dcId) { - SearchCriteria sc = TypePodDcStatusSearch.create(); + + return search(sc, new Filter(HostVO.class, "id", true, 0L, limit)); + } + + @Override + public void markHostsAsDisconnected(long msId, Status... states) { + SearchCriteria sc = MsStatusSearch.create(); + sc.setParameters("ms", msId); + sc.setParameters("statuses", (Object[])states); + + HostVO host = createForUpdate(); + host.setManagementServerId(null); + host.setDisconnectedOn(new Date()); + + UpdateBuilder ub = getUpdateBuilder(host); + ub.set(host, "status", Status.Disconnected); + + update(ub, sc, null); + } + + @Override + public List listBy(Host.Type type, Long clusterId, Long podId, long dcId) { + SearchCriteria sc = TypePodDcStatusSearch.create(); sc.setParameters("type", type.toString()); - if (podId != null) { + if (podId != null) { sc.setParameters("pod", podId); } if (clusterId != null) { sc.setParameters("cluster", clusterId); - } - sc.setParameters("dc", dcId); - sc.setParameters("status", Status.Up.toString()); - - return listActiveBy(sc); + } + sc.setParameters("dc", dcId); + sc.setParameters("status", Status.Up.toString()); + + return listActiveBy(sc); } @Override public List listByCluster(long clusterId) { - SearchCriteria sc = ClusterSearch.create(); + SearchCriteria sc = ClusterSearch.create(); sc.setParameters("cluster", clusterId); return listActiveBy(sc); - } - - @Override - public List listBy(Host.Type type, long dcId) { - SearchCriteria sc = TypeDcStatusSearch.create(); - sc.setParameters("type", type.toString()); - sc.setParameters("dc", dcId); - sc.setParameters("status", Status.Up.toString()); - - return listActiveBy(sc); - } - - @Override - public HostVO findByPrivateIpAddressInDataCenter(long dcId, String privateIpAddress) { - SearchCriteria sc = DcPrivateIpAddressSearch.create(); - sc.setParameters("dc", dcId); - sc.setParameters("privateIpAddress", privateIpAddress); - - return findOneActiveBy(sc); - } - - @Override - public HostVO findByStorageIpAddressInDataCenter(long dcId, String privateIpAddress) { - SearchCriteria sc = DcStorageIpAddressSearch.create(); - sc.setParameters("dc", dcId); - sc.setParameters("storageIpAddress", privateIpAddress); - - return findOneActiveBy(sc); - } - - @Override - public void loadDetails(HostVO host) { - Map details =_detailsDao.findDetails(host.getId()); - host.setDetails(details); - } - - @Override - public boolean updateStatus(HostVO host, Event event, long msId) { - Status oldStatus = host.getStatus(); - long oldPingTime = host.getLastPinged(); - Status newStatus = oldStatus.getNextStatus(event); + } + + @Override + public List listBy(Host.Type type, long dcId) { + SearchCriteria sc = TypeDcStatusSearch.create(); + sc.setParameters("type", type.toString()); + sc.setParameters("dc", dcId); + sc.setParameters("status", Status.Up.toString()); + + return listActiveBy(sc); + } + + @Override + public HostVO findByPrivateIpAddressInDataCenter(long dcId, String privateIpAddress) { + SearchCriteria sc = DcPrivateIpAddressSearch.create(); + sc.setParameters("dc", dcId); + sc.setParameters("privateIpAddress", privateIpAddress); + + return findOneActiveBy(sc); + } + + @Override + public HostVO findByStorageIpAddressInDataCenter(long dcId, String privateIpAddress) { + SearchCriteria sc = DcStorageIpAddressSearch.create(); + sc.setParameters("dc", dcId); + sc.setParameters("storageIpAddress", privateIpAddress); + + return findOneActiveBy(sc); + } + + @Override + public void loadDetails(HostVO host) { + Map details =_detailsDao.findDetails(host.getId()); + host.setDetails(details); + } + + @Override + public boolean updateStatus(HostVO host, Event event, long msId) { + Status oldStatus = host.getStatus(); + long oldPingTime = host.getLastPinged(); + Status newStatus = oldStatus.getNextStatus(event); if ( host == null ) { return false; } - - if (newStatus == null) { - return false; - } + + if (newStatus == null) { + return false; + } SearchBuilder sb = createSearchBuilder(); sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); if (newStatus.checkManagementServer()) { sb.and("ping", sb.entity().getLastPinged(), SearchCriteria.Op.EQ); - sb.and().op("nullmsid", sb.entity().getManagementServerId(), SearchCriteria.Op.NULL); + sb.op(SearchCriteria.Op.AND, "nullmsid", sb.entity().getManagementServerId(), SearchCriteria.Op.NULL); sb.or("msid", sb.entity().getManagementServerId(), SearchCriteria.Op.EQ); sb.closeParen(); } sb.done(); - - SearchCriteria sc = sb.create(); - - sc.setParameters("status", oldStatus); - sc.setParameters("id", host.getId()); - if (newStatus.checkManagementServer()) { + + SearchCriteria sc = sb.create(); + + sc.setParameters("status", oldStatus); + sc.setParameters("id", host.getId()); + if (newStatus.checkManagementServer()) { sc.setParameters("ping", oldPingTime); - sc.setParameters("msid", msId); - } - - UpdateBuilder ub = getUpdateBuilder(host); - ub.set(host, _statusAttr, newStatus); + sc.setParameters("msid", msId); + } + + UpdateBuilder ub = getUpdateBuilder(host); + ub.set(host, _statusAttr, newStatus); if (newStatus.updateManagementServer()) { if (newStatus.lostConnection()) { ub.set(host, _msIdAttr, null); - } else { + } else { ub.set(host, _msIdAttr, msId); } - if( event.equals(Event.Ping) || event.equals(Event.AgentConnected)) { + if( event.equals(Event.Ping) || event.equals(Event.AgentConnected)) { ub.set(host, _pingTimeAttr, System.currentTimeMillis() >> 10); - } - } - - int result = update(ub, sc, null); - assert result <= 1 : "How can this update " + result + " rows? "; - - if (s_logger.isDebugEnabled() && result == 0) { - HostVO vo = findById(host.getId()); - assert vo != null : "How how how? : " + host.getId(); - - StringBuilder str = new StringBuilder("Unable to update host for event:").append(event.toString()); - str.append(". New=[status=").append(newStatus.toString()).append(":msid=").append(newStatus.lostConnection() ? "null" : msId).append(":lastpinged=").append(host.getLastPinged()).append("]"); - str.append("; Old=[status=").append(oldStatus.toString()).append(":msid=").append(msId).append(":lastpinged=").append(oldPingTime).append("]"); - str.append("; DB=[status=").append(vo.getStatus().toString()).append(":msid=").append(vo.getManagementServerId()).append(":lastpinged=").append(vo.getLastPinged()).append("]"); - s_logger.debug(str.toString()); - } - return result > 0; - } - - @Override - public boolean disconnect(HostVO host, Event event, long msId) { - host.setDisconnectedOn(new Date()); + } + } + + int result = update(ub, sc, null); + assert result <= 1 : "How can this update " + result + " rows? "; + + if (s_logger.isDebugEnabled() && result == 0) { + HostVO vo = findById(host.getId()); + assert vo != null : "How how how? : " + host.getId(); + + StringBuilder str = new StringBuilder("Unable to update host for event:").append(event.toString()); + str.append(". New=[status=").append(newStatus.toString()).append(":msid=").append(newStatus.lostConnection() ? "null" : msId).append(":lastpinged=").append(host.getLastPinged()).append("]"); + str.append("; Old=[status=").append(oldStatus.toString()).append(":msid=").append(msId).append(":lastpinged=").append(oldPingTime).append("]"); + str.append("; DB=[status=").append(vo.getStatus().toString()).append(":msid=").append(vo.getManagementServerId()).append(":lastpinged=").append(vo.getLastPinged()).append("]"); + s_logger.debug(str.toString()); + } + return result > 0; + } + + @Override + public boolean disconnect(HostVO host, Event event, long msId) { + host.setDisconnectedOn(new Date()); if(event!=null && event.equals(Event.Remove)) { host.setGuid(null); host.setClusterId(null); - } - return updateStatus(host, event, msId); - } - - @Override @DB - public boolean connect(HostVO host, long msId) { - Transaction txn = Transaction.currentTxn(); - long id = host.getId(); - txn.start(); - - if (!updateStatus(host, Event.AgentConnected, msId)) { - return false; - } - - txn.commit(); - return true; - } - - @Override - public HostVO findByGuid(String guid) { - SearchCriteria sc = GuidSearch.create("guid", guid); - return findOneActiveBy(sc); - } - - @Override - public List findLostHosts(long timeout) { - SearchCriteria sc = LastPingedSearch.create(); - sc.setParameters("ping", timeout); - sc.setParameters("state", Status.Up.toString(), Status.Updating.toString(), - Status.Disconnected.toString(), Status.Down.toString()); - return listActiveBy(sc); - } - - public List findHostsLike(String hostName) { - SearchCriteria sc = NameLikeSearch.create(); - sc.setParameters("name", "%" + hostName + "%"); - return listActiveBy(sc); - } - - @Override - public List findLostHosts2(long timeout, Type type) { - SearchCriteria sc = LastPingedSearch2.create(); - sc.setParameters("ping", timeout); - sc.setParameters("type", type.toString()); - return listActiveBy(sc); - } - - @Override - public List listByDataCenter(long dcId) { - SearchCriteria sc = DcSearch.create("dc", dcId); - return listActiveBy(sc); - } - - public List listByHostPod(long podId) { - SearchCriteria sc = PodSearch.create("pod", podId); - return listActiveBy(sc); - } - - @Override - public List listByStatus(Status... status) { - SearchCriteria sc = StatusSearch.create(); - sc.setParameters("status", (Object[])status); - return listActiveBy(sc); - } - - @Override - public List listByTypeDataCenter(Type type, long dcId) { - SearchCriteria sc = TypeDcSearch.create(); - sc.setParameters("type", type.toString()); - sc.setParameters("dc", dcId); - - return listActiveBy(sc); - } - - @Override - public List listByType(Type type, boolean routingCapable) { - SearchCriteria sc = TypeSearch.create(); - sc.setParameters("type", type.toString()); - - if (routingCapable) { - sc.addAnd("routing_capbable", SearchCriteria.Op.EQ, Integer.valueOf(1)); - } - - return listBy(sc); - } - - protected void saveDetails(HostVO host) { - Map details = host.getDetails(); - if (details == null) { - return; - } - _detailsDao.persist(host.getId(), details); - } - - @Override - public boolean configure(String name, Map params) throws ConfigurationException { - if (!super.configure(name, params)) { - return false; - } - - return true; - } - - @Override @DB - public HostVO persist(HostVO host) { - final String InsertSequenceSql = "INSERT INTO op_host(id) VALUES(?)"; - - Transaction txn = Transaction.currentTxn(); - txn.start(); - - HostVO dbHost = super.persist(host); + } + return updateStatus(host, event, msId); + } + + @Override @DB + public boolean connect(HostVO host, long msId) { + Transaction txn = Transaction.currentTxn(); + long id = host.getId(); + txn.start(); - try { - PreparedStatement pstmt = txn.prepareAutoCloseStatement(InsertSequenceSql); - pstmt.setLong(1, dbHost.getId()); - pstmt.executeUpdate(); - } catch (SQLException e) { - throw new CloudRuntimeException("Unable to persist the sequence number for this host"); + if (!updateStatus(host, Event.AgentConnected, msId)) { + return false; + } + + txn.commit(); + return true; + } + + @Override + public HostVO findByGuid(String guid) { + SearchCriteria sc = GuidSearch.create("guid", guid); + return findOneActiveBy(sc); + } + + @Override + public List findLostHosts(long timeout) { + SearchCriteria sc = LastPingedSearch.create(); + sc.setParameters("ping", timeout); + sc.setParameters("state", Status.Up.toString(), Status.Updating.toString(), + Status.Disconnected.toString(), Status.Down.toString()); + return listActiveBy(sc); + } + + public List findHostsLike(String hostName) { + SearchCriteria sc = NameLikeSearch.create(); + sc.setParameters("name", "%" + hostName + "%"); + return listActiveBy(sc); + } + + @Override + public List findLostHosts2(long timeout, Type type) { + SearchCriteria sc = LastPingedSearch2.create(); + sc.setParameters("ping", timeout); + sc.setParameters("type", type.toString()); + return listActiveBy(sc); + } + + @Override + public List listByDataCenter(long dcId) { + SearchCriteria sc = DcSearch.create("dc", dcId); + return listActiveBy(sc); + } + + public List listByHostPod(long podId) { + SearchCriteria sc = PodSearch.create("pod", podId); + return listActiveBy(sc); + } + + @Override + public List listByStatus(Status... status) { + SearchCriteria sc = StatusSearch.create(); + sc.setParameters("status", (Object[])status); + return listActiveBy(sc); + } + + @Override + public List listByTypeDataCenter(Type type, long dcId) { + SearchCriteria sc = TypeDcSearch.create(); + sc.setParameters("type", type.toString()); + sc.setParameters("dc", dcId); + + return listActiveBy(sc); + } + + @Override + public List listByType(Type type, boolean routingCapable) { + SearchCriteria sc = TypeSearch.create(); + sc.setParameters("type", type.toString()); + + if (routingCapable) { + sc.addAnd("routing_capbable", SearchCriteria.Op.EQ, Integer.valueOf(1)); + } + + return listBy(sc); + } + + protected void saveDetails(HostVO host) { + Map details = host.getDetails(); + if (details == null) { + return; + } + _detailsDao.persist(host.getId(), details); + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + if (!super.configure(name, params)) { + return false; + } + + if (!_vmHostDao.configure("VM Host Operations Table", new HashMap())) { + return false; + } + + return true; + } + + @Override @DB + public HostVO persist(HostVO host) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + + HostVO dbHost = super.persist(host); + saveDetails(host); + loadDetails(dbHost); + + txn.commit(); + + return dbHost; + } + + @Override @DB + public boolean update(Long hostId, HostVO host) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + + boolean persisted = super.update(hostId, host); + if (!persisted) { + return persisted; } saveDetails(host); - loadDetails(dbHost); - - txn.commit(); - - return dbHost; + + txn.commit(); + + return persisted; } - - @Override @DB - public boolean update(Long hostId, HostVO host) { - Transaction txn = Transaction.currentTxn(); - txn.start(); - - boolean persisted = super.update(hostId, host); - if (!persisted) { - return persisted; - } - - saveDetails(host); - - txn.commit(); - - return persisted; - } - - @Override @DB - public List getRunningHostCounts(Date cutTime) { - String sql = "select * from (" + - "select h.data_center_id, h.type, count(*) as count from host as h INNER JOIN mshost as m ON h.mgmt_server_id=m.msid " + - "where h.status='Up' and h.type='SecondaryStorage' and m.last_update > ? " + - "group by h.data_center_id, h.type " + - "UNION ALL " + - "select h.data_center_id, h.type, count(*) as count from host as h INNER JOIN mshost as m ON h.mgmt_server_id=m.msid " + - "where h.status='Up' and h.type='Routing' and m.last_update > ? " + - "group by h.data_center_id, h.type) as t " + - "ORDER by t.data_center_id, t.type"; - + + @Override @DB + public List getRunningHostCounts(Date cutTime) { + String sql = "select * from (select h.data_center_id, h.type, count(*) as count from host as h INNER JOIN mshost as m ON h.mgmt_server_id=m.msid " + + "where h.status='Up' and h.type='Computing' and m.last_update > ? " + + "group by h.data_center_id, h.type " + + "UNION ALL " + + "select h.data_center_id, h.type, count(*) as count from host as h INNER JOIN mshost as m ON h.mgmt_server_id=m.msid " + + "where h.status='Up' and h.type='SecondaryStorage' and m.last_update > ? " + + "group by h.data_center_id, h.type " + + "UNION ALL " + + "select h.data_center_id, h.type, count(*) as count from host as h INNER JOIN mshost as m ON h.mgmt_server_id=m.msid " + + "where h.status='Up' and h.type='Routing' and m.last_update > ? " + + "group by h.data_center_id, h.type) as t " + + "ORDER by t.data_center_id, t.type"; + ArrayList l = new ArrayList(); - Transaction txn = Transaction.currentTxn();; - PreparedStatement pstmt = null; - try { + Transaction txn = Transaction.currentTxn();; + PreparedStatement pstmt = null; + try { pstmt = txn.prepareAutoCloseStatement(sql); String gmtCutTime = DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), cutTime); pstmt.setString(1, gmtCutTime); pstmt.setString(2, gmtCutTime); - - ResultSet rs = pstmt.executeQuery(); - while(rs.next()) { - RunningHostCountInfo info = new RunningHostCountInfo(); - info.setDcId(rs.getLong(1)); - info.setHostType(rs.getString(2)); - info.setCount(rs.getInt(3)); - - l.add(info); - } - } catch (SQLException e) { - } catch (Throwable e) { - } - return l; - } - + pstmt.setString(3, gmtCutTime); + + ResultSet rs = pstmt.executeQuery(); + while(rs.next()) { + RunningHostCountInfo info = new RunningHostCountInfo(); + info.setDcId(rs.getLong(1)); + info.setHostType(rs.getString(2)); + info.setCount(rs.getInt(3)); + + l.add(info); + } + } catch (SQLException e) { + } catch (Throwable e) { + } + return l; + } + @Override - public long getNextSequence(long hostId) { - if (s_logger.isTraceEnabled()) { - s_logger.trace("getNextSequence(), hostId: " + hostId); + public long getNextSequence(long hostId) { + if (s_logger.isTraceEnabled()) { + s_logger.trace("getNextSequence(), hostId: " + hostId); } TableGenerator tg = _tgs.get("host_req_sq"); assert tg != null : "how can this be wrong!"; return s_seqFetcher.getNextSequence(Long.class, tg, hostId); - } -} - - - + } +} + + + diff --git a/core/src/com/cloud/host/dao/VmHostDao.java b/core/src/com/cloud/host/dao/VmHostDao.java new file mode 100755 index 00000000000..186d251df0e --- /dev/null +++ b/core/src/com/cloud/host/dao/VmHostDao.java @@ -0,0 +1,45 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.host.dao; + +import com.cloud.host.VmHostVO; +import com.cloud.utils.db.GenericDao; + +/** + * @author ahuang + * + */ +public interface VmHostDao extends GenericDao { + /** + * @return the next available vnc port; + */ + public Integer getAvailableVncPort(long hostId); + + /** + * @param hostId host to return the vncport to. + * @param vncPort vnc port to return. + */ + public void freeVncPort(long hostId, int vncPort); + + /** + * Set the vnc port. + * @param hostId + * @param vncPort + */ + public void setVncPort(long hostId, int vncPort); +} diff --git a/core/src/com/cloud/host/dao/VmHostDaoImpl.java b/core/src/com/cloud/host/dao/VmHostDaoImpl.java new file mode 100755 index 00000000000..e3ec73c2d6f --- /dev/null +++ b/core/src/com/cloud/host/dao/VmHostDaoImpl.java @@ -0,0 +1,101 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.host.dao; + +import com.cloud.host.VmHostVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.Transaction; + +public class VmHostDaoImpl extends GenericDaoBase implements VmHostDao { + + @Override + public void freeVncPort(long hostId, int vncPort) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + + VmHostVO vo = lock(hostId, true); + if (vo == null) { + txn.commit(); + return; + } + + vo.setVncPorts(VmHostVO.markPortAvailable(vo.getVncPorts(), vncPort)); + vo.setStartAt(vncPort % 63); + + update(hostId, vo); + + txn.commit(); + } + + @Override + public void setVncPort(long hostId, int vncPort) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + + VmHostVO vo = lock(hostId, true); + if (vo == null) { + txn.commit(); + return; + } + + vo.setVncPorts(VmHostVO.markPortUsed(vo.getVncPorts(), vncPort)); + vo.setStartAt((vncPort + 1) % 63); + + update(hostId, vo); + + txn.commit(); + } + + @Override + public Integer getAvailableVncPort(long hostId) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + VmHostVO vo = lock(hostId, true); + if (vo == null) { + txn.commit(); + return null; + } + + Integer port = findAvailablePort(vo); + if (port == null) { + txn.commit(); + return null; + } + + vo.setVncPorts(VmHostVO.markPortUsed(vo.getVncPorts(), port)); + vo.setStartAt((port + 1) % 63); + + update(hostId, vo); + txn.commit(); + + return port; + } + + protected Integer findAvailablePort(VmHostVO vo) { + long ports = vo.getVncPorts(); + int start = vo.getStartAt(); + for (int i = 0; i < 63; i++) { + int port = (i + start) % 63; + if ((ports & (0x01l << port)) == 0) { + return port; + } + } + return null; + } + +} diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 06ad2291007..67335e7af8d 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -39,6 +39,7 @@ import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import javax.ejb.Local; import javax.naming.ConfigurationException; @@ -68,6 +69,8 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.CreatePrivateTemplateFromSnapshotCommand; import com.cloud.agent.api.CreateVolumeFromSnapshotAnswer; import com.cloud.agent.api.CreateVolumeFromSnapshotCommand; +import com.cloud.agent.api.CreateZoneVlanAnswer; +import com.cloud.agent.api.CreateZoneVlanCommand; import com.cloud.agent.api.DeleteSnapshotBackupAnswer; import com.cloud.agent.api.DeleteSnapshotBackupCommand; import com.cloud.agent.api.DeleteSnapshotsDirCommand; @@ -90,6 +93,8 @@ import com.cloud.agent.api.MigrateCommand; import com.cloud.agent.api.ModifySshKeysCommand; import com.cloud.agent.api.ModifyStoragePoolAnswer; import com.cloud.agent.api.ModifyStoragePoolCommand; +import com.cloud.agent.api.NetworkIngressRuleAnswer; +import com.cloud.agent.api.NetworkIngressRulesCmd; import com.cloud.agent.api.PingCommand; import com.cloud.agent.api.PingRoutingCommand; import com.cloud.agent.api.PingRoutingWithNwGroupsCommand; @@ -121,6 +126,8 @@ import com.cloud.agent.api.StoragePoolInfo; import com.cloud.agent.api.ValidateSnapshotAnswer; import com.cloud.agent.api.ValidateSnapshotCommand; import com.cloud.agent.api.VmStatsEntry; +import com.cloud.agent.api.WatchNetworkAnswer; +import com.cloud.agent.api.WatchNetworkCommand; import com.cloud.agent.api.proxy.CheckConsoleProxyLoadCommand; import com.cloud.agent.api.proxy.ConsoleProxyLoadAnswer; import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand; @@ -150,6 +157,7 @@ import com.cloud.hypervisor.Hypervisor; import com.cloud.resource.ServerResource; import com.cloud.storage.StorageLayer; import com.cloud.storage.StoragePoolVO; +import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; @@ -171,6 +179,7 @@ import com.cloud.vm.State; import com.cloud.vm.VirtualMachineName; import com.trilead.ssh2.SCPClient; import com.xensource.xenapi.APIVersion; +import com.xensource.xenapi.Bond; import com.xensource.xenapi.Connection; import com.xensource.xenapi.Console; import com.xensource.xenapi.Host; @@ -191,6 +200,7 @@ import com.xensource.xenapi.VM; import com.xensource.xenapi.VMGuestMetrics; import com.xensource.xenapi.XenAPIObject; import com.xensource.xenapi.Types.BadServerResponse; +import com.xensource.xenapi.Types.IpConfigurationMode; import com.xensource.xenapi.Types.VmPowerState; import com.xensource.xenapi.Types.XenAPIException; @@ -202,10 +212,12 @@ import com.xensource.xenapi.Types.XenAPIException; public abstract class CitrixResourceBase implements StoragePoolResource, ServerResource { private static final Logger s_logger = Logger.getLogger(CitrixResourceBase.class); protected static final XenServerConnectionPool _connPool = XenServerConnectionPool.getInstance(); + protected static final String SR_MOUNT_BASE = "/var/run/sr-mount/"; protected static final int MB = 1024 * 1024; protected String _name; protected String _username; protected String _password; + protected String _scriptsDir = "scripts/vm/storage/xenserver"; protected final int _retry = 24; protected final int _sleep = 10000; protected long _dcId; @@ -221,6 +233,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected String _guestNetworkName; protected int _wait; protected IAgentControl _agentControl; + protected Map _domrIPMap = new ConcurrentHashMap(); protected final XenServerHost _host = new XenServerHost(); @@ -257,70 +270,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_statesTable.put(Types.VmPowerState.UNKNOWN, State.Unknown); s_statesTable.put(Types.VmPowerState.UNRECOGNIZED, State.Unknown); } - private static HashMap _guestOsType = new HashMap(50); - static { - _guestOsType.put("CentOS 4.5 (32-bit)", "CentOS 4.5"); - _guestOsType.put("CentOS 4.6 (32-bit)", "CentOS 4.6"); - _guestOsType.put("CentOS 4.7 (32-bit)", "CentOS 4.7"); - _guestOsType.put("CentOS 4.8 (32-bit)", "CentOS 4.8"); - _guestOsType.put("CentOS 5.0 (32-bit)", "CentOS 5.0"); - _guestOsType.put("CentOS 5.0 (64-bit)", "CentOS 5.0 x64"); - _guestOsType.put("CentOS 5.1 (32-bit)", "CentOS 5.1"); - _guestOsType.put("CentOS 5.1 (64-bit)", "CentOS 5.1 x64"); - _guestOsType.put("CentOS 5.2 (32-bit)", "CentOS 5.2"); - _guestOsType.put("CentOS 5.2 (64-bit)", "CentOS 5.2 x64"); - _guestOsType.put("CentOS 5.3 (32-bit)", "CentOS 5.3"); - _guestOsType.put("CentOS 5.3 (64-bit)", "CentOS 5.3 x64"); - _guestOsType.put("CentOS 5.4 (32-bit)", "CentOS 5.4"); - _guestOsType.put("CentOS 5.4 (64-bit)", "CentOS 5.4 x64"); - _guestOsType.put("Debian Lenny 5.0 (32-bit)", "Debian Lenny 5.0"); - _guestOsType.put("Oracle Enterprise Linux 5.0 (32-bit)", "Oracle Enterprise Linux 5.0"); - _guestOsType.put("Oracle Enterprise Linux 5.0 (64-bit)", "Oracle Enterprise Linux 5.0 x64"); - _guestOsType.put("Oracle Enterprise Linux 5.1 (32-bit)", "Oracle Enterprise Linux 5.1"); - _guestOsType.put("Oracle Enterprise Linux 5.1 (64-bit)", "Oracle Enterprise Linux 5.1 x64"); - _guestOsType.put("Oracle Enterprise Linux 5.2 (32-bit)", "Oracle Enterprise Linux 5.2"); - _guestOsType.put("Oracle Enterprise Linux 5.2 (64-bit)", "Oracle Enterprise Linux 5.2 x64"); - _guestOsType.put("Oracle Enterprise Linux 5.3 (32-bit)", "Oracle Enterprise Linux 5.3"); - _guestOsType.put("Oracle Enterprise Linux 5.3 (64-bit)", "Oracle Enterprise Linux 5.3 x64"); - _guestOsType.put("Oracle Enterprise Linux 5.4 (32-bit)", "Oracle Enterprise Linux 5.4"); - _guestOsType.put("Oracle Enterprise Linux 5.4 (64-bit)", "Oracle Enterprise Linux 5.4 x64"); - _guestOsType.put("Red Hat Enterprise Linux 4.5 (32-bit)", "Red Hat Enterprise Linux 4.5"); - _guestOsType.put("Red Hat Enterprise Linux 4.6 (32-bit)", "Red Hat Enterprise Linux 4.6"); - _guestOsType.put("Red Hat Enterprise Linux 4.7 (32-bit)", "Red Hat Enterprise Linux 4.7"); - _guestOsType.put("Red Hat Enterprise Linux 4.8 (32-bit)", "Red Hat Enterprise Linux 4.8"); - _guestOsType.put("Red Hat Enterprise Linux 5.0 (32-bit)", "Red Hat Enterprise Linux 5.0"); - _guestOsType.put("Red Hat Enterprise Linux 5.0 (64-bit)", "Red Hat Enterprise Linux 5.0 x64"); - _guestOsType.put("Red Hat Enterprise Linux 5.1 (32-bit)", "Red Hat Enterprise Linux 5.1"); - _guestOsType.put("Red Hat Enterprise Linux 5.1 (64-bit)", "Red Hat Enterprise Linux 5.1 x64"); - _guestOsType.put("Red Hat Enterprise Linux 5.2 (32-bit)", "Red Hat Enterprise Linux 5.2"); - _guestOsType.put("Red Hat Enterprise Linux 5.2 (64-bit)", "Red Hat Enterprise Linux 5.2 x64"); - _guestOsType.put("Red Hat Enterprise Linux 5.3 (32-bit)", "Red Hat Enterprise Linux 5.3"); - _guestOsType.put("Red Hat Enterprise Linux 5.3 (64-bit)", "Red Hat Enterprise Linux 5.3 x64"); - _guestOsType.put("Red Hat Enterprise Linux 5.4 (32-bit)", "Red Hat Enterprise Linux 5.4"); - _guestOsType.put("Red Hat Enterprise Linux 5.4 (64-bit)", "Red Hat Enterprise Linux 5.4 x64"); - _guestOsType.put("SUSE Linux Enterprise Server 9 SP4 (32-bit)", "SUSE Linux Enterprise Server 9 SP4"); - _guestOsType.put("SUSE Linux Enterprise Server 10 SP1 (32-bit)", "SUSE Linux Enterprise Server 10 SP1"); - _guestOsType.put("SUSE Linux Enterprise Server 10 SP1 (64-bit)", "SUSE Linux Enterprise Server 10 SP1 x64"); - _guestOsType.put("SUSE Linux Enterprise Server 10 SP2 (32-bit)", "SUSE Linux Enterprise Server 10 SP2"); - _guestOsType.put("SUSE Linux Enterprise Server 10 SP2 (64-bit)", "SUSE Linux Enterprise Server 10 SP2 x64"); - _guestOsType.put("SUSE Linux Enterprise Server 10 SP3 (64-bit)", "Other install media"); - _guestOsType.put("SUSE Linux Enterprise Server 11 (32-bit)", "SUSE Linux Enterprise Server 11"); - _guestOsType.put("SUSE Linux Enterprise Server 11 (64-bit)", "SUSE Linux Enterprise Server 11 x64"); - _guestOsType.put("Windows 7 (32-bit)", "Windows 7"); - _guestOsType.put("Windows 7 (64-bit)", "Windows 7 x64"); - _guestOsType.put("Windows Server 2003 (32-bit)", "Windows Server 2003"); - _guestOsType.put("Windows Server 2003 (64-bit)", "Windows Server 2003 x64"); - _guestOsType.put("Windows Server 2008 (32-bit)", "Windows Server 2008"); - _guestOsType.put("Windows Server 2008 (64-bit)", "Windows Server 2008 x64"); - _guestOsType.put("Windows Server 2008 R2 (64-bit)", "Windows Server 2008 R2 x64"); - _guestOsType.put("Windows 2000 SP4 (32-bit)", "Windows 2000 SP4"); - _guestOsType.put("Windows Vista (32-bit)", "Windows Vista"); - _guestOsType.put("Windows XP SP2 (32-bit)", "Windows XP SP2"); - _guestOsType.put("Windows XP SP3 (32-bit)", "Windows XP SP3"); - _guestOsType.put("Other install media", "Other install media"); - - } - + protected boolean isRefNull(XenAPIObject object) { return (object == null || object.toWireString().equals("OpaqueRef:NULL")); } @@ -456,13 +406,13 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected boolean currentlyAttached(SR sr, SR.Record rec, PBD pbd, PBD.Record pbdr) { String status = null; if (SRType.NFS.equals(rec.type)) { - status = callHostPlugin("vmops", "checkMount", "mount", rec.uuid); + status = callHostPlugin("checkMount", "mount", rec.uuid); } else if (SRType.LVMOISCSI.equals(rec.type) ) { String scsiid = pbdr.deviceConfig.get("SCSIid"); if (scsiid.isEmpty()) { return false; } - status = callHostPlugin("vmops", "checkIscsi", "scsiid", scsiid); + status = callHostPlugin("checkIscsi", "scsiid", scsiid); } else { return true; } @@ -478,7 +428,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected boolean pingdomr(String host, String port) { String status; - status = callHostPlugin("vmops", "pingdomr", "host", host, "port", port); + status = callHostPlugin("pingdomr", "host", host, "port", port); if (status == null || status.isEmpty()) { return false; @@ -490,7 +440,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected boolean pingxenserver() { String status; - status = callHostPlugin("vmops", "pingxenserver"); + status = callHostPlugin("pingxenserver"); if (status == null || status.isEmpty()) { return false; @@ -613,6 +563,8 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR return execute((GetHostStatsCommand) cmd); } else if (cmd instanceof GetVmStatsCommand) { return execute((GetVmStatsCommand) cmd); + } else if (cmd instanceof WatchNetworkCommand) { + return execute((WatchNetworkCommand) cmd); } else if (cmd instanceof CheckHealthCommand) { return execute((CheckHealthCommand) cmd); } else if (cmd instanceof StopCommand) { @@ -669,6 +621,8 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR return execute((GetVncPortCommand) cmd); } else if (cmd instanceof SetupCommand) { return execute((SetupCommand) cmd); + } else if (cmd instanceof CreateZoneVlanCommand) { + return execute((CreateZoneVlanCommand) cmd); } else if (cmd instanceof MaintainCommand) { return execute((MaintainCommand) cmd); } else if (cmd instanceof PingTestCommand) { @@ -677,6 +631,8 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR return execute((CheckOnHostCommand) cmd); } else if (cmd instanceof ModifySshKeysCommand) { return execute((ModifySshKeysCommand) cmd); + } else if (cmd instanceof NetworkIngressRulesCmd) { + return execute((NetworkIngressRulesCmd) cmd); } else if (cmd instanceof PoolEjectCommand) { return execute((PoolEjectCommand) cmd); } else { @@ -713,7 +669,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR private boolean doPingTest(final String computingHostIp) { String args = "-h " + computingHostIp; - String result = callHostPlugin("vmops", "pingtest", "args", args); + String result = callHostPlugin("pingtest", "args", args); if (result == null || result.isEmpty()) return false; return true; @@ -725,7 +681,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR private boolean doPingTest(final String domRIp, final String vmIp) { String args = "-i " + domRIp + " -p " + vmIp; - String result = callHostPlugin("vmops", "pingtest", "args", args); + String result = callHostPlugin("pingtest", "args", args); if (result == null || result.isEmpty()) return false; return true; @@ -850,7 +806,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR args += " -x " + oldPrivatePort; } - String result = callHostPlugin("vmops", "setFirewallRule", "args", args); + String result = callHostPlugin("setFirewallRule", "args", args); if (result == null || result.isEmpty()) { return new Answer(cmd, false, "SetFirewallRule failed"); @@ -872,7 +828,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR tmpCfgFileContents += "\n"; } - String result = callHostPlugin("vmops", "createFile", "filepath", tmpCfgFilePath, "filecontents", tmpCfgFileContents); + String result = callHostPlugin("createFile", "filepath", tmpCfgFilePath, "filecontents", tmpCfgFileContents); if (result == null || result.isEmpty()) { return new Answer(cmd, false, "LoadBalancerCfgCommand failed to create HA proxy cfg file."); @@ -903,13 +859,13 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR args += " -d " + sb.toString(); } - result = callHostPlugin("vmops", "setLoadBalancerRule", "args", args); + result = callHostPlugin("setLoadBalancerRule", "args", args); if (result == null || result.isEmpty()) { return new Answer(cmd, false, "LoadBalancerCfgCommand failed"); } - callHostPlugin("vmops", "deleteFile", "filepath", tmpCfgFilePath); + callHostPlugin("deleteFile", "filepath", tmpCfgFilePath); return new Answer(cmd); } @@ -919,7 +875,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR args += " -v " + cmd.getVmIpAddress(); args += " -m " + cmd.getVmMac(); args += " -n " + cmd.getVmName(); - String result = callHostPlugin("vmops", "saveDhcpEntry", "args", args); + String result = callHostPlugin("saveDhcpEntry", "args", args); if (result == null || result.isEmpty()) { return new Answer(cmd, false, "DhcpEntry failed"); } @@ -946,7 +902,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR i += 2; } - String result = callHostPlugin("vmops", "vm_data", vmDataArgs); + String result = callHostPlugin("vm_data", vmDataArgs); if (result == null || result.isEmpty()) { return new Answer(cmd, false, "vm_data failed"); @@ -968,7 +924,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR args += " -v " + vmIpAddress; args += " -p " + password; args += " " + local; - String result = callHostPlugin("vmops", "savePassword", "args", args); + String result = callHostPlugin("savePassword", "args", args); if (result == null || result.isEmpty()) { return new Answer(cmd, false, "savePassword failed"); @@ -1052,7 +1008,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR args += " -g "; args += vlanGateway; - String result = callHostPlugin("vmops", "ipassoc", "args", args); + String result = callHostPlugin("ipassoc", "args", args); if (result == null || result.isEmpty()) { throw new InternalErrorException("Xen plugin \"ipassoc\" failed."); } @@ -1084,11 +1040,24 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } protected String networkUsage(final String privateIpAddress, final String option, final String vif) { - + String args = null; if (option.equals("get")) { - return "0:0"; + args = "-g"; + } else if (option.equals("create")) { + args = "-c"; + } else if (option.equals("reset")) { + args = "-r"; + } else if (option.equals("addVif")) { + args = "-a"; + args += vif; + } else if (option.equals("deleteVif")) { + args = "-d"; + args += vif; } - return null; + + args += " -i "; + args += privateIpAddress; + return callHostPlugin("networkUsage", "args", args); } protected Answer execute(final IPAssocCommand cmd) { @@ -1126,9 +1095,17 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR return new CheckHealthAnswer(cmd, result); } + protected WatchNetworkAnswer execute(WatchNetworkCommand cmd) { + WatchNetworkAnswer answer = new WatchNetworkAnswer(cmd); + for (String domr : _domrIPMap.keySet()) { + long[] stats = getNetworkStats(domr); + answer.addStats(domr, stats[0], stats[1]); + } + return answer; + } - protected long[] getNetworkStats(String privateIP) { - String result = networkUsage(privateIP, "get", null); + protected long[] getNetworkStats(String domr) { + String result = networkUsage(_domrIPMap.get(domr), "get", null); long[] stats = new long[2]; if (result != null) { String[] splitResult = result.split(":"); @@ -1447,7 +1424,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR Date currentDate = new Date(); String startTime = String.valueOf(currentDate.getTime() / 1000 - 1000); - return callHostPlugin("vmops", "gethostvmstats", "collectHostStats", String.valueOf("true"), "consolidationFunction", _consolidationFunction, "interval", String + return callHostPlugin("gethostvmstats", "collectHostStats", String.valueOf("true"), "consolidationFunction", _consolidationFunction, "interval", String .valueOf(_pollingIntervalInSeconds), "startTime", startTime); } @@ -1455,7 +1432,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR Date currentDate = new Date(); String startTime = String.valueOf(currentDate.getTime() / 1000 - 1000); - return callHostPlugin("vmops", "gethostvmstats", "collectHostStats", String.valueOf("false"), "consolidationFunction", _consolidationFunction, "interval", String + return callHostPlugin("gethostvmstats", "collectHostStats", String.valueOf("false"), "consolidationFunction", _consolidationFunction, "interval", String .valueOf(_pollingIntervalInSeconds), "startTime", startTime); } @@ -1666,10 +1643,12 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR String nwuuid = network.getUuid(conn); String pifuuid = null; - if(nwuuid.equalsIgnoreCase(_host.privateNetwork)) { - pifuuid = _host.privatePif; + if(nwuuid.equalsIgnoreCase(_host.guestNetwork)) { + pifuuid = _host.guestPif; } else if(nwuuid.equalsIgnoreCase(_host.publicNetwork)) { pifuuid = _host.publicPif; + } else if(nwuuid.equalsIgnoreCase(_host.privateNetwork)) { + pifuuid = _host.privateNetwork; } else { continue; } @@ -1897,7 +1876,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR for (VM vm : vms) { if (!cmd.isWindows()) { String uuid = vm.getUuid(conn); - String result = callHostPlugin("vmops", "preparemigration", "uuid", uuid); + String result = callHostPlugin("preparemigration", "uuid", uuid); if (result == null || result.isEmpty()) { return new MigrateAnswer(cmd, false, "migration failed", null); } @@ -2097,7 +2076,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR // Ignore the result of the callHostPlugin. Even if unmounting the // snapshots dir fails, let Ready command // succeed. - callHostPlugin("vmopsSnapshot", "unmountSnapshotsDir", "dcId", dcId.toString()); + callHostPlugin("unmountSnapshotsDir", "dcId", dcId.toString()); return new ReadyAnswer(cmd); } @@ -2129,7 +2108,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR hvm = "false"; } - String vncport = callHostPlugin("vmops", "getvncport", "domID", record.domid.toString(), "hvm", hvm); + String vncport = callHostPlugin("getvncport", "domID", record.domid.toString(), "hvm", hvm); if (vncport == null || vncport.isEmpty()) { return -1; } @@ -2188,7 +2167,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR Long bytesSent = 0L; Long bytesRcvd = 0L; if (VirtualMachineName.isValidRouterName(cmd.getVmName())) { - long[] stats = getNetworkStats(cmd.getPrivateIpAddress()); + long[] stats = getNetworkStats(cmd.getVmName()); bytesSent = stats[0]; bytesRcvd = stats[1]; } @@ -2199,6 +2178,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR String cnct = connect(cmd.getVmName(), cmd.getPrivateIpAddress()); networkUsage(cmd.getPrivateIpAddress(), "create", null); if (cnct == null) { + _domrIPMap.put(cmd.getVmName(), cmd.getPrivateIpAddress()); return answer; } else { return new Answer(cmd, false, cnct); @@ -2210,8 +2190,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected VM createVmFromTemplate(Connection conn, StartCommand cmd) throws XenAPIException, XmlRpcException { Set templates; VM vm = null; - String stdType = cmd.getGuestOSDescription(); - String guestOsTypeName = getGuestOsType(stdType); + String guestOsTypeName = cmd.getGuestOSDescription(); templates = VM.getByNameLabel(conn, guestOsTypeName); assert templates.size() == 1 : "Should only have 1 template but found " + templates.size(); VM template = templates.iterator().next(); @@ -2229,10 +2208,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR return vm; } - protected String getGuestOsType(String stdType) { - return _guestOsType.get(stdType); - } - public boolean joinPool(String address, String username, String password) { Connection conn = getConnection(); Connection poolConn = null; @@ -2421,6 +2396,15 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR vbdr.type = Types.VbdType.DISK; VBD.create(conn, vbdr); + /* determine available slots to attach data volumes to */ + List availableSlots = new ArrayList(); + availableSlots.add("1"); + availableSlots.add("2"); + availableSlots.add("4"); + availableSlots.add("5"); + availableSlots.add("6"); + availableSlots.add("7"); + /* create data VBDs */ for (int i = 1; i < mounts.size(); i++) { mount = mounts.get(i); @@ -2481,7 +2465,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR vm.start(conn, false, true); if (_canBridgeFirewall) { - String result = callHostPlugin("vmops", "default_network_rules", + String result = callHostPlugin("default_network_rules", "vmName", cmd.getVmName(), "vmIP", cmd.getGuestIpAddress(), "vmMAC", cmd.getGuestMacAddress(), @@ -2612,14 +2596,12 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR vm.setAffinity(conn, vm.getResidentOn(conn)); try { if (VirtualMachineName.isValidRouterName(vmName)) { - if(cmd.getPrivateRouterIpAddress() != null){ - long[] stats = getNetworkStats(cmd.getPrivateRouterIpAddress()); - bytesSent = stats[0]; - bytesRcvd = stats[1]; - } + long[] stats = getNetworkStats(vmName); + bytesSent = stats[0]; + bytesRcvd = stats[1]; } if (_canBridgeFirewall) { - String result = callHostPlugin("vmops", "destroy_network_rules_for_vm", "vmName", cmd.getVmName()); + String result = callHostPlugin("destroy_network_rules_for_vm", "vmName", cmd.getVmName()); if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) { s_logger.warn("Failed to remove network rules for vm " + cmd.getVmName()); } else { @@ -2668,6 +2650,9 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR state = State.Stopped; SR sr = getISOSRbyVmName(cmd.getVmName()); removeSR(sr); + if (VirtualMachineName.isValidRouterName(vmName)) { + _domrIPMap.remove(vmName); + } // Disable any VLAN networks that aren't used // anymore for (Network network : networks) { @@ -2778,6 +2763,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR .getPrivateMacAddress(), router.getPublicMacAddress(), 3922, router.getRamSize()); if (result == null) { networkUsage(router.getPrivateIpAddress(), "create", null); + _domrIPMap.put(cmd.getVmName(), router.getPrivateIpAddress()); return new StartRouterAnswer(cmd); } return new StartRouterAnswer(cmd, result); @@ -2796,6 +2782,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR List> mounts = null; Connection conn = getConnection(); State state = State.Stopped; + String linkLocalBrName = null; try { synchronized (_vms) { _vms.put(vmName, State.Starting); @@ -2914,7 +2901,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR vm.start(conn, false, true); if (_canBridgeFirewall) { - String result = callHostPlugin("vmops", "default_network_rules_systemvm", "vmName", vmName); + String result = callHostPlugin("default_network_rules_systemvm", "vmName", vmName); if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) { s_logger.warn("Failed to program default system vm network rules for " + vmName); } else { @@ -2998,7 +2985,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected boolean isDeviceUsed(VM vm, Long deviceId) { // Figure out the disk number to attach the VM to - String msg = null; try { Connection conn = getConnection(); @@ -3103,13 +3089,13 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } protected boolean patchspecialvm(String vmname, String device, String vmtype) { - String result = callHostPlugin("vmops", "patchdomr", "vmname", vmname, "vmtype", vmtype, "device", "/dev/" + device); + String result = callHostPlugin("patchdomr", "vmname", vmname, "vmtype", vmtype, "device", "/dev/" + device); if (result == null || result.isEmpty()) return false; return true; } - protected String callHostPlugin(String plugin, String cmd, String... params) { + protected String callHostPlugin(String cmd, String... params) { Map args = new HashMap(); try { Connection conn = getConnection(); @@ -3122,7 +3108,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args)); } - String result = host.callPlugin(conn, plugin, cmd, args); + String result = host.callPlugin(conn, "vmops", cmd, args); if (s_logger.isTraceEnabled()) { s_logger.trace("callHostPlugin Result: " + result); } @@ -3144,16 +3130,13 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } protected boolean setIptables() { - String result = callHostPlugin("vmops", "setIptables"); + String result = callHostPlugin("setIptables"); if (result == null || result.isEmpty()) return false; return true; } protected Nic getLocalNetwork(Connection conn, String name) throws XmlRpcException, XenAPIException { - if( name == null) { - return null; - } Set networks = Network.getByNameLabel(conn, name); for (Network network : networks) { Network.Record nr = network.getRecord(conn); @@ -3163,6 +3146,29 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR if (s_logger.isDebugEnabled()) { s_logger.debug("Found a network called " + name + " on host=" + _host.ip + "; Network=" + nr.uuid + "; pif=" + pr.uuid); } + if (pr.bondMasterOf != null && pr.bondMasterOf.size() > 0) { + if (pr.bondMasterOf.size() > 1) { + String msg = new StringBuilder("Unsupported configuration. Network " + name + " has more than one bond. Network=").append(nr.uuid) + .append("; pif=").append(pr.uuid).toString(); + s_logger.warn(msg); + return null; + } + Bond bond = pr.bondMasterOf.iterator().next(); + Set slaves = bond.getSlaves(conn); + for (PIF slave : slaves) { + PIF.Record spr = slave.getRecord(conn); + if (spr.management) { + Host host = Host.getByUuid(conn, _host.uuid); + if (!transferManagementNetwork(conn, host, slave, spr, pif)) { + String msg = new StringBuilder("Unable to transfer management network. slave=" + spr.uuid + "; master=" + pr.uuid + "; host=" + + _host.uuid).toString(); + s_logger.warn(msg); + return null; + } + break; + } + } + } return new Nic(network, nr, pif, pr); } @@ -3281,7 +3287,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR vlanNetwork = getNetworkByName(name); if (vlanNetwork == null) { // Can't find it, then create it. if (s_logger.isDebugEnabled()) { - s_logger.debug("Creating VLAN network for " + tag + " on host " + _host.ip); + s_logger.debug("Creating VLAN for " + tag + " on host " + _host.ip); } Network.Record nwr = new Network.Record(); nwr.nameLabel = name; @@ -3304,7 +3310,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } if (s_logger.isDebugEnabled()) { - s_logger.debug("Creating VLAN " + tag + " on host " + _host.ip + " on device " + nPifr.device); + s_logger.debug("Creating VLAN " + tag + " on host " + _host.ip); } VLAN vlan = VLAN.create(conn, nPif, tag, vlanNetwork); PIF untaggedPif = vlan.getUntaggedPIF(conn); @@ -3442,7 +3448,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR private HashMap> syncNetworkGroups(long id) { HashMap> states = new HashMap>(); - String result = callHostPlugin("vmops", "get_rule_logs_for_vms", "host_uuid", _host.uuid); + String result = callHostPlugin("get_rule_logs_for_vms", "host_uuid", _host.uuid); s_logger.trace("syncNetworkGroups: id=" + id + " got: " + result); String [] rulelogs = result != null ?result.split(";"): new String [0]; for (String rulesforvm: rulelogs){ @@ -3496,18 +3502,18 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR name = _privateNetworkName; } - _localGateway = callHostPlugin("vmops", "getgateway", "mgmtIP", myself.getAddress(conn)); + _localGateway = callHostPlugin("getgateway", "mgmtIP", myself.getAddress(conn)); if (_localGateway == null || _localGateway.isEmpty()) { s_logger.warn("can not get gateway for host :" + _host.uuid); return false; } - _canBridgeFirewall = Boolean.valueOf(callHostPlugin("vmops", "can_bridge_firewall", "host_uuid", _host.uuid)); + _canBridgeFirewall = Boolean.valueOf(callHostPlugin("can_bridge_firewall", "host_uuid", _host.uuid)); Nic privateNic = getLocalNetwork(conn, name); if (privateNic == null) { s_logger.debug("Unable to find any private network. Trying to determine that by route for host " + _host.ip); - name = callHostPlugin("vmops", "getnetwork", "mgmtIP", myself.getAddress(conn)); + name = callHostPlugin("getnetwork", "mgmtIP", myself.getAddress(conn)); if (name == null || name.isEmpty()) { s_logger.warn("Unable to determine the private network for host " + _host.ip); return false; @@ -3517,13 +3523,11 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_logger.warn("Unable to get private network " + name); return false; } - } - _host.privatePif = privateNic.pr.uuid; - _host.privateNetwork = privateNic.nr.uuid; - _privateNetworkName = privateNic.nr.nameLabel; - + } + name = privateNic.nr.nameLabel; + Nic guestNic = null; - if (_guestNetworkName != null && !_guestNetworkName.equals(_privateNetworkName)) { + if (_guestNetworkName != null && !_guestNetworkName.equals(name)) { guestNic = getLocalNetwork(conn, _guestNetworkName); if (guestNic == null) { s_logger.warn("Unable to find guest network " + _guestNetworkName); @@ -3532,12 +3536,10 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } else { guestNic = privateNic; } - _guestNetworkName = guestNic.nr.nameLabel; - _host.guestNetwork = guestNic.nr.uuid; - _host.guestPif = guestNic.pr.uuid; + name = guestNic.nr.nameLabel; Nic publicNic = null; - if (_publicNetworkName != null && !_publicNetworkName.equals(_guestNetworkName)) { + if (_publicNetworkName != null && !_publicNetworkName.equals(name)) { publicNic = getLocalNetwork(conn, _publicNetworkName); if (publicNic == null) { s_logger.warn("Unable to find public network " + _publicNetworkName + " for host " + _host.ip); @@ -3546,32 +3548,29 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } else { publicNic = guestNic; } + name = publicNic.nr.nameLabel; + + _host.privatePif = privateNic.pr.uuid; + _host.privateNetwork = privateNic.nr.uuid; _host.publicPif = publicNic.pr.uuid; _host.publicNetwork = publicNic.nr.uuid; - _publicNetworkName = publicNic.nr.nameLabel; - + _host.guestNetwork = guestNic.nr.uuid; + _host.guestPif = guestNic.pr.uuid; Nic storageNic1 = getLocalNetwork(conn, _storageNetworkName1); if (storageNic1 == null) { storageNic1 = privateNic; - _storageNetworkName1 = _privateNetworkName; } + _host.storageNetwork1 = storageNic1.nr.uuid; _host.storagePif1 = storageNic1.pr.uuid; Nic storageNic2 = getLocalNetwork(conn, _storageNetworkName2); - if (storageNic2 == null) { - storageNic2 = privateNic; - _storageNetworkName2 = _privateNetworkName; + if (storageNic2 != null) { + _host.storageNetwork2 = storageNic2.nr.uuid; + _host.storagePif2 = storageNic2.pr.uuid; } - _host.storageNetwork2 = storageNic2.nr.uuid; - _host.storagePif2 = storageNic2.pr.uuid; - - s_logger.info("Private Network is " + _privateNetworkName + " for host " + _host.ip); - s_logger.info("Public Network is " + _publicNetworkName + " for host " + _host.ip); - s_logger.info("Storage Network 1 is " + _storageNetworkName1 + " for host " + _host.ip); - s_logger.info("Storage Network 2 is " + _storageNetworkName2 + " for host " + _host.ip); - + return true; } catch (XenAPIException e) { s_logger.warn("Unable to get host information for " + _host.ip, e); @@ -3636,16 +3635,16 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR vifr.MAC = "FE:FF:FF:FF:FF:FF"; vifr.network = linkLocal; dom0vif = VIF.create(conn, vifr); - dom0vif.plug(conn); + //dom0vif.plug(conn); } else { s_logger.debug("already have a vif on dom0 for link local network"); - if (!dom0vif.getCurrentlyAttached(conn)) { + /*if (!dom0vif.getCurrentlyAttached(conn)) { dom0vif.plug(conn); - } + }*/ } String brName = linkLocal.getBridge(conn); - callHostPlugin("vmops", "setLinkLocalIP", "brName", brName); + callHostPlugin("setLinkLocalIP", "brName", brName); _host.linkLocalNetwork = linkLocal.getUuid(conn); } catch (XenAPIException e) { @@ -3656,7 +3655,36 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } } - + protected boolean transferManagementNetwork(Connection conn, Host host, PIF src, PIF.Record spr, PIF dest) throws XmlRpcException, XenAPIException { + dest.reconfigureIp(conn, spr.ipConfigurationMode, spr.IP, spr.netmask, spr.gateway, spr.DNS); + Host.managementReconfigure(conn, dest); + String hostUuid = null; + int count = 0; + while (count < 10) { + try { + Thread.sleep(10000); + hostUuid = host.getUuid(conn); + if (hostUuid != null) { + break; + } + } catch (XmlRpcException e) { + s_logger.debug("Waiting for host to come back: " + e.getMessage()); + } catch (XenAPIException e) { + s_logger.debug("Waiting for host to come back: " + e.getMessage()); + } catch (InterruptedException e) { + s_logger.debug("Gotta run"); + return false; + } + } + if (hostUuid == null) { + s_logger.warn("Unable to transfer the management network from " + spr.uuid); + return false; + } + + src.reconfigureIp(conn, IpConfigurationMode.NONE, null, null, null, null); + return true; + } + @Override public StartupCommand[] initialize() throws IllegalArgumentException{ disconnected(); @@ -3682,6 +3710,17 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR changes = sync(); } + _domrIPMap.clear(); + if (changes != null) { + for (final Map.Entry entry : changes.entrySet()) { + final String vm = entry.getKey(); + State state = entry.getValue(); + if (VirtualMachineName.isValidRouterName(vm) && (state == State.Running)) { + syncDomRIPMap(vm); + } + } + } + cmd.setHypervisorType(Hypervisor.Type.XenServer); cmd.setChanges(changes); cmd.setCluster(_cluster); @@ -3787,11 +3826,9 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR s_logger.warn("We cannot locate " + f); continue; } - if (s_logger.isDebugEnabled()) { - s_logger.debug("Copying " + f + " to " + d + " on " + hr.address + " with permission " + p); - } + s_logger.info("Copying " + f + " to " + d + " on " + hr.address + " with permission " + p); scp.put(f, d, p); - + s_logger.info("Copied " + f + " to " + d + " on " + hr.address + " with permission " + p); } } catch (IOException e) { throw new CloudRuntimeException("Unable to setup the server correctly", e); @@ -4016,9 +4053,15 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR if (details == null) { details = new HashMap(); } - details.put("private.network.device", _privateNetworkName); - details.put("public.network.device", _publicNetworkName); - details.put("guest.network.device", _guestNetworkName); + if (_privateNetworkName != null) { + details.put("private.network.device", _privateNetworkName); + } + if (_publicNetworkName != null) { + details.put("public.network.device", _publicNetworkName); + } + if (_guestNetworkName != null) { + details.put("guest.network.device", _guestNetworkName); + } details.put("can_bridge_firewall", Boolean.toString(_canBridgeFirewall)); cmd.setHostDetails(details); cmd.setName(hr.nameLabel); @@ -4366,11 +4409,11 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR Connection conn = getConnection(); return VDI.getByUuid(conn, uuid); } catch (XenAPIException e) { - String msg = "VDI getByUuid for uuid: " + uuid + " failed due to " + e.toString(); + String msg = "VDI getByUuid failed " + uuid + " due to " + e.toString(); s_logger.warn(msg, e); throw new CloudRuntimeException(msg, e); } catch (Exception e) { - String msg = "VDI getByUuid for uuid: " + uuid + " failed due to " + e.getMessage(); + String msg = "VDI getByUuid failed " + uuid + " due to " + e.getMessage(); s_logger.warn(msg, e); throw new CloudRuntimeException(msg, e); } @@ -4890,14 +4933,10 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR // Figure out the disk number to attach the VM to String diskNumber = null; if( deviceId != null ) { - if( deviceId.longValue() == 3 ) { - String msg = "Device 3 is reserved for CD-ROM, choose other device"; - return new AttachVolumeAnswer(cmd,msg); - } if(isDeviceUsed(vm, deviceId)) { String msg = "Device " + deviceId + " is used in VM " + vmName; return new AttachVolumeAnswer(cmd,msg); - } + } diskNumber = deviceId.toString(); } else { diskNumber = getUnusedDeviceNum(vm); @@ -5098,7 +5137,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR if (previousSnapshotUuid == null) { previousSnapshotUuid = ""; } - String result = callHostPlugin("vmopsSnapshot", "validateSnapshot", "primaryStorageSRUuid", primaryStorageSRUuid, "volumeUuid", volumeUuid, "firstBackupUuid", firstBackupUuid, + String result = callHostPlugin("validateSnapshot", "primaryStorageSRUuid", primaryStorageSRUuid, "volumeUuid", volumeUuid, "firstBackupUuid", firstBackupUuid, "previousSnapshotUuid", previousSnapshotUuid, "templateUuid", templateUuid, "isISCSI", isISCSI.toString()); if (result == null || result.isEmpty()) { details = "Validating snapshot backup for volume with UUID: " + volumeUuid + " failed because there was an exception in the plugin"; @@ -5292,9 +5331,9 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } else { templateName = vhdInfo.getUuid(); String templateFilename = templateName + ".vhd"; - String templateInstallPath = templateInstallFolder + "/" + templateFilename; + String templateInstallPath = templateInstallFolder + File.separator + templateFilename; - newTemplatePath = "template" + "/" + templateInstallPath; + newTemplatePath = "template" + File.separator + templateInstallPath; virtualSize = vhdInfo.getVirtualSize(); // create the template.properties file @@ -5328,6 +5367,8 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR String prevSnapshotUuid = cmd.getPrevSnapshotUuid(); String prevBackupUuid = cmd.getPrevBackupUuid(); boolean isFirstSnapshotOfRootVolume = cmd.isFirstSnapshotOfRootVolume(); + String firstBackupUuid = cmd.getFirstBackupUuid(); + // By default assume failure String details = null; boolean success = false; @@ -5348,6 +5389,12 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR details = "Couldn't backup snapshot because the URL passed: " + secondaryStoragePoolURL + " is invalid."; } else { boolean gcHappened = true; + if (prevSnapshotUuid != null && !isFirstSnapshotOfRootVolume) { + // For the first snapshot of a root volume, the prevSnapshotUuid is set to the template uuid. + // This is to catch the case where the first snapshot is empty. + // But we need not wait for GC as no snapshot has been taken. + // gcHappened = waitForGC(primaryStorageSRUuid, prevSnapshotUuid, firstBackupUuid, isISCSI); + } if (gcHappened) { snapshotBackupUuid = backupSnapshot(primaryStorageSRUuid, dcId, accountId, volumeId, secondaryStorageMountPath, snapshotUuid, prevSnapshotUuid, prevBackupUuid, isFirstSnapshotOfRootVolume, isISCSI); @@ -5614,7 +5661,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR return new Answer(cmd, success, details); } - protected VM getVM(Connection conn, String vmName) { + private VM getVM(Connection conn, String vmName) { // Look up VMs with the specified name Set vms; try { @@ -5755,6 +5802,26 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR return executeProxyLoadScan(cmd, cmd.getProxyVmId(), cmd.getProxyVmName(), cmd.getProxyManagementIp(), cmd.getProxyCmdPort()); } + protected CreateZoneVlanAnswer execute(CreateZoneVlanCommand cmd) { + Connection conn = getConnection(); + try { + final DomainRouter router = cmd.getRouter(); + VM vm = getVM(conn, router.getInstanceName()); + // ToDo: Using vif 3 for now. Sync with multiple public VLAN feature + // to avoid conflict + createVIF(conn, vm, router.getGuestZoneMacAddress(), router.getZoneVlan(), 0, "3", true); + return new CreateZoneVlanAnswer(cmd); + } catch (XenAPIException e) { + String msg = "Exception caught while creating zone vlan: " + e.toString(); + s_logger.warn(msg, e); + return new CreateZoneVlanAnswer(cmd, msg); + } catch (Exception e) { + String msg = "Exception caught while creating zone vlan: " + e.getMessage(); + s_logger.warn(msg, e); + return new CreateZoneVlanAnswer(cmd, msg); + } + } + protected Answer executeProxyLoadScan(final Command cmd, final long proxyVmId, final String proxyVmName, final String proxyManagementIp, final int cmdPort) { String result = null; @@ -5797,12 +5864,12 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } protected boolean createSecondaryStorageFolder(String remoteMountPath, String newFolder) { - String result = callHostPlugin("vmopsSnapshot", "create_secondary_storage_folder", "remoteMountPath", remoteMountPath, "newFolder", newFolder); + String result = callHostPlugin("create_secondary_storage_folder", "remoteMountPath", remoteMountPath, "newFolder", newFolder); return (result != null); } protected boolean deleteSecondaryStorageFolder(String remoteMountPath, String folder) { - String result = callHostPlugin("vmopsSnapshot", "delete_secondary_storage_folder", "remoteMountPath", remoteMountPath, "folder", folder); + String result = callHostPlugin("delete_secondary_storage_folder", "remoteMountPath", remoteMountPath, "folder", folder); return (result != null); } @@ -5817,7 +5884,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR checksum = ""; } - String result = callHostPlugin("vmopsSnapshot", "post_create_private_template", "remoteTemplateMountPath", remoteTemplateMountPath, "templateDownloadFolder", templateDownloadFolder, + String result = callHostPlugin("post_create_private_template", "remoteTemplateMountPath", remoteTemplateMountPath, "templateDownloadFolder", templateDownloadFolder, "templateInstallFolder", templateInstallFolder, "templateFilename", templateFilename, "templateName", templateName, "templateDescription", templateDescription, "checksum", checksum, "virtualSize", String.valueOf(virtualSize), "templateId", String.valueOf(templateId)); @@ -5840,6 +5907,29 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR return success; } + protected boolean waitForGC(String primaryStorageSRUuid, String previousSnapshotUuid, String firstBackupUuid, Boolean isISCSI) { + boolean success = false; + String result = callHostPlugin("validatePreviousSnapshotBackup", "primaryStorageSRUuid", primaryStorageSRUuid, "previousSnapshotUuid", previousSnapshotUuid, + "firstBackupUuid", firstBackupUuid, "isISCSI", isISCSI.toString()); + + if (result != null && !result.isEmpty()) { + String[] expectedActual = result.split("#"); + String status = expectedActual[0]; + + if (expectedActual.length == 3) { + String expectedParentOfPreviousSnapshot = expectedActual[1]; + String actualParentOfPreviousSnapshot = expectedActual[2]; + if (status.equals("1") && expectedParentOfPreviousSnapshot.equals(actualParentOfPreviousSnapshot)) { + success = true; + } else { + s_logger.error("Could not backup snapshot because the previous snapshot hasn't been coalesced by XenServer GC." + "Expected parent of previous snapshot: " + + expectedParentOfPreviousSnapshot + " Actual parent of previous snapshot: " + actualParentOfPreviousSnapshot); + } + } + } + return success; + } + // Each argument is put in a separate line for readability. // Using more lines does not harm the environment. protected String backupSnapshot(String primaryStorageSRUuid, Long dcId, Long accountId, Long volumeId, String secondaryStorageMountPath, String snapshotUuid, @@ -5855,7 +5945,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR // Each argument is put in a separate line for readability. // Using more lines does not harm the environment. - String results = callHostPlugin("vmopsSnapshot", "backupSnapshot", "primaryStorageSRUuid", primaryStorageSRUuid, "dcId", dcId.toString(), "accountId", accountId.toString(), "volumeId", + String results = callHostPlugin("backupSnapshot", "primaryStorageSRUuid", primaryStorageSRUuid, "dcId", dcId.toString(), "accountId", accountId.toString(), "volumeId", volumeId.toString(), "secondaryStorageMountPath", secondaryStorageMountPath, "snapshotUuid", snapshotUuid, "prevSnapshotUuid", prevSnapshotUuid, "prevBackupUuid", prevBackupUuid, "isFirstSnapshotOfRootVolume", isFirstSnapshotOfRootVolume.toString(), "isISCSI", isISCSI.toString()); @@ -5907,7 +5997,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected String deleteSnapshotBackup(Long dcId, Long accountId, Long volumeId, String secondaryStorageMountPath, String backupUUID, String childUUID, Boolean isISCSI) { // If anybody modifies the formatting below again, I'll skin them - String result = callHostPlugin("vmopsSnapshot", "deleteSnapshotBackup", "backupUUID", backupUUID, "childUUID", childUUID, "dcId", dcId.toString(), "accountId", accountId.toString(), + String result = callHostPlugin("deleteSnapshotBackup", "backupUUID", backupUUID, "childUUID", childUUID, "dcId", dcId.toString(), "accountId", accountId.toString(), "volumeId", volumeId.toString(), "secondaryStorageMountPath", secondaryStorageMountPath, "isISCSI", isISCSI.toString()); return result; @@ -5915,7 +6005,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected String deleteSnapshotsDir(Long dcId, Long accountId, Long volumeId, String secondaryStorageMountPath) { // If anybody modifies the formatting below again, I'll skin them - String result = callHostPlugin("vmopsSnapshot", "deleteSnapshotsDir", "dcId", dcId.toString(), "accountId", accountId.toString(), "volumeId", volumeId.toString(), + String result = callHostPlugin("deleteSnapshotsDir", "dcId", dcId.toString(), "accountId", accountId.toString(), "volumeId", volumeId.toString(), "secondaryStorageMountPath", secondaryStorageMountPath); return result; @@ -5958,7 +6048,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR String failureString = "Could not create volume from " + backedUpSnapshotUuid; templatePath = (templatePath == null) ? "" : templatePath; - String results = callHostPlugin("vmopsSnapshot", "createVolumeFromSnapshot", "dcId", dcId.toString(), "accountId", accountId.toString(), "volumeId", volumeId.toString(), + String results = callHostPlugin("createVolumeFromSnapshot", "dcId", dcId.toString(), "accountId", accountId.toString(), "volumeId", volumeId.toString(), "secondaryStorageMountPath", secondaryStorageMountPath, "backedUpSnapshotUuid", backedUpSnapshotUuid, "templatePath", templatePath, "templateDownloadFolder", templateDownloadFolder, "isISCSI", isISCSI.toString()); @@ -5986,6 +6076,36 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } + protected void syncDomRIPMap(String vm) { + // VM is a DomR, get its IP and add to domR-IP map + Connection conn = getConnection(); + VM vm1 = getVM(conn, vm); + try { + String pvargs = vm1.getPVArgs(conn); + if (pvargs != null) { + pvargs = pvargs.replaceAll(" ", "\n"); + Properties pvargsProps = new Properties(); + pvargsProps.load(new StringReader(pvargs)); + String ip = pvargsProps.getProperty("eth1ip"); + if (ip != null) { + _domrIPMap.put(vm, ip); + } + } + } catch (BadServerResponse e) { + String msg = "Unable to update domR IP map due to: " + e.toString(); + s_logger.warn(msg, e); + } catch (XenAPIException e) { + String msg = "Unable to update domR IP map due to: " + e.toString(); + s_logger.warn(msg, e); + } catch (XmlRpcException e) { + String msg = "Unable to update domR IP map due to: " + e.toString(); + s_logger.warn(msg, e); + } catch (IOException e) { + String msg = "Unable to update domR IP map due to: " + e.toString(); + s_logger.warn(msg, e); + } + } + @Override public boolean start() { return true; @@ -6012,23 +6132,39 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR _agentControl = agentControl; } + private Answer execute(NetworkIngressRulesCmd cmd) { + if (s_logger.isTraceEnabled()) { + s_logger.trace("Sending network rules command to " + _host.ip); + } + if (!_canBridgeFirewall) { + s_logger.info("Host " + _host.ip + " cannot do bridge firewalling"); + return new NetworkIngressRuleAnswer(cmd, false, "Host " + _host.ip + " cannot do bridge firewalling"); + } + + String result = callHostPlugin("network_rules", + "vmName", cmd.getVmName(), + "vmIP", cmd.getGuestIp(), + "vmMAC", cmd.getGuestMac(), + "vmID", Long.toString(cmd.getVmId()), + "signature", cmd.getSignature(), + "seqno", Long.toString(cmd.getSeqNum()), + "rules", cmd.stringifyRules()); + + if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) { + s_logger.warn("Failed to program network rules for vm " + cmd.getVmName()); + return new NetworkIngressRuleAnswer(cmd, false, "programming network rules failed"); + } else { + s_logger.info("Programmed network rules for vm " + cmd.getVmName() + " guestIp=" + cmd.getGuestIp() + ", numrules=" + cmd.getRuleSet().length); + return new NetworkIngressRuleAnswer(cmd); + } + } - protected Answer execute(PoolEjectCommand cmd) { + private Answer execute(PoolEjectCommand cmd) { Connection conn = getConnection(); String hostuuid = cmd.getHostuuid(); try { Host host = Host.getByUuid(conn, hostuuid); - // remove all tags cloud stack add before eject - Host.Record hr = host.getRecord(conn); - Iterator it = hr.tags.iterator(); - while (it.hasNext()) { - String tag = it.next(); - if (tag.startsWith("vmops-version-")) { - it.remove(); - } - } - // eject from pool Pool.eject(conn, host); return new Answer(cmd); } catch (XenAPIException e) { diff --git a/core/src/com/cloud/info/RunningHostInfoAgregator.java b/core/src/com/cloud/info/RunningHostInfoAgregator.java index ab1258b6c43..bf59f6430ea 100644 --- a/core/src/com/cloud/info/RunningHostInfoAgregator.java +++ b/core/src/com/cloud/info/RunningHostInfoAgregator.java @@ -26,12 +26,14 @@ import com.cloud.host.Host; public class RunningHostInfoAgregator { public static class ZoneHostInfo { + public static int COMPUTING_HOST_MASK = 1; public static int ROUTING_HOST_MASK = 2; public static int STORAGE_HOST_MASK = 4; - public static int ALL_HOST_MASK = ROUTING_HOST_MASK | STORAGE_HOST_MASK; + public static int ALL_HOST_MASK = COMPUTING_HOST_MASK | ROUTING_HOST_MASK | STORAGE_HOST_MASK; private long dcId; + // (1 << 0) : at least one computing host is running in the zone // (1 << 1) : at least one routing host is running in the zone // (1 << 2) : at least one storage host is running in the zone private int flags = 0; @@ -64,6 +66,7 @@ public class RunningHostInfoAgregator { Host.Type type = Enum.valueOf(Host.Type.class, countInfo.getHostType()); if(type == Host.Type.Routing) { + zoneInfo.setFlag(ZoneHostInfo.COMPUTING_HOST_MASK); zoneInfo.setFlag(ZoneHostInfo.ROUTING_HOST_MASK); } else if(type == Host.Type.Storage || type == Host.Type.SecondaryStorage) { zoneInfo.setFlag(ZoneHostInfo.STORAGE_HOST_MASK); diff --git a/core/src/com/cloud/maid/dao/StackMaidDaoImpl.java b/core/src/com/cloud/maid/dao/StackMaidDaoImpl.java index e57afb51724..37e6404f926 100644 --- a/core/src/com/cloud/maid/dao/StackMaidDaoImpl.java +++ b/core/src/com/cloud/maid/dao/StackMaidDaoImpl.java @@ -53,7 +53,7 @@ public class StackMaidDaoImpl extends GenericDaoBase implemen @DB public StackMaidVO popCleanupDelegate(long msid) { - SearchCriteria sc = popSearch.create(); + SearchCriteria sc = popSearch.create(); sc.setParameters("msid", msid); sc.setParameters("threadId", Thread.currentThread().getId()); @@ -69,7 +69,7 @@ public class StackMaidDaoImpl extends GenericDaoBase implemen @DB public void clearStack(long msid) { - SearchCriteria sc = clearSearch.create(); + SearchCriteria sc = clearSearch.create(); sc.setParameters("msid", msid); delete(sc); diff --git a/core/src/com/cloud/network/dao/FirewallRulesDaoImpl.java b/core/src/com/cloud/network/dao/FirewallRulesDaoImpl.java index e714f351d22..a73ce47d0f8 100644 --- a/core/src/com/cloud/network/dao/FirewallRulesDaoImpl.java +++ b/core/src/com/cloud/network/dao/FirewallRulesDaoImpl.java @@ -140,7 +140,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i } public List listIPForwarding(String publicIPAddress, boolean forwarding) { - SearchCriteria sc = FWByIPAndForwardingSearch.create(); + SearchCriteria sc = FWByIPAndForwardingSearch.create(); sc.setParameters("publicIpAddress", publicIPAddress); sc.setParameters("forwarding", forwarding); return listActiveBy(sc); @@ -197,21 +197,21 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i @Override public List listIPForwarding(String publicIPAddress) { - SearchCriteria sc = FWByIPSearch.create(); + SearchCriteria sc = FWByIPSearch.create(); sc.setParameters("publicIpAddress", publicIPAddress); return listActiveBy(sc); } @Override public List listIPForwardingForUpdate(String publicIPAddress) { - SearchCriteria sc = FWByIPSearch.create(); + SearchCriteria sc = FWByIPSearch.create(); sc.setParameters("publicIpAddress", publicIPAddress); return listActiveBy(sc, null); } @Override public List listIPForwardingForUpdate(String publicIp, boolean fwding) { - SearchCriteria sc = FWByIPAndForwardingSearch.create(); + SearchCriteria sc = FWByIPAndForwardingSearch.create(); sc.setParameters("publicIpAddress", publicIp); sc.setParameters("forwarding", fwding); return search(sc, null); @@ -220,7 +220,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i @Override public List listIPForwardingForUpdate(String publicIp, String publicPort, String proto) { - SearchCriteria sc = FWByIPPortProtoSearch.create(); + SearchCriteria sc = FWByIPPortProtoSearch.create(); sc.setParameters("publicIpAddress", publicIp); sc.setParameters("publicPort", publicPort); sc.setParameters("protocol", proto); @@ -230,7 +230,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i @Override public List listLoadBalanceRulesForUpdate(String publicIp, String publicPort, String algo) { - SearchCriteria sc = FWByIPPortAlgoSearch.create(); + SearchCriteria sc = FWByIPPortAlgoSearch.create(); sc.setParameters("publicIpAddress", publicIp); sc.setParameters("publicPort", publicPort); sc.setParameters("algorithm", algo); @@ -240,7 +240,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i @Override public List listIPForwarding(String publicIPAddress, String port, boolean forwarding) { - SearchCriteria sc = FWByIPPortAndForwardingSearch.create(); + SearchCriteria sc = FWByIPPortAndForwardingSearch.create(); sc.setParameters("publicIpAddress", publicIPAddress); sc.setParameters("publicPort", port); sc.setParameters("forwarding", forwarding); @@ -266,7 +266,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i @Override public List listRulesExcludingPubIpPort(String publicIpAddress, long securityGroupId) { - SearchCriteria sc = RulesExcludingPubIpPort.create(); + SearchCriteria sc = RulesExcludingPubIpPort.create(); sc.setParameters("publicIpAddress", publicIpAddress); sc.setParameters("groupId", securityGroupId); sc.setParameters("forwarding", false); @@ -275,7 +275,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i @Override public List listBySecurityGroupId(long securityGroupId) { - SearchCriteria sc = FWByGroupId.create(); + SearchCriteria sc = FWByGroupId.create(); sc.setParameters("groupId", securityGroupId); sc.setParameters("forwarding", Boolean.TRUE); return listActiveBy(sc); @@ -283,7 +283,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i @Override public List listForwardingByPubAndPrivIp(boolean forwarding, String publicIPAddress, String privateIp) { - SearchCriteria sc = FWByIPAndForwardingSearch.create(); + SearchCriteria sc = FWByIPAndForwardingSearch.create(); sc.setParameters("publicIpAddress", publicIPAddress); sc.setParameters("forwarding", forwarding); sc.addAnd("privateIpAddress", SearchCriteria.Op.EQ, privateIp); @@ -292,7 +292,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i @Override public List listByLoadBalancerId(long loadBalancerId) { - SearchCriteria sc = FWByGroupId.create(); + SearchCriteria sc = FWByGroupId.create(); sc.setParameters("groupId", loadBalancerId); sc.setParameters("forwarding", Boolean.FALSE); return listActiveBy(sc); @@ -300,7 +300,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i @Override public FirewallRuleVO findByGroupAndPrivateIp(long groupId, String privateIp, boolean forwarding) { - SearchCriteria sc = FWByGroupAndPrivateIp.create(); + SearchCriteria sc = FWByGroupAndPrivateIp.create(); sc.setParameters("groupId", groupId); sc.setParameters("privateIpAddress", privateIp); sc.setParameters("forwarding", forwarding); diff --git a/core/src/com/cloud/network/dao/IPAddressDaoImpl.java b/core/src/com/cloud/network/dao/IPAddressDaoImpl.java index cbb58710833..2d06d3a3d8c 100644 --- a/core/src/com/cloud/network/dao/IPAddressDaoImpl.java +++ b/core/src/com/cloud/network/dao/IPAddressDaoImpl.java @@ -62,7 +62,7 @@ public class IPAddressDaoImpl extends GenericDaoBase implem } public boolean mark(long dcId, String ip) { - SearchCriteria sc = DcIpSearch.create(); + SearchCriteria sc = DcIpSearch.create(); sc.setParameters("dataCenterId", dcId); sc.setParameters("ipAddress", ip); @@ -82,7 +82,7 @@ public class IPAddressDaoImpl extends GenericDaoBase implem Transaction txn = Transaction.currentTxn(); try { txn.start(); - SearchCriteria sc = VlanDbIdSearch.create(); + SearchCriteria sc = VlanDbIdSearch.create(); sc.setParameters("vlanDbId", vlanDbId); sc.setParameters("sourceNat", sourceNat); @@ -124,7 +124,7 @@ public class IPAddressDaoImpl extends GenericDaoBase implem Transaction txn = Transaction.currentTxn(); try { txn.start(); - SearchCriteria sc = VlanDbIdSearchUnallocated.create(); + SearchCriteria sc = VlanDbIdSearchUnallocated.create(); sc.setParameters("vlanDbId", vlanDbId); IPAddressVO ip = this.lock(sc, true); @@ -170,13 +170,13 @@ public class IPAddressDaoImpl extends GenericDaoBase implem @Override public List listByAccount(long accountId) { - SearchCriteria sc = AccountSearch.create(); + SearchCriteria sc = AccountSearch.create(); sc.setParameters("accountId", accountId); return listBy(sc); } public List listByDcIdIpAddress(long dcId, String ipAddress) { - SearchCriteria sc = DcIpSearch.create(); + SearchCriteria sc = DcIpSearch.create(); sc.setParameters("dataCenterId", dcId); sc.setParameters("ipAddress", ipAddress); return listBy(sc); diff --git a/core/src/com/cloud/network/dao/LoadBalancerDaoImpl.java b/core/src/com/cloud/network/dao/LoadBalancerDaoImpl.java index 25d5eb42b33..09a3fff9a4c 100644 --- a/core/src/com/cloud/network/dao/LoadBalancerDaoImpl.java +++ b/core/src/com/cloud/network/dao/LoadBalancerDaoImpl.java @@ -87,14 +87,14 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im @Override public List listByIpAddress(String ipAddress) { - SearchCriteria sc = ListByIp.create(); + SearchCriteria sc = ListByIp.create(); sc.setParameters("ipAddress", ipAddress); return listActiveBy(sc); } @Override public LoadBalancerVO findByIpAddressAndPublicPort(String ipAddress, String publicPort) { - SearchCriteria sc = IpAndPublicPortSearch.create(); + SearchCriteria sc = IpAndPublicPortSearch.create(); sc.setParameters("ipAddress", ipAddress); sc.setParameters("publicPort", publicPort); return findOneActiveBy(sc); @@ -102,7 +102,7 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im @Override public LoadBalancerVO findByAccountAndName(Long accountId, String name) { - SearchCriteria sc = AccountAndNameSearch.create(); + SearchCriteria sc = AccountAndNameSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("name", name); return findOneActiveBy(sc); diff --git a/core/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java b/core/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java index f82dbbb7c17..82f9cedd184 100644 --- a/core/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java +++ b/core/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java @@ -18,10 +18,10 @@ package com.cloud.network.dao; -import java.util.List; - -import javax.ejb.Local; - +import java.util.List; + +import javax.ejb.Local; + import com.cloud.network.LoadBalancerVMMapVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchCriteria; @@ -31,7 +31,7 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId); delete(sc); @@ -39,7 +39,7 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase instanceIds, Boolean pending) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId); sc.addAnd("instanceId", SearchCriteria.Op.IN, instanceIds.toArray()); if (pending != null) { @@ -51,7 +51,7 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase listByInstanceId(long instanceId) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("instanceId", SearchCriteria.Op.EQ, instanceId); return listActiveBy(sc); @@ -59,7 +59,7 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase listByLoadBalancerId(long loadBalancerId) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId); return listActiveBy(sc); @@ -67,7 +67,7 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase listByLoadBalancerId(long loadBalancerId, boolean pending) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId); sc.addAnd("pending", SearchCriteria.Op.EQ, pending); diff --git a/core/src/com/cloud/network/dao/NetworkRuleConfigDaoImpl.java b/core/src/com/cloud/network/dao/NetworkRuleConfigDaoImpl.java index 1e56e3b5181..f2b0b2cef3d 100644 --- a/core/src/com/cloud/network/dao/NetworkRuleConfigDaoImpl.java +++ b/core/src/com/cloud/network/dao/NetworkRuleConfigDaoImpl.java @@ -18,10 +18,10 @@ package com.cloud.network.dao; -import java.util.List; - -import javax.ejb.Local; - +import java.util.List; + +import javax.ejb.Local; + import com.cloud.network.NetworkRuleConfigVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -38,13 +38,13 @@ public class NetworkRuleConfigDaoImpl extends GenericDaoBase listBySecurityGroupId(long securityGroupId) { - SearchCriteria sc = SecurityGroupIdSearch.create(); + SearchCriteria sc = SecurityGroupIdSearch.create(); sc.setParameters("securityGroupId", securityGroupId); return listActiveBy(sc); } public void deleteBySecurityGroup(long securityGroupId) { - SearchCriteria sc = SecurityGroupIdSearch.create(); + SearchCriteria sc = SecurityGroupIdSearch.create(); sc.setParameters("securityGroupId", securityGroupId); delete(sc); } diff --git a/core/src/com/cloud/network/dao/SecurityGroupDaoImpl.java b/core/src/com/cloud/network/dao/SecurityGroupDaoImpl.java index 3e3b68498a7..6ad4e650f84 100644 --- a/core/src/com/cloud/network/dao/SecurityGroupDaoImpl.java +++ b/core/src/com/cloud/network/dao/SecurityGroupDaoImpl.java @@ -18,11 +18,11 @@ package com.cloud.network.dao; -import java.util.ArrayList; -import java.util.List; - -import javax.ejb.Local; - +import java.util.ArrayList; +import java.util.List; + +import javax.ejb.Local; + import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.network.SecurityGroupVO; @@ -47,14 +47,14 @@ public class SecurityGroupDaoImpl extends GenericDaoBase @Override public List listByAccountId(long accountId) { - SearchCriteria sc = AccountIdSearch.create(); + SearchCriteria sc = AccountIdSearch.create(); sc.setParameters("accountId", accountId); return listActiveBy(sc); } @Override public boolean isNameInUse(Long accountId, Long domainId, String name) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("name", SearchCriteria.Op.EQ, name); if (accountId != null) { sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); @@ -72,13 +72,13 @@ public class SecurityGroupDaoImpl extends GenericDaoBase List availableGroups = new ArrayList(); if ((accountId != null) || (domainId != null)) { if (accountId != null) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); List accountGroups = listActiveBy(sc); availableGroups.addAll(accountGroups); } else if (domainId != null) { while (domainId != null) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); if (accountId != null) { sc.addAnd("accountId", SearchCriteria.Op.NEQ, accountId); // we added the account specific ones above diff --git a/core/src/com/cloud/network/dao/SecurityGroupVMMapDao.java b/core/src/com/cloud/network/dao/SecurityGroupVMMapDao.java index eabea48fe8a..67d7f3bdc8c 100644 --- a/core/src/com/cloud/network/dao/SecurityGroupVMMapDao.java +++ b/core/src/com/cloud/network/dao/SecurityGroupVMMapDao.java @@ -18,14 +18,16 @@ package com.cloud.network.dao; -import java.util.List; - +import java.util.List; + import com.cloud.network.SecurityGroupVMMapVO; import com.cloud.utils.db.GenericDao; +import com.cloud.utils.db.SearchCriteria; public interface SecurityGroupVMMapDao extends GenericDao { List listByIpAndInstanceId(String ipAddress, long instanceId); List listByInstanceId(long instanceId); List listByIp(String ipAddress); List listBySecurityGroup(long securityGroupId); + int delete(SearchCriteria sc); } diff --git a/core/src/com/cloud/network/dao/SecurityGroupVMMapDaoImpl.java b/core/src/com/cloud/network/dao/SecurityGroupVMMapDaoImpl.java index c8da6f4da18..d01970a72cf 100644 --- a/core/src/com/cloud/network/dao/SecurityGroupVMMapDaoImpl.java +++ b/core/src/com/cloud/network/dao/SecurityGroupVMMapDaoImpl.java @@ -18,10 +18,10 @@ package com.cloud.network.dao; -import java.util.List; - -import javax.ejb.Local; - +import java.util.List; + +import javax.ejb.Local; + import com.cloud.network.SecurityGroupVMMapVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -54,7 +54,7 @@ public class SecurityGroupVMMapDaoImpl extends GenericDaoBase listByIpAndInstanceId(String ipAddress, long vmId) { - SearchCriteria sc = ListByIpAndVmId.create(); + SearchCriteria sc = ListByIpAndVmId.create(); sc.setParameters("ipAddress", ipAddress); sc.setParameters("instanceId", vmId); return listActiveBy(sc); @@ -62,23 +62,27 @@ public class SecurityGroupVMMapDaoImpl extends GenericDaoBase listBySecurityGroup(long securityGroupId) { - SearchCriteria sc = ListBySecurityGroup.create(); + SearchCriteria sc = ListBySecurityGroup.create(); sc.setParameters("securityGroupId", securityGroupId); return listActiveBy(sc); } @Override public List listByIp(String ipAddress) { - SearchCriteria sc = ListByIp.create(); + SearchCriteria sc = ListByIp.create(); sc.setParameters("ipAddress", ipAddress); return listActiveBy(sc); } @Override public List listByInstanceId(long vmId) { - SearchCriteria sc = ListByVmId.create(); + SearchCriteria sc = ListByVmId.create(); sc.setParameters("instanceId", vmId); return listActiveBy(sc); } + @Override + public int delete(SearchCriteria sc) { + return super.delete(sc); + } } diff --git a/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java b/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java index 825630c1e43..c0c2e2dc1bd 100644 --- a/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java @@ -71,20 +71,20 @@ public class IngressRuleDaoImpl extends GenericDaoBase impl } public List listByNetworkGroupId(long networkGroupId) { - SearchCriteria sc = networkGroupIdSearch.create(); + SearchCriteria sc = networkGroupIdSearch.create(); sc.setParameters("networkGroupId", networkGroupId); return listActiveBy(sc); } public int deleteByNetworkGroup(long networkGroupId) { - SearchCriteria sc = networkGroupIdSearch.create(); + SearchCriteria sc = networkGroupIdSearch.create(); sc.setParameters("networkGroupId", networkGroupId); return delete(sc); } @Override public List listByAllowedNetworkGroupId(long networkGroupId) { - SearchCriteria sc = allowedNetworkGroupIdSearch.create(); + SearchCriteria sc = allowedNetworkGroupIdSearch.create(); sc.setParameters("allowedNetworkId", networkGroupId); return listActiveBy(sc); } @@ -92,7 +92,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase impl @Override public IngressRuleVO findByProtoPortsAndCidr(long networkGroupId, String proto, int startPort, int endPort, String cidr) { - SearchCriteria sc = protoPortsAndCidrSearch.create(); + SearchCriteria sc = protoPortsAndCidrSearch.create(); sc.setParameters("networkGroupId", networkGroupId); sc.setParameters("proto", proto); sc.setParameters("startPort", startPort); @@ -104,7 +104,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase impl @Override public IngressRuleVO findByProtoPortsAndGroup(String proto, int startPort, int endPort, String networkGroup) { - SearchCriteria sc = protoPortsAndNetworkGroupNameSearch.create(); + SearchCriteria sc = protoPortsAndNetworkGroupNameSearch.create(); sc.setParameters("proto", proto); sc.setParameters("startPort", startPort); sc.setParameters("endPort", endPort); @@ -128,7 +128,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase impl @Override public int deleteByPortProtoAndGroup(long networkGroupId, String protocol, int startPort, int endPort, Long allowedGroupId) { - SearchCriteria sc = protoPortsAndNetworkGroupIdSearch.create(); + SearchCriteria sc = protoPortsAndNetworkGroupIdSearch.create(); sc.setParameters("networkGroupId", networkGroupId); sc.setParameters("proto", protocol); sc.setParameters("startPort", startPort); @@ -141,7 +141,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase impl @Override public int deleteByPortProtoAndCidr(long networkGroupId, String protocol, int startPort, int endPort, String cidr) { - SearchCriteria sc = protoPortsAndCidrSearch.create(); + SearchCriteria sc = protoPortsAndCidrSearch.create(); sc.setParameters("networkGroupId", networkGroupId); sc.setParameters("proto", protocol); sc.setParameters("startPort", startPort); @@ -154,7 +154,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase impl @Override public IngressRuleVO findByProtoPortsAndAllowedGroupId(long networkGroupId, String proto, int startPort, int endPort, Long allowedGroupId) { - SearchCriteria sc = protoPortsAndNetworkGroupIdSearch.create(); + SearchCriteria sc = protoPortsAndNetworkGroupIdSearch.create(); sc.addAnd("networkGroupId", SearchCriteria.Op.EQ, networkGroupId); sc.setParameters("proto", proto); sc.setParameters("startPort", startPort); diff --git a/core/src/com/cloud/network/security/dao/NetworkGroupDaoImpl.java b/core/src/com/cloud/network/security/dao/NetworkGroupDaoImpl.java index 2513eba3b00..13984f692f7 100644 --- a/core/src/com/cloud/network/security/dao/NetworkGroupDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/NetworkGroupDaoImpl.java @@ -60,14 +60,14 @@ public class NetworkGroupDaoImpl extends GenericDaoBase im @Override public List listByAccountId(long accountId) { - SearchCriteria sc = AccountIdSearch.create(); + SearchCriteria sc = AccountIdSearch.create(); sc.setParameters("accountId", accountId); return listActiveBy(sc); } @Override public boolean isNameInUse(Long accountId, Long domainId, String name) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("name", SearchCriteria.Op.EQ, name); if (accountId != null) { sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); @@ -85,13 +85,13 @@ public class NetworkGroupDaoImpl extends GenericDaoBase im List availableGroups = new ArrayList(); if ((accountId != null) || (domainId != null)) { if (accountId != null) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); List accountGroups = listActiveBy(sc); availableGroups.addAll(accountGroups); } else if (domainId != null) { while (domainId != null) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); if (accountId != null) { sc.addAnd("accountId", SearchCriteria.Op.NEQ, accountId); // we added the account specific ones above @@ -110,7 +110,7 @@ public class NetworkGroupDaoImpl extends GenericDaoBase im @Override public NetworkGroupVO findByAccountAndName(Long accountId, String name) { - SearchCriteria sc = AccountIdNameSearch.create(); + SearchCriteria sc = AccountIdNameSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("groupName", name); @@ -119,7 +119,7 @@ public class NetworkGroupDaoImpl extends GenericDaoBase im @Override public List findByAccountAndNames(Long accountId, String... names) { - SearchCriteria sc = AccountIdNamesSearch.create(); + SearchCriteria sc = AccountIdNamesSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("groupNames", (Object [])names); diff --git a/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java b/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java index 391771571a3..4db0858334e 100644 --- a/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java @@ -43,7 +43,7 @@ public class NetworkGroupRulesDaoImpl extends GenericDaoBase listNetworkGroupRules(long accountId, String groupName) { Filter searchFilter = new Filter(NetworkGroupRulesVO.class, "id", true, null, null); - SearchCriteria sc = AccountGroupNameSearch.create(); + SearchCriteria sc = AccountGroupNameSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("name", groupName); @@ -53,7 +53,7 @@ public class NetworkGroupRulesDaoImpl extends GenericDaoBase listNetworkGroupRules(long accountId) { Filter searchFilter = new Filter(NetworkGroupRulesVO.class, "id", true, null, null); - SearchCriteria sc = AccountSearch.create(); + SearchCriteria sc = AccountSearch.create(); sc.setParameters("accountId", accountId); return listActiveBy(sc, searchFilter); @@ -75,7 +75,7 @@ public class NetworkGroupRulesDaoImpl extends GenericDaoBase sc = DomainSearch.create(); + SearchCriteria sc = DomainSearch.create(); if (!recursive) { sc.setParameters("domainId", domainId); diff --git a/core/src/com/cloud/network/security/dao/NetworkGroupVMMapDaoImpl.java b/core/src/com/cloud/network/security/dao/NetworkGroupVMMapDaoImpl.java index fd985e134c8..90d919b9216 100644 --- a/core/src/com/cloud/network/security/dao/NetworkGroupVMMapDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/NetworkGroupVMMapDaoImpl.java @@ -18,13 +18,14 @@ package com.cloud.network.security.dao; +import java.math.BigInteger; +import java.util.ArrayList; import java.util.List; import javax.ejb.Local; import com.cloud.network.security.NetworkGroupVMMapVO; import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.vm.State; @@ -35,7 +36,7 @@ public class NetworkGroupVMMapDaoImpl extends GenericDaoBase ListByVmId; private SearchBuilder ListByVmIdGroupId; - private GenericSearchBuilder ListVmIdByNetworkGroup; + private SearchBuilder ListVmIdByNetworkGroup; private SearchBuilder ListByIp; private SearchBuilder ListByNetworkGroup; @@ -47,7 +48,7 @@ public class NetworkGroupVMMapDaoImpl extends GenericDaoBase listByIpAndInstanceId(String ipAddress, long vmId) { - SearchCriteria sc = ListByIpAndVmId.create(); + SearchCriteria sc = ListByIpAndVmId.create(); sc.setParameters("ipAddress", ipAddress); sc.setParameters("instanceId", vmId); return listActiveBy(sc); @@ -84,35 +85,35 @@ public class NetworkGroupVMMapDaoImpl extends GenericDaoBase listByNetworkGroup(long networkGroupId) { - SearchCriteria sc = ListByNetworkGroup.create(); + SearchCriteria sc = ListByNetworkGroup.create(); sc.setParameters("networkGroupId", networkGroupId); return listActiveBy(sc); } @Override public List listByIp(String ipAddress) { - SearchCriteria sc = ListByIp.create(); + SearchCriteria sc = ListByIp.create(); sc.setParameters("ipAddress", ipAddress); return listActiveBy(sc); } @Override public List listByInstanceId(long vmId) { - SearchCriteria sc = ListByVmId.create(); + SearchCriteria sc = ListByVmId.create(); sc.setParameters("instanceId", vmId); return listActiveBy(sc); } @Override public int deleteVM(long instanceId) { - SearchCriteria sc = ListByVmId.create(); + SearchCriteria sc = ListByVmId.create(); sc.setParameters("instanceId", instanceId); return super.delete(sc); } @Override public List listByNetworkGroup(long networkGroupId, State... vmStates) { - SearchCriteria sc = ListByNetworkGroupAndStates.create(); + SearchCriteria sc = ListByNetworkGroupAndStates.create(); sc.setParameters("networkGroupId", networkGroupId); sc.setParameters("states", (Object[])vmStates); return listActiveBy(sc); @@ -120,14 +121,20 @@ public class NetworkGroupVMMapDaoImpl extends GenericDaoBase listVmIdsByNetworkGroup(long networkGroupId) { - SearchCriteria sc = ListVmIdByNetworkGroup.create(); + SearchCriteria sc = ListVmIdByNetworkGroup.create(); sc.setParameters("networkGroupId", networkGroupId); - return searchAll(sc, null); + List searchResult = this.searchAll(sc, null); + List result = new ArrayList(searchResult.size()); + for (Object[] r: searchResult){ + result.add(((BigInteger)r[0]).longValue()); + } + return result; } @Override - public NetworkGroupVMMapVO findByVmIdGroupId(long instanceId, long networkGroupId) { - SearchCriteria sc = ListByVmIdGroupId.create(); + public NetworkGroupVMMapVO findByVmIdGroupId(long instanceId, + long networkGroupId) { + SearchCriteria sc = ListByVmIdGroupId.create(); sc.setParameters("networkGroupId", networkGroupId); sc.setParameters("instanceId", instanceId); return findOneBy(sc); diff --git a/core/src/com/cloud/network/security/dao/NetworkGroupWorkDaoImpl.java b/core/src/com/cloud/network/security/dao/NetworkGroupWorkDaoImpl.java index 34f219d132a..4ae435fbec3 100644 --- a/core/src/com/cloud/network/security/dao/NetworkGroupWorkDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/NetworkGroupWorkDaoImpl.java @@ -87,7 +87,7 @@ public class NetworkGroupWorkDaoImpl extends GenericDaoBase sc = taken?VmIdTakenSearch.create():VmIdUnTakenSearch.create(); + SearchCriteria sc = taken?VmIdTakenSearch.create():VmIdUnTakenSearch.create(); sc.setParameters("vmId", vmId); return findOneBy(sc); } @@ -96,7 +96,7 @@ public class NetworkGroupWorkDaoImpl extends GenericDaoBase sc = UntakenWorkSearch.create(); + final SearchCriteria sc = UntakenWorkSearch.create(); sc.setParameters("step", Step.Scheduled); final Filter filter = new Filter(NetworkGroupWorkVO.class, null, true, 0l, 1l);//FIXME: order desc by update time? @@ -138,7 +138,7 @@ public class NetworkGroupWorkDaoImpl extends GenericDaoBase sc = VmIdSeqNumSearch.create(); + SearchCriteria sc = VmIdSeqNumSearch.create(); sc.setParameters("vmId", vmId); sc.setParameters("seqno", logSequenceNumber); @@ -158,7 +158,7 @@ public class NetworkGroupWorkDaoImpl extends GenericDaoBase sc = VmIdStepSearch.create(); + SearchCriteria sc = VmIdStepSearch.create(); sc.setParameters("vmId", vmId); sc.setParameters("step", step); return findOneBy(sc); @@ -183,7 +183,7 @@ public class NetworkGroupWorkDaoImpl extends GenericDaoBase sc = CleanupSearch.create(); + final SearchCriteria sc = CleanupSearch.create(); sc.setParameters("taken", timeBefore); sc.setParameters("step", Step.Done); @@ -192,7 +192,7 @@ public class NetworkGroupWorkDaoImpl extends GenericDaoBase findUnfinishedWork(Date timeBefore) { - final SearchCriteria sc = CleanupSearch.create(); + final SearchCriteria sc = CleanupSearch.create(); sc.setParameters("taken", timeBefore); sc.setParameters("step", Step.Processing); diff --git a/core/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java b/core/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java index 469012ed53b..5793b097787 100644 --- a/core/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java @@ -40,7 +40,7 @@ public class VmRulesetLogDaoImpl extends GenericDaoBase im @Override public VmRulesetLogVO findByVmId(long vmId) { - SearchCriteria sc = VmIdSearch.create(); + SearchCriteria sc = VmIdSearch.create(); sc.setParameters("vmId", vmId); return findOneBy(sc); } diff --git a/core/src/com/cloud/offerings/NetworkOfferingVO.java b/core/src/com/cloud/offerings/NetworkOfferingVO.java deleted file mode 100644 index 26ad13b8c13..00000000000 --- a/core/src/com/cloud/offerings/NetworkOfferingVO.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.cloud.offerings; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import com.cloud.offering.NetworkOffering; - -@Entity -@Table(name="network_offerings") -public class NetworkOfferingVO implements NetworkOffering { - @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) - @Column(name="id") - long id; - - @Column(name="name") - String name; - - @Column(name="display_text") - String displayText; - - @Column(name="rate") - Integer rateMbps; - - @Column(name="multicast_rate") - Integer multicastRateMbps; - - @Column(name="concurrent_connections") - Integer concurrentConnections; - - @Column(name="type") - @Enumerated(value=EnumType.STRING) - GuestIpType guestIpType; - - @Override - public String getDisplayText() { - return displayText; - } - - @Override - public GuestIpType getGuestIpType() { - return guestIpType; - } - - @Override - public long getId() { - return id; - } - - @Override - public Integer getMulticastRateMbps() { - return multicastRateMbps; - } - - @Override - public String getName() { - return name; - } - - @Override - public Integer getRateMbps() { - return rateMbps; - } - - public NetworkOfferingVO() { - } - - public NetworkOfferingVO(String name, String displayText, GuestIpType type, Integer rateMbps, Integer multicastRateMbps, Integer concurrentConnections) { - this.name = name; - this.displayText = displayText; - this.guestIpType = type; - this.rateMbps = rateMbps; - this.multicastRateMbps = multicastRateMbps; - this.concurrentConnections = concurrentConnections; - } - - @Override - public Integer getConcurrentConnections() { - return concurrentConnections; - } - -} diff --git a/core/src/com/cloud/pricing/PricingVO.java b/core/src/com/cloud/pricing/PricingVO.java new file mode 100644 index 00000000000..553e7604c72 --- /dev/null +++ b/core/src/com/cloud/pricing/PricingVO.java @@ -0,0 +1,100 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.pricing; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import com.cloud.utils.db.GenericDao; + +@Entity +@Table(name=("pricing")) +public class PricingVO { + public static final String PRICE_UNIT_HOURLY = "per hour"; + public static final String PRICE_UNIT_DAILY = "per day"; + public static final String PRICE_UNIT_WEEKLY = "per week"; + public static final String PRICE_UNIT_MONTHLY = "per month"; + public static final String PRICE_UNIT_MB = "per MB"; + public static final String PRICE_UNIT_GB = "per GB"; + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="id") + private Long id = (long)-1; + + @Column(name="price") + private float price = 0f; + + @Column(name="price_unit") + private String priceUnit = PRICE_UNIT_HOURLY; + + @Column(name="type") + private String type; + + @Column(name="type_id") + private Long typeId; + + @Column(name=GenericDao.CREATED_COLUMN) + Date created; + + public PricingVO() { + } + + public PricingVO(Long id, float price, String priceUnit, String type, Long typeId, Date created) { + this.id = id; + this.price = price; + this.priceUnit = priceUnit; + this.type = type; + this.typeId = typeId; + this.created = created; + } + public PricingVO(float price, String priceUnit, String type, Long typeId, Date created) { + this(null, price, priceUnit, type, typeId, created); + } + + public Long getId() { + return id; + } + + public float getPrice() { + return price; + } + + public String getPriceUnit() { + return priceUnit; + } + + public String getType() { + return type; + } + + public Long getTypeId() { + return typeId; + } + + public Date getCreated() { + return created; + } +} diff --git a/core/src/com/cloud/pricing/dao/PricingDao.java b/core/src/com/cloud/pricing/dao/PricingDao.java new file mode 100644 index 00000000000..50a162f6f1e --- /dev/null +++ b/core/src/com/cloud/pricing/dao/PricingDao.java @@ -0,0 +1,27 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.pricing.dao; + +import com.cloud.pricing.PricingVO; +import com.cloud.utils.db.GenericDao; + +public interface PricingDao extends GenericDao { + public PricingVO findByTypeAndId(String type, Long typeId); + public void update(PricingVO pricing); +} diff --git a/core/src/com/cloud/pricing/dao/PricingDaoImpl.java b/core/src/com/cloud/pricing/dao/PricingDaoImpl.java new file mode 100644 index 00000000000..5295522eef8 --- /dev/null +++ b/core/src/com/cloud/pricing/dao/PricingDaoImpl.java @@ -0,0 +1,88 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.pricing.dao; + +import java.sql.PreparedStatement; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + +import com.cloud.pricing.PricingVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; + +@Local(value={PricingDao.class}) +public class PricingDaoImpl extends GenericDaoBase implements PricingDao { + private static final Logger s_logger = Logger.getLogger(PricingDaoImpl.class); + protected SearchBuilder TypeAndIdSearch; + protected SearchBuilder TypeSearch; + + protected static final String UPDATE_PRICING_SQL = + "UPDATE pricing SET price = ?, price_unit = ? " + + "WHERE type = ?"; + + public PricingDaoImpl() { + TypeAndIdSearch = createSearchBuilder(); + TypeAndIdSearch.and("type", TypeAndIdSearch.entity().getType(), SearchCriteria.Op.EQ); + TypeAndIdSearch.and("typeId", TypeAndIdSearch.entity().getTypeId(), SearchCriteria.Op.EQ); + + TypeSearch = createSearchBuilder(); + TypeSearch.and("type", TypeSearch.entity().getType(), SearchCriteria.Op.EQ); + } + + public PricingVO findByTypeAndId(String type, Long typeId) { + if (typeId == null) { + SearchCriteria sc = TypeSearch.create(); + sc.setParameters("type", type); + return findOneBy(sc); + } else { + SearchCriteria sc = TypeAndIdSearch.create(); + sc.setParameters("type", type); + sc.setParameters("typeId", typeId); + return findOneBy(sc); + } + } + + public void update(PricingVO pricing) { + Transaction txn = Transaction.currentTxn(); + PreparedStatement pstmt = null; + try { + String sql = UPDATE_PRICING_SQL; + boolean useTypeId = false; + if (pricing.getTypeId() != null) { + useTypeId = true; + sql = sql + " AND type_id = ?"; + } + pstmt = txn.prepareAutoCloseStatement(sql); + pstmt.setFloat(1, pricing.getPrice()); + pstmt.setString(2, pricing.getPriceUnit()); + pstmt.setString(3, pricing.getType()); + + if (useTypeId) { + pstmt.setLong(4, pricing.getTypeId()); + } + pstmt.executeUpdate(); + } catch (Exception e) { + s_logger.warn(e); + } + } +} diff --git a/core/src/com/cloud/server/Criteria.java b/core/src/com/cloud/server/Criteria.java index f2d7090341c..ceb0ab785e1 100644 --- a/core/src/com/cloud/server/Criteria.java +++ b/core/src/com/cloud/server/Criteria.java @@ -36,9 +36,7 @@ public class Criteria { public static final String DATACENTERID = "dataCenterId"; public static final String DESCRIPTION = "description"; public static final String PODID = "podId"; - public static final String CLUSTERID = "clusterId"; public static final String HOSTID = "hostId"; - public static final String OSCATEGORYID = "osCategoryId"; public static final String PODNAME = "podName"; public static final String ZONENAME = "zoneName"; public static final String HOSTNAME = "hostName"; diff --git a/core/src/com/cloud/server/ManagementServer.java b/core/src/com/cloud/server/ManagementServer.java index 150b99ae651..bc83aa15785 100644 --- a/core/src/com/cloud/server/ManagementServer.java +++ b/core/src/com/cloud/server/ManagementServer.java @@ -42,7 +42,6 @@ import com.cloud.event.EventVO; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.DiscoveryException; import com.cloud.exception.InsufficientAddressCapacityException; -import com.cloud.exception.InsufficientStorageCapacityException; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.NetworkRuleConflictException; @@ -62,12 +61,14 @@ import com.cloud.network.SecurityGroupVO; import com.cloud.network.security.IngressRuleVO; import com.cloud.network.security.NetworkGroupRulesVO; import com.cloud.network.security.NetworkGroupVO; +import com.cloud.pricing.PricingVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.DiskTemplateVO; import com.cloud.storage.GuestOS; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.storage.GuestOSVO; +import com.cloud.storage.InsufficientStorageCapacityException; import com.cloud.storage.Snapshot; import com.cloud.storage.SnapshotPolicyVO; import com.cloud.storage.SnapshotScheduleVO; @@ -86,13 +87,13 @@ import com.cloud.user.User; import com.cloud.user.UserAccount; import com.cloud.user.UserAccountVO; import com.cloud.user.UserStatisticsVO; -import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.utils.exception.ExecutionException; import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.DomainRouter; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.SecondaryStorageVmVO; +import com.cloud.vm.UserVm; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; @@ -355,25 +356,6 @@ public interface ManagementServer { boolean prepareForMaintenance(long hostId); long prepareForMaintenanceAsync(long hostId) throws InvalidParameterValueException; - /** - * prepares a primary storage for maintenance. - * - * @param primaryStorageId id of the storage to bring down. - * @return true if the operation succeeds. - */ - boolean preparePrimaryStorageForMaintenance(long primaryStorageId, long userId); - long preparePrimaryStorageForMaintenanceAsync(long primaryStorageId) throws InvalidParameterValueException; - - /** - * cancels primary storage from maintenance. - * - * @param primaryStorageId id of the storage to bring up. - * @return true if the operation succeeds. - */ - boolean cancelPrimaryStorageMaintenance(long primaryStorageId, long userId); - long cancelPrimaryStorageMaintenanceAsync(long primaryStorageId) throws InvalidParameterValueException; - - /** * Marks the host as maintenance completed. This actually will mark * the host as down and the state will be changed automatically once @@ -944,6 +926,15 @@ public interface ManagementServer { */ List listTemplateHostBy(long templateId, Long zoneId); + /** + * Locates a Pricing object by the query parameters + * + * @param type + * @param id + * @return Pricing object + */ + PricingVO findPricingByTypeAndId(String type, Long id); + /** * Obtains pods that match the data center ID * @param dataCenterId @@ -967,6 +958,18 @@ public interface ManagementServer { */ ServiceOfferingVO createServiceOffering(long userId, String name, int cpu, int ramSize, int speed, String displayText, boolean localStorageRequired, boolean offerHA, boolean useVirtualNetwork, String tags); + /** + * Persists a pricing object + * @param id + * @param price + * @param priceUnit + * @param type + * @param typeId + * @param created + * @return ID of the new pricing object + */ + Long createPricing(Long id, float price, String priceUnit, String type, Long typeId, Date created); + /** * Updates a service offering * @param userId @@ -980,6 +983,17 @@ public interface ManagementServer { */ ServiceOfferingVO updateServiceOffering(long userId, long serviceOfferingId, String name, String displayText, Boolean offerHA, Boolean useVirtualNetwork, String tags); + /** + * Updates a pricing object + * @param id + * @param price + * @param priceUnit + * @pram type + * @param typeId + * @param created + */ + // void updatePricing(Long id, float price, String priceUnit, String type, Long typeId, Date created); + /** * Deletes a service offering * @param userId @@ -1420,13 +1434,13 @@ public interface ManagementServer { * Obtains a list of all guest OS. * @return list of GuestOS */ - List listGuestOSByCriteria(Criteria c); + List listAllGuestOS(); /** * Obtains a list of all guest OS categories. * @return list of GuestOSCategories */ - List listGuestOSCategoriesByCriteria(Criteria c); + List listAllGuestOSCategories(); /** * Logs out a user @@ -1434,6 +1448,16 @@ public interface ManagementServer { */ void logoutUser(Long userId); + /** + * Updates a template pricing. + * @param userId + * @param id + * @param price + * @return if the update was successful, this method will return an empty string. if the method was not successful, + * the method will return a descriptive error message. + */ + String updateTemplatePricing(long userId, Long id, float price); + /** * Updates a configuration value. * @param userId @@ -1827,7 +1851,7 @@ public interface ManagementServer { * @param tags Comma separated string to indicate special tags for the disk offering. * @return the created disk offering, null if failed to create */ - DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException; + DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, boolean mirrored, String tags) throws InvalidParameterValueException; /** * Delete a disk offering @@ -1991,7 +2015,7 @@ public interface ManagementServer { long updateLoadBalancerRuleAsync(long userId, long accountId, long loadBalancerId, String name, String description, String privatePort, String algorithm); void assignToLoadBalancer(long userId, long loadBalancerId, List instanceIds) throws NetworkRuleConflictException, InternalErrorException, PermissionDeniedException, InvalidParameterValueException; - long assignToLoadBalancerAsync(/*long userId, long loadBalancerId, List instanceIds, */Map params); + long assignToLoadBalancerAsync(long userId, long loadBalancerId, List instanceIds); boolean removeFromLoadBalancer(long userId, long loadBalancerId, List instanceIds) throws InvalidParameterValueException; long removeFromLoadBalancerAsync(long userId, long loadBalancerId, List instanceIds); @@ -2157,20 +2181,4 @@ public interface ManagementServer { public List getPreAllocatedLuns(Criteria c); public String getNetworkGroupsNamesForVm(long vmId); - - /** - * Persists the Event as a completed event. - * @return EventId of the persisted event - */ - public Long saveEvent(Long userId, Long accountId, String level, String type, String description, String params, long startEventId); - - /** - * Persists the Event as a Started event. - * @return EventId of the persisted event - */ - public Long saveStartedEvent(Long userId, Long accountId, String type, String description, long startEventId); - - boolean checkLocalStorageConfigVal(); - - boolean addConfig(String instance, String component, String category, String name, String value, String description); } diff --git a/core/src/com/cloud/service/ServiceOffering.java b/core/src/com/cloud/service/ServiceOffering.java new file mode 100755 index 00000000000..8160e1a3a97 --- /dev/null +++ b/core/src/com/cloud/service/ServiceOffering.java @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.service; + +/** + * ServiceOffering models the different types of service contracts to be + * offered. + */ +public interface ServiceOffering { + public enum GuestIpType { + Virtualized, + DirectSingle, + DirectDual + } + + /** + * @return user readable description + */ + String getName(); + + /** + * @return # of cpu. + */ + int getCpu(); + + /** + * @return speed in mhz + */ + int getSpeed(); + + /** + * @return ram size in megabytes + */ + int getRamSize(); + + /** + * @return Does this service plan offer HA? + */ + boolean getOfferHA(); + + /** + * @return the rate in megabits per sec to which a VM's network interface is throttled to + */ + int getRateMbps(); + + /** + * @return the rate megabits per sec to which a VM's multicast&broadcast traffic is throttled to + */ + int getMulticastRateMbps(); + + /** + * @return the type of IP address to allocate as the primary ip address to a guest + */ + GuestIpType getGuestIpType(); + + /** + * @return whether or not the service offering requires local storage + */ + boolean getUseLocalStorage(); + +} diff --git a/core/src/com/cloud/service/ServiceOfferingVO.java b/core/src/com/cloud/service/ServiceOfferingVO.java index 8466ce82914..6dc20a91c22 100644 --- a/core/src/com/cloud/service/ServiceOfferingVO.java +++ b/core/src/com/cloud/service/ServiceOfferingVO.java @@ -27,7 +27,6 @@ import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; import javax.persistence.Transient; -import com.cloud.offering.ServiceOffering; import com.cloud.storage.DiskOfferingVO; @Entity diff --git a/core/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java b/core/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java index 33ef7cc064c..ab244d5de90 100644 --- a/core/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java +++ b/core/src/com/cloud/service/dao/ServiceOfferingDaoImpl.java @@ -47,7 +47,7 @@ public class ServiceOfferingDaoImpl extends GenericDaoBase sc = UniqueNameSearch.create(); + SearchCriteria sc = UniqueNameSearch.create(); sc.setParameters("name", name); List vos = searchAll(sc, null, null, false); if (vos.size() == 0) { diff --git a/core/src/com/cloud/storage/DiskOfferingVO.java b/core/src/com/cloud/storage/DiskOfferingVO.java index e6f7d408072..efc6f50c6d2 100644 --- a/core/src/com/cloud/storage/DiskOfferingVO.java +++ b/core/src/com/cloud/storage/DiskOfferingVO.java @@ -33,14 +33,13 @@ import javax.persistence.InheritanceType; import javax.persistence.Table; import javax.persistence.Transient; -import com.cloud.offering.DiskOffering; import com.cloud.utils.db.GenericDao; @Entity @Table(name="disk_offering") @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING, length=32) -public class DiskOfferingVO implements DiskOffering { +public class DiskOfferingVO { public enum Type { Disk, Service @@ -91,11 +90,12 @@ public class DiskOfferingVO implements DiskOffering { public DiskOfferingVO() { } - public DiskOfferingVO(long domainId, String name, String displayText, long diskSize, String tags) { + public DiskOfferingVO(long domainId, String name, String displayText, long diskSize, boolean mirrored, String tags) { this.domainId = domainId; this.name = name; this.displayText = displayText; - this.diskSize = diskSize; + this.diskSize = diskSize; + this.mirrored = mirrored; this.tags = tags; this.recreatable = false; this.type = Type.Disk; @@ -113,7 +113,7 @@ public class DiskOfferingVO implements DiskOffering { this.useLocalStorage = useLocalStorage; } - public long getId() { + public Long getId() { return id; } diff --git a/server/src/com/cloud/vm/VmManager.java b/core/src/com/cloud/storage/InsufficientStorageCapacityException.java old mode 100644 new mode 100755 similarity index 59% rename from server/src/com/cloud/vm/VmManager.java rename to core/src/com/cloud/storage/InsufficientStorageCapacityException.java index 115bb18936b..3b2616bce27 --- a/server/src/com/cloud/vm/VmManager.java +++ b/core/src/com/cloud/storage/InsufficientStorageCapacityException.java @@ -1,7 +1,7 @@ /** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. * - * This software is licensed under the GNU General Public License v3 or later. + * This software is licensed under the GNU General Public License v3 or later. * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,28 +15,20 @@ * along with this program. If not, see . * */ -package com.cloud.vm; +package com.cloud.storage; -import com.cloud.offerings.NetworkOfferingVO; -import com.cloud.service.ServiceOfferingVO; -import com.cloud.storage.DiskOfferingVO; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.utils.SerialVersionUID; /** - * Manages allocating resources to vms. + * InsufficientStorageCapcityException is thrown when there's not enough + * storage space to create the VM. */ -public interface VmManager { +public class InsufficientStorageCapacityException extends InsufficientCapacityException { - VMInstanceVO allocate(VMInstanceVO vm, - ServiceOfferingVO serviceOffering, - NetworkOfferingVO[] networkOfferings, - DiskOfferingVO[] diskOffering); - - void create(VMInstanceVO vm); - - void start(); - - void stop(); - - void destroy(); + private static final long serialVersionUID = SerialVersionUID.InsufficientStorageCapacityException; + public InsufficientStorageCapacityException(String msg) { + super(msg); + } } diff --git a/core/src/com/cloud/storage/Storage.java b/core/src/com/cloud/storage/Storage.java new file mode 100644 index 00000000000..08eccfeb8ff --- /dev/null +++ b/core/src/com/cloud/storage/Storage.java @@ -0,0 +1,87 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.storage; + +public class Storage { + public enum ImageFormat { + QCOW2(true, true, false), + RAW(false, false, false), + VHD(true, true, true), + ISO(false, false, false); + + private final boolean thinProvisioned; + private final boolean supportSparse; + private final boolean supportSnapshot; + + private ImageFormat(boolean thinProvisioned, boolean supportSparse, boolean supportSnapshot) { + this.thinProvisioned = thinProvisioned; + this.supportSparse = supportSparse; + this.supportSnapshot = supportSnapshot; + } + + public boolean isThinProvisioned() { + return thinProvisioned; + } + + public boolean supportsSparse() { + return supportSparse; + } + + public boolean supportSnapshot() { + return supportSnapshot; + } + + public String getFileExtension() { + return toString().toLowerCase(); + } + } + + public enum FileSystem { + Unknown, + ext3, + ntfs, + fat, + fat32, + ext2, + ext4, + cdfs, + hpfs, + ufs, + hfs, + hfsp + } + + public enum StoragePoolType { + Filesystem(false), //local directory + NetworkFilesystem(true), //NFS or CIFS + IscsiLUN(true), //shared LUN, with a clusterfs overlay + Iscsi(true), //for e.g., ZFS Comstar + ISO(false), // for iso image + LVM(false); // XenServer local LVM SR + + boolean shared; + + StoragePoolType(boolean shared) { + this.shared = shared; + } + + public boolean isShared() { + return shared; + } + } +} diff --git a/core/src/com/cloud/storage/StorageManager.java b/core/src/com/cloud/storage/StorageManager.java index 0cb04e20eaa..c273f39bcf6 100644 --- a/core/src/com/cloud/storage/StorageManager.java +++ b/core/src/com/cloud/storage/StorageManager.java @@ -272,15 +272,4 @@ public interface StorageManager extends Manager { */ VolumeVO createVolumeFromSnapshot(long userId, long accountId, long snapshotId, String volumeName, long startEventId); - /** - * Enable maintenance for primary storage - * @return - */ - public boolean preparePrimaryStorageForMaintenance(long primaryStorageId, long userId); - - /** - * Complete maintenance for primary storage - * @return - */ - public boolean cancelPrimaryStorageForMaintenance(long primaryStorageId, long userId); } diff --git a/core/src/com/cloud/storage/StoragePool.java b/core/src/com/cloud/storage/StoragePool.java index 2c06aba7628..b5e502af68c 100644 --- a/core/src/com/cloud/storage/StoragePool.java +++ b/core/src/com/cloud/storage/StoragePool.java @@ -19,7 +19,6 @@ package com.cloud.storage; import java.util.Date; -import com.cloud.host.Status; import com.cloud.storage.Storage.StoragePoolType; /** @@ -96,9 +95,4 @@ public interface StoragePool { * @return the storage pool represents a local storage resource */ boolean isLocal(); - - /** - * @return the storage pool status - */ - Status getStatus(); } diff --git a/core/src/com/cloud/storage/StoragePoolVO.java b/core/src/com/cloud/storage/StoragePoolVO.java index 41cabb559b7..3aa9fcb4c5e 100644 --- a/core/src/com/cloud/storage/StoragePoolVO.java +++ b/core/src/com/cloud/storage/StoragePoolVO.java @@ -30,7 +30,6 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; -import com.cloud.host.Status; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.utils.db.GenericDao; @@ -78,18 +77,9 @@ public class StoragePoolVO implements StoragePool { @Column(name="capacity_bytes", updatable=true, nullable=true) private long capacityBytes; - @Column(name="status", updatable=true, nullable=false) - @Enumerated(value=EnumType.STRING) - private Status status; - public long getId() { return id; } - - @Override - public Status getStatus() { - return status; - } public StoragePoolVO() { // TODO Auto-generated constructor stub @@ -190,11 +180,6 @@ public class StoragePoolVO implements StoragePool { this.path = path; } - public void setStatus(Status status) - { - this.status = status; - } - public void setId(long id) { this.id = id; } diff --git a/core/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java b/core/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java index edc797e1541..ef9e3cfd474 100644 --- a/core/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java +++ b/core/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java @@ -50,20 +50,20 @@ public class DiskOfferingDaoImpl extends GenericDaoBase im @Override public List listByDomainId(long domainId) { - SearchCriteria sc = DomainIdSearch.create(); + SearchCriteria sc = DomainIdSearch.create(); sc.setParameters("domainId", domainId); // FIXME: this should not be exact match, but instead should find all available disk offerings from parent domains return listActiveBy(sc); } @Override - public List searchAll(SearchCriteria sc, final Filter filter, final Boolean lock, final boolean cache) { + public List searchAll(SearchCriteria sc, final Filter filter, final Boolean lock, final boolean cache) { sc.addAnd(_typeAttr, Op.EQ, Type.Disk); return super.searchAll(sc, filter, lock, cache); } @Override - public List searchAll(SearchCriteria sc, final Filter filter) { + public List searchAll(SearchCriteria sc, final Filter filter) { sc.addAnd(_typeAttr, Op.EQ, Type.Disk); return super.searchAll(sc, filter); } diff --git a/core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java b/core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java index 4b2a4b96ab0..9c88fe43dbd 100755 --- a/core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java +++ b/core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java @@ -26,6 +26,10 @@ import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +/** + * @author ahuang + * + */ @Local(value={DiskTemplateDao.class}) public class DiskTemplateDaoImpl extends GenericDaoBase implements DiskTemplateDao { @@ -42,7 +46,7 @@ public class DiskTemplateDaoImpl extends GenericDaoBase im } public DiskTemplateVO findByTypeAndSize(String type, long size) { - SearchCriteria sc = TypeSizeSearch.create(); + SearchCriteria sc = TypeSizeSearch.create(); sc.setParameters("type", type); sc.setParameters("size", size); diff --git a/core/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java b/core/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java index f3b076619bb..06ef93d0b2f 100644 --- a/core/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java +++ b/core/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java @@ -38,6 +38,7 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.storage.Storage; @Local(value={LaunchPermissionDao.class}) public class LaunchPermissionDaoImpl extends GenericDaoBase implements LaunchPermissionDao { @@ -90,14 +91,14 @@ public class LaunchPermissionDaoImpl extends GenericDaoBase sc = TemplateIdSearch.create(); + SearchCriteria sc = TemplateIdSearch.create(); sc.setParameters("templateId", templateId); delete(sc); } @Override public LaunchPermissionVO findByTemplateAndAccount(long templateId, long accountId) { - SearchCriteria sc = TemplateAndAccountSearch.create(); + SearchCriteria sc = TemplateAndAccountSearch.create(); sc.setParameters("templateId", templateId); sc.setParameters("accountId", accountId); return findOneActiveBy(sc); @@ -151,7 +152,7 @@ public class LaunchPermissionDaoImpl extends GenericDaoBase findByTemplate(long templateId) { - SearchCriteria sc = TemplateIdSearch.create(); + SearchCriteria sc = TemplateIdSearch.create(); sc.setParameters("templateId", templateId); return listActiveBy(sc); } diff --git a/core/src/com/cloud/storage/dao/SnapshotDaoImpl.java b/core/src/com/cloud/storage/dao/SnapshotDaoImpl.java index 4ca3e303b7d..9463ff1dc93 100644 --- a/core/src/com/cloud/storage/dao/SnapshotDaoImpl.java +++ b/core/src/com/cloud/storage/dao/SnapshotDaoImpl.java @@ -18,6 +18,7 @@ package com.cloud.storage.dao; +import java.math.BigInteger; import java.util.List; import javax.ejb.Local; @@ -25,7 +26,6 @@ import javax.ejb.Local; import com.cloud.storage.SnapshotVO; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; @@ -34,11 +34,11 @@ public class SnapshotDaoImpl extends GenericDaoBase implements private final SearchBuilder VolumeIdSearch; private final SearchBuilder ParentIdSearch; - private final GenericSearchBuilder lastSnapSearch; + private final SearchBuilder lastSnapSearch; @Override public SnapshotVO findNextSnapshot(long snapshotId) { - SearchCriteria sc = ParentIdSearch.create(); + SearchCriteria sc = ParentIdSearch.create(); sc.setParameters("prevSnapshotId", snapshotId); return findOneBy(sc); } @@ -50,7 +50,7 @@ public class SnapshotDaoImpl extends GenericDaoBase implements @Override public List listByVolumeId(Filter filter, long volumeId ) { - SearchCriteria sc = VolumeIdSearch.create(); + SearchCriteria sc = VolumeIdSearch.create(); sc.setParameters("volumeId", volumeId); return listActiveBy(sc, filter); } @@ -64,21 +64,22 @@ public class SnapshotDaoImpl extends GenericDaoBase implements ParentIdSearch.and("prevSnapshotId", ParentIdSearch.entity().getPrevSnapshotId(), SearchCriteria.Op.EQ); ParentIdSearch.done(); - lastSnapSearch = createSearchBuilder(Long.class); - lastSnapSearch.select(null, SearchCriteria.Func.MAX, lastSnapSearch.entity().getId()); + lastSnapSearch = createSearchBuilder(); + lastSnapSearch.select(SearchCriteria.Func.MAX, lastSnapSearch.entity().getId()); lastSnapSearch.and("volumeId", lastSnapSearch.entity().getVolumeId(), SearchCriteria.Op.EQ); lastSnapSearch.and("snapId", lastSnapSearch.entity().getId(), SearchCriteria.Op.NEQ); lastSnapSearch.done(); + } @Override public long getLastSnapshot(long volumeId, long snapId) { - SearchCriteria sc = lastSnapSearch.create(); + SearchCriteria sc = lastSnapSearch.create(); sc.setParameters("volumeId", volumeId); sc.setParameters("snapId", snapId); - List prevSnapshots = searchAll(sc, null); - if(prevSnapshots != null && prevSnapshots.size() > 0 && prevSnapshots.get(0) != null) { - return prevSnapshots.get(0); + List prevSnapshots = searchAll(sc, null); + if(prevSnapshots != null && prevSnapshots.size() > 0 && prevSnapshots.get(0).length > 0 && prevSnapshots.get(0)[0] != null){ + return ((BigInteger)prevSnapshots.get(0)[0]).longValue(); } return 0; } diff --git a/core/src/com/cloud/storage/dao/SnapshotPolicyDaoImpl.java b/core/src/com/cloud/storage/dao/SnapshotPolicyDaoImpl.java index 4a4091d52f3..0ffa13fd88c 100644 --- a/core/src/com/cloud/storage/dao/SnapshotPolicyDaoImpl.java +++ b/core/src/com/cloud/storage/dao/SnapshotPolicyDaoImpl.java @@ -19,10 +19,10 @@ package com.cloud.storage.dao; -import java.util.List; - -import javax.ejb.Local; - +import java.util.List; + +import javax.ejb.Local; + import com.cloud.storage.SnapshotPolicyVO; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; @@ -37,7 +37,7 @@ public class SnapshotPolicyDaoImpl extends GenericDaoBase sc = VolumeIdIntervalSearch.create(); + SearchCriteria sc = VolumeIdIntervalSearch.create(); sc.setParameters("volumeId", volumeId); sc.setParameters("interval", interval); return findOneBy(sc); @@ -50,7 +50,7 @@ public class SnapshotPolicyDaoImpl extends GenericDaoBase listByVolumeId(long volumeId, Filter filter) { - SearchCriteria sc = VolumeIdSearch.create(); + SearchCriteria sc = VolumeIdSearch.create(); sc.setParameters("volumeId", volumeId); sc.setParameters("active", true); return listActiveBy(sc, filter); @@ -74,7 +74,7 @@ public class SnapshotPolicyDaoImpl extends GenericDaoBase listActivePolicies() { - SearchCriteria sc = ActivePolicySearch.create(); + SearchCriteria sc = ActivePolicySearch.create(); sc.setParameters("active", true); return listBy(sc); } diff --git a/core/src/com/cloud/storage/dao/SnapshotPolicyRefDaoImpl.java b/core/src/com/cloud/storage/dao/SnapshotPolicyRefDaoImpl.java index f1d50aafde5..5ef5d990342 100644 --- a/core/src/com/cloud/storage/dao/SnapshotPolicyRefDaoImpl.java +++ b/core/src/com/cloud/storage/dao/SnapshotPolicyRefDaoImpl.java @@ -19,10 +19,10 @@ package com.cloud.storage.dao; -import java.util.List; - -import javax.ejb.Local; - +import java.util.List; + +import javax.ejb.Local; + import com.cloud.storage.SnapshotPolicyRefVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -52,7 +52,7 @@ public class SnapshotPolicyRefDaoImpl extends GenericDaoBase sc = snapPolicy.create(); + SearchCriteria sc = snapPolicy.create(); sc.setParameters("snapshotId", snapshotId); sc.setParameters("policyId", policyId); return findOneBy(sc); @@ -60,7 +60,7 @@ public class SnapshotPolicyRefDaoImpl extends GenericDaoBase sc = snapPolicy.create(); + SearchCriteria sc = snapPolicy.create(); sc.setParameters("snapshotId", snapshotId); sc.setParameters("policyId", policyId); return delete(sc); @@ -68,14 +68,14 @@ public class SnapshotPolicyRefDaoImpl extends GenericDaoBase listBySnapshotId(long snapshotId) { - SearchCriteria sc = snapSearch.create(); + SearchCriteria sc = snapSearch.create(); sc.setParameters("snapshotId", snapshotId); return listBy(sc); } @Override public List listByPolicyId(long policyId, long volumeId) { - SearchCriteria sc = policySearch.create(); + SearchCriteria sc = policySearch.create(); sc.setParameters("policyId", policyId); sc.setParameters("volumeId", volumeId); return listBy(sc); diff --git a/core/src/com/cloud/storage/dao/SnapshotScheduleDaoImpl.java b/core/src/com/cloud/storage/dao/SnapshotScheduleDaoImpl.java index dc31230cd5b..8308c5d89e5 100644 --- a/core/src/com/cloud/storage/dao/SnapshotScheduleDaoImpl.java +++ b/core/src/com/cloud/storage/dao/SnapshotScheduleDaoImpl.java @@ -59,7 +59,7 @@ public class SnapshotScheduleDaoImpl extends GenericDaoBase getCoincidingSnapshotSchedules(long volumeId, Date date) { - SearchCriteria sc = coincidingSchedulesSearch.create(); + SearchCriteria sc = coincidingSchedulesSearch.create(); sc.setParameters("volumeId", volumeId); sc.setParameters("scheduledTimestamp", date); // Don't return manual snapshots. They will be executed through another code path. @@ -72,7 +72,7 @@ public class SnapshotScheduleDaoImpl extends GenericDaoBase getSchedulesToExecute(Date currentTimestamp) { - SearchCriteria sc = executableSchedulesSearch.create(); + SearchCriteria sc = executableSchedulesSearch.create(); sc.setParameters("scheduledTimestamp", currentTimestamp); // Don't return manual snapshots. They will be executed through another code path. sc.addAnd("policyId", SearchCriteria.Op.NEQ, 1L); @@ -85,7 +85,7 @@ public class SnapshotScheduleDaoImpl extends GenericDaoBase sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("volumeId", SearchCriteria.Op.EQ, volumeId); if (policyId != null) { sc.addAnd("policyId", SearchCriteria.Op.EQ, policyId); diff --git a/core/src/com/cloud/storage/dao/StoragePoolDao.java b/core/src/com/cloud/storage/dao/StoragePoolDao.java index 104f282d1f2..9bbdd571927 100644 --- a/core/src/com/cloud/storage/dao/StoragePoolDao.java +++ b/core/src/com/cloud/storage/dao/StoragePoolDao.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import com.cloud.host.Status; import com.cloud.storage.StoragePoolVO; import com.cloud.utils.db.GenericDao; /** @@ -99,7 +98,5 @@ public interface StoragePoolDao extends GenericDao { Map getDetails(long poolId); List searchForStoragePoolDetails(long poolId, String value); - - long countBy(long podId, Status... statuses); } diff --git a/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java b/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java index 700dfccccab..7aa0eb6fed5 100644 --- a/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java +++ b/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java @@ -31,19 +31,15 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; -import com.cloud.host.HostVO; -import com.cloud.host.Status; import com.cloud.storage.StoragePoolDetailVO; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; -import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.exception.CloudRuntimeException; @@ -59,7 +55,6 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp protected final SearchBuilder HostPathDcSearch; protected final SearchBuilder DcPodAnyClusterSearch; protected final SearchBuilder DeleteLvmSearch; - protected final GenericSearchBuilder MaintenanceCountSearch; protected final StoragePoolDetailsDao _detailsDao; @@ -82,24 +77,24 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp DcPodSearch = createSearchBuilder(); DcPodSearch.and("datacenterId", DcPodSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); - DcPodSearch.and().op("nullpod", DcPodSearch.entity().getPodId(), SearchCriteria.Op.NULL); + DcPodSearch.op(Op.AND, "nullpod", DcPodSearch.entity().getPodId(), SearchCriteria.Op.NULL); DcPodSearch.or("podId", DcPodSearch.entity().getPodId(), SearchCriteria.Op.EQ); DcPodSearch.cp(); - DcPodSearch.and().op("nullcluster", DcPodSearch.entity().getClusterId(), SearchCriteria.Op.NULL); + DcPodSearch.op(Op.AND, "nullcluster", DcPodSearch.entity().getClusterId(), SearchCriteria.Op.NULL); DcPodSearch.or("cluster", DcPodSearch.entity().getClusterId(), SearchCriteria.Op.EQ); DcPodSearch.cp(); DcPodSearch.done(); DcPodAnyClusterSearch = createSearchBuilder(); DcPodAnyClusterSearch.and("datacenterId", DcPodAnyClusterSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); - DcPodAnyClusterSearch.and().op("nullpod", DcPodAnyClusterSearch.entity().getPodId(), SearchCriteria.Op.NULL); + DcPodAnyClusterSearch.op(Op.AND, "nullpod", DcPodAnyClusterSearch.entity().getPodId(), SearchCriteria.Op.NULL); DcPodAnyClusterSearch.or("podId", DcPodAnyClusterSearch.entity().getPodId(), SearchCriteria.Op.EQ); DcPodAnyClusterSearch.cp(); DcPodAnyClusterSearch.done(); DeleteLvmSearch = createSearchBuilder(); DeleteLvmSearch.and("ids", DeleteLvmSearch.entity().getId(), SearchCriteria.Op.IN); - DeleteLvmSearch.and().op("LVM", DeleteLvmSearch.entity().getPoolType(), SearchCriteria.Op.EQ); + DeleteLvmSearch.op(SearchCriteria.Op.AND,"LVM", DeleteLvmSearch.entity().getPoolType(), SearchCriteria.Op.EQ); DeleteLvmSearch.or("Filesystem", DeleteLvmSearch.entity().getPoolType(), SearchCriteria.Op.EQ); DeleteLvmSearch.cp(); DeleteLvmSearch.done(); @@ -120,18 +115,12 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp HostPathDcSearch.and("path", HostPathDcSearch.entity().getPath(), SearchCriteria.Op.EQ); HostPathDcSearch.done(); - MaintenanceCountSearch = createSearchBuilder(Long.class); - MaintenanceCountSearch.and("pool", MaintenanceCountSearch.entity().getId(), SearchCriteria.Op.EQ); - MaintenanceCountSearch.select(null, Func.COUNT, null); - MaintenanceCountSearch.and("status", MaintenanceCountSearch.entity().getStatus(), SearchCriteria.Op.IN); - MaintenanceCountSearch.done(); - _detailsDao = ComponentLocator.inject(StoragePoolDetailsDaoImpl.class); } @Override public List findPoolByName(String name) { - SearchCriteria sc = NameSearch.create(); + SearchCriteria sc = NameSearch.create(); sc.setParameters("name", name); return listBy(sc); } @@ -139,7 +128,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp @Override public StoragePoolVO findPoolByUUID(String uuid) { - SearchCriteria sc = UUIDSearch.create(); + SearchCriteria sc = UUIDSearch.create(); sc.setParameters("uuid", uuid); return findOneBy(sc); } @@ -147,7 +136,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp @Override public List listByDataCenterId(long datacenterId) { - SearchCriteria sc = DatacenterSearch.create(); + SearchCriteria sc = DatacenterSearch.create(); sc.setParameters("datacenterId", datacenterId); return listBy(sc); } @@ -171,14 +160,14 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp @Override public List listByStorageHost(String hostFqdnOrIp) { - SearchCriteria sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("host", hostFqdnOrIp); return listBy(sc); } @Override public StoragePoolVO findPoolByHostPath(long datacenterId, Long podId, String host, String path) { - SearchCriteria sc = HostPathDcPodSearch.create(); + SearchCriteria sc = HostPathDcPodSearch.create(); sc.setParameters("hostAddress", host); sc.setParameters("path", path); sc.setParameters("datacenterId", datacenterId); @@ -190,14 +179,14 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp @Override public List listBy(long datacenterId, long podId, Long clusterId) { if (clusterId != null) { - SearchCriteria sc = DcPodSearch.create(); + SearchCriteria sc = DcPodSearch.create(); sc.setParameters("datacenterId", datacenterId); sc.setParameters("podId", podId); sc.setParameters("cluster", clusterId); return listActiveBy(sc); } else { - SearchCriteria sc = DcPodAnyClusterSearch.create(); + SearchCriteria sc = DcPodAnyClusterSearch.create(); sc.setParameters("datacenterId", datacenterId); sc.setParameters("podId", podId); return listActiveBy(sc); @@ -206,7 +195,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp @Override public List listPoolByHostPath(String host, String path) { - SearchCriteria sc = HostPathDcSearch.create(); + SearchCriteria sc = HostPathDcSearch.create(); sc.setParameters("hostAddress", host); sc.setParameters("path", path); @@ -215,7 +204,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp public StoragePoolVO listById(Integer id) { - SearchCriteria sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("id", id); return findOneBy(sc); @@ -240,7 +229,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp @Override public void deleteStoragePoolRecords(ArrayList ids) { - SearchCriteria sc = DeleteLvmSearch.create(); + SearchCriteria sc = DeleteLvmSearch.create(); sc.setParameters("ids", ids.toArray()); sc.setParameters("LVM", StoragePoolType.LVM); sc.setParameters("Filesystem", StoragePoolType.Filesystem); @@ -359,19 +348,4 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp _detailsDao.configure("DetailsDao", params); return true; } - - @Override - public long countBy(long primaryStorageId, Status... statuses) { - SearchCriteria sc = MaintenanceCountSearch.create(); - - sc.setParameters("status", (Object[])statuses); - sc.setParameters("pool", primaryStorageId); - - List rs = searchAll(sc, null); - if (rs.size() == 0) { - return 0; - } - - return rs.get(0); - } } diff --git a/core/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java b/core/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java index a063a212e0e..2fed27a85b4 100644 --- a/core/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java +++ b/core/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java @@ -18,8 +18,8 @@ package com.cloud.storage.dao; import java.util.HashMap; -import java.util.List; import java.util.Map; +import java.util.List; import javax.ejb.Local; @@ -44,7 +44,7 @@ public class StoragePoolDetailsDaoImpl extends GenericDaoBase details) { Transaction txn = Transaction.currentTxn(); - SearchCriteria sc = PoolSearch.create(); + SearchCriteria sc = PoolSearch.create(); sc.setParameters("pool", poolId); txn.start(); @@ -58,7 +58,7 @@ public class StoragePoolDetailsDaoImpl extends GenericDaoBase getDetails(long poolId) { - SearchCriteria sc = PoolSearch.create(); + SearchCriteria sc = PoolSearch.create(); sc.setParameters("pool", poolId); List details = listActiveBy(sc); diff --git a/core/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java b/core/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java index 35891cb95ca..1984268dfa2 100644 --- a/core/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java +++ b/core/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java @@ -89,21 +89,21 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase listByPoolId(long id) { - SearchCriteria sc = PoolSearch.create(); + SearchCriteria sc = PoolSearch.create(); sc.setParameters("pool_id", id); return listBy(sc); } @Override public List listByHostId(long hostId) { - SearchCriteria sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("host_id", hostId); return listBy(sc); } @Override public StoragePoolHostVO findByPoolHost(long poolId, long hostId) { - SearchCriteria sc = PoolHostSearch.create(); + SearchCriteria sc = PoolHostSearch.create(); sc.setParameters("pool_id", poolId); sc.setParameters("host_id", hostId); return findOneBy(sc); @@ -220,7 +220,7 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("host_id", hostId); Transaction txn = Transaction.currentTxn(); txn.start(); @@ -232,7 +232,7 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase sc = PoolHostSearch.create(); + SearchCriteria sc = PoolHostSearch.create(); sc.setParameters("host_id", hostId); sc.setParameters("pool_id", poolId); Transaction txn = Transaction.currentTxn(); diff --git a/core/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/core/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index 7e8c7a8c966..a6350ef5f29 100644 --- a/core/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/core/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -72,42 +72,42 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem } public List listByPublic() { - SearchCriteria sc = PublicSearch.create(); + SearchCriteria sc = PublicSearch.create(); sc.setParameters("public", 1); return listActiveBy(sc); } @Override public VMTemplateVO findByName(String templateName) { - SearchCriteria sc = UniqueNameSearch.create(); + SearchCriteria sc = UniqueNameSearch.create(); sc.setParameters("uniqueName", templateName); return findOneBy(sc); } @Override public VMTemplateVO findByTemplateName(String templateName) { - SearchCriteria sc = NameSearch.create(); + SearchCriteria sc = NameSearch.create(); sc.setParameters("name", templateName); return findOneBy(sc); } @Override public VMTemplateVO findRoutingTemplate() { - SearchCriteria sc = UniqueNameSearch.create(); + SearchCriteria sc = UniqueNameSearch.create(); sc.setParameters("uniqueName", routerTmpltName); return findOneBy(sc); } @Override public VMTemplateVO findConsoleProxyTemplate() { - SearchCriteria sc = UniqueNameSearch.create(); + SearchCriteria sc = UniqueNameSearch.create(); sc.setParameters("uniqueName", consoleProxyTmpltName); return findOneBy(sc); } @Override public List listReadyTemplates() { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("ready", SearchCriteria.Op.EQ, true); sc.addAnd("format", SearchCriteria.Op.NEQ, Storage.ImageFormat.ISO); return listBy(sc); @@ -115,7 +115,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem @Override public List findIsosByIdAndPath(Long domainId, Long accountId, String path) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("iso", SearchCriteria.Op.EQ, true); if (domainId != null) sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); @@ -128,7 +128,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem @Override public List listByAccountId(long accountId) { - SearchCriteria sc = AccountIdSearch.create(); + SearchCriteria sc = AccountIdSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("publicTemplate", false); return listActiveBy(sc); diff --git a/core/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java b/core/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java index b2becd0e141..a836e8a4c21 100644 --- a/core/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java +++ b/core/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java @@ -18,18 +18,18 @@ package com.cloud.storage.dao; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.TimeZone; - -import javax.ejb.Local; - -import org.apache.log4j.Logger; - +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.utils.DateUtil; @@ -133,14 +133,14 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase listByHostId(long id) { - SearchCriteria sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("host_id", id); return listBy(sc); } @Override public List listByTemplateId(long templateId) { - SearchCriteria sc = TemplateSearch.create(); + SearchCriteria sc = TemplateSearch.create(); sc.setParameters("template_id", templateId); sc.setParameters("destroyed", false); return listBy(sc); @@ -148,7 +148,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase sc = HostTemplateSearch.create(); + SearchCriteria sc = HostTemplateSearch.create(); sc.setParameters("host_id", hostId); sc.setParameters("template_id", templateId); return findOneBy(sc); @@ -156,7 +156,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase listByTemplateStatus(long templateId, VMTemplateHostVO.Status downloadState) { - SearchCriteria sc = TemplateStatusSearch.create(); + SearchCriteria sc = TemplateStatusSearch.create(); sc.setParameters("template_id", templateId); sc.setParameters("download_state", downloadState.toString()); return listBy(sc); @@ -232,7 +232,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase listByTemplateStates(long templateId, VMTemplateHostVO.Status... states) { - SearchCriteria sc = TemplateStatesSearch.create(); + SearchCriteria sc = TemplateStatesSearch.create(); sc.setParameters("states", (Object[])states); sc.setParameters("template_id", templateId); @@ -241,7 +241,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase sc = HostTemplatePoolSearch.create(); + SearchCriteria sc = HostTemplatePoolSearch.create(); sc.setParameters("host_id", hostId); sc.setParameters("template_id", templateId); sc.setParameters("pool_id", poolId); @@ -250,7 +250,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase listByHostTemplate(long hostId, long templateId) { - SearchCriteria sc = HostTemplateSearch.create(); + SearchCriteria sc = HostTemplateSearch.create(); sc.setParameters("host_id", hostId); sc.setParameters("template_id", templateId); return listBy(sc); @@ -258,7 +258,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase listByTemplatePool(long templateId, long poolId) { - SearchCriteria sc = PoolTemplateSearch.create(); + SearchCriteria sc = PoolTemplateSearch.create(); sc.setParameters("pool_id", poolId); sc.setParameters("template_id", templateId); return listBy(sc); @@ -266,7 +266,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase listDestroyed(long hostId) { - SearchCriteria sc = HostDestroyedSearch.create(); + SearchCriteria sc = HostDestroyedSearch.create(); sc.setParameters("host_id", hostId); sc.setParameters("destroyed", true); return listBy(sc); @@ -274,7 +274,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase sc = HostTemplateSearch.create(); + SearchCriteria sc = HostTemplateSearch.create(); sc.setParameters("host_id", hostId); sc.setParameters("template_id", templateId); if (!lock) diff --git a/core/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java b/core/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java index e19ca03b170..b888d7811c6 100644 --- a/core/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java +++ b/core/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java @@ -18,16 +18,16 @@ package com.cloud.storage.dao; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - -import javax.ejb.Local; - -import org.apache.log4j.Logger; - +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + import com.cloud.storage.VMTemplateStoragePoolVO; import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; @@ -98,21 +98,21 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase listByPoolId(long id) { - SearchCriteria sc = PoolSearch.create(); + SearchCriteria sc = PoolSearch.create(); sc.setParameters("pool_id", id); return listBy(sc); } @Override public List listByTemplateId(long templateId) { - SearchCriteria sc = TemplateSearch.create(); + SearchCriteria sc = TemplateSearch.create(); sc.setParameters("template_id", templateId); return listBy(sc); } @Override public VMTemplateStoragePoolVO findByPoolTemplate(long hostId, long templateId) { - SearchCriteria sc = PoolTemplateSearch.create(); + SearchCriteria sc = PoolTemplateSearch.create(); sc.setParameters("pool_id", hostId); sc.setParameters("template_id", templateId); return findOneBy(sc); @@ -120,7 +120,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase listByTemplateStatus(long templateId, VMTemplateStoragePoolVO.Status downloadState) { - SearchCriteria sc = TemplateStatusSearch.create(); + SearchCriteria sc = TemplateStatusSearch.create(); sc.setParameters("template_id", templateId); sc.setParameters("download_state", downloadState.toString()); return listBy(sc); @@ -128,7 +128,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase listByTemplateStatus(long templateId, VMTemplateStoragePoolVO.Status downloadState, long poolId) { - SearchCriteria sc = TemplatePoolStatusSearch.create(); + SearchCriteria sc = TemplatePoolStatusSearch.create(); sc.setParameters("pool_id", poolId); sc.setParameters("template_id", templateId); sc.setParameters("download_state", downloadState.toString()); @@ -239,7 +239,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase listByTemplateStates(long templateId, VMTemplateStoragePoolVO.Status... states) { - SearchCriteria sc = TemplateStatesSearch.create(); + SearchCriteria sc = TemplateStatesSearch.create(); sc.setParameters("states", (Object[])states); sc.setParameters("template_id", templateId); diff --git a/core/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java b/core/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java index 75f8cf8ad50..b906a280534 100644 --- a/core/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java +++ b/core/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java @@ -56,21 +56,21 @@ public class VMTemplateZoneDaoImpl extends GenericDaoBase listByZoneId(long id) { - SearchCriteria sc = ZoneSearch.create(); + SearchCriteria sc = ZoneSearch.create(); sc.setParameters("zone_id", id); return listBy(sc); } @Override public List listByTemplateId(long templateId) { - SearchCriteria sc = TemplateSearch.create(); + SearchCriteria sc = TemplateSearch.create(); sc.setParameters("template_id", templateId); return listBy(sc); } @Override public VMTemplateZoneVO findByZoneTemplate(long zoneId, long templateId) { - SearchCriteria sc = ZoneTemplateSearch.create(); + SearchCriteria sc = ZoneTemplateSearch.create(); sc.setParameters("zone_id", zoneId); sc.setParameters("template_id", templateId); return findOneBy(sc); @@ -78,7 +78,7 @@ public class VMTemplateZoneDaoImpl extends GenericDaoBase listByZoneTemplate(long zoneId, long templateId) { - SearchCriteria sc = ZoneTemplateSearch.create(); + SearchCriteria sc = ZoneTemplateSearch.create(); sc.setParameters("zone_id", zoneId); sc.setParameters("template_id", templateId); return listBy(sc); diff --git a/core/src/com/cloud/storage/dao/VolumeDao.java b/core/src/com/cloud/storage/dao/VolumeDao.java index 39979744aab..8af9e633eef 100755 --- a/core/src/com/cloud/storage/dao/VolumeDao.java +++ b/core/src/com/cloud/storage/dao/VolumeDao.java @@ -45,5 +45,4 @@ public interface VolumeDao extends GenericDao { boolean isAnyVolumeActivelyUsingTemplateOnPool(long templateId, long poolId); List listRemovedButNotDestroyed(); List findCreatedByInstance(long id); - List findByPoolId(long poolId); } diff --git a/core/src/com/cloud/storage/dao/VolumeDaoImpl.java b/core/src/com/cloud/storage/dao/VolumeDaoImpl.java index 976c6445483..ee1b0329f52 100755 --- a/core/src/com/cloud/storage/dao/VolumeDaoImpl.java +++ b/core/src/com/cloud/storage/dao/VolumeDaoImpl.java @@ -17,6 +17,8 @@ */ package com.cloud.storage.dao; +import java.math.BigDecimal; +import java.math.BigInteger; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -36,7 +38,6 @@ import com.cloud.storage.Volume.VolumeType; import com.cloud.utils.Pair; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; @@ -51,23 +52,22 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol protected final SearchBuilder AccountIdSearch; protected final SearchBuilder AccountPodSearch; protected final SearchBuilder TemplateZoneSearch; - protected final GenericSearchBuilder TotalSizeByPoolSearch; + protected final SearchBuilder TotalSizeByPoolSearch; protected final SearchBuilder InstanceIdSearch; protected final SearchBuilder InstanceAndTypeSearch; protected final SearchBuilder InstanceIdDestroyedSearch; protected final SearchBuilder InstanceIdCreatedSearch; protected final SearchBuilder DetachedDestroyedSearch; protected final SearchBuilder MirrorSearch; - protected final GenericSearchBuilder ActiveTemplateSearch; + protected final SearchBuilder ActiveTemplateSearch; protected final SearchBuilder RemovedButNotDestroyedSearch; - protected final SearchBuilder PoolIdSearch; - + protected static final String SELECT_VM_SQL = "SELECT DISTINCT instance_id from volumes v where v.host_id = ? and v.mirror_state = ?"; protected static final String SELECT_VM_ID_SQL = "SELECT DISTINCT instance_id from volumes v where v.host_id = ?"; @Override public List listRemovedButNotDestroyed() { - SearchCriteria sc = RemovedButNotDestroyedSearch.create(); + SearchCriteria sc = RemovedButNotDestroyedSearch.create(); sc.setParameters("destroyed", false); return searchAll(sc, null, null, false); @@ -97,7 +97,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol @Override public List findDetachedByAccount(long accountId) { - SearchCriteria sc = DetachedAccountIdSearch.create(); + SearchCriteria sc = DetachedAccountIdSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("destroyed", false); return listActiveBy(sc); @@ -105,7 +105,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol @Override public List findByAccount(long accountId) { - SearchCriteria sc = AccountIdSearch.create(); + SearchCriteria sc = AccountIdSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("destroyed", false); return listActiveBy(sc); @@ -113,21 +113,14 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol @Override public List findByInstance(long id) { - SearchCriteria sc = InstanceIdSearch.create(); + SearchCriteria sc = InstanceIdSearch.create(); sc.setParameters("instanceId", id); return listActiveBy(sc); } - @Override - public List findByPoolId(long poolId) { - SearchCriteria sc = PoolIdSearch.create(); - sc.setParameters("poolId", poolId); - return listActiveBy(sc); - } - @Override public List findCreatedByInstance(long id) { - SearchCriteria sc = InstanceIdCreatedSearch.create(); + SearchCriteria sc = InstanceIdCreatedSearch.create(); sc.setParameters("instanceId", id); sc.setParameters("status", AsyncInstanceCreateStatus.Created); sc.setParameters("destroyed", false); @@ -136,7 +129,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol @Override public List findByInstanceAndType(long id, VolumeType vType) { - SearchCriteria sc = InstanceAndTypeSearch.create(); + SearchCriteria sc = InstanceAndTypeSearch.create(); sc.setParameters("instanceId", id); sc.setParameters("vType", vType.toString()); return listActiveBy(sc); @@ -144,7 +137,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol @Override public List findByInstanceIdDestroyed(long vmId) { - SearchCriteria sc = InstanceIdDestroyedSearch.create(); + SearchCriteria sc = InstanceIdDestroyedSearch.create(); sc.setParameters("instanceId", vmId); sc.setParameters("destroyed", true); return listBy(sc); @@ -152,14 +145,14 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol @Override public List findByDetachedDestroyed() { - SearchCriteria sc = DetachedDestroyedSearch.create(); + SearchCriteria sc = DetachedDestroyedSearch.create(); sc.setParameters("destroyed", true); return listActiveBy(sc); } @Override public List findByAccountAndPod(long accountId, long podId) { - SearchCriteria sc = AccountPodSearch.create(); + SearchCriteria sc = AccountPodSearch.create(); sc.setParameters("account", accountId); sc.setParameters("pod", podId); sc.setParameters("destroyed", false); @@ -170,7 +163,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol @Override public List findByTemplateAndZone(long templateId, long zoneId) { - SearchCriteria sc = TemplateZoneSearch.create(); + SearchCriteria sc = TemplateZoneSearch.create(); sc.setParameters("template", templateId); sc.setParameters("zone", zoneId); @@ -203,7 +196,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol @Override public List findStrandedMirrorVolumes() { - SearchCriteria sc = MirrorSearch.create(); + SearchCriteria sc = MirrorSearch.create(); sc.setParameters("mirrorState", MirrorState.ACTIVE.toString()); return listBy(sc); @@ -211,19 +204,22 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol @Override public boolean isAnyVolumeActivelyUsingTemplateOnPool(long templateId, long poolId) { - SearchCriteria sc = ActiveTemplateSearch.create(); + SearchCriteria sc = ActiveTemplateSearch.create(); sc.setParameters("template", templateId); sc.setParameters("pool", poolId); - List results = searchAll(sc, null); - assert results.size() > 0 : "How can this return a size of " + results.size(); + List results = this.searchAll(sc, null); + if (results.size() == 0) { + return false; + } - return results.get(0) > 0; + Object[] counts = results.get(0); + return ((BigInteger) counts[0]).longValue() > 0; } @Override public void deleteVolumesByInstance(long instanceId) { - SearchCriteria sc = InstanceIdSearch.create(); + SearchCriteria sc = InstanceIdSearch.create(); sc.setParameters("instanceId", instanceId); delete(sc); } @@ -284,9 +280,9 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol TemplateZoneSearch.and("zone", TemplateZoneSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); TemplateZoneSearch.done(); - TotalSizeByPoolSearch = createSearchBuilder(SumCount.class); - TotalSizeByPoolSearch.select("sum", Func.SUM, TotalSizeByPoolSearch.entity().getSize()); - TotalSizeByPoolSearch.select("count", Func.COUNT, (Object[])null); + TotalSizeByPoolSearch = createSearchBuilder(); + TotalSizeByPoolSearch.select(Func.SUM, TotalSizeByPoolSearch.entity().getSize()); + TotalSizeByPoolSearch.select(Func.COUNT, (Object[])null); TotalSizeByPoolSearch.and("poolId", TotalSizeByPoolSearch.entity().getPoolId(), SearchCriteria.Op.EQ); TotalSizeByPoolSearch.and("removed", TotalSizeByPoolSearch.entity().getRemoved(), SearchCriteria.Op.NULL); TotalSizeByPoolSearch.done(); @@ -301,11 +297,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol InstanceIdSearch = createSearchBuilder(); InstanceIdSearch.and("instanceId", InstanceIdSearch.entity().getInstanceId(), SearchCriteria.Op.EQ); InstanceIdSearch.done(); - - PoolIdSearch = createSearchBuilder(); - PoolIdSearch.and("poolId", PoolIdSearch.entity().getPoolId(), SearchCriteria.Op.EQ); - PoolIdSearch.done(); - + InstanceAndTypeSearch= createSearchBuilder(); InstanceAndTypeSearch.and("instanceId", InstanceAndTypeSearch.entity().getInstanceId(), SearchCriteria.Op.EQ); InstanceAndTypeSearch.and("vType", InstanceAndTypeSearch.entity().getVolumeType(), SearchCriteria.Op.EQ); @@ -326,11 +318,11 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol MirrorSearch.and("mirrorState", MirrorSearch.entity().getMirrorState(), Op.EQ); MirrorSearch.done(); - ActiveTemplateSearch = createSearchBuilder(Long.class); + ActiveTemplateSearch = createSearchBuilder(); ActiveTemplateSearch.and("pool", ActiveTemplateSearch.entity().getPoolId(), SearchCriteria.Op.EQ); ActiveTemplateSearch.and("template", ActiveTemplateSearch.entity().getTemplateId(), SearchCriteria.Op.EQ); ActiveTemplateSearch.and("removed", ActiveTemplateSearch.entity().getRemoved(), SearchCriteria.Op.NULL); - ActiveTemplateSearch.select(null, Func.COUNT, null); + ActiveTemplateSearch.selectField(Func.COUNT); ActiveTemplateSearch.done(); RemovedButNotDestroyedSearch = createSearchBuilder(); @@ -341,17 +333,12 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol @Override @DB(txn=false) public Pair getCountAndTotalByPool(long poolId) { - SearchCriteria sc = TotalSizeByPoolSearch.create(); + SearchCriteria sc = TotalSizeByPoolSearch.create(); sc.setParameters("poolId", poolId); - List results = searchAll(sc, null); - SumCount sumCount = results.get(0); - return new Pair(sumCount.count, sumCount.sum); - } - - public static class SumCount { - public long sum; - public long count; - public SumCount() { - } + List results = searchAll(sc, null); + Object[] objs = results.get(0); + long size = (objs[0] == null) ? 0 : ((BigDecimal)objs[0]).longValue(); + long count = (Long)objs[1]; + return new Pair(count, size); } } diff --git a/core/src/com/cloud/user/UserContext.java b/core/src/com/cloud/user/UserContext.java index bb7c6a58a63..36064b923b6 100644 --- a/core/src/com/cloud/user/UserContext.java +++ b/core/src/com/cloud/user/UserContext.java @@ -21,132 +21,95 @@ package com.cloud.user; import org.apache.log4j.Logger; import com.cloud.utils.ProcessUtil; - + + public class UserContext { private static final Logger s_logger = Logger.getLogger(UserContext.class); - - private static ThreadLocal s_currentContext = new ThreadLocal(); - - private Long userId; - private String accountName; - private Long accountId; - private Long domainId; - private String sessionId; - private Object accountObject; - - private boolean apiServer; - - private static UserContext s_nullContext = new UserContext(); - - public UserContext() { - } - - public UserContext(Long userId, Object accountObject, String accountName, Long accountId, Long domainId, String sessionId, boolean apiServer) { - this.userId = userId; - this.accountObject = accountObject; - this.accountId = accountId; - this.domainId = domainId; - this.sessionId = sessionId; - this.apiServer = apiServer; - } - - public Long getUserId() { - if (userId != null) { - return userId; - } - - if (!apiServer) { - s_logger.warn("Null user id in UserContext " + ProcessUtil.dumpStack()); - } - - return null; - } - - public void setUserId(Long userId) { - this.userId = userId; - } - - public String getAccountName() { - return accountName; - } - - public void setAccountName(String accountName) { - this.accountName = accountName; - } + + private static ThreadLocal s_currentContext = new ThreadLocal(); + + private Long userId; + private Long accountId; + private String sessionId; - public Long getAccountId() { - if (accountId != null) { - return accountId; - } - - if (!apiServer) { - s_logger.warn("Null account id in UserContext " + ProcessUtil.dumpStack()); - } + private boolean apiServer; + + private static UserContext s_nullContext = new UserContext(); + + public UserContext() { + } + + public UserContext(Long userId, Long accountId, String sessionId, boolean apiServer) { + this.userId = userId; + this.accountId = accountId; + this.sessionId = sessionId; + this.apiServer = apiServer; + } + + public long getUserId() { + if(userId != null) + return userId.longValue(); - return null; - } - - public void setAccountId(Long accountId) { - this.accountId = accountId; - } - - public Long getDomainId() { - return domainId; - } - - public void setDomainId(Long domainId) { - this.domainId = domainId; - } - - public String getSessionId() { - return sessionId; - } - - public Object getAccountObject() { - return accountObject; - } - - public void setAccountObject(Object accountObject) { - this.accountObject = accountObject; - } - - public void setSessionKey(String sessionId) { - this.sessionId = sessionId; - } - - public boolean isApiServer() { - return apiServer; - } - - public void setApiServer(boolean apiServer) { - this.apiServer = apiServer; - } - - public static UserContext current() { - UserContext context = s_currentContext.get(); - if (context == null) { - return s_nullContext; - } - return context; - } - - public static void updateContext(Long userId, Object accountObject, String accountName, Long accountId, Long domainId, String sessionId) { - UserContext context = current(); - assert(context != null) : "Context should be already setup before you can call this one"; - - context.setUserId(userId); - context.setAccountObject(accountObject); - context.setAccountName(accountName); - context.setAccountId(accountId); - context.setDomainId(domainId); - context.setSessionKey(sessionId); + if(!apiServer) + s_logger.warn("Null user id in UserContext " + ProcessUtil.dumpStack()); + + return 0; } - - public static void registerContext(Long userId, Object accountObject, String accountName, Long accountId, Long domainId, String sessionId, boolean apiServer) { - s_currentContext.set(new UserContext(userId, accountObject, accountName, accountId, domainId, sessionId, apiServer)); + + public void setUserId(Long userId) { + this.userId = userId; } - + + public long getAccountId() { + if(accountId != null) + return accountId.longValue(); + + if(!apiServer) + s_logger.warn("Null account id in UserContext " + ProcessUtil.dumpStack()); + return 0; + } + + public void setAccountId(Long accountId) { + this.accountId = accountId; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionKey(String sessionId) { + this.sessionId = sessionId; + } + + public boolean isApiServer() { + return apiServer; + } + + public void setApiServer(boolean apiServer) { + this.apiServer = apiServer; + } + + public static UserContext current() { + UserContext context = s_currentContext.get(); + if(context == null) + return s_nullContext; + return context; + } + + public static void updateContext(Long userId, Long accountId, String sessionId) { + UserContext context = current(); + assert(context != null) : "Context should be already setup before you can call this one"; + + context.setUserId(userId); + context.setAccountId(accountId); + context.setSessionKey(sessionId); + } + + public static void registerContext(Long userId, Long accountId, String sessionId, boolean apiServer) { + s_currentContext.set(new UserContext(userId, accountId, sessionId, apiServer)); + } + public static void unregisterContext() { - s_currentContext.set(null); + s_currentContext.set(null); } } diff --git a/core/src/com/cloud/user/dao/AccountDaoImpl.java b/core/src/com/cloud/user/dao/AccountDaoImpl.java index c9dd9c0b401..8a34ec3162e 100644 --- a/core/src/com/cloud/user/dao/AccountDaoImpl.java +++ b/core/src/com/cloud/user/dao/AccountDaoImpl.java @@ -71,7 +71,7 @@ public class AccountDaoImpl extends GenericDaoBase implements A @Override public List findCleanups() { - SearchCriteria sc = CleanupSearch.create(); + SearchCriteria sc = CleanupSearch.create(); sc.setParameters("cleanup", true); return searchAll(sc, null, null, false); @@ -110,34 +110,34 @@ public class AccountDaoImpl extends GenericDaoBase implements A @Override public List findAccountsLike(String accountName) { - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("accountName", SearchCriteria.Op.LIKE, "%"+accountName+"%"); return listActiveBy(sc); } @Override public Account findActiveAccount(String accountName, Long domainId) { - SearchCriteria sc = AccountNameSearch.create("accountName", accountName); + SearchCriteria sc = AccountNameSearch.create("accountName", accountName); sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); return findOneActiveBy(sc); } @Override public Account findAccount(String accountName, Long domainId) { - SearchCriteria sc = AccountNameSearch.create("accountName", accountName); + SearchCriteria sc = AccountNameSearch.create("accountName", accountName); sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); return findOneBy(sc); } public Account findActiveAccountByName(String accountName) { - SearchCriteria sc = AccountNameSearch.create("accountName", accountName); + SearchCriteria sc = AccountNameSearch.create("accountName", accountName); return findOneActiveBy(sc); } public List findActiveAccounts(Long maxAccountId, Filter filter) { if (maxAccountId == null) return null; - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("id", SearchCriteria.Op.LTEQ, maxAccountId); return listActiveBy(sc, filter); @@ -145,7 +145,7 @@ public class AccountDaoImpl extends GenericDaoBase implements A public List findRecentlyDeletedAccounts(Long maxAccountId, Date earliestRemovedDate, Filter filter) { if (earliestRemovedDate == null) return null; - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); if (maxAccountId != null) { sc.addAnd("id", SearchCriteria.Op.LTEQ, maxAccountId); } @@ -158,7 +158,7 @@ public class AccountDaoImpl extends GenericDaoBase implements A public List findNewAccounts(Long minAccountId, Filter filter) { if (minAccountId == null) return null; - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("id", SearchCriteria.Op.GT, minAccountId); return listBy(sc, filter); @@ -166,7 +166,7 @@ public class AccountDaoImpl extends GenericDaoBase implements A @Override public List findAdminAccountsForDomain(Long domain) { - SearchCriteria sc = AccountTypeSearch.create(); + SearchCriteria sc = AccountTypeSearch.create(); sc.addAnd("domainId", Op.EQ, domain); sc.addAnd("type", Op.IN, Account.ACCOUNT_TYPE_ADMIN, Account.ACCOUNT_TYPE_DOMAIN_ADMIN, Account.ACCOUNT_TYPE_READ_ONLY_ADMIN); return null; diff --git a/core/src/com/cloud/user/dao/UserAccountDaoImpl.java b/core/src/com/cloud/user/dao/UserAccountDaoImpl.java index 175f5ca3c7e..be9fed52a81 100644 --- a/core/src/com/cloud/user/dao/UserAccountDaoImpl.java +++ b/core/src/com/cloud/user/dao/UserAccountDaoImpl.java @@ -18,8 +18,8 @@ package com.cloud.user.dao; -import javax.ejb.Local; - +import javax.ejb.Local; + import com.cloud.user.UserAccount; import com.cloud.user.UserAccountVO; import com.cloud.utils.db.GenericDaoBase; @@ -33,7 +33,7 @@ public class UserAccountDaoImpl extends GenericDaoBase impl return null; } - SearchCriteria sc = createSearchCriteria(); + SearchCriteria sc = createSearchCriteria(); sc.addAnd("username", SearchCriteria.Op.EQ, username); sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); return findOneActiveBy(sc); diff --git a/core/src/com/cloud/user/dao/UserDaoImpl.java b/core/src/com/cloud/user/dao/UserDaoImpl.java index 7fefd2e3c24..af660c08944 100644 --- a/core/src/com/cloud/user/dao/UserDaoImpl.java +++ b/core/src/com/cloud/user/dao/UserDaoImpl.java @@ -72,42 +72,42 @@ public class UserDaoImpl extends GenericDaoBase implements UserDao @Override public UserVO getUser(String username, String password) { - SearchCriteria sc = UsernamePasswordSearch.create(); + SearchCriteria sc = UsernamePasswordSearch.create(); sc.setParameters("username", username); sc.setParameters("password", password); return findOneActiveBy(sc); } public List listByAccount(long accountId) { - SearchCriteria sc = AccountIdSearch.create(); + SearchCriteria sc = AccountIdSearch.create(); sc.setParameters("account", accountId); return listActiveBy(sc, null); } @Override public UserVO getUser(String username) { - SearchCriteria sc = UsernameSearch.create(); + SearchCriteria sc = UsernameSearch.create(); sc.setParameters("username", username); return findOneActiveBy(sc); } @Override public UserVO getUser(long userId) { - SearchCriteria sc = UserIdSearch.create(); + SearchCriteria sc = UserIdSearch.create(); sc.setParameters("id", userId); return findOneActiveBy(sc); } @Override public List findUsersLike(String username) { - SearchCriteria sc = UsernameLikeSearch.create(); + SearchCriteria sc = UsernameLikeSearch.create(); sc.setParameters("username", "%" + username + "%"); return listActiveBy(sc); } @Override public UserVO findUserBySecretKey(String secretKey) { - SearchCriteria sc = SecretKeySearch.create(); + SearchCriteria sc = SecretKeySearch.create(); sc.setParameters("secretKey", secretKey); return findOneActiveBy(sc); } diff --git a/core/src/com/cloud/user/dao/UserStatisticsDaoImpl.java b/core/src/com/cloud/user/dao/UserStatisticsDaoImpl.java index 72298ba8848..26e7c37d486 100644 --- a/core/src/com/cloud/user/dao/UserStatisticsDaoImpl.java +++ b/core/src/com/cloud/user/dao/UserStatisticsDaoImpl.java @@ -59,7 +59,7 @@ public class UserStatisticsDaoImpl extends GenericDaoBase sc = UserDcSearch.create(); + SearchCriteria sc = UserDcSearch.create(); sc.setParameters("account", accountId); sc.setParameters("dc", dcId); return findOneActiveBy(sc); @@ -67,7 +67,7 @@ public class UserStatisticsDaoImpl extends GenericDaoBase sc = UserDcSearch.create(); + SearchCriteria sc = UserDcSearch.create(); sc.setParameters("account", accountId); sc.setParameters("dc", dcId); return lock(sc, true); @@ -75,7 +75,7 @@ public class UserStatisticsDaoImpl extends GenericDaoBase listBy(long accountId) { - SearchCriteria sc = UserSearch.create(); + SearchCriteria sc = UserSearch.create(); sc.setParameters("account", accountId); return search(sc, null); } diff --git a/core/src/com/cloud/vm/ConsoleProxyVO.java b/core/src/com/cloud/vm/ConsoleProxyVO.java index 20499b437b8..c3adc03387d 100644 --- a/core/src/com/cloud/vm/ConsoleProxyVO.java +++ b/core/src/com/cloud/vm/ConsoleProxyVO.java @@ -18,16 +18,16 @@ package com.cloud.vm; -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; -import javax.persistence.PrimaryKeyJoinColumn; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; -import javax.persistence.Transient; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; /** * ConsoleProxyVO domain object @@ -97,6 +97,7 @@ public class ConsoleProxyVO extends VMInstanceVO implements ConsoleProxy { public ConsoleProxyVO( long id, String name, + State state, String guestMacAddress, String guestIpAddress, String guestNetMask, @@ -119,8 +120,8 @@ public class ConsoleProxyVO extends VMInstanceVO implements ConsoleProxy { String domain, int ramSize, int activeSession) { - super(id, name, name, Type.ConsoleProxy, templateId, guestOSId, - privateMacAddress, privateIpAddress, privateNetmask, dataCenterId, podId, true, hostId); + super(id, name, name, state, Type.ConsoleProxy, templateId, guestOSId, + privateMacAddress, privateIpAddress, privateNetmask, dataCenterId, podId, true, hostId, null, null); this.gateway = gateway; this.publicIpAddress = publicIpAddress; this.publicNetmask = publicNetmask; diff --git a/core/src/com/cloud/vm/DomainRouterVO.java b/core/src/com/cloud/vm/DomainRouterVO.java index 13f6c94c939..a9a78954d4b 100755 --- a/core/src/com/cloud/vm/DomainRouterVO.java +++ b/core/src/com/cloud/vm/DomainRouterVO.java @@ -96,6 +96,7 @@ public class DomainRouterVO extends VMInstanceVO implements DomainRouter { public DomainRouterVO(long id, String name, String instanceName, + State state, String privateMacAddress, String privateIpAddress, String privateNetmask, @@ -120,7 +121,7 @@ public class DomainRouterVO extends VMInstanceVO implements DomainRouter { Long hostId, String dns1, String dns2) { - super(id, name, instanceName, Type.DomainRouter, templateId, guestOSId, privateMacAddress, privateIpAddress, privateNetmask, dataCenterId, podId, true, hostId); + super(id, name, instanceName, state, Type.DomainRouter, templateId, guestOSId, privateMacAddress, privateIpAddress, privateNetmask, dataCenterId, podId, true, hostId, null, null); this.privateMacAddress = privateMacAddress; this.guestMacAddress = guestMacAddress; this.guestIpAddress = guestIpAddress; @@ -164,7 +165,7 @@ public class DomainRouterVO extends VMInstanceVO implements DomainRouter { String domain, String dns1, String dns2) { - this(id, name, name, privateMacAddress, privateIpAddress, privateNetmask, templateId, guestOSId, guestMacAddress, guestIpAddress, guestNetmask, null, accountId, domainId, publicMacAddress, publicIpAddress, publicNetMask, vlanDbId, vlanId, podId, dataCenterId, ramSize, gateway, domain, null, dns1, dns2); + this(id, name, name, State.Creating, privateMacAddress, privateIpAddress, privateNetmask, templateId, guestOSId, guestMacAddress, guestIpAddress, guestNetmask, null, accountId, domainId, publicMacAddress, publicIpAddress, publicNetMask, vlanDbId, vlanId, podId, dataCenterId, ramSize, gateway, domain, null, dns1, dns2); } public long getAccountId() { diff --git a/core/src/com/cloud/vm/SecondaryStorageVmVO.java b/core/src/com/cloud/vm/SecondaryStorageVmVO.java index 716af5b9fb0..1395d5e8601 100644 --- a/core/src/com/cloud/vm/SecondaryStorageVmVO.java +++ b/core/src/com/cloud/vm/SecondaryStorageVmVO.java @@ -17,15 +17,15 @@ */ package com.cloud.vm; -import java.util.Date; - -import javax.persistence.Column; -import javax.persistence.DiscriminatorValue; -import javax.persistence.Entity; -import javax.persistence.PrimaryKeyJoinColumn; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; /** * SecondaryStorageVmVO domain object @@ -91,6 +91,7 @@ public class SecondaryStorageVmVO extends VMInstanceVO implements SecondaryStora public SecondaryStorageVmVO( long id, String name, + State state, String guestMacAddress, String guestIpAddress, String guestNetMask, @@ -114,8 +115,8 @@ public class SecondaryStorageVmVO extends VMInstanceVO implements SecondaryStora int ramSize, String guid, String nfsShare) { - super(id, name, name, Type.SecondaryStorageVm, templateId, guestOSId, - privateMacAddress, privateIpAddress, privateNetmask, dataCenterId, podId, true, hostId); + super(id, name, name, state, Type.SecondaryStorageVm, templateId, guestOSId, + privateMacAddress, privateIpAddress, privateNetmask, dataCenterId, podId, true, hostId, null, null); this.gateway = gateway; this.publicIpAddress = publicIpAddress; this.publicNetmask = publicNetmask; diff --git a/core/src/com/cloud/vm/State.java b/core/src/com/cloud/vm/State.java new file mode 100644 index 00000000000..81692497d9f --- /dev/null +++ b/core/src/com/cloud/vm/State.java @@ -0,0 +1,99 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.vm; + +import java.util.List; + +import com.cloud.utils.fsm.StateMachine; + +public enum State { + Creating(true), + Starting(true), + Running(false), + Stopping(true), + Stopped(false), + Destroyed(false), + Expunging(true), + Migrating(true), + Error(false), + Unknown(false); + + private final boolean _transitional; + + private State(boolean transitional) { + _transitional = transitional; + } + + public boolean isTransitional() { + return _transitional; + } + + public static String[] toStrings(State... states) { + String[] strs = new String[states.length]; + for (int i = 0; i < states.length; i++) { + strs[i] = states[i].toString(); + } + + return strs; + } + + public State getNextState(VirtualMachine.Event e) { + return s_fsm.getNextState(this, e); + } + + public State[] getFromStates(VirtualMachine.Event e) { + List from = s_fsm.getFromStates(this, e); + return from.toArray(new State[from.size()]); + } + + protected static final StateMachine s_fsm = new StateMachine(); + static { + s_fsm.addTransition(null, VirtualMachine.Event.CreateRequested, State.Creating); + s_fsm.addTransition(State.Creating, VirtualMachine.Event.OperationSucceeded, State.Stopped); + s_fsm.addTransition(State.Creating, VirtualMachine.Event.OperationFailed, State.Destroyed); + s_fsm.addTransition(State.Stopped, VirtualMachine.Event.StartRequested, State.Starting); + s_fsm.addTransition(State.Stopped, VirtualMachine.Event.DestroyRequested, State.Destroyed); + s_fsm.addTransition(State.Stopped, VirtualMachine.Event.StopRequested, State.Stopped); + s_fsm.addTransition(State.Stopped, VirtualMachine.Event.AgentReportStopped, State.Stopped); + s_fsm.addTransition(State.Starting, VirtualMachine.Event.OperationRetry, State.Starting); + s_fsm.addTransition(State.Starting, VirtualMachine.Event.OperationSucceeded, State.Running); + s_fsm.addTransition(State.Starting, VirtualMachine.Event.OperationFailed, State.Stopped); + s_fsm.addTransition(State.Starting, VirtualMachine.Event.AgentReportRunning, State.Running); + s_fsm.addTransition(State.Starting, VirtualMachine.Event.AgentReportStopped, State.Stopped); + s_fsm.addTransition(State.Destroyed, VirtualMachine.Event.RecoveryRequested, State.Stopped); + s_fsm.addTransition(State.Destroyed, VirtualMachine.Event.ExpungeOperation, State.Expunging); + s_fsm.addTransition(State.Creating, VirtualMachine.Event.MigrationRequested, State.Destroyed); + s_fsm.addTransition(State.Running, VirtualMachine.Event.MigrationRequested, State.Migrating); + s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportRunning, State.Running); + s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportStopped, State.Stopped); + s_fsm.addTransition(State.Running, VirtualMachine.Event.StopRequested, State.Stopping); + s_fsm.addTransition(State.Migrating, VirtualMachine.Event.MigrationRequested, State.Migrating); + s_fsm.addTransition(State.Migrating, VirtualMachine.Event.OperationSucceeded, State.Running); + s_fsm.addTransition(State.Migrating, VirtualMachine.Event.OperationFailed, State.Running); + s_fsm.addTransition(State.Migrating, VirtualMachine.Event.AgentReportRunning, State.Running); + s_fsm.addTransition(State.Migrating, VirtualMachine.Event.AgentReportStopped, State.Stopped); + s_fsm.addTransition(State.Stopping, VirtualMachine.Event.OperationSucceeded, State.Stopped); + s_fsm.addTransition(State.Stopping, VirtualMachine.Event.OperationFailed, State.Running); + s_fsm.addTransition(State.Stopping, VirtualMachine.Event.AgentReportRunning, State.Running); + s_fsm.addTransition(State.Stopping, VirtualMachine.Event.AgentReportStopped, State.Stopped); + s_fsm.addTransition(State.Stopping, VirtualMachine.Event.StopRequested, State.Stopping); + s_fsm.addTransition(State.Expunging, VirtualMachine.Event.OperationFailed, State.Expunging); + s_fsm.addTransition(State.Expunging, VirtualMachine.Event.ExpungeOperation, State.Expunging); + } +} diff --git a/core/src/com/cloud/vm/UserVm.java b/core/src/com/cloud/vm/UserVm.java new file mode 100755 index 00000000000..17b0ec87f02 --- /dev/null +++ b/core/src/com/cloud/vm/UserVm.java @@ -0,0 +1,59 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.vm; + +/** + * This represents one running virtual machine instance. + */ +public interface UserVm extends VirtualMachine { + + /** + * @return service offering id + */ + public long getServiceOfferingId(); + + /** + * @return the domain router associated with this vm. + */ + public Long getDomainRouterId(); + + /** + * @return the vnet associated with this vm. + */ + public String getVnet(); + + /** + * @return the account this vm instance belongs to. + */ + public long getAccountId(); + + /** + * @return the domain this vm instance belongs to. + */ + public long getDomainId(); + + /** + * @return ip address within the guest network. + */ + public String getGuestIpAddress(); + + /** + * @return mac address of the guest network. + */ + public String getGuestMacAddress(); +} diff --git a/core/src/com/cloud/vm/UserVmVO.java b/core/src/com/cloud/vm/UserVmVO.java index fd4b9a69dd7..062c0f0a59e 100755 --- a/core/src/com/cloud/vm/UserVmVO.java +++ b/core/src/com/cloud/vm/UserVmVO.java @@ -23,8 +23,6 @@ import javax.persistence.Entity; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; -import com.cloud.uservm.UserVm; - @Entity @Table(name="user_vm") @DiscriminatorValue(value="User") @@ -55,14 +53,8 @@ public class UserVmVO extends VMInstanceVO implements UserVm { @Column(name="guest_netmask") String guestNetmask; - @Column(name="iso_id", nullable=true, length=17) - private Long isoId = null; - @Column(name="external_ip_address") String externalIpAddress; - - @Column(name="group", updatable=true, nullable=true) - private String group; @Column(name="external_mac_address") String externalMacAddress; @@ -72,9 +64,6 @@ public class UserVmVO extends VMInstanceVO implements UserVm { @Column(name="user_data", updatable=true, nullable=true, length=2048) private String userData; - - @Column(name="display_name", updatable=true, nullable=true) - private String displayName; @Override public long getAccountId() { @@ -113,12 +102,7 @@ public class UserVmVO extends VMInstanceVO implements UserVm { this.guestNetmask = guestNetmask; setPrivateNetmask(guestNetmask); } - - @Override - public Long getIsoId() { - return isoId; - } - + @Override public Long getDomainRouterId() { return domainRouterId; @@ -146,15 +130,6 @@ public class UserVmVO extends VMInstanceVO implements UserVm { return vnet; } - @Override - public String getGroup() { - return group; - } - - public void setGroup(String group) { - this.group = group; - } - public UserVmVO(long id, String name, long templateId, @@ -175,7 +150,7 @@ public class UserVmVO extends VMInstanceVO implements UserVm { String displayName, String group, String userData) { - super(id, name, name, Type.User, templateId, guestOSId, guestMacAddress, guestIpAddress, guestNetMask, dcId, podId, haEnabled, null); + super(id, name, Type.User, templateId, guestOSId, guestMacAddress, guestIpAddress, guestNetMask, dcId, podId, haEnabled, null, displayName, group); this.serviceOfferingId = serviceOfferingId; this.domainRouterId = routerId; this.accountId = accountId; @@ -187,10 +162,6 @@ public class UserVmVO extends VMInstanceVO implements UserVm { this.externalMacAddress = externalMacAddress; this.setUserData(userData); this.setExternalVlanDbId(vlanDbId); - this.group = group; - this.isoId = null; - this.displayName = displayName; - this.group = group; } protected UserVmVO() { @@ -201,10 +172,6 @@ public class UserVmVO extends VMInstanceVO implements UserVm { return externalIpAddress; } - public void setIsoId(Long id) { - this.isoId = id; - } - public void setExternalIpAddress(String externalIpAddress) { this.externalIpAddress = externalIpAddress; } @@ -225,22 +192,11 @@ public class UserVmVO extends VMInstanceVO implements UserVm { return externalVlanDbId; } - @Override public void setUserData(String userData) { this.userData = userData; } - @Override public String getUserData() { return userData; } - - @Override - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } } diff --git a/core/src/com/cloud/vm/VMInstanceVO.java b/core/src/com/cloud/vm/VMInstanceVO.java index 2e9296b136c..6dd7bf0ba38 100644 --- a/core/src/com/cloud/vm/VMInstanceVO.java +++ b/core/src/com/cloud/vm/VMInstanceVO.java @@ -45,11 +45,17 @@ public class VMInstanceVO implements VirtualMachine { @Id @TableGenerator(name="vm_instance_sq", table="sequence", pkColumnName="name", valueColumnName="value", pkColumnValue="vm_instance_seq", allocationSize=1) @Column(name="id", updatable=false, nullable = false) - private long id; + private Long id = null; @Column(name="name", updatable=false, nullable=false, length=255) private String name = null; + @Column(name="storage_ip") + private String storageIp = null; + + @Column(name="display_name", updatable=true, nullable=true) + private String displayName; + @Column(name="vnc_password", updatable=true, nullable=false, length=255) String vncPassword; @@ -60,6 +66,9 @@ public class VMInstanceVO implements VirtualMachine { @Column(name="proxy_assign_time", updatable=true, nullable=true) Date proxyAssignTime; + @Column(name="group", updatable=true, nullable=true) + private String group; + /** * Note that state is intentionally missing the setter. Any updates to * the state machine needs to go through the DAO object because someone @@ -78,6 +87,9 @@ public class VMInstanceVO implements VirtualMachine { @Column(name="vm_template_id", updatable=false, nullable=true, length=17) private Long templateId = new Long(-1); + @Column(name="iso_id", nullable=true, length=17) + private Long isoId = null; + @Column(name="guest_os_id", nullable=false, length=17) private long guestOSId; @@ -123,8 +135,26 @@ public class VMInstanceVO implements VirtualMachine { Date updateTime; public VMInstanceVO(long id, + String name, + Type type, + long templateId, + long guestOSId, + String privateMacAddress, + String privateIpAddress, + String privateNetmask, + long dataCenterId, + long podId, + boolean haEnabled, + Long hostId, + String displayName, + String group) { + this(id, name, name, State.Creating, type, templateId, guestOSId, privateMacAddress, privateIpAddress, privateNetmask, dataCenterId, podId, haEnabled, hostId, displayName, group); + } + + public VMInstanceVO(Long id, String name, String instanceName, + State state, Type type, long vmTemplateId, long guestOSId, @@ -134,7 +164,9 @@ public class VMInstanceVO implements VirtualMachine { long dataCenterId, long podId, boolean haEnabled, - Long hostId) { + Long hostId, + String displayName, + String group) { super(); this.id = id; this.name = name; @@ -149,13 +181,20 @@ public class VMInstanceVO implements VirtualMachine { this.hostId = hostId; this.dataCenterId = dataCenterId; this.podId = podId; + this.state = state; this.type = type; this.haEnabled = haEnabled; this.instanceName = instanceName; + this.storageIp = null; this.updated = 0; this.updateTime = new Date(); + if (displayName != null) + this.displayName = displayName; + else if (type == Type.User) + this.displayName = name; + this.group = group; + this.vncPassword = Long.toHexString(new Random().nextLong()); - this.state = State.Creating; } protected VMInstanceVO() { @@ -174,7 +213,7 @@ public class VMInstanceVO implements VirtualMachine { return updated; } - public long getId() { + public Long getId() { return id; } @@ -273,6 +312,11 @@ public class VMInstanceVO implements VirtualMachine { this.templateId = templateId; } + @Override + public Long getIsoId() { + return isoId; + } + public long getGuestOSId() { return guestOSId; } @@ -281,6 +325,11 @@ public class VMInstanceVO implements VirtualMachine { this.guestOSId = guestOSId; } + @Override + public void setIsoId(Long isoId) { + this.isoId = isoId; + } + public void incrUpdated() { updated++; } @@ -318,6 +367,14 @@ public class VMInstanceVO implements VirtualMachine { return podId; } + public String getStorageIp() { + return storageIp; + } + + public void setStorageIp(String storageIp) { + this.storageIp = storageIp; + } + public void setPodId(long podId) { this.podId = podId; } @@ -334,6 +391,7 @@ public class VMInstanceVO implements VirtualMachine { return removed != null; } + @Override public boolean isMirroredVols() { return mirroredVols; } @@ -346,6 +404,24 @@ public class VMInstanceVO implements VirtualMachine { this.mirroredVols = mirroredVols; } + @Override + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + @Override + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + @Override public String toString() { return new StringBuilder("[").append(type.toString()).append("|").append(instanceName).append("]").toString(); diff --git a/core/src/com/cloud/vm/VirtualMachine.java b/core/src/com/cloud/vm/VirtualMachine.java new file mode 100755 index 00000000000..67dc85e5fb3 --- /dev/null +++ b/core/src/com/cloud/vm/VirtualMachine.java @@ -0,0 +1,153 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.vm; + +import java.util.Date; + +public interface VirtualMachine { + public enum Event { + CreateRequested, + StartRequested, + StopRequested, + DestroyRequested, + RecoveryRequested, + AgentReportStopped, + AgentReportRunning, + MigrationRequested, + ExpungeOperation, + OperationSucceeded, + OperationFailed, + OperationRetry, + OperationCancelled + }; + + public enum Type { + User, + DomainRouter, + ConsoleProxy, + SecondaryStorageVm + } + + public String getInstanceName(); + + /** + * @return the id of this virtual machine. null means the id has not been set. + */ + public Long getId(); + + /** + * @return the name of the virtual machine. + */ + public String getName(); + + /** + * @return the ip address of the virtual machine. + */ + public String getPrivateIpAddress(); + + /** + * @return mac address. + */ + public String getPrivateMacAddress(); + + /** + * @return password of the host for vnc purposes. + */ + public String getVncPassword(); + + /** + * @return the state of the virtual machine + */ + public State getState(); + + /** + * @return template id. + */ + public long getTemplateId(); + + /** + * return iso id + * @return + */ + public Long getIsoId(); + + /** + * update the id of the iso attached to this vm (null = no iso attached) + * @param isoId + */ + public void setIsoId(Long isoId); + + /** + * returns the guest OS ID + * @return guestOSId + */ + public long getGuestOSId(); + + /** + * sets the guest OS ID + * @param guestOSId + */ + public void setGuestOSId(long guestOSId); + + /** + * @return pod id. + */ + public long getPodId(); + + /** + * @return data center id. + */ + public long getDataCenterId(); + + /** + * @return id of the host it is running on. If not running, returns null. + */ + public Long getHostId(); + + /** + * @return id of the host it was assigned last time. + */ + public Long getLastHostId(); + + /** + * @return should HA be enabled for this machine? + */ + public boolean isHaEnabled(); + + /** + * @return are the volumes on this VM mirrored? + */ + public boolean isMirroredVols(); + + /** + * @return date when machine was created + */ + public Date getCreated(); + + Type getType(); + + /** + * @return display name of the vm. + */ + public String getDisplayName(); + + /** + * @return group of the vm. + */ + public String getGroup(); +} diff --git a/core/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java b/core/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java index 2d33f98aeb4..9d72fc840a9 100644 --- a/core/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java +++ b/core/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java @@ -18,17 +18,17 @@ package com.cloud.vm.dao; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import javax.ejb.Local; - -import org.apache.log4j.Logger; - +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + import com.cloud.info.ConsoleProxyLoadInfo; import com.cloud.utils.Pair; import com.cloud.utils.db.Attribute; @@ -160,7 +160,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase im return false; } - SearchCriteria sc = StateChangeSearch.create(); + SearchCriteria sc = StateChangeSearch.create(); sc.setParameters("id", vm.getId()); sc.setParameters("states", oldState); sc.setParameters("host", vm.getHostId()); @@ -228,7 +228,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase im @Override public List getProxyListInStates(long dataCenterId, State... states) { - SearchCriteria sc = DataCenterStatusSearch.create(); + SearchCriteria sc = DataCenterStatusSearch.create(); sc.setParameters("states", (Object[])states); sc.setParameters("dc", dataCenterId); return listActiveBy(sc); @@ -236,21 +236,21 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase im @Override public List getProxyListInStates(State... states) { - SearchCriteria sc = StateSearch.create(); + SearchCriteria sc = StateSearch.create(); sc.setParameters("states", (Object[])states); return listActiveBy(sc); } @Override public List listByHostId(long hostId) { - SearchCriteria sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("host", hostId); return listActiveBy(sc); } @Override public List listUpByHostId(long hostId) { - SearchCriteria sc = HostUpSearch.create(); + SearchCriteria sc = HostUpSearch.create(); sc.setParameters("host", hostId); sc.setParameters("states", new Object[] {State.Destroyed, State.Stopped, State.Expunging}); return listActiveBy(sc); diff --git a/core/src/com/cloud/vm/dao/DomainRouterDaoImpl.java b/core/src/com/cloud/vm/dao/DomainRouterDaoImpl.java index 2a12035ded4..a12d32e964a 100755 --- a/core/src/com/cloud/vm/dao/DomainRouterDaoImpl.java +++ b/core/src/com/cloud/vm/dao/DomainRouterDaoImpl.java @@ -121,7 +121,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase im @Override public DomainRouterVO findByPublicIpAddress(String ipAddress) { - SearchCriteria sc = IpSearch.create(); + SearchCriteria sc = IpSearch.create(); sc.setParameters("ip", ipAddress); return findOneActiveBy(sc); } @@ -159,7 +159,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase im return false; } - SearchCriteria sc = StateChangeSearch.create(); + SearchCriteria sc = StateChangeSearch.create(); sc.setParameters("id", router.getId()); sc.setParameters("states", oldState); sc.setParameters("host", router.getHostId()); @@ -194,14 +194,14 @@ public class DomainRouterDaoImpl extends GenericDaoBase im @Override public List listByDataCenter(long dcId) { - SearchCriteria sc = DcSearch.create(); + SearchCriteria sc = DcSearch.create(); sc.setParameters("dc", dcId); return listActiveBy(sc); } @Override public DomainRouterVO findBy(long accountId, long dcId) { - SearchCriteria sc = AccountDcRoleSearch.create(); + SearchCriteria sc = AccountDcRoleSearch.create(); sc.setParameters("account", accountId); sc.setParameters("dc", dcId); sc.setParameters("role", Role.DHCP_FIREWALL_LB_PASSWD_USERDATA); @@ -210,7 +210,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase im @Override public DomainRouterVO findBy(long accountId, long dcId, Role role) { - SearchCriteria sc = AccountDcRoleSearch.create(); + SearchCriteria sc = AccountDcRoleSearch.create(); sc.setParameters("account", accountId); sc.setParameters("dc", dcId); sc.setParameters("role", role); @@ -219,24 +219,22 @@ public class DomainRouterDaoImpl extends GenericDaoBase im @Override public List listBy(long accountId) { - SearchCriteria sc = AccountSearch.create(); + SearchCriteria sc = AccountSearch.create(); sc.setParameters("account", accountId); return listActiveBy(sc); } @Override public List listByHostId(Long hostId) { - SearchCriteria sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("host", hostId); return listActiveBy(sc); } @Override public List listUpByHostId(Long hostId) { - SearchCriteria sc = HostUpSearch.create(); - if(hostId != null){ - sc.setParameters("host", hostId); - } + SearchCriteria sc = HostUpSearch.create(); + sc.setParameters("host", hostId); sc.setParameters("states", new Object[] {State.Destroyed, State.Stopped, State.Expunging}); return listActiveBy(sc); } @@ -285,14 +283,14 @@ public class DomainRouterDaoImpl extends GenericDaoBase im @Override public List listByDomain(Long domainId) { - SearchCriteria sc = DomainIdSearch.create(); + SearchCriteria sc = DomainIdSearch.create(); sc.setParameters("domainId", domainId); return listBy(sc); } @Override public List listByVlanDbId(Long vlanDbId) { - SearchCriteria sc = VlanDbIdSearch.create(); + SearchCriteria sc = VlanDbIdSearch.create(); sc.setParameters("vlanDbId", vlanDbId); return listBy(sc); } diff --git a/core/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java b/core/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java index 2005b324888..64578a3fa11 100644 --- a/core/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java +++ b/core/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java @@ -17,17 +17,17 @@ */ package com.cloud.vm.dao; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import javax.ejb.Local; - -import org.apache.log4j.Logger; - +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + import com.cloud.utils.db.Attribute; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -100,7 +100,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase sc = StateChangeSearch.create(); + SearchCriteria sc = StateChangeSearch.create(); sc.setParameters("id", vm.getId()); sc.setParameters("states", oldState); sc.setParameters("host", vm.getHostId()); @@ -155,7 +155,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase getSecStorageVmListInStates(long dataCenterId, State... states) { - SearchCriteria sc = DataCenterStatusSearch.create(); + SearchCriteria sc = DataCenterStatusSearch.create(); sc.setParameters("states", (Object[])states); sc.setParameters("dc", dataCenterId); return listActiveBy(sc); @@ -163,21 +163,21 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase getSecStorageVmListInStates(State... states) { - SearchCriteria sc = StateSearch.create(); + SearchCriteria sc = StateSearch.create(); sc.setParameters("states", (Object[])states); return listActiveBy(sc); } @Override public List listByHostId(long hostId) { - SearchCriteria sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("host", hostId); return listActiveBy(sc); } @Override public List listUpByHostId(long hostId) { - SearchCriteria sc = HostUpSearch.create(); + SearchCriteria sc = HostUpSearch.create(); sc.setParameters("host", hostId); sc.setParameters("states", new Object[] {State.Destroyed, State.Stopped, State.Expunging}); return listActiveBy(sc); @@ -206,7 +206,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase listByZoneId(long zoneId) { - SearchCriteria sc = ZoneSearch.create(); + SearchCriteria sc = ZoneSearch.create(); sc.setParameters("zone", zoneId); return listActiveBy(sc); } diff --git a/core/src/com/cloud/vm/dao/UserVmDao.java b/core/src/com/cloud/vm/dao/UserVmDao.java index 72faff705a2..e9b8104317d 100755 --- a/core/src/com/cloud/vm/dao/UserVmDao.java +++ b/core/src/com/cloud/vm/dao/UserVmDao.java @@ -58,15 +58,16 @@ public interface UserVmDao extends GenericDao { */ boolean updateIf(UserVmVO vm, VirtualMachine.Event event, Long hostId); - /** - * Updates display name and group for vm; enables/disables ha - * @param id vm id. - * @param displan name, group and enable for ha - */ - void updateVM(long id, String displayName, String group, boolean enable); - List findDestroyedVms(Date date); + /** + * Find all vms that are running and using this ip address. + * @param dcId datacenter id + * @param podId pod id + * @param ipAddress ip address of the storage server. + */ + List findVMsUsingIpAddress(long dcId, long podId, String ipAddress); + /** * Find all vms that use a domain router * @param routerId diff --git a/core/src/com/cloud/vm/dao/UserVmDaoImpl.java b/core/src/com/cloud/vm/dao/UserVmDaoImpl.java index 6e75bc179bb..956b8ca149f 100755 --- a/core/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/core/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -24,7 +24,7 @@ import javax.ejb.Local; import org.apache.log4j.Logger; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.utils.component.ComponentLocator; @@ -51,6 +51,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use protected final SearchBuilder HostRunningSearch; protected final SearchBuilder NameSearch; protected final SearchBuilder StateChangeSearch; + protected final SearchBuilder StorageIpSearch; protected final SearchBuilder GuestIpSearch; protected final SearchBuilder DestroySearch; @@ -105,6 +106,12 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use StateChangeSearch.and("update", StateChangeSearch.entity().getUpdated(), SearchCriteria.Op.EQ); StateChangeSearch.done(); + StorageIpSearch = createSearchBuilder(); + StorageIpSearch.and("dc", StorageIpSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); + StorageIpSearch.and("pod", StorageIpSearch.entity().getPodId(), SearchCriteria.Op.EQ); + StorageIpSearch.and("ip", StorageIpSearch.entity().getStorageIp(), SearchCriteria.Op.EQ); + StorageIpSearch.done(); + GuestIpSearch = createSearchBuilder(); GuestIpSearch.and("dc", GuestIpSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); GuestIpSearch.and("ip", GuestIpSearch.entity().getGuestIpAddress(), SearchCriteria.Op.EQ); @@ -121,7 +128,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use } public List listByAccountAndPod(long accountId, long podId) { - SearchCriteria sc = AccountPodSearch.create(); + SearchCriteria sc = AccountPodSearch.create(); sc.setParameters("account", accountId); sc.setParameters("pod", podId); @@ -129,7 +136,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use } public List listByAccountAndDataCenter(long accountId, long dcId) { - SearchCriteria sc = AccountDataCenterSearch.create(); + SearchCriteria sc = AccountDataCenterSearch.create(); sc.setParameters("account", accountId); sc.setParameters("dc", dcId); @@ -138,8 +145,8 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use @Override public List listBy(long routerId, State... states) { - SearchCriteria sc = RouterStateSearch.create(); - SearchCriteria ssc = createSearchCriteria(); + SearchCriteria sc = RouterStateSearch.create(); + SearchCriteria ssc = createSearchCriteria(); sc.setParameters("router", routerId); for (State state: states) { @@ -149,18 +156,9 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use return listBy(sc); } - @Override - public void updateVM(long id, String displayName, String group, boolean enable) { - UserVmVO vo = createForUpdate(); - vo.setDisplayName(displayName); - vo.setGroup(group); - vo.setHaEnabled(enable); - update(id, vo); - } - @Override public List listByRouterId(long routerId) { - SearchCriteria sc = RouterIdSearch.create(); + SearchCriteria sc = RouterIdSearch.create(); sc.setParameters("router", routerId); @@ -186,7 +184,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use return false; } - SearchCriteria sc = StateChangeSearch.create(); + SearchCriteria sc = StateChangeSearch.create(); sc.setParameters("id", vm.getId()); sc.setParameters("states", oldState); sc.setParameters("host", vm.getHostId()); @@ -218,9 +216,19 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use return result > 0; } + @Override + public List findVMsUsingIpAddress(long dcId, long podId, String ipAddress) { + SearchCriteria sc = StorageIpSearch.create(); + sc.setParameters("dc", dcId); + sc.setParameters("pod", podId); + sc.setParameters("ip", ipAddress); + + return listActiveBy(sc); + } + @Override public List findDestroyedVms(Date date) { - SearchCriteria sc = DestroySearch.create(); + SearchCriteria sc = DestroySearch.create(); sc.setParameters("state", State.Destroyed, State.Expunging); sc.setParameters("updateTime", date); @@ -228,13 +236,13 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use } public List listByAccountId(long id) { - SearchCriteria sc = AccountSearch.create(); + SearchCriteria sc = AccountSearch.create(); sc.setParameters("account", id); return listActiveBy(sc); } public List listByHostId(Long id) { - SearchCriteria sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("host", id); return listActiveBy(sc); @@ -242,14 +250,14 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use @Override public List listUpByHostId(Long hostId) { - SearchCriteria sc = HostUpSearch.create(); + SearchCriteria sc = HostUpSearch.create(); sc.setParameters("host", hostId); sc.setParameters("states", new Object[] {State.Destroyed, State.Stopped, State.Expunging}); return listActiveBy(sc); } public List listRunningByHostId(long hostId) { - SearchCriteria sc = HostRunningSearch.create(); + SearchCriteria sc = HostRunningSearch.create(); sc.setParameters("host", hostId); sc.setParameters("state", State.Running); @@ -257,7 +265,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use } public UserVmVO findByName(String name) { - SearchCriteria sc = NameSearch.create(); + SearchCriteria sc = NameSearch.create(); sc.setParameters("name", name); return findOneBy(sc); } @@ -276,7 +284,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use AccountDataCenterVirtualSearch.done(); } - SearchCriteria sc = AccountDataCenterVirtualSearch.create(); + SearchCriteria sc = AccountDataCenterVirtualSearch.create(); sc.setParameters("account", accountId); sc.setParameters("dc", dcId); sc.setJoinParameters("offeringSearch", "guestIpType", ServiceOffering.GuestIpType.Virtualized); @@ -286,7 +294,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use @Override public List listVmsUsingGuestIpAddress(long dcId, String ipAddress) { - SearchCriteria sc = GuestIpSearch.create(); + SearchCriteria sc = GuestIpSearch.create(); sc.setParameters("dc", dcId); sc.setParameters("ip", ipAddress); sc.setParameters("states", new Object[] {State.Destroyed, State.Expunging}); diff --git a/core/src/com/cloud/vm/dao/VMInstanceDao.java b/core/src/com/cloud/vm/dao/VMInstanceDao.java index 653445ad331..e3ccf5d8868 100644 --- a/core/src/com/cloud/vm/dao/VMInstanceDao.java +++ b/core/src/com/cloud/vm/dao/VMInstanceDao.java @@ -52,6 +52,13 @@ public interface VMInstanceDao extends GenericDao { */ public List listNonExpungedByZoneAndTemplate(long zoneId, long templateId); + /** + * Updates display name and group for vm; enables/disables ha + * @param id vm id. + * @param displan name, group and enable for ha + */ + void updateVM(long id, String displayName, String group, boolean enalbe); + boolean updateIf(VMInstanceVO vm, VirtualMachine.Event event, Long hostId); /** diff --git a/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java index 3ec6b2a12dc..2923ffa778e 100644 --- a/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -128,7 +128,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem @Override public List findVMInstancesLike(String name) { - SearchCriteria sc = NameLikeSearch.create(); + SearchCriteria sc = NameLikeSearch.create(); sc.setParameters("name", "%" + name + "%"); return listActiveBy(sc); } @@ -146,7 +146,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem return false; } - SearchCriteria sc = StateChangeSearch.create(); + SearchCriteria sc = StateChangeSearch.create(); sc.setParameters("id", vm.getId()); sc.setParameters("states", oldState); sc.setParameters("host", vm.getHostId()); @@ -169,9 +169,18 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem return result > 0; } + @Override + public void updateVM(long id, String displayName, String group, boolean enable) { + VMInstanceVO vo = createForUpdate(); + vo.setDisplayName(displayName); + vo.setGroup(group); + vo.setHaEnabled(enable); + update(id, vo); + } + @Override public List listByHostId(long hostid) { - SearchCriteria sc = HostSearch.create(); + SearchCriteria sc = HostSearch.create(); sc.setParameters("host", hostid); return listActiveBy(sc); @@ -179,7 +188,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem @Override public List listByLastHostId(long hostId) { - SearchCriteria sc = LastHostSearch.create(); + SearchCriteria sc = LastHostSearch.create(); sc.setParameters("lastHost", hostId); return listActiveBy(sc); @@ -187,7 +196,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem @Override public List listByZoneId(long zoneId) { - SearchCriteria sc = ZoneSearch.create(); + SearchCriteria sc = ZoneSearch.create(); sc.setParameters("zone", zoneId); return listActiveBy(sc); @@ -195,7 +204,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem @Override public List listNonExpungedByZoneAndTemplate(long zoneId, long templateId) { - SearchCriteria sc = ZoneTemplateNonExpungedSearch.create(); + SearchCriteria sc = ZoneTemplateNonExpungedSearch.create(); sc.setParameters("zone", zoneId); sc.setParameters("template", templateId); @@ -206,7 +215,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem @Override public List findVMInTransition(Date time, State... states) { - SearchCriteria sc = TransitionSearch.create(); + SearchCriteria sc = TransitionSearch.create(); sc.setParameters("states", (Object[]) states); sc.setParameters("updateTime", time); @@ -237,7 +246,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem @Override public List listByHostIdTypes(long hostid, Type... types) { - SearchCriteria sc = HostIdTypesSearch.create(); + SearchCriteria sc = HostIdTypesSearch.create(); sc.setParameters("hostid", hostid); sc.setParameters("types", (Object[]) types); return listActiveBy(sc); @@ -245,7 +254,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem @Override public List listUpByHostIdTypes(long hostid, Type... types) { - SearchCriteria sc = HostIdUpTypesSearch.create(); + SearchCriteria sc = HostIdUpTypesSearch.create(); sc.setParameters("hostid", hostid); sc.setParameters("types", (Object[]) types); sc.setParameters("states", new Object[] {State.Destroyed, State.Stopped, State.Expunging}); @@ -254,14 +263,14 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem @Override public List listByTypes(Type... types) { - SearchCriteria sc = TypesSearch.create(); + SearchCriteria sc = TypesSearch.create(); sc.setParameters("types", (Object[]) types); return listActiveBy(sc); } @Override public VMInstanceVO findByIdTypes(long id, Type... types) { - SearchCriteria sc = IdTypesSearch.create(); + SearchCriteria sc = IdTypesSearch.create(); sc.setParameters("id", id); sc.setParameters("types", (Object[]) types); return findOneBy(sc); diff --git a/debian/changelog b/debian/changelog index 3d671289c9c..3661f93d8ee 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,32 @@ -cloud (2.1.98) unstable; urgency=low +cloud (2.1.2.1) unstable; urgency=low + + * Releasing 2.1.2.1 + + -- Rudd-O Fri, 6 Aug 2010 18:03:32 -0700 + +cloud (2.1.2) unstable; urgency=low + + * Releasing 2.1.2 + + -- Rudd-O Wed, 28 Jul 2010 14:34:15 -0700 + +cloud (2.1.1) unstable; urgency=low + + * Releasing 2.1.1 + + -- Kevin Sun, 25 Jul 2010 22:15:30 -0700 + +cloud (2.1.0) unstable; urgency=low + + * Releasing 2.1.0 + + -- Rudd-O Wed, 21 Jul 2010 20:19:40 -0700 + +cloud (2.0.99) unstable; urgency=low * Bumping version number for next Cloud.com release - -- Rudd-O Sat, 31 Jul 2010 19:09:54 -0700 + -- Rudd-O Sun, 18 Jul 2010 23:32:40 -0700 cloud (2.0.97) unstable; urgency=low diff --git a/debian/cloud-agent-libs.install b/debian/cloud-agent-libs.install deleted file mode 100644 index 538f0686fac..00000000000 --- a/debian/cloud-agent-libs.install +++ /dev/null @@ -1 +0,0 @@ -/usr/share/java/cloud-agent.jar diff --git a/debian/cloud-agent.install b/debian/cloud-agent.install index 5a053116690..a607b34d34f 100644 --- a/debian/cloud-agent.install +++ b/debian/cloud-agent.install @@ -1,3 +1,4 @@ +/usr/share/java/cloud-agent.jar /etc/cloud/agent/agent.properties /etc/cloud/agent/developer.properties.template /etc/cloud/agent/environment.properties diff --git a/debian/cloud-utils.install b/debian/cloud-utils.install index 14204856b57..e2b895ee057 100644 --- a/debian/cloud-utils.install +++ b/debian/cloud-utils.install @@ -1,5 +1,3 @@ /usr/share/java/cloud-utils.jar -/usr/share/java/cloud-api.jar /usr/share/doc/cloud/sccs-info -/usr/share/doc/cloud/version-info -/usr/share/doc/cloud/configure-info +/usr/share/doc/cloud/configure-info \ No newline at end of file diff --git a/debian/control b/debian/control index ef4e379e20d..005fc23bd42 100644 --- a/debian/control +++ b/debian/control @@ -139,19 +139,12 @@ Description: Cloud.com Python library The Cloud.com Python library contains a few Python modules that the CloudStack uses. -Package: cloud-agent-libs -Architecture: any -Depends: openjdk-6-jre, cloud-utils (= ${source:Version}), cloud-core (= ${source:Version}), cloud-deps (= ${source:Version}), libcommons-httpclient-java, libcommons-collections-java, libcommons-dbcp-java, libcommons-pool-java, libcommons-logging-java -Description: Cloud.com agent libraries - The Cloud.com agent libraries are used by the Cloud Agent and the Cloud - Console Proxy. - Package: cloud-agent Provides: vmops-agent Conflicts: vmops-agent Replaces: vmops-agent Architecture: any -Depends: openjdk-6-jre, cloud-utils (= ${source:Version}), cloud-core (= ${source:Version}), cloud-deps (= ${source:Version}), python, cloud-python (= ${source:Version}), cloud-agent-libs (= ${source:Version}), cloud-agent-scripts (= ${source:Version}), cloud-vnet (= ${source:Version}), libcommons-httpclient-java, libcommons-collections-java, libcommons-dbcp-java, libcommons-pool-java, libcommons-logging-java, libvirt0, cloud-daemonize, sysvinit-utils, chkconfig, qemu-kvm, libvirt-bin, cgroup-bin, augeas-tools, uuid-runtime, rsync, grep, iproute +Depends: openjdk-6-jre, cloud-utils (= ${source:Version}), cloud-core (= ${source:Version}), cloud-deps (= ${source:Version}), cloud-python (= ${source:Version}), cloud-agent-scripts (= ${source:Version}), cloud-vnet (= ${source:Version}), libcommons-httpclient-java, libcommons-collections-java, libcommons-dbcp-java, libcommons-pool-java, libcommons-logging-java, libvirt0, cloud-daemonize, sysvinit-utils, chkconfig, qemu-kvm, libvirt-bin, cgroup-bin, augeas-tools, uuid-runtime, rsync Description: Cloud.com agent The Cloud.com agent is in charge of managing shared computing resources in a Cloud.com Cloud Stack-powered cloud. Install this package if this computer @@ -159,7 +152,7 @@ Description: Cloud.com agent Package: cloud-console-proxy Architecture: any -Depends: openjdk-6-jre, cloud-utils (= ${source:Version}), cloud-core (= ${source:Version}), cloud-deps (= ${source:Version}), cloud-agent-libs (= ${source:Version}), python, cloud-python (= ${source:Version}), libcommons-httpclient-java, libcommons-collections-java, libcommons-dbcp-java, libcommons-pool-java, libcommons-logging-java, cloud-daemonize, sysvinit-utils, chkconfig, augeas-tools, uuid-runtime, grep, iproute +Depends: openjdk-6-jre, cloud-utils (= ${source:Version}), cloud-core (= ${source:Version}), cloud-deps (= ${source:Version}), cloud-agent (= ${source:Version}), libcommons-httpclient-java, libcommons-collections-java, libcommons-dbcp-java, libcommons-pool-java, libcommons-logging-java, cloud-daemonize, sysvinit-utils, chkconfig, augeas-tools, uuid-runtime Description: Cloud.com console proxy The Cloud.com console proxy is the service in charge of granting console access into virtual machines managed by the Cloud.com CloudStack. diff --git a/debian/rules b/debian/rules index 7ab70329fd8..c6e42010916 100755 --- a/debian/rules +++ b/debian/rules @@ -31,8 +31,7 @@ configure-stamp: #Architecture -# build: build-arch build-indep -build: build-arch +build: build-arch build-indep build-arch: build-arch-stamp build-arch-stamp: configure-stamp @@ -41,13 +40,13 @@ build-arch-stamp: configure-stamp ./waf build --build-number=$(BUILDNUMBER) touch $@ -# build-indep: build-indep-stamp -# build-indep-stamp: configure-stamp -# -# # Add here commands to compile the indep part of the package. -# #$(MAKE) doc -# touch $@ -# +build-indep: build-indep-stamp +build-indep-stamp: configure-stamp + + # Add here commands to compile the indep part of the package. + #$(MAKE) doc + touch $@ + clean: dh_testdir dh_testroot @@ -58,19 +57,18 @@ clean: dh_clean -install: install-arch -# install: install-indep install-arch -# install-indep: -# dh_testdir -# dh_testroot -# dh_prep -i -# dh_installdirs -i -# -# # Add here commands to install the indep part of the package into -# # debian/-doc. -# #INSTALLDOC# -# -# dh_install -i +install: install-indep install-arch +install-indep: + dh_testdir + dh_testroot + dh_prep -i + dh_installdirs -i + + # Add here commands to install the indep part of the package into + # debian/-doc. + #INSTALLDOC# + + dh_install -i install-arch: dh_testdir @@ -92,7 +90,7 @@ binary-common: dh_testroot dh_installchangelogs dh_installdocs -A README HACKING -# dh_installexamples + dh_installexamples # dh_installmenu # dh_installdebconf # dh_installlogrotate @@ -116,14 +114,12 @@ binary-common: dh_md5sums dh_builddeb # Build architecture independant packages using the common target. -# binary-indep: build-indep install-indep -# $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common +binary-indep: build-indep install-indep + $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common # Build architecture dependant packages using the common target. binary-arch: build-arch install-arch $(MAKE) -f debian/rules DH_OPTIONS=-s binary-common -# binary: binary-arch binary-indep -binary: binary-arch -# .PHONY: build clean binary-indep binary-arch binary install install-indep install-arch configure -.PHONY: build clean binary-arch binary install install-arch configure +binary: binary-arch binary-indep +.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch configure diff --git a/patches/kvm/root/edithosts.sh b/patches/kvm/root/edithosts.sh index 06c961cf8a5..5cd5bea4c2d 100755 --- a/patches/kvm/root/edithosts.sh +++ b/patches/kvm/root/edithosts.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: edithosts.sh 9947 2010-06-25 19:34:24Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/patches/kvm/root/edithosts.sh $ +# $Id: edithosts.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/patches/kvm/root/edithosts.sh $ # edithosts.sh -- edit the dhcphosts file on the routing domain # $1 : the mac address # $2 : the associated ip address diff --git a/patches/kvm/root/reconfigLB.sh b/patches/kvm/root/reconfigLB.sh index 3b1155ebfde..1f69960873a 100755 --- a/patches/kvm/root/reconfigLB.sh +++ b/patches/kvm/root/reconfigLB.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: reconfigLB.sh 9947 2010-06-25 19:34:24Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/patches/kvm/root/reconfigLB.sh $ +# $Id: reconfigLB.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/patches/kvm/root/reconfigLB.sh $ # @VERSION@ # save previous state diff --git a/patches/kvm/root/send_password_to_domu.sh b/patches/kvm/root/send_password_to_domu.sh index d785fa41e55..5be7195ac99 100755 --- a/patches/kvm/root/send_password_to_domu.sh +++ b/patches/kvm/root/send_password_to_domu.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: send_password_to_domu.sh 9947 2010-06-25 19:34:24Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/patches/kvm/root/send_password_to_domu.sh $ +# $Id: send_password_to_domu.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/patches/kvm/root/send_password_to_domu.sh $ # @VERSION@ # set -x diff --git a/patches/xenserver/root/firewall.sh b/patches/xenserver/root/firewall.sh index 89cd0d4a95e..a95958ca023 100755 --- a/patches/xenserver/root/firewall.sh +++ b/patches/xenserver/root/firewall.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: firewall.sh 9947 2010-06-25 19:34:24Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/patches/xenserver/root/firewall.sh $ +# $Id: firewall.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/patches/xenserver/root/firewall.sh $ # firewall.sh -- allow some ports / protocols to vm instances # # diff --git a/patches/xenserver/root/loadbalancer.sh b/patches/xenserver/root/loadbalancer.sh index f6c2c5d7e93..7a05b4e841e 100755 --- a/patches/xenserver/root/loadbalancer.sh +++ b/patches/xenserver/root/loadbalancer.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: loadbalancer.sh 9947 2010-06-25 19:34:24Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/patches/xenserver/root/loadbalancer.sh $ +# $Id: loadbalancer.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/patches/xenserver/root/loadbalancer.sh $ # loadbalancer.sh -- reconfigure loadbalancer rules # # diff --git a/python/lib/cloud_utils.py b/python/lib/cloud_utils.py index d6ee34d9bfc..ce1332e1f76 100644 --- a/python/lib/cloud_utils.py +++ b/python/lib/cloud_utils.py @@ -859,47 +859,10 @@ def restore_etc(targetdir): def remove_backup(targetdir): check_call( ["rm","-rf",targetdir] ) -def list_zonespods(host): - text = urllib2.urlopen('http://%s:8096/client/api?command=listPods'%host).read(-1) - dom = xml.dom.minidom.parseString(text) - x = [ (zonename,podname) - for pod in dom.childNodes[0].childNodes - for podname in [ x.childNodes[0].wholeText for x in pod.childNodes if x.tagName == "name" ] - for zonename in [ x.childNodes[0].wholeText for x in pod.childNodes if x.tagName == "zonename" ] - ] - return x - -def prompt_for_hostpods(zonespods): - """Ask user to select one from those zonespods - Returns (zone,pod) or None if the user made the default selection.""" - while True: - stderr("Type the number of the zone and pod combination this host belongs to (hit ENTER to skip this step)") - print " N) ZONE, POD" - print "================" - for n,(z,p) in enumerate(zonespods): - print "%3d) %s, %s"%(n,z,p) - print "================" - zoneandpod = raw_input().strip() - - if not zoneandpod: - # we go with default, do not touch anything, just break - return None - - try: - # if parsing fails as an int, just vomit and retry - zoneandpod = int(zoneandpod) - if zoneandpod >= len(zonespods) or zoneandpod < 0: raise ValueError, "%s out of bounds"%zoneandpod - except ValueError,e: - stderr(str(e)) - continue # re-ask - - # oh yeah, the int represents an valid zone and pod index in the array - return zonespods[zoneandpod] - # this configures the agent -def setup_agent_config(configfile): - stderr("Examining Agent configuration") +def setup_agent_config(configfile,brname): + stderr("Examining agent configuration") fn = configfile text = file(fn).read(-1) lines = [ s.strip() for s in text.splitlines() ] @@ -907,7 +870,7 @@ def setup_agent_config(configfile): confposes = dict([ (m.split("=",1)[0],n) for n,m in enumerate(lines) if "=" in m and not m.startswith("#") ]) if not "guid" in confopts: - stderr("Generating GUID for this Agent") + stderr("Generating GUID for this agent") confopts['guid'] = uuidgen().stdout.strip() try: host = confopts["host"] @@ -917,56 +880,49 @@ def setup_agent_config(configfile): if newhost: host = newhost confopts["host"] = host + confopts["private.network.device"] = brname + confopts["public.network.device"] = brname + stderr("Querying %s for zones and pods",host) try: - x = list_zonespods(confopts['host']) - zoneandpod = prompt_for_hostpods(x) - if zoneandpod: - confopts["zone"],confopts["pod"] = zoneandpod - stderr("You selected zone %s pod %s",e,confopts["zone"],confopts["pod"]) - else: - stderr("Skipped -- using the previous zone %s pod %s",confopts["zone"],confopts["pod"]) - except (urllib2.URLError,urllib2.HTTPError),e: - stderr("Query failed: %s. Defaulting to zone %s pod %s",confopts["zone"],confopts["pod"]) - for opt,val in confopts.items(): - line = "=".join([opt,val]) - if opt not in confposes: lines.append(line) - else: lines[confposes[opt]] = line + text = urllib2.urlopen('http://%s:8096/client/api?command=listPods'%confopts["host"]).read(-1) + dom = xml.dom.minidom.parseString(text) + x = [ (zonename,podname) + for pod in dom.childNodes[0].childNodes + for podname in [ x.childNodes[0].wholeText for x in pod.childNodes if x.tagName == "name" ] + for zonename in [ x.childNodes[0].wholeText for x in pod.childNodes if x.tagName == "zonename" ] + ] + + while True: + + stderr("Type the number of the zone and pod combination this host belongs to (hit ENTER to skip this step)") + print " N) ZONE, POD" + print "================" + for n,(z,p) in enumerate(x): + print "%3d) %s, %s"%(n,z,p) + print "================" + zoneandpod = raw_input().strip() + + if not zoneandpod: + # we go with default, do not touch anything, just break + break + + try: + # if parsing fails as an int, just vomit and retry + zoneandpod = int(zoneandpod) + if zoneandpod >= len(x) or zoneandpod < 0: raise ValueError, "%s out of bounds"%zoneandpod + except ValueError,e: + stderr(str(e)) + continue # re-ask + + # oh yeah, the int represents an valid zone and pod index in the array + zone,pod = x[zoneandpod] + confopts["zone"] = zone + confopts["pod"] = pod + break - text = "\n".join(lines) - file(fn,"w").write(text) - -def setup_consoleproxy_config(configfile): - stderr("Examining Console Proxy configuration") - fn = configfile - text = file(fn).read(-1) - lines = [ s.strip() for s in text.splitlines() ] - confopts = dict([ m.split("=",1) for m in lines if "=" in m and not m.startswith("#") ]) - confposes = dict([ (m.split("=",1)[0],n) for n,m in enumerate(lines) if "=" in m and not m.startswith("#") ]) - - if not "guid" in confopts: - stderr("Generating GUID for this Console Proxy") - confopts['guid'] = uuidgen().stdout.strip() - - try: host = confopts["host"] - except KeyError: host = "localhost" - stderr("Please enter the host name of the management server that this console-proxy will connect to: (just hit ENTER to go with %s)",host) - newhost = raw_input().strip() - if newhost: host = newhost - confopts["host"] = host - - stderr("Querying %s for zones and pods",host) - - try: - x = list_zonespods(confopts['host']) - zoneandpod = prompt_for_hostpods(x) - if zoneandpod: - confopts["zone"],confopts["pod"] = zoneandpod - stderr("You selected zone %s pod %s",confopts["zone"],confopts["pod"]) - else: - stderr("Skipped -- using the previous zone %s pod %s",confopts["zone"],confopts["pod"]) except (urllib2.URLError,urllib2.HTTPError),e: stderr("Query failed: %s. Defaulting to zone %s pod %s",e,confopts["zone"],confopts["pod"]) @@ -978,6 +934,7 @@ def setup_consoleproxy_config(configfile): text = "\n".join(lines) file(fn,"w").write(text) + # =========================== DATABASE MIGRATION SUPPORT CODE =================== # Migrator, Migratee and Evolvers -- this is the generic infrastructure. diff --git a/python/lib/cloud_utils.pyc b/python/lib/cloud_utils.pyc deleted file mode 100644 index 061c199488c..00000000000 Binary files a/python/lib/cloud_utils.pyc and /dev/null differ diff --git a/scripts/.project b/scripts/.project index 6f05a336478..18d524952cc 100644 --- a/scripts/.project +++ b/scripts/.project @@ -5,13 +5,7 @@ - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature diff --git a/scripts/installer/createtmplt.sh b/scripts/installer/createtmplt.sh index 9fa32d14dab..aa69dbd481e 100755 --- a/scripts/installer/createtmplt.sh +++ b/scripts/installer/createtmplt.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/installer/createtmplt.sh $ +# $Id: createtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/installer/createtmplt.sh $ # createtmplt.sh -- install a template usage() { diff --git a/scripts/installer/installcentos.sh b/scripts/installer/installcentos.sh index f0acfbe90d0..debcadeb9c5 100755 --- a/scripts/installer/installcentos.sh +++ b/scripts/installer/installcentos.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: installcentos.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/installer/installcentos.sh $ +# $Id: installcentos.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/installer/installcentos.sh $ # set -x usage() { diff --git a/scripts/installer/installdomp.sh b/scripts/installer/installdomp.sh index 034d00fa08b..eca2fd1cf33 100755 --- a/scripts/installer/installdomp.sh +++ b/scripts/installer/installdomp.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: installdomp.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/installer/installdomp.sh $ +# $Id: installdomp.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/installer/installdomp.sh $ #set -x usage() { diff --git a/scripts/installer/installrtr.sh b/scripts/installer/installrtr.sh index 76df51b5d21..e1df6ccd63a 100755 --- a/scripts/installer/installrtr.sh +++ b/scripts/installer/installrtr.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: installrtr.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/installer/installrtr.sh $ +# $Id: installrtr.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/installer/installrtr.sh $ #set -x usage() { diff --git a/scripts/installer/run_installer.sh b/scripts/installer/run_installer.sh index e8d2a7ddcac..b4b50576ba6 100755 --- a/scripts/installer/run_installer.sh +++ b/scripts/installer/run_installer.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: run_installer.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/installer/run_installer.sh $ +# $Id: run_installer.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/installer/run_installer.sh $ installer=$1 classname="com.vmops.installer.VMOpsSimpleSetup" diff --git a/scripts/network/domr/dhcp_entry.sh b/scripts/network/domr/dhcp_entry.sh index 027347c61c3..3d973b64631 100755 --- a/scripts/network/domr/dhcp_entry.sh +++ b/scripts/network/domr/dhcp_entry.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: dhcp_entry.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/network/domr/dhcp_entry.sh $ +# $Id: dhcp_entry.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/network/domr/dhcp_entry.sh $ # dhcp_entry.sh -- add dhcp entry on domr # # @VERSION@ diff --git a/scripts/network/domr/firewall.sh b/scripts/network/domr/firewall.sh index 56ee70facbc..d9dd1d94ad4 100755 --- a/scripts/network/domr/firewall.sh +++ b/scripts/network/domr/firewall.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: firewall.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/network/domr/firewall.sh $ +# $Id: firewall.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/network/domr/firewall.sh $ # firewall.sh -- allow some ports / protocols to vm instances # # diff --git a/scripts/network/domr/firewall_vlan.sh b/scripts/network/domr/firewall_vlan.sh index 707e347c711..602a1fbbf8b 100755 --- a/scripts/network/domr/firewall_vlan.sh +++ b/scripts/network/domr/firewall_vlan.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: firewall_vlan.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/network/domr/firewall_vlan.sh $ +# $Id: firewall_vlan.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/network/domr/firewall_vlan.sh $ # firewall.sh -- allow some ports / protocols to vm instances # # diff --git a/scripts/network/domr/ipassoc.sh b/scripts/network/domr/ipassoc.sh index 91b0f1d3698..192b91c0708 100755 --- a/scripts/network/domr/ipassoc.sh +++ b/scripts/network/domr/ipassoc.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: ipassoc.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/network/domr/ipassoc.sh $ +# $Id: ipassoc.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/network/domr/ipassoc.sh $ # ipassoc.sh -- associate/disassociate a public ip with an instance # # diff --git a/scripts/network/domr/ipassoc_vlan.sh b/scripts/network/domr/ipassoc_vlan.sh index 5ce94cde0e6..d503cbf6396 100755 --- a/scripts/network/domr/ipassoc_vlan.sh +++ b/scripts/network/domr/ipassoc_vlan.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: ipassoc_vlan.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/network/domr/ipassoc_vlan.sh $ +# $Id: ipassoc_vlan.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/network/domr/ipassoc_vlan.sh $ # ipassoc.sh -- associate/disassociate a public ip with an instance # # diff --git a/scripts/network/domr/loadbalancer.sh b/scripts/network/domr/loadbalancer.sh index 9cc3b71c1d1..65a6394410e 100755 --- a/scripts/network/domr/loadbalancer.sh +++ b/scripts/network/domr/loadbalancer.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: loadbalancer.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/network/domr/loadbalancer.sh $ +# $Id: loadbalancer.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/network/domr/loadbalancer.sh $ # loadbalancer.sh -- reconfigure loadbalancer rules # # diff --git a/scripts/network/domr/loadbalancer_vlan.sh b/scripts/network/domr/loadbalancer_vlan.sh index 9a29c884e6c..25c98bb0762 100755 --- a/scripts/network/domr/loadbalancer_vlan.sh +++ b/scripts/network/domr/loadbalancer_vlan.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: loadbalancer_vlan.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/network/domr/loadbalancer_vlan.sh $ +# $Id: loadbalancer_vlan.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/network/domr/loadbalancer_vlan.sh $ # loadbalancer.sh -- reconfigure loadbalancer rules # # diff --git a/scripts/network/domr/save_password_to_domr.sh b/scripts/network/domr/save_password_to_domr.sh index 56f1becde8c..0727669ca75 100755 --- a/scripts/network/domr/save_password_to_domr.sh +++ b/scripts/network/domr/save_password_to_domr.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: save_password_to_domr.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/network/domr/save_password_to_domr.sh $ +# $Id: save_password_to_domr.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/network/domr/save_password_to_domr.sh $ # @VERSION@ #replace a line in a file of the form key=value diff --git a/scripts/storage/checkchildren.sh b/scripts/storage/checkchildren.sh index d1e4c1a0380..e96b470acfa 100755 --- a/scripts/storage/checkchildren.sh +++ b/scripts/storage/checkchildren.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: checkchildren.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/checkchildren.sh $ +# $Id: checkchildren.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/checkchildren.sh $ # checkchdilren.sh -- Does this path has children? # diff --git a/scripts/storage/installIso.sh b/scripts/storage/installIso.sh index 8e80c745934..2c5ca74a0dd 100755 --- a/scripts/storage/installIso.sh +++ b/scripts/storage/installIso.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: installIso.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/installIso.sh $ +# $Id: installIso.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/installIso.sh $ # installIso.sh -- install an iso usage() { diff --git a/scripts/storage/qcow2/cleanupmyvms.sh b/scripts/storage/qcow2/cleanupmyvms.sh index 2903393d90f..1ff1a48bf32 100755 --- a/scripts/storage/qcow2/cleanupmyvms.sh +++ b/scripts/storage/qcow2/cleanupmyvms.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: cleanupmyvms.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/cleanupmyvms.sh $ +# $Id: cleanupmyvms.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/cleanupmyvms.sh $ # @VERSION@ if [ "$1" == "" ] diff --git a/scripts/storage/qcow2/create_private_template.sh b/scripts/storage/qcow2/create_private_template.sh index e5d5702a6ea..cd1cfdd0de9 100755 --- a/scripts/storage/qcow2/create_private_template.sh +++ b/scripts/storage/qcow2/create_private_template.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: create_private_template.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/create_private_template.sh $ +# $Id: create_private_template.sh 9804 2010-06-22 18:36:49Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/create_private_template.sh $ # create_private_template.sh -- create a private template from a snapshot # # @VERSION@ diff --git a/scripts/storage/qcow2/createtmplt.sh b/scripts/storage/qcow2/createtmplt.sh index cc235e0d7ac..8dedd0c0744 100755 --- a/scripts/storage/qcow2/createtmplt.sh +++ b/scripts/storage/qcow2/createtmplt.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createtmplt.sh 11474 2010-08-06 05:53:02Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/createtmplt.sh $ +# $Id: createtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/createtmplt.sh $ # createtmplt.sh -- install a template usage() { @@ -9,6 +9,15 @@ usage() { #set -x +rollback_if_needed() { + if [ $2 -gt 0 ] + then + printf "$3\n" + #back out all changes + rm -rf $1 + exit 2 +fi +} verify_cksum() { echo "$1 $2" | md5sum -c --status @@ -69,10 +78,11 @@ create_from_file() { local tmpltfs=$1 local tmpltimg=$2 local tmpltname=$3 - + local volsize=$4 + local cleanup=$5 #copy the file to the disk - cp $tmpltimg /$tmpltfs/$tmpltname + mv $tmpltimg /$tmpltfs/$tmpltname if [ "$cleanup" == "true" ] then @@ -111,6 +121,9 @@ do d) dflag=1 descr="$OPTARG" ;; + h) hflag=1 + hvm="true" + ;; u) cleanup="true" ;; ?) usage @@ -119,16 +132,20 @@ do esac done -if [ "$tflag$nflag$fflag" != "111" ] +if [ "$tflag$nflag$fflag$sflag" != "1111" ] then usage exit 2 fi +if [ -n "$cksum" ] +then + verify_cksum $cksum $tmpltimg +fi if [ ! -d /$tmpltfs ] then - mkdir -p /$tmpltfs + mkdir /$tmpltfs if [ $? -gt 0 ] then printf "Failed to create user fs $tmpltfs\n" >&2 @@ -136,22 +153,52 @@ then fi fi -if [ ! -f $tmpltimg ] +tmpltimg2=$(uncompress $tmpltimg) +tmpltimg2=$(untar $tmpltimg2 /$tmpltfs vmi-root) + +if [ ! -f $tmpltimg2 ] then - printf "root disk file $tmpltimg doesn't exist\n" + rollback_if_needed $tmpltfs 2 "root disk file $tmpltimg doesn't exist\n" exit 3 fi +# need the 'G' suffix on volume size +if [ ${volsize:(-1)} != G ] +then + volsize=${volsize}G +fi -create_from_file $tmpltfs $tmpltimg $tmpltname +#determine source file size -- it needs to be less than or equal to volsize +imgsize=$(ls -lh $tmpltimg2| awk -F" " '{print $5}') +if [ ${imgsize:(-1)} == G ] +then + imgsize=${imgsize%G} #strip out the G + imgsize=${imgsize%.*} #...and any decimal part + let imgsize=imgsize+1 # add 1 to compensate for decimal part + volsizetmp=${volsize%G} + if [ $volsizetmp -lt $imgsize ] + then + volsize=${imgsize}G + fi +fi +tgtfile=${tmpltfs}/vmi-root-${tmpltname} + +create_from_file $tmpltfs $tmpltimg2 $tmpltname $volsize $cleanup + +tgtfilename=$(echo $tmpltimg2 | awk -F"/" '{print $NF}') touch /$tmpltfs/template.properties +rollback_if_needed $tmpltfs $? "Failed to create template.properties file" echo -n "" > /$tmpltfs/template.properties today=$(date '+%m_%d_%Y') echo "filename=$tmpltname" > /$tmpltfs/template.properties echo "snapshot.name=$today" >> /$tmpltfs/template.properties echo "description=$descr" >> /$tmpltfs/template.properties +echo "checksum=$cksum" >> /$tmpltfs/template.properties +echo "hvm=$hvm" >> /$tmpltfs/template.properties +echo "volume.size=$volsize" >> /$tmpltfs/template.properties + if [ "$cleanup" == "true" ] then diff --git a/scripts/storage/qcow2/createvm.sh b/scripts/storage/qcow2/createvm.sh index 4de40eeb148..5c541ec71a1 100755 --- a/scripts/storage/qcow2/createvm.sh +++ b/scripts/storage/qcow2/createvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createvm.sh 10292 2010-07-07 00:24:04Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/createvm.sh $ +# $Id: createvm.sh 10292 2010-07-07 00:24:04Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/createvm.sh $ # createvm.sh -- create a vm image # diff --git a/scripts/storage/qcow2/delvm.sh b/scripts/storage/qcow2/delvm.sh index bbbf1bad486..ff60b83cca3 100755 --- a/scripts/storage/qcow2/delvm.sh +++ b/scripts/storage/qcow2/delvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: delvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/delvm.sh $ +# $Id: delvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/delvm.sh $ # delvm.sh -- delete a cloned image used for a vm # diff --git a/scripts/storage/qcow2/get_domr_kernel.sh b/scripts/storage/qcow2/get_domr_kernel.sh index f0f6dd42a8f..f1c56cb4541 100644 --- a/scripts/storage/qcow2/get_domr_kernel.sh +++ b/scripts/storage/qcow2/get_domr_kernel.sh @@ -1,5 +1,5 @@ #/bin/bash -# $Id: get_domr_kernel.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/get_domr_kernel.sh $ +# $Id: get_domr_kernel.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/get_domr_kernel.sh $ set -x diff --git a/scripts/storage/qcow2/get_iqn.sh b/scripts/storage/qcow2/get_iqn.sh index 435c8cf2b53..b48adf7bb78 100755 --- a/scripts/storage/qcow2/get_iqn.sh +++ b/scripts/storage/qcow2/get_iqn.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: get_iqn.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/get_iqn.sh $ +# $Id: get_iqn.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/get_iqn.sh $ # get_iqn.sh -- return iSCSI iqn of initiator (Linux) or target (OpenSolaris) usage() { diff --git a/scripts/storage/qcow2/listvmdisk.sh b/scripts/storage/qcow2/listvmdisk.sh index 44d323ee76b..b2f7ed4881b 100755 --- a/scripts/storage/qcow2/listvmdisk.sh +++ b/scripts/storage/qcow2/listvmdisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/listvmdisk.sh $ +# $Id: listvmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/listvmdisk.sh $ # listvmdisk.sh -- list disks of a VM usage() { diff --git a/scripts/storage/qcow2/listvmdisksize.sh b/scripts/storage/qcow2/listvmdisksize.sh index 12dd665ce54..f251540bf38 100755 --- a/scripts/storage/qcow2/listvmdisksize.sh +++ b/scripts/storage/qcow2/listvmdisksize.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmdisksize.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/listvmdisksize.sh $ +# $Id: listvmdisksize.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/listvmdisksize.sh $ # listvmdisksize.sh -- list disk sizes of a VM # diff --git a/scripts/storage/qcow2/listvmtmplt.sh b/scripts/storage/qcow2/listvmtmplt.sh index 1e2ad032b08..8881f5b1c52 100755 --- a/scripts/storage/qcow2/listvmtmplt.sh +++ b/scripts/storage/qcow2/listvmtmplt.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/listvmtmplt.sh $ +# $Id: listvmtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/listvmtmplt.sh $ # listtmplt.sh -- list templates under a directory usage() { diff --git a/scripts/storage/qcow2/managesnapshot.sh b/scripts/storage/qcow2/managesnapshot.sh index 5890a360f4f..bc7c5f0d2fe 100755 --- a/scripts/storage/qcow2/managesnapshot.sh +++ b/scripts/storage/qcow2/managesnapshot.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: managesnapshot.sh 11474 2010-08-06 05:53:02Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/managesnapshot.sh $ +# $Id: managesnapshot.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/managesnapshot.sh $ # managesnapshot.sh -- manage snapshots for a single disk (create, destroy, rollback) # @@ -7,7 +7,6 @@ usage() { printf "Usage: %s: -c -n \n" $(basename $0) >&2 printf "Usage: %s: -d -n \n" $(basename $0) >&2 printf "Usage: %s: -r -n \n" $(basename $0) >&2 - printf "Usage: %s: -b -n -p \n" $(basename $0) >&2 exit 2 } @@ -64,72 +63,46 @@ rollback_snapshot() { return $failed } -backup_snapshot() { - local disk=$1 - local snapshotname=$2 - local destPath=$3 - if [ ! -d $destPath ] - then - mkdir -p $destPath >& /dev/null - if [ $? -gt 0 ] - then - printf "Failed to create $destPath" >&2 - return 3 - fi - fi - - # Does the snapshot exist? - cloud-qemu-img snapshot -l $disk|grep -w "$snapshotname" >& /dev/null - if [ $? -gt 0 ] - then - printf "there is no $snapshotname on disk $disk" >&2 - return 1 - fi - - cloud-qemu-img convert -f qcow2 -O qcow2 -s $snapshotname $disk $destPath/$snapshotname >& /dev/null - if [ $? -gt 0 ] - then - printf "Failed to backup $snapshotname for disk $disk to $destPath" >&2 - return 2 - fi - return 0 -} #set -x cflag= dflag= rflag= -bflag= nflag= pathval= snapshot= -while getopts 'c:d:r:n:b:p:' OPTION +while getopts 'c:d:r:n:' OPTION do case $OPTION in c) cflag=1 - pathval="$OPTARG" - ;; + pathval="$OPTARG" + ;; d) dflag=1 pathval="$OPTARG" ;; r) rflag=1 pathval="$OPTARG" ;; - b) bflag=1 - pathval="$OPTARG" - ;; n) nflag=1 - snapshot="$OPTARG" - ;; - p) destPath="$OPTARG" - ;; + snapshot="$OPTARG" + ;; ?) usage - ;; + ;; esac done +if [ "$nflag" != "1" ] +then + usage +fi + +if [ "$cflag$dflag$rflag" != "1" ] +then + printf "***Specify one of -c (create), -d (destroy), or -r (rollback) and a path for the target snapshot\n" >&2 + usage +fi if [ "$cflag" == "1" ] then @@ -139,15 +112,10 @@ elif [ "$dflag" == "1" ] then destroy_snapshot $pathval $snapshot exit $? -elif [ "$bflag" == "1" ] -then - backup_snapshot $pathval $snapshot $destPath - exit $? elif [ "$rflag" == "1" ] then - rollback_snapshot $pathval $snapshot $destPath + rollback_snapshot $pathval $snapshot exit $? fi - exit 0 diff --git a/scripts/storage/qcow2/managevolume.sh b/scripts/storage/qcow2/managevolume.sh index e023e2e1ff3..926c3277fc6 100644 --- a/scripts/storage/qcow2/managevolume.sh +++ b/scripts/storage/qcow2/managevolume.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: managevolume.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/managevolume.sh $ +# $Id: managevolume.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/managevolume.sh $ # modifyvolume.sh -- add or delete a disk volume # diff --git a/scripts/storage/qcow2/modifyvlan.sh b/scripts/storage/qcow2/modifyvlan.sh index 4ead8387e6a..62ad9479bd1 100644 --- a/scripts/storage/qcow2/modifyvlan.sh +++ b/scripts/storage/qcow2/modifyvlan.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: modifyvlan.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/qcow2/modifyvlan.sh $ +# $Id: modifyvlan.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/qcow2/modifyvlan.sh $ # modifyvlan.sh -- adds and deletes VLANs from a Routing Server # # diff --git a/scripts/storage/secondary/createtmplt.sh b/scripts/storage/secondary/createtmplt.sh index c686b8b7640..e6ec2514ec5 100755 --- a/scripts/storage/secondary/createtmplt.sh +++ b/scripts/storage/secondary/createtmplt.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/secondary/createtmplt.sh $ +# $Id: createtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/secondary/createtmplt.sh $ # createtmplt.sh -- install a template usage() { diff --git a/scripts/storage/secondary/installIso.sh b/scripts/storage/secondary/installIso.sh index 6f879e68a67..7e6740c0d29 100755 --- a/scripts/storage/secondary/installIso.sh +++ b/scripts/storage/secondary/installIso.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: installIso.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/secondary/installIso.sh $ +# $Id: installIso.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/secondary/installIso.sh $ # installIso.sh -- install an iso usage() { diff --git a/scripts/storage/secondary/installrtng.sh b/scripts/storage/secondary/installrtng.sh index e2e423d0745..33e2029b64b 100755 --- a/scripts/storage/secondary/installrtng.sh +++ b/scripts/storage/secondary/installrtng.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: installrtng.sh 11251 2010-07-23 23:40:44Z abhishek $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/secondary/installrtng.sh $ +# $Id: installrtng.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/secondary/installrtng.sh $ usage() { printf "Usage: %s: -m -f [-F]\n" $(basename $0) >&2 printf "or\n" >&2 @@ -47,8 +47,6 @@ then exit 4 fi -mntpoint=`echo "$mntpoint" | sed 's|/*$||'` - destdir=$mntpoint/template/tmpl/1/1/ mkdir -p $destdir diff --git a/scripts/storage/secondary/listvmtmplt.sh b/scripts/storage/secondary/listvmtmplt.sh index 8ac297bd365..c1646d11452 100755 --- a/scripts/storage/secondary/listvmtmplt.sh +++ b/scripts/storage/secondary/listvmtmplt.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/secondary/listvmtmplt.sh $ +# $Id: listvmtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/secondary/listvmtmplt.sh $ # listtmplt.sh -- list templates under a directory usage() { diff --git a/scripts/storage/zfs/iscsi/comstar/createtmplt.sh b/scripts/storage/zfs/iscsi/comstar/createtmplt.sh index e992b3f7291..f19286e81fd 100755 --- a/scripts/storage/zfs/iscsi/comstar/createtmplt.sh +++ b/scripts/storage/zfs/iscsi/comstar/createtmplt.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/createtmplt.sh $ +# $Id: createtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/createtmplt.sh $ # createtmplt.sh -- install a template usage() { diff --git a/scripts/storage/zfs/iscsi/comstar/createvm.sh b/scripts/storage/zfs/iscsi/comstar/createvm.sh index d24133ea595..48f9551dbff 100755 --- a/scripts/storage/zfs/iscsi/comstar/createvm.sh +++ b/scripts/storage/zfs/iscsi/comstar/createvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/createvm.sh $ +# $Id: createvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/createvm.sh $ # createvm.sh -- create a vm image directory by cloning (iscsi mode) # OpenSolaris diff --git a/scripts/storage/zfs/iscsi/comstar/delvm.sh b/scripts/storage/zfs/iscsi/comstar/delvm.sh index 8bb6a8be061..3476cde460b 100755 --- a/scripts/storage/zfs/iscsi/comstar/delvm.sh +++ b/scripts/storage/zfs/iscsi/comstar/delvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: delvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/delvm.sh $ +# $Id: delvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/delvm.sh $ # delvm.sh -- delete a cloned image used for a vm # OpenSolaris diff --git a/scripts/storage/zfs/iscsi/comstar/filebacked/createtmplt.sh b/scripts/storage/zfs/iscsi/comstar/filebacked/createtmplt.sh index 53a54385441..d3e3cbfc370 100755 --- a/scripts/storage/zfs/iscsi/comstar/filebacked/createtmplt.sh +++ b/scripts/storage/zfs/iscsi/comstar/filebacked/createtmplt.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/filebacked/createtmplt.sh $ +# $Id: createtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/filebacked/createtmplt.sh $ # createtmplt.sh -- install a template usage() { diff --git a/scripts/storage/zfs/iscsi/comstar/filebacked/createvm.sh b/scripts/storage/zfs/iscsi/comstar/filebacked/createvm.sh index 318ece266bc..cf0988aada2 100755 --- a/scripts/storage/zfs/iscsi/comstar/filebacked/createvm.sh +++ b/scripts/storage/zfs/iscsi/comstar/filebacked/createvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/filebacked/createvm.sh $ +# $Id: createvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/filebacked/createvm.sh $ # createvm.sh -- create a vm image directory by cloning (iscsi mode) # OpenSolaris diff --git a/scripts/storage/zfs/iscsi/comstar/filebacked/functions.sh b/scripts/storage/zfs/iscsi/comstar/filebacked/functions.sh index e4f6dfeaea7..5e6b727974d 100755 --- a/scripts/storage/zfs/iscsi/comstar/filebacked/functions.sh +++ b/scripts/storage/zfs/iscsi/comstar/filebacked/functions.sh @@ -1,5 +1,5 @@ # -# $Id: functions.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/filebacked/functions.sh $ +# $Id: functions.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/filebacked/functions.sh $ # functions.sh - OpenSolaris utility functions # diff --git a/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisk.sh b/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisk.sh index 54c004f4902..f408e258e32 100755 --- a/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisk.sh +++ b/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisk.sh $ +# $Id: listvmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisk.sh $ # listvmdisk.sh -- list disks of a VM (iscsi mode) # OpenSolaris # Bugs: does not handle hexadecimal numbers. Decimal only! diff --git a/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisksize.sh b/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisksize.sh index 064a5c1a0f5..0c8d5133169 100755 --- a/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisksize.sh +++ b/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisksize.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmdisksize.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisksize.sh $ +# $Id: listvmdisksize.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/filebacked/listvmdisksize.sh $ # listvmdisksize.sh -- list disk sizes of a VM (iscsi mode) # diff --git a/scripts/storage/zfs/iscsi/comstar/filebacked/migratetmplts.sh b/scripts/storage/zfs/iscsi/comstar/filebacked/migratetmplts.sh index 76deb781a6c..c2d41647205 100755 --- a/scripts/storage/zfs/iscsi/comstar/filebacked/migratetmplts.sh +++ b/scripts/storage/zfs/iscsi/comstar/filebacked/migratetmplts.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: migratetmplts.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/filebacked/migratetmplts.sh $ +# $Id: migratetmplts.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/filebacked/migratetmplts.sh $ # set -x for dir in $(find /tank/vmops -name template) do diff --git a/scripts/storage/zfs/iscsi/comstar/filebacked/upgradevmdisk.sh b/scripts/storage/zfs/iscsi/comstar/filebacked/upgradevmdisk.sh index fe700d836de..0ff34f41364 100755 --- a/scripts/storage/zfs/iscsi/comstar/filebacked/upgradevmdisk.sh +++ b/scripts/storage/zfs/iscsi/comstar/filebacked/upgradevmdisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: upgradevmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/filebacked/upgradevmdisk.sh $ +# $Id: upgradevmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/filebacked/upgradevmdisk.sh $ # upgradevmdisk.sh -- upgrade size of disks of a VM (iscsi mode) usage() { diff --git a/scripts/storage/zfs/iscsi/comstar/functions.sh b/scripts/storage/zfs/iscsi/comstar/functions.sh index cf5cb1cba33..cb0e8186127 100755 --- a/scripts/storage/zfs/iscsi/comstar/functions.sh +++ b/scripts/storage/zfs/iscsi/comstar/functions.sh @@ -1,5 +1,5 @@ # -# $Id: functions.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/functions.sh $ +# $Id: functions.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/functions.sh $ # functions.sh - OpenSolaris utility functions # diff --git a/scripts/storage/zfs/iscsi/comstar/host_group_destroy.sh b/scripts/storage/zfs/iscsi/comstar/host_group_destroy.sh index 90c67c8502e..58e27c6e34b 100755 --- a/scripts/storage/zfs/iscsi/comstar/host_group_destroy.sh +++ b/scripts/storage/zfs/iscsi/comstar/host_group_destroy.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: host_group_destroy.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/host_group_destroy.sh $ +# $Id: host_group_destroy.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/host_group_destroy.sh $ # host_group_destroy.sh -- delete all iSCSI host groups # # Usage: host_group_destroy.sh diff --git a/scripts/storage/zfs/iscsi/comstar/listvmdisk.sh b/scripts/storage/zfs/iscsi/comstar/listvmdisk.sh index d88097147b3..8147d8e5eb2 100755 --- a/scripts/storage/zfs/iscsi/comstar/listvmdisk.sh +++ b/scripts/storage/zfs/iscsi/comstar/listvmdisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/listvmdisk.sh $ +# $Id: listvmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/listvmdisk.sh $ # listvmdisk.sh -- list disks of a VM (iscsi mode) # OpenSolaris # Bugs: does not handle hexadecimal numbers. Decimal only! diff --git a/scripts/storage/zfs/iscsi/comstar/lu_info.sh b/scripts/storage/zfs/iscsi/comstar/lu_info.sh index 6cf49569cb2..caa19a2691d 100755 --- a/scripts/storage/zfs/iscsi/comstar/lu_info.sh +++ b/scripts/storage/zfs/iscsi/comstar/lu_info.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: lu_info.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/lu_info.sh $ +# $Id: lu_info.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/lu_info.sh $ # lu_info.sh -- provide info on an LU of the form: # # Target: tank/vmops/vm/u000002/r000002/vmi-swap-routing diff --git a/scripts/storage/zfs/iscsi/comstar/lu_share.sh b/scripts/storage/zfs/iscsi/comstar/lu_share.sh index dfa5fb5d735..8d2d462951b 100755 --- a/scripts/storage/zfs/iscsi/comstar/lu_share.sh +++ b/scripts/storage/zfs/iscsi/comstar/lu_share.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: lu_share.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/lu_share.sh $ +# $Id: lu_share.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/lu_share.sh $ # lu_share.sh -- make a logical unit (LU) available over iSCSI # OpenSolaris diff --git a/scripts/storage/zfs/iscsi/comstar/upgradevmdisk.sh b/scripts/storage/zfs/iscsi/comstar/upgradevmdisk.sh index c5176af7be5..809f534409e 100755 --- a/scripts/storage/zfs/iscsi/comstar/upgradevmdisk.sh +++ b/scripts/storage/zfs/iscsi/comstar/upgradevmdisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: upgradevmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/upgradevmdisk.sh $ +# $Id: upgradevmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/upgradevmdisk.sh $ # upgradevmdisk.sh -- upgrade size of disks of a VM (iscsi mode) usage() { diff --git a/scripts/storage/zfs/iscsi/comstar/view_and_lu_remove.sh b/scripts/storage/zfs/iscsi/comstar/view_and_lu_remove.sh index ed9cdab260c..ab19cd84dce 100755 --- a/scripts/storage/zfs/iscsi/comstar/view_and_lu_remove.sh +++ b/scripts/storage/zfs/iscsi/comstar/view_and_lu_remove.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: view_and_lu_remove.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/view_and_lu_remove.sh $ +# $Id: view_and_lu_remove.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/view_and_lu_remove.sh $ # view_and_lu_remove.sh -- remove views and LU's under a ZFS file system tree # # Usage: view_and_lu_remove.sh diff --git a/scripts/storage/zfs/iscsi/comstar/zfs_destroy.sh b/scripts/storage/zfs/iscsi/comstar/zfs_destroy.sh index d04f6e615f9..401f19bd6e9 100755 --- a/scripts/storage/zfs/iscsi/comstar/zfs_destroy.sh +++ b/scripts/storage/zfs/iscsi/comstar/zfs_destroy.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: zfs_destroy.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/comstar/zfs_destroy.sh $ +# $Id: zfs_destroy.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/comstar/zfs_destroy.sh $ # zfs_destroy.sh -- delete a cloned image used for a vm # # Usage: zfs_destroy diff --git a/scripts/storage/zfs/iscsi/create_private_template.sh b/scripts/storage/zfs/iscsi/create_private_template.sh index ac8b4a299b6..f339eea270d 100755 --- a/scripts/storage/zfs/iscsi/create_private_template.sh +++ b/scripts/storage/zfs/iscsi/create_private_template.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: create_private_template.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/create_private_template.sh $ +# $Id: create_private_template.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/create_private_template.sh $ # create_private_template.sh -- create a private template from a snapshot # diff --git a/scripts/storage/zfs/iscsi/createdatadisk.sh b/scripts/storage/zfs/iscsi/createdatadisk.sh index 67f0214c855..b1b8225ba9a 100755 --- a/scripts/storage/zfs/iscsi/createdatadisk.sh +++ b/scripts/storage/zfs/iscsi/createdatadisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createdatadisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/createdatadisk.sh $ +# $Id: createdatadisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/createdatadisk.sh $ # createdatadisk.sh -- create a thin-provisioned data disk # diff --git a/scripts/storage/zfs/iscsi/createtmplt.sh b/scripts/storage/zfs/iscsi/createtmplt.sh index 37cc27e7bc7..6a5321d28e5 100755 --- a/scripts/storage/zfs/iscsi/createtmplt.sh +++ b/scripts/storage/zfs/iscsi/createtmplt.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/createtmplt.sh $ +# $Id: createtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/createtmplt.sh $ # createtmplt.sh -- install a template usage() { diff --git a/scripts/storage/zfs/iscsi/createvm.sh b/scripts/storage/zfs/iscsi/createvm.sh index efd287e3308..cbd32099f89 100755 --- a/scripts/storage/zfs/iscsi/createvm.sh +++ b/scripts/storage/zfs/iscsi/createvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/createvm.sh $ +# $Id: createvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/createvm.sh $ # createvm.sh -- create a vm image directory by cloning (iscsi mode) # diff --git a/scripts/storage/zfs/iscsi/delvm.sh b/scripts/storage/zfs/iscsi/delvm.sh index 092414fcdfb..6b39934e19e 100755 --- a/scripts/storage/zfs/iscsi/delvm.sh +++ b/scripts/storage/zfs/iscsi/delvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: delvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/delvm.sh $ +# $Id: delvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/delvm.sh $ # delvm.sh -- delete a cloned image used for a vm # diff --git a/scripts/storage/zfs/iscsi/get_iqn.sh b/scripts/storage/zfs/iscsi/get_iqn.sh index e0403d021a6..b74ef47f8dc 100755 --- a/scripts/storage/zfs/iscsi/get_iqn.sh +++ b/scripts/storage/zfs/iscsi/get_iqn.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: get_iqn.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/get_iqn.sh $ +# $Id: get_iqn.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/get_iqn.sh $ # get_iqn.sh -- return iSCSI iqn of initiator (Linux) or target (OpenSolaris) usage() { diff --git a/scripts/storage/zfs/iscsi/listvmdisk.sh b/scripts/storage/zfs/iscsi/listvmdisk.sh index bca7518086c..3e00356ca8f 100755 --- a/scripts/storage/zfs/iscsi/listvmdisk.sh +++ b/scripts/storage/zfs/iscsi/listvmdisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/listvmdisk.sh $ +# $Id: listvmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/listvmdisk.sh $ # listvmdisk.sh -- list disks of a VM (iscsi mode) # Bugs: does not handle hexadecimal numbers. Decimal only! diff --git a/scripts/storage/zfs/iscsi/listvmdisksize.sh b/scripts/storage/zfs/iscsi/listvmdisksize.sh index ce9834cac81..04468cd6d88 100755 --- a/scripts/storage/zfs/iscsi/listvmdisksize.sh +++ b/scripts/storage/zfs/iscsi/listvmdisksize.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmdisksize.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/listvmdisksize.sh $ +# $Id: listvmdisksize.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/listvmdisksize.sh $ # listvmdisksize.sh -- list disk sizes of a VM (iscsi mode) # diff --git a/scripts/storage/zfs/iscsi/listvmtmplt.sh b/scripts/storage/zfs/iscsi/listvmtmplt.sh index a6c9433d13a..4c3912dd143 100755 --- a/scripts/storage/zfs/iscsi/listvmtmplt.sh +++ b/scripts/storage/zfs/iscsi/listvmtmplt.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/listvmtmplt.sh $ +# $Id: listvmtmplt.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/listvmtmplt.sh $ # listtmplt.sh -- list templates under a directory usage() { diff --git a/scripts/storage/zfs/iscsi/lu_info.sh b/scripts/storage/zfs/iscsi/lu_info.sh index 7245963d374..a1802ffbc4b 100755 --- a/scripts/storage/zfs/iscsi/lu_info.sh +++ b/scripts/storage/zfs/iscsi/lu_info.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash -# $Id: lu_info.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/lu_info.sh $ +# $Id: lu_info.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/lu_info.sh $ iscsitadm list target $1 diff --git a/scripts/storage/zfs/iscsi/lu_share.sh b/scripts/storage/zfs/iscsi/lu_share.sh index bfda31310fd..4d0d295f810 100755 --- a/scripts/storage/zfs/iscsi/lu_share.sh +++ b/scripts/storage/zfs/iscsi/lu_share.sh @@ -1 +1 @@ -# $Id: lu_share.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/lu_share.sh $ +# $Id: lu_share.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/lu_share.sh $ diff --git a/scripts/storage/zfs/iscsi/managesnapshot.sh b/scripts/storage/zfs/iscsi/managesnapshot.sh index e96466bebf4..59fd1eff80c 100755 --- a/scripts/storage/zfs/iscsi/managesnapshot.sh +++ b/scripts/storage/zfs/iscsi/managesnapshot.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: managesnapshot.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/managesnapshot.sh $ +# $Id: managesnapshot.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/managesnapshot.sh $ # managesnapshot.sh -- manage snapshots (create, destroy, rollback) # diff --git a/scripts/storage/zfs/iscsi/managevolume.sh b/scripts/storage/zfs/iscsi/managevolume.sh index c7c294124d7..c31ab54f377 100755 --- a/scripts/storage/zfs/iscsi/managevolume.sh +++ b/scripts/storage/zfs/iscsi/managevolume.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: managevolume.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/managevolume.sh $ +# $Id: managevolume.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/managevolume.sh $ # modifyvolume.sh -- add or delete a disk volume # diff --git a/scripts/storage/zfs/iscsi/showdisks.sh b/scripts/storage/zfs/iscsi/showdisks.sh index c65bfc87dfe..508a6102d14 100755 --- a/scripts/storage/zfs/iscsi/showdisks.sh +++ b/scripts/storage/zfs/iscsi/showdisks.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: showdisks.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/showdisks.sh $ +# $Id: showdisks.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/showdisks.sh $ # mapiscsi.sh -- list of active iscsi sessions and the corresponding VM # diff --git a/scripts/storage/zfs/iscsi/upgradevmdisk.sh b/scripts/storage/zfs/iscsi/upgradevmdisk.sh index 8075aefb7ed..6f817176eab 100755 --- a/scripts/storage/zfs/iscsi/upgradevmdisk.sh +++ b/scripts/storage/zfs/iscsi/upgradevmdisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: upgradevmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/iscsi/upgradevmdisk.sh $ +# $Id: upgradevmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/iscsi/upgradevmdisk.sh $ # upgradevmdisk.sh -- upgrade size of disks of a VM (iscsi mode) usage() { diff --git a/scripts/storage/zfs/nfs/createvm.sh b/scripts/storage/zfs/nfs/createvm.sh index 9d4fba6f0a0..94e1177ea90 100755 --- a/scripts/storage/zfs/nfs/createvm.sh +++ b/scripts/storage/zfs/nfs/createvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/nfs/createvm.sh $ +# $Id: createvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/nfs/createvm.sh $ # createvm.sh -- create a vm image directory by cloning # diff --git a/scripts/storage/zfs/nfs/delvm.sh b/scripts/storage/zfs/nfs/delvm.sh index 1b1032cfa8c..bd83dc9fb0b 100755 --- a/scripts/storage/zfs/nfs/delvm.sh +++ b/scripts/storage/zfs/nfs/delvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: delvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/nfs/delvm.sh $ +# $Id: delvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/nfs/delvm.sh $ # delvm.sh -- delete a cloned image used for a vm # diff --git a/scripts/storage/zfs/nfs/listclones.sh b/scripts/storage/zfs/nfs/listclones.sh index 233640e7461..3be29115992 100755 --- a/scripts/storage/zfs/nfs/listclones.sh +++ b/scripts/storage/zfs/nfs/listclones.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listclones.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/nfs/listclones.sh $ +# $Id: listclones.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/nfs/listclones.sh $ # listclones.sh -- list all cloned filesystems under a parent fs # diff --git a/scripts/storage/zfs/nfs/listvmdisk.sh b/scripts/storage/zfs/nfs/listvmdisk.sh index 1d1cc09a04c..811b00aac79 100755 --- a/scripts/storage/zfs/nfs/listvmdisk.sh +++ b/scripts/storage/zfs/nfs/listvmdisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/nfs/listvmdisk.sh $ +# $Id: listvmdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/nfs/listvmdisk.sh $ # listvmdisk.sh -- list disks of a VM # Bugs: does not handle hexadecimal numbers. Decimal only! diff --git a/scripts/storage/zfs/nfs/listvmdisksize.sh b/scripts/storage/zfs/nfs/listvmdisksize.sh index 83568812218..f110faeefef 100755 --- a/scripts/storage/zfs/nfs/listvmdisksize.sh +++ b/scripts/storage/zfs/nfs/listvmdisksize.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: listvmdisksize.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/nfs/listvmdisksize.sh $ +# $Id: listvmdisksize.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/nfs/listvmdisksize.sh $ # listvmdisksize.sh -- list disk sizes of a VM # diff --git a/scripts/storage/zfs/nfs/rundomr.sh b/scripts/storage/zfs/nfs/rundomr.sh index f9ee7bd87de..e600bbac69a 100755 --- a/scripts/storage/zfs/nfs/rundomr.sh +++ b/scripts/storage/zfs/nfs/rundomr.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: rundomr.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/nfs/rundomr.sh $ +# $Id: rundomr.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/nfs/rundomr.sh $ # rundomr.sh -- start a domR # # diff --git a/scripts/storage/zfs/nfs/runvm.sh b/scripts/storage/zfs/nfs/runvm.sh index d989f5952b0..f2fb7a37807 100755 --- a/scripts/storage/zfs/nfs/runvm.sh +++ b/scripts/storage/zfs/nfs/runvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: runvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/nfs/runvm.sh $ +# $Id: runvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/nfs/runvm.sh $ # runvm.sh -- start a vm from a directory containing the kernel and os images # # diff --git a/scripts/storage/zfs/nfs/stopvm.sh b/scripts/storage/zfs/nfs/stopvm.sh index 4c03e0f5f5c..a4eab4cef8f 100755 --- a/scripts/storage/zfs/nfs/stopvm.sh +++ b/scripts/storage/zfs/nfs/stopvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: stopvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/nfs/stopvm.sh $ +# $Id: stopvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/nfs/stopvm.sh $ # stopvm.sh -- stop one or all vm # # diff --git a/scripts/storage/zfs/zfs_mount_recovery.sh b/scripts/storage/zfs/zfs_mount_recovery.sh index 2d4c35adb7d..b64bb90b035 100755 --- a/scripts/storage/zfs/zfs_mount_recovery.sh +++ b/scripts/storage/zfs/zfs_mount_recovery.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: zfs_mount_recovery.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/zfs/zfs_mount_recovery.sh $ +# $Id: zfs_mount_recovery.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/storage/zfs/zfs_mount_recovery.sh $ # zfs_mount_recovery.sh -- recover from early boot zfs mount failure # # Usage: diff --git a/scripts/util/macgen.py b/scripts/util/macgen.py index ca3500fc035..ce5ebcff008 100755 --- a/scripts/util/macgen.py +++ b/scripts/util/macgen.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# $Id: macgen.py 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/util/macgen.py $ +# $Id: macgen.py 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/util/macgen.py $ # macgen.py script to generate a MAC address for Red Hat Virtualization guests # import random diff --git a/scripts/vm/hypervisor/kvm/rundomrpre.sh b/scripts/vm/hypervisor/kvm/rundomrpre.sh index bb4be15a991..11160269e5c 100755 --- a/scripts/vm/hypervisor/kvm/rundomrpre.sh +++ b/scripts/vm/hypervisor/kvm/rundomrpre.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: rundomrpre.sh 10427 2010-07-09 03:30:48Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/kvm/rundomrpre.sh $ +# $Id: rundomrpre.sh 10427 2010-07-09 03:30:48Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/kvm/rundomrpre.sh $ set -x diff --git a/scripts/vm/hypervisor/versions.sh b/scripts/vm/hypervisor/versions.sh index 814b7c4c7dd..78a7a31a930 100755 --- a/scripts/vm/hypervisor/versions.sh +++ b/scripts/vm/hypervisor/versions.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: versions.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/versions.sh $ +# $Id: versions.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/versions.sh $ # Output Linux distribution. REV=`uname -r` diff --git a/scripts/vm/hypervisor/xen/rebootvm.sh b/scripts/vm/hypervisor/xen/rebootvm.sh index 4da4e31fb3b..1090dfc3e98 100755 --- a/scripts/vm/hypervisor/xen/rebootvm.sh +++ b/scripts/vm/hypervisor/xen/rebootvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: rebootvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xen/rebootvm.sh $ +# $Id: rebootvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xen/rebootvm.sh $ # reboot.sh -- reboot one vm # # diff --git a/scripts/vm/hypervisor/xen/rundomp.sh b/scripts/vm/hypervisor/xen/rundomp.sh index 9f5c4dfcdbd..f54eea5f6be 100755 --- a/scripts/vm/hypervisor/xen/rundomp.sh +++ b/scripts/vm/hypervisor/xen/rundomp.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: rundomp.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xen/rundomp.sh $ +# $Id: rundomp.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xen/rundomp.sh $ # # rundomp.sh -- start a console proxy domU (domP) (iscsi mode) # Usage : rundomp [options] diff --git a/scripts/vm/hypervisor/xen/rundomr.sh b/scripts/vm/hypervisor/xen/rundomr.sh index 2449cff61e0..57828689c3f 100755 --- a/scripts/vm/hypervisor/xen/rundomr.sh +++ b/scripts/vm/hypervisor/xen/rundomr.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: rundomr.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xen/rundomr.sh $ +# $Id: rundomr.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xen/rundomr.sh $ # rundomr.sh -- start a domR (iscsi mode) # # diff --git a/scripts/vm/hypervisor/xen/rundomrpre.sh b/scripts/vm/hypervisor/xen/rundomrpre.sh index 3318803ed30..36242323ac8 100755 --- a/scripts/vm/hypervisor/xen/rundomrpre.sh +++ b/scripts/vm/hypervisor/xen/rundomrpre.sh @@ -1,5 +1,5 @@ #/bin/bash -# $Id: rundomrpre.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xen/rundomrpre.sh $ +# $Id: rundomrpre.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xen/rundomrpre.sh $ # set -x diff --git a/scripts/vm/hypervisor/xen/runvm.sh b/scripts/vm/hypervisor/xen/runvm.sh index cce89e91f18..34232c11dd8 100755 --- a/scripts/vm/hypervisor/xen/runvm.sh +++ b/scripts/vm/hypervisor/xen/runvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: runvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xen/runvm.sh $ +# $Id: runvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xen/runvm.sh $ # runvm.sh -- start a vm from a directory containing the kernel and os images # iscsi mode # diff --git a/scripts/vm/hypervisor/xen/stopvm.sh b/scripts/vm/hypervisor/xen/stopvm.sh index a744c480195..0082312dccd 100755 --- a/scripts/vm/hypervisor/xen/stopvm.sh +++ b/scripts/vm/hypervisor/xen/stopvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: stopvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xen/stopvm.sh $ +# $Id: stopvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xen/stopvm.sh $ # stopvm.sh -- stop one or all vm (iscsi version -- does not unmount) # # diff --git a/scripts/vm/hypervisor/xenserver/find_bond.sh b/scripts/vm/hypervisor/xenserver/find_bond.sh index 2818259c06f..76de158d7d0 100755 --- a/scripts/vm/hypervisor/xenserver/find_bond.sh +++ b/scripts/vm/hypervisor/xenserver/find_bond.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: find_bond.sh 10510 2010-07-11 10:10:03Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xenserver/find_bond.sh $ +# $Id: find_bond.sh 10510 2010-07-11 10:10:03Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xenserver/find_bond.sh $ #set -x diff --git a/scripts/vm/hypervisor/xenserver/hostvmstats.py b/scripts/vm/hypervisor/xenserver/hostvmstats.py index 89af959db61..b75f4c7d262 100644 --- a/scripts/vm/hypervisor/xenserver/hostvmstats.py +++ b/scripts/vm/hypervisor/xenserver/hostvmstats.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# $Id: hostvmstats.py 10054 2010-06-29 22:09:31Z abhishek $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xenserver/hostvmstats.py $ +# $Id: hostvmstats.py 10054 2010-06-29 22:09:31Z abhishek $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xenserver/hostvmstats.py $ import XenAPI import urllib diff --git a/scripts/vm/hypervisor/xenserver/launch_hb.sh b/scripts/vm/hypervisor/xenserver/launch_hb.sh index a16d3f4bcbc..849565e1e71 100755 --- a/scripts/vm/hypervisor/xenserver/launch_hb.sh +++ b/scripts/vm/hypervisor/xenserver/launch_hb.sh @@ -26,5 +26,5 @@ for psid in `ps -ef | grep xenheartbeat | grep -v grep | awk '{print $2}'`; do kill $psid done -nohup /opt/xensource/bin/heartbeat.sh $1 $2 >/var/log/heartbeat.log 2>&1 & +nohup /opt/xensource/bin/xenheartbeat.sh $1 $2 >/var/log/heartbeat.log 2>&1 & echo "======> DONE <======" diff --git a/scripts/vm/hypervisor/xenserver/make_migratable.sh b/scripts/vm/hypervisor/xenserver/make_migratable.sh index a8fe5d63b3e..2b375efdb4c 100755 --- a/scripts/vm/hypervisor/xenserver/make_migratable.sh +++ b/scripts/vm/hypervisor/xenserver/make_migratable.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: make_migratable.sh 9879 2010-06-24 02:41:46Z anthony $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xenserver/make_migratable.sh $ +# $Id: make_migratable.sh 9879 2010-06-24 02:41:46Z anthony $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xenserver/make_migratable.sh $ set -e diff --git a/scripts/vm/hypervisor/xenserver/networkUsage.sh b/scripts/vm/hypervisor/xenserver/networkUsage.sh index 129aa76f05e..33bf35a03b8 100755 --- a/scripts/vm/hypervisor/xenserver/networkUsage.sh +++ b/scripts/vm/hypervisor/xenserver/networkUsage.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: networkUsage.sh 9879 2010-06-24 02:41:46Z anthony $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xenserver/networkUsage.sh $ +# $Id: networkUsage.sh 9879 2010-06-24 02:41:46Z anthony $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xenserver/networkUsage.sh $ # networkUsage.sh -- create iptable rules to gather network stats # # diff --git a/scripts/vm/hypervisor/xenserver/network_info.sh b/scripts/vm/hypervisor/xenserver/network_info.sh index 788e9d4fe67..da1c39a0004 100755 --- a/scripts/vm/hypervisor/xenserver/network_info.sh +++ b/scripts/vm/hypervisor/xenserver/network_info.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: network_info.sh 9879 2010-06-24 02:41:46Z anthony $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xenserver/network_info.sh $ +# $Id: network_info.sh 9879 2010-06-24 02:41:46Z anthony $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xenserver/network_info.sh $ set -e diff --git a/scripts/vm/hypervisor/xenserver/prepsystemvm.sh b/scripts/vm/hypervisor/xenserver/prepsystemvm.sh index 4a5b7f0e695..bd1961170ad 100755 --- a/scripts/vm/hypervisor/xenserver/prepsystemvm.sh +++ b/scripts/vm/hypervisor/xenserver/prepsystemvm.sh @@ -1,5 +1,5 @@ #/bin/bash -# $Id: prepsystemvm.sh 10800 2010-07-16 13:48:39Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xenserver/prepsystemvm.sh $ +# $Id: prepsystemvm.sh 10800 2010-07-16 13:48:39Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x/java/scripts/vm/hypervisor/xenserver/prepsystemvm.sh $ #set -x diff --git a/scripts/vm/hypervisor/xenserver/setup_iscsi.sh b/scripts/vm/hypervisor/xenserver/setup_iscsi.sh index c2424b385f3..319e43517ca 100755 --- a/scripts/vm/hypervisor/xenserver/setup_iscsi.sh +++ b/scripts/vm/hypervisor/xenserver/setup_iscsi.sh @@ -1,5 +1,5 @@ #!/bin/bash -# $Id: setup_iscsi.sh 9879 2010-06-24 02:41:46Z anthony $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xenserver/setup_iscsi.sh $ +# $Id: setup_iscsi.sh 9879 2010-06-24 02:41:46Z anthony $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xenserver/setup_iscsi.sh $ #set -x diff --git a/scripts/vm/hypervisor/xenserver/setupxenserver.sh b/scripts/vm/hypervisor/xenserver/setupxenserver.sh deleted file mode 100755 index e8831142415..00000000000 --- a/scripts/vm/hypervisor/xenserver/setupxenserver.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -#set -x - -usage() { - printf "Usage: \n" $(basename $0) - -} - -# avoid disk full -mv /etc/cron.daily/logrotate /etc/cron.hourly 2>&1 - -# more aio thread -echo 1048576 >/proc/sys/fs/aio-max-nr - -#set iptables -iptables -D RH-Firewall-1-INPUT -p tcp -m tcp --dport 5900:6099 -j ACCEPT 2>&1 -iptables -I RH-Firewall-1-INPUT -p tcp -m tcp --dport 5900:6099 -j ACCEPT 2>&1 - -iptables-save > /etc/sysconfig/iptables - -# listen vnc on all interface -sed -i 's/127\.0\.0\.1/0\.0\.0\.0/' /opt/xensource/libexec/vncterm-wrapper 2>&1 -sed -i 's/127\.0\.0\.1/0\.0\.0\.0/' /opt/xensource/libexec/qemu-dm-wrapper 2>&1 - -echo "success" - diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops index 3ac93f4abd5..eeecbce6606 100755 --- a/scripts/vm/hypervisor/xenserver/vmops +++ b/scripts/vm/hypervisor/xenserver/vmops @@ -7,14 +7,15 @@ import XenAPIPlugin sys.path.append("/opt/xensource/sm/") import SR, VDI, SRCommand, util, lvutil from util import CommandException -import shutil import vhdutil +import shutil import lvhdutil import subprocess from lvmcache import LVMCache from journaler import Journaler from lock import Lock import errno +import shutil import subprocess import xs_errors import cleanup @@ -25,6 +26,8 @@ import random import base64 import tempfile +VHD_UTIL = '/usr/sbin/vhd-util' +VHD_PREFIX = 'VHD-' def echo(fn): def wrapped(*v, **k): @@ -64,11 +67,159 @@ def setup_iscsi(session, args): except: txt = '' return txt - + +@echo +def create_secondary_storage_folder(session, args): + local_mount_path = None + + util.SMlog("create_secondary_storage_folder, args: " + str(args)) + + try: + try: + # Mount the remote resource folder locally + remote_mount_path = args["remoteMountPath"] + local_mount_path = os.path.join(SR.MOUNT_BASE, "mount" + str(int(random.random() * 1000000))) + mount(remote_mount_path, local_mount_path) + + # Create the new folder + new_folder = local_mount_path + "/" + args["newFolder"] + if not os.path.isdir(new_folder): + current_umask = os.umask(0) + os.makedirs(new_folder) + os.umask(current_umask) + except OSError, (errno, strerror): + errMsg = "create_secondary_storage_folder failed: errno: " + str(errno) + ", strerr: " + strerror + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + except: + errMsg = "create_secondary_storage_folder failed." + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + finally: + if local_mount_path != None: + # Unmount the local folder + umount(local_mount_path) + # Remove the local folder + os.system("rm -rf " + local_mount_path) + + return "1" + +@echo +def delete_secondary_storage_folder(session, args): + local_mount_path = None + + util.SMlog("delete_secondary_storage_folder, args: " + str(args)) + + try: + try: + # Mount the remote resource folder locally + remote_mount_path = args["remoteMountPath"] + local_mount_path = os.path.join(SR.MOUNT_BASE, "mount" + str(int(random.random() * 1000000))) + mount(remote_mount_path, local_mount_path) + + # Delete the specified folder + folder = local_mount_path + "/" + args["folder"] + if os.path.isdir(folder): + os.system("rm -rf " + folder) + except OSError, (errno, strerror): + errMsg = "delete_secondary_storage_folder failed: errno: " + str(errno) + ", strerr: " + strerror + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + except: + errMsg = "delete_secondary_storage_folder failed." + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + finally: + if local_mount_path != None: + # Unmount the local folder + umount(local_mount_path) + # Remove the local folder + os.system("rm -rf " + local_mount_path) + + return "1" + @echo def execute_script(session, args): return "" - + +@echo +def post_create_private_template(session, args): + local_mount_path = None + + try: + try: + # Mount the remote templates folder locally + remote_mount_path = args["remoteTemplateMountPath"] + local_mount_path = os.path.join(SR.MOUNT_BASE, "template" + str(int(random.random() * 10000))) + mount(remote_mount_path, local_mount_path) + util.SMlog("Mounted secondary storage template folder") + + # Retrieve args + filename = args["templateFilename"] + name = args["templateName"] + description = args["templateDescription"] + checksum = args["checksum"] + virtual_size = args["virtualSize"] + template_id = args["templateId"] + + # Determine the template size + template_download_folder = local_mount_path + "/" + args["templateDownloadFolder"] + template_download_path = template_download_folder + filename + file_size = os.path.getsize(template_download_path) + util.SMlog("Got template file_size: " + str(file_size)) + + # Create the template.properties file + template_properties_download_path = template_download_folder + "template.properties" + f = open(template_properties_download_path, "w") + f.write("filename=" + filename + "\n") + f.write("name=" + filename + "\n") + f.write("vhd=true\n") + f.write("id=" + template_id + "\n") + f.write("vhd.filename=" + filename + "\n") + f.write("uniquename=" + name + "\n") + f.write("vhd.virtualsize=" + virtual_size + "\n") + f.write("vhd.size=" + str(file_size) + "\n") + f.write("virtualsize=" + virtual_size + "\n") + f.write("checksum=" + checksum + "\n") + f.write("hvm=true\n") + f.write("description=" + name + "\n") + f.close() + util.SMlog("Created template.properties file") + + # Create the template install folder if necessary + template_install_folder = local_mount_path + "/" + args["templateInstallFolder"] + if not os.path.isdir(template_install_folder): + current_umask = os.umask(0) + os.makedirs(template_install_folder) + os.umask(current_umask) + + # Move the template and the template.properties file to the install folder + os.system("mv " + template_download_folder + "/" + filename + " " + template_install_folder) + os.system("mv " + template_download_folder + "/template.properties " + template_install_folder) + template_install_path = template_install_folder + filename + template_properties_install_path = template_install_folder + "template.properties" + + # Set permissions + permissions = stat.S_IREAD | stat.S_IWRITE | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH + os.chmod(template_install_path, permissions) + os.chmod(template_properties_install_path, permissions) + util.SMlog("Set permissions on template and template.properties") + + # Delete the template download folder + os.system("rm -rf " + template_download_folder) + except: + errMsg = "post_create_private_template failed." + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + finally: + if local_mount_path != None: + # Unmount the local templates folder + umount(local_mount_path) + # Remove the local templates folder + os.system("rm -rf " + local_mount_path) + + return "1" + @echo def getvncport(session, args): domid = args['domID'] @@ -123,12 +274,28 @@ def preparemigration(session, args): @echo def setIptables(session, args): try: - cmd = ["/bin/bash", "/opt/xensource/bin/setupxenserver.sh"] + try: + shutil.move("/etc/cron.daily/logrotate", "/etc/cron.hourly") + except: + txt = '' + + f = open("/proc/sys/fs/aio-max-nr", 'w') + f.write("1048576") + f.close() + try: + cmd = ["iptables", "-D", "RH-Firewall-1-INPUT", "-p", "tcp", "-m", "tcp", "--dport", "5900:6099", "-j", "ACCEPT"] + txt = util.pread2(cmd) + except: + txt = '' + + cmd = ["iptables", "-I", "RH-Firewall-1-INPUT", "-p", "tcp", "-m", "tcp", "--dport", "5900:6099", "-j", "ACCEPT"] txt = util.pread2(cmd) + txt = 'success' except: util.SMlog(" setIptables execution failed " ) - txt = '' + txt = '' + util.SMlog("execute setIptables command result (%s), ignoring" % txt) return txt @@ -277,6 +444,11 @@ def saveDhcpEntry(session, args): @echo def setLinkLocalIP(session, args): brName = args['brName'] + try: + cmd = ["brctl", "addbr", brName] + txt = util.pread2(cmd) + except: + txt = '' try: cmd = ["ip", "route", "del", "169.254.0.0/16"] txt = util.pread2(cmd) @@ -406,6 +578,858 @@ def checkIscsi(session, args): return status +def isfile(path, isISCSI): + errMsg = '' + exists = True + if isISCSI: + exists = checkVolumeAvailablility(path) + else: + exists = os.path.isfile(path) + + if not exists: + errMsg = "File " + path + " does not exist." + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + return errMsg + +def copyfile(fromFile, toFile, isISCSI): + util.SMlog("Starting to copy " + fromFile + " to " + toFile) + errMsg = '' + if isISCSI: + try: + cmd = ['dd', 'if=' + fromFile, 'of=' + toFile] + txt = util.pread2(cmd) + except: + txt = '' + errMsg = "Error while copying " + fromFile + " to " + toFile + " in ISCSI mode" + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + + else: + try: + shutil.copy2(fromFile, toFile) + except OSError, (errno, strerror): + errMsg = "Error while copying " + fromFile + " to " + toFile + " with errno: " + str(errno) + " and strerr: " + strerror + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + + util.SMlog("Successfully copied " + fromFile + " to " + toFile) + return errMsg + +def chdir(path): + try: + os.chdir(path) + except OSError, (errno, strerror): + errMsg = "Unable to chdir to " + path + " because of OSError with errno: " + str(errno) + " and strerr: " + strerror + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + util.SMlog("Chdired to " + path) + return + +def coalesce(vhdPath): + util.SMlog("Starting to coalesce " + vhdPath + " with its parent") + try : + cmd = [VHD_UTIL, "coalesce", "-n", vhdPath] + txt = util.pread2(cmd) + except: + errMsg = "Unexpected error while trying to coalesce " + vhdPath + " to its parent" + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + util.SMlog("Successfully coalesced " + vhdPath + " with its parent ") + + return + +def scanParent(path): + # Do a scan for the parent for ISCSI volumes + # Note that the parent need not be visible on the XenServer + parentUUID = '' + try: + lvName = os.path.basename(path) + dirname = os.path.dirname(path) + vgName = os.path.basename(dirname) + vhdInfo = vhdutil.getVHDInfoLVM(lvName, lvhdutil.extractUuid, vgName) + parentUUID = vhdInfo.parentUuid + except: + errMsg = "Could not get vhd parent of " + path + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + return parentUUID + +def getParent(path, isISCSI): + parentUUID = '' + try : + if isISCSI: + parentUUID = vhdutil.getParent(path, lvhdutil.extractUuid) + else: + parentUUID = vhdutil.getParent(path, cleanup.FileVDI.extractUuid) + except: + errMsg = "Could not get vhd parent of " + path + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + return parentUUID + +def getParentOfSnapshot(snapshotUuid, primarySRPath, isISCSI): + snapshotVHD = getVHD(snapshotUuid, isISCSI) + snapshotPath = os.path.join(primarySRPath, snapshotVHD) + + baseCopyUuid = '' + if isISCSI: + checkVolumeAvailablility(snapshotPath) + baseCopyUuid = scanParent(snapshotPath) + else: + baseCopyUuid = getParent(snapshotPath, isISCSI) + + util.SMlog("Base copy of snapshotUuid: " + snapshotUuid + " is " + baseCopyUuid) + return baseCopyUuid + +def setParent(parent, child): + try: + cmd = [VHD_UTIL, "modify", "-p", parent, "-n", child] + txt = util.pread2(cmd) + except: + errMsg = "Unexpected error while trying to set parent of " + child + " to " + parent + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + util.SMlog("Successfully set parent of " + child + " to " + parent) + return + +def rename(originalVHD, newVHD): + try: + os.rename(originalVHD, newVHD) + except OSError, (errno, strerror): + errMsg = "OSError while renaming " + origiinalVHD + " to " + newVHD + "with errno: " + str(errno) + " and strerr: " + strerror + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + return + +def coalesceToChild(backupVHD, childUUID, isISCSI): + # coalesce childVHD with its parent + childVHD = getVHD(childUUID, isISCSI) + util.SMlog("childVHD: " + childVHD) + # check for existence of childVHD + isfile(childVHD, False) + util.SMlog("childVHD " + childVHD + " exists") + # No exception thrown, file exists + coalesce(childVHD) + + # rename the existing backupVHD file to childVHD + # childVHD file automatically gets overwritten + rename(backupVHD, childVHD) + + # parent of the newly coalesced file still remains the same. + # child of childVHD has it's parent name still set to childVHD. + # So the VHD chain hasn't been broken. + return + +def makedirs(path): + if not os.path.isdir(path): + try: + os.makedirs(path) + except OSError, (errno, strerror): + errMsg = "OSError while creating " + path + " with errno: " + str(errno) + " and strerr: " + strerror + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + return + +def mount(remoteDir, localDir): + makedirs(localDir) + + try: + cmd = ['mount', remoteDir, localDir] + txt = util.pread2(cmd) + except: + txt = '' + errMsg = "Unexpected error while trying to mount " + remoteDir + " to " + localDir + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + util.SMlog("Successfully mounted " + remoteDir + " to " + localDir) + + return + +def umount(localDir): + success = False + if os.path.isdir(localDir) and os.path.ismount(localDir): + try: + cmd = ['umount', localDir] + util.pread2(cmd) + except CommandException: + errMsg = "CommandException raised while trying to umount " + localDir + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + util.SMlog("Successfully unmounted " + localDir) + success = True + else: + util.SMlog("LocalDir: " + localDir + " doesn't exist or is not a mount point") + + return + + +def mountTemplatesDir(secondaryStorageMountPath, templatePath): + # Aim is to mount / on + # SR.MOUNT_BASE/ + # It will be unmounted after createVolumeFromSnapshot finishes. + # It should be mounted read-only, but don't know how to do that + # The random-uuid saves us from conflicts while restoring two different root volumes + + absoluteTemplatePath = os.path.join(secondaryStorageMountPath, templatePath) + absoluteTemplateDir = os.path.dirname(absoluteTemplatePath) + + randomUUID = util.gen_uuid() + localTemplateDir = os.path.join(SR.MOUNT_BASE, randomUUID) + # create the temp dir + makedirs(localTemplateDir) + # mount + mount(absoluteTemplateDir, localTemplateDir) + + return localTemplateDir + +def mountSnapshotsDir(secondaryStorageMountPath, relativeDir, dcId, accountId, instanceId): + # The aim is to mount secondaryStorageMountPath on + # SR.MOUNT_BASE// + # And create / dir on it, if it doesn't exist already. + # Assuming that secondaryStorageMountPath exists remotely + + # Alex's suggestion and currently implemented: + # Just mount secondaryStorageMountPath/ everytime + # Never unmount. + snapshotsDir = os.path.join(secondaryStorageMountPath, relativeDir) + + # Mkdir local mount point dir, if it doesn't exist. + localMountPointPath = os.path.join(SR.MOUNT_BASE, dcId) + localMountPointPath = os.path.join(localMountPointPath, relativeDir) + + makedirs(localMountPointPath) + # if something is not mounted already on localMountPointPath, + # mount secondaryStorageMountPath on localMountPath + if os.path.ismount(localMountPointPath): + # There is only one secondary storage per zone. + # And we are mounting each sec storage under a zone-specific directory + # So two secondary storage snapshot dirs will never get mounted on the same point on the same XenServer. + util.SMlog("The remote snapshots directory has already been mounted on " + localMountPointPath) + else: + mount(snapshotsDir, localMountPointPath) + + # Create accountId/instanceId dir on localMountPointPath, if it doesn't exist + backupsDir = os.path.join(localMountPointPath, accountId) + backupsDir = os.path.join(backupsDir, instanceId) + makedirs(backupsDir) + return backupsDir + +@echo +def unmountSnapshotsDir(session, args): + dcId = args['dcId'] + localMountPointPath = os.path.join(SR.MOUNT_BASE, dcId) + localMountPointPath = os.path.join(localMountPointPath, "snapshots") + try: + umount(localMountPointPath) + except: + util.SMlog("Ignoring the error while trying to unmount the snapshots dir.") + + return "1" + +def getPrimarySRPath(primaryStorageSRUuid, isISCSI): + if isISCSI: + primarySRDir = lvhdutil.VG_PREFIX + primaryStorageSRUuid + return os.path.join(lvhdutil.VG_LOCATION, primarySRDir) + else: + return os.path.join(SR.MOUNT_BASE, primaryStorageSRUuid) + +def getVHD(UUID, isISCSI): + if isISCSI: + return VHD_PREFIX + UUID + else: + return UUID + '.' + SR.DEFAULT_TAP + +def getIsTrueString(stringValue): + booleanValue = False + if (stringValue and stringValue == 'true'): + booleanValue = True + return booleanValue + +def makeUnavailable(uuid, primarySRPath, isISCSI): + VHD = getVHD(uuid, isISCSI) + path = os.path.join(primarySRPath, VHD) + manageAvailability(path, '-an') + return + +def manageAvailability(path, value): + util.SMlog("Setting availability of " + path + " to " + value) + try: + cmd = ['/usr/sbin/lvchange', value, path] + util.pread2(cmd) + except: #CommandException, (rc, cmdListStr, stderr): + #errMsg = "CommandException thrown while executing: " + cmdListStr + " with return code: " + str(rc) + " and stderr: " + stderr + errMsg = "Unexpected exception thrown by lvchange" + util.SMlog(errMsg) + if value == "-ay": + # Raise an error only if we are trying to make it available. + # Just warn if we are trying to make it unavailable after the + # snapshot operation is done. + raise xs_errors.XenError(errMsg) + return + + +def checkVolumeAvailablility(path): + try: + if not isVolumeAvailable(path): + # The VHD file is not available on XenSever. The volume is probably + # inactive or detached. + # Do lvchange -ay to make it available on XenServer + manageAvailability(path, '-ay') + except: + errMsg = "Could not determine status of ISCSI path: " + path + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + + success = False + i = 0 + while i < 6: + i = i + 1 + # Check if the vhd is actually visible by checking for the link + # set isISCSI to true + success = isVolumeAvailable(path) + if success: + util.SMlog("Made vhd: " + path + " available and confirmed that it is visible") + break + + # Sleep for 10 seconds before checking again. + time.sleep(10) + + # If not visible within 1 min fail + if not success: + util.SMlog("Could not make vhd: " + path + " available despite waiting for 1 minute. Does it exist?") + + return success + +def isVolumeAvailable(path): + # Check if iscsi volume is available on this XenServer. + status = "0" + try: + p = subprocess.Popen(["/bin/bash", "-c", "if [ -L " + path + " ]; then echo 1; else echo 0;fi"], stdout=subprocess.PIPE) + status = p.communicate()[0].strip("\n") + except: + errMsg = "Could not determine status of ISCSI path: " + path + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + + return (status == "1") + +def getLastSnapshotUuid(volumeUuid, expectedLastSnapshotUuid): + actualLastSnapshotUuid = '' + if volumeUuid: + cmd = ['xe', 'vdi-param-get', 'uuid=' + volumeUuid, 'param-name=snapshots'] + stdout = '' + try: + stdout = util.pread2(cmd) + except: #CommandException, (rc, cmdListStr, stderr): + #errMsg = "CommandException thrown while executing: " + cmdListStr + " with return code: " + str(rc) + " and stderr: " + stderr + errMsg = "Unexpected error while executing cmd: " + str(cmd) + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + if stdout: + snapshots = stdout.split(';') + if len(snapshots) == 1: + if snapshots[0] == expectedLastSnapshotUuid: + actualLastSnapshotUuid = expectedLastSnapshotUuid + elif len(snapshots) == 2: + # We expect only 1 snapshot to be present. If there is another that is unexpected and the last one + if (expectedLastSnapshotUuid == snapshots[0].strip()): + actualLastSnapshotUuid = snapshots[1].strip() + else: + # it should be equal to snapshots[1]. Else I have no idea. + actualLastSnapshotUuid = snapshots[0].strip() + else: + # len(snapshots) > 2: + errMsg = "Volume: " + volumeUuid + " has more than 2 snapshots: " + str(snapshots) + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + + return actualLastSnapshotUuid + +@echo +def validateSnapshot(session, args): + util.SMlog("Called validateSnapshot with " + str(args)) + primaryStorageSRUuid = args['primaryStorageSRUuid'] + volumeUuid = args['volumeUuid'] + firstBackupUuid = args['firstBackupUuid'] + previousSnapshotUuid = args['previousSnapshotUuid'] + templateUuid = args['templateUuid'] + isISCSI = getIsTrueString(args['isISCSI']) + + primarySRPath = getPrimarySRPath(primaryStorageSRUuid, isISCSI) + util.SMlog("primarySRPath: " + primarySRPath) + volumeVHD = getVHD(volumeUuid, isISCSI) + volumePath = os.path.join(primarySRPath, volumeVHD) + util.SMlog("volumePath: " + volumePath) + + baseCopyUuid = '' + wasVolumeAvailable = True + if isISCSI: + wasVolumeAvailable = isVolumeAvailable(volumePath) + if not wasVolumeAvailable: + # make it available + checkVolumeAvailablility(volumePath) + baseCopyUuid = scanParent(volumePath) + else: + baseCopyUuid = getParent(volumePath, isISCSI) + + if baseCopyUuid is None: + # Make it an empty string so that it can be used in the return value + baseCopyUuid = '' + + actualSnapshotUuid = getLastSnapshotUuid(volumeUuid, previousSnapshotUuid) + expectedActual = firstBackupUuid + "#" + baseCopyUuid + "#" + actualSnapshotUuid + if firstBackupUuid: + # This is not the first snapshot + if baseCopyUuid and (baseCopyUuid == firstBackupUuid): + retval = "1#" + else: + retval = "0#" + else: + if templateUuid: + # The DB thinks this is the first snapshot of a ROOT DISK + # The parent of the volume should be the base template, which is also the parent of the given templateUuid. + templateVHD = getVHD(templateUuid, isISCSI) + templatePath = os.path.join(primarySRPath, templateVHD) + baseTemplateUuid = '' + wasTemplateAvailable = True + if isISCSI: + wasTemplateAvailable = isVolumeAvailable(templatePath) + if not wasVolumeAvailable: + # make it available + checkVolumeAvailablility(templatePath) + baseTemplateUuid = scanParent(templatePath) + else: + baseTemplateUuid = getParent(templatePath, isISCSI) + + if baseTemplateUuid is None: + # This will never happen. + baseTemplateUuid = '' + + expectedActual = baseTemplateUuid + "#" + baseCopyUuid + "#" + actualSnapshotUuid + if baseTemplateUuid and (baseCopyUuid == baseTemplateUuid): + retval = "1#" + else: + retval = "0#" + + if isISCSI and not wasTemplateAvailable: + manageAvailability(templatePath, '-an') + + else: + # The DB thinks this is the first snapshot of a DATA DISK. + # The volume VDI should not have any parent. + if not baseCopyUuid: + retval = "1#" + else: + retval = "0#" + + # Set the volume's visibility back to what it was. + if isISCSI and not wasVolumeAvailable: + manageAvailability(volumePath, '-an') + + return retval + expectedActual + +@echo +def validatePreviousSnapshotBackup(session, args): + util.SMlog("Called validatePreviousSnapshotBackup with " + str(args)) + primaryStorageSRUuid = args['primaryStorageSRUuid'] + previousSnapshotUuid = args['previousSnapshotUuid'] + firstBackupUuid = args['firstBackupUuid'] + isISCSI = getIsTrueString(args['isISCSI']) + + if (not firstBackupUuid) or (not previousSnapshotUuid): + errMsg = "validatePreviousSnapshotBackup expects both firstBackupUuid: " + str(firstBackupUuid) + " and previousSnapshotUuid: " + str(previousSnapshotUuid) + " to be non-empty strings" + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + + primarySRPath = getPrimarySRPath(primaryStorageSRUuid, isISCSI) + util.SMlog("primarySRPath: " + primarySRPath) + previousSnapshotVHD = getVHD(previousSnapshotUuid, isISCSI) + previousSnapshotPath = os.path.join(primarySRPath, previousSnapshotVHD) + util.SMlog("previousSnapshotPath: " + previousSnapshotPath) + + if isISCSI: + checkVolumeAvailablility(previousSnapshotPath) + + baseCopyUuid = '' + retval = '0#' + expectedActual = firstBackupUuid + '#' + baseCopyUuid + tries = 0 + # This essentially waits for GC to happen so that parent of previous + # snapshot becomes the first backup. + while (tries < 4): + # Try 4 times before failing. Shouldn't fail backupSnapshot just because + # GC didn't happen. + tries = tries + 1 + if isISCSI: + baseCopyUuid = scanParent(previousSnapshotPath) + manageAvailability(previousSnapshotPath, '-an') + else: + baseCopyUuid = getParent(previousSnapshotPath, isISCSI) + + expectedActual = firstBackupUuid + '#' + baseCopyUuid + if baseCopyUuid and (baseCopyUuid == firstBackupUuid): + retval = '1#' + break + + + return retval + expectedActual + +@echo +def backupSnapshot(session, args): + util.SMlog("Called backupSnapshot with " + str(args)) + primaryStorageSRUuid = args['primaryStorageSRUuid'] + dcId = args['dcId'] + accountId = args['accountId'] + volumeId = args['volumeId'] + secondaryStorageMountPath = args['secondaryStorageMountPath'] + snapshotUuid = args['snapshotUuid'] + prevSnapshotUuid = args['prevSnapshotUuid'] + prevBackupUuid = args['prevBackupUuid'] + isFirstSnapshotOfRootVolume = getIsTrueString(args['isFirstSnapshotOfRootVolume']) + isISCSI = getIsTrueString(args['isISCSI']) + + primarySRPath = getPrimarySRPath(primaryStorageSRUuid, isISCSI) + util.SMlog("primarySRPath: " + primarySRPath) + + baseCopyUuid = getParentOfSnapshot(snapshotUuid, primarySRPath, isISCSI) + baseCopyVHD = getVHD(baseCopyUuid, isISCSI) + baseCopyPath = os.path.join(primarySRPath, baseCopyVHD) + util.SMlog("Base copy path: " + baseCopyPath) + + prevBaseCopyUuid = '' + if prevSnapshotUuid: + prevBaseCopyUuid = getParentOfSnapshot(prevSnapshotUuid, primarySRPath, isISCSI) + + # Mount secondary storage mount path on XenServer along the path + # /var/run/sr-mount//snapshots/ and create / dir + # on it. + backupsDir = mountSnapshotsDir(secondaryStorageMountPath, "snapshots", dcId, accountId, volumeId) + util.SMlog("Backups dir " + backupsDir) + # chdir to the backupsDir for convenience + chdir(backupsDir) + + if baseCopyUuid == prevBaseCopyUuid: + # There has been no change since the last snapshot so no need to backup + util.SMlog("There has been no change since the last snapshot with backup: " + prevBaseCopyUuid) + if isFirstSnapshotOfRootVolume: + # baseCopyUuid is template. That is *NOT* the backup of any + # snapshot. There is no backup. So create an empty dummyVHD representing the empty snapshot. + # This will prevent deleteSnapshotBackup and createVolumeFromSnapshot from breaking. + prevBaseCopyUuid = createDummyVHD(baseCopyPath, backupsDir, isISCSI) + # The backup snapshot is the new dummy VHD created. + + # Set the uuid of the current backup to that of last backup + txt = "1#" + prevBaseCopyUuid + return txt + + # Check existence of snapshot on primary storage + isfile(baseCopyPath, isISCSI) + # copy baseCopyPath to backupsDir + backupFile = os.path.join(backupsDir, baseCopyVHD) + copyfile(baseCopyPath, backupFile, isISCSI) + + # Now set the availability of the snapshotPath and the baseCopyPath to false + makeUnavailable(snapshotUuid, primarySRPath, isISCSI) + manageAvailability(baseCopyPath, '-an') + if prevSnapshotUuid: + makeUnavailable(prevSnapshotUuid, primarySRPath, isISCSI) + makeUnavailable(prevBaseCopyUuid, primarySRPath, isISCSI) + + if isFirstSnapshotOfRootVolume: + # First snapshot of the root volume. + # It's parent is not null, but the template vhd. + # Create a dummy empty vhd and set the parent of backupVHD to it. + # This will prevent deleteSnapshotBackup and createVolumeFromSnapshot from breaking + prevBackupUuid = createDummyVHD(baseCopyPath, backupsDir, isISCSI) + + # Because the primary storage is always scanned, the parent of this base copy is always the first base copy. + # We don't want that, we want a chain of VHDs each of which is a delta from the previous. + # So set the parent of the current baseCopyVHD to prevBackupVHD + if prevBackupUuid: + # If there was a previous snapshot + prevBackupVHD = getVHD(prevBackupUuid, isISCSI) + setParent(prevBackupVHD, backupFile) + + txt = "1#" + baseCopyUuid + return txt + +def createDummyVHD(baseCopyPath, backupsDir, isISCSI): + dummyUUID = '' + try: + dummyUUID = util.gen_uuid() + dummyVHD = getVHD(dummyUUID, isISCSI) + if isISCSI: + checkVolumeAvailablility(baseCopyPath) + cmd = [VHD_UTIL, 'query', '-v', '-n', baseCopyPath] + virtualSizeInMB = util.pread2(cmd) + util.SMlog("Virtual size of " + baseCopyPath + " is " + virtualSizeInMB) + cmd = [VHD_UTIL, 'create', '-n', dummyVHD, '-s', virtualSizeInMB] + util.pread2(cmd) + except CommandException: + errMsg = "Unexpected error while creating a dummy VHD " + dummyVHD + " on " + backupsDir + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + util.SMlog("Successfully created a new dummy VHD: " + dummyVHD + " on " + backupsDir) + + return dummyUUID + +@echo +def deleteSnapshotBackup(session, args): + util.SMlog("Calling deleteSnapshotBackup with " + str(args)) + dcId = args['dcId'] + accountId = args['accountId'] + volumeId = args['volumeId'] + secondaryStorageMountPath = args['secondaryStorageMountPath'] + backupUUID = args['backupUUID'] + childUUID = args['childUUID'] + isISCSI = getIsTrueString(args['isISCSI']) + + backupsDir = mountSnapshotsDir(secondaryStorageMountPath, "snapshots", dcId, accountId, volumeId) + # chdir to the backupsDir for convenience + chdir(backupsDir) + + backupVHD = getVHD(backupUUID, isISCSI) + util.SMlog("checking existence of " + backupVHD) + + # The backupVHD is on secondary which is NFS and not ISCSI. + if not os.path.isfile(backupVHD): + util.SMlog("backupVHD " + backupVHD + "does not exist. Not trying to delete it") + return "1" + util.SMlog("backupVHD " + backupVHD + " exists.") + + # Case 1) childUUID exists + if childUUID: + coalesceToChild(backupVHD, childUUID, isISCSI) + else: + # Just delete the backupVHD + try: + os.remove(backupVHD) + except OSError, (errno, strerror): + errMsg = "OSError while removing " + backupVHD + " with errno: " + str(errno) + " and strerr: " + strerror + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + + return "1" + +@echo +def createVolumeFromSnapshot(session, args): + util.SMlog("Calling createVolumeFromSnapshot with " + str(args)) + dcId = args['dcId'] + accountId = args['accountId'] + volumeId = args['volumeId'] + secondaryStorageMountPath = args['secondaryStorageMountPath'] + backedUpSnapshotUuid = args['backedUpSnapshotUuid'] + templatePath = args['templatePath'] + templateDownloadFolder = args['templateDownloadFolder'] + isISCSI = getIsTrueString(args['isISCSI']) + + backupsDir = mountSnapshotsDir(secondaryStorageMountPath, "snapshots", dcId, accountId, volumeId) + util.SMlog("Backups dir " + backupsDir) + + # chdir to the backupsDir for convenience + chdir(backupsDir) + + # Get the parent VHD chain of the backupSnapshotVHD + vhdChain = [] + uuid = backedUpSnapshotUuid + while uuid is not None: + util.SMlog("Current uuid in parent chain " + uuid) + vhd = getVHD(uuid, isISCSI) + vhdChain.append(vhd) + uuid = getParent(vhd, isISCSI) + util.SMlog("successfully created the parent chain " + str(vhdChain)) + + destDirParent = '' + destDir = '' + if templateDownloadFolder: + # Copy all the vhds to the final destination templates dir + # It is some random directory on the primary created for templates. + destDirParent = os.path.join(SR.MOUNT_BASE, "mount" + str(int(random.random() * 1000000))) + destDir = os.path.join(destDirParent, templateDownloadFolder) + # create the this directory, if it isn't there + makedirs(destDir) + else: + # Copy all the vhds to a temp directory + # Create a temp directory + destDir = backupsDir + '_temp' + + # Delete the temp directory if it already exists (from a previous createVolumeFromSnapshot) + rmtree(destDir) + + if templateDownloadFolder: + # The destDir was created in create_secondary_storage_folder but is not mounted on the primary. Mount it again. + remoteMountPoint = os.path.join(secondaryStorageMountPath, "template"); + remoteMountPoint = os.path.join(remoteMountPoint, templateDownloadFolder) + mount(remoteMountPoint, destDir) + else: + # The parent of the destDir is the snapshots dir and is mounted on the primary. Just create the directory structure. + makedirs(destDir) + + # Copy + for vhd in vhdChain: + vhdPath = os.path.join(backupsDir, vhd) + tempFile = os.path.join(destDir, vhd) + # We are copying files on secondary storage which is NFS. Set isISCSI to false + copyfile(vhdPath, tempFile, False) + util.SMlog("Successfully copied all files") + + # coalesce the vhd chains from bottom to top + # chdir to destDir for convenience + chdir(destDir) + + # coalesce + i = 0 + finalVhd = vhdChain[0] + for vhd in vhdChain: + finalVhd = vhdChain[i] + last = len(vhdChain) - 1 + if i == last: + # last vhd, has no parent. Don't coalesce + break + if templatePath and i == (last - 1): + # Hack for root disks, the first Vhd is a dummy one. + # Do not coalesce the actual disk with the dummy one. + # Instead coalesce it with the templateVHD. + break + + i = i + 1 + # They are arranged from child to parent. + util.SMlog("Starting to coalesce " + vhd + " with its parent") + try: + cmd = [VHD_UTIL, "coalesce", "-n", vhd] + txt = util.pread2(cmd) + except: + errMsg = "Unexpected error while trying to coalesce " + vhd + " to its parent" + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + util.SMlog("Successfully coalesced " + vhd + " with its parent") + + # Remove the child vhd + try: + os.remove(vhd) + except OSError, (errno, strerror): + errMsg = "OSError while removing " + vhd + " with errno: " + str(errno) + " and strerr: " + strerror + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + + util.SMlog("successfully coalesced all vhds to the parent " + finalVhd) + finalVhdPath = os.path.join(destDir, finalVhd) + + # This vhd has to be introduced with a new uuid because of the VDI UUID + # uniqueness constraint + newUUID = '' + try: + newUUID = util.gen_uuid() + except: + errMsg = "Unexpected error while trying to generate a uuid" + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + util.SMlog("generated a uuid " + newUUID) + + # Now, at the Java layer an NFS SR is created with mount point destDir and scanned. The vhd + # file is automatically introduced and a vdi.copy is done to move it to + # primary storage. + # new vhd file is created on NFS. So it should have NFS naming convention, + # set isISCSI to false + newVhd = getVHD(newUUID, False) + rename(finalVhd, newVhd) + + # For root disk + if templatePath: + # This will create a vhd on secondary storage destDir with name newVhd + mergeTemplateAndSnapshot(secondaryStorageMountPath, templatePath, destDir, newVhd, isISCSI) + + # set the hidden flag of the new VHD to false, so that it doesn't get deleted when the SR scan is done. + try: + vhdutil.setHidden(newVhd, False) + except: + errMsg = "Unexpected error while trying to set Hidden flag of " + newVhd + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + util.SMlog("Successfully set hidden flag of " + newVhd) + + virtualSizeInMB = 0 + try: + cmd = [VHD_UTIL, 'query', '-v', '-n', newVhd] + virtualSizeInMB = util.pread2(cmd) + util.SMlog("Virtual size of " + newVhd + " is " + virtualSizeInMB) + except: + errMsg = "Unexpected error while trying to get the virtual size of " + newVhd + util.SMlog(errMsg) + raise xs_errors.XenError(errMsg) + + if templateDownloadFolder: + # We are done with the destDir on the primary, unmount it and delete the random directory. + # Current dir is destDir + # cd to something else before unmounting + chdir(backupsDir) # as good as anything else + # unmount what was mounted. + umount(destDir) + # Remove the tree starting from the mountXXXX part, just the directories + rmtree(destDirParent) + # The coalesced data is still available on the secondary. + + return "1#" + newUUID + "#" + virtualSizeInMB + +def mergeTemplateAndSnapshot(secondaryStorageMountPath, templatePath, destDir, newVhd, isISCSI): + # Mount the template directory present on the secondary to the primary + templateDirOnPrimary = mountTemplatesDir(secondaryStorageMountPath, templatePath) + + # Current dir is destDir + templateVHD = os.path.basename(templatePath) + templatePathOnPrimary = os.path.join(templateDirOnPrimary, templateVHD) + templatePathOnTemp = os.path.join(destDir, templateVHD) + # Copying from secondary to secondary, so set ISCSI to False + copyfile(templatePathOnPrimary, templatePathOnTemp, False) + + # unmount the temporary directory created for copying the template + umount(templateDirOnPrimary) + + # get the dummyVHD which is the parent of the new Vhd + dummyUUID = getParent(newVhd, isISCSI) + dummyVHD = getVHD(dummyUUID, isISCSI) + # set the parent of the newVhd to the templateVHD on secondary + setParent(templateVHD, newVhd) + # remove the dummyVHD as we don't have any use for it and it wil + # lie around after we do an SR scan + os.remove(dummyVHD) + + # coalesce the two VHDs into templateVHD + coalesce(newVhd) + + # rename templateVHD to newVhd + rename(templateVHD, newVhd) + + return + +def rmtree(path): + if os.path.isdir(path): + try: + shutil.rmtree(path) + except OSError, (errno, strerror): + errMsg = "Error while deleting " + path + " on secondary storage with errno: " + str(errno) + " and strerr: " + strerror + ". Please delete it manually" + util.SMlog(errMsg) + util.SMlog("Successfully deleted " + path) + else: + util.SMlog("Could not find directory with path " + path) + return + +@echo +def deleteSnapshotsDir(session, args): + util.SMlog("Calling deleteSnapshotsDir with " + str(args)) + dcId = args['dcId'] + accountId = args['accountId'] + volumeId = args['volumeId'] + secondaryStorageMountPath = args['secondaryStorageMountPath'] + + backupsDir = mountSnapshotsDir(secondaryStorageMountPath, "snapshots", dcId, accountId, volumeId) + accountDir = os.path.dirname(backupsDir) + util.SMlog("accountDir is " + accountDir) + rmtree(accountDir) + + return "1" + @echo def networkUsage(session, args): sargs = args['args'] @@ -1105,5 +2129,5 @@ def network_rules(session, args): if __name__ == "__main__": - XenAPIPlugin.dispatch({"pingtest": pingtest, "setup_heartbeat_sr":setup_heartbeat_sr, "check_heartbeat":check_heartbeat, "heartbeat": heartbeat, "setup_iscsi":setup_iscsi, "find_bond": find_bond, "gethostvmstats": gethostvmstats, "getvncport": getvncport, "getgateway": getgateway, "getnetwork": getnetwork, "preparemigration": preparemigration, "setIptables": setIptables, "patchdomr": patchdomr, "pingdomr": pingdomr, "pingxenserver": pingxenserver, "ipassoc": ipassoc, "vm_data": vm_data, "savePassword": savePassword, "saveDhcpEntry": saveDhcpEntry, "setFirewallRule": setFirewallRule, "setLoadBalancerRule": setLoadBalancerRule, "createFile": createFile, "deleteFile": deleteFile, "checkMount": checkMount, "checkIscsi": checkIscsi, "networkUsage": networkUsage, "network_rules":network_rules, "can_bridge_firewall":can_bridge_firewall, "default_network_rules":default_network_rules, "destroy_network_rules_for_vm":destroy_network_rules_for_vm, "default_network_rules_systemvm":default_network_rules_systemvm, "get_rule_logs_for_vms":get_rule_logs_for_vms, "setLinkLocalIP":setLinkLocalIP}) + XenAPIPlugin.dispatch({"pingtest": pingtest, "setup_heartbeat_sr":setup_heartbeat_sr, "check_heartbeat":check_heartbeat, "heartbeat": heartbeat, "create_secondary_storage_folder":create_secondary_storage_folder, "setup_iscsi":setup_iscsi, "delete_secondary_storage_folder":delete_secondary_storage_folder, "post_create_private_template": post_create_private_template, "find_bond": find_bond, "gethostvmstats": gethostvmstats, "getvncport": getvncport, "getgateway": getgateway, "getnetwork": getnetwork, "preparemigration": preparemigration, "setIptables": setIptables, "patchdomr": patchdomr, "pingdomr": pingdomr, "pingxenserver": pingxenserver, "ipassoc": ipassoc, "vm_data": vm_data, "savePassword": savePassword, "saveDhcpEntry": saveDhcpEntry, "setFirewallRule": setFirewallRule, "setLoadBalancerRule": setLoadBalancerRule, "createFile": createFile, "deleteFile": deleteFile, "checkMount": checkMount, "checkIscsi": checkIscsi, "backupSnapshot": backupSnapshot, "deleteSnapshotBackup": deleteSnapshotBackup, "createVolumeFromSnapshot": createVolumeFromSnapshot, "networkUsage": networkUsage, "unmountSnapshotsDir": unmountSnapshotsDir, "deleteSnapshotsDir": deleteSnapshotsDir, "validatePreviousSnapshotBackup": validatePreviousSnapshotBackup, "validateSnapshot" : validateSnapshot, "network_rules":network_rules, "can_bridge_firewall":can_bridge_firewall, "default_network_rules":default_network_rules, "destroy_network_rules_for_vm":destroy_network_rules_for_vm, "default_network_rules_systemvm":default_network_rules_systemvm, "get_rule_logs_for_vms":get_rule_logs_for_vms, "setLinkLocalIP":setLinkLocalIP}) diff --git a/scripts/vm/hypervisor/xenserver/vmopsSnapshot b/scripts/vm/hypervisor/xenserver/vmopsSnapshot deleted file mode 100755 index 891257fb4a9..00000000000 --- a/scripts/vm/hypervisor/xenserver/vmopsSnapshot +++ /dev/null @@ -1,1000 +0,0 @@ -#!/usr/bin/python -# -# A plugin for executing script needed by vmops cloud - -import os, sys, time -import XenAPIPlugin -sys.path.append("/opt/xensource/sm/") -import SR, VDI, SRCommand, util, lvutil -from util import CommandException -import vhdutil -import shutil -import lvhdutil -import subprocess -from lvmcache import LVMCache -from journaler import Journaler -from lock import Lock -import errno -import subprocess -import xs_errors -import cleanup -import hostvmstats -import socket -import stat -import random -import tempfile - -VHD_UTIL = '/usr/sbin/vhd-util' -VHD_PREFIX = 'VHD-' - -def echo(fn): - def wrapped(*v, **k): - name = fn.__name__ - util.SMlog("#### VMOPS enter %s ####" % name ) - res = fn(*v, **k) - util.SMlog("#### VMOPS exit %s ####" % name ) - return res - return wrapped - - -@echo -def create_secondary_storage_folder(session, args): - local_mount_path = None - - util.SMlog("create_secondary_storage_folder, args: " + str(args)) - - try: - try: - # Mount the remote resource folder locally - remote_mount_path = args["remoteMountPath"] - local_mount_path = os.path.join(SR.MOUNT_BASE, "mount" + str(int(random.random() * 1000000))) - mount(remote_mount_path, local_mount_path) - - # Create the new folder - new_folder = local_mount_path + "/" + args["newFolder"] - if not os.path.isdir(new_folder): - current_umask = os.umask(0) - os.makedirs(new_folder) - os.umask(current_umask) - except OSError, (errno, strerror): - errMsg = "create_secondary_storage_folder failed: errno: " + str(errno) + ", strerr: " + strerror - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - except: - errMsg = "create_secondary_storage_folder failed." - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - finally: - if local_mount_path != None: - # Unmount the local folder - umount(local_mount_path) - # Remove the local folder - os.system("rm -rf " + local_mount_path) - - return "1" - -@echo -def delete_secondary_storage_folder(session, args): - local_mount_path = None - - util.SMlog("delete_secondary_storage_folder, args: " + str(args)) - - try: - try: - # Mount the remote resource folder locally - remote_mount_path = args["remoteMountPath"] - local_mount_path = os.path.join(SR.MOUNT_BASE, "mount" + str(int(random.random() * 1000000))) - mount(remote_mount_path, local_mount_path) - - # Delete the specified folder - folder = local_mount_path + "/" + args["folder"] - if os.path.isdir(folder): - os.system("rm -rf " + folder) - except OSError, (errno, strerror): - errMsg = "delete_secondary_storage_folder failed: errno: " + str(errno) + ", strerr: " + strerror - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - except: - errMsg = "delete_secondary_storage_folder failed." - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - finally: - if local_mount_path != None: - # Unmount the local folder - umount(local_mount_path) - # Remove the local folder - os.system("rm -rf " + local_mount_path) - - return "1" - -@echo -def execute_script(session, args): - return "" - -@echo -def post_create_private_template(session, args): - local_mount_path = None - - try: - try: - # Mount the remote templates folder locally - remote_mount_path = args["remoteTemplateMountPath"] - local_mount_path = os.path.join(SR.MOUNT_BASE, "template" + str(int(random.random() * 10000))) - mount(remote_mount_path, local_mount_path) - util.SMlog("Mounted secondary storage template folder") - - # Retrieve args - filename = args["templateFilename"] - name = args["templateName"] - description = args["templateDescription"] - checksum = args["checksum"] - virtual_size = args["virtualSize"] - template_id = args["templateId"] - - # Determine the template size - template_download_folder = local_mount_path + "/" + args["templateDownloadFolder"] - template_download_path = template_download_folder + filename - file_size = os.path.getsize(template_download_path) - util.SMlog("Got template file_size: " + str(file_size)) - - # Create the template.properties file - template_properties_download_path = template_download_folder + "template.properties" - f = open(template_properties_download_path, "w") - f.write("filename=" + filename + "\n") - f.write("name=" + filename + "\n") - f.write("vhd=true\n") - f.write("id=" + template_id + "\n") - f.write("vhd.filename=" + filename + "\n") - f.write("uniquename=" + name + "\n") - f.write("vhd.virtualsize=" + virtual_size + "\n") - f.write("vhd.size=" + str(file_size) + "\n") - f.write("virtualsize=" + virtual_size + "\n") - f.write("checksum=" + checksum + "\n") - f.write("hvm=true\n") - f.write("description=" + name + "\n") - f.close() - util.SMlog("Created template.properties file") - - # Create the template install folder if necessary - template_install_folder = local_mount_path + "/" + args["templateInstallFolder"] - if not os.path.isdir(template_install_folder): - current_umask = os.umask(0) - os.makedirs(template_install_folder) - os.umask(current_umask) - - # Move the template and the template.properties file to the install folder - os.system("mv " + template_download_folder + "/" + filename + " " + template_install_folder) - os.system("mv " + template_download_folder + "/template.properties " + template_install_folder) - template_install_path = template_install_folder + filename - template_properties_install_path = template_install_folder + "template.properties" - - # Set permissions - permissions = stat.S_IREAD | stat.S_IWRITE | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH - os.chmod(template_install_path, permissions) - os.chmod(template_properties_install_path, permissions) - util.SMlog("Set permissions on template and template.properties") - - # Delete the template download folder - os.system("rm -rf " + template_download_folder) - except: - errMsg = "post_create_private_template failed." - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - finally: - if local_mount_path != None: - # Unmount the local templates folder - umount(local_mount_path) - # Remove the local templates folder - os.system("rm -rf " + local_mount_path) - - return "1" - -def isfile(path, isISCSI): - errMsg = '' - exists = True - if isISCSI: - exists = checkVolumeAvailablility(path) - else: - exists = os.path.isfile(path) - - if not exists: - errMsg = "File " + path + " does not exist." - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - return errMsg - -def copyfile(fromFile, toFile, isISCSI): - util.SMlog("Starting to copy " + fromFile + " to " + toFile) - errMsg = '' - if isISCSI: - try: - cmd = ['dd', 'if=' + fromFile, 'of=' + toFile] - txt = util.pread2(cmd) - except: - txt = '' - errMsg = "Error while copying " + fromFile + " to " + toFile + " in ISCSI mode" - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - - else: - try: - shutil.copy2(fromFile, toFile) - except OSError, (errno, strerror): - errMsg = "Error while copying " + fromFile + " to " + toFile + " with errno: " + str(errno) + " and strerr: " + strerror - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - - util.SMlog("Successfully copied " + fromFile + " to " + toFile) - return errMsg - -def chdir(path): - try: - os.chdir(path) - except OSError, (errno, strerror): - errMsg = "Unable to chdir to " + path + " because of OSError with errno: " + str(errno) + " and strerr: " + strerror - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - util.SMlog("Chdired to " + path) - return - -def coalesce(vhdPath): - util.SMlog("Starting to coalesce " + vhdPath + " with its parent") - try : - cmd = [VHD_UTIL, "coalesce", "-n", vhdPath] - txt = util.pread2(cmd) - except: - errMsg = "Unexpected error while trying to coalesce " + vhdPath + " to its parent" - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - util.SMlog("Successfully coalesced " + vhdPath + " with its parent ") - - return - -def scanParent(path): - # Do a scan for the parent for ISCSI volumes - # Note that the parent need not be visible on the XenServer - parentUUID = '' - try: - lvName = os.path.basename(path) - dirname = os.path.dirname(path) - vgName = os.path.basename(dirname) - vhdInfo = vhdutil.getVHDInfoLVM(lvName, lvhdutil.extractUuid, vgName) - parentUUID = vhdInfo.parentUuid - except: - errMsg = "Could not get vhd parent of " + path - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - return parentUUID - -def getParent(path, isISCSI): - parentUUID = '' - try : - if isISCSI: - parentUUID = vhdutil.getParent(path, lvhdutil.extractUuid) - else: - parentUUID = vhdutil.getParent(path, cleanup.FileVDI.extractUuid) - except: - errMsg = "Could not get vhd parent of " + path - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - return parentUUID - -def getParentOfSnapshot(snapshotUuid, primarySRPath, isISCSI): - snapshotVHD = getVHD(snapshotUuid, isISCSI) - snapshotPath = os.path.join(primarySRPath, snapshotVHD) - - baseCopyUuid = '' - if isISCSI: - checkVolumeAvailablility(snapshotPath) - baseCopyUuid = scanParent(snapshotPath) - else: - baseCopyUuid = getParent(snapshotPath, isISCSI) - - util.SMlog("Base copy of snapshotUuid: " + snapshotUuid + " is " + baseCopyUuid) - return baseCopyUuid - -def setParent(parent, child): - try: - cmd = [VHD_UTIL, "modify", "-p", parent, "-n", child] - txt = util.pread2(cmd) - except: - errMsg = "Unexpected error while trying to set parent of " + child + " to " + parent - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - util.SMlog("Successfully set parent of " + child + " to " + parent) - return - -def rename(originalVHD, newVHD): - try: - os.rename(originalVHD, newVHD) - except OSError, (errno, strerror): - errMsg = "OSError while renaming " + origiinalVHD + " to " + newVHD + "with errno: " + str(errno) + " and strerr: " + strerror - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - return - -def coalesceToChild(backupVHD, childUUID, isISCSI): - # coalesce childVHD with its parent - childVHD = getVHD(childUUID, isISCSI) - util.SMlog("childVHD: " + childVHD) - # check for existence of childVHD - isfile(childVHD, False) - util.SMlog("childVHD " + childVHD + " exists") - # No exception thrown, file exists - coalesce(childVHD) - - # rename the existing backupVHD file to childVHD - # childVHD file automatically gets overwritten - rename(backupVHD, childVHD) - - # parent of the newly coalesced file still remains the same. - # child of childVHD has it's parent name still set to childVHD. - # So the VHD chain hasn't been broken. - return - -def makedirs(path): - if not os.path.isdir(path): - try: - os.makedirs(path) - except OSError, (errno, strerror): - errMsg = "OSError while creating " + path + " with errno: " + str(errno) + " and strerr: " + strerror - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - return - -def mount(remoteDir, localDir): - makedirs(localDir) - - try: - cmd = ['mount', remoteDir, localDir] - txt = util.pread2(cmd) - except: - txt = '' - errMsg = "Unexpected error while trying to mount " + remoteDir + " to " + localDir - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - util.SMlog("Successfully mounted " + remoteDir + " to " + localDir) - - return - -def umount(localDir): - success = False - if os.path.isdir(localDir) and os.path.ismount(localDir): - try: - cmd = ['umount', localDir] - util.pread2(cmd) - except CommandException: - errMsg = "CommandException raised while trying to umount " + localDir - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - util.SMlog("Successfully unmounted " + localDir) - success = True - else: - util.SMlog("LocalDir: " + localDir + " doesn't exist or is not a mount point") - - return - - -def mountTemplatesDir(secondaryStorageMountPath, templatePath): - # Aim is to mount / on - # SR.MOUNT_BASE/ - # It will be unmounted after createVolumeFromSnapshot finishes. - # It should be mounted read-only, but don't know how to do that - # The random-uuid saves us from conflicts while restoring two different root volumes - - absoluteTemplatePath = os.path.join(secondaryStorageMountPath, templatePath) - absoluteTemplateDir = os.path.dirname(absoluteTemplatePath) - - randomUUID = util.gen_uuid() - localTemplateDir = os.path.join(SR.MOUNT_BASE, randomUUID) - # create the temp dir - makedirs(localTemplateDir) - # mount - mount(absoluteTemplateDir, localTemplateDir) - - return localTemplateDir - -def mountSnapshotsDir(secondaryStorageMountPath, relativeDir, dcId, accountId, instanceId): - # The aim is to mount secondaryStorageMountPath on - # SR.MOUNT_BASE// - # And create / dir on it, if it doesn't exist already. - # Assuming that secondaryStorageMountPath exists remotely - - # Alex's suggestion and currently implemented: - # Just mount secondaryStorageMountPath/ everytime - # Never unmount. - snapshotsDir = os.path.join(secondaryStorageMountPath, relativeDir) - - # Mkdir local mount point dir, if it doesn't exist. - localMountPointPath = os.path.join(SR.MOUNT_BASE, dcId) - localMountPointPath = os.path.join(localMountPointPath, relativeDir) - - makedirs(localMountPointPath) - # if something is not mounted already on localMountPointPath, - # mount secondaryStorageMountPath on localMountPath - if os.path.ismount(localMountPointPath): - # There is only one secondary storage per zone. - # And we are mounting each sec storage under a zone-specific directory - # So two secondary storage snapshot dirs will never get mounted on the same point on the same XenServer. - util.SMlog("The remote snapshots directory has already been mounted on " + localMountPointPath) - else: - mount(snapshotsDir, localMountPointPath) - - # Create accountId/instanceId dir on localMountPointPath, if it doesn't exist - backupsDir = os.path.join(localMountPointPath, accountId) - backupsDir = os.path.join(backupsDir, instanceId) - makedirs(backupsDir) - return backupsDir - -@echo -def unmountSnapshotsDir(session, args): - dcId = args['dcId'] - localMountPointPath = os.path.join(SR.MOUNT_BASE, dcId) - localMountPointPath = os.path.join(localMountPointPath, "snapshots") - try: - umount(localMountPointPath) - except: - util.SMlog("Ignoring the error while trying to unmount the snapshots dir.") - - return "1" - -def getPrimarySRPath(primaryStorageSRUuid, isISCSI): - if isISCSI: - primarySRDir = lvhdutil.VG_PREFIX + primaryStorageSRUuid - return os.path.join(lvhdutil.VG_LOCATION, primarySRDir) - else: - return os.path.join(SR.MOUNT_BASE, primaryStorageSRUuid) - -def getVHD(UUID, isISCSI): - if isISCSI: - return VHD_PREFIX + UUID - else: - return UUID + '.' + SR.DEFAULT_TAP - -def getIsTrueString(stringValue): - booleanValue = False - if (stringValue and stringValue == 'true'): - booleanValue = True - return booleanValue - -def makeUnavailable(uuid, primarySRPath, isISCSI): - VHD = getVHD(uuid, isISCSI) - path = os.path.join(primarySRPath, VHD) - manageAvailability(path, '-an') - return - -def manageAvailability(path, value): - util.SMlog("Setting availability of " + path + " to " + value) - try: - cmd = ['/usr/sbin/lvchange', value, path] - util.pread2(cmd) - except: #CommandException, (rc, cmdListStr, stderr): - #errMsg = "CommandException thrown while executing: " + cmdListStr + " with return code: " + str(rc) + " and stderr: " + stderr - errMsg = "Unexpected exception thrown by lvchange" - util.SMlog(errMsg) - if value == "-ay": - # Raise an error only if we are trying to make it available. - # Just warn if we are trying to make it unavailable after the - # snapshot operation is done. - raise xs_errors.XenError(errMsg) - return - - -def checkVolumeAvailablility(path): - try: - if not isVolumeAvailable(path): - # The VHD file is not available on XenSever. The volume is probably - # inactive or detached. - # Do lvchange -ay to make it available on XenServer - manageAvailability(path, '-ay') - except: - errMsg = "Could not determine status of ISCSI path: " + path - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - - success = False - i = 0 - while i < 6: - i = i + 1 - # Check if the vhd is actually visible by checking for the link - # set isISCSI to true - success = isVolumeAvailable(path) - if success: - util.SMlog("Made vhd: " + path + " available and confirmed that it is visible") - break - - # Sleep for 10 seconds before checking again. - time.sleep(10) - - # If not visible within 1 min fail - if not success: - util.SMlog("Could not make vhd: " + path + " available despite waiting for 1 minute. Does it exist?") - - return success - -def isVolumeAvailable(path): - # Check if iscsi volume is available on this XenServer. - status = "0" - try: - p = subprocess.Popen(["/bin/bash", "-c", "if [ -L " + path + " ]; then echo 1; else echo 0;fi"], stdout=subprocess.PIPE) - status = p.communicate()[0].strip("\n") - except: - errMsg = "Could not determine status of ISCSI path: " + path - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - - return (status == "1") - -def getLastSnapshotUuid(volumeUuid, expectedLastSnapshotUuid): - actualLastSnapshotUuid = '' - if volumeUuid: - cmd = ['xe', 'vdi-param-get', 'uuid=' + volumeUuid, 'param-name=snapshots'] - stdout = '' - try: - stdout = util.pread2(cmd) - except: #CommandException, (rc, cmdListStr, stderr): - #errMsg = "CommandException thrown while executing: " + cmdListStr + " with return code: " + str(rc) + " and stderr: " + stderr - errMsg = "Unexpected error while executing cmd: " + str(cmd) - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - if stdout: - snapshots = stdout.split(';') - if len(snapshots) == 1: - if snapshots[0] == expectedLastSnapshotUuid: - actualLastSnapshotUuid = expectedLastSnapshotUuid - elif len(snapshots) == 2: - # We expect only 1 snapshot to be present. If there is another that is unexpected and the last one - if (expectedLastSnapshotUuid == snapshots[0].strip()): - actualLastSnapshotUuid = snapshots[1].strip() - else: - # it should be equal to snapshots[1]. Else I have no idea. - actualLastSnapshotUuid = snapshots[0].strip() - else: - # len(snapshots) > 2: - errMsg = "Volume: " + volumeUuid + " has more than 2 snapshots: " + str(snapshots) - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - - return actualLastSnapshotUuid - -@echo -def validateSnapshot(session, args): - util.SMlog("Called validateSnapshot with " + str(args)) - primaryStorageSRUuid = args['primaryStorageSRUuid'] - volumeUuid = args['volumeUuid'] - firstBackupUuid = args['firstBackupUuid'] - previousSnapshotUuid = args['previousSnapshotUuid'] - templateUuid = args['templateUuid'] - isISCSI = getIsTrueString(args['isISCSI']) - - primarySRPath = getPrimarySRPath(primaryStorageSRUuid, isISCSI) - util.SMlog("primarySRPath: " + primarySRPath) - volumeVHD = getVHD(volumeUuid, isISCSI) - volumePath = os.path.join(primarySRPath, volumeVHD) - util.SMlog("volumePath: " + volumePath) - - baseCopyUuid = '' - wasVolumeAvailable = True - if isISCSI: - wasVolumeAvailable = isVolumeAvailable(volumePath) - if not wasVolumeAvailable: - # make it available - checkVolumeAvailablility(volumePath) - baseCopyUuid = scanParent(volumePath) - else: - baseCopyUuid = getParent(volumePath, isISCSI) - - if baseCopyUuid is None: - # Make it an empty string so that it can be used in the return value - baseCopyUuid = '' - - actualSnapshotUuid = getLastSnapshotUuid(volumeUuid, previousSnapshotUuid) - expectedActual = firstBackupUuid + "#" + baseCopyUuid + "#" + actualSnapshotUuid - if firstBackupUuid: - # This is not the first snapshot - if baseCopyUuid and (baseCopyUuid == firstBackupUuid): - retval = "1#" - else: - retval = "0#" - else: - if templateUuid: - # The DB thinks this is the first snapshot of a ROOT DISK - # The parent of the volume should be the base template, which is also the parent of the given templateUuid. - templateVHD = getVHD(templateUuid, isISCSI) - templatePath = os.path.join(primarySRPath, templateVHD) - baseTemplateUuid = '' - wasTemplateAvailable = True - if isISCSI: - wasTemplateAvailable = isVolumeAvailable(templatePath) - if not wasVolumeAvailable: - # make it available - checkVolumeAvailablility(templatePath) - baseTemplateUuid = scanParent(templatePath) - else: - baseTemplateUuid = getParent(templatePath, isISCSI) - - if baseTemplateUuid is None: - # This will never happen. - baseTemplateUuid = '' - - expectedActual = baseTemplateUuid + "#" + baseCopyUuid + "#" + actualSnapshotUuid - if baseTemplateUuid and (baseCopyUuid == baseTemplateUuid): - retval = "1#" - else: - retval = "0#" - - if isISCSI and not wasTemplateAvailable: - manageAvailability(templatePath, '-an') - - else: - # The DB thinks this is the first snapshot of a DATA DISK. - # The volume VDI should not have any parent. - if not baseCopyUuid: - retval = "1#" - else: - retval = "0#" - - # Set the volume's visibility back to what it was. - if isISCSI and not wasVolumeAvailable: - manageAvailability(volumePath, '-an') - - return retval + expectedActual - -@echo -def backupSnapshot(session, args): - util.SMlog("Called backupSnapshot with " + str(args)) - primaryStorageSRUuid = args['primaryStorageSRUuid'] - dcId = args['dcId'] - accountId = args['accountId'] - volumeId = args['volumeId'] - secondaryStorageMountPath = args['secondaryStorageMountPath'] - snapshotUuid = args['snapshotUuid'] - prevSnapshotUuid = args['prevSnapshotUuid'] - prevBackupUuid = args['prevBackupUuid'] - isFirstSnapshotOfRootVolume = getIsTrueString(args['isFirstSnapshotOfRootVolume']) - isISCSI = getIsTrueString(args['isISCSI']) - - primarySRPath = getPrimarySRPath(primaryStorageSRUuid, isISCSI) - util.SMlog("primarySRPath: " + primarySRPath) - - baseCopyUuid = getParentOfSnapshot(snapshotUuid, primarySRPath, isISCSI) - baseCopyVHD = getVHD(baseCopyUuid, isISCSI) - baseCopyPath = os.path.join(primarySRPath, baseCopyVHD) - util.SMlog("Base copy path: " + baseCopyPath) - - prevBaseCopyUuid = '' - if prevSnapshotUuid: - prevBaseCopyUuid = getParentOfSnapshot(prevSnapshotUuid, primarySRPath, isISCSI) - - # Mount secondary storage mount path on XenServer along the path - # /var/run/sr-mount//snapshots/ and create / dir - # on it. - backupsDir = mountSnapshotsDir(secondaryStorageMountPath, "snapshots", dcId, accountId, volumeId) - util.SMlog("Backups dir " + backupsDir) - # chdir to the backupsDir for convenience - chdir(backupsDir) - - if baseCopyUuid == prevBaseCopyUuid: - # There has been no change since the last snapshot so no need to backup - util.SMlog("There has been no change since the last snapshot with backup: " + prevBaseCopyUuid) - if isFirstSnapshotOfRootVolume: - # baseCopyUuid is template. That is *NOT* the backup of any - # snapshot. There is no backup. So create an empty dummyVHD representing the empty snapshot. - # This will prevent deleteSnapshotBackup and createVolumeFromSnapshot from breaking. - prevBaseCopyUuid = createDummyVHD(baseCopyPath, backupsDir, isISCSI) - # The backup snapshot is the new dummy VHD created. - - # Set the uuid of the current backup to that of last backup - txt = "1#" + prevBaseCopyUuid - return txt - - # Check existence of snapshot on primary storage - isfile(baseCopyPath, isISCSI) - # copy baseCopyPath to backupsDir - backupFile = os.path.join(backupsDir, baseCopyVHD) - copyfile(baseCopyPath, backupFile, isISCSI) - - # Now set the availability of the snapshotPath and the baseCopyPath to false - makeUnavailable(snapshotUuid, primarySRPath, isISCSI) - manageAvailability(baseCopyPath, '-an') - if prevSnapshotUuid: - makeUnavailable(prevSnapshotUuid, primarySRPath, isISCSI) - makeUnavailable(prevBaseCopyUuid, primarySRPath, isISCSI) - - if isFirstSnapshotOfRootVolume: - # First snapshot of the root volume. - # It's parent is not null, but the template vhd. - # Create a dummy empty vhd and set the parent of backupVHD to it. - # This will prevent deleteSnapshotBackup and createVolumeFromSnapshot from breaking - prevBackupUuid = createDummyVHD(baseCopyPath, backupsDir, isISCSI) - - # Because the primary storage is always scanned, the parent of this base copy is always the first base copy. - # We don't want that, we want a chain of VHDs each of which is a delta from the previous. - # So set the parent of the current baseCopyVHD to prevBackupVHD - if prevBackupUuid: - # If there was a previous snapshot - prevBackupVHD = getVHD(prevBackupUuid, isISCSI) - setParent(prevBackupVHD, backupFile) - - txt = "1#" + baseCopyUuid - return txt - -def createDummyVHD(baseCopyPath, backupsDir, isISCSI): - dummyUUID = '' - try: - dummyUUID = util.gen_uuid() - dummyVHD = getVHD(dummyUUID, isISCSI) - if isISCSI: - checkVolumeAvailablility(baseCopyPath) - cmd = [VHD_UTIL, 'query', '-v', '-n', baseCopyPath] - virtualSizeInMB = util.pread2(cmd) - util.SMlog("Virtual size of " + baseCopyPath + " is " + virtualSizeInMB) - cmd = [VHD_UTIL, 'create', '-n', dummyVHD, '-s', virtualSizeInMB] - util.pread2(cmd) - except CommandException: - errMsg = "Unexpected error while creating a dummy VHD " + dummyVHD + " on " + backupsDir - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - util.SMlog("Successfully created a new dummy VHD: " + dummyVHD + " on " + backupsDir) - - return dummyUUID - -@echo -def deleteSnapshotBackup(session, args): - util.SMlog("Calling deleteSnapshotBackup with " + str(args)) - dcId = args['dcId'] - accountId = args['accountId'] - volumeId = args['volumeId'] - secondaryStorageMountPath = args['secondaryStorageMountPath'] - backupUUID = args['backupUUID'] - childUUID = args['childUUID'] - isISCSI = getIsTrueString(args['isISCSI']) - - backupsDir = mountSnapshotsDir(secondaryStorageMountPath, "snapshots", dcId, accountId, volumeId) - # chdir to the backupsDir for convenience - chdir(backupsDir) - - backupVHD = getVHD(backupUUID, isISCSI) - util.SMlog("checking existence of " + backupVHD) - - # The backupVHD is on secondary which is NFS and not ISCSI. - if not os.path.isfile(backupVHD): - util.SMlog("backupVHD " + backupVHD + "does not exist. Not trying to delete it") - return "1" - util.SMlog("backupVHD " + backupVHD + " exists.") - - # Case 1) childUUID exists - if childUUID: - coalesceToChild(backupVHD, childUUID, isISCSI) - else: - # Just delete the backupVHD - try: - os.remove(backupVHD) - except OSError, (errno, strerror): - errMsg = "OSError while removing " + backupVHD + " with errno: " + str(errno) + " and strerr: " + strerror - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - - return "1" - -@echo -def createVolumeFromSnapshot(session, args): - util.SMlog("Calling createVolumeFromSnapshot with " + str(args)) - dcId = args['dcId'] - accountId = args['accountId'] - volumeId = args['volumeId'] - secondaryStorageMountPath = args['secondaryStorageMountPath'] - backedUpSnapshotUuid = args['backedUpSnapshotUuid'] - templatePath = args['templatePath'] - templateDownloadFolder = args['templateDownloadFolder'] - isISCSI = getIsTrueString(args['isISCSI']) - - backupsDir = mountSnapshotsDir(secondaryStorageMountPath, "snapshots", dcId, accountId, volumeId) - util.SMlog("Backups dir " + backupsDir) - - # chdir to the backupsDir for convenience - chdir(backupsDir) - - # Get the parent VHD chain of the backupSnapshotVHD - vhdChain = [] - uuid = backedUpSnapshotUuid - while uuid is not None: - util.SMlog("Current uuid in parent chain " + uuid) - vhd = getVHD(uuid, isISCSI) - vhdChain.append(vhd) - uuid = getParent(vhd, isISCSI) - util.SMlog("successfully created the parent chain " + str(vhdChain)) - - destDirParent = '' - destDir = '' - if templateDownloadFolder: - # Copy all the vhds to the final destination templates dir - # It is some random directory on the primary created for templates. - destDirParent = os.path.join(SR.MOUNT_BASE, "mount" + str(int(random.random() * 1000000))) - destDir = os.path.join(destDirParent, templateDownloadFolder) - # create the this directory, if it isn't there - makedirs(destDir) - else: - # Copy all the vhds to a temp directory - # Create a temp directory - destDir = backupsDir + '_temp' - - # Delete the temp directory if it already exists (from a previous createVolumeFromSnapshot) - rmtree(destDir) - - if templateDownloadFolder: - # The destDir was created in create_secondary_storage_folder but is not mounted on the primary. Mount it again. - remoteMountPoint = os.path.join(secondaryStorageMountPath, "template"); - remoteMountPoint = os.path.join(remoteMountPoint, templateDownloadFolder) - mount(remoteMountPoint, destDir) - else: - # The parent of the destDir is the snapshots dir and is mounted on the primary. Just create the directory structure. - makedirs(destDir) - - # Copy - for vhd in vhdChain: - vhdPath = os.path.join(backupsDir, vhd) - tempFile = os.path.join(destDir, vhd) - # We are copying files on secondary storage which is NFS. Set isISCSI to false - copyfile(vhdPath, tempFile, False) - util.SMlog("Successfully copied all files") - - # coalesce the vhd chains from bottom to top - # chdir to destDir for convenience - chdir(destDir) - - # coalesce - i = 0 - finalVhd = vhdChain[0] - for vhd in vhdChain: - finalVhd = vhdChain[i] - last = len(vhdChain) - 1 - if i == last: - # last vhd, has no parent. Don't coalesce - break - if templatePath and i == (last - 1): - # Hack for root disks, the first Vhd is a dummy one. - # Do not coalesce the actual disk with the dummy one. - # Instead coalesce it with the templateVHD. - break - - i = i + 1 - # They are arranged from child to parent. - util.SMlog("Starting to coalesce " + vhd + " with its parent") - try: - cmd = [VHD_UTIL, "coalesce", "-n", vhd] - txt = util.pread2(cmd) - except: - errMsg = "Unexpected error while trying to coalesce " + vhd + " to its parent" - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - util.SMlog("Successfully coalesced " + vhd + " with its parent") - - # Remove the child vhd - try: - os.remove(vhd) - except OSError, (errno, strerror): - errMsg = "OSError while removing " + vhd + " with errno: " + str(errno) + " and strerr: " + strerror - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - - util.SMlog("successfully coalesced all vhds to the parent " + finalVhd) - finalVhdPath = os.path.join(destDir, finalVhd) - - # This vhd has to be introduced with a new uuid because of the VDI UUID - # uniqueness constraint - newUUID = '' - try: - newUUID = util.gen_uuid() - except: - errMsg = "Unexpected error while trying to generate a uuid" - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - util.SMlog("generated a uuid " + newUUID) - - # Now, at the Java layer an NFS SR is created with mount point destDir and scanned. The vhd - # file is automatically introduced and a vdi.copy is done to move it to - # primary storage. - # new vhd file is created on NFS. So it should have NFS naming convention, - # set isISCSI to false - newVhd = getVHD(newUUID, False) - rename(finalVhd, newVhd) - - # For root disk - if templatePath: - # This will create a vhd on secondary storage destDir with name newVhd - mergeTemplateAndSnapshot(secondaryStorageMountPath, templatePath, destDir, newVhd, isISCSI) - - # set the hidden flag of the new VHD to false, so that it doesn't get deleted when the SR scan is done. - try: - vhdutil.setHidden(newVhd, False) - except: - errMsg = "Unexpected error while trying to set Hidden flag of " + newVhd - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - util.SMlog("Successfully set hidden flag of " + newVhd) - - virtualSizeInMB = 0 - try: - cmd = [VHD_UTIL, 'query', '-v', '-n', newVhd] - virtualSizeInMB = util.pread2(cmd) - util.SMlog("Virtual size of " + newVhd + " is " + virtualSizeInMB) - except: - errMsg = "Unexpected error while trying to get the virtual size of " + newVhd - util.SMlog(errMsg) - raise xs_errors.XenError(errMsg) - - if templateDownloadFolder: - # We are done with the destDir on the primary, unmount it and delete the random directory. - # Current dir is destDir - # cd to something else before unmounting - chdir(backupsDir) # as good as anything else - # unmount what was mounted. - umount(destDir) - # Remove the tree starting from the mountXXXX part, just the directories - rmtree(destDirParent) - # The coalesced data is still available on the secondary. - - return "1#" + newUUID + "#" + virtualSizeInMB - -def mergeTemplateAndSnapshot(secondaryStorageMountPath, templatePath, destDir, newVhd, isISCSI): - # Mount the template directory present on the secondary to the primary - templateDirOnPrimary = mountTemplatesDir(secondaryStorageMountPath, templatePath) - - # Current dir is destDir - templateVHD = os.path.basename(templatePath) - templatePathOnPrimary = os.path.join(templateDirOnPrimary, templateVHD) - templatePathOnTemp = os.path.join(destDir, templateVHD) - # Copying from secondary to secondary, so set ISCSI to False - copyfile(templatePathOnPrimary, templatePathOnTemp, False) - - # unmount the temporary directory created for copying the template - umount(templateDirOnPrimary) - - # get the dummyVHD which is the parent of the new Vhd - dummyUUID = getParent(newVhd, isISCSI) - dummyVHD = getVHD(dummyUUID, isISCSI) - # set the parent of the newVhd to the templateVHD on secondary - setParent(templateVHD, newVhd) - # remove the dummyVHD as we don't have any use for it and it wil - # lie around after we do an SR scan - os.remove(dummyVHD) - - # coalesce the two VHDs into templateVHD - coalesce(newVhd) - - # rename templateVHD to newVhd - rename(templateVHD, newVhd) - - return - -def rmtree(path): - if os.path.isdir(path): - try: - shutil.rmtree(path) - except OSError, (errno, strerror): - errMsg = "Error while deleting " + path + " on secondary storage with errno: " + str(errno) + " and strerr: " + strerror + ". Please delete it manually" - util.SMlog(errMsg) - util.SMlog("Successfully deleted " + path) - else: - util.SMlog("Could not find directory with path " + path) - return - -@echo -def deleteSnapshotsDir(session, args): - util.SMlog("Calling deleteSnapshotsDir with " + str(args)) - dcId = args['dcId'] - accountId = args['accountId'] - volumeId = args['volumeId'] - secondaryStorageMountPath = args['secondaryStorageMountPath'] - - backupsDir = mountSnapshotsDir(secondaryStorageMountPath, "snapshots", dcId, accountId, volumeId) - accountDir = os.path.dirname(backupsDir) - util.SMlog("accountDir is " + accountDir) - rmtree(accountDir) - - return "1" - -if __name__ == "__main__": - XenAPIPlugin.dispatch({"create_secondary_storage_folder":create_secondary_storage_folder, "delete_secondary_storage_folder":delete_secondary_storage_folder, "post_create_private_template":post_create_private_template, "backupSnapshot": backupSnapshot, "deleteSnapshotBackup": deleteSnapshotBackup, "createVolumeFromSnapshot": createVolumeFromSnapshot, "unmountSnapshotsDir": unmountSnapshotsDir, "deleteSnapshotsDir": deleteSnapshotsDir, "validateSnapshot" : validateSnapshot}) - diff --git a/scripts/vm/hypervisor/xenserver/xcpserver/NFSSR.py b/scripts/vm/hypervisor/xenserver/xcpserver/NFSSR.py deleted file mode 100755 index 9f596aa9944..00000000000 --- a/scripts/vm/hypervisor/xenserver/xcpserver/NFSSR.py +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/python -# Copyright (C) 2006-2007 XenSource Ltd. -# Copyright (C) 2008-2009 Citrix Ltd. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published -# by the Free Software Foundation; version 2.1 only. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# FileSR: local-file storage repository - -import SR, VDI, SRCommand, FileSR, util -import errno -import os, re, sys -import time -import xml.dom.minidom -import xs_errors -import nfs -import vhdutil -from lock import Lock -import cleanup - -CAPABILITIES = ["SR_PROBE","SR_UPDATE", \ - "VDI_CREATE","VDI_DELETE","VDI_ATTACH","VDI_DETACH", \ - "VDI_UPDATE", "VDI_CLONE","VDI_SNAPSHOT","VDI_RESIZE","VDI_RESIZE_ONLINE"] - -CONFIGURATION = [ [ 'server', 'hostname or IP address of NFS server (required)' ], \ - [ 'serverpath', 'path on remote server (required)' ] ] - - -DRIVER_INFO = { - 'name': 'NFS VHD', - 'description': 'SR plugin which stores disks as VHD files on a remote NFS filesystem', - 'vendor': 'Citrix Systems Inc', - 'copyright': '(C) 2008 Citrix Systems Inc', - 'driver_version': '1.0', - 'required_api_version': '1.0', - 'capabilities': CAPABILITIES, - 'configuration': CONFIGURATION - } - - -# The mountpoint for the directory when performing an sr_probe. All probes -# are guaranteed to be serialised by xapi, so this single mountpoint is fine. -PROBE_MOUNTPOINT = "probe" -NFSPORT = 2049 -DEFAULT_TRANSPORT = "tcp" - - -class NFSSR(FileSR.FileSR): - """NFS file-based storage repository""" - def handles(type): - return type == 'nfs' - handles = staticmethod(handles) - - - def load(self, sr_uuid): - self.lock = Lock(vhdutil.LOCK_TYPE_SR, self.uuid) - self.sr_vditype = SR.DEFAULT_TAP - if not self.dconf.has_key('server'): - raise xs_errors.XenError('ConfigServerMissing') - self.remoteserver = self.dconf['server'] - self.path = os.path.join(SR.MOUNT_BASE, sr_uuid) - - # Test for the optional 'nfsoptions' dconf attribute - self.transport = DEFAULT_TRANSPORT - if self.dconf.has_key('useUDP') and self.dconf['useUDP'] == 'true': - self.transport = "udp" - - - def validate_remotepath(self, scan): - if not self.dconf.has_key('serverpath'): - if scan: - try: - self.scan_exports(self.dconf['server']) - except: - pass - raise xs_errors.XenError('ConfigServerPathMissing') - if not self._isvalidpathstring(self.dconf['serverpath']): - raise xs_errors.XenError('ConfigServerPathBad', \ - opterr='serverpath is %s' % self.dconf['serverpath']) - - def check_server(self): - try: - nfs.check_server_tcp(self.remoteserver) - except nfs.NfsException, exc: - raise xs_errors.XenError('NFSVersion', - opterr=exc.errstr) - - - def mount(self, mountpoint, remotepath): - try: - nfs.soft_mount(mountpoint, self.remoteserver, remotepath, self.transport) - except nfs.NfsException, exc: - raise xs_errors.XenError('NFSMount', opterr=exc.errstr) - - - @FileSR.locking("SRUnavailable") - def attach(self, sr_uuid): - self.validate_remotepath(False) - #self.remotepath = os.path.join(self.dconf['serverpath'], sr_uuid) - self.remotepath = self.dconf['serverpath'] - - util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') - self.mount_remotepath(sr_uuid) - - - def mount_remotepath(self, sr_uuid): - if not self._checkmount(): - self.check_server() - self.mount(self.path, self.remotepath) - - return super(NFSSR, self).attach(sr_uuid) - - - @FileSR.locking("SRUnavailable") - def probe(self): - # Verify NFS target and port - util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') - - self.validate_remotepath(True) - self.check_server() - - temppath = os.path.join(SR.MOUNT_BASE, PROBE_MOUNTPOINT) - - self.mount(temppath, self.dconf['serverpath']) - try: - return nfs.scan_srlist(temppath) - finally: - try: - nfs.unmount(temppath, True) - except: - pass - - - @FileSR.locking("SRUnavailable") - def detach(self, sr_uuid): - """Detach the SR: Unmounts and removes the mountpoint""" - if not self._checkmount(): - return - util.SMlog("Aborting GC/coalesce") - cleanup.abort(self.uuid) - - # Change directory to avoid unmount conflicts - os.chdir(SR.MOUNT_BASE) - - try: - nfs.unmount(self.path, True) - except nfs.NfsException, exc: - raise xs_errors.XenError('NFSUnMount', opterr=exc.errstr) - - return super(NFSSR, self).detach(sr_uuid) - - - @FileSR.locking("SRUnavailable") - def create(self, sr_uuid, size): - util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') - self.validate_remotepath(True) - if self._checkmount(): - raise xs_errors.XenError('NFSAttached') - - # Set the target path temporarily to the base dir - # so that we can create the target SR directory - self.remotepath = self.dconf['serverpath'] - try: - self.mount_remotepath(sr_uuid) - except Exception, exn: - try: - os.rmdir(self.path) - except: - pass - raise exn - - #newpath = os.path.join(self.path, sr_uuid) - #if util.ioretry(lambda: util.pathexists(newpath)): - # if len(util.ioretry(lambda: util.listdir(newpath))) != 0: - # self.detach(sr_uuid) - # raise xs_errors.XenError('SRExists') - #else: - # try: - # util.ioretry(lambda: util.makedirs(newpath)) - # except util.CommandException, inst: - # if inst.code != errno.EEXIST: - # self.detach(sr_uuid) - # raise xs_errors.XenError('NFSCreate', - # opterr='remote directory creation error is %d' - # % inst.code) - self.detach(sr_uuid) - - @FileSR.locking("SRUnavailable") - def delete(self, sr_uuid): - # try to remove/delete non VDI contents first - super(NFSSR, self).delete(sr_uuid) - try: - if self._checkmount(): - self.detach(sr_uuid) - - # Set the target path temporarily to the base dir - # so that we can remove the target SR directory - self.remotepath = self.dconf['serverpath'] - self.mount_remotepath(sr_uuid) - newpath = os.path.join(self.path, sr_uuid) - - if util.ioretry(lambda: util.pathexists(newpath)): - util.ioretry(lambda: os.rmdir(newpath)) - self.detach(sr_uuid) - except util.CommandException, inst: - self.detach(sr_uuid) - if inst.code != errno.ENOENT: - raise xs_errors.XenError('NFSDelete') - - def vdi(self, uuid, loadLocked = False): - if not loadLocked: - return NFSFileVDINolock(self, uuid) - return NFSFileVDI(self, uuid) - - def _checkmount(self): - return util.ioretry(lambda: util.pathexists(self.path)) \ - and util.ioretry(lambda: util.ismount(self.path)) - - def scan_exports(self, target): - util.SMlog("scanning2 (target=%s)" % target) - dom = nfs.scan_exports(target) - print >>sys.stderr,dom.toprettyxml() - -class NFSFileVDI(FileSR.FileVDI): - def attach(self, sr_uuid, vdi_uuid): - try: - vdi_ref = self.sr.srcmd.params['vdi_ref'] - self.session.xenapi.VDI.remove_from_xenstore_data(vdi_ref, \ - "vdi-type") - self.session.xenapi.VDI.remove_from_xenstore_data(vdi_ref, \ - "storage-type") - self.session.xenapi.VDI.add_to_xenstore_data(vdi_ref, \ - "storage-type", "nfs") - except: - util.logException("NFSSR:attach") - pass - - return super(NFSFileVDI, self).attach(sr_uuid, vdi_uuid) - - def clone(self, sr_uuid, vdi_uuid): - timestamp_before = int(util.get_mtime(self.sr.path)) - ret = super(NFSFileVDI, self).clone(sr_uuid, vdi_uuid) - timestamp_after = int(util.get_mtime(self.sr.path)) - if timestamp_after == timestamp_before: - util.SMlog("SR dir timestamp didn't change, updating") - timestamp_after += 1 - os.utime(self.sr.path, (timestamp_after, timestamp_after)) - return ret - -class NFSFileVDINolock(NFSFileVDI): - def load(self, vdi_uuid): - self.lock = self.sr.lock - self._load(vdi_uuid) - - -if __name__ == '__main__': - SRCommand.run(NFSSR, DRIVER_INFO) -else: - SR.registerSR(NFSSR) diff --git a/scripts/vm/hypervisor/xenserver/xcpserver/cleanup.py b/scripts/vm/hypervisor/xenserver/xcpserver/cleanup.py deleted file mode 100755 index b17ec91823f..00000000000 --- a/scripts/vm/hypervisor/xenserver/xcpserver/cleanup.py +++ /dev/null @@ -1,2280 +0,0 @@ -#!/usr/bin/python -# Copyright (C) 2006-2007 XenSource Ltd. -# Copyright (C) 2008-2009 Citrix Ltd. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published -# by the Free Software Foundation; version 2.1 only. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# Script to coalesce and garbage collect VHD-based SR's in the background -# - -import os -import sys -import time -import signal -import subprocess -import getopt -import datetime -import exceptions -import traceback -import base64 -import zlib - -import XenAPI -import util -import lvutil -import vhdutil -import lvhdutil -import lvmcache -import journaler -import fjournaler -import lock -import atomicop -from refcounter import RefCounter -from ipc import IPCFlag -from lvmanager import LVActivator - -# Disable automatic leaf-coalescing. Online leaf-coalesce is currently not -# possible due to lvhd_stop_using_() not working correctly. However, we leave -# this option available through the explicit LEAFCLSC_FORCE flag in the VDI -# record for use by the offline tool (which makes the operation safe by pausing -# the VM first) -AUTO_ONLINE_LEAF_COALESCE_ENABLED = False - -LOG_FILE = "/var/log/SMlog" -FLAG_TYPE_ABORT = "abort" # flag to request aborting of GC/coalesce - -# process "lock", used simply as an indicator that a process already exists -# that is doing GC/coalesce on this SR (such a process holds the lock, and we -# check for the fact by trying the lock). -LOCK_TYPE_RUNNING = "running" -lockRunning = None - - -class AbortException(util.SMException): - pass - -################################################################################ -# -# Util -# -class Util: - RET_RC = 1 - RET_STDOUT = 2 - RET_STDERR = 4 - - PREFIX = {"G": 1024 * 1024 * 1024, "M": 1024 * 1024, "K": 1024} - - def log(text): - f = open(LOG_FILE, 'a') - f.write("<%d> %s\t%s\n" % (os.getpid(), datetime.datetime.now(), text)) - f.close() - log = staticmethod(log) - - def logException(tag): - info = sys.exc_info() - if info[0] == exceptions.SystemExit: - # this should not be happening when catching "Exception", but it is - sys.exit(0) - tb = reduce(lambda a, b: "%s%s" % (a, b), traceback.format_tb(info[2])) - Util.log("*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*") - Util.log(" ***********************") - Util.log(" * E X C E P T I O N *") - Util.log(" ***********************") - Util.log("%s: EXCEPTION %s, %s" % (tag, info[0], info[1])) - Util.log(tb) - Util.log("*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*") - logException = staticmethod(logException) - - def doexec(args, expectedRC, inputtext=None, ret=None, log=True): - "Execute a subprocess, then return its return code, stdout, stderr" - proc = subprocess.Popen(args, - stdin=subprocess.PIPE,\ - stdout=subprocess.PIPE,\ - stderr=subprocess.PIPE,\ - shell=True,\ - close_fds=True) - (stdout, stderr) = proc.communicate(inputtext) - stdout = str(stdout) - stderr = str(stderr) - rc = proc.returncode - if log: - Util.log("`%s`: %s" % (args, rc)) - if type(expectedRC) != type([]): - expectedRC = [expectedRC] - if not rc in expectedRC: - reason = stderr.strip() - if stdout.strip(): - reason = "%s (stdout: %s)" % (reason, stdout.strip()) - Util.log("Failed: %s" % reason) - raise util.CommandException(rc, args, reason) - - if ret == Util.RET_RC: - return rc - if ret == Util.RET_STDERR: - return stderr - return stdout - doexec = staticmethod(doexec) - - def runAbortable(func, ret, ns, abortTest, pollInterval, timeOut): - """execute func in a separate thread and kill it if abortTest signals - so""" - resultFlag = IPCFlag(ns) - pid = os.fork() - if pid: - startTime = time.time() - while True: - if resultFlag.test("success"): - Util.log(" Child process completed successfully") - resultFlag.clear("success") - return - if resultFlag.test("failure"): - resultFlag.clear("failure") - raise util.SMException("Child process exited with error") - if abortTest(): - os.killpg(pid, signal.SIGKILL) - raise AbortException("Aborting due to signal") - if timeOut and time.time() - startTime > timeOut: - os.killpg(pid, signal.SIGKILL) - raise util.SMException("Timed out") - time.sleep(pollInterval) - else: - os.setpgrp() - try: - if func() == ret: - resultFlag.set("success") - else: - resultFlag.set("failure") - except: - resultFlag.set("failure") - os._exit(0) - runAbortable = staticmethod(runAbortable) - - def num2str(number): - for prefix in ("G", "M", "K"): - if number >= Util.PREFIX[prefix]: - return "%.2f%s" % (float(number) / Util.PREFIX[prefix], prefix) - return "%s" % number - num2str = staticmethod(num2str) - - def numBits(val): - count = 0 - while val: - count += val & 1 - val = val >> 1 - return count - numBits = staticmethod(numBits) - - def countBits(bitmap1, bitmap2): - """return bit count in the bitmap produced by ORing the two bitmaps""" - len1 = len(bitmap1) - len2 = len(bitmap2) - lenLong = len1 - lenShort = len2 - bitmapLong = bitmap1 - if len2 > len1: - lenLong = len2 - lenShort = len1 - bitmapLong = bitmap2 - - count = 0 - for i in range(lenShort): - val = ord(bitmap1[i]) | ord(bitmap2[i]) - count += Util.numBits(val) - - for i in range(i + 1, lenLong): - val = ord(bitmapLong[i]) - count += Util.numBits(val) - return count - countBits = staticmethod(countBits) - - def getThisScript(): - thisScript = util.get_real_path(__file__) - if thisScript.endswith(".pyc"): - thisScript = thisScript[:-1] - return thisScript - getThisScript = staticmethod(getThisScript) - - def getThisHost(): - uuid = None - f = open("/etc/xensource-inventory", 'r') - for line in f.readlines(): - if line.startswith("INSTALLATION_UUID"): - uuid = line.split("'")[1] - f.close() - return uuid - getThisHost = staticmethod(getThisHost) - - -################################################################################ -# -# XAPI -# -class XAPI: - USER = "root" - PLUGIN_ON_SLAVE = "on-slave" - PLUGIN_PAUSE_VDIS = "atomicop.py" - - CONFIG_SM = 0 - CONFIG_OTHER = 1 - - class LookupError(util.SMException): - pass - - def getSession(): - session = XenAPI.xapi_local() - session.xenapi.login_with_password(XAPI.USER, '') - return session - getSession = staticmethod(getSession) - - def __init__(self, session, srUuid): - self.sessionPrivate = False - self.session = session - if self.session == None: - self.session = self.getSession() - self.sessionPrivate = True - self._srRef = self.session.xenapi.SR.get_by_uuid(srUuid) - self.srRecord = self.session.xenapi.SR.get_record(self._srRef) - self.hostUuid = Util.getThisHost() - self._hostRef = self.session.xenapi.host.get_by_uuid(self.hostUuid) - - def __del__(self): - if self.sessionPrivate: - self.session.xenapi.session.logout() - - def isInvalidHandleError(exception): - return exception.details[0] == "HANDLE_INVALID" - isInvalidHandleError = staticmethod(isInvalidHandleError) - - def isPluggedHere(self): - pbds = self.getAttachedPBDs() - for pbdRec in pbds: - if pbdRec["host"] == self._hostRef: - return True - return False - - def isMaster(self): - if self.srRecord["shared"]: - pool = self.session.xenapi.pool.get_all_records().values()[0] - return pool["master"] == self._hostRef - else: - pbds = self.getAttachedPBDs() - if len(pbds) < 1: - raise util.SMException("Local SR not attached") - elif len(pbds) > 1: - raise util.SMException("Local SR multiply attached") - return pbds[0]["host"] == self._hostRef - - def getAttachedPBDs(self): - """Return PBD records for all PBDs of this SR that are currently - attached""" - attachedPBDs = [] - pbds = self.session.xenapi.PBD.get_all_records() - for pbdRec in pbds.values(): - if pbdRec["SR"] == self._srRef and pbdRec["currently_attached"]: - attachedPBDs.append(pbdRec) - return attachedPBDs - - def getOnlineHosts(self): - onlineHosts = [] - hosts = self.session.xenapi.host.get_all_records() - for hostRef, hostRecord in hosts.iteritems(): - metricsRef = hostRecord["metrics"] - metrics = self.session.xenapi.host_metrics.get_record(metricsRef) - if metrics["live"]: - onlineHosts.append(hostRef) - return onlineHosts - - def ensureInactive(self, hostRef, args): - text = self.session.xenapi.host.call_plugin( \ - hostRef, self.PLUGIN_ON_SLAVE, "multi", args) - Util.log("call-plugin returned: '%s'" % text) - - def getRefVDI(self, vdi): - return self.session.xenapi.VDI.get_by_uuid(vdi.uuid) - - def singleSnapshotVDI(self, vdi): - return self.session.xenapi.VDI.snapshot(vdi.getRef(), {"type":"single"}) - - def forgetVDI(self, vdiUuid): - """Forget the VDI, but handle the case where the VDI has already been - forgotten (i.e. ignore errors)""" - try: - vdiRef = self.session.xenapi.VDI.get_by_uuid(vdiUuid) - self.session.xenapi.VDI.forget(vdiRef) - except XenAPI.Failure: - pass - - def getConfigVDI(self, kind, vdi): - if kind == self.CONFIG_SM: - return self.session.xenapi.VDI.get_sm_config(vdi.getRef()) - elif kind == self.CONFIG_OTHER: - return self.session.xenapi.VDI.get_other_config(vdi.getRef()) - assert(False) - - def setConfigVDI(self, kind, vdi, map): - if kind == self.CONFIG_SM: - self.session.xenapi.VDI.set_sm_config(vdi.getRef(), map) - elif kind == self.CONFIG_OTHER: - self.session.xenapi.VDI.set_other_config(vdi.getRef(), map) - else: - assert(False) - - def srUpdate(self): - Util.log("Starting asynch srUpdate for SR %s" % self.srRecord["uuid"]) - abortFlag = IPCFlag(self.srRecord["uuid"]) - task = self.session.xenapi.Async.SR.update(self._srRef) - for i in range(60): - status = self.session.xenapi.task.get_status(task) - if not status == "pending": - Util.log("SR.update_asynch status changed to [%s]" % status) - return - if abortFlag.test(FLAG_TYPE_ABORT): - Util.log("Abort signalled during srUpdate, cancelling task...") - try: - self.session.xenapi.task.cancel(task) - Util.log("Task cancelled") - except: - pass - return - time.sleep(1) - Util.log("Asynch srUpdate still running, but timeout exceeded.") - - def atomicOp(self, vdiList, op, args, mustExist = False): - vdiRefs = [] - for vdi in vdiList: - Util.log("atomicOp: will pause %s" % vdi.toString()) - try: - vdiRefs.append(vdi.getRef()) - except XenAPI.Failure: - Util.log("atomicOp: can't find %s" % vdi.toString()) - if mustExist: - raise - if len(vdiRefs) == 0: - Util.log("atomicOp: no VDIs found in DB, not pausing anything") - fn = getattr(atomicop, op) - ret = fn(self.session, args) - else: - ret = self.session.xenapi.SR.lvhd_stop_using_these_vdis_and_call_script(\ - vdiRefs, self.PLUGIN_PAUSE_VDIS, op, args) - Util.log("Plugin returned: %s" % ret) - if ret == atomicop.RET_EXCEPTION: - raise util.SMException("Exception in atomic %s" % op) - if ret == atomicop.RET_SUCCESS: - return True - return False - - -################################################################################ -# -# VDI -# -class VDI: - """Object representing a VDI of a VHD-based SR""" - - POLL_INTERVAL = 1 - POLL_TIMEOUT = 30 - DEVICE_MAJOR = 202 - DRIVER_NAME_VHD = "vhd" - - # config keys & values - DB_VHD_PARENT = "vhd-parent" - DB_VDI_TYPE = "vdi_type" - DB_VHD_BLOCKS = "vhd-blocks" - DB_LEAFCLSC = "leaf-coalesce" # config key - LEAFCLSC_DISABLED = "no" # set by user; means do not leaf-coalesce - LEAFCLSC_FORCE = "force" # set by user; means skip snap-coalesce - LEAFCLSC_OFFLINE = "offline" # set here for informational purposes: means - # no space to snap-coalesce or unable to keep - # up with VDI - CONFIG_TYPE = { - DB_VHD_PARENT: XAPI.CONFIG_SM, - DB_VDI_TYPE: XAPI.CONFIG_SM, - DB_VHD_BLOCKS: XAPI.CONFIG_SM, - DB_LEAFCLSC: XAPI.CONFIG_OTHER } - - LIVE_LEAF_COALESCE_MAX_SIZE = 100 * 1024 * 1024 # bytes - LIVE_LEAF_COALESCE_TIMEOUT = 10 # seconds - - JRN_RELINK = "relink" # journal entry type for relinking children - JRN_COALESCE = "coalesce" # to communicate which VDI is being coalesced - JRN_LEAF = "leaf" # used in coalesce-leaf - - PRINT_INDENTATION = 4 - - def __init__(self, sr, uuid): - self.sr = sr - self.scanError = True - self.uuid = uuid - self.parentUuid = "" - self.sizeVirt = -1 - self._sizeVHD = -1 - self.hidden = False - self.parent = None - self.children = [] - self._vdiRef = None - self._config = {} - self._configDirty = {} - self._clearRef() - - def load(self): - """Load VDI info""" - pass # abstract - - def getDriverName(self): - return self.DRIVER_NAME_VHD - - def getRef(self): - if self._vdiRef == None: - self._vdiRef = self.sr.xapi.getRefVDI(self) - return self._vdiRef - - def getConfig(self, key, default = None): - kind = self.CONFIG_TYPE[key] - self._configLazyInit(kind) - if self._config[kind].get(key): - return self._config[kind][key] - return default - - def setConfig(self, key, val): - kind = self.CONFIG_TYPE[key] - self._configLazyInit(kind) - self._config[kind][key] = val - self._configDirty[kind] = True - - def delConfig(self, key): - kind = self.CONFIG_TYPE[key] - self._configLazyInit(kind) - if self._config[kind].get(key): - del self._config[kind][key] - self._configDirty[kind] = True - - def updateConfig(self): - for kind in self._config.keys(): - if self._configDirty[kind]: - self.sr.xapi.setConfigVDI(kind, self, self._config[kind]) - self._configDirty[kind] = False - - def setConfigUpdate(self, key, val): - self.setConfig(key, val) - self.updateConfig() - - def delConfigUpdate(self, key): - self.delConfig(key) - self.updateConfig() - - def getVHDBlocks(self): - val = self.getConfig(VDI.DB_VHD_BLOCKS) - if not val: - self.updateBlockInfo() - val = self.getConfig(VDI.DB_VHD_BLOCKS) - bitmap = zlib.decompress(base64.b64decode(val)) - return bitmap - - def isCoalesceable(self): - """A VDI is coalesceable if it has no siblings and is not a leaf""" - return not self.scanError and \ - self.parent and \ - len(self.parent.children) == 1 and \ - self.hidden and \ - len(self.children) > 0 - - def isLeafCoalesceable(self): - """A VDI is leaf-coalesceable if it has no siblings and is a leaf""" - return not self.scanError and \ - self.parent and \ - len(self.parent.children) == 1 and \ - not self.hidden and \ - len(self.children) == 0 - - def canLiveCoalesce(self): - """Can we stop-and-leaf-coalesce this VDI? The VDI must be - isLeafCoalesceable() already""" - return self.getSizeVHD() <= self.LIVE_LEAF_COALESCE_MAX_SIZE or \ - self.getConfig(self.DB_LEAFCLSC) == self.LEAFCLSC_FORCE - - def getAllPrunable(self): - if len(self.children) == 0: # base case - # it is possible to have a hidden leaf that was recently coalesced - # onto its parent, its children already relinked but not yet - # reloaded - in which case it may not be garbage collected yet: - # some tapdisks could still be using the file. - if self.sr.journaler.get(self.JRN_RELINK, self.uuid): - return [] - if not self.scanError and self.hidden: - return [self] - return [] - - thisPrunable = True - vdiList = [] - for child in self.children: - childList = child.getAllPrunable() - vdiList.extend(childList) - if child not in childList: - thisPrunable = False - - if not self.scanError and thisPrunable: - vdiList.append(self) - return vdiList - - def getSizeVHD(self): - return self._sizeVHD - - def getTreeRoot(self): - "Get the root of the tree that self belongs to" - root = self - while root.parent: - root = root.parent - return root - - def getTreeHeight(self): - "Get the height of the subtree rooted at self" - if len(self.children) == 0: - return 1 - - maxChildHeight = 0 - for child in self.children: - childHeight = child.getTreeHeight() - if childHeight > maxChildHeight: - maxChildHeight = childHeight - - return maxChildHeight + 1 - - def updateBlockInfo(self): - val = base64.b64encode(self._queryVHDBlocks()) - self.setConfigUpdate(VDI.DB_VHD_BLOCKS, val) - - def rename(self, uuid): - "Rename the VDI file" - assert(not self.sr.vdis.get(uuid)) - self._clearRef() - oldUuid = self.uuid - self.uuid = uuid - self.children = [] - # updating the children themselves is the responsiblity of the caller - del self.sr.vdis[oldUuid] - self.sr.vdis[self.uuid] = self - - def delete(self): - "Physically delete the VDI" - lock.Lock.cleanup(self.uuid, lvhdutil.NS_PREFIX_LVM + self.sr.uuid) - self._clear() - - def printTree(self, indentSize = 0): - indent = " " * indentSize - Util.log("%s%s" % (indent, self.toString())) - for child in self.children: - child.printTree(indentSize + VDI.PRINT_INDENTATION) - - def toString(self): - strHidden = "" - if self.hidden: - strHidden = "*" - strSizeVHD = "" - if self._sizeVHD > 0: - strSizeVHD = Util.num2str(self._sizeVHD) - - return "%s%s(%s/%s)" % (strHidden, self.uuid[0:8], - Util.num2str(self.sizeVirt), strSizeVHD) - - def validate(self): - if not vhdutil.check(self.path): - raise util.SMException("VHD %s corrupted" % self.toString()) - - def _clear(self): - self.uuid = "" - self.path = "" - self.parentUuid = "" - self.parent = None - self._clearRef() - - def _clearRef(self): - self._vdiRef = None - for kind in [XAPI.CONFIG_SM, XAPI.CONFIG_OTHER]: - self._config[kind] = None - self._configDirty[kind] = False - - def _configLazyInit(self, kind): - if self._config[kind] == None: - self._config[kind] = self.sr.xapi.getConfigVDI(kind, self) - - def _coalesceBegin(self): - """Coalesce self onto parent. Only perform the actual coalescing of - VHD, but not the subsequent relinking. We'll do that as the next step, - after reloading the entire SR in case things have changed while we - were coalescing""" - self.validate() - self.parent.validate() - if self.sr.journaler.get(self.JRN_RELINK, self.uuid): - # this means we had done the actual coalescing already and just - # need to finish relinking and/or refreshing the children - Util.log("==> Coalesce apparently already done: skipping") - else: - self.parent._increaseSizeVirt(self.sizeVirt) - self._coalesceVHD(0) - self.parent.validate() - #self._verifyContents(0) - self.parent.updateBlockInfo() - - def _verifyContents(self, timeOut): - Util.log(" Coalesce verification on %s" % self.toString()) - abortTest = lambda:IPCFlag(self.sr.uuid).test(FLAG_TYPE_ABORT) - Util.runAbortable(lambda: self._runTapdiskDiff(), True, - self.sr.uuid, abortTest, VDI.POLL_INTERVAL, timeOut) - Util.log(" Coalesce verification succeeded") - - def _runTapdiskDiff(self): - cmd = "tapdisk-diff -n %s:%s -m %s:%s" % \ - (self.getDriverName(), self.path, \ - self.parent.getDriverName(), self.parent.path) - Util.doexec(cmd, 0) - return True - - def _coalesceVHD(self, timeOut): - Util.log(" Running VHD coalesce on %s" % self.toString()) - abortTest = lambda:IPCFlag(self.sr.uuid).test(FLAG_TYPE_ABORT) - Util.runAbortable(lambda: vhdutil.coalesce(self.path), None, - self.sr.uuid, abortTest, VDI.POLL_INTERVAL, timeOut) - util.fistpoint.activate("LVHDRT_coalescing_VHD_data",self.sr.uuid) - - def _relinkSkip(self): - """Relink children of this VDI to point to the parent of this VDI""" - abortFlag = IPCFlag(self.sr.uuid) - for child in self.children: - if abortFlag.test(FLAG_TYPE_ABORT): - raise AbortException("Aborting due to signal") - Util.log(" Relinking %s from %s to %s" % (child.toString(), \ - self.toString(), self.parent.toString())) - util.fistpoint.activate("LVHDRT_relinking_grandchildren",self.sr.uuid) - child._setParent(self.parent) - self.children = [] - - def _reloadChildren(self, vdiSkip): - """Pause & unpause all VDIs in the subtree to cause blktap to reload - the VHD metadata for this file in any online VDI""" - abortFlag = IPCFlag(self.sr.uuid) - for child in self.children: - if child == vdiSkip: - continue - if abortFlag.test(FLAG_TYPE_ABORT): - raise AbortException("Aborting due to signal") - Util.log(" Reloading VDI %s" % child.toString()) - child._reload() - - def _reload(self): - """Pause & unpause to cause blktap to reload the VHD metadata""" - for child in self.children: - child._reload() - - # only leaves can be attached - if len(self.children) == 0: - try: - self.sr.xapi.atomicOp([self], "noop", {}) - except XenAPI.Failure, e: - if self.sr.xapi.isInvalidHandleError(e): - Util.log("VDI %s appears to have been deleted, ignoring" % \ - self.toString()) - else: - raise - - def _loadInfoParent(self): - ret = vhdutil.getParent(self.path, lvhdutil.extractUuid) - if ret: - self.parentUuid = ret - - def _setParent(self, parent): - vhdutil.setParent(self.path, parent.path, False) - self.parent = parent - self.parentUuid = parent.uuid - parent.children.append(self) - try: - self.setConfigUpdate(self.DB_VHD_PARENT, self.parentUuid) - Util.log("Updated the vhd-parent field for child %s with %s" % \ - (self.uuid, self.parentUuid)) - except: - Util.log("Failed to update %s with vhd-parent field %s" % \ - (self.uuid, self.parentUuid)) - - def _loadInfoHidden(self): - hidden = vhdutil.getHidden(self.path) - self.hidden = (hidden != 0) - - def _setHidden(self, hidden = True): - vhdutil.setHidden(self.path, hidden) - self.hidden = hidden - - def _increaseSizeVirt(self, size, atomic = True): - """ensure the virtual size of 'self' is at least 'size'. Note that - resizing a VHD must always be offline and atomically: the file must - not be open by anyone and no concurrent operations may take place. - Thus we use the Agent API call for performing paused atomic - operations. If the caller is already in the atomic context, it must - call with atomic = False""" - if self.sizeVirt >= size: - return - Util.log(" Expanding VHD virt size for VDI %s: %s -> %s" % \ - (self.toString(), Util.num2str(self.sizeVirt), \ - Util.num2str(size))) - - msize = vhdutil.getMaxResizeSize(self.path) * 1024 * 1024 - if (size <= msize): - vhdutil.setSizeVirtFast(self.path, size) - else: - if atomic: - args = self._resizeArgs(size) - vdiList = self._getAllSubtree() - if not self.sr.xapi.atomicOp(vdiList, "resize", args): - raise util.SMException("Failed to resize atomically") - else: - self._setSizeVirt(size) - - self.sizeVirt = vhdutil.getSizeVirt(self.path) - - def _setSizeVirt(self, size): - """WARNING: do not call this method directly unless all VDIs in the - subtree are guaranteed to be unplugged (and remain so for the duration - of the operation): this operation is only safe for offline VHDs""" - jFile = os.path.join(vhdutil.VHD_JOURNAL_LOCATION, self.uuid) - vhdutil.setSizeVirt(self.path, size, jFile) - - def _queryVHDBlocks(self): - return vhdutil.getBlockBitmap(self.path) - - def _getCoalescedSizeData(self): - """Get the data size of the resulting VHD if we coalesce self onto - parent. We calculate the actual size by using the VHD block allocation - information (as opposed to just adding up the two VHD sizes to get an - upper bound)""" - # make sure we don't use stale BAT info from vdi_rec since the child - # was writable all this time - self.delConfigUpdate(VDI.DB_VHD_BLOCKS) - blocksChild = self.getVHDBlocks() - blocksParent = self.parent.getVHDBlocks() - numBlocks = Util.countBits(blocksChild, blocksParent) - Util.log("Num combined blocks = %d" % numBlocks) - sizeData = numBlocks * vhdutil.VHD_BLOCK_SIZE - assert(sizeData <= self.sizeVirt) - return sizeData - - def _calcExtraSpaceForCoalescing(self): - sizeData = self._getCoalescedSizeData() - sizeCoalesced = sizeData + vhdutil.calcOverheadBitmap(sizeData) + \ - vhdutil.calcOverheadEmpty(self.sizeVirt) - Util.log("Coalesced size = %s" % Util.num2str(sizeCoalesced)) - return sizeCoalesced - self.parent.getSizeVHD() - - def _calcExtraSpaceForLeafCoalescing(self): - """How much extra space in the SR will be required to - [live-]leaf-coalesce this VDI""" - # the space requirements are the same as for inline coalesce - return self._calcExtraSpaceForCoalescing() - - def _calcExtraSpaceForSnapshotCoalescing(self): - """How much extra space in the SR will be required to - snapshot-coalesce this VDI""" - return self._calcExtraSpaceForCoalescing() + \ - vhdutil.calcOverheadEmpty(self.sizeVirt) # extra snap leaf - - def _getAllSubtree(self): - """Get self and all VDIs in the subtree of self as a flat list""" - vdiList = [self] - for child in self.children: - vdiList.extend(child._getAllSubtree()) - return vdiList - - def _resizeArgs(self, size): - args = { - "type": self.sr.TYPE, - "uuid": self.uuid, - "path": self.path, - "size": str(size), - "srUuid": self.sr.uuid - } - return args - - -class FileVDI(VDI): - """Object representing a VDI in a file-based SR (EXT or NFS)""" - - FILE_SUFFIX = ".vhd" - - def extractUuid(path): - path = os.path.basename(path.strip()) - if not path.endswith(FileVDI.FILE_SUFFIX): - return None - uuid = path.replace(FileVDI.FILE_SUFFIX, "") - # TODO: validate UUID format - return uuid - extractUuid = staticmethod(extractUuid) - - def load(self, info = None): - if not info: - if not util.pathexists(self.path): - raise util.SMException("%s not found" % self.path) - try: - info = vhdutil.getVHDInfo(self.path, self.extractUuid) - except util.SMException: - Util.log(" [VDI %s: failed to read VHD metadata]" % self.uuid) - return - self.parent = None - self.children = [] - self.parentUuid = info.parentUuid - self.sizeVirt = info.sizeVirt - self._sizeVHD = info.sizePhys - self.hidden = info.hidden - self.scanError = False - self.path = os.path.join(self.sr.path, "%s%s" % \ - (self.uuid, self.FILE_SUFFIX)) - - def rename(self, uuid): - oldPath = self.path - VDI.rename(self, uuid) - fileName = "%s%s" % (self.uuid, self.FILE_SUFFIX) - self.path = os.path.join(self.sr.path, fileName) - assert(not util.pathexists(self.path)) - Util.log("Renaming %s -> %s" % (oldPath, self.path)) - os.rename(oldPath, self.path) - - def delete(self): - if len(self.children) > 0: - raise util.SMException("VDI %s has children, can't delete" % \ - self.uuid) - try: - self.sr.lock() - try: - os.unlink(self.path) - finally: - self.sr.unlock() - except OSError: - raise util.SMException("os.unlink(%s) failed" % self.path) - self.sr.xapi.forgetVDI(self.uuid) - VDI.delete(self) - - -class LVHDVDI(VDI): - """Object representing a VDI in an LVHD SR""" - - JRN_ZERO = "zero" # journal entry type for zeroing out end of parent - DRIVER_NAME_RAW = "aio" - - def load(self, vdiInfo): - self.parent = None - self.children = [] - self._sizeVHD = -1 - self.scanError = vdiInfo.scanError - self.raw = vdiInfo.vdiType == lvhdutil.VDI_TYPE_RAW - self.sizeLV = vdiInfo.sizeLV - self.sizeVirt = vdiInfo.sizeVirt - self.lvName = vdiInfo.lvName - self.lvActive = vdiInfo.lvActive - self.lvReadonly = vdiInfo.lvReadonly - self.hidden = vdiInfo.hidden - self.parentUuid = vdiInfo.parentUuid - self.path = os.path.join(self.sr.path, self.lvName) - - def getDriverName(self): - if self.raw: - return self.DRIVER_NAME_RAW - return self.DRIVER_NAME_VHD - - def inflate(self, size): - """inflate the LV containing the VHD to 'size'""" - if self.raw: - return - self._activate() - self.sr.lock() - try: - lvhdutil.inflate(self.sr.journaler, self.sr.uuid, self.uuid, size) - util.fistpoint.activate("LVHDRT_inflating_the_parent",self.sr.uuid) - finally: - self.sr.unlock() - self.sizeLV = self.sr.lvmCache.getSize(self.lvName) - self._sizeVHD = -1 - - def deflate(self): - """deflate the LV containing the VHD to minimum""" - if self.raw: - return - self._activate() - self.sr.lock() - try: - lvhdutil.deflate(self.sr.lvmCache, self.lvName, self.getSizeVHD()) - finally: - self.sr.unlock() - self.sizeLV = self.sr.lvmCache.getSize(self.lvName) - self._sizeVHD = -1 - - def inflateFully(self): - self.inflate(lvhdutil.calcSizeVHDLV(self.sizeVirt)) - - def inflateParentForCoalesce(self): - """Inflate the parent only as much as needed for the purposes of - coalescing""" - if self.parent.raw: - return - inc = self._calcExtraSpaceForCoalescing() - if inc > 0: - util.fistpoint.activate("LVHDRT_coalescing_before_inflate_grandparent",self.sr.uuid) - self.parent.inflate(self.parent.sizeLV + inc) - - def updateBlockInfo(self): - if not self.raw: - VDI.updateBlockInfo(self) - - def rename(self, uuid): - oldUuid = self.uuid - oldLVName = self.lvName - VDI.rename(self, uuid) - self.lvName = lvhdutil.LV_PREFIX[lvhdutil.VDI_TYPE_VHD] + self.uuid - if self.raw: - self.lvName = lvhdutil.LV_PREFIX[lvhdutil.VDI_TYPE_RAW] + self.uuid - self.path = os.path.join(self.sr.path, self.lvName) - assert(not self.sr.lvmCache.checkLV(self.lvName)) - - self.sr.lvmCache.rename(oldLVName, self.lvName) - if self.sr.lvActivator.get(oldUuid, False): - self.sr.lvActivator.replace(oldUuid, self.uuid, self.lvName, False) - - ns = lvhdutil.NS_PREFIX_LVM + self.sr.uuid - (cnt, bcnt) = RefCounter.check(oldUuid, ns) - RefCounter.set(self.uuid, cnt, bcnt, ns) - RefCounter.reset(oldUuid, ns) - - def delete(self): - if len(self.children) > 0: - raise util.SMException("VDI %s has children, can't delete" % \ - self.uuid) - self.sr.lock() - try: - self.sr.lvmCache.remove(self.lvName) - finally: - self.sr.unlock() - RefCounter.reset(self.uuid, lvhdutil.NS_PREFIX_LVM + self.sr.uuid) - self.sr.xapi.forgetVDI(self.uuid) - VDI.delete(self) - - def getSizeVHD(self): - if self._sizeVHD == -1: - self._loadInfoSizeVHD() - return self._sizeVHD - - def _loadInfoSizeVHD(self): - """Get the physical utilization of the VHD file. We do it individually - (and not using the VHD batch scanner) as an optimization: this info is - relatively expensive and we need it only for VDI's involved in - coalescing.""" - if self.raw: - return - self._activate() - self._sizeVHD = vhdutil.getSizePhys(self.path) - if self._sizeVHD <= 0: - raise util.SMException("phys size of %s = %d" % \ - (self.toString(), self._sizeVHD)) - - def _loadInfoHidden(self): - if self.raw: - self.hidden = self.sr.lvmCache.getHidden(self.lvName) - else: - VDI._loadInfoHidden(self) - - def _setHidden(self, hidden = True): - if self.raw: - self.sr.lvmCache.setHidden(self.lvName, hidden) - self.hidden = hidden - else: - VDI._setHidden(self, hidden) - - def toString(self): - strType = "VHD" - if self.raw: - strType = "RAW" - strHidden = "" - if self.hidden: - strHidden = "*" - strSizeVHD = "" - if self._sizeVHD > 0: - strSizeVHD = Util.num2str(self._sizeVHD) - strActive = "n" - if self.lvActive: - strActive = "a" - return "%s%s[%s](%s/%s/%s|%s)" % (strHidden, self.uuid[0:8], strType, - Util.num2str(self.sizeVirt), strSizeVHD, - Util.num2str(self.sizeLV), strActive) - - def validate(self): - if not self.raw: - VDI.validate(self) - - def _coalesceBegin(self): - """LVHD parents must first be activated, inflated, and made writable""" - try: - self._activateChain() - self.sr.lvmCache.setReadonly(self.parent.lvName, False) - self.parent.validate() - self.inflateParentForCoalesce() - VDI._coalesceBegin(self) - finally: - self.parent._loadInfoSizeVHD() - self.parent.deflate() - self.sr.lvmCache.setReadonly(self.lvName, True) - - def _setParent(self, parent): - self._activate() - if self.lvReadonly: - self.sr.lvmCache.setReadonly(self.lvName, False) - - try: - vhdutil.setParent(self.path, parent.path, parent.raw) - finally: - if self.lvReadonly: - self.sr.lvmCache.setReadonly(self.lvName, True) - self._deactivate() - self.parent = parent - self.parentUuid = parent.uuid - parent.children.append(self) - try: - self.setConfigUpdate(self.DB_VHD_PARENT, self.parentUuid) - Util.log("Updated the vhd-parent field for child %s with %s" % \ - (self.uuid, self.parentUuid)) - except: - Util.log("Failed to update the vhd-parent with %s for child %s" % \ - (self.parentUuid, self.uuid)) - - def _activate(self): - self.sr.lvActivator.activate(self.uuid, self.lvName, False) - - def _activateChain(self): - vdi = self - while vdi: - vdi._activate() - vdi = vdi.parent - - def _deactivate(self): - self.sr.lvActivator.deactivate(self.uuid, False) - - def _increaseSizeVirt(self, size, atomic = True): - "ensure the virtual size of 'self' is at least 'size'" - self._activate() - if not self.raw: - VDI._increaseSizeVirt(self, size, atomic) - return - - # raw VDI case - offset = self.sizeLV - if self.sizeVirt < size: - oldSize = self.sizeLV - self.sizeLV = util.roundup(lvutil.LVM_SIZE_INCREMENT, size) - Util.log(" Growing %s: %d->%d" % (self.path, oldSize, self.sizeLV)) - self.sr.lvmCache.setSize(self.lvName, self.sizeLV) - offset = oldSize - unfinishedZero = False - jval = self.sr.journaler.get(self.JRN_ZERO, self.uuid) - if jval: - unfinishedZero = True - offset = int(jval) - length = self.sizeLV - offset - if not length: - return - - if unfinishedZero: - Util.log(" ==> Redoing unfinished zeroing out") - else: - self.sr.journaler.create(self.JRN_ZERO, self.uuid, \ - str(offset)) - Util.log(" Zeroing %s: from %d, %dB" % (self.path, offset, length)) - abortTest = lambda:IPCFlag(self.sr.uuid).test(FLAG_TYPE_ABORT) - func = lambda: util.zeroOut(self.path, offset, length) - Util.runAbortable(func, True, self.sr.uuid, abortTest, - VDI.POLL_INTERVAL, 0) - self.sr.journaler.remove(self.JRN_ZERO, self.uuid) - - def _setSizeVirt(self, size): - """WARNING: do not call this method directly unless all VDIs in the - subtree are guaranteed to be unplugged (and remain so for the duration - of the operation): this operation is only safe for offline VHDs""" - self._activate() - jFile = lvhdutil.createVHDJournalLV(self.sr.lvmCache, self.uuid, - vhdutil.MAX_VHD_JOURNAL_SIZE) - try: - lvhdutil.setSizeVirt(self.sr.journaler, self.sr.uuid, self.uuid, - size, jFile) - finally: - lvhdutil.deleteVHDJournalLV(self.sr.lvmCache, self.uuid) - - def _queryVHDBlocks(self): - self._activate() - return VDI._queryVHDBlocks(self) - - def _calcExtraSpaceForCoalescing(self): - if self.parent.raw: - return 0 # raw parents are never deflated in the first place - sizeCoalesced = lvhdutil.calcSizeVHDLV(self._getCoalescedSizeData()) - Util.log("Coalesced size = %s" % Util.num2str(sizeCoalesced)) - return sizeCoalesced - self.parent.sizeLV - - def _calcExtraSpaceForLeafCoalescing(self): - """How much extra space in the SR will be required to - [live-]leaf-coalesce this VDI""" - # we can deflate the leaf to minimize the space requirements - deflateDiff = self.sizeLV - lvhdutil.calcSizeLV(self.getSizeVHD()) - return self._calcExtraSpaceForCoalescing() - deflateDiff - - def _calcExtraSpaceForSnapshotCoalescing(self): - return self._calcExtraSpaceForCoalescing() + \ - lvhdutil.calcSizeLV(self.getSizeVHD()) - - def _resizeArgs(self, size): - args = VDI._resizeArgs(self, size) - args["vgName"] = self.sr.vgName - args["lvSize"] = str(self.sizeLV) - return args - - - -################################################################################ -# -# SR -# -class SR: - TYPE_FILE = "file" - TYPE_LVHD = "lvhd" - TYPES = [TYPE_LVHD, TYPE_FILE] - - LOCK_RETRY_INTERVAL = 3 - LOCK_RETRY_ATTEMPTS = 20 - LOCK_RETRY_ATTEMPTS_LOCK = 100 - - SCAN_RETRY_ATTEMPTS = 3 - - JRN_CLONE = "clone" # journal entry type for the clone operation (from SM) - TMP_RENAME_PREFIX = "OLD_" - - KEY_OFFLINE_COALESCE_NEEDED = "leaf_coalesce_need_offline" - KEY_OFFLINE_COALESCE_OVERRIDE = "leaf_coalesce_offline_override" - - def getInstance(uuid, xapiSession): - xapi = XAPI(xapiSession, uuid) - type = normalizeType(xapi.srRecord["type"]) - if type == SR.TYPE_FILE: - return FileSR(uuid, xapi) - elif type == SR.TYPE_LVHD: - return LVHDSR(uuid, xapi) - raise util.SMException("SR type %s not recognized" % type) - getInstance = staticmethod(getInstance) - - def __init__(self, uuid, xapi): - self.uuid = uuid - self.path = "" - self.name = "" - self.vdis = {} - self.vdiTrees = [] - self.journaler = None - self.xapi = xapi - self._locked = 0 - self._srLock = lock.Lock(vhdutil.LOCK_TYPE_SR, self.uuid) - self.name = unicode(self.xapi.srRecord["name_label"]).encode("utf-8", "replace") - self._failedCoalesceTargets = [] - - if not self.xapi.isPluggedHere(): - raise util.SMException("SR %s not attached on this host" % uuid) - - if not self.xapi.isMaster(): - raise util.SMException("This host is NOT master, will not run") - - def scan(self, force = False): - """Scan the SR and load VDI info for each VDI. If called repeatedly, - update VDI objects if they already exist""" - pass # abstract - - def scanLocked(self, force = False): - self.lock() - try: - self.scan(force) - finally: - self.unlock() - - def getVDI(self, uuid): - return self.vdis.get(uuid) - - def hasWork(self): - if len(self.findGarbage()) > 0: - return True - if self.findCoalesceable(): - return True - if self.findLeafCoalesceable(): - return True - if self.needUpdateBlockInfo(): - return True - return False - - def findCoalesceable(self): - """Find a coalesceable VDI. Return a vdi that should be coalesced - (choosing one among all coalesceable candidates according to some - criteria) or None if there is no VDI that could be coalesced""" - # finish any VDI for which a relink journal entry exists first - journals = self.journaler.getAll(VDI.JRN_RELINK) - for uuid in journals.iterkeys(): - vdi = self.getVDI(uuid) - if vdi and vdi not in self._failedCoalesceTargets: - return vdi - - candidates = [] - for vdi in self.vdis.values(): - if vdi.isCoalesceable() and vdi not in self._failedCoalesceTargets: - candidates.append(vdi) - - # pick one in the tallest tree - treeHeight = dict() - for c in candidates: - height = c.getTreeRoot().getTreeHeight() - if treeHeight.get(height): - treeHeight[height].append(c) - else: - treeHeight[height] = [c] - - freeSpace = self.getFreeSpace() - heights = treeHeight.keys() - heights.sort(reverse=True) - for h in heights: - for c in treeHeight[h]: - spaceNeeded = c._calcExtraSpaceForCoalescing() - if spaceNeeded <= freeSpace: - Util.log("Coalesce candidate: %s (tree height %d)" % \ - (c.toString(), h)) - return c - else: - Util.log("No space to coalesce %s (free space: %d)" % \ - (c.toString(), freeSpace)) - return None - - def findLeafCoalesceable(self): - """Find leaf-coalesceable VDIs in each VHD tree""" - candidates = [] - for vdi in self.vdis.values(): - if not vdi.isLeafCoalesceable(): - continue - if vdi in self._failedCoalesceTargets: - continue - if vdi.getConfig(vdi.DB_LEAFCLSC) == vdi.LEAFCLSC_DISABLED: - Util.log("Leaf-coalesce disabled for %s" % vdi.toString()) - continue - if not (AUTO_ONLINE_LEAF_COALESCE_ENABLED or \ - vdi.getConfig(vdi.DB_LEAFCLSC) == vdi.LEAFCLSC_FORCE): - continue - candidates.append(vdi) - - freeSpace = self.getFreeSpace() - for candidate in candidates: - # check the space constraints to see if leaf-coalesce is actually - # feasible for this candidate - spaceNeeded = candidate._calcExtraSpaceForSnapshotCoalescing() - spaceNeededLive = spaceNeeded - if spaceNeeded > freeSpace: - spaceNeededLive = candidate._calcExtraSpaceForLeafCoalescing() - if candidate.canLiveCoalesce(): - spaceNeeded = spaceNeededLive - if spaceNeeded <= freeSpace: - Util.log("Leaf-coalesce candidate: %s" % candidate.toString()) - return candidate - else: - Util.log("No space to leaf-coalesce %s (free space: %d)" % \ - (candidate.toString(), freeSpace)) - if spaceNeededLive <= freeSpace: - Util.log("...but enough space if skip snap-coalesce") - candidate.setConfigUpdate(VDI.DB_LEAFCLSC, - VDI.LEAFCLSC_OFFLINE) - - return None - - def coalesce(self, vdi, dryRun): - """Coalesce vdi onto parent""" - Util.log("Coalescing %s -> %s" % \ - (vdi.toString(), vdi.parent.toString())) - if dryRun: - return - - try: - self._coalesce(vdi) - except util.SMException, e: - if isinstance(e, AbortException): - self.cleanup() - raise - else: - self._failedCoalesceTargets.append(vdi) - Util.logException("coalesce") - Util.log("Coalesce failed, skipping") - self.cleanup() - - def coalesceLeaf(self, vdi, dryRun): - """Leaf-coalesce vdi onto parent""" - Util.log("Leaf-coalescing %s -> %s" % \ - (vdi.toString(), vdi.parent.toString())) - if dryRun: - return - - try: - try: - self._coalesceLeaf(vdi) - finally: - vdi.delConfigUpdate(vdi.DB_LEAFCLSC) - except (util.SMException, XenAPI.Failure), e: - if isinstance(e, AbortException): - self.cleanup() - raise - else: - self._failedCoalesceTargets.append(vdi) - Util.logException("leaf-coalesce") - Util.log("Leaf-coalesce failed, skipping") - self.cleanup() - - def garbageCollect(self, dryRun = False): - vdiList = self.findGarbage() - Util.log("Found %d VDIs for deletion:" % len(vdiList)) - for vdi in vdiList: - Util.log(" %s" % vdi.toString()) - if not dryRun: - self.deleteVDIs(vdiList) - self.cleanupJournals(dryRun) - - def findGarbage(self): - vdiList = [] - for vdi in self.vdiTrees: - vdiList.extend(vdi.getAllPrunable()) - return vdiList - - def deleteVDIs(self, vdiList): - for vdi in vdiList: - if IPCFlag(self.uuid).test(FLAG_TYPE_ABORT): - raise AbortException("Aborting due to signal") - Util.log("Deleting unlinked VDI %s" % vdi.toString()) - self.deleteVDI(vdi) - - def deleteVDI(self, vdi): - assert(len(vdi.children) == 0) - del self.vdis[vdi.uuid] - if vdi.parent: - vdi.parent.children.remove(vdi) - if vdi in self.vdiTrees: - self.vdiTrees.remove(vdi) - vdi.delete() - - def getFreeSpace(self): - return 0 - - def cleanup(self): - Util.log("In cleanup") - return - - def toString(self): - if self.name: - ret = "%s ('%s')" % (self.uuid[0:4], self.name) - else: - ret = "%s" % self.uuid - return ret - - def printVDIs(self): - Util.log("-- SR %s has %d VDIs (%d VHD trees) --" % \ - (self.toString(), len(self.vdis), len(self.vdiTrees))) - for vdi in self.vdiTrees: - vdi.printTree() - - def lock(self): - """Acquire the SR lock. Nested acquire()'s are ok. Check for Abort - signal to avoid deadlocking (trying to acquire the SR lock while the - lock is held by a process that is trying to abort us)""" - self._locked += 1 - if self._locked > 1: - return - - abortFlag = IPCFlag(self.uuid) - for i in range(SR.LOCK_RETRY_ATTEMPTS_LOCK): - if self._srLock.acquireNoblock(): - return - if abortFlag.test(FLAG_TYPE_ABORT): - raise AbortException("Abort requested") - time.sleep(SR.LOCK_RETRY_INTERVAL) - raise util.SMException("Unable to acquire the SR lock") - - def unlock(self): - assert(self._locked > 0) - self._locked -= 1 - if self._locked == 0: - self._srLock.release() - - def needUpdateBlockInfo(self): - for vdi in self.vdis.values(): - if vdi.scanError or len(vdi.children) == 0: - continue - if not vdi.getConfig(vdi.DB_VHD_BLOCKS): - return True - return False - - def updateBlockInfo(self): - for vdi in self.vdis.values(): - if vdi.scanError or len(vdi.children) == 0: - continue - if not vdi.getConfig(vdi.DB_VHD_BLOCKS): - vdi.updateBlockInfo() - - def cleanupCoalesceJournals(self): - """Remove stale coalesce VDI indicators""" - entries = self.journaler.getAll(VDI.JRN_COALESCE) - for uuid, jval in entries.iteritems(): - self.journaler.remove(VDI.JRN_COALESCE, uuid) - - def cleanupJournals(self, dryRun): - """delete journal entries for non-existing VDIs""" - for t in [LVHDVDI.JRN_ZERO, VDI.JRN_RELINK, SR.JRN_CLONE]: - entries = self.journaler.getAll(t) - for uuid, jval in entries.iteritems(): - if self.getVDI(uuid): - continue - if t == SR.JRN_CLONE: - baseUuid, clonUuid = jval.split("_") - if self.getVDI(baseUuid): - continue - Util.log(" Deleting stale '%s' journal entry for %s " - "(%s)" % (t, uuid, jval)) - if not dryRun: - self.journaler.remove(t, uuid) - - def _coalesce(self, vdi): - # JRN_COALESCE is used to check which VDI is being coalesced in order - # to decide whether to abort the coalesce. We remove the journal as - # soon as the VHD coalesce step is done, because we don't expect the - # rest of the process to take long - self.journaler.create(vdi.JRN_COALESCE, vdi.uuid, "1") - vdi._coalesceBegin() - self.journaler.remove(vdi.JRN_COALESCE, vdi.uuid) - - util.fistpoint.activate("LVHDRT_before_create_relink_journal",self.uuid) - - # we now need to relink the children: lock the SR to prevent ops like - # SM.clone from manipulating the VDIs we'll be relinking and rescan the - # SR first in case the children changed since the last scan - if not self.journaler.get(vdi.JRN_RELINK, vdi.uuid): - self.journaler.create(vdi.JRN_RELINK, vdi.uuid, "1") - - self.lock() - try: - self.scan() - vdi._relinkSkip() - finally: - self.unlock() - - vdi.parent._reloadChildren(vdi) - self.journaler.remove(vdi.JRN_RELINK, vdi.uuid) - - def _coalesceLeaf(self, vdi): - """Leaf-coalesce VDI vdi. Return true if we succeed, false if we cannot - complete due to external changes, namely vdi_delete and vdi_snapshot - that alter leaf-coalescibility of vdi""" - while not vdi.canLiveCoalesce(): - prevSizeVHD = vdi.getSizeVHD() - if not self._snapshotCoalesce(vdi): - return False - if vdi.getSizeVHD() >= prevSizeVHD: - Util.log("Snapshot-coalesce did not help, abandoning attempts") - vdi.setConfigUpdate(vdi.DB_LEAFCLSC, vdi.LEAFCLSC_OFFLINE) - break - return self._liveLeafCoalesce(vdi) - - def _snapshotCoalesce(self, vdi): - # Note that because we are not holding any locks here, concurrent SM - # operations may change this tree under our feet. In particular, vdi - # can be deleted, or it can be snapshotted. - assert(AUTO_ONLINE_LEAF_COALESCE_ENABLED) - Util.log("Single-snapshotting %s" % vdi.toString()) - util.fistpoint.activate("LVHDRT_coaleaf_delay_1", self.uuid) - try: - ret = self.xapi.singleSnapshotVDI(vdi) - Util.log("Single-snapshot returned: %s" % ret) - except XenAPI.Failure, e: - if self.xapi.isInvalidHandleError(e): - Util.log("The VDI appears to have been concurrently deleted") - return False - raise - self.scanLocked() - tempSnap = vdi.parent - if not tempSnap.isCoalesceable(): - Util.log("The VDI appears to have been concurrently snapshotted") - return False - Util.log("Coalescing parent %s" % tempSnap.toString()) - util.fistpoint.activate("LVHDRT_coaleaf_delay_2", self.uuid) - self._coalesce(tempSnap) - self.deleteVDI(tempSnap) - if not vdi.isLeafCoalesceable(): - Util.log("The VDI tree appears to have been altered since") - return False - return True - - def _liveLeafCoalesce(self, vdi): - args = {"srUuid": self.uuid, "vdiUuid": vdi.uuid} - util.fistpoint.activate("LVHDRT_coaleaf_delay_3", self.uuid) - try: - if not self.xapi.atomicOp([vdi], "coalesce_leaf", args, True): - Util.log("%s is no longer leaf-coalesceable" % vdi.toString()) - return False - except XenAPI.Failure, e: - if self.xapi.isInvalidHandleError(e): - Util.log("The VDI appears to have been deleted meanwhile") - return False - self.scanLocked() - return True - - def _doCoalesceLeaf(self, vdi): - pass # abstract - - def _removeStaleVDIs(self, uuidsPresent): - for uuid in self.vdis.keys(): - if not uuid in uuidsPresent: - Util.log("VDI %s disappeared since last scan" % \ - self.vdis[uuid].toString()) - del self.vdis[uuid] - - def _buildTree(self, force): - self.vdiTrees = [] - for vdi in self.vdis.values(): - if vdi.parentUuid: - parent = self.getVDI(vdi.parentUuid) - if not parent: - if vdi.uuid.startswith(self.TMP_RENAME_PREFIX): - self.vdiTrees.append(vdi) - continue - if force: - Util.log("ERROR: Parent VDI %s not found! (for %s)" % \ - (vdi.parentUuid, vdi.uuid)) - self.vdiTrees.append(vdi) - continue - else: - raise util.SMException("Parent VDI %s of %s not " \ - "found" % (vdi.parentUuid, vdi.uuid)) - vdi.parent = parent - parent.children.append(vdi) - else: - self.vdiTrees.append(vdi) - - -class FileSR(SR): - TYPE = SR.TYPE_FILE - - def __init__(self, uuid, xapi): - SR.__init__(self, uuid, xapi) - self.path = "/var/run/sr-mount/%s" % self.uuid - self.journaler = fjournaler.Journaler(self.path) - - def scan(self, force = False): - if not util.pathexists(self.path): - raise util.SMException("directory %s not found!" % self.uuid) - vhds = self._scan(force) - for uuid, vhdInfo in vhds.iteritems(): - vdi = self.getVDI(uuid) - if not vdi: - Util.log("Found new VDI when scanning: %s" % uuid) - vdi = FileVDI(self, uuid) - self.vdis[uuid] = vdi - vdi.load(vhdInfo) - self._removeStaleVDIs(vhds.keys()) - self._buildTree(force) - self.printVDIs() - - def getFreeSpace(self): - return util.get_fs_size(self.path) - util.get_fs_utilisation(self.path) - - def findLeafCoalesceable(self): - return None # not implemented for FileSR - - def _scan(self, force): - for i in range(SR.SCAN_RETRY_ATTEMPTS): - error = False - pattern = os.path.join(self.path, "*%s" % FileVDI.FILE_SUFFIX) - vhds = vhdutil.getAllVHDs(pattern, FileVDI.extractUuid) - for uuid, vhdInfo in vhds.iteritems(): - if vhdInfo.error: - error = True - break - if not error: - return vhds - Util.log("Scan error on attempt %d" % i) - if force: - return vhds - raise util.SMException("Scan error") - - def deleteVDI(self, vdi): - self._checkSlaves(vdi) - SR.deleteVDI(self, vdi) - - def _checkSlaves(self, vdi): - onlineHosts = self.xapi.getOnlineHosts() - abortFlag = IPCFlag(self.uuid) - for pbdRecord in self.xapi.getAttachedPBDs(): - hostRef = pbdRecord["host"] - if hostRef == self.xapi._hostRef: - continue - if abortFlag.test(FLAG_TYPE_ABORT): - raise AbortException("Aborting due to signal") - try: - self._checkSlave(hostRef, vdi) - except util.CommandException: - if onlineHosts.__contains__(hostRef): - raise - - def _checkSlave(self, hostRef, vdi): - call = (hostRef, "nfs-on-slave", "check", { 'path': vdi.path }) - Util.log("Checking with slave: %s" % repr(call)) - _host = self.xapi.session.xenapi.host - text = _host.call_plugin(*call) - -class LVHDSR(SR): - TYPE = SR.TYPE_LVHD - SUBTYPES = ["lvhdoiscsi", "lvhdohba"] - - def __init__(self, uuid, xapi): - SR.__init__(self, uuid, xapi) - self.vgName = "%s%s" % (lvhdutil.VG_PREFIX, self.uuid) - self.path = os.path.join(lvhdutil.VG_LOCATION, self.vgName) - self.lvmCache = lvmcache.LVMCache(self.vgName) - self.lvActivator = LVActivator(self.uuid, self.lvmCache) - self.journaler = journaler.Journaler(self.lvmCache) - - def deleteVDI(self, vdi): - if self.lvActivator.get(vdi.uuid, False): - self.lvActivator.deactivate(vdi.uuid, False) - self._checkSlaves(vdi) - SR.deleteVDI(self, vdi) - - def getFreeSpace(self): - stats = lvutil._getVGstats(self.vgName) - return stats['physical_size'] - stats['physical_utilisation'] - - def cleanup(self): - if not self.lvActivator.deactivateAll(): - Util.log("ERROR deactivating LVs while cleaning up") - - def needUpdateBlockInfo(self): - for vdi in self.vdis.values(): - if vdi.scanError or vdi.raw or len(vdi.children) == 0: - continue - if not vdi.getConfig(vdi.DB_VHD_BLOCKS): - return True - return False - - def updateBlockInfo(self): - for vdi in self.vdis.values(): - if vdi.scanError or vdi.raw or len(vdi.children) == 0: - continue - if not vdi.getConfig(vdi.DB_VHD_BLOCKS): - vdi.updateBlockInfo() - - def scan(self, force = False): - vdis = self._scan(force) - for uuid, vdiInfo in vdis.iteritems(): - vdi = self.getVDI(uuid) - if not vdi: - Util.log("Found new VDI when scanning: %s" % uuid) - vdi = LVHDVDI(self, uuid) - self.vdis[uuid] = vdi - vdi.load(vdiInfo) - self._removeStaleVDIs(vdis.keys()) - self._buildTree(force) - self.printVDIs() - self._handleInterruptedCoalesceLeaf() - - def _scan(self, force): - for i in range(SR.SCAN_RETRY_ATTEMPTS): - error = False - self.lvmCache.refresh() - vdis = lvhdutil.getVDIInfo(self.lvmCache) - for uuid, vdiInfo in vdis.iteritems(): - if vdiInfo.scanError: - error = True - break - if not error: - return vdis - Util.log("Scan error, retrying (%d)" % i) - if force: - return vdis - raise util.SMException("Scan error") - - def _liveLeafCoalesce(self, vdi): - """If the parent is raw and the child was resized (virt. size), then - we'll need to resize the parent, which can take a while due to zeroing - out of the extended portion of the LV. Do it before pausing the child - to avoid a protracted downtime""" - if vdi.parent.raw and vdi.sizeVirt > vdi.parent.sizeVirt: - self.lvmCache.setReadonly(vdi.parent.lvName, False) - vdi.parent._increaseSizeVirt(vdi.sizeVirt) - - parentUuid = vdi.parent.uuid - if not SR._liveLeafCoalesce(self, vdi): - return False - - # fix the activation records after the UUIDs have been changed - if self.lvActivator.get(parentUuid, False): - self.lvActivator.replace(parentUuid, vdi.uuid, vdi.lvName, False) - else: - self.lvActivator.remove(vdi.uuid, False) - return True - - def _doCoalesceLeaf(self, vdi): - """Actual coalescing of a leaf VDI onto parent. Must be called in an - offline/atomic context""" - vdi._activateChain() - self.journaler.create(VDI.JRN_LEAF, vdi.uuid, vdi.parent.uuid) - self.lvmCache.setReadonly(vdi.parent.lvName, False) - vdi.parent._setHidden(False) - vdi.deflate() - vdi.inflateParentForCoalesce() - vdi.parent._increaseSizeVirt(vdi.sizeVirt, False) - vdi.validate() - vdi.parent.validate() - util.fistpoint.activate("LVHDRT_coaleaf_before_coalesce", self.uuid) - timeout = vdi.LIVE_LEAF_COALESCE_TIMEOUT - if vdi.getConfig(vdi.DB_LEAFCLSC) == vdi.LEAFCLSC_FORCE: - Util.log("Leaf-coalesce forced, will not use timeout") - timeout = 0 - vdi._coalesceVHD(timeout) - util.fistpoint.activate("LVHDRT_coaleaf_after_coalesce", self.uuid) - vdi.parent.validate() - #vdi._verifyContents(timeout / 2) - - # rename - vdiUuid = vdi.uuid - oldNameLV = vdi.lvName - origParentUuid = vdi.parent.uuid - vdi.rename(self.TMP_RENAME_PREFIX + vdiUuid) - util.fistpoint.activate("LVHDRT_coaleaf_one_renamed", self.uuid) - vdi.parent.rename(vdiUuid) - util.fistpoint.activate("LVHDRT_coaleaf_both_renamed", self.uuid) - self._updateSlavesOnRename(vdi.parent, oldNameLV) - - # Note that "vdi.parent" is now the single remaining leaf and "vdi" is - # garbage - - # update the VDI record - vdi.parent.delConfig(VDI.DB_VHD_PARENT) - if vdi.parent.raw: - vdi.parent.setConfig(VDI.DB_VDI_TYPE, lvhdutil.VDI_TYPE_RAW) - vdi.parent.delConfig(VDI.DB_VHD_BLOCKS) - vdi.parent.updateConfig() - util.fistpoint.activate("LVHDRT_coaleaf_after_vdirec", self.uuid) - - # fix the refcounts: the remaining node should inherit the binary - # refcount from the leaf (because if it was online, it should remain - # refcounted as such), but the normal refcount from the parent (because - # this node is really the parent node) - minus 1 if it is online (since - # non-leaf nodes increment their normal counts when they are online and - # we are now a leaf, storing that 1 in the binary refcount). - ns = lvhdutil.NS_PREFIX_LVM + self.uuid - cCnt, cBcnt = RefCounter.check(vdi.uuid, ns) - pCnt, pBcnt = RefCounter.check(vdi.parent.uuid, ns) - pCnt = pCnt - cBcnt - assert(pCnt >= 0) - RefCounter.set(vdi.parent.uuid, pCnt, cBcnt, ns) - - # delete the obsolete leaf & inflate the parent (in that order, to - # minimize free space requirements) - parent = vdi.parent - vdi._setHidden(True) - vdi.parent.children = [] - vdi.parent = None - util.fistpoint.activate("LVHDRT_coaleaf_before_delete", self.uuid) - self.deleteVDI(vdi) - util.fistpoint.activate("LVHDRT_coaleaf_after_delete", self.uuid) - self.xapi.forgetVDI(origParentUuid) - parent.inflateFully() - - util.fistpoint.activate("LVHDRT_coaleaf_before_remove_j", self.uuid) - self.journaler.remove(VDI.JRN_LEAF, vdiUuid) - - def _handleInterruptedCoalesceLeaf(self): - """An interrupted leaf-coalesce operation may leave the VHD tree in an - inconsistent state. If the old-leaf VDI is still present, we revert the - operation (in case the original error is persistent); otherwise we must - finish the operation""" - entries = self.journaler.getAll(VDI.JRN_LEAF) - for uuid, parentUuid in entries.iteritems(): - childLV = lvhdutil.LV_PREFIX[lvhdutil.VDI_TYPE_VHD] + uuid - tmpChildLV = lvhdutil.LV_PREFIX[lvhdutil.VDI_TYPE_VHD] + \ - self.TMP_RENAME_PREFIX + uuid - parentLV1 = lvhdutil.LV_PREFIX[lvhdutil.VDI_TYPE_VHD] + parentUuid - parentLV2 = lvhdutil.LV_PREFIX[lvhdutil.VDI_TYPE_RAW] + parentUuid - parentPresent = (self.lvmCache.checkLV(parentLV1) or \ - self.lvmCache.checkLV(parentLV2)) - if parentPresent or self.lvmCache.checkLV(tmpChildLV): - self._undoInterruptedCoalesceLeaf(uuid, parentUuid) - else: - self._finishInterruptedCoalesceLeaf(uuid, parentUuid) - self.journaler.remove(VDI.JRN_LEAF, uuid) - - def _undoInterruptedCoalesceLeaf(self, childUuid, parentUuid): - Util.log("*** UNDO LEAF-COALESCE") - parent = self.getVDI(parentUuid) - if not parent: - parent = self.getVDI(childUuid) - if not parent: - raise util.SMException("Neither %s nor %s found" % \ - (parentUuid, childUuid)) - Util.log("Renaming parent back: %s -> %s" % (childUuid, parentUuid)) - parent.rename(parentUuid) - util.fistpoint.activate("LVHDRT_coaleaf_undo_after_rename", self.uuid) - - child = self.getVDI(childUuid) - if not child: - child = self.getVDI(self.TMP_RENAME_PREFIX + childUuid) - if not child: - raise util.SMException("Neither %s nor %s found" % \ - (childUuid, self.TMP_RENAME_PREFIX + childUuid)) - Util.log("Renaming child back to %s" % childUuid) - child.rename(childUuid) - Util.log("Updating the VDI record") - child.setConfig(VDI.DB_VHD_PARENT, parentUuid) - child.setConfig(VDI.DB_VDI_TYPE, lvhdutil.VDI_TYPE_VHD) - child.updateConfig() - util.fistpoint.activate("LVHDRT_coaleaf_undo_after_rename2", self.uuid) - - # refcount (best effort - assume that it had succeeded if the - # second rename succeeded; if not, this adjustment will be wrong, - # leading to a non-deactivation of the LV) - ns = lvhdutil.NS_PREFIX_LVM + self.uuid - cCnt, cBcnt = RefCounter.check(child.uuid, ns) - pCnt, pBcnt = RefCounter.check(parent.uuid, ns) - pCnt = pCnt + cBcnt - RefCounter.set(parent.uuid, pCnt, 0, ns) - util.fistpoint.activate("LVHDRT_coaleaf_undo_after_refcount", self.uuid) - - parent.deflate() - child.inflateFully() - util.fistpoint.activate("LVHDRT_coaleaf_undo_after_deflate", self.uuid) - if child.hidden: - child._setHidden(False) - if not parent.hidden: - parent._setHidden(True) - if not parent.lvReadonly: - self.lvmCache.setReadonly(parent.lvName, True) - util.fistpoint.activate("LVHDRT_coaleaf_undo_end", self.uuid) - Util.log("*** leaf-coalesce undo successful") - if util.fistpoint.is_active("LVHDRT_coaleaf_stop_after_recovery"): - child.setConfigUpdate(VDI.DB_LEAFCLSC, VDI.LEAFCLSC_DISABLED) - - def _finishInterruptedCoalesceLeaf(self, childUuid, parentUuid): - Util.log("*** FINISH LEAF-COALESCE") - vdi = self.getVDI(childUuid) - if not vdi: - raise util.SMException("VDI %s not found" % childUuid) - vdi.inflateFully() - util.fistpoint.activate("LVHDRT_coaleaf_finish_after_inflate", self.uuid) - try: - self.xapi.forgetVDI(parentUuid) - except XenAPI.Failure: - pass - util.fistpoint.activate("LVHDRT_coaleaf_finish_end", self.uuid) - Util.log("*** finished leaf-coalesce successfully") - - def _checkSlaves(self, vdi): - """Confirm with all slaves in the pool that 'vdi' is not in use. We - try to check all slaves, including those that the Agent believes are - offline, but ignore failures for offline hosts. This is to avoid cases - where the Agent thinks a host is offline but the host is up.""" - args = {"vgName" : self.vgName, - "action1": "deactivateNoRefcount", - "lvName1": vdi.lvName, - "action2": "cleanupLock", - "uuid2" : vdi.uuid, - "ns2" : lvhdutil.NS_PREFIX_LVM + self.uuid} - onlineHosts = self.xapi.getOnlineHosts() - abortFlag = IPCFlag(self.uuid) - for pbdRecord in self.xapi.getAttachedPBDs(): - hostRef = pbdRecord["host"] - if hostRef == self.xapi._hostRef: - continue - if abortFlag.test(FLAG_TYPE_ABORT): - raise AbortException("Aborting due to signal") - Util.log("Checking with slave %s (path %s)" % (hostRef, vdi.path)) - try: - self.xapi.ensureInactive(hostRef, args) - except XenAPI.Failure: - if onlineHosts.__contains__(hostRef): - raise - - def _updateSlavesOnRename(self, vdi, oldNameLV): - activeVBDs = util.get_attached_VBDs(self.xapi.session, vdi.uuid) - slaves = util.get_hosts(self.xapi.session, activeVBDs) - pool = self.xapi.session.xenapi.pool.get_all()[0] - master = self.xapi.session.xenapi.pool.get_master(pool) - if master in slaves: - slaves.remove(master) - if len(slaves) == 0: - Util.log("VDI %s not attached on any slave" % vdi.toString()) - return - - util.SMlog("Updating %s to %s on %d slaves:" % \ - (oldNameLV, vdi.lvName, len(slaves))) - for slave in slaves: - util.SMlog("Updating slave %s" % slave) - args = {"vgName" : self.vgName, - "action1": "deactivateNoRefcount", - "lvName1": oldNameLV, - "action2": "refresh", - "lvName2": vdi.lvName} - text = self.xapi.session.xenapi.host.call_plugin( \ - slave, self.xapi.PLUGIN_ON_SLAVE, "multi", args) - util.SMlog("call-plugin returned: '%s'" % text) - - -################################################################################ -# -# Helpers -# -def daemonize(): - pid = os.fork() - if pid: - os.waitpid(pid, 0) - Util.log("New PID [%d]" % pid) - return False - os.chdir("/") - os.setsid() - pid = os.fork() - if pid: - Util.log("Will finish as PID [%d]" % pid) - os._exit(0) - for fd in [0, 1, 2]: - try: - os.close(fd) - except OSError: - pass - # we need to fill those special fd numbers or pread won't work - sys.stdin = open("/dev/null", 'r') - sys.stderr = open("/dev/null", 'w') - sys.stdout = open("/dev/null", 'w') - return True - -def normalizeType(type): - if type in LVHDSR.SUBTYPES: - type = SR.TYPE_LVHD - if type in ["lvm", "lvmoiscsi", "lvmohba"]: - # temporary while LVHD is symlinked as LVM - type = SR.TYPE_LVHD - if type in ["ext", "nfs"]: - type = SR.TYPE_FILE - if not type in SR.TYPES: - raise util.SMException("Unsupported SR type: %s" % type) - return type - -def _gcLoop(sr, dryRun): - failedCandidates = [] - while True: - if not sr.xapi.isPluggedHere(): - Util.log("SR no longer attached, exiting") - break - sr.scanLocked() - if not sr.hasWork(): - Util.log("No work, exiting") - break - - if not lockRunning.acquireNoblock(): - Util.log("Another instance already running, exiting") - break - try: - sr.cleanupCoalesceJournals() - sr.scanLocked() - sr.updateBlockInfo() - - if len(sr.findGarbage()) > 0: - sr.garbageCollect(dryRun) - sr.xapi.srUpdate() - continue - - candidate = sr.findCoalesceable() - if candidate: - util.fistpoint.activate("LVHDRT_finding_a_suitable_pair",sr.uuid) - sr.coalesce(candidate, dryRun) - sr.xapi.srUpdate() - continue - - candidate = sr.findLeafCoalesceable() - if candidate: - sr.coalesceLeaf(candidate, dryRun) - sr.xapi.srUpdate() - continue - - Util.log("No work left") - finally: - lockRunning.release() - -def _gc(session, srUuid, dryRun): - init(srUuid) - sr = SR.getInstance(srUuid, session) - - try: - _gcLoop(sr, dryRun) - finally: - sr.cleanup() - Util.log("Final SR state:") - Util.log(sr.toString()) - sr.printVDIs() - -def _abort(srUuid): - """If successful, we return holding lockRunning; otherwise exception - raised.""" - Util.log("=== SR %s: abort ===" % (srUuid)) - init(srUuid) - if not lockRunning.acquireNoblock(): - gotLock = False - Util.log("Aborting currently-running instance (SR %s)" % srUuid) - abortFlag = IPCFlag(srUuid) - abortFlag.set(FLAG_TYPE_ABORT) - for i in range(SR.LOCK_RETRY_ATTEMPTS): - gotLock = lockRunning.acquireNoblock() - if gotLock: - break - time.sleep(SR.LOCK_RETRY_INTERVAL) - abortFlag.clear(FLAG_TYPE_ABORT) - if not gotLock: - raise util.SMException("SR %s: error aborting existing process" % \ - srUuid) - -def coalesceLeafAtomic(session, srUuid, vdiUuid): - """Coalesce a leaf node onto its parent. This should be invoked in the - stop_using_these_vdis_() context to ensure that the leaf is offline. It is - dangerous to invoke this function otherwise. Return True on success, False - if the target VDI is no longer leaf-coalesceable""" - Util.log("=== SR %s: coalesceLeafAtomic for VDI %s ===" % (srUuid, vdiUuid)) - init(srUuid) - sr = SR.getInstance(srUuid, session) - sr.lock() - try: - sr.scan() - vdi = sr.getVDI(vdiUuid) - if not vdi.isLeafCoalesceable(): - return False - try: - sr._doCoalesceLeaf(vdi) - except: - Util.logException("_doCoalesceLeaf") - sr._handleInterruptedCoalesceLeaf() - raise - finally: - sr.cleanup() - sr.unlock() - Util.log("final SR state:") - Util.log(sr.toString()) - sr.printVDIs() - return True - -def init(srUuid): - global lockRunning - if not lockRunning: - lockRunning = lock.Lock(LOCK_TYPE_RUNNING, srUuid) - -def usage(): - output = """Garbage collect and/or coalesce VHDs in a VHD-based SR - -Parameters: - -u --uuid UUID SR UUID - and one of: - -g --gc garbage collect, coalesce, and repeat while there is work - -G --gc_force garbage collect once, aborting any current operations - -a --abort abort any currently running operation (GC or coalesce) - -q --query query the current state (GC'ing, coalescing or not running) - -x --disable disable GC/coalesce (will be in effect until you exit) - -Options: - -b --background run in background (return immediately) (valid for -g only) - -f --force continue in the presence of VHDs with errors (when doing - GC, this might cause removal of any such VHDs) (only valid - for -G) (DANGEROUS) - """ - #-d --dry-run don't actually perform any SR-modifying operations - #-t perform a custom operation (for testing) - print output - Util.log("(Invalid usage)") - sys.exit(1) - - -############################################################################## -# -# API -# -def abort(srUuid): - """Abort GC/coalesce if we are currently GC'ing or coalescing a VDI pair. - """ - _abort(srUuid) - Util.log("abort: releasing the process lock") - lockRunning.release() - -def gc(session, srUuid, inBackground, dryRun = False): - """Garbage collect all deleted VDIs in SR "srUuid". Fork & return - immediately if inBackground=True. - - The following algorithm is used: - 1. If we are already GC'ing in this SR, return - 2. If we are already coalescing a VDI pair: - a. Scan the SR and determine if the VDI pair is GC'able - b. If the pair is not GC'able, return - c. If the pair is GC'able, abort coalesce - 3. Scan the SR - 4. If there is nothing to collect, nor to coalesce, return - 5. If there is something to collect, GC all, then goto 3 - 6. If there is something to coalesce, coalesce one pair, then goto 3 - """ - Util.log("=== SR %s: gc ===" % srUuid) - if inBackground: - if daemonize(): - # we are now running in the background. Catch & log any errors - # because there is no other way to propagate them back at this - # point - - try: - _gc(None, srUuid, dryRun) - except AbortException: - Util.log("Aborted") - except Exception: - Util.logException("gc") - Util.log("* * * * * SR %s: ERROR\n" % srUuid) - os._exit(0) - else: - _gc(session, srUuid, dryRun) - -def gc_force(session, srUuid, force = False, dryRun = False): - """Garbage collect all deleted VDIs in SR "srUuid". - The following algorithm is used: - 1. If we are already GC'ing or coalescing a VDI pair, abort GC/coalesce - 2. Scan the SR - 3. GC - 4. return - """ - Util.log("=== SR %s: gc_force ===" % srUuid) - init(srUuid) - sr = SR.getInstance(srUuid, session) - if not lockRunning.acquireNoblock(): - _abort(srUuid) - else: - Util.log("Nothing was running, clear to proceed") - - if force: - Util.log("FORCED: will continue even if there are VHD errors") - sr.scanLocked(force) - sr.cleanupCoalesceJournals() - - try: - sr.garbageCollect(dryRun) - finally: - sr.cleanup() - Util.log("final SR state:") - Util.log(sr.toString()) - sr.printVDIs() - lockRunning.release() - -def get_state(srUuid): - """Return whether GC/coalesce is currently running or not. The information - is not guaranteed for any length of time if the call is not protected by - locking. - """ - init(srUuid) - if lockRunning.acquireNoblock(): - lockRunning.release() - return False - return True - -def should_preempt(session, srUuid): - sr = SR.getInstance(srUuid, session) - entries = sr.journaler.getAll(VDI.JRN_COALESCE) - if len(entries) == 0: - return False - elif len(entries) > 1: - raise util.SMException("More than one coalesce entry: " + entries) - sr.scanLocked() - coalescedUuid = entries.popitem()[0] - garbage = sr.findGarbage() - for vdi in garbage: - if vdi.uuid == coalescedUuid: - return True - return False - -def get_coalesceable_leaves(session, srUuid, vdiUuids): - coalesceable = [] - sr = SR.getInstance(srUuid, session) - sr.scanLocked() - for uuid in vdiUuids: - vdi = sr.getVDI(uuid) - if not vdi: - raise util.SMException("VDI %s not found" % uuid) - if vdi.isLeafCoalesceable(): - coalesceable.append(uuid) - return coalesceable - -############################################################################## -# -# CLI -# -def main(): - action = "" - uuid = "" - background = False - force = False - dryRun = False - test = False - shortArgs = "gGaqxu:bfdt" - longArgs = ["gc", "gc_force", "abort", "query", "disable", - "uuid", "background", "force", "dry-run", "test"] - - try: - opts, args = getopt.getopt(sys.argv[1:], shortArgs, longArgs) - except getopt.GetoptError: - usage() - for o, a in opts: - if o in ("-g", "--gc"): - action = "gc" - if o in ("-G", "--gc_force"): - action = "gc_force" - if o in ("-a", "--abort"): - action = "abort" - if o in ("-q", "--query"): - action = "query" - if o in ("-x", "--disable"): - action = "disable" - if o in ("-u", "--uuid"): - uuid = a - if o in ("-b", "--background"): - background = True - if o in ("-f", "--force"): - force = True - if o in ("-d", "--dry-run"): - Util.log("Dry run mode") - dryRun = True - if o in ("-t"): - action = "test" - - if not action or not uuid: - usage() - elif action != "query": - print "All output goes in %s" % LOG_FILE - - if action == "gc": - gc(None, uuid, background, dryRun) - elif action == "gc_force": - gc_force(None, uuid, force, dryRun) - elif action == "abort": - abort(uuid) - elif action == "query": - print "Currently running: %s" % get_state(uuid) - elif action == "disable": - print "Disabling GC/coalesce for %s" % uuid - _abort(uuid) - raw_input("Press enter to re-enable...") - print "GC/coalesce re-enabled" - lockRunning.release() - elif action == "test": - Util.log("Test operation") - pass - - -if __name__ == '__main__': - main() diff --git a/scripts/vm/hypervisor/xenserver/xcpserver/nfs.py b/scripts/vm/hypervisor/xenserver/xcpserver/nfs.py deleted file mode 100755 index 3a8463e30c5..00000000000 --- a/scripts/vm/hypervisor/xenserver/xcpserver/nfs.py +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/python -# Copyright (C) 2006-2007 XenSource Ltd. -# Copyright (C) 2008-2009 Citrix Ltd. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published -# by the Free Software Foundation; version 2.1 only. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# nfs.py: NFS related utility functions - -import util, errno, os, xml.dom.minidom - -# The algorithm for tcp and udp (at least in the linux kernel) for -# NFS timeout on softmounts is as follows: -# -# UDP: -# As long as the request wasn't started more than timeo * (2 ^ retrans) -# in the past, keep doubling the timeout. -# -# TCP: -# As long as the request wasn't started more than timeo * (1 + retrans) -# in the past, keep increaing the timeout by timeo. -# -# The time when the retrans may retry has been made will be: -# For udp: timeo * (2 ^ retrans * 2 - 1) -# For tcp: timeo * n! where n is the smallest n for which n! > 1 + retrans -# -# thus for retrans=1, timeo can be the same for both tcp and udp, -# because the first doubling (timeo*2) is the same as the first increment -# (timeo+timeo). - -SOFTMOUNT_TIMEOUT = int((40.0/3.0) * 10.0) # 1/10 s -SOFTMOUNT_RETRANS = 10 -RPCINFO_BIN = "/usr/sbin/rpcinfo" -SHOWMOUNT_BIN = "/usr/sbin/showmount" - - -class NfsException(Exception): - def __init__(self, errstr): - self.errstr = errstr - - -def check_server_tcp(server): - """Make sure that NFS over TCP/IP V3 is supported on the server. - Returns True if everything is OK, False otherwise.""" - try: - util.ioretry(lambda: util.pread([RPCINFO_BIN,"-t", - "%s" % server, "nfs","3"]), - errlist=[errno.EPERM], maxretry=2, nofail=True) - except util.CommandException, inst: - raise NfsException("rpcinfo failed or timed out: return code %d" % - inst.code) - - -def soft_mount(mountpoint, remoteserver, remotepath, transport): - """Mount the remote NFS export at 'mountpoint'""" - try: - if not util.ioretry(lambda: util.isdir(mountpoint)): - util.ioretry(lambda: util.makedirs(mountpoint)) - except util.CommandException, inst: - raise NfsException("Failed to make directory: code is %d" % - inst.code) - - options = "soft,timeo=%d,retrans=%d,%s,noac" % (SOFTMOUNT_TIMEOUT, - SOFTMOUNT_RETRANS, - transport) - try: - util.ioretry(lambda: - util.pread(["mount.nfs", "%s:%s" - % (remoteserver, remotepath), - mountpoint, "-o", options]), - errlist=[errno.EPIPE, errno.EIO], - maxretry=2, nofail=True) - except util.CommandException, inst: - raise NfsException("mount failed with return code %d" % inst.code) - - -def unmount(mountpoint, rmmountpoint): - """Unmount the mounted mountpoint""" - try: - util.pread(["umount", mountpoint]) - except util.CommandException, inst: - raise NfsException("umount failed with return code %d" % inst.code) - - if rmmountpoint: - try: - os.rmdir(mountpoint) - except OSError, inst: - raise NfsException("rmdir failed with error '%s'" % inst.strerror) - - -def scan_exports(target): - util.SMlog("scanning") - cmd = [SHOWMOUNT_BIN, "--no-headers", "-e", target] - dom = xml.dom.minidom.Document() - element = dom.createElement("nfs-exports") - dom.appendChild(element) - for val in util.pread2(cmd).split('\n'): - if not len(val): - continue - entry = dom.createElement('Export') - element.appendChild(entry) - - subentry = dom.createElement("Target") - entry.appendChild(subentry) - textnode = dom.createTextNode(target) - subentry.appendChild(textnode) - - (path, access) = val.split() - subentry = dom.createElement("Path") - entry.appendChild(subentry) - textnode = dom.createTextNode(path) - subentry.appendChild(textnode) - - subentry = dom.createElement("Accesslist") - entry.appendChild(subentry) - textnode = dom.createTextNode(access) - subentry.appendChild(textnode) - - return dom - -def scan_srlist(path): - dom = xml.dom.minidom.Document() - element = dom.createElement("SRlist") - dom.appendChild(element) - for val in filter(util.match_uuid, util.ioretry( \ - lambda: util.listdir(path))): - fullpath = os.path.join(path, val) - if not util.ioretry(lambda: util.isdir(fullpath)): - continue - - entry = dom.createElement('SR') - element.appendChild(entry) - - subentry = dom.createElement("UUID") - entry.appendChild(subentry) - textnode = dom.createTextNode(val) - subentry.appendChild(textnode) - - return dom.toprettyxml() diff --git a/scripts/vm/hypervisor/xenserver/xcpserver/patch b/scripts/vm/hypervisor/xenserver/xcpserver/patch deleted file mode 100644 index fe414c79b6f..00000000000 --- a/scripts/vm/hypervisor/xenserver/xcpserver/patch +++ /dev/null @@ -1,41 +0,0 @@ -# This file specifies the files that need -# to be transferred over to the XenServer. -# The format of this file is as follows: -# [Name of file]=[source path],[file permission],[destination path] -# [destination path] is required. -# If [file permission] is missing, 755 is assumed. -# If [source path] is missing, it looks in the same -# directory as the patch file. -# If [source path] starts with '/', then it is absolute path. -# If [source path] starts with '~', then it is path relative to management server home directory. -# If [source path] does not start with '/' or '~', then it is relative path to the location of the patch file. -scsiutil.py=/opt/xensource/sm -cleanup.py=/opt/xensource/sm -NFSSR.py=/opt/xensource/sm -ISCSISR.py=/opt/xensource/sm -LUNperVDI.py=/opt/xensource/sm -nfs.py=/opt/xensource/sm -patch.tgz=..,0775,/opt/xensource/bin -vmops=..,0755,/etc/xapi.d/plugins -vmopsSnapshot=..,0755,/etc/xapi.d/plugins -systemvm-premium.zip=../../../../../vms,0755,/opt/xensource/bin -hostvmstats.py=..,0755,/opt/xensource/sm -network_info.sh=..,0755,/opt/xensource/bin -prepsystemvm.sh=..,0755,/opt/xensource/bin -setupxenserver.sh=..,0755,/opt/xensource/bin -make_migratable.sh=..,0755,/opt/xensource/bin -networkUsage.sh=..,0755,/opt/xensource/bin -find_bond.sh=..,0755,/opt/xensource/bin -setup_iscsi.sh=..,0755,/opt/xensource/bin -version=..,0755,/opt/xensource/bin -setup_heartbeat_sr.sh=..,0755,/opt/xensource/bin -check_heartbeat.sh=..,0755,/opt/xensource/bin -xenheartbeat.sh=..,0755,/opt/xensource/bin -launch_hb.sh=..,0755,/opt/xensource/bin -pingtest.sh=../../..,0755,/opt/xensource/bin -dhcp_entry.sh=../../../../network/domr/,0755,/opt/xensource/bin -ipassoc.sh=../../../../network/domr/,0755,/opt/xensource/bin -vm_data.sh=../../../../network/domr/,0755,/opt/xensource/bin -save_password_to_domr.sh=../../../../network/domr/,0755,/opt/xensource/bin -call_firewall.sh=../../../../network/domr/,0755,/opt/xensource/bin -call_loadbalancer.sh=../../../../network/domr/,0755,/opt/xensource/bin diff --git a/scripts/vm/hypervisor/xenserver/xcpserver/scsiutil.py b/scripts/vm/hypervisor/xenserver/xcpserver/scsiutil.py deleted file mode 100755 index 1d4506ef3fb..00000000000 --- a/scripts/vm/hypervisor/xenserver/xcpserver/scsiutil.py +++ /dev/null @@ -1,468 +0,0 @@ -#!/usr/bin/python -# Copyright (C) 2006-2007 XenSource Ltd. -# Copyright (C) 2008-2009 Citrix Ltd. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published -# by the Free Software Foundation; version 2.1 only. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# Miscellaneous scsi utility functions -# - -import util, SR -import os -import re -import xs_errors -import base64 -import time -import errno -import glob - -PREFIX_LEN = 4 -SUFFIX_LEN = 12 -SECTOR_SHIFT = 9 - -def gen_hash(st, len): - hs = 0 - for i in st: - hs = ord(i) + (hs << 6) + (hs << 16) - hs - return str(hs)[0:len] - -def gen_uuid_from_serial(iqn, serial): - if len(serial) < SUFFIX_LEN: - raise util.CommandException(1) - prefix = gen_hash(iqn, PREFIX_LEN) - suffix = gen_hash(serial, SUFFIX_LEN) - str = prefix.encode("hex") + suffix.encode("hex") - return str[0:8]+'-'+str[8:12]+'-'+str[12:16]+'-'+str[16:20]+'-'+str[20:32] - -def gen_serial_from_uuid(iqn, uuid): - str = uuid.replace('-','') - prefix = gen_hash(iqn, PREFIX_LEN) - if str[0:(PREFIX_LEN * 2)].decode("hex") != prefix: - raise util.CommandException(1) - return str[(PREFIX_LEN * 2):].decode("hex") - -def getsize(path): - dev = getdev(path) - sysfs = os.path.join('/sys/block',dev,'size') - size = 0 - if os.path.exists(sysfs): - try: - f=open(sysfs, 'r') - size = (long(f.readline()) << SECTOR_SHIFT) - f.close() - except: - pass - return size - -def getuniqueserial(path): - dev = getdev(path) - output = gen_rdmfile() - try: - cmd = ["md5sum"] - txt = util.pread3(cmd, getSCSIid(path)) - return txt.split(' ')[0] - except: - return '' - -def gen_uuid_from_string(str): - if len(str) < (PREFIX_LEN + SUFFIX_LEN): - raise util.CommandException(1) - return str[0:8]+'-'+str[8:12]+'-'+str[12:16]+'-'+str[16:20]+'-'+str[20:32] - -def SCSIid_sanitise(str): - text = re.sub("^\s+","",str) - return re.sub("\s+","_",text) - -def getSCSIid(path): - dev = rawdev(path) - cmd = ["scsi_id", "-g", "-s", "/block/%s" % dev] - return SCSIid_sanitise(util.pread2(cmd)[:-1]) - -def compareSCSIid_2_6_18(SCSIid, path): - serial = getserial(path) - len_serial = len(serial) - if (len_serial == 0 ) or (len_serial > (len(SCSIid) - 1)): - return False - list_SCSIid = list(SCSIid) - list_serial = list_SCSIid[1:(len_serial + 1)] - serial_2_6_18 = ''.join(list_serial) - if (serial == serial_2_6_18): - return True - else: - return False - -def getserial(path): - dev = os.path.join('/dev',getdev(path)) - try: - cmd = ["sginfo", "-s", dev] - text = re.sub("\s+","",util.pread2(cmd)) - except: - raise xs_errors.XenError('EIO', \ - opterr='An error occured querying device serial number [%s]' \ - % dev) - try: - return text.split("'")[1] - except: - return '' - -def getmanufacturer(path): - cmd = ["sginfo", "-M", path] - try: - for line in filter(match_vendor, util.pread2(cmd).split('\n')): - return line.replace(' ','').split(':')[-1] - except: - return '' - -def cacheSCSIidentifiers(): - SCSI = {} - SYS_PATH = "/dev/disk/by-scsibus/*" - for node in glob.glob(SYS_PATH): - dev = os.path.realpath(node) - HBTL = os.path.basename(node).split("-")[-1].split(":") - line = "NONE %s %s %s %s 0 %s" % \ - (HBTL[0],HBTL[1],HBTL[2],HBTL[3],dev) - ids = line.split() - SCSI[ids[6]] = ids - return SCSI - -def scsi_dev_ctrl(ids, cmd): - f = -1 - for i in range(0,10): - try: - str = "scsi %s-single-device %s %s %s %s" % \ - (cmd, ids[1],ids[2],ids[3],ids[4]) - util.SMlog(str) - f=open('/proc/scsi/scsi', 'w') - print >>f, str - f.close() - return - except IOError, e: - util.SMlog("SCSI_DEV_CTRL: Failure, %s [%d]" % (e.strerror,e.errno)) - if f >= 0: - f.close() - if e.errno == errno.ENXIO: - util.SMlog("Device has disappeared already") - return - f = -1 - time.sleep(6) - continue - raise xs_errors.XenError('EIO', \ - opterr='An error occured during the scsi operation') - -def getdev(path): - realpath = os.path.realpath(path) - if match_dm(realpath): - newpath = realpath.replace("/dev/mapper/","/dev/disk/by-id/scsi-") - else: - newpath = path - return os.path.realpath(newpath).split('/')[-1] - -def rawdev(dev): - return re.sub("[0-9]*$","",getdev(dev)) - -def getSessionID(path): - for line in filter(match_session, util.listdir(path)): - return line.split('-')[-1] - -def match_session(s): - regex = re.compile("^SESSIONID-") - return regex.search(s, 0) - -def match_vendor(s): - regex = re.compile("^Vendor:") - return regex.search(s, 0) - -def match_dm(s): - regex = re.compile("mapper/") - return regex.search(s, 0) - -def match_sd(s): - regex = re.compile("/dev/sd") - return regex.search(s, 0) - -def _isSCSIdev(dev): - if match_dm(dev): - path = dev.replace("/dev/mapper/","/dev/disk/by-id/scsi-") - else: - path = dev - return match_sd(os.path.realpath(path)) - -def gen_rdmfile(): - return "/tmp/%s" % util.gen_uuid() - -def add_serial_record(session, sr_ref, devstring): - try: - conf = session.xenapi.SR.get_sm_config(sr_ref) - conf['devserial'] = devstring - session.xenapi.SR.set_sm_config(sr_ref, conf) - except: - pass - -def get_serial_record(session, sr_ref): - try: - conf = session.xenapi.SR.get_sm_config(sr_ref) - return conf['devserial'] - except: - return "" - -def devlist_to_serialstring(devlist): - serial = '' - for dev in devlist: - try: - devserial = "scsi-%s" % getSCSIid(dev) - if not len(devserial) > 0: - continue - if len(serial): - serial += ',' - serial += devserial - except: - pass - - return serial - -def gen_synthetic_page_data(uuid): - # For generating synthetic page data for non-raw LUNs - # we set the vendor ID to XENSRC - # Note that the Page 80 serial number must be limited - # to 16 characters - page80 = "" - page80 += "\x00\x80" - page80 += "\x00\x12" - page80 += uuid[0:16] - page80 += " " - - page83 = "" - page83 += "\x00\x83" - page83 += "\x00\x31" - page83 += "\x02\x01\x00\x2d" - page83 += "XENSRC " - page83 += uuid - page83 += " " - return ["",base64.b64encode(page80),base64.b64encode(page83)] - -def gen_raw_page_data(path): - default = "" - page80 = "" - page83 = "" - try: - cmd = ["sg_inq", "-r", path] - text = util.pread2(cmd) - default = base64.b64encode(text) - - cmd = ["sg_inq", "--page=0x80", "-r", path] - text = util.pread2(cmd) - page80 = base64.b64encode(text) - - cmd = ["sg_inq", "--page=0x83", "-r", path] - text = util.pread2(cmd) - page83 = base64.b64encode(text) - except: - pass - return [default,page80,page83] - -def update_XS_SCSIdata(session, vdi_ref, vdi_uuid, data): - try: - session.xenapi.VDI.remove_from_xenstore_data(vdi_ref, "vdi-uuid") - except: - pass - - try: - session.xenapi.VDI.remove_from_xenstore_data(vdi_ref, "scsi/0x12/default") - except: - pass - - try: - session.xenapi.VDI.remove_from_xenstore_data(vdi_ref, "scsi/0x12/0x80") - except: - pass - - try: - session.xenapi.VDI.remove_from_xenstore_data(vdi_ref, "scsi/0x12/0x83") - except: - pass - - try: - session.xenapi.VDI.add_to_xenstore_data(vdi_ref, "vdi-uuid", vdi_uuid) - if len(data[0]): - session.xenapi.VDI.add_to_xenstore_data(vdi_ref, "scsi/0x12/default", data[0]) - - if len(data[1]): - session.xenapi.VDI.add_to_xenstore_data(vdi_ref, "scsi/0x12/0x80", data[1]) - - if len(data[2]): - session.xenapi.VDI.add_to_xenstore_data(vdi_ref, "scsi/0x12/0x83", data[2]) - except: - pass - -def rescan(ids, scanstring='- - -'): - for id in ids: - refresh_HostID(id, scanstring) - -def _genArrayIdentifier(dev): - try: - cmd = ["sg_inq", "--page=0xc8", "-r", dev] - id = util.pread2(cmd) - return id.encode("hex")[180:212] - except: - return "" - - -def _genHostList(procname): - # loop through and check all adapters - ids = [] - try: - for dir in util.listdir('/sys/class/scsi_host'): - filename = os.path.join('/sys/class/scsi_host',dir,'proc_name') - if os.path.exists(filename): - f = open(filename, 'r') - if f.readline().find(procname) != -1: - ids.append(dir.replace("host","")) - f.close() - except: - pass - return ids - -def _genReverseSCSIidmap(SCSIid, pathname="scsibus"): - util.SMlog("map_by_scsibus: sid=%s" % SCSIid) - - devices = [] - for link in glob.glob('/dev/disk/by-id/scsi-%s' % SCSIid): - devices.append(os.path.realpath(link)) - return devices - -def _genReverseSCSidtoLUNidmap(SCSIid): - devices = [] - for link in glob.glob('/dev/disk/by-scsibus/%s-*' % SCSIid): - devices.append(link.split('-')[-1]) - return devices - -def _dosgscan(): - regex=re.compile("([^:]*):\s+scsi([0-9]+)\s+channel=([0-9]+)\s+id=([0-9]+)\s+lun=([0-9]+)") - scan=util.pread2(["/usr/bin/sg_scan"]).split('\n') - sgs=[] - for line in scan: - m=regex.match(line) - if m: - device=m.group(1) - host=m.group(2) - channel=m.group(3) - sid=m.group(4) - lun=m.group(5) - sgs.append([device,host,channel,sid,lun]) - return sgs - -def refresh_HostID(HostID, scanstring): - LUNs = glob.glob('/sys/class/scsi_disk/%s*' % HostID) - li = [] - for l in LUNs: - chan = re.sub(":[0-9]*$",'',os.path.basename(l)) - if chan not in li: - li.append(chan) - - fullrescan = True - if len(li) and scanstring == "- - -": - fullrescan = False - for c in li: - if not refresh_scsi_channel(c): - fullrescan = True - - if fullrescan: - util.SMlog("Rescanning HostID %s with %s" % (HostID, scanstring)) - path = '/sys/class/scsi_host/host%s/scan' % HostID - if os.path.exists(path): - try: - f=open(path, 'w') - f.write('%s\n' % scanstring) - f.close() - except: - pass - # Host Bus scan issued, now try to detect channels - if util.wait_for_path("/sys/class/scsi_disk/%s*" % HostID, 5): - # At least one LUN is mapped - LUNs = glob.glob('/sys/class/scsi_disk/%s*' % HostID) - li = [] - for l in LUNs: - chan = re.sub(":[0-9]*$",'',os.path.basename(l)) - if chan not in li: - li.append(chan) - for c in li: - refresh_scsi_channel(c) - - -def refresh_scsi_channel(channel): - DEV_WAIT = 5 - util.SMlog("Refreshing channel %s" % channel) - util.wait_for_path('/dev/disk/by-scsibus/*-%s*' % channel, DEV_WAIT) - LUNs = glob.glob('/dev/disk/by-scsibus/*-%s*' % channel) - try: - rootdevs = util.dom0_disks() - except: - util.SMlog("Failed to query root disk, failing operation") - return False - - # a) Find a LUN to issue a Query LUNs command - li = [] - Query = False - for lun in LUNs: - try: - hbtl = lun.split('-')[-1] - h = hbtl.split(':') - l=util.pread2(["/usr/bin/sg_luns","-q",lun]).split('\n') - li = [] - for i in l: - if len(i): - li.append(int(i[0:4], 16)) - util.SMlog("sg_luns query returned %s" % li) - Query = True - break - except: - pass - if not Query: - util.SMlog("Failed to detect or query LUN on Channel %s" % channel) - return False - - # b) Remove stale LUNs - current = glob.glob('/dev/disk/by-scsibus/*-%s:%s:%s*' % (h[0],h[1],h[2])) - for cur in current: - lunID = int(cur.split(':')[-1]) - newhbtl = ['',h[0],h[1],h[2],str(lunID)] - if os.path.realpath(cur) in rootdevs: - # Don't touch the rootdev - if lunID in li: li.remove(lunID) - continue - - # Check if LUN is stale, and remove it - if not lunID in li: - util.SMlog("Stale LUN detected. Removing HBTL: %s" % newhbtl) - scsi_dev_ctrl(newhbtl,"remove") - util.wait_for_nopath(cur, DEV_WAIT) - continue - else: - li.remove(lunID) - - # Query SCSIid, check it matches, if not, re-probe - cur_SCSIid = os.path.basename(cur).split("-%s:%s:%s" % (h[0],h[1],h[2]))[0] - real_SCSIid = getSCSIid(cur) - if cur_SCSIid != real_SCSIid: - util.SMlog("HBTL %s does not match, re-probing" % newhbtl) - scsi_dev_ctrl(newhbtl,"remove") - util.wait_for_nopath(cur, DEV_WAIT) - scsi_dev_ctrl(newhbtl,"add") - util.wait_for_path('/dev/disk/by-scsibus/%s-%s' % (real_SCSIid,hbtl), DEV_WAIT) - pass - - # c) Probe for any LUNs that are not present in the system - for l in li: - newhbtl = ['',h[0],h[1],h[2],str(l)] - util.SMlog("Probing new HBTL: %s" % newhbtl) - scsi_dev_ctrl(newhbtl,"add") - util.wait_for_path('/dev/disk/by-scsibus/*-%s' % hbtl, DEV_WAIT) - - return True diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/NFSSR.py b/scripts/vm/hypervisor/xenserver/xenserver56/NFSSR.py index 5fd672a67a6..5a104df411a 100755 --- a/scripts/vm/hypervisor/xenserver/xenserver56/NFSSR.py +++ b/scripts/vm/hypervisor/xenserver/xenserver56/NFSSR.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +# $Id: NFSSR.py 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xenserver/xenserver56/NFSSR.py $ # Copyright (c) 2005-2007 XenSource, Inc. All use and distribution of this # copyrighted material is governed by and subject to terms and conditions # as licensed by XenSource, Inc. All other rights reserved. diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/iptables b/scripts/vm/hypervisor/xenserver/xenserver56/iptables new file mode 100644 index 00000000000..41c3380d61a --- /dev/null +++ b/scripts/vm/hypervisor/xenserver/xenserver56/iptables @@ -0,0 +1,24 @@ +# Firewall configuration written by system-config-securitylevel +# Manual customization of this file is not recommended. +*filter +:INPUT ACCEPT [0:0] +:FORWARD ACCEPT [0:0] +:OUTPUT ACCEPT [0:0] +:RH-Firewall-1-INPUT - [0:0] +-A INPUT -j RH-Firewall-1-INPUT +-A FORWARD -j RH-Firewall-1-INPUT +-A RH-Firewall-1-INPUT -i lo -j ACCEPT +-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT +-A RH-Firewall-1-INPUT -p 50 -j ACCEPT +-A RH-Firewall-1-INPUT -p 51 -j ACCEPT +-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT +-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT +-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT +-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT +-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 694 -j ACCEPT +-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT +-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT +-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT +-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 5900:6099 -j ACCEPT +-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited +COMMIT diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/patch b/scripts/vm/hypervisor/xenserver/xenserver56/patch index fe414c79b6f..5fd0abf6ba7 100644 --- a/scripts/vm/hypervisor/xenserver/xenserver56/patch +++ b/scripts/vm/hypervisor/xenserver/xenserver56/patch @@ -9,20 +9,21 @@ # If [source path] starts with '/', then it is absolute path. # If [source path] starts with '~', then it is path relative to management server home directory. # If [source path] does not start with '/' or '~', then it is relative path to the location of the patch file. +qemu-dm-wrapper=/opt/xensource/libexec scsiutil.py=/opt/xensource/sm cleanup.py=/opt/xensource/sm +vncterm-wrapper=/opt/xensource/libexec NFSSR.py=/opt/xensource/sm ISCSISR.py=/opt/xensource/sm LUNperVDI.py=/opt/xensource/sm nfs.py=/opt/xensource/sm +iptables=/etc/sysconfig patch.tgz=..,0775,/opt/xensource/bin vmops=..,0755,/etc/xapi.d/plugins -vmopsSnapshot=..,0755,/etc/xapi.d/plugins systemvm-premium.zip=../../../../../vms,0755,/opt/xensource/bin hostvmstats.py=..,0755,/opt/xensource/sm network_info.sh=..,0755,/opt/xensource/bin prepsystemvm.sh=..,0755,/opt/xensource/bin -setupxenserver.sh=..,0755,/opt/xensource/bin make_migratable.sh=..,0755,/opt/xensource/bin networkUsage.sh=..,0755,/opt/xensource/bin find_bond.sh=..,0755,/opt/xensource/bin diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/qemu-dm-wrapper b/scripts/vm/hypervisor/xenserver/xenserver56/qemu-dm-wrapper new file mode 100755 index 00000000000..e4653e79446 --- /dev/null +++ b/scripts/vm/hypervisor/xenserver/xenserver56/qemu-dm-wrapper @@ -0,0 +1,115 @@ +#!/usr/bin/python +# +# Copyright (c) Citrix Systems 2007-2008. All rights reserved. +# +# Xen, the Xen logo, XenCenter, XenMotion are trademarks or registered +# trademarks of Citrix Systems, Inc., in the United States and other +# countries. + +import sys, os, time, resource + +DOMID=int(sys.argv[1]) +LOGFILE=sys.argv[2] + +SQUASH_VNC=False +SDL_ENABLED=True +SDL_ZOOM_ENABLED=True + +# enabling core dumps if /var/xen/qemu is not a ramdisk, disabling otherwise +try : + newlimits = None + oldlimits = resource.getrlimit(resource.RLIMIT_CORE) + f = open("/etc/mtab", "r") + for line in f: + if line.find("/var/xen/qemu") is not -1: + if line.find("tmpfs") is not -1 or line.find("ramfs") is not -1 : + newlimits = (0, oldlimits[1]) + break + if newlimits is None: + newlimits = (64 * 1024 * 1024, oldlimits[1]) + resource.setrlimit(resource.RLIMIT_CORE, newlimits) + f.close() +except: + pass + +# Check X is running -- disable SDL if it isn't: +h = os.popen("/bin/ps aux | /bin/fgrep 'X :0' | /bin/fgrep -v fgrep | /usr/bin/wc -l") +x_is_running = int(h.read()) +h.close() +if not x_is_running: + SDL_ENABLED=False + SDL_ZOOM_ENABLED=False + +log = open(LOGFILE, "wa") +log.write("qemu-dm-wrapper in python:\n") +log.write("Using domid: %d\n" % DOMID) +log.write("Core dumps size limit: %d\n" % newlimits[0]) +log.write("Arguments: %s\n" % " ".join(sys.argv[2:])) +os.system("xenstore-write /local/domain/%d/qemu-pid %d\n" % (DOMID, os.getpid())) +if SQUASH_VNC: + os.system("xenstore-write /local/domain/%d/console/vnc-port %d\n" % (DOMID, 6900+DOMID)) + +qemu_args = sys.argv[2:] +qemu_args.append("-monitor") +qemu_args.append("pty") + +if SDL_ENABLED: + qemu_args.append("-nograb") + qemu_args.append("-sdl") + +if SDL_ZOOM_ENABLED: + h = os.popen("/usr/bin/xenstore-read /local/host/display/vm-geometry", "r") + geom = h.read().strip() + h.close() + + if geom != "": + qemu_args.append("-geometry") + qemu_args.append(geom) + +# suppress the vnc args to qemu-dm +if SQUASH_VNC: + try: + vnc_idx = qemu_args.index("-vnc") + del qemu_args[vnc_idx: vnc_idx+2] + except ValueError, IndexError: + pass + + try: + vnc_idx = qemu_args.index("-vncunused") + del qemu_args[vnc_idx: vnc_idx+1] + except ValueError, IndexError: + pass +else: + qemu_args.append("-vnclisten") + qemu_args.append("0.0.0.0:1") + +def vm_uuid_from_dom_id(domid): + # domid --> uuid + h = os.popen("/opt/xensource/bin/list_domains | cut -f0-2 -d'|' | egrep '(^ *%d *\|)' | cut -f 2 -d'|'" % domid, "r") + uuid = h.read().strip() + h.close() + return uuid + +qemu_env = os.environ +if SDL_ENABLED: + # define qemu_env, add DISPLAY + qemu_env["DISPLAY"] = ":0.0" + # add the SDL env to set the qemu-dm window WM_CLASS, so that Ion can place the + # window in the correct workspace. + vm_uuid = vm_uuid_from_dom_id(DOMID) + qemu_env["SDL_VIDEO_X11_WMCLASS"] = "HVMXEN-" + vm_uuid + qemu_env["XAUTHORITY"] = "/root/.Xauthority" + qemu_env["HOME"] = "/root" + qemu_env["SDL_DISABLE_WAITMAPPED"] = "True" + +log.write("Arguments adjusted to: %s\n" % " ".join(qemu_args)) +log.write("everything else is from qemu-dm:\n") +log.flush() + +# redirect stdout to append to logfile +os.dup2(log.fileno(), 1) + +# redirect stderr to stdout (which now goes to the log) +os.dup2(1, 2) + +os.execve("/usr/lib/xen/bin/qemu-dm", qemu_args, qemu_env) diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/scsiutil.py b/scripts/vm/hypervisor/xenserver/xenserver56/scsiutil.py index 90e201045cf..f7680819cbe 100755 --- a/scripts/vm/hypervisor/xenserver/xenserver56/scsiutil.py +++ b/scripts/vm/hypervisor/xenserver/xenserver56/scsiutil.py @@ -1,4 +1,5 @@ # Copyright (c) 2005-2007 XenSource, Inc. All use and distribution of this +# $Id: scsiutil.py 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/hypervisor/xenserver/xenserver56/scsiutil.py $ # copyrighted material is governed by and subject to terms and conditions # as licensed by XenSource, Inc. All other rights reserved. # Xen, XenSource and XenEnterprise are either registered trademarks or diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/vncterm-wrapper b/scripts/vm/hypervisor/xenserver/xenserver56/vncterm-wrapper new file mode 100755 index 00000000000..a5d5d00bb19 --- /dev/null +++ b/scripts/vm/hypervisor/xenserver/xenserver56/vncterm-wrapper @@ -0,0 +1,42 @@ +#!/bin/sh +# +# Copyright (c) Citrix Systems 2007-2008. All rights reserved. +# +# Xen, the Xen logo, XenCenter, XenMotion are trademarks or registered +# trademarks of Citrix Systems, Inc., in the United States and other +# countries. + +DOMID=$1 +shift 1 + +#Getting the VM UUID +export VMUUID=`/opt/xensource/bin/list_domains -domid $DOMID -minimal` + +#For security reasons, we only listen on locahost by default +export VNCTERM_LISTEN="-v 0.0.0.0:1" + +VNCVIEWER="" +if test `/bin/ps aux | /bin/fgrep 'X :0' | /bin/fgrep -v fgrep | /usr/bin/wc -l` -eq 1 && test $DOMID -gt 0 +then + VNCVIEWER="--vncviewer=FullColor=0;LowColourLevel=2;AutoSelect=0;MenuKey=" +fi + +export DISPLAY=":0.0" +export HOME="/root" +export XAUTHORITY="/root/.Xauthority" + +# enabling core dumps if /var/xen/vncterm is not a ramdisk, disabling otherwise +if test "`grep -E "/var/xen/vncterm.*(tmpfs|ramfs)" /etc/mtab`" +then + ulimit -Sc 0 +else + ulimit -Sc 67108864 +fi + +echo vncterm-wrapper: +xenstore-write -s /local/domain/$DOMID/serial/0/vncterm-pid $$ +if [ -z "${XIU}" ]; then + exec /usr/lib/xen/bin/vncterm $VNCTERM_LISTEN $VNCVIEWER $* > /dev/null 2>&1 +else + exec xenstore-write -s /local/domain/$DOMID/serial/0/vnc-port 0 +fi diff --git a/scripts/vm/network/vnet/bridge.sh b/scripts/vm/network/vnet/bridge.sh index 765837e08fa..3fb12482982 100755 --- a/scripts/vm/network/vnet/bridge.sh +++ b/scripts/vm/network/vnet/bridge.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: bridge.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/network/vnet/bridge.sh $ +# $Id: bridge.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/network/vnet/bridge.sh $ # # bridge.sh # diff --git a/scripts/vm/network/vnet/createvnet.sh b/scripts/vm/network/vnet/createvnet.sh index 97d0ca2b9f8..a186b63b1b7 100755 --- a/scripts/vm/network/vnet/createvnet.sh +++ b/scripts/vm/network/vnet/createvnet.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: createvnet.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/network/vnet/createvnet.sh $ +# $Id: createvnet.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/network/vnet/createvnet.sh $ # runvm.sh -- start a vm from a directory containing the kernel and os images # iscsi mode # diff --git a/scripts/vm/network/vnet/modifyvlan.sh b/scripts/vm/network/vnet/modifyvlan.sh index 6806f244b95..f17594f75ad 100644 --- a/scripts/vm/network/vnet/modifyvlan.sh +++ b/scripts/vm/network/vnet/modifyvlan.sh @@ -1,109 +1,180 @@ #!/usr/bin/env bash -# $Id: modifyvlan.sh 11388 2010-08-02 17:04:13Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/network/vnet/modifyvlan.sh $ +# $Id: modifyvlan.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/network/vnet/modifyvlan.sh $ # modifyvlan.sh -- adds and deletes VLANs from a Routing Server # # # set -x usage() { - printf "Usage: %s: -o (add | delete) -v -p \n" + printf "Usage: %s: -o -v -g \n" } -VIRBR=cloudVirBr addVlan() { local vlanId=$1 - local pif=$2 - local vlanDev=$pif.$vlanId - local vlanBr=$VIRBR$vlanId - if [ ! -d /sys/class/net/$vlanDev ] + # Try to add bond1.[VLAN ID] via vconfig, if it does not already exist + ifconfig bond1.$vlanId > /dev/null + + if [ $? -gt 0 ] then - vconfig add $pif $vlanId > /dev/null + vconfig add bond1 $vlanId if [ $? -gt 0 ] then - printf "Failed to create vlan $vlanId on pif: $pif." return 1 fi fi - # is up? - ifconfig |grep -w $vlanDev > /dev/null + # Make ifcfg-bond1.$vlanId + rm /etc/sysconfig/network-scripts/ifcfg-bond1.$vlanId + touch /etc/sysconfig/network-scripts/ifcfg-bond1.$vlanId + echo "DEVICE=bond1.$vlanId" >> /etc/sysconfig/network-scripts/ifcfg-bond1.$vlanId + echo "ONBOOT=yes" >> /etc/sysconfig/network-scripts/ifcfg-bond1.$vlanId + echo "BOOTPROTO=none" >> /etc/sysconfig/network-scripts/ifcfg-bond1.$vlanId + echo "VLAN=yes" >> /etc/sysconfig/network-scripts/ifcfg-bond1.$vlanId + echo "BRIDGE=xenbr1.$vlanId" >> /etc/sysconfig/network-scripts/ifcfg-bond1.$vlanId + + # Try to add xenbr1.$vlanId over bond1.$vlanId, if it does not already exist + + ifconfig xenbr1.$vlanId > /dev/null + if [ $? -gt 0 ] then - ifconfig $vlanDev up > /dev/null - fi - - if [ ! -d /sys/class/net/$vlanBr ] - then - brctl addbr $vlanBr > /dev/null + brctl addbr xenbr1.$vlanId if [ $? -gt 0 ] then - printf "Failed to create br: $vlanBr" - return 2 + return 1 fi - fi - #pif is eslaved into vlanBr? - ls /sys/class/net/$vlanBr/brif/ |grep -w "$vlanDev" > /dev/null - if [ $? -gt 0 ] - then - brctl addif $vlanBr $vlanDev > /dev/null + brctl addif xenbr1.$vlanId bond1.$vlanId + if [ $? -gt 0 ] then - printf "Failed to add vlan: $vlanDev to $vlanBr" - return 3 + return 1 fi + fi - # is vlanBr up? - ifconfig |grep -w $vlanBr > /dev/null + + ifconfig xenbr1.$vlanId up + if [ $? -gt 0 ] then - ifconfig $vlanBr up + return 1 fi + + # Make ifcfg-xenbr1.$vlanId + rm /etc/sysconfig/network-scripts/ifcfg-xenbr1.$vlanId + touch /etc/sysconfig/network-scripts/ifcfg-xenbr1.$vlanId + echo "TYPE=bridge" >> /etc/sysconfig/network-scripts/ifcfg-xenbr1.$vlanId + echo "DEVICE=xenbr1.$vlanId" >> /etc/sysconfig/network-scripts/ifcfg-xenbr1.$vlanId + echo "ONBOOT=yes" >> /etc/sysconfig/network-scripts/ifcfg-xenbr1.$vlanId + echo "BOOTPROTO=none" >> /etc/sysconfig/network-scripts/ifcfg-xenbr1.$vlanId return 0 } deleteVlan() { local vlanId=$1 - local pif=$2 - local vlanDev=$pif.$vlanId - local vlanBr=$VIRBR$vlanId - - vconfig rem $vlanDev > /dev/null - if [ $? -gt 0 ] - then - printf "Failed to del vlan: $vlanId" - return 1 - fi - - ifconfig $vlanBr down + # Try to remove xenbr1.$vlanId + ifconfig xenbr1.$vlanId down if [ $? -gt 0 ] then return 1 fi - brctl delbr $vlanBr + brctl delbr xenbr1.$vlanId if [ $? -gt 0 ] then - printf "Failed to del bridge $vlanBr" return 1 fi + + # Remove ifcfg-xenbr1.$vlanId + rm /etc/sysconfig/network-scripts/ifcfg-xenbr1.$vlanId + + # Try to remove bond1.$vlanId + vconfig rem bond1.$vlanId + + if [ $? -gt 0 ] + then + return 1 + fi + + # Remove ifcfg-bond1.$vlanId + rm /etc/sysconfig/network-scripts/ifcfg-bond1.$vlanId + return 0 } +checkIfVlanExists() { + local vlanId=$1 + + if [ "$vlanId" == "untagged" ] + then + # This VLAN should always exist, since the bridge is xenbr1, which is created during vsetup + return 0 + fi + + ifconfig bond1.$vlanId > /dev/null + + if [ $? -gt 0 ] + then + return 1 + fi + + ifconfig xenbr1.$vlanId > /dev/null + + if [ $? -gt 0 ] + then + return 1 + fi + + if [ ! -f /etc/sysconfig/network-scripts/ifcfg-xenbr1.$vlanId ] + then + return 1 + fi + + if [ ! -f /etc/sysconfig/network-scripts/ifcfg-bond1.$vlanId ] + then + return 1 + fi + + return 0 +} + +arpingVlan() { + local vlanId=$1 + local vlanGateway=$2 + + # Change!!! + return 0 + + success=1 + for i in $(seq 1 3) + do + arping -I xenbr1.$vlanId $vlanGateway > /dev/null + + if [ $? -gt 0 ] + then + success=0 + break + fi + done + + return $success +} + op= vlanId= +vlanGateway= option=$@ -while getopts 'o:v:p:' OPTION +while getopts 'o:v:g:' OPTION do case $OPTION in o) oflag=1 @@ -112,8 +183,8 @@ do v) vflag=1 vlanId="$OPTARG" ;; - p) pflag=1 - pif="$OPTARG" + g) gflag=1 + vlanGateway="$OPTARG" ;; ?) usage exit 2 @@ -122,7 +193,7 @@ do done # Check that all arguments were passed in -if [ "$oflag$vflag$pflag" != "111" ] +if [ "$oflag$vflag$gflag" != "111" ] then usage exit 2 @@ -130,19 +201,39 @@ fi if [ "$op" == "add" ] then + # Check if the vlan already exists, and exit with success if it does + checkIfVlanExists $vlanId + + if [ $? -eq 0 ] + then + exit 0 + fi + # Add the vlan - addVlan $vlanId $pif + addVlan $vlanId # If the add fails then return failure if [ $? -gt 0 ] then exit 1 fi + + # Ping the vlan + arpingVlan $vlanId $vlanGateway + + # If the ping fails then delete the vlan and return failure. Else, return success. + if [ $? -gt 0 ] + then + deleteVlan $vlanId + exit 1 + else + exit 0 + fi else if [ "$op" == "delete" ] then # Delete the vlan - deleteVlan $vlanId $pif + deleteVlan $vlanId # Always exit with success exit 0 diff --git a/scripts/vm/network/vnet/vnetcleanup.sh b/scripts/vm/network/vnet/vnetcleanup.sh index c58bd1aa660..dceff317303 100755 --- a/scripts/vm/network/vnet/vnetcleanup.sh +++ b/scripts/vm/network/vnet/vnetcleanup.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: vnetcleanup.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/network/vnet/vnetcleanup.sh $ +# $Id: vnetcleanup.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/network/vnet/vnetcleanup.sh $ # vnetcleanup.sh -- clean up vnet artifacts (mainly bridges) # diff --git a/scripts/vm/pingtest.sh b/scripts/vm/pingtest.sh index 02f61eb06cd..f31f5f08f36 100755 --- a/scripts/vm/pingtest.sh +++ b/scripts/vm/pingtest.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: pingtest.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/pingtest.sh $ +# $Id: pingtest.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/pingtest.sh $ # pingtest.sh -- ping # # diff --git a/scripts/vm/storage/iscsi/comstar/iscsi_common.sh b/scripts/vm/storage/iscsi/comstar/iscsi_common.sh index 71e9d22c7ad..26846b4280e 100755 --- a/scripts/vm/storage/iscsi/comstar/iscsi_common.sh +++ b/scripts/vm/storage/iscsi/comstar/iscsi_common.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: iscsi_common.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/comstar/iscsi_common.sh $ +# $Id: iscsi_common.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/comstar/iscsi_common.sh $ # iscsi_common.sh -- mount volume from ISCSI server # # diff --git a/scripts/vm/storage/iscsi/comstar/mapiscsi.sh b/scripts/vm/storage/iscsi/comstar/mapiscsi.sh index b4b35ca6a8c..9d41cfbb753 100755 --- a/scripts/vm/storage/iscsi/comstar/mapiscsi.sh +++ b/scripts/vm/storage/iscsi/comstar/mapiscsi.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: mapiscsi.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/comstar/mapiscsi.sh $ +# $Id: mapiscsi.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/comstar/mapiscsi.sh $ # mapiscsi.sh -- list of active iscsi sessions and the corresponding VM # # COMSTAR version diff --git a/scripts/vm/storage/iscsi/comstar/mountrootdisk.sh b/scripts/vm/storage/iscsi/comstar/mountrootdisk.sh index fb1a934a846..d45ef912c05 100755 --- a/scripts/vm/storage/iscsi/comstar/mountrootdisk.sh +++ b/scripts/vm/storage/iscsi/comstar/mountrootdisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: mountrootdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/comstar/mountrootdisk.sh $ +# $Id: mountrootdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/comstar/mountrootdisk.sh $ # mountrootdisk.sh -- mount image directory from NFS and ISCSI server # # diff --git a/scripts/vm/storage/iscsi/comstar/mountvm.sh b/scripts/vm/storage/iscsi/comstar/mountvm.sh index 980eb5e3a98..a749c867ab1 100755 --- a/scripts/vm/storage/iscsi/comstar/mountvm.sh +++ b/scripts/vm/storage/iscsi/comstar/mountvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: mountvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/comstar/mountvm.sh $ +# $Id: mountvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/comstar/mountvm.sh $ # mountvm.sh -- mount image directory from NFS and ISCSI server # # COMSTAR version diff --git a/scripts/vm/storage/iscsi/get_iqn.sh b/scripts/vm/storage/iscsi/get_iqn.sh index b54253315ea..505334698f5 100755 --- a/scripts/vm/storage/iscsi/get_iqn.sh +++ b/scripts/vm/storage/iscsi/get_iqn.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: get_iqn.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/get_iqn.sh $ +# $Id: get_iqn.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/get_iqn.sh $ # get_iqn.sh -- return iSCSI iqn of initiator (Linux) or target (OpenSolaris) usage() { diff --git a/scripts/vm/storage/iscsi/iscsi_common.sh b/scripts/vm/storage/iscsi/iscsi_common.sh index 667158a0cd1..ff91d7f0698 100755 --- a/scripts/vm/storage/iscsi/iscsi_common.sh +++ b/scripts/vm/storage/iscsi/iscsi_common.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: iscsi_common.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/iscsi_common.sh $ +# $Id: iscsi_common.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/iscsi_common.sh $ # iscsi_common.sh -- mount volume from ISCSI server # # diff --git a/scripts/vm/storage/iscsi/iscsikill.sh b/scripts/vm/storage/iscsi/iscsikill.sh index d4dbb34ae2a..b0ae1b497ae 100755 --- a/scripts/vm/storage/iscsi/iscsikill.sh +++ b/scripts/vm/storage/iscsi/iscsikill.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: iscsikill.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/iscsikill.sh $ +# $Id: iscsikill.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/iscsikill.sh $ # # iscsikill.sh # diff --git a/scripts/vm/storage/iscsi/iscsimon.sh b/scripts/vm/storage/iscsi/iscsimon.sh index 9dac2395558..2de42928bb9 100755 --- a/scripts/vm/storage/iscsi/iscsimon.sh +++ b/scripts/vm/storage/iscsi/iscsimon.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: iscsimon.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/iscsimon.sh $ +# $Id: iscsimon.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/iscsimon.sh $ # # iscsimon.sh # diff --git a/scripts/vm/storage/iscsi/mapiscsi.sh b/scripts/vm/storage/iscsi/mapiscsi.sh index 536c068d996..ad4cbe85503 100755 --- a/scripts/vm/storage/iscsi/mapiscsi.sh +++ b/scripts/vm/storage/iscsi/mapiscsi.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: mapiscsi.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/mapiscsi.sh $ +# $Id: mapiscsi.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/mapiscsi.sh $ # mapiscsi.sh -- list of active iscsi sessions and the corresponding VM # diff --git a/scripts/vm/storage/iscsi/mirror.sh b/scripts/vm/storage/iscsi/mirror.sh index 33f29a0f6a0..2187163bc3c 100755 --- a/scripts/vm/storage/iscsi/mirror.sh +++ b/scripts/vm/storage/iscsi/mirror.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: mirror.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/mirror.sh $ +# $Id: mirror.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/mirror.sh $ # mirror.sh -- modify a mirrored disk # # diff --git a/scripts/vm/storage/iscsi/mirror_common.sh b/scripts/vm/storage/iscsi/mirror_common.sh index 37245d27fb1..41744642045 100755 --- a/scripts/vm/storage/iscsi/mirror_common.sh +++ b/scripts/vm/storage/iscsi/mirror_common.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: mirror_common.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/mirror_common.sh $ +# $Id: mirror_common.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/mirror_common.sh $ # mirror_common.sh -- md operations # # diff --git a/scripts/vm/storage/iscsi/mountdatadisk.sh b/scripts/vm/storage/iscsi/mountdatadisk.sh index 968b3a1f261..06f26274f3f 100755 --- a/scripts/vm/storage/iscsi/mountdatadisk.sh +++ b/scripts/vm/storage/iscsi/mountdatadisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: mountdatadisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/mountdatadisk.sh $ +# $Id: mountdatadisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/mountdatadisk.sh $ # mountdatadisk.sh -- mount/unmount data disk from ISCSI server # # diff --git a/scripts/vm/storage/iscsi/mountrootdisk.sh b/scripts/vm/storage/iscsi/mountrootdisk.sh index 0255b7d692c..fac9d60fc9e 100755 --- a/scripts/vm/storage/iscsi/mountrootdisk.sh +++ b/scripts/vm/storage/iscsi/mountrootdisk.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: mountrootdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/mountrootdisk.sh $ +# $Id: mountrootdisk.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/mountrootdisk.sh $ # mountrootdisk.sh -- mount image directory from NFS and ISCSI server # # diff --git a/scripts/vm/storage/iscsi/mountvm.sh b/scripts/vm/storage/iscsi/mountvm.sh index 8e7c1b1ab18..606b939af3e 100755 --- a/scripts/vm/storage/iscsi/mountvm.sh +++ b/scripts/vm/storage/iscsi/mountvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: mountvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/iscsi/mountvm.sh $ +# $Id: mountvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/iscsi/mountvm.sh $ # mountvm.sh -- mount image directory from NFS and ISCSI server # # diff --git a/scripts/vm/storage/nfs/mountvm.sh b/scripts/vm/storage/nfs/mountvm.sh index f25f531b1a4..939b2ea96dc 100755 --- a/scripts/vm/storage/nfs/mountvm.sh +++ b/scripts/vm/storage/nfs/mountvm.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# $Id: mountvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/storage/nfs/mountvm.sh $ +# $Id: mountvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x.beta/java/scripts/vm/storage/nfs/mountvm.sh $ # mounvm.sh -- mount a remote nfs directory as the image directory # # diff --git a/server/.classpath b/server/.classpath index 52f2d3852ad..f8eeb986486 100644 --- a/server/.classpath +++ b/server/.classpath @@ -1,24 +1,23 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/conf/log4j-cloud.xml.in b/server/conf/log4j-cloud.xml.in index adf3fd9ce30..b9bab1b0491 100755 --- a/server/conf/log4j-cloud.xml.in +++ b/server/conf/log4j-cloud.xml.in @@ -10,7 +10,7 @@ - + diff --git a/server/src/com/cloud/agent/manager/AgentAttache.java b/server/src/com/cloud/agent/manager/AgentAttache.java index c95b4488edc..06353e0b460 100644 --- a/server/src/com/cloud/agent/manager/AgentAttache.java +++ b/server/src/com/cloud/agent/manager/AgentAttache.java @@ -36,7 +36,6 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.CheckHealthCommand; import com.cloud.agent.api.CheckVirtualMachineCommand; import com.cloud.agent.api.Command; -import com.cloud.agent.api.MaintainCommand; import com.cloud.agent.api.MigrateCommand; import com.cloud.agent.api.PingTestCommand; import com.cloud.agent.api.ReadyCommand; @@ -50,6 +49,7 @@ import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.OperationTimedoutException; import com.cloud.host.Status; import com.cloud.utils.concurrency.NamedThreadFactory; +import com.cloud.agent.api.MaintainCommand; /** * AgentAttache provides basic commands to be implemented. diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index a34cd13381f..6cd43204d21 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -105,13 +105,12 @@ import com.cloud.maint.UpgradeManager; import com.cloud.network.IPAddressVO; import com.cloud.network.NetworkManager; import com.cloud.network.dao.IPAddressDao; -import com.cloud.offering.ServiceOffering; import com.cloud.resource.Discoverer; import com.cloud.resource.ServerResource; +import com.cloud.service.ServiceOffering; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.storage.StoragePoolVO; -import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VirtualMachineTemplate; import com.cloud.storage.Volume.StorageResourceType; @@ -123,7 +122,6 @@ import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.resource.DummySecondaryStorageResource; import com.cloud.user.dao.UserStatisticsDao; -import com.cloud.uservm.UserVm; import com.cloud.utils.ActionDelegate; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; @@ -142,6 +140,7 @@ import com.cloud.utils.nio.Link; import com.cloud.utils.nio.NioServer; import com.cloud.utils.nio.Task; import com.cloud.vm.State; +import com.cloud.vm.UserVm; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VmCharacteristics; import com.cloud.vm.dao.VMInstanceDao; @@ -493,7 +492,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory { } s_logger.warn("Unable to find the server resources at " + url); - throw new DiscoveryException("Unable to add the host"); + return hosts; } @DB @@ -595,15 +594,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory { AgentAttache attache = _agents.get(hostId); handleDisconnect(attache, Status.Event.Remove, false); - - //now delete the host _hostDao.remove(secStorageHost.getId()); - - //delete the templates associated with this host - SearchCriteria templateHostSC = _vmTemplateHostDao.createSearchCriteria(); - templateHostSC.addAnd("hostId", SearchCriteria.Op.EQ, secStorageHost.getId()); - _vmTemplateHostDao.remove(templateHostSC); - txn.commit(); return true; }catch (Throwable t) { @@ -1301,9 +1292,6 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory { } public boolean checkCIDR(Host.Type type, HostPodVO pod, String serverPrivateIP, String serverPrivateNetmask) { - if (serverPrivateIP == null) { - return true; - } // Get the CIDR address and CIDR size String cidrAddress = pod.getCidrAddress(); long cidrSize = pod.getCidrSize(); @@ -1331,9 +1319,6 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory { if (type == Host.Type.Storage || type == Host.Type.ConsoleProxy) return; - if (serverPrivateIP == null) { - return; - } // Get the CIDR address and CIDR size String cidrAddress = pod.getCidrAddress(); long cidrSize = pod.getCidrSize(); @@ -1740,7 +1725,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory { // create capacity entries if none exist for this server private void createCapacityEntry(final StartupCommand startup, HostVO server) { - SearchCriteria capacitySC = _capacityDao.createSearchCriteria(); + SearchCriteria capacitySC = _capacityDao.createSearchCriteria(); capacitySC.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, server.getId()); capacitySC.addAnd("dataCenterId", SearchCriteria.Op.EQ, server.getDataCenterId()); capacitySC.addAnd("podId", SearchCriteria.Op.EQ, server.getPodId()); diff --git a/server/src/com/cloud/agent/manager/allocator/HostAllocator.java b/server/src/com/cloud/agent/manager/allocator/HostAllocator.java index c4427b07be3..29f1b952e4b 100755 --- a/server/src/com/cloud/agent/manager/allocator/HostAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/HostAllocator.java @@ -22,11 +22,11 @@ import java.util.Set; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.host.Host; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; -import com.cloud.uservm.UserVm; import com.cloud.utils.component.Adapter; +import com.cloud.vm.UserVm; import com.cloud.vm.VmCharacteristics; public interface HostAllocator extends Adapter { diff --git a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java index 04bc8e47b61..b192344bc65 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java @@ -38,7 +38,7 @@ import com.cloud.host.HostVO; import com.cloud.host.Host.Type; import com.cloud.host.dao.DetailsDao; import com.cloud.host.dao.HostDao; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.storage.GuestOSVO; @@ -48,12 +48,12 @@ import com.cloud.storage.VMTemplateVO; import com.cloud.storage.dao.GuestOSCategoryDao; import com.cloud.storage.dao.GuestOSDao; import com.cloud.storage.dao.StoragePoolHostDao; -import com.cloud.uservm.UserVm; import com.cloud.utils.NumbersUtil; import com.cloud.utils.component.ComponentLocator; import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.SecondaryStorageVmVO; +import com.cloud.vm.UserVm; import com.cloud.vm.UserVmVO; import com.cloud.vm.VmCharacteristics; import com.cloud.vm.dao.ConsoleProxyDao; diff --git a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java index 90aa10e3c12..8147292ffaa 100644 --- a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java @@ -28,7 +28,7 @@ import com.cloud.agent.manager.allocator.HostAllocator; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.host.Host; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; import com.cloud.vm.VmCharacteristics; diff --git a/server/src/com/cloud/agent/manager/allocator/impl/RandomAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/RandomAllocator.java index 75c23fd225c..aec686ce0f2 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/RandomAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/RandomAllocator.java @@ -31,11 +31,11 @@ import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.host.Host; import com.cloud.host.dao.HostDao; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; -import com.cloud.uservm.UserVm; import com.cloud.utils.component.ComponentLocator; +import com.cloud.vm.UserVm; import com.cloud.vm.VmCharacteristics; @Local(value=HostAllocator.class) diff --git a/server/src/com/cloud/agent/manager/allocator/impl/RecreateHostAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/RecreateHostAllocator.java index 224b00e32f8..50bcaee3b32 100644 --- a/server/src/com/cloud/agent/manager/allocator/impl/RecreateHostAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/RecreateHostAllocator.java @@ -34,7 +34,7 @@ import com.cloud.dc.PodCluster; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.HostPodDao; import com.cloud.host.Host; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.dao.StoragePoolDao; diff --git a/server/src/com/cloud/agent/manager/allocator/impl/TestingAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/TestingAllocator.java index 2f89fb8922e..73d41857e4e 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/TestingAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/TestingAllocator.java @@ -27,11 +27,11 @@ import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.host.Host; import com.cloud.host.dao.HostDao; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; -import com.cloud.uservm.UserVm; import com.cloud.utils.component.ComponentLocator; +import com.cloud.vm.UserVm; import com.cloud.vm.VmCharacteristics; /** diff --git a/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java index 9d5d50442f5..27f334675e3 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java @@ -36,9 +36,9 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.HostPodDao; -import com.cloud.offering.ServiceOffering; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.service.ServiceOffering; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.VirtualMachineTemplate; import com.cloud.storage.VolumeVO; @@ -156,7 +156,7 @@ public class UserConcentratedAllocator implements PodAllocator { private boolean dataCenterAndPodHasEnoughCapacity(long dataCenterId, long podId, long capacityNeeded, short capacityType, long[] hostCandidate) { if (m_capacityCheckLock.lock(120)) { // 2 minutes try { - SearchCriteria sc = _capacityDao.createSearchCriteria(); + SearchCriteria sc = _capacityDao.createSearchCriteria(); sc.addAnd("capacityType", SearchCriteria.Op.EQ, capacityType); sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, dataCenterId); sc.addAnd("podId", SearchCriteria.Op.EQ, podId); diff --git a/server/src/com/cloud/alert/AlertManagerImpl.java b/server/src/com/cloud/alert/AlertManagerImpl.java index 1ad3fe7076b..b1c055dbe1c 100644 --- a/server/src/com/cloud/alert/AlertManagerImpl.java +++ b/server/src/com/cloud/alert/AlertManagerImpl.java @@ -31,11 +31,11 @@ import java.util.TimerTask; import javax.ejb.Local; import javax.mail.Authenticator; -import javax.mail.Message.RecipientType; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.URLName; +import javax.mail.Message.RecipientType; import javax.mail.internet.InternetAddress; import javax.naming.ConfigurationException; @@ -45,6 +45,7 @@ import com.cloud.alert.dao.AlertDao; import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.consoleproxy.ConsoleProxyManager; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.DataCenterDao; @@ -55,11 +56,11 @@ import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.dao.HostDao; import com.cloud.network.dao.IPAddressDao; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; -import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.StoragePoolVO; +import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.utils.NumbersUtil; @@ -70,6 +71,7 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.SecondaryStorageVmVO; +import com.cloud.vm.State; import com.cloud.vm.UserVmVO; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao; @@ -118,6 +120,8 @@ public class AlertManagerImpl implements AlertManager { private double _publicIPCapacityThreshold = 0.75; private double _privateIPCapacityThreshold = 0.75; + private int _routerRamSize; + private int _proxyRamSize; private final GlobalLock m_capacityCheckLock = GlobalLock.getInternLock("capacity.check"); @Override @@ -272,6 +276,9 @@ public class AlertManagerImpl implements AlertManager { } } + _routerRamSize = NumbersUtil.parseInt(configs.get("router.ram.size"), 128); + _proxyRamSize = NumbersUtil.parseInt(configs.get("consoleproxy.ram.size"), ConsoleProxyManager.DEFAULT_PROXY_VM_RAMSIZE); + _timer = new Timer("CapacityChecker"); return true; @@ -336,7 +343,7 @@ public class AlertManagerImpl implements AlertManager { _capacityDao.clearNonStorageCapacities(); // get all hosts.. - SearchCriteria sc = _hostDao.createSearchCriteria(); + SearchCriteria sc = _hostDao.createSearchCriteria(); sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString()); List hosts = _hostDao.search(sc, null); diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 6e9484c72af..47e8778543a 100644 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -1,5 +1,4 @@ /** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. * * This software is licensed under the GNU General Public License v3 or later. @@ -25,14 +24,10 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InterruptedIOException; -import java.lang.reflect.Field; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.URLEncoder; -import java.security.SecureRandom; -import java.text.DateFormat; -import java.text.ParseException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -41,7 +36,6 @@ import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; -import java.util.StringTokenizer; import java.util.TimeZone; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; @@ -78,7 +72,6 @@ import org.apache.http.protocol.ResponseDate; import org.apache.http.protocol.ResponseServer; import org.apache.log4j.Logger; -import com.cloud.api.BaseCmd.CommandType; import com.cloud.configuration.ConfigurationVO; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.domain.DomainVO; @@ -88,7 +81,6 @@ import com.cloud.user.Account; import com.cloud.user.User; import com.cloud.user.UserAccount; import com.cloud.user.UserContext; -import com.cloud.utils.DateUtil; import com.cloud.utils.Pair; import com.cloud.utils.PropertiesUtil; import com.cloud.utils.component.ComponentLocator; @@ -96,7 +88,7 @@ import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.encoding.Base64; -import com.cloud.utils.exception.CloudRuntimeException; + public class ApiServer implements HttpRequestHandler { private static final Logger s_logger = Logger.getLogger(ApiServer.class.getName()); @@ -116,7 +108,7 @@ public class ApiServer implements HttpRequestHandler { private static List s_resellerCommands = null; // AKA domain-admin private static List s_adminCommands = null; private static List s_readOnlyAdminCommands = null; - + private static ExecutorService _executor = new ThreadPoolExecutor(10, 150, 60, TimeUnit.SECONDS, new LinkedBlockingQueue(), new NamedThreadFactory("ApiServer")); static { @@ -184,7 +176,7 @@ public class ApiServer implements HttpRequestHandler { int apiPort = 8096; // default port ConfigurationDao configDao = ComponentLocator.getLocator(ManagementServer.Name).getDao(ConfigurationDao.class); - SearchCriteria sc = configDao.createSearchCriteria(); + SearchCriteria sc = configDao.createSearchCriteria(); sc.addAnd("name", SearchCriteria.Op.EQ, "integration.api.port"); List values = configDao.search(sc, null); if ((values != null) && (values.size() > 0)) { @@ -239,7 +231,7 @@ public class ApiServer implements HttpRequestHandler { } try { // always trust commands from API port, user context will always be UID_SYSTEM/ACCOUNT_ID_SYSTEM - UserContext.registerContext(User.UID_SYSTEM, null, null, Account.ACCOUNT_ID_SYSTEM, null, null, true); + UserContext.registerContext(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, null, true); String responseText = handleRequest(parameterMap, true, responseType); sb.append(" 200 " + ((responseText == null) ? 0 : responseText.length())); @@ -286,7 +278,7 @@ public class ApiServer implements HttpRequestHandler { } response = buildErrorResponse("invalid request, no command sent", responseType); } else { - Map paramMap = new HashMap(); + Map paramMap = new HashMap(); Set keys = params.keySet(); Iterator keysIter = keys.iterator(); while (keysIter.hasNext()) { @@ -294,7 +286,7 @@ public class ApiServer implements HttpRequestHandler { if ("command".equalsIgnoreCase(key)) { continue; } - String[] value = (String[])params.get(key); + Object[] value = (Object[])params.get(key); paramMap.put(key, value[0]); } String cmdClassName = _apiCommands.getProperty(command[0]); @@ -302,43 +294,8 @@ public class ApiServer implements HttpRequestHandler { Class cmdClass = Class.forName(cmdClassName); BaseCmd cmdObj = (BaseCmd)cmdClass.newInstance(); cmdObj.setManagementServer(_ms); - Map unpackedParams = cmdObj.unpackParams(paramMap, decode); - Field[] fields = cmdClass.getDeclaredFields(); - for (Field field : fields) { - Parameter parameterAnnotation = field.getAnnotation(Parameter.class); - if (parameterAnnotation == null) { - continue; - } - Object paramObj = unpackedParams.get(parameterAnnotation.name()); - if (paramObj == null) { - if (parameterAnnotation.required()) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to execute API command " + cmdObj.getName() + " due to missing parameter " + parameterAnnotation.name()); - } - continue; - } - - // marshall the parameter into the correct type and set the field value - try { - setFieldValue(field, cmdObj, paramObj, parameterAnnotation); - } catch (IllegalArgumentException argEx) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to execute API command " + cmdObj.getName() + " due to invalid value " + paramObj + " for parameter " + parameterAnnotation.name()); - } - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to execute API command " + cmdObj.getName() + " due to invalid value " + paramObj + " for parameter " + parameterAnnotation.name()); - } catch (ParseException parseEx) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Invalid date parameter " + paramObj + " passed to command " + cmdObj.getName()); - } - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to parse date " + paramObj + " for command " + cmdObj.getName() + ", please pass dates in the format yyyy-MM-dd"); - } catch (CloudRuntimeException cloudEx) { - // FIXME: Better error message? This only happens if the API command is not executable, which typically means there was - // and IllegalAccessException setting one of the parameters. - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error executing API command " + cmdObj.getName()); - } - } - Map validatedParams = cmdObj.validateParams(paramMap, decode); - + List> resultValues = cmdObj.execute(validatedParams); response = cmdObj.buildResponse(resultValues, responseType); } else { @@ -441,21 +398,14 @@ public class ApiServer implements HttpRequestHandler { } if (account.getType() == Account.ACCOUNT_TYPE_NORMAL) { - UserContext.updateContext(user.getId(), account, account.getAccountName(), account.getId(), account.getDomainId(), null); - - /* requestParameters.put(BaseCmd.Properties.USER_ID.getName(), new String[] { user.getId().toString() }); requestParameters.put(BaseCmd.Properties.ACCOUNT.getName(), new String[] { account.getAccountName() }); requestParameters.put(BaseCmd.Properties.DOMAIN_ID.getName(), new String[] { account.getDomainId().toString() }); requestParameters.put(BaseCmd.Properties.ACCOUNT_OBJ.getName(), new Object[] { account }); - */ } else { - UserContext.updateContext(user.getId(), account, null, null, null, null); - /* requestParameters.put(BaseCmd.Properties.USER_ID.getName(), new String[] { user.getId().toString() }); requestParameters.put(BaseCmd.Properties.ACCOUNT_OBJ.getName(), new Object[] { account }); - */ - } + } if (!isCommandAvailable(account.getType(), commandName)) { return false; @@ -514,7 +464,7 @@ public class ApiServer implements HttpRequestHandler { java.util.Date date = new java.util.Date(); long longDate = date.getTime(); - float offsetInMs = (t.getOffset(longDate)); + float offsetInMs = (float)(t.getOffset(longDate)); offsetInHrs = offsetInMs/ (1000*60*60); s_logger.info("Timezone offset from UTC is: "+offsetInHrs); } @@ -538,37 +488,24 @@ public class ApiServer implements HttpRequestHandler { if (directAttachedUntaggedEnabled == null) directAttachedUntaggedEnabled = "false"; - String systemVmUseLocalStorage = _ms.getConfigurationValue("system.vm.use.local.storage"); - if (systemVmUseLocalStorage == null) - systemVmUseLocalStorage = "false"; - // set the userId and account object for everyone - loginParams.add(new Pair(BaseCmd.Properties.USER_ID.getName(), userAcct.getId().toString())); - loginParams.add(new Pair(BaseCmd.Properties.USERNAME.getName(), userAcct.getUsername())); - loginParams.add(new Pair(BaseCmd.Properties.FIRSTNAME.getName(), userAcct.getFirstname())); - loginParams.add(new Pair(BaseCmd.Properties.LASTNAME.getName(), userAcct.getLastname())); - loginParams.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ.getName(), account)); - loginParams.add(new Pair(BaseCmd.Properties.ACCOUNT.getName(), account.getAccountName())); - loginParams.add(new Pair(BaseCmd.Properties.DOMAIN_ID.getName(), account.getDomainId().toString())); - loginParams.add(new Pair(BaseCmd.Properties.TYPE.getName(), Short.valueOf(account.getType()).toString())); - loginParams.add(new Pair(BaseCmd.Properties.NETWORK_TYPE.getName(), networkType)); - loginParams.add(new Pair(BaseCmd.Properties.HYPERVISOR_TYPE.getName(), hypervisorType)); - loginParams.add(new Pair(BaseCmd.Properties.DIRECT_ATTACH_NETWORK_GROUPS_ENABLED.getName(), directAttachNetworkGroupsEnabled)); - loginParams.add(new Pair(BaseCmd.Properties.DIRECT_ATTACHED_UNTAGGED_ENABLED.getName(), directAttachedUntaggedEnabled)); - loginParams.add(new Pair(BaseCmd.Properties.SYSTEM_VM_USE_LOCAL_STORAGE.getName(), systemVmUseLocalStorage)); - if (timezone != null) { - loginParams.add(new Pair(BaseCmd.Properties.TIMEZONE.getName(), timezone)); - loginParams.add(new Pair(BaseCmd.Properties.TIMEZONE_OFFSET.getName(), Float.valueOf(offsetInHrs).toString())); + loginParams.add(new Pair("userId", userAcct.getId().toString())); + loginParams.add(new Pair("userName", userAcct.getUsername())); + loginParams.add(new Pair("firstName", userAcct.getFirstname())); + loginParams.add(new Pair("lastName", userAcct.getLastname())); + loginParams.add(new Pair("accountobj", account)); + loginParams.add(new Pair("account", account.getAccountName())); + loginParams.add(new Pair("domainId", account.getDomainId().toString())); + loginParams.add(new Pair("type", new Short(account.getType()))); + loginParams.add(new Pair("networkType", networkType)); + loginParams.add(new Pair("hypervisorType", hypervisorType)); + loginParams.add(new Pair("directAttachNetworkGroupsEnabled", directAttachNetworkGroupsEnabled)); + loginParams.add(new Pair("directAttachedUntaggedEnabled", directAttachedUntaggedEnabled)); + if (timezone!=null) { + loginParams.add(new Pair("timezone", timezone)); + loginParams.add(new Pair("timezoneOffset", offsetInHrs)); } - // (bug 5483) generate a session key that the user must submit on every request to prevent CSRF, add that - // to the login response so that session-based authenticators know to send the key back - SecureRandom sesssionKeyRandom = new SecureRandom(); - byte sessionKeyBytes[] = new byte[20]; - sesssionKeyRandom.nextBytes(sessionKeyBytes); - String sessionKey = Base64.encodeBytes(sessionKeyBytes); - loginParams.add(new Pair(BaseCmd.Properties.SESSION_KEY.getName(), sessionKey)); - return loginParams; } return null; @@ -654,64 +591,6 @@ public class ApiServer implements HttpRequestHandler { return sb.toString(); } - @SuppressWarnings("unchecked") - private void setFieldValue(Field field, BaseCmd cmdObj, Object paramObj, Parameter annotation) throws IllegalArgumentException, ParseException { - try { - field.setAccessible(true); - CommandType fieldType = annotation.type(); - switch (fieldType) { - case BOOLEAN: - field.set(cmdObj, Boolean.valueOf(paramObj.toString())); - break; - case DATE: - DateFormat format = BaseCmd.INPUT_FORMAT; - synchronized (format) { - field.set(cmdObj, format.parse(paramObj.toString())); - } - break; - case FLOAT: - field.set(cmdObj, Float.valueOf(paramObj.toString())); - break; - case INTEGER: - field.set(cmdObj, Integer.valueOf(paramObj.toString())); - break; - case LIST: - List listParam = new ArrayList(); - StringTokenizer st = new StringTokenizer(paramObj.toString(), ","); - while (st.hasMoreTokens()) { - String token = st.nextToken(); - CommandType listType = annotation.collectionType(); - switch (listType) { - case INTEGER: - listParam.add(Integer.valueOf(token)); - break; - case LONG: - listParam.add(Long.valueOf(token)); - break; - } - } - field.set(cmdObj, listParam); - break; - case LONG: - field.set(cmdObj, Long.valueOf(paramObj.toString())); - break; - case STRING: - field.set(cmdObj, paramObj.toString()); - break; - case TZDATE: - field.set(cmdObj, DateUtil.parseTZDateString(paramObj.toString())); - break; - case MAP: - default: - field.set(cmdObj, paramObj); - break; - } - } catch (IllegalAccessException ex) { - s_logger.error("Error initializing command " + cmdObj.getName() + ", field " + field.getName() + " is not accessible."); - throw new CloudRuntimeException("Internal error initializing parameters for command " + cmdObj.getName() + " [field " + field.getName() + " is not accessible]"); - } - } - // FIXME: the following two threads are copied from http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpServer.java // we have to cite a license if we are using this code directly, so we need to add the appropriate citation or modify the code to be very specific to our needs static class ListenerThread extends Thread { diff --git a/server/src/com/cloud/api/ApiServlet.java b/server/src/com/cloud/api/ApiServlet.java index 06fdb775d22..5b6c07b67d4 100644 --- a/server/src/com/cloud/api/ApiServlet.java +++ b/server/src/com/cloud/api/ApiServlet.java @@ -20,7 +20,6 @@ package com.cloud.api; import java.io.IOException; import java.io.OutputStream; -import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -154,23 +153,16 @@ public class ApiServlet extends HttpServlet { boolean isNew = ((session == null) ? true : session.isNew()); - // Initialize an empty context and we will update it after we have verified the request below, - // we no longer rely on web-session here, verifyRequest will populate user/account information - // if a API key exists - UserContext.registerContext(null, null, null, null, null, null, false); - String userId = null; - + Object accountObj = null; + String userId = null; + String account = null; + String domainId = null; + if (!isNew) { - userId = (String)session.getAttribute(BaseCmd.Properties.USER_ID.getName()); - String account = (String)session.getAttribute(BaseCmd.Properties.ACCOUNT.getName()); - String domainId = (String)session.getAttribute(BaseCmd.Properties.DOMAIN_ID.getName()); - Object accountObj = session.getAttribute(BaseCmd.Properties.ACCOUNT_OBJ.getName()); - String sessionKey = (String)session.getAttribute(BaseCmd.Properties.SESSION_KEY.getName()); - String[] sessionKeyParam = (String[])params.get(BaseCmd.Properties.SESSION_KEY.getName()); - if ((sessionKeyParam == null) || (sessionKey == null) || !sessionKey.equals(sessionKeyParam[0])) { - session.invalidate(); - resp.sendError(HttpServletResponse.SC_UNAUTHORIZED, "unable to verify user credentials"); - } + userId = (String)session.getAttribute("userId"); + account = (String)session.getAttribute("account"); + domainId = (String)session.getAttribute("domainId"); + accountObj = session.getAttribute("accountobj"); // Do a sanity check here to make sure the user hasn't already been deleted if ((userId != null) && (account != null) && (accountObj != null) && _apiServer.verifyUser(Long.valueOf(userId))) { @@ -179,19 +171,24 @@ public class ApiServlet extends HttpServlet { s_logger.info("missing command, ignoring request..."); resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "no command specified"); return; - } - UserContext.updateContext(Long.valueOf(userId), accountObj, account, ((Account)accountObj).getId(), Long.valueOf(domainId), session.getId()); + } } else { - // Invalidate the session to ensure we won't allow a request across management server restarts if the userId was serialized to the + // Clear out the variables we retrieved from the session and invalidate the session. This ensures + // we won't allow a request across management server restarts if the userId was serialized to the // stored session - session.invalidate(); - resp.sendError(HttpServletResponse.SC_UNAUTHORIZED, "unable to verify user credentials"); - return; + userId = null; + account = null; + accountObj = null; + session.invalidate(); } } + // Initialize an empty context and we will update it after we have verified the request below, + // we no longer rely on web-session here, verifyRequest will populate user/account information + // if a API key exists + UserContext.registerContext(null, null, null, false); + if (_apiServer.verifyRequest(params, userId)) { - /* if (accountObj != null) { Account userAccount = (Account)accountObj; if (userAccount.getType() == Account.ACCOUNT_TYPE_NORMAL) { @@ -208,19 +205,16 @@ public class ApiServlet extends HttpServlet { // update user context info here so that we can take information if the request is authenticated // via api key mechenism updateUserContext(params, session != null ? session.getId() : null); - */ try { String response = _apiServer.handleRequest(params, false, responseType); writeResponse(resp, response != null ? response : "", false, responseType); } catch (ServerApiException se) { resp.sendError(se.getErrorCode(), se.getDescription()); } - } else { - if (session != null) { - session.invalidate(); - } + } else { resp.sendError(HttpServletResponse.SC_UNAUTHORIZED, "unable to verify user credentials and/or request signature"); } + } catch (IOException ioex) { if (s_logger.isTraceEnabled()) { s_logger.trace("exception processing request: " + ioex); @@ -232,8 +226,7 @@ public class ApiServlet extends HttpServlet { UserContext.unregisterContext(); } } - - /* + private void updateUserContext(Map requestParameters, String sessionId) { String userIdStr = (String)(requestParameters.get(BaseCmd.Properties.USER_ID.getName())[0]); Account accountObj = (Account)(requestParameters.get(BaseCmd.Properties.ACCOUNT_OBJ.getName())[0]); @@ -247,8 +240,7 @@ public class ApiServlet extends HttpServlet { accountId = accountObj.getId(); UserContext.updateContext(userId, accountId, sessionId); - } - */ + } // FIXME: rather than isError, we might was to pass in the status code to give more flexibility private void writeResponse(HttpServletResponse resp, String response, boolean isError, String responseType) { @@ -278,34 +270,55 @@ public class ApiServlet extends HttpServlet { private String getLoginSuccessResponse(HttpSession session, String responseType) { StringBuffer sb = new StringBuffer(); - int inactiveInterval = session.getMaxInactiveInterval(); - - if (BaseCmd.RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { + int inactiveInterval = session.getMaxInactiveInterval(); + String account = (String)session.getAttribute("account"); + String userName = (String)session.getAttribute("userName"); + String firstName = (String)session.getAttribute("firstName"); + String lastName = (String)session.getAttribute("lastName"); + String domainid = (String)session.getAttribute("domainId"); + String networkType = (String)session.getAttribute("networkType"); + String hypervisorType = (String)session.getAttribute("hypervisorType"); + String directAttachNetworkGroupsEnabled = (String)session.getAttribute("directAttachNetworkGroupsEnabled"); + String directAttachedUntaggedEnabled = (String)session.getAttribute("directAttachedUntaggedEnabled"); + String timezone = (String)session.getAttribute("timezone"); + Float timezoneOffset = (Float)session.getAttribute("timezoneOffset"); + Short type = (Short)session.getAttribute("type"); + + if (BaseCmd.RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { sb.append("{ \"loginresponse\" : { "); - Enumeration attrNames = session.getAttributeNames(); - if (attrNames != null) { - sb.append("\"timeout\" : \"" + inactiveInterval + "\""); - while (attrNames.hasMoreElements()) { - String attrName = (String)attrNames.nextElement(); - Object attrObj = session.getAttribute(attrName); - if (attrObj instanceof String) { - sb.append(", \"" + attrName + "\" : \"" + (String)attrObj + "\""); - } - } + sb.append("\"timeout\" : \"" + inactiveInterval); + sb.append("\",\"username\" : \"" + userName); + sb.append("\", \"firstname\" : \"" + firstName); + sb.append("\", \"lastname\" : \"" + lastName); + sb.append("\",\"account\" : \"" + account); + sb.append("\", \"domainid\" : \"" + domainid); + sb.append("\", \"type\" : \"" + type); + sb.append("\", \"networktype\" : \"" + networkType); + if (timezoneOffset != null) { + sb.append("\", \"timezoneoffset\" : \"" + timezoneOffset.toString()); + sb.append("\", \"timezone\" : \"" + timezone); } - sb.append(" } }"); - } else { + sb.append("\",\"directattachnetworkgroupsenabled\" : \"" + directAttachNetworkGroupsEnabled); + sb.append("\",\"directattacheduntaggedenabled\" : \"" + directAttachedUntaggedEnabled); + sb.append("\", \"hypervisortype\" : \"" + hypervisorType); + sb.append("\" } }"); + } else { sb.append(""); sb.append("" + inactiveInterval + ""); - Enumeration attrNames = session.getAttributeNames(); - if (attrNames != null) { - while (attrNames.hasMoreElements()) { - String attrName = (String)attrNames.nextElement(); - String attr = (String)session.getAttribute(attrName); - sb.append("<" + attrName + ">" + attr + ""); - } + sb.append("" + userName + ""); + sb.append("" + firstName + ""); + sb.append("" + lastName + ""); + sb.append("" + account + ""); + sb.append("" + domainid + ""); + sb.append(""+ type + ""); + sb.append(""+ networkType + ""); + if (timezoneOffset != null) { + sb.append(""+ timezoneOffset.toString() + ""); + sb.append(""+ timezone + ""); } - + sb.append("" + directAttachNetworkGroupsEnabled + ""); + sb.append("" + directAttachedUntaggedEnabled + ""); + sb.append("" + hypervisorType + ""); sb.append(""); } return sb.toString(); diff --git a/server/src/com/cloud/api/BaseCmd.java b/server/src/com/cloud/api/BaseCmd.java index d54e75e24bf..56d92a6cec6 100644 --- a/server/src/com/cloud/api/BaseCmd.java +++ b/server/src/com/cloud/api/BaseCmd.java @@ -21,6 +21,7 @@ package com.cloud.api; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.text.DateFormat; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; @@ -34,6 +35,7 @@ import com.cloud.async.AsyncJobVO; import com.cloud.serializer.SerializerHelper; import com.cloud.server.ManagementServer; import com.cloud.user.Account; +import com.cloud.utils.DateUtil; import com.cloud.utils.Pair; public abstract class BaseCmd { @@ -43,13 +45,9 @@ public abstract class BaseCmd { public static final String RESPONSE_TYPE_XML = "xml"; public static final String RESPONSE_TYPE_JSON = "json"; -// private Map _params; + private Map _params; private ManagementServer _ms = null; - public enum CommandType { - BOOLEAN, DATE, FLOAT, INTEGER, LIST, LONG, OBJECT, MAP, STRING, TZDATE - } - public static final short TYPE_STRING = 0; public static final short TYPE_INT = 1; public static final short TYPE_LONG = 2; @@ -102,7 +100,7 @@ public abstract class BaseCmd { public static final int STORAGE_RESOURCE_IN_USE = 580; - public static final DateFormat INPUT_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + private static final DateFormat _format = new SimpleDateFormat("yyyy-MM-dd"); private static final DateFormat _outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); public enum Properties { @@ -111,18 +109,16 @@ public abstract class BaseCmd { ACCOUNT_NAMES("accounts", BaseCmd.TYPE_STRING, "accounts"), ACCOUNT_TYPE("accounttype", BaseCmd.TYPE_LONG, "accounttype"), ACCOUNT_OBJ("accountobj", BaseCmd.TYPE_OBJECT, "accountobj"), - ACTIVE_VIEWER_SESSIONS("activeviewersessions", BaseCmd.TYPE_INT, "activeviewersessions"), ADD("add", BaseCmd.TYPE_BOOLEAN, "add"), ALGORITHM("algorithm", BaseCmd.TYPE_STRING, "algorithm"), ALLOCATED("allocated", BaseCmd.TYPE_DATE, "allocated"), ALLOCATED_ONLY("allocatedonly", BaseCmd.TYPE_BOOLEAN, "allocatedOnly"), API_KEY("apikey", BaseCmd.TYPE_STRING, "apiKey"), APPLIED("applied", BaseCmd.TYPE_BOOLEAN, "applied"), - AVAILABLE("available", BaseCmd.TYPE_BOOLEAN, "available"), AVERAGE_LOAD("averageload",BaseCmd.TYPE_LONG,"averageLoad"), ASSIGN_DATE("assigneddate", BaseCmd.TYPE_DATE, "assigneddate"), - BITS("bits", BaseCmd.TYPE_INT, "bits"), BOOTABLE("bootable", BaseCmd.TYPE_BOOLEAN, "bootable"), + BITS("bits", BaseCmd.TYPE_INT, "bits"), BYTES_RECEIVED("receivedbytes", BaseCmd.TYPE_LONG, "receivedbytes"), BYTES_SENT("sentbytes", BaseCmd.TYPE_LONG, "sentbytes"), CAPABILITIES("capabilities", BaseCmd.TYPE_STRING, "capabilities"), @@ -131,10 +127,7 @@ public abstract class BaseCmd { CATEGORY("category", BaseCmd.TYPE_STRING, "category"), CLEANUP("cleanup", BaseCmd.TYPE_BOOLEAN, "cleanup"), CLOUD_IDENTIFIER("cloudidentifier", BaseCmd.TYPE_STRING, "cloudIdentifier"), - CLUSTER_ID("clusterid", BaseCmd.TYPE_LONG, "clusterid"), - CLUSTER_NAME("clustername", BaseCmd.TYPE_STRING, "clustername"), - CMD("cmd", BaseCmd.TYPE_STRING, "cmd"), - COMPONENT("component", BaseCmd.TYPE_STRING, "component"), + SIGNATURE("signature",BaseCmd.TYPE_STRING,"signature"), CONSOLE_HOST("consolehost", BaseCmd.TYPE_STRING, "consoleHost"), CONSOLE_IMAGE_URL("consoleimageurl", BaseCmd.TYPE_STRING, "consoleImageUrl"), CONSOLE_PASSWORD("consolepassword", BaseCmd.TYPE_STRING, "consolePassword"), @@ -157,67 +150,57 @@ public abstract class BaseCmd { CREATED("created", BaseCmd.TYPE_DATE, "created"), CROSS_ZONES("crossZones", BaseCmd.TYPE_BOOLEAN, "crosszones"), DAILY_MAX("dailymax", BaseCmd.TYPE_INT, "dailyMax"), + DESCRIPTION("description", BaseCmd.TYPE_STRING, "description"), + DEVICE_NAME("devicename", BaseCmd.TYPE_STRING, "deviceName"), + DISCONNECTED("disconnected", BaseCmd.TYPE_DATE, "disconnected"), DATA_DISK_OFFERING_ID("datadiskofferingid", BaseCmd.TYPE_LONG, "dataDiskOfferingId"), DATA_DISK_OFFERING_NAME("datadiskofferingname", BaseCmd.TYPE_LONG, "dataDiskOfferingName"), - DESCRIPTION("description", BaseCmd.TYPE_STRING, "description"), - DETAILS("details", BaseCmd.TYPE_OBJECT_MAP, "details"), - DEVICE_NAME("devicename", BaseCmd.TYPE_STRING, "deviceName"), - DIRECT_ATTACH_NETWORK_GROUPS_ENABLED("directattachnetworkgroupsenabled", BaseCmd.TYPE_BOOLEAN, "directAttachNetworkGroupsEnabled"), - DIRECT_ATTACHED_UNTAGGED_ENABLED("directattacheduntaggedenabled", BaseCmd.TYPE_BOOLEAN, "directAttachedUntaggedEnabled"), - SYSTEM_VM_USE_LOCAL_STORAGE("systemvmuselocalstorage", BaseCmd.TYPE_BOOLEAN, "systemVmUseLocalStorage"), - DISCONNECTED("disconnected", BaseCmd.TYPE_DATE, "disconnected"), - DISPLAY_TEXT("displaytext", BaseCmd.TYPE_STRING, "displayText"), - DISK_OFFERING_DISPLAY_TEXT("diskofferingdisplaytext", BaseCmd.TYPE_LONG, "diskOfferingDisplayText"), DISK_OFFERING_ID("diskofferingid", BaseCmd.TYPE_LONG, "diskOfferingId"), DISK_OFFERING_NAME("diskofferingname", BaseCmd.TYPE_LONG, "diskOfferingName"), + DISK_OFFERING_DISPLAY_TEXT("diskofferingdisplaytext", BaseCmd.TYPE_LONG, "diskOfferingDisplayText"), DISK_SIZE("disksize", BaseCmd.TYPE_LONG, "diskSize"), DISK_SIZE_ALLOCATED("disksizeallocated", BaseCmd.TYPE_LONG, "disksizeallocated"), DISK_SIZE_TOTAL("disksizetotal", BaseCmd.TYPE_LONG, "disksizetotal"), DISPLAY_NAME("displayname", BaseCmd.TYPE_STRING, "displayname"), DNS1("dns1", BaseCmd.TYPE_STRING, "dns1"), DNS2("dns2", BaseCmd.TYPE_STRING, "dns2"), + INTERNAL_DNS1("internaldns1", BaseCmd.TYPE_STRING, "internaldns1"), + INTERNAL_DNS2("internaldns2", BaseCmd.TYPE_STRING, "internaldns2"), DOMAIN("domain", BaseCmd.TYPE_STRING, "domain"), DOMAIN_ID("domainid", BaseCmd.TYPE_LONG, "domainId"), DOMAIN_LEVEL("level", BaseCmd.TYPE_INT, "level"), DEST_ZONE_ID("destzoneid", BaseCmd.TYPE_LONG, "destZoneId"), DURATION("duration", BaseCmd.TYPE_INT, "duration"), - EMAIL("email", BaseCmd.TYPE_STRING, "email"), END_DATE("enddate", BaseCmd.TYPE_DATE, "endDate"), - END_IP("endip", BaseCmd.TYPE_STRING, "endIp"), - END_PORT("endport", BaseCmd.TYPE_INT, "endPort"), - END_VLAN("endvlan", BaseCmd.TYPE_LONG, "endvlan"), + EMAIL("email", BaseCmd.TYPE_STRING, "email"), ENTRY_TIME("entrytime", BaseCmd.TYPE_INT, "entryTime"), - EVENTS("events",BaseCmd.TYPE_STRING,"events"), FIREWALL_ENABLE_PASSWORD("firewallenablepassword", BaseCmd.TYPE_STRING, "firewallEnablePassword"), FIREWALL_IP("firewallip", BaseCmd.TYPE_STRING, "firewallIp"), FIREWALL_PASSWORD("firewallpassword", BaseCmd.TYPE_STRING, "firewallPassword"), FIREWALL_RULE_ID("firewallruleid", BaseCmd.TYPE_LONG, "firewallRuleId"), FIREWALL_USER("firewalluser", BaseCmd.TYPE_STRING, "firewallUser"), FIRSTNAME("firstname", BaseCmd.TYPE_STRING, "firstname"), - FOR_VIRTUAL_NETWORK("forvirtualnetwork", BaseCmd.TYPE_BOOLEAN, "forVirtualNetwork"), FORMAT("format", BaseCmd.TYPE_STRING, "format"), GATEWAY("gateway", BaseCmd.TYPE_STRING, "gateway"), GROUP("group", BaseCmd.TYPE_STRING, "group"), GROUP_ID("group", BaseCmd.TYPE_LONG, "groupId"), GROUP_IDS("groupids", BaseCmd.TYPE_STRING, "groupIds"), - HA_ENABLE("haenable", BaseCmd.TYPE_BOOLEAN, "haEnable"), - HAS_CHILD("haschild", BaseCmd.TYPE_BOOLEAN, "haschild"), + OS_TYPE_ID("ostypeid", BaseCmd.TYPE_LONG, "osTypeId"), + OS_TYPE_NAME("ostypename", BaseCmd.TYPE_STRING, "osTypeName"), + OS_CATEGORY_ID("oscategoryid", BaseCmd.TYPE_LONG, "osCategoryId"), + OS_CATEGORY_NAME("oscategoryname", BaseCmd.TYPE_STRING, "osCategoryName"), HOST_ID("hostid", BaseCmd.TYPE_LONG, "hostId"), HOST_IDS("hostids", BaseCmd.TYPE_STRING, "hostIds"), HOST_NAME("hostname", BaseCmd.TYPE_STRING, "hostname"), HOURLY_MAX("hourlymax", BaseCmd.TYPE_INT, "hourlyMax"), HYPERVISOR("hypervisor", BaseCmd.TYPE_STRING, "hypervisor"), - HYPERVISOR_TYPE("hypervisortype", BaseCmd.TYPE_STRING, "hypervisorType"), ICMP_TYPE("icmptype", BaseCmd.TYPE_INT, "icmpType"), ICMP_CODE("icmpcode", BaseCmd.TYPE_INT, "icmpCode"), ID("id", BaseCmd.TYPE_LONG, "id"), DEVICE_ID("deviceid", BaseCmd.TYPE_LONG, "deviceid"), IDS("ids", BaseCmd.TYPE_STRING, "Ids"), - INTERNAL_DNS1("internaldns1", BaseCmd.TYPE_STRING, "internaldns1"), - INTERNAL_DNS2("internaldns2", BaseCmd.TYPE_STRING, "internaldns2"), INTERVAL("interval", BaseCmd.TYPE_INT, "interval"), INTERVAL_TYPE("intervaltype", BaseCmd.TYPE_STRING, "intervalType"), - INSTANCE("instance", BaseCmd.TYPE_STRING, "instance"), IP_ADDRESS("ipaddress", BaseCmd.TYPE_STRING, "ipAddress"), IP_AVAIL("ipavailable", BaseCmd.TYPE_INT, "ipavailable"), IP_LIMIT("iplimit", BaseCmd.TYPE_INT, "iplimit"), @@ -230,27 +213,16 @@ public abstract class BaseCmd { IS_ENABLED("isenabled", BaseCmd.TYPE_BOOLEAN, "isEnabled"), IS_MIRRORED("ismirrored", BaseCmd.TYPE_BOOLEAN, "isMirrored"), IS_LOCAL_STORAGE_ACTIVE("islocalstorageactive", BaseCmd.TYPE_BOOLEAN, "isLocalStorageActive"), - ISO_FILTER("isofilter", BaseCmd.TYPE_STRING, "isoFilter"), ISO_ID("isoid", BaseCmd.TYPE_LONG, "isoId"), ISO_NAME("isoname", BaseCmd.TYPE_STRING, "isoName"), ISO_PATH("isopath", BaseCmd.TYPE_STRING, "isoPath"), - ISO_STATUS("isostatus", BaseCmd.TYPE_STRING, "isoStatus"), IS_READY("isready", BaseCmd.TYPE_BOOLEAN, "isReady"), IS_SOURCE_NAT("issourcenat", BaseCmd.TYPE_BOOLEAN, "isSourceNat"), - JOB_CMD("jobcmd", BaseCmd.TYPE_LONG, "jobcmd"), - JOB_ID("jobid", BaseCmd.TYPE_LONG, "jobid"), - JOB_INSTANCE_ID("jobinstanceid", BaseCmd.TYPE_LONG, "jobinstanceid"), - JOB_INSTANCE_TYPE("jobinstancetype", BaseCmd.TYPE_STRING, "jobinstancetype"), - JOB_PROCESS_STATUS("jobprocstatus", BaseCmd.TYPE_INT, "jobprocstatus"), - JOB_RESULT("jobresult", BaseCmd.TYPE_STRING, "jobresult"), - JOB_RESULT_CODE("jobresultcode", BaseCmd.TYPE_INT, "jobresultcode"), - JOB_RESULT_TYPE("jobresulttype", BaseCmd.TYPE_STRING, "jobresulttype"), - JOB_STATUS("jobstatus", BaseCmd.TYPE_INT, "jobstatus"), KEYWORD("keyword", BaseCmd.TYPE_STRING, "keyword"), LASTNAME("lastname", BaseCmd.TYPE_STRING, "lastname"), LASTPINGED("lastpinged", BaseCmd.TYPE_DATE, "lastpinged"), LEVEL("level", BaseCmd.TYPE_STRING, "level"), - LUN("lun", BaseCmd.TYPE_INT, "lun"), + HAS_CHILD("haschild", BaseCmd.TYPE_BOOLEAN, "haschild"), MAC_ADDRESS("macaddress", BaseCmd.TYPE_STRING, "macaddress"), MAX("max", BaseCmd.TYPE_LONG, "max"), MAX_SNAPS("maxsnaps", BaseCmd.TYPE_INT, "maxSnaps"), @@ -260,26 +232,14 @@ public abstract class BaseCmd { MEMORY_USED("memoryused", BaseCmd.TYPE_LONG, "memoryused"), MEMORY_ALLOCATED("memoryallocated", BaseCmd.TYPE_LONG, "memoryallocated"), MONTHLY_MAX("monthlymax", BaseCmd.TYPE_INT, "monthlyMax"), - MULTICAST_RATE("multicastrate", BaseCmd.TYPE_INT, "multicastrate"), NAME("name", BaseCmd.TYPE_STRING, "name"), NEW_NAME("newname", BaseCmd.TYPE_STRING, "newname"), NETMASK("netmask", BaseCmd.TYPE_STRING, "netmask"), NETWORK_DOMAIN("networkdomain", BaseCmd.TYPE_STRING, "networkdomain"), - NETWORK_GROUP_LIST("networkgrouplist", BaseCmd.TYPE_STRING, "networkGroupList"), - NETWORK_GROUP_NAME("networkgroupname", BaseCmd.TYPE_STRING, "networkGroupName"), NETWORK_KB_READ("networkkbsread", BaseCmd.TYPE_LONG, "networkkbsread"), NETWORK_KB_WRITE("networkkbswrite", BaseCmd.TYPE_LONG, "networkkbswrite"), - NETWORK_RATE("networkrate", BaseCmd.TYPE_INT, "networkrate"), - NETWORK_TYPE("networktype", BaseCmd.TYPE_STRING, "networkType"), - OFFERING_ID("offeringid", BaseCmd.TYPE_LONG, "offeringId"), - OFFER_HA("offerha", BaseCmd.TYPE_BOOLEAN, "offerHa"), OLD_POD_NAME("oldpodname", BaseCmd.TYPE_STRING, "oldPodName"), OLD_ZONE_NAME("oldzonename", BaseCmd.TYPE_STRING, "oldZoneName"), - OS_ARCHITECTURE("osarchitecture", BaseCmd.TYPE_INT, "osArchitecture"), - OS_CATEGORY_ID("oscategoryid", BaseCmd.TYPE_LONG, "osCategoryId"), - OS_CATEGORY_NAME("oscategoryname", BaseCmd.TYPE_STRING, "osCategoryName"), - OS_TYPE_ID("ostypeid", BaseCmd.TYPE_LONG, "osTypeId"), - OS_TYPE_NAME("ostypename", BaseCmd.TYPE_STRING, "osTypeName"), OP("op", BaseCmd.TYPE_STRING, "op"), PAGE("page", BaseCmd.TYPE_INT, "page"), PAGESIZE("pagesize", BaseCmd.TYPE_INT, "pagesize"), @@ -287,13 +247,10 @@ public abstract class BaseCmd { PARENT_DOMAIN_ID("parentdomainid", BaseCmd.TYPE_LONG, "parentDomainId"), PARENT_DOMAIN_NAME("parentdomainname", BaseCmd.TYPE_STRING, "parentDomainName"), PASSWORD("password", BaseCmd.TYPE_STRING, "password"), - PASSWORD_ENABLED("passwordenabled", BaseCmd.TYPE_BOOLEAN, "passwordenabled"), PATH("path", BaseCmd.TYPE_STRING, "path"), PERCENT_USED("percentused", BaseCmd.TYPE_STRING, "percentused"), POD_ID("podid", BaseCmd.TYPE_LONG, "podId"), POD_NAME("podname", BaseCmd.TYPE_STRING, "podName"), - PORT_FORWARDING_SERVICE_ID("portforwardingserviceid", BaseCmd.TYPE_LONG, "portForwardingServiceId"), - PORTAL("portal", BaseCmd.TYPE_STRING, "portal"), PRIVATE_IP("privateip", BaseCmd.TYPE_STRING, "privateIp"), PRIVATE_MAC_ADDRESS("privatemacaddress", BaseCmd.TYPE_STRING, "privatemacaddress"), PRIVATE_NETMASK("privatenetmask", BaseCmd.TYPE_STRING, "privatenetmask"), @@ -307,92 +264,124 @@ public abstract class BaseCmd { RELEASE_DATE("releaseddate", BaseCmd.TYPE_DATE, "releaseddate"), REMOVED("removed", BaseCmd.TYPE_DATE, "removed"), REQUIRES_HVM("requireshvm", BaseCmd.TYPE_BOOLEAN, "requireshvm"), - RESOURCE_TYPE("resourcetype", BaseCmd.TYPE_INT, "resourcetype"), - RESPONSE_TYPE("response",BaseCmd.TYPE_STRING,"response"), ROOT_DISK_OFFERING_ID("rootdiskofferingid", BaseCmd.TYPE_LONG, "rootDiskOfferingId"), + RESPONSE_TYPE("response",BaseCmd.TYPE_STRING,"response"), RULE_ID("ruleid", BaseCmd.TYPE_LONG, "ruleId"), - RUNNING_VMS("runningvms", BaseCmd.TYPE_LONG, "runningvms"), SCHEDULE("schedule", BaseCmd.TYPE_STRING, "schedule"), - SCHEDULED("scheduled", BaseCmd.TYPE_DATE, "scheduled"), - SCOPE("scope", BaseCmd.TYPE_STRING, "scope"), SECRET_KEY("secretkey", BaseCmd.TYPE_STRING, "secretKey"), + SHOW_ALL("showall", BaseCmd.TYPE_BOOLEAN, "showall"), + SSO_KEY("ssokey", BaseCmd.TYPE_STRING, "ssoKey"), + PORT_FORWARDING_SERVICE_ID("portforwardingserviceid", BaseCmd.TYPE_LONG, "portForwardingServiceId"), SENT("sent", BaseCmd.TYPE_DATE, "sent"), SERVICE_OFFERING_ID("serviceofferingid", BaseCmd.TYPE_LONG, "serviceOfferingId"), + OFFERING_ID("offeringid", BaseCmd.TYPE_LONG, "offeringId"), SERVICE_OFFERING_NAME("serviceofferingname", BaseCmd.TYPE_STRING, "serviceOfferingName"), - SESSION_KEY("sessionkey", BaseCmd.TYPE_STRING, "sessionKey"), - SHOW_ALL("showall", BaseCmd.TYPE_BOOLEAN, "showall"), - SIGNATURE("signature",BaseCmd.TYPE_STRING,"signature"), - SIZE("size", BaseCmd.TYPE_LONG, "size"), - SNAPSHOT_AVAIL("snapshotavailable", BaseCmd.TYPE_INT, "snapshotavailable"), - SNAPSHOT_ID("snapshotid", BaseCmd.TYPE_LONG, "snapshotid"), - SNAPSHOT_LIMIT("snapshotlimit", BaseCmd.TYPE_INT, "snapshotlimit"), - SNAPSHOT_POLICY_ID("snapshotpolicyid", BaseCmd.TYPE_LONG, "snapshotPolicyId"), - SNAPSHOT_TOTAL("snapshottotal", BaseCmd.TYPE_INT, "snapshottotal"), - SNAPSHOT_TYPE("snapshottype", BaseCmd.TYPE_STRING, "snapshotType"), SOURCE_ZONE_ID("sourcezoneid", BaseCmd.TYPE_LONG, "sourceZoneId"), - SSO_KEY("ssokey", BaseCmd.TYPE_STRING, "ssoKey"), START_DATE("startdate", BaseCmd.TYPE_DATE, "startDate"), - START_IP("startip", BaseCmd.TYPE_STRING, "startIp"), - START_PORT("startport", BaseCmd.TYPE_INT, "startPort"), START_TZDATE("startdate", BaseCmd.TYPE_TZDATE, "startDate"), + START_IP("startip", BaseCmd.TYPE_STRING, "startIp"), + END_IP("endip", BaseCmd.TYPE_STRING, "endIp"), START_VLAN("startvlan", BaseCmd.TYPE_LONG, "startvlan"), + END_VLAN("endvlan", BaseCmd.TYPE_LONG, "endvlan"), + SIZE("size", BaseCmd.TYPE_LONG, "size"), STATE("state", BaseCmd.TYPE_STRING, "state"), - STOPPED_VMS("stoppedvms", BaseCmd.TYPE_LONG, "stoppedvms"), STORAGE("storage", BaseCmd.TYPE_LONG, "storage"), - STORAGE_TYPE("storagetype", BaseCmd.TYPE_STRING, "storageType"), SUCCESS("success", BaseCmd.TYPE_BOOLEAN, "success"), - SUM_ACROSS_ZONE("sumacrosszone", BaseCmd.TYPE_BOOLEAN, "sumAcrossZone"), - SYSTEM_VM_TYPE("systemvmtype", BaseCmd.TYPE_STRING, "systemvmtype"), - TAGS("tags", BaseCmd.TYPE_STRING, "tags"), - TAKEN("taken", BaseCmd.TYPE_DATE, "taken"), - TARGET_IQN("targetiqn", BaseCmd.TYPE_STRING, "targetiqn"), - TEMPLATE_AVAIL("templateavailable", BaseCmd.TYPE_INT, "templateavailable"), + SNAPSHOT_ID("snapshotid", BaseCmd.TYPE_LONG, "snapshotid"), + SNAPSHOT_POLICY_ID("snapshotpolicyid", BaseCmd.TYPE_LONG, "snapshotPolicyId"), + SNAPSHOT_TYPE("snapshottype", BaseCmd.TYPE_STRING, "snapshotType"), + SCHEDULED("scheduled", BaseCmd.TYPE_DATE, "scheduled"), + STORAGE_TYPE("storagetype", BaseCmd.TYPE_STRING, "storageType"), + TIMEZONE("timezone", BaseCmd.TYPE_STRING, "timezone"), TEMPLATE_FILTER("templatefilter", BaseCmd.TYPE_STRING, "templateFilter"), + ISO_FILTER("isofilter", BaseCmd.TYPE_STRING, "isoFilter"), TEMPLATE_ID("templateid", BaseCmd.TYPE_LONG, "templateId"), - TEMPLATE_LIMIT("templatelimit", BaseCmd.TYPE_INT, "templatelimit"), TEMPLATE_NAME("templatename", BaseCmd.TYPE_STRING, "templateName"), TEMPLATE_DISPLAY_TEXT("templatedisplaytext", BaseCmd.TYPE_STRING, "templateDisplayText"), TEMPLATE_STATUS("templatestatus", BaseCmd.TYPE_STRING, "templateStatus"), - TEMPLATE_TOTAL("templatetotal", BaseCmd.TYPE_INT, "templatetotal"), - TIMEZONE("timezone", BaseCmd.TYPE_STRING, "timezone"), - TIMEZONE_OFFSET("timezoneoffset", BaseCmd.TYPE_FLOAT, "timezoneOffset"), + ISO_STATUS("isostatus", BaseCmd.TYPE_STRING, "isoStatus"), TOTAL_MEMORY("totalmemory", BaseCmd.TYPE_LONG, "totalmemory"), - TOTAL_VMS("totalvms", BaseCmd.TYPE_LONG, "totalvms"), + OS_ARCHITECTURE("osarchitecture", BaseCmd.TYPE_INT, "osArchitecture"), TYPE("type", BaseCmd.TYPE_STRING, "type"), - URL("url", BaseCmd.TYPE_STRING, "url"), + RESOURCE_TYPE("resourcetype", BaseCmd.TYPE_INT, "resourcetype"), USAGE("usage", BaseCmd.TYPE_STRING, "usage"), USAGE_ID("usageid", BaseCmd.TYPE_LONG, "usageId"), USER_ID("userid", BaseCmd.TYPE_LONG, "userId"), USERNAME("username", BaseCmd.TYPE_STRING, "username"), USER_DATA("userdata", BaseCmd.TYPE_STRING, "userData"), - USER_NETWORK_GROUP_LIST("usernetworkgrouplist", BaseCmd.TYPE_OBJECT_MAP, "userNetworkGroupList"), - USE_VIRTUAL_NETWORK("usevirtualnetwork", BaseCmd.TYPE_BOOLEAN, "useVirtualNetwork"), VALUE("value", BaseCmd.TYPE_STRING, "value"), VERSION("version", BaseCmd.TYPE_STRING, "version"), - VIRTUAL_MACHINE_DISPLAYNAME("vmdisplayname", BaseCmd.TYPE_STRING, "vmdisplayname"), VIRTUAL_MACHINE_ID("virtualmachineid", BaseCmd.TYPE_LONG, "virtualMachineId"), VIRTUAL_MACHINE_IDS("virtualmachineids", BaseCmd.TYPE_STRING, "virtualMachineIds"), VIRTUAL_MACHINE_NAME("vmname", BaseCmd.TYPE_STRING, "vmname"), - //VIRTUAL_MACHINE_PASSWORD("virtualmachinepassword", BaseCmd.TYPE_STRING, "virtualMachinePassword"), + VIRTUAL_MACHINE_DISPLAYNAME("vmdisplayname", BaseCmd.TYPE_STRING, "vmdisplayname"), VIRTUAL_MACHINE_STATE("vmstate", BaseCmd.TYPE_STRING, "vmState"), VLAN_ID("vlanname", BaseCmd.TYPE_STRING, "vlanName"), VLAN_DB_ID("vlanid", BaseCmd.TYPE_LONG, "vlanId"), VLAN("vlan", BaseCmd.TYPE_STRING, "vlan"), - VM_AVAIL("vmavailable", BaseCmd.TYPE_LONG, "vmavailable"), - VM_LIMIT("vmlimit", BaseCmd.TYPE_LONG, "vmlimit"), - VM_RUNNING("vmrunning", BaseCmd.TYPE_LONG, "vmrunning"), - VM_STOPPED("vmstopped", BaseCmd.TYPE_LONG, "vmstopped"), - VM_TOTAL("vmtotal", BaseCmd.TYPE_LONG, "vmtotal"), VNET("vlan", BaseCmd.TYPE_STRING, "vlan"), - VOLUME_AVAIL("volumeavailable", BaseCmd.TYPE_INT, "volumeavailable"), + //VIRTUAL_MACHINE_PASSWORD("virtualmachinepassword", BaseCmd.TYPE_STRING, "virtualMachinePassword"), VOLUME_ID("volumeid", BaseCmd.TYPE_LONG, "volumeId"), // FIXME: this is an array of longs - VOLUME_LIMIT("volumelimit", BaseCmd.TYPE_INT, "volumelimit"), VOLUME_NAME("volumename", BaseCmd.TYPE_STRING, "volumeName"), - VOLUME_TOTAL("volumetotal", BaseCmd.TYPE_INT, "volumetotal"), VOLUME_TYPE("volumetype", BaseCmd.TYPE_STRING, "volumeType"), WEEKLY_MAX("weeklymax", BaseCmd.TYPE_INT, "weeklyMax"), ZONE_ID("zoneid", BaseCmd.TYPE_LONG, "zoneId"), - ZONE_NAME("zonename", BaseCmd.TYPE_STRING, "zoneName"); + ZONE_NAME("zonename", BaseCmd.TYPE_STRING, "zoneName"), + DISPLAY_TEXT("displaytext", BaseCmd.TYPE_STRING, "displayText"), + HA_ENABLE("haenable", BaseCmd.TYPE_BOOLEAN, "haEnable"), + OFFER_HA("offerha", BaseCmd.TYPE_BOOLEAN, "offerHa"), + AVAILABLE("available", BaseCmd.TYPE_BOOLEAN, "available"), + NETWORK_RATE("networkrate", BaseCmd.TYPE_INT, "networkrate"), + MULTICAST_RATE("multicastrate", BaseCmd.TYPE_INT, "multicastrate"), + PASSWORD_ENABLED("passwordenabled", BaseCmd.TYPE_BOOLEAN, "passwordenabled"), + JOB_ID("jobid", BaseCmd.TYPE_LONG, "jobid"), + JOB_STATUS("jobstatus", BaseCmd.TYPE_INT, "jobstatus"), + JOB_PROCESS_STATUS("jobprocstatus", BaseCmd.TYPE_INT, "jobprocstatus"), + JOB_RESULT_CODE("jobresultcode", BaseCmd.TYPE_INT, "jobresultcode"), + JOB_RESULT("jobresult", BaseCmd.TYPE_STRING, "jobresult"), + JOB_RESULT_TYPE("jobresulttype", BaseCmd.TYPE_STRING, "jobresulttype"), + JOB_INSTANCE_TYPE("jobinstancetype", BaseCmd.TYPE_STRING, "jobinstancetype"), + JOB_INSTANCE_ID("jobinstanceid", BaseCmd.TYPE_LONG, "jobinstanceid"), + JOB_CMD("jobcmd", BaseCmd.TYPE_LONG, "jobcmd"), + RUNNING_VMS("runningvms", BaseCmd.TYPE_LONG, "runningvms"), + SNAPSHOT_AVAIL("snapshotavailable", BaseCmd.TYPE_INT, "snapshotavailable"), + SNAPSHOT_LIMIT("snapshotlimit", BaseCmd.TYPE_INT, "snapshotlimit"), + SNAPSHOT_TOTAL("snapshottotal", BaseCmd.TYPE_INT, "snapshottotal"), + STOPPED_VMS("stoppedvms", BaseCmd.TYPE_LONG, "stoppedvms"), + TOTAL_VMS("totalvms", BaseCmd.TYPE_LONG, "totalvms"), + TEMPLATE_AVAIL("templateavailable", BaseCmd.TYPE_INT, "templateavailable"), + TEMPLATE_LIMIT("templatelimit", BaseCmd.TYPE_INT, "templatelimit"), + TEMPLATE_TOTAL("templatetotal", BaseCmd.TYPE_INT, "templatetotal"), + VOLUME_AVAIL("volumeavailable", BaseCmd.TYPE_INT, "volumeavailable"), + VOLUME_LIMIT("volumelimit", BaseCmd.TYPE_INT, "volumelimit"), + VOLUME_TOTAL("volumetotal", BaseCmd.TYPE_INT, "volumetotal"), + VM_AVAIL("vmavailable", BaseCmd.TYPE_LONG, "vmavailable"), + VM_LIMIT("vmlimit", BaseCmd.TYPE_LONG, "vmlimit"), + VM_TOTAL("vmtotal", BaseCmd.TYPE_LONG, "vmtotal"), + VM_STOPPED("vmstopped", BaseCmd.TYPE_LONG, "vmstopped"), + VM_RUNNING("vmrunning", BaseCmd.TYPE_LONG, "vmrunning"), + URL("url", BaseCmd.TYPE_STRING, "url"), + CMD("cmd", BaseCmd.TYPE_STRING, "cmd"), + ACTIVE_VIEWER_SESSIONS("activeviewersessions", BaseCmd.TYPE_INT, "activeviewersessions"), + SYSTEM_VM_TYPE("systemvmtype", BaseCmd.TYPE_STRING, "systemvmtype"), + START_PORT("startport", BaseCmd.TYPE_INT, "startPort"), + END_PORT("endport", BaseCmd.TYPE_INT, "endPort"), + NETWORK_GROUP_NAME("networkgroupname", BaseCmd.TYPE_STRING, "networkGroupName"), + NETWORK_GROUP_LIST("networkgrouplist", BaseCmd.TYPE_STRING, "networkGroupList"), + USER_NETWORK_GROUP_LIST("usernetworkgrouplist", BaseCmd.TYPE_OBJECT_MAP, "userNetworkGroupList"), + USE_VIRTUAL_NETWORK("usevirtualnetwork", BaseCmd.TYPE_BOOLEAN, "useVirtualNetwork"), + FOR_VIRTUAL_NETWORK("forvirtualnetwork", BaseCmd.TYPE_BOOLEAN, "forVirtualNetwork"), + EVENTS("events",BaseCmd.TYPE_STRING,"events"), + PORTAL("portal", BaseCmd.TYPE_STRING, "portal"), + TARGET_IQN("targetiqn", BaseCmd.TYPE_STRING, "targetiqn"), + TAGS("tags", BaseCmd.TYPE_STRING, "tags"), + TAKEN("taken", BaseCmd.TYPE_DATE, "taken"), + LUN("lun", BaseCmd.TYPE_INT, "lun"), + DETAILS("details", BaseCmd.TYPE_OBJECT_MAP, "details"), + CLUSTER_ID("clusterid", BaseCmd.TYPE_LONG, "clusterid"), + CLUSTER_NAME("clustername", BaseCmd.TYPE_STRING, "clustername"), + SCOPE("scope", BaseCmd.TYPE_STRING, "scope"), + SUM_ACROSS_ZONE("sumacrosszone", BaseCmd.TYPE_BOOLEAN, "sumAcrossZone"); private final String _name; private final short _dataType; @@ -413,15 +402,12 @@ public abstract class BaseCmd { public abstract String getName(); public abstract List> getProperties(); - /* public Map getParams() { return _params; } public void setParams(Map params) { _params = params; } - */ - public ManagementServer getManagementServer() { return _ms; } @@ -440,14 +426,12 @@ public abstract class BaseCmd { return formattedString; } - public Map validateParams(Map params, boolean decode) { -// List> properties = getProperties(); + public Map validateParams(Map params, boolean decode) { + List> properties = getProperties(); // step 1 - all parameter names passed in will be converted to lowercase Map processedParams = lowercaseParams(params, decode); - return processedParams; - /* // step 2 - make sure all required params exist, and all existing params adhere to the appropriate data type Map validatedParams = new HashMap(); for (Pair propertyPair : properties) { @@ -531,101 +515,91 @@ public abstract class BaseCmd { } return validatedParams; - */ } - private Map lowercaseParams(Map params, boolean decode) { - Map lowercaseParams = new HashMap(); - for (String key : params.keySet()) { - lowercaseParams.put(key.toLowerCase(), params.get(key)); - } - return lowercaseParams; - } - - // FIXME: move this to a utils method so that maps can be unpacked and integer/long values can be appropriately cast @SuppressWarnings("unchecked") - public Map unpackParams(Map params, boolean decode) { + private Map lowercaseParams(Map params, boolean decode) { Map lowercaseParams = new HashMap(); for (String key : params.keySet()) { - int arrayStartIndex = key.indexOf('['); - int arrayStartLastIndex = key.lastIndexOf('['); - if (arrayStartIndex != arrayStartLastIndex) { - throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); - } + int arrayStartIndex = key.indexOf('['); + int arrayStartLastIndex = key.lastIndexOf('['); + if (arrayStartIndex != arrayStartLastIndex) { + throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); + } - if (arrayStartIndex > 0) { - int arrayEndIndex = key.indexOf(']'); - int arrayEndLastIndex = key.lastIndexOf(']'); - if ((arrayEndIndex < arrayStartIndex) || (arrayEndIndex != arrayEndLastIndex)) { - // malformed parameter - throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); - } + if (arrayStartIndex > 0) { + int arrayEndIndex = key.indexOf(']'); + int arrayEndLastIndex = key.lastIndexOf(']'); + if ((arrayEndIndex < arrayStartIndex) || (arrayEndIndex != arrayEndLastIndex)) { + // malformed parameter + throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); + } - // Now that we have an array object, check for a field name in the case of a complex object - int fieldIndex = key.indexOf('.'); - String fieldName = null; - if (fieldIndex < arrayEndIndex) { - throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); - } else { - fieldName = key.substring(fieldIndex + 1); - } + // Now that we have an array object, check for a field name in the case of a complex object + int fieldIndex = key.indexOf('.'); + String fieldName = null; + if (fieldIndex < arrayEndIndex) { + throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); + } else { + fieldName = key.substring(fieldIndex + 1); + } - // parse the parameter name as the text before the first '[' character - String paramName = key.substring(0, arrayStartIndex); - paramName = paramName.toLowerCase(); + // parse the parameter name as the text before the first '[' character + String paramName = key.substring(0, arrayStartIndex); + paramName = paramName.toLowerCase(); - Map mapArray = null; - Map mapValue = null; - String indexStr = key.substring(arrayStartIndex+1, arrayEndIndex); - int index = 0; - boolean parsedIndex = false; - try { - if (indexStr != null) { - index = Integer.parseInt(indexStr); - parsedIndex = true; - } - } catch (NumberFormatException nfe) { - s_logger.warn("Invalid parameter " + key + " received, unable to parse object array, returning an error."); - } + Map mapArray = null; + Map mapValue = null; + String indexStr = key.substring(arrayStartIndex+1, arrayEndIndex); + int index = 0; + boolean parsedIndex = false; + try { + if (indexStr != null) { + index = Integer.parseInt(indexStr); + parsedIndex = true; + } + } catch (NumberFormatException nfe) { + s_logger.warn("Invalid parameter " + key + " received, unable to parse object array, returning an error."); + } - if (!parsedIndex) { - throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); - } + if (!parsedIndex) { + throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); + } - Object value = lowercaseParams.get(paramName); - if (value == null) { - // for now, assume object array with sub fields - mapArray = new HashMap(); - mapValue = new HashMap(); - mapArray.put(Integer.valueOf(index), mapValue); - } else if (value instanceof Map) { - mapArray = (HashMap)value; - mapValue = mapArray.get(Integer.valueOf(index)); - if (mapValue == null) { - mapValue = new HashMap(); - mapArray.put(Integer.valueOf(index), mapValue); - } - } + Object value = lowercaseParams.get(paramName); + if (value == null) { + // for now, assume object array with sub fields + mapArray = new HashMap(); + mapValue = new HashMap(); + mapArray.put(Integer.valueOf(index), mapValue); + } else if (value instanceof Map) { + mapArray = (HashMap)value; + mapValue = mapArray.get(Integer.valueOf(index)); + if (mapValue == null) { + mapValue = new HashMap(); + mapArray.put(Integer.valueOf(index), mapValue); + } + } - // we are ready to store the value for a particular field into the map for this object, make sure the value is decoded if required - String valueStr = (String)params.get(key); - String decodedValue = null; - if (decode) { + // we are ready to store the value for a particular field into the map for this object, make sure the value is decoded if required + String valueStr = (String)params.get(key); + String decodedValue = null; + if (decode) { try { - decodedValue = URLDecoder.decode(valueStr, "UTF-8"); + decodedValue = URLDecoder.decode(valueStr, "UTF-8"); } catch (UnsupportedEncodingException usex) { s_logger.warn(key + " could not be decoded, value = " + valueStr); throw new ServerApiException(PARAM_ERROR, key + " could not be decoded, received value " + valueStr); } } else { - decodedValue = valueStr; + decodedValue = valueStr; } - mapValue.put(fieldName, decodedValue); + mapValue.put(fieldName, decodedValue); - lowercaseParams.put(paramName, mapArray); - } else { + lowercaseParams.put(paramName, mapArray); + } else { lowercaseParams.put(key.toLowerCase(), params.get(key)); - } + } } return lowercaseParams; } diff --git a/server/src/com/cloud/api/BaseListCmd.java b/server/src/com/cloud/api/BaseListCmd.java deleted file mode 100644 index efc7441e973..00000000000 --- a/server/src/com/cloud/api/BaseListCmd.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.cloud.api; - - -public abstract class BaseListCmd extends BaseCmd { - ///////////////////////////////////////////////////// - /////////// BaseList API parameters ///////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="keyword", type=CommandType.STRING) - private String keyword; - - // FIXME: Need to be able to specify next/prev/first/last, so Integer might not be right - @Parameter(name="page", type=CommandType.INTEGER) - private Integer page; - - @Parameter(name="pagesize", type=CommandType.INTEGER) - private Integer pageSize; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getKeyword() { - return keyword; - } - - public Integer getPage() { - return page; - } - - public Integer getPageSize() { - return pageSize; - } -} diff --git a/server/src/com/cloud/api/commands/AddConfigCmd.java b/server/src/com/cloud/api/commands/AddConfigCmd.java deleted file mode 100644 index 3ad28222484..00000000000 --- a/server/src/com/cloud/api/commands/AddConfigCmd.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.api.commands; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - -import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.utils.Pair; - -public class AddConfigCmd extends BaseCmd { - public static final Logger s_logger = Logger.getLogger(AddConfigCmd.class.getName()); - - private static final String s_name = "addconfigresponse"; - private static final List> s_properties = new ArrayList>(); - - static { - s_properties.add(new Pair(BaseCmd.Properties.INSTANCE, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.COMPONENT, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.CATEGORY, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.VALUE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DESCRIPTION, Boolean.FALSE)); - } - - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="category", type=CommandType.STRING, required=true) - private String category; - - @Parameter(name="component", type=CommandType.STRING, required=true) - private String component; - - @Parameter(name="description", type=CommandType.STRING) - private String description; - - @Parameter(name="instance", type=CommandType.STRING, required=true) - private String instance; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String name; - - @Parameter(name="value", type=CommandType.STRING) - private String value; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getCategory() { - return category; - } - - public String getComponent() { - return component; - } - - public String getDescription() { - return description; - } - - public String getInstance() { - return instance; - } - - public String getConfigPropName() { - return name; - } - - public String getValue() { - return value; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - @Override - public String getName() { - return s_name; - } - - @Override - public List> getProperties() { - return s_properties; - } - - @Override - public List> execute(Map params) { - String instance = (String) params.get(BaseCmd.Properties.INSTANCE.getName()); - String component = (String) params.get(BaseCmd.Properties.COMPONENT.getName()); - String category = (String) params.get(BaseCmd.Properties.CATEGORY.getName()); - String name = (String) params.get(BaseCmd.Properties.NAME.getName()); - String value = (String) params.get(BaseCmd.Properties.VALUE.getName()); - String description = (String) params.get(BaseCmd.Properties.DESCRIPTION.getName()); - - try - { - boolean status = getManagementServer().addConfig(instance, component, category, name, value, description); - List> returnValues = new ArrayList>(); - - if(status) - { - returnValues.add(new Pair(BaseCmd.Properties.NAME.getName(), name)); - returnValues.add(new Pair(BaseCmd.Properties.VALUE.getName(), value)); - } - - return returnValues; - } - catch (Exception ex) { - s_logger.error("Exception adding config value: ", ex); - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to add config value : " + ex.getMessage()); - } - - } -} diff --git a/server/src/com/cloud/api/commands/AddHostCmd.java b/server/src/com/cloud/api/commands/AddHostCmd.java index d14742b68b8..637e30d4609 100644 --- a/server/src/com/cloud/api/commands/AddHostCmd.java +++ b/server/src/com/cloud/api/commands/AddHostCmd.java @@ -26,13 +26,12 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.ClusterVO; import com.cloud.dc.HostPodVO; import com.cloud.host.Host; import com.cloud.host.HostStats; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.utils.Pair; import com.cloud.vm.UserVmVO; @@ -41,80 +40,17 @@ public class AddHostCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(AddHostCmd.class.getName()); private static final String s_name = "addhostresponse"; private static final List> s_properties = new ArrayList>(); - + static { - s_properties.add(new Pair(BaseCmd.Properties.CLUSTER_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.CLUSTER_NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PASSWORD, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.URL, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.USERNAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.CLUSTER_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.CLUSTER_NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.URL, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.USERNAME, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.PASSWORD, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="clusterid", type=CommandType.LONG) - private Long clusterId; - - @Parameter(name="clustername", type=CommandType.STRING) - private String clusterName; - - @Parameter(name="password", type=CommandType.STRING, required=true) - private String password; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="url", type=CommandType.STRING, required=true) - private String url; - - @Parameter(name="username", type=CommandType.STRING, required=true) - private String username; - - @Parameter(name="zoneid", type=CommandType.LONG, required=true) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getClusterId() { - return clusterId; - } - - public String getClusterName() { - return clusterName; - } - - public String getPassword() { - return password; - } - - public Long getPodId() { - return podId; - } - - public String getUrl() { - return url; - } - - public String getUsername() { - return username; - } - - public Long getZoneId() { - return zoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/AddSecondaryStorageCmd.java b/server/src/com/cloud/api/commands/AddSecondaryStorageCmd.java index 715354127ff..8cecb968ca5 100644 --- a/server/src/com/cloud/api/commands/AddSecondaryStorageCmd.java +++ b/server/src/com/cloud/api/commands/AddSecondaryStorageCmd.java @@ -28,12 +28,12 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.host.Host; import com.cloud.host.HostStats; import com.cloud.host.HostVO; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; +import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.vm.UserVmVO; @@ -47,34 +47,6 @@ public class AddSecondaryStorageCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.URL, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="url", type=CommandType.STRING, required=true) - private String url; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getUrl() { - return url; - } - - public Long getZoneId() { - return zoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/AssignPortForwardingServiceCmd.java b/server/src/com/cloud/api/commands/AssignPortForwardingServiceCmd.java index 39994b1b8ae..2bd6d34f467 100644 --- a/server/src/com/cloud/api/commands/AssignPortForwardingServiceCmd.java +++ b/server/src/com/cloud/api/commands/AssignPortForwardingServiceCmd.java @@ -18,15 +18,14 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.StringTokenizer; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -47,48 +46,6 @@ public class AssignPortForwardingServiceCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.STRING) - private Long id; - - @Parameter(name="ids", type=CommandType.LIST, collectionType=CommandType.LONG) - private List ids; - - @Parameter(name="publicip", type=CommandType.STRING, required=true) - private String publicIp; - - @Parameter(name="virtualmachineid", type=CommandType.LONG, required=true) - private Long virtualMachineId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public List getIds() { - return ids; - } - - public String getPublicIp() { - return publicIp; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/AssignToLoadBalancerRuleCmd.java b/server/src/com/cloud/api/commands/AssignToLoadBalancerRuleCmd.java index f3be7c69d35..5d50a94632d 100644 --- a/server/src/com/cloud/api/commands/AssignToLoadBalancerRuleCmd.java +++ b/server/src/com/cloud/api/commands/AssignToLoadBalancerRuleCmd.java @@ -18,15 +18,17 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.network.LoadBalancerVO; +import com.cloud.user.Account; import com.cloud.utils.Pair; public class AssignToLoadBalancerRuleCmd extends BaseCmd { @@ -34,7 +36,7 @@ public class AssignToLoadBalancerRuleCmd extends BaseCmd { private static final String s_name = "assigntoloadbalancerruleresponse"; private static final List> s_properties = new ArrayList>(); - + static { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); @@ -44,66 +46,17 @@ public class AssignToLoadBalancerRuleCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_IDS, Boolean.FALSE)); } - - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="virtualmachineid", type=CommandType.LONG, required=false) - private Long virtualMachineId; - @Parameter(name="virtualmachineids", type=CommandType.LIST, collectionType=CommandType.LONG, required=false) - private List virtualMachineIds; - - @Parameter(name="account", type=CommandType.STRING, required=false) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG, required=false) - private Long domainId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getLoadBalancerId() { - return id; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - public List getVirtualMachineIds() { - return virtualMachineIds; - } - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - public String getName() { - return s_name; - } - - public List> getProperties() { - return s_properties; - } - + public String getName() { + return s_name; + } + + public List> getProperties() { + return s_properties; + } + @Override - public List> execute(Map params) { - /* + public List> execute(Map params) { Long userId = (Long)params.get(BaseCmd.Properties.USER_ID.getName()); Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); String accountName = (String)params.get(BaseCmd.Properties.ACCOUNT.getName()); @@ -150,14 +103,9 @@ public class AssignToLoadBalancerRuleCmd extends BaseCmd { } else if (!getManagementServer().isChildDomain(account.getDomainId(), loadBalancer.getDomainId())) { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid load balancer rule id (" + loadBalancer.getId() + ") given, unable to assign instances to load balancer rule."); } - } - */ - - Map paramMap = new HashMap(); - for (String key : params.keySet()) { - paramMap.put(key, (String)params.get(key)); - } - long jobId = getManagementServer().assignToLoadBalancerAsync(paramMap); + } + + long jobId = getManagementServer().assignToLoadBalancerAsync(userId.longValue(), loadBalancerId.longValue(), instanceIdList); if (jobId == 0) { s_logger.warn("Unable to schedule async-job for AssignToLoadBalancerRule comamnd"); diff --git a/server/src/com/cloud/api/commands/AssociateIPAddrCmd.java b/server/src/com/cloud/api/commands/AssociateIPAddrCmd.java index b8737331d09..a4c06429d3a 100644 --- a/server/src/com/cloud/api/commands/AssociateIPAddrCmd.java +++ b/server/src/com/cloud/api/commands/AssociateIPAddrCmd.java @@ -18,18 +18,17 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; -import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.VlanVO; +import com.cloud.dc.Vlan.VlanType; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; @@ -52,41 +51,6 @@ public class AssociateIPAddrCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="zoneid", type=CommandType.LONG, required=true) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getZoneId() { - return zoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/AttachIsoCmd.java b/server/src/com/cloud/api/commands/AttachIsoCmd.java index f622eac524a..0cfd57b2e86 100644 --- a/server/src/com/cloud/api/commands/AttachIsoCmd.java +++ b/server/src/com/cloud/api/commands/AttachIsoCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; @@ -45,34 +44,6 @@ public class AttachIsoCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="virtualmachineid", type=CommandType.LONG, required=true) - private Long virtualMachineId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/AttachVolumeCmd.java b/server/src/com/cloud/api/commands/AttachVolumeCmd.java index 3879dde6f93..590ced072ad 100644 --- a/server/src/com/cloud/api/commands/AttachVolumeCmd.java +++ b/server/src/com/cloud/api/commands/AttachVolumeCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.VolumeVO; import com.cloud.user.Account; @@ -46,41 +45,6 @@ public class AttachVolumeCmd extends BaseCmd { } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="deviceid", type=CommandType.LONG) - private Long deviceId; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="virtualmachineid", type=CommandType.LONG, required=true) - private Long virtualMachineId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getDeviceId() { - return deviceId; - } - - public Long getId() { - return id; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } @@ -116,6 +80,8 @@ public class AttachVolumeCmd extends BaseCmd { if( deviceId != null ) { if(deviceId.longValue() == 0) { throw new ServerApiException (BaseCmd.VM_INVALID_PARAM_ERROR, "deviceId can't be 0, which is used by Root device"); + } else if(deviceId.longValue() == 3) { + throw new ServerApiException (BaseCmd.VM_INVALID_PARAM_ERROR, "deviceId can't be 3, which is used by CDROM device"); } } diff --git a/server/src/com/cloud/api/commands/AuthorizeNetworkGroupIngressCmd.java b/server/src/com/cloud/api/commands/AuthorizeNetworkGroupIngressCmd.java index 1d8a850b2b5..940105b54d7 100644 --- a/server/src/com/cloud/api/commands/AuthorizeNetworkGroupIngressCmd.java +++ b/server/src/com/cloud/api/commands/AuthorizeNetworkGroupIngressCmd.java @@ -28,7 +28,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.security.NetworkGroupVO; import com.cloud.user.Account; @@ -56,93 +55,6 @@ public class AuthorizeNetworkGroupIngressCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_NETWORK_GROUP_LIST, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="protocol", type=CommandType.STRING) - private String protocol; - - @Parameter(name="startport", type=CommandType.INTEGER) - private Integer startPort; - - @Parameter(name="endport", type=CommandType.INTEGER) - private Integer endPort; - - @Parameter(name="icmptype", type=CommandType.INTEGER) - private Integer icmpType; - - @Parameter(name="icmpcode", type=CommandType.INTEGER) - private Integer icmpCode; - - @Parameter(name="networkgroupname", type=CommandType.STRING, required=true) - private String networkGroupName; - - @Parameter(name="cidrlist", type=CommandType.STRING) - private String cidrList; - - @Parameter(name="usernetworkgrouplist", type=CommandType.MAP) - private Map userNetworkGroupList; - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public String getCidrList() { - return cidrList; - } - - public Long getDomainId() { - return domainId; - } - - public Integer getEndPort() { - return endPort; - } - - public Integer getIcmpCode() { - return icmpCode; - } - - public Integer getIcmpType() { - return icmpType; - } - - public String getNetworkGroupName() { - return networkGroupName; - } - - public String getProtocol() { - if (protocol == null) { - return "all"; - } - return protocol; - } - - public Integer getStartPort() { - return startPort; - } - - public Map getUserNetworkGroupList() { - return userNetworkGroupList; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/CancelMaintenanceCmd.java b/server/src/com/cloud/api/commands/CancelMaintenanceCmd.java index b1956359fd4..06c40619a4d 100644 --- a/server/src/com/cloud/api/commands/CancelMaintenanceCmd.java +++ b/server/src/com/cloud/api/commands/CancelMaintenanceCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.host.HostVO; import com.cloud.utils.Pair; @@ -40,27 +39,6 @@ public class CancelMaintenanceCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/CancelPrimaryStorageMaintenanceCmd.java b/server/src/com/cloud/api/commands/CancelPrimaryStorageMaintenanceCmd.java deleted file mode 100644 index 819b4c16772..00000000000 --- a/server/src/com/cloud/api/commands/CancelPrimaryStorageMaintenanceCmd.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.api.commands; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - -import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.host.Status; -import com.cloud.storage.StoragePoolVO; -import com.cloud.user.Account; -import com.cloud.utils.Pair; - -public class CancelPrimaryStorageMaintenanceCmd extends BaseCmd { - public static final Logger s_logger = Logger.getLogger(CancelPrimaryStorageMaintenanceCmd.class.getName()); - - private static final String s_name = "cancelprimarystoragemaintenanceresponse"; - private static final List> s_properties = new ArrayList>(); - - static { - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); - } - - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - public String getName() { - return s_name; - } - - public List> getProperties() { - return s_properties; - } - - public static String getResultObjectName() { - return "primarystorage"; - } - - @Override - public List> execute(Map params) { - Long storagePoolId = (Long)params.get(BaseCmd.Properties.ID.getName()); - Long userId = (Long)params.get(BaseCmd.Properties.USER_ID.getName()); - Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); - //verify input parameters - StoragePoolVO storagePool = getManagementServer().findPoolById(storagePoolId); - - if (storagePool == null) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Primary storage with id " + storagePoolId + " doesn't exist"); - } - - if (!storagePool.getStatus().equals(Status.Maintenance)) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Primary storage with id " + storagePoolId + " is not ready for migration, as the status is:"+storagePool.getStatus().toString()); - } - - long jobId = 0; - try { - jobId = getManagementServer().cancelPrimaryStorageMaintenanceAsync(storagePoolId); - } catch (InvalidParameterValueException e) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to cancel primary storage maintenance: " + e.getMessage()); - } - - if(jobId == 0) { - s_logger.warn("Unable to schedule async-job for CancelPrimaryStorageMaintenance command"); - } else { - if(s_logger.isDebugEnabled()) - s_logger.debug("CancelPrimaryStorageMaintenance command has been accepted, job id: " + jobId); - } - - List> returnValues = new ArrayList>(); - returnValues.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), Long.valueOf(jobId))); - returnValues.add(new Pair(BaseCmd.Properties.STATE.getName(), Status.PrepareForMaintenance)); - return returnValues; - } -} diff --git a/server/src/com/cloud/api/commands/CopyIsoCmd.java b/server/src/com/cloud/api/commands/CopyIsoCmd.java index 553e03aa4a9..6b13d843e0d 100644 --- a/server/src/com/cloud/api/commands/CopyIsoCmd.java +++ b/server/src/com/cloud/api/commands/CopyIsoCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.executor.CopyTemplateResultObject; import com.cloud.serializer.SerializerHelper; @@ -47,41 +46,6 @@ public class CopyIsoCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.DEST_ZONE_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="destzoneid", type=CommandType.LONG, required=true) - private Long destZoneId; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="sourcezoneid", type=CommandType.LONG, required=true) - private Long sourceZoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getDestinationZoneId() { - return destZoneId; - } - - public Long getId() { - return id; - } - - public Long getSourceZoneId() { - return sourceZoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/CopyTemplateCmd.java b/server/src/com/cloud/api/commands/CopyTemplateCmd.java index 3b408cd2327..2ba53e15294 100644 --- a/server/src/com/cloud/api/commands/CopyTemplateCmd.java +++ b/server/src/com/cloud/api/commands/CopyTemplateCmd.java @@ -25,9 +25,10 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; +import com.cloud.async.AsyncJobResult; import com.cloud.async.executor.CopyTemplateResultObject; +import com.cloud.async.executor.CreatePrivateTemplateResultObject; import com.cloud.serializer.SerializerHelper; import com.cloud.storage.Storage; import com.cloud.storage.VMTemplateVO; @@ -47,41 +48,6 @@ public class CopyTemplateCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.DEST_ZONE_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="destzoneid", type=CommandType.LONG, required=true) - private Long destZoneId; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="sourcezoneid", type=CommandType.LONG, required=true) - private Long sourceZoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getDestinationZoneId() { - return destZoneId; - } - - public Long getId() { - return id; - } - - public Long getSourceZoneId() { - return sourceZoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java b/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java index 745b7fcf2ce..bee11a65849 100644 --- a/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java +++ b/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; import com.cloud.exception.InvalidParameterValueException; @@ -42,62 +41,13 @@ public class CreateDiskOfferingCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.DISK_SIZE, Boolean.TRUE)); -// s_properties.add(new Pair(BaseCmd.Properties.IS_MIRRORED, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_MIRRORED, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.TAGS, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="disksize", type=CommandType.LONG, required=true) - private Long diskSize; - - @Parameter(name="displaytext", type=CommandType.STRING, required=true) - private String displayText; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String offeringName; - - @Parameter(name="tags", type=CommandType.STRING) - private String tags; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getDiskSize() { - return diskSize; - } - - public String getDisplayText() { - return displayText; - } - - public Long getDomainId() { - return domainId; - } - - public String getOfferingName() { - return offeringName; - } - - public String getTags() { - return tags; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; @@ -116,19 +66,19 @@ public class CreateDiskOfferingCmd extends BaseCmd { String name = (String)params.get(BaseCmd.Properties.NAME.getName()); String displayText = (String)params.get(BaseCmd.Properties.DISPLAY_TEXT.getName()); Long numGB = (Long) params.get(BaseCmd.Properties.DISK_SIZE.getName()); -// Boolean isMirrored = (Boolean)params.get(BaseCmd.Properties.IS_MIRRORED.getName()); + Boolean isMirrored = (Boolean)params.get(BaseCmd.Properties.IS_MIRRORED.getName()); String tags = (String)params.get(BaseCmd.Properties.TAGS.getName()); -// if (isMirrored == null) { -// isMirrored = Boolean.FALSE; -// } + if (isMirrored == null) { + isMirrored = Boolean.FALSE; + } if (domainId == null) { domainId = DomainVO.ROOT_DOMAIN; } DiskOfferingVO diskOffering = null; try { - diskOffering = getManagementServer().createDiskOffering(domainId.longValue(), name, displayText, numGB.intValue(),tags); + diskOffering = getManagementServer().createDiskOffering(domainId.longValue(), name, displayText, numGB.intValue(), isMirrored.booleanValue(), tags); } catch (InvalidParameterValueException ex) { throw new ServerApiException (BaseCmd.VM_INVALID_PARAM_ERROR, ex.getMessage()); } @@ -138,13 +88,13 @@ public class CreateDiskOfferingCmd extends BaseCmd { } List> returnValues = new ArrayList>(); - returnValues.add(new Pair(BaseCmd.Properties.ID.getName(), Long.toString(diskOffering.getId()))); + returnValues.add(new Pair(BaseCmd.Properties.ID.getName(), diskOffering.getId().toString())); returnValues.add(new Pair(BaseCmd.Properties.DOMAIN_ID.getName(), diskOffering.getDomainId())); returnValues.add(new Pair(BaseCmd.Properties.DOMAIN.getName(), getManagementServer().findDomainIdById(diskOffering.getDomainId()).getName())); returnValues.add(new Pair(BaseCmd.Properties.NAME.getName(), diskOffering.getName())); returnValues.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT.getName(), diskOffering.getDisplayText())); returnValues.add(new Pair(BaseCmd.Properties.DISK_SIZE.getName(), diskOffering.getDiskSizeInBytes())); -// returnValues.add(new Pair(BaseCmd.Properties.IS_MIRRORED.getName(), diskOffering.isMirrored())); + returnValues.add(new Pair(BaseCmd.Properties.IS_MIRRORED.getName(), diskOffering.isMirrored())); returnValues.add(new Pair(BaseCmd.Properties.CREATED.getName(), diskOffering.getCreated())); returnValues.add(new Pair(BaseCmd.Properties.TAGS.getName(), diskOffering.getTags())); return returnValues; diff --git a/server/src/com/cloud/api/commands/CreateDomainCmd.java b/server/src/com/cloud/api/commands/CreateDomainCmd.java index 95dc099eff8..ff4cb1ccfd5 100644 --- a/server/src/com/cloud/api/commands/CreateDomainCmd.java +++ b/server/src/com/cloud/api/commands/CreateDomainCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; import com.cloud.user.Account; @@ -43,34 +42,6 @@ public class CreateDomainCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.PARENT_DOMAIN_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String domainName; - - @Parameter(name="parentdomainid", type=CommandType.LONG) - private Long parentDomainId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getDomainName() { - return domainName; - } - - public Long getParentDomainId() { - return parentDomainId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/CreateIPForwardingRuleCmd.java b/server/src/com/cloud/api/commands/CreateIPForwardingRuleCmd.java index fbd5facb3c1..bde83fad080 100644 --- a/server/src/com/cloud/api/commands/CreateIPForwardingRuleCmd.java +++ b/server/src/com/cloud/api/commands/CreateIPForwardingRuleCmd.java @@ -18,22 +18,21 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - -import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.exception.NetworkRuleConflictException; -import com.cloud.network.FirewallRuleVO; -import com.cloud.network.IPAddressVO; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.cloud.utils.Pair; -import com.cloud.vm.UserVmVO; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.cloud.api.BaseCmd; +import com.cloud.api.ServerApiException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.network.FirewallRuleVO; +import com.cloud.network.IPAddressVO; +import com.cloud.user.Account; +import com.cloud.user.User; +import com.cloud.utils.Pair; +import com.cloud.vm.UserVmVO; public class CreateIPForwardingRuleCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(CreateIPForwardingRuleCmd.class.getName()); @@ -45,66 +44,15 @@ public class CreateIPForwardingRuleCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.IP_ADDRESS, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.PRIVATE_PORT, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.PROTOCOL, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.PUBLIC_PORT, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.PRIVATE_PORT, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.PROTOCOL, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="ipaddress", type=CommandType.STRING, required=true) - private String ipAddress; - - @Parameter(name="privateport", type=CommandType.STRING, required=true) - private String privatePort; - - @Parameter(name="protocol", type=CommandType.STRING, required=true) - private String protocol; - - @Parameter(name="publicport", type=CommandType.STRING, required=true) - private String publicPort; - - @Parameter(name="virtualmachineid", type=CommandType.LONG, required=true) - private Long virtualMachineId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getIpAddress() { - return ipAddress; - } - - public String getPrivatePort() { - return privatePort; - } - - public String getProtocol() { - return protocol; - } - - public String getPublicPort() { - return publicPort; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - @Override public String getName() { return s_name; } - @Override public List> getProperties() { return s_properties; } @@ -177,7 +125,7 @@ public class CreateIPForwardingRuleCmd extends BaseCmd { ruleData.add(new Pair(BaseCmd.Properties.PRIVATE_PORT.getName(), firewallRule.getPrivatePort())); ruleData.add(new Pair(BaseCmd.Properties.PROTOCOL.getName(), firewallRule.getProtocol())); ruleData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_NAME.getName(), userVM.getName())); - ruleData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID.getName(), Long.toString(userVM.getId()))); + ruleData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID.getName(), userVM.getId().toString())); forwardingTag[0] = ruleData; diff --git a/server/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java b/server/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java index 9ad2f2cb902..5be0f45ae66 100644 --- a/server/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java +++ b/server/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java @@ -25,10 +25,9 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; -import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.VlanVO; +import com.cloud.dc.Vlan.VlanType; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.network.IPAddressVO; @@ -48,71 +47,14 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ALGORITHM, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.DESCRIPTION, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.PRIVATE_PORT, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.DESCRIPTION, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PUBLIC_IP, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.PUBLIC_PORT, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.PRIVATE_PORT, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.ALGORITHM, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="algorithm", type=CommandType.STRING, required=true) - private String algorithm; - - @Parameter(name="description", type=CommandType.STRING) - private String description; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String loadBalancerRuleName; - - @Parameter(name="privateport", type=CommandType.STRING, required=true) - private String privatePort; - - @Parameter(name="publicip", type=CommandType.STRING, required=true) - private String publicIp; - - @Parameter(name="publicport", type=CommandType.STRING, required=true) - private String publicPort; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAlgorithm() { - return algorithm; - } - - public String getDescription() { - return description; - } - - public String getLoadBalancerRuleName() { - return loadBalancerRuleName; - } - - public String getPrivatePort() { - return privatePort; - } - - public String getPublicIp() { - return publicIp; - } - - public String getPublicPort() { - return publicPort; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/CreateNetworkGroupCmd.java b/server/src/com/cloud/api/commands/CreateNetworkGroupCmd.java index f5e5cb5ca26..4b7712b64f8 100644 --- a/server/src/com/cloud/api/commands/CreateNetworkGroupCmd.java +++ b/server/src/com/cloud/api/commands/CreateNetworkGroupCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.security.NetworkGroupVO; import com.cloud.user.Account; @@ -40,55 +39,12 @@ public class CreateNetworkGroupCmd extends BaseCmd { static { //s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DESCRIPTION, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.DESCRIPTION, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="description", type=CommandType.STRING) - private String description; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String networkGroupName; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public String getDescription() { - return description; - } - - public Long getDomainId() { - return domainId; - } - - public String getNetworkGroupName() { - return networkGroupName; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/CreatePodCmd.java b/server/src/com/cloud/api/commands/CreatePodCmd.java index ab9e2363069..2cf35e0acfb 100644 --- a/server/src/com/cloud/api/commands/CreatePodCmd.java +++ b/server/src/com/cloud/api/commands/CreatePodCmd.java @@ -25,10 +25,10 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; +import com.cloud.test.PodZoneConfig; import com.cloud.user.User; import com.cloud.utils.Pair; @@ -39,72 +39,15 @@ public class CreatePodCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.CIDR, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.END_IP, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.GATEWAY, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.START_IP, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); - + s_properties.add(new Pair(BaseCmd.Properties.GATEWAY, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.CIDR, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.START_IP, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.END_IP, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="cidr", type=CommandType.STRING, required=true) - private String cidr; - - @Parameter(name="endip", type=CommandType.STRING) - private String endIp; - - @Parameter(name="gateway", type=CommandType.STRING, required=true) - private String gateway; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String podName; - - @Parameter(name="startip", type=CommandType.STRING, required=true) - private String startIp; - - @Parameter(name="zoneid", type=CommandType.LONG, required=true) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getCidr() { - return cidr; - } - - public String getEndIp() { - return endIp; - } - - public String getGateway() { - return gateway; - } - - public String getPodName() { - return podName; - } - - public String getStartIp() { - return startIp; - } - - public Long getZoneId() { - return zoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/CreatePortForwardingServiceCmd.java b/server/src/com/cloud/api/commands/CreatePortForwardingServiceCmd.java index ee202d28ec8..285255f4d11 100644 --- a/server/src/com/cloud/api/commands/CreatePortForwardingServiceCmd.java +++ b/server/src/com/cloud/api/commands/CreatePortForwardingServiceCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.SecurityGroupVO; import com.cloud.user.Account; @@ -39,56 +38,13 @@ public class CreatePortForwardingServiceCmd extends BaseCmd { static { //s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DESCRIPTION, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.DESCRIPTION, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="description", type=CommandType.STRING) - private String description; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String portForwardingServiceName; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public String getDescription() { - return description; - } - - public Long getDomainId() { - return domainId; - } - - public String getPortForwardingServiceName() { - return portForwardingServiceName; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/CreatePortForwardingServiceRuleCmd.java b/server/src/com/cloud/api/commands/CreatePortForwardingServiceRuleCmd.java index 5a53d3b99fd..f28221f8707 100644 --- a/server/src/com/cloud/api/commands/CreatePortForwardingServiceRuleCmd.java +++ b/server/src/com/cloud/api/commands/CreatePortForwardingServiceRuleCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.executor.CreateOrUpdateRuleResultObject; import com.cloud.network.SecurityGroupVO; @@ -41,56 +40,13 @@ public class CreatePortForwardingServiceRuleCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.PORT_FORWARDING_SERVICE_ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.PRIVATE_PORT, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.PROTOCOL, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PUBLIC_PORT, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.PRIVATE_PORT, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.PROTOCOL, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PORT_FORWARDING_SERVICE_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="portforwardingserviceid", type=CommandType.LONG, required=true) - private Long portForwardingServiceId; - - @Parameter(name="privateport", type=CommandType.STRING, required=true) - private String privatePort; - - @Parameter(name="protocol", type=CommandType.STRING, required=true) - private String protocol; - - @Parameter(name="publicport", type=CommandType.STRING, required=true) - private String publicPort; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getPortForwardingServiceId() { - return portForwardingServiceId; - } - - public String getPrivatePort() { - return privatePort; - } - - public String getProtocol() { - return protocol; - } - - public String getPublicPort() { - return publicPort; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/CreateServiceOfferingCmd.java b/server/src/com/cloud/api/commands/CreateServiceOfferingCmd.java index 9656ee9167e..a8f596072dd 100644 --- a/server/src/com/cloud/api/commands/CreateServiceOfferingCmd.java +++ b/server/src/com/cloud/api/commands/CreateServiceOfferingCmd.java @@ -25,10 +25,9 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; -import com.cloud.offering.ServiceOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.user.User; import com.cloud.utils.Pair; @@ -38,96 +37,18 @@ public class CreateServiceOfferingCmd extends BaseCmd{ private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.CPU_NUMBER, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.CPU_SPEED, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.MEMORY, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.OFFER_HA, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.CPU_NUMBER, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.CPU_SPEED, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.MEMORY, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.STORAGE_TYPE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.TAGS, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.OFFER_HA, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USE_VIRTUAL_NETWORK, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.TAGS, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="cpunumber", type=CommandType.LONG, required=true) - private Long cpuNumber; - - @Parameter(name="cpuspeed", type=CommandType.LONG, required=true) - private Long cpuSpeed; - - @Parameter(name="displaytext", type=CommandType.STRING, required=true) - private String displayText; - - @Parameter(name="memory", type=CommandType.LONG, required=true) - private Long memory; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String serviceOfferingName; - - @Parameter(name="offerha", type=CommandType.BOOLEAN) - private Boolean offerHa; - - @Parameter(name="storagetype", type=CommandType.STRING) - private String storageType; - - @Parameter(name="tags", type=CommandType.STRING) - private String tags; - - @Parameter(name="usevirtualnetwork", type=CommandType.BOOLEAN) - private Boolean useVirtualNetwork; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getCpuNumber() { - return cpuNumber; - } - - public Long getCpuSpeed() { - return cpuSpeed; - } - - public String getDisplayText() { - return displayText; - } - - public Long getMemory() { - return memory; - } - - public String getServiceOfferingName() { - return serviceOfferingName; - } - - public Boolean getOfferHa() { - return offerHa; - } - - public String getStorageType() { - return storageType; - } - - public String getTags() { - return tags; - } - - public Boolean getUseVirtualNetwork() { - return useVirtualNetwork; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return _name; diff --git a/server/src/com/cloud/api/commands/CreateSnapshotCmd.java b/server/src/com/cloud/api/commands/CreateSnapshotCmd.java index 36cee37902d..53b3efc9a22 100644 --- a/server/src/com/cloud/api/commands/CreateSnapshotCmd.java +++ b/server/src/com/cloud/api/commands/CreateSnapshotCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.AsyncJobResult; import com.cloud.async.AsyncJobVO; @@ -33,6 +32,7 @@ import com.cloud.async.executor.CreateSnapshotResultObject; import com.cloud.exception.ResourceAllocationException; import com.cloud.serializer.SerializerHelper; import com.cloud.server.ManagementServer; +import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VolumeVO; import com.cloud.utils.Pair; @@ -42,49 +42,13 @@ public class CreateSnapshotCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.VOLUME_ID, Boolean.TRUE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="volumeid", type=CommandType.LONG, required=true) - private Long volumeId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getVolumeId() { - return volumeId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/CreateSnapshotPolicyCmd.java b/server/src/com/cloud/api/commands/CreateSnapshotPolicyCmd.java index 183e954266e..88bb1896374 100644 --- a/server/src/com/cloud/api/commands/CreateSnapshotPolicyCmd.java +++ b/server/src/com/cloud/api/commands/CreateSnapshotPolicyCmd.java @@ -18,20 +18,20 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.server.ManagementServer; import com.cloud.storage.SnapshotPolicyVO; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VolumeVO; +import com.cloud.user.Account; import com.cloud.utils.Pair; public class CreateSnapshotPolicyCmd extends BaseCmd { @@ -41,81 +41,17 @@ public class CreateSnapshotPolicyCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.INTERVAL_TYPE, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.MAX_SNAPS, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.SCHEDULE, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.TIMEZONE, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.VOLUME_ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.SCHEDULE, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.TIMEZONE, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.INTERVAL_TYPE, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.MAX_SNAPS, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="intervaltype", type=CommandType.STRING, required=true) - private String intervalType; - - @Parameter(name="maxsnaps", type=CommandType.INTEGER, required=true) - private Integer maxSnaps; - - @Parameter(name="schedule", type=CommandType.STRING, required=true) - private String schedule; - - @Parameter(name="timezone", type=CommandType.STRING, required=true) - private String timezone; - - @Parameter(name="volumeid", type=CommandType.LONG, required=true) - private Long volumeId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public String getIntervalType() { - return intervalType; - } - - public Integer getMaxSnaps() { - return maxSnaps; - } - - public String getSchedule() { - return schedule; - } - - public String getTimezone() { - return timezone; - } - - public Long getVolumeId() { - return volumeId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/CreateStoragePoolCmd.java b/server/src/com/cloud/api/commands/CreateStoragePoolCmd.java index 476bd0d456d..d8515985b46 100644 --- a/server/src/com/cloud/api/commands/CreateStoragePoolCmd.java +++ b/server/src/com/cloud/api/commands/CreateStoragePoolCmd.java @@ -31,7 +31,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.ClusterVO; import com.cloud.dc.DataCenterVO; @@ -48,78 +47,15 @@ public class CreateStoragePoolCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.CLUSTER_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DETAILS, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.TAGS, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.URL, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.URL, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.CLUSTER_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.TAGS, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DETAILS, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="clusterid", type=CommandType.LONG) - private Long clusterId; - - @Parameter(name="details", type=CommandType.MAP) - private Map details; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String storagePoolName; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="tags", type=CommandType.STRING) - private String tags; - - @Parameter(name="url", type=CommandType.STRING, required=true) - private String url; - - @Parameter(name="zoneid", type=CommandType.LONG, required=true) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getClusterId() { - return clusterId; - } - - public Map getDetails() { - return details; - } - - public String getStoragePoolName() { - return storagePoolName; - } - - public Long getPodId() { - return podId; - } - - public String getTags() { - return tags; - } - - public String getUrl() { - return url; - } - - public Long getZoneId() { - return zoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/CreateTemplateCmd.java b/server/src/com/cloud/api/commands/CreateTemplateCmd.java index 9b567b4f46d..942867ca019 100644 --- a/server/src/com/cloud/api/commands/CreateTemplateCmd.java +++ b/server/src/com/cloud/api/commands/CreateTemplateCmd.java @@ -25,8 +25,9 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; +import com.cloud.async.AsyncInstanceCreateStatus; +import com.cloud.async.AsyncJobResult; import com.cloud.async.executor.CreatePrivateTemplateResultObject; import com.cloud.serializer.SerializerHelper; import com.cloud.server.Criteria; @@ -42,105 +43,20 @@ public class CreateTemplateCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.BITS, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_FEATURED, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.OS_TYPE_ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.PASSWORD_ENABLED, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.REQUIRES_HVM, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.SNAPSHOT_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.VOLUME_ID, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.REQUIRES_HVM, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.BITS, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PASSWORD_ENABLED, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.OS_TYPE_ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_FEATURED, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.SNAPSHOT_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="bits", type=CommandType.INTEGER) - private Integer bits; - - @Parameter(name="displaytext", type=CommandType.STRING, required=true) - private String displayText; - - @Parameter(name="isfeatured", type=CommandType.BOOLEAN) - private Boolean featured; - - @Parameter(name="ispublic", type=CommandType.BOOLEAN) - private Boolean publicTemplate; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String templateName; - - @Parameter(name="ostypeid", type=CommandType.LONG, required=true) - private Long osTypeId; - - @Parameter(name="passwordenabled", type=CommandType.BOOLEAN) - private Boolean passwordEnabled; - - @Parameter(name="requireshvm", type=CommandType.BOOLEAN) - private Boolean requiresHvm; - - @Parameter(name="snapshotid", type=CommandType.LONG) - private Long snapshotId; - - @Parameter(name="volumeid", type=CommandType.LONG) - private Long volumeId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Integer getBits() { - return bits; - } - - public String getDisplayText() { - return displayText; - } - - public Boolean isFeatured() { - return featured; - } - - public Boolean isPublic() { - return publicTemplate; - } - - public String getTemplateName() { - return templateName; - } - - public Long getOsTypeId() { - return osTypeId; - } - - public Boolean isPasswordEnabled() { - return passwordEnabled; - } - - public Boolean getRequiresHvm() { - return requiresHvm; - } - - public Long getSnapshotId() { - return snapshotId; - } - - public Long getVolumeId() { - return volumeId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } @@ -219,14 +135,18 @@ public class CreateTemplateCmd extends BaseCmd { c.addCriteria(Criteria.NAME, name); c.addCriteria(Criteria.CREATED_BY, Long.valueOf(volume.getAccountId())); List templates = getManagementServer().searchForTemplates(c); - if ((templates != null) && !templates.isEmpty()) { - for (VMTemplateVO template : templates) { - if (template.getName().equalsIgnoreCase(name)) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "a private template with name " + name + " already exists for account " + - volume.getAccountId() + ", please try again with a different name"); - } - } - } + +// if ((templates != null) && !templates.isEmpty()) +// { +// for (VMTemplateVO template : templates) +// { +// if (template.getName().equalsIgnoreCase(name)) +// { +// throw new ServerApiException(BaseCmd.PARAM_ERROR, "a private template with name " + name + " already exists for account " + +// volume.getAccountId() + ", please try again with a different name"); +// } +// } +// } // If command is executed via 8096 port, set userId to the id of System account (1) if (userId == null) { diff --git a/server/src/com/cloud/api/commands/CreateUserCmd.java b/server/src/com/cloud/api/commands/CreateUserCmd.java index 2eb047d2634..d51237b963f 100644 --- a/server/src/com/cloud/api/commands/CreateUserCmd.java +++ b/server/src/com/cloud/api/commands/CreateUserCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; import com.cloud.user.Account; @@ -40,94 +39,17 @@ public class CreateUserCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_TYPE, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.EMAIL, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.USERNAME, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.PASSWORD, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.FIRSTNAME, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.LASTNAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.PASSWORD, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.EMAIL, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_TYPE, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.TIMEZONE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.USERNAME, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="accounttype", type=CommandType.LONG, required=true) - private Long accountType; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="email", type=CommandType.STRING, required=true) - private String email; - - @Parameter(name="firstname", type=CommandType.STRING, required=true) - private String firstname; - - @Parameter(name="lastname", type=CommandType.STRING, required=true) - private String lastname; - - @Parameter(name="password", type=CommandType.STRING, required=true) - private String password; - - @Parameter(name="timezone", type=CommandType.STRING) - private String timezone; - - @Parameter(name="username", type=CommandType.STRING, required=true) - private String username; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getAccountType() { - return accountType; - } - - public Long getDomainId() { - return domainId; - } - - public String getEmail() { - return email; - } - - public String getFirstname() { - return firstname; - } - - public String getLastname() { - return lastname; - } - - public String getPassword() { - return password; - } - - public String getTimezone() { - return timezone; - } - - public String getUsername() { - return username; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java b/server/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java index 96cb4a862e7..a22f35f2d95 100644 --- a/server/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java +++ b/server/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java @@ -18,19 +18,19 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.HostPodVO; import com.cloud.dc.Vlan; -import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.VlanVO; +import com.cloud.dc.Vlan.VlanType; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.user.Account; import com.cloud.user.User; import com.cloud.utils.Pair; @@ -42,104 +42,19 @@ public class CreateVlanIpRangeCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.END_IP, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.FOR_VIRTUAL_NETWORK, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.GATEWAY, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.NETMASK, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.START_IP, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.VLAN, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.GATEWAY, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.NETMASK, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); - + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.START_IP, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.END_IP, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="endip", type=CommandType.STRING) - private String endIp; - - @Parameter(name="forvirtualnetwork", type=CommandType.BOOLEAN) - private Boolean forVirtualNetwork; - - @Parameter(name="gateway", type=CommandType.STRING, required=true) - private String gateway; - - @Parameter(name="netmask", type=CommandType.STRING, required=true) - private String netmask; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="startip", type=CommandType.STRING, required=true) - private String startIp; - - @Parameter(name="vlan", type=CommandType.STRING) - private String vlan; - - @Parameter(name="zoneid", type=CommandType.LONG, required=true) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public String getEndIp() { - return endIp; - } - - public Boolean isForVirtualNetwork() { - return forVirtualNetwork; - } - - public String getGateway() { - return gateway; - } - - public String getNetmask() { - return netmask; - } - - public Long getPodId() { - return podId; - } - - public String getStartIp() { - return startIp; - } - - public String getVlan() { - return vlan; - } - - public Long getZoneId() { - return zoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } @@ -178,7 +93,7 @@ public class CreateVlanIpRangeCmd extends BaseCmd { // If an account name and domain ID are specified, look up the account Long accountId = null; if (accountName != null && domainId != null) { - Account account = getManagementServer().findAccountByName(accountName, domainId); + Account account = getManagementServer().findAccountByName(accountName, domainId); if (account == null || account.getRemoved() != null) { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Please specify a valid account."); } else { diff --git a/server/src/com/cloud/api/commands/CreateVolumeCmd.java b/server/src/com/cloud/api/commands/CreateVolumeCmd.java index 25bec40d0df..e88a4c3f6e9 100644 --- a/server/src/com/cloud/api/commands/CreateVolumeCmd.java +++ b/server/src/com/cloud/api/commands/CreateVolumeCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.executor.VolumeOperationResultObject; import com.cloud.serializer.SerializerHelper; @@ -41,71 +40,14 @@ public class CreateVolumeCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DISK_OFFERING_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.SNAPSHOT_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DISK_OFFERING_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.SNAPSHOT_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="diskofferingid", type=CommandType.LONG) - private Long diskOfferingId; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String volumeName; - - @Parameter(name="snapshotid", type=CommandType.LONG) - private Long snapshotId; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDiskOfferingId() { - return diskOfferingId; - } - - public Long getDomainId() { - return domainId; - } - - public String getVolumeName() { - return volumeName; - } - - public Long getSnapshotId() { - return snapshotId; - } - - public Long getZoneId() { - return zoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } @@ -218,7 +160,7 @@ public class CreateVolumeCmd extends BaseCmd { if (useSnapshot) { throw new ServerApiException(BaseCmd.CREATE_VOLUME_FROM_SNAPSHOT_ERROR, "Unable to create a volume from snapshot with id " + snapshotId + " for this account."); } else { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create volume: " + ex.getMessage()); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create volume in zone " + zoneId + " with disk offering " + diskOfferingId); } } diff --git a/server/src/com/cloud/api/commands/CreateZoneCmd.java b/server/src/com/cloud/api/commands/CreateZoneCmd.java index dc094b56871..fae7587bb62 100644 --- a/server/src/com/cloud/api/commands/CreateZoneCmd.java +++ b/server/src/com/cloud/api/commands/CreateZoneCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.DataCenterVO; import com.cloud.user.User; @@ -38,80 +37,16 @@ public class CreateZoneCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { + s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.DNS1, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.DNS2, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.GUEST_CIDR_ADDRESS, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.INTERNAL_DNS1, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.INTERNAL_DNS2, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.VNET, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.GUEST_CIDR_ADDRESS, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="dns1", type=CommandType.STRING, required=true) - private String dns1; - - @Parameter(name="dns2", type=CommandType.STRING) - private String dns2; - - @Parameter(name="guestcidraddress", type=CommandType.STRING, required=true) - private String guestCidrAddress; - - @Parameter(name="internaldns1", type=CommandType.STRING, required=true) - private String internalDns1; - - @Parameter(name="internaldns2", type=CommandType.STRING) - private String internalDns2; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String zoneName; - - @Parameter(name="vlan", type=CommandType.STRING) - private String vlan; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getDns1() { - return dns1; - } - - public String getDns2() { - return dns2; - } - - public String getGuestCidrAddress() { - return guestCidrAddress; - } - - public String getInternalDns1() { - return internalDns1; - } - - public String getInternalDns2() { - return internalDns2; - } - - public String getZoneName() { - return zoneName; - } - - public String getVlan() { - return vlan; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java b/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java index b881358bb09..aea19711107 100644 --- a/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java +++ b/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.DiskOfferingVO; import com.cloud.utils.Pair; @@ -40,28 +39,6 @@ public class DeleteDiskOfferingCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeleteDomainCmd.java b/server/src/com/cloud/api/commands/DeleteDomainCmd.java index 4f7b8ad4b32..7ff5f1691e1 100644 --- a/server/src/com/cloud/api/commands/DeleteDomainCmd.java +++ b/server/src/com/cloud/api/commands/DeleteDomainCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; import com.cloud.user.Account; @@ -42,34 +41,6 @@ public class DeleteDomainCmd extends BaseCmd{ s_properties.add(new Pair(BaseCmd.Properties.CLEANUP, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="cleanup", type=CommandType.BOOLEAN) - private Boolean cleanup; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public Boolean getCleanup() { - return cleanup; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/DeleteHostCmd.java b/server/src/com/cloud/api/commands/DeleteHostCmd.java index 97d14a6f402..47a66b93e9b 100644 --- a/server/src/com/cloud/api/commands/DeleteHostCmd.java +++ b/server/src/com/cloud/api/commands/DeleteHostCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.host.HostVO; import com.cloud.utils.Pair; @@ -40,27 +39,6 @@ public class DeleteHostCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/DeleteIPForwardingRuleCmd.java b/server/src/com/cloud/api/commands/DeleteIPForwardingRuleCmd.java index d25f75c6828..9b9af0c6c82 100644 --- a/server/src/com/cloud/api/commands/DeleteIPForwardingRuleCmd.java +++ b/server/src/com/cloud/api/commands/DeleteIPForwardingRuleCmd.java @@ -18,23 +18,22 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - -import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.exception.InternalErrorException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.PermissionDeniedException; -import com.cloud.network.FirewallRuleVO; -import com.cloud.network.IPAddressVO; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.cloud.utils.Pair; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.cloud.api.BaseCmd; +import com.cloud.api.ServerApiException; +import com.cloud.exception.InternalErrorException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.PermissionDeniedException; +import com.cloud.network.FirewallRuleVO; +import com.cloud.network.IPAddressVO; +import com.cloud.user.Account; +import com.cloud.user.User; +import com.cloud.utils.Pair; public class DeleteIPForwardingRuleCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(DeleteIPForwardingRuleCmd.class.getName()); @@ -48,27 +47,6 @@ public class DeleteIPForwardingRuleCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeleteIsoCmd.java b/server/src/com/cloud/api/commands/DeleteIsoCmd.java index 28319c9c801..de376b2be5a 100644 --- a/server/src/com/cloud/api/commands/DeleteIsoCmd.java +++ b/server/src/com/cloud/api/commands/DeleteIsoCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; @@ -43,34 +42,6 @@ public class DeleteIsoCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public Long getZoneId() { - return zoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/DeleteLoadBalancerRuleCmd.java b/server/src/com/cloud/api/commands/DeleteLoadBalancerRuleCmd.java index c01493f76df..3330d3d9278 100644 --- a/server/src/com/cloud/api/commands/DeleteLoadBalancerRuleCmd.java +++ b/server/src/com/cloud/api/commands/DeleteLoadBalancerRuleCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.LoadBalancerVO; import com.cloud.user.Account; @@ -45,41 +44,6 @@ public class DeleteLoadBalancerRuleCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getId() { - return id; - } - - public Long getDomainId() { - return domainId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeleteNetworkGroupCmd.java b/server/src/com/cloud/api/commands/DeleteNetworkGroupCmd.java index e96f7ae883f..9d7be7dd7f1 100644 --- a/server/src/com/cloud/api/commands/DeleteNetworkGroupCmd.java +++ b/server/src/com/cloud/api/commands/DeleteNetworkGroupCmd.java @@ -7,7 +7,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceInUseException; @@ -29,41 +28,6 @@ public class DeleteNetworkGroupCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String networkGroupName; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public String getNetworkGroupName() { - return networkGroupName; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeletePodCmd.java b/server/src/com/cloud/api/commands/DeletePodCmd.java index 56c188eba2b..92e5d8939b1 100644 --- a/server/src/com/cloud/api/commands/DeletePodCmd.java +++ b/server/src/com/cloud/api/commands/DeletePodCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.HostPodVO; import com.cloud.user.User; @@ -42,27 +41,6 @@ public class DeletePodCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeletePoolCmd.java b/server/src/com/cloud/api/commands/DeletePoolCmd.java index f32b1147d79..16e5fdd0c40 100644 --- a/server/src/com/cloud/api/commands/DeletePoolCmd.java +++ b/server/src/com/cloud/api/commands/DeletePoolCmd.java @@ -7,10 +7,9 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; -import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.StoragePoolVO; +import com.cloud.storage.Storage.StoragePoolType; import com.cloud.utils.Pair; public class DeletePoolCmd extends BaseCmd { @@ -23,27 +22,6 @@ public class DeletePoolCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/DeletePortForwardingServiceCmd.java b/server/src/com/cloud/api/commands/DeletePortForwardingServiceCmd.java index 47d5fcf5898..72d92be15d5 100644 --- a/server/src/com/cloud/api/commands/DeletePortForwardingServiceCmd.java +++ b/server/src/com/cloud/api/commands/DeletePortForwardingServiceCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.SecurityGroupVO; import com.cloud.user.Account; @@ -44,27 +43,6 @@ public class DeletePortForwardingServiceCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeletePortForwardingServiceRuleCmd.java b/server/src/com/cloud/api/commands/DeletePortForwardingServiceRuleCmd.java index 8fc542e0ce2..40e0edc1e14 100644 --- a/server/src/com/cloud/api/commands/DeletePortForwardingServiceRuleCmd.java +++ b/server/src/com/cloud/api/commands/DeletePortForwardingServiceRuleCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.exception.PermissionDeniedException; import com.cloud.user.Account; @@ -43,27 +42,6 @@ public class DeletePortForwardingServiceRuleCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeleteServiceOfferingCmd.java b/server/src/com/cloud/api/commands/DeleteServiceOfferingCmd.java index 72cfb3c5f05..e6ae7815444 100644 --- a/server/src/com/cloud/api/commands/DeleteServiceOfferingCmd.java +++ b/server/src/com/cloud/api/commands/DeleteServiceOfferingCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.service.ServiceOfferingVO; import com.cloud.user.User; @@ -41,27 +40,6 @@ public class DeleteServiceOfferingCmd extends BaseCmd{ s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/DeleteSnapshotCmd.java b/server/src/com/cloud/api/commands/DeleteSnapshotCmd.java index 45311960079..bee684954e6 100644 --- a/server/src/com/cloud/api/commands/DeleteSnapshotCmd.java +++ b/server/src/com/cloud/api/commands/DeleteSnapshotCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.Snapshot; import com.cloud.user.Account; @@ -37,50 +36,14 @@ public class DeleteSnapshotCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); - + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - public String getName() { + public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeleteSnapshotPoliciesCmd.java b/server/src/com/cloud/api/commands/DeleteSnapshotPoliciesCmd.java index 5bcbd1fb0f8..fe526255bc0 100644 --- a/server/src/com/cloud/api/commands/DeleteSnapshotPoliciesCmd.java +++ b/server/src/com/cloud/api/commands/DeleteSnapshotPoliciesCmd.java @@ -26,12 +26,12 @@ import java.util.StringTokenizer; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.server.ManagementServer; import com.cloud.storage.SnapshotPolicyVO; import com.cloud.storage.VolumeVO; +import com.cloud.user.Account; import com.cloud.utils.Pair; public class DeleteSnapshotPoliciesCmd extends BaseCmd { @@ -41,57 +41,14 @@ public class DeleteSnapshotPoliciesCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.IDS, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="ids", type=CommandType.LIST, collectionType=CommandType.LONG) - private List ids; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public List getIds() { - return ids; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeleteTemplateCmd.java b/server/src/com/cloud/api/commands/DeleteTemplateCmd.java index b1196c8c490..386f1442b54 100644 --- a/server/src/com/cloud/api/commands/DeleteTemplateCmd.java +++ b/server/src/com/cloud/api/commands/DeleteTemplateCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; @@ -43,34 +42,6 @@ public class DeleteTemplateCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public Long getZoneId() { - return zoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/DeleteUserCmd.java b/server/src/com/cloud/api/commands/DeleteUserCmd.java index 0740cae89f4..279feff61ea 100644 --- a/server/src/com/cloud/api/commands/DeleteUserCmd.java +++ b/server/src/com/cloud/api/commands/DeleteUserCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.user.User; @@ -40,27 +39,6 @@ public class DeleteUserCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public static String getStaticName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeleteVlanIpRangeCmd.java b/server/src/com/cloud/api/commands/DeleteVlanIpRangeCmd.java index 4d4425f5d66..65ddaf49894 100644 --- a/server/src/com/cloud/api/commands/DeleteVlanIpRangeCmd.java +++ b/server/src/com/cloud/api/commands/DeleteVlanIpRangeCmd.java @@ -18,15 +18,16 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; +import com.cloud.dc.VlanVO; import com.cloud.exception.InvalidParameterValueException; import com.cloud.user.User; import com.cloud.utils.Pair; @@ -42,27 +43,6 @@ public class DeleteVlanIpRangeCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeleteVolumeCmd.java b/server/src/com/cloud/api/commands/DeleteVolumeCmd.java index f57fcf78203..601162eb510 100644 --- a/server/src/com/cloud/api/commands/DeleteVolumeCmd.java +++ b/server/src/com/cloud/api/commands/DeleteVolumeCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.VolumeVO; import com.cloud.user.Account; @@ -41,27 +40,6 @@ public class DeleteVolumeCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeleteZoneCmd.java b/server/src/com/cloud/api/commands/DeleteZoneCmd.java index d28dee505fd..23f1314c7fd 100644 --- a/server/src/com/cloud/api/commands/DeleteZoneCmd.java +++ b/server/src/com/cloud/api/commands/DeleteZoneCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.DataCenterVO; import com.cloud.user.User; @@ -42,27 +41,6 @@ public class DeleteZoneCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DeployVMCmd.java b/server/src/com/cloud/api/commands/DeployVMCmd.java index 195aaf15229..ba730dd3549 100644 --- a/server/src/com/cloud/api/commands/DeployVMCmd.java +++ b/server/src/com/cloud/api/commands/DeployVMCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.executor.DeployVMResultObject; import com.cloud.dc.DataCenterVO; @@ -45,106 +44,21 @@ public class DeployVMCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DISK_OFFERING_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.GROUP, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.NETWORK_GROUP_LIST, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.SERVICE_OFFERING_ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.TEMPLATE_ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.USER_DATA, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.DISK_OFFERING_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.TEMPLATE_ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.GROUP, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.USER_DATA, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.NETWORK_GROUP_LIST, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="diskofferingid", type=CommandType.LONG) - private Long diskOfferingId; - - @Parameter(name="displayname", type=CommandType.STRING) - private String displayName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="group", type=CommandType.STRING) - private String group; - - @Parameter(name="networkgrouplist", type=CommandType.LIST, collectionType=CommandType.STRING) - private List networkGroupList; - - @Parameter(name="serviceofferingid", type=CommandType.LONG, required=true) - private Long serviceOfferingId; - - @Parameter(name="templateid", type=CommandType.LONG, required=true) - private Long templateId; - - @Parameter(name="userdata", type=CommandType.STRING) - private String userData; - - @Parameter(name="zoneid", type=CommandType.LONG, required=true) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDiskOfferingId() { - return diskOfferingId; - } - - public String getDisplayName() { - return displayName; - } - - public Long getDomainId() { - return domainId; - } - - public String getGroup() { - return group; - } - - public List getNetworkGroupList() { - return networkGroupList; - } - - public Long getServiceOfferingId() { - return serviceOfferingId; - } - - public Long getTemplateId() { - return templateId; - } - - public String getUserData() { - return userData; - } - - public Long getZoneId() { - return zoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - @Override public String getName() { return s_name; } @@ -153,7 +67,6 @@ public class DeployVMCmd extends BaseCmd { return "virtualmachine"; } - @Override public List> getProperties() { return s_properties; } @@ -186,17 +99,8 @@ public class DeployVMCmd extends BaseCmd { if ((diskOffering == null) || !DiskOfferingVO.Type.Disk.equals(diskOffering.getType())) { throw new ServerApiException (BaseCmd.VM_INVALID_PARAM_ERROR, "Disk offering with id " + diskOfferingId + " doesn't exist in the system"); } - - //if disk offering is set to use local storage, and local_storage is disabled, block vm deployment - if(diskOffering.getUseLocalStorage()) - { - boolean errFlag = getManagementServer().checkLocalStorageConfigVal(); - - if(!errFlag) - throw new ServerApiException (BaseCmd.VM_DEPLOY_ERROR,"Please set the local storage flag to true as disk offering has local storage usage enabled"); - } - } - + } + DataCenterVO zone = getManagementServer().findDataCenterById(zoneId); if (zone == null) { throw new ServerApiException (BaseCmd.VM_INVALID_PARAM_ERROR, "Zone with id " + zoneId + " doesn't exist in the system"); @@ -276,8 +180,7 @@ public class DeployVMCmd extends BaseCmd { } } - @Override - protected long getInstanceIdFromJobSuccessResult(String result) { + protected long getInstanceIdFromJobSuccessResult(String result) { DeployVMResultObject resultObject = (DeployVMResultObject)SerializerHelper.fromSerializedString(result); if (resultObject != null) { return resultObject.getId(); diff --git a/server/src/com/cloud/api/commands/DestroyConsoleProxyCmd.java b/server/src/com/cloud/api/commands/DestroyConsoleProxyCmd.java index 1fb444af877..31ec1ec5590 100644 --- a/server/src/com/cloud/api/commands/DestroyConsoleProxyCmd.java +++ b/server/src/com/cloud/api/commands/DestroyConsoleProxyCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.utils.Pair; import com.cloud.vm.ConsoleProxyVO; @@ -40,27 +39,6 @@ public class DestroyConsoleProxyCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DestroyVMCmd.java b/server/src/com/cloud/api/commands/DestroyVMCmd.java index 2e286ab06bb..7cd4414b9d5 100644 --- a/server/src/com/cloud/api/commands/DestroyVMCmd.java +++ b/server/src/com/cloud/api/commands/DestroyVMCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -43,27 +42,6 @@ public class DestroyVMCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DetachIsoCmd.java b/server/src/com/cloud/api/commands/DetachIsoCmd.java index 132ebfe4549..0b443a98a4f 100644 --- a/server/src/com/cloud/api/commands/DetachIsoCmd.java +++ b/server/src/com/cloud/api/commands/DetachIsoCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -43,27 +42,6 @@ public class DetachIsoCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="virtualmachineid", type=CommandType.LONG, required=true) - private Long virtualMachineId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/DetachVolumeCmd.java b/server/src/com/cloud/api/commands/DetachVolumeCmd.java index b5627ee8abc..d8f69b965d4 100644 --- a/server/src/com/cloud/api/commands/DetachVolumeCmd.java +++ b/server/src/com/cloud/api/commands/DetachVolumeCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.VolumeVO; import com.cloud.user.Account; @@ -41,27 +40,6 @@ public class DetachVolumeCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/DisableAccountCmd.java b/server/src/com/cloud/api/commands/DisableAccountCmd.java index 0c9c5917e3d..8b3b63478eb 100644 --- a/server/src/com/cloud/api/commands/DisableAccountCmd.java +++ b/server/src/com/cloud/api/commands/DisableAccountCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -41,34 +40,6 @@ public class DisableAccountCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/DisableUserCmd.java b/server/src/com/cloud/api/commands/DisableUserCmd.java index 2d5ab371e12..b16c360c1c5 100644 --- a/server/src/com/cloud/api/commands/DisableUserCmd.java +++ b/server/src/com/cloud/api/commands/DisableUserCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.user.User; @@ -41,27 +40,6 @@ public class DisableUserCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/DisassociateIPAddrCmd.java b/server/src/com/cloud/api/commands/DisassociateIPAddrCmd.java index 50fb9e55b1b..678f8f73068 100644 --- a/server/src/com/cloud/api/commands/DisassociateIPAddrCmd.java +++ b/server/src/com/cloud/api/commands/DisassociateIPAddrCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.exception.PermissionDeniedException; import com.cloud.user.Account; @@ -43,27 +42,6 @@ public class DisassociateIPAddrCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="ipaddress", type=CommandType.STRING, required=true) - private String ipAddress; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getIpAddress() { - return ipAddress; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/EnableAccountCmd.java b/server/src/com/cloud/api/commands/EnableAccountCmd.java index fa35b18f47f..2d718e2f35f 100644 --- a/server/src/com/cloud/api/commands/EnableAccountCmd.java +++ b/server/src/com/cloud/api/commands/EnableAccountCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -42,34 +41,6 @@ public class EnableAccountCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/EnableUserCmd.java b/server/src/com/cloud/api/commands/EnableUserCmd.java index 5ca6fe256e6..c2b607f908e 100644 --- a/server/src/com/cloud/api/commands/EnableUserCmd.java +++ b/server/src/com/cloud/api/commands/EnableUserCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.user.User; @@ -42,27 +41,6 @@ public class EnableUserCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/GetCloudIdentifierCmd.java b/server/src/com/cloud/api/commands/GetCloudIdentifierCmd.java index 37f0be9275e..a917a050ab6 100644 --- a/server/src/com/cloud/api/commands/GetCloudIdentifierCmd.java +++ b/server/src/com/cloud/api/commands/GetCloudIdentifierCmd.java @@ -37,24 +37,6 @@ public class GetCloudIdentifierCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - // none -- a no argument API command - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - // none -- a no argument API command - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListAccountsCmd.java b/server/src/com/cloud/api/commands/ListAccountsCmd.java index 89ed0af27d2..7959b2b040b 100644 --- a/server/src/com/cloud/api/commands/ListAccountsCmd.java +++ b/server/src/com/cloud/api/commands/ListAccountsCmd.java @@ -26,7 +26,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.domain.DomainVO; @@ -34,9 +33,9 @@ import com.cloud.server.Criteria; import com.cloud.user.Account; import com.cloud.user.AccountVO; import com.cloud.user.UserStatisticsVO; -import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.vm.State; +import com.cloud.vm.UserVm; public class ListAccountsCmd extends BaseCmd{ public static final Logger s_logger = Logger.getLogger(ListAccountsCmd.class.getName()); @@ -44,82 +43,19 @@ public class ListAccountsCmd extends BaseCmd{ private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_TYPE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_CLEANUP_REQUIRED, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_TYPE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_CLEANUP_REQUIRED, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="accounttype", type=CommandType.LONG) - private Long accountType; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="iscleanuprequired", type=CommandType.BOOLEAN) - private Boolean cleanupRequired; - - @Parameter(name="name", type=CommandType.STRING) - private String searchName; - - @Parameter(name="state", type=CommandType.STRING) - private String state; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getAccountType() { - return accountType; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public Boolean isCleanupRequired() { - return cleanupRequired; - } - - public String getSearchName() { - return searchName; - } - - public String getState() { - return state; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListAlertsCmd.java b/server/src/com/cloud/api/commands/ListAlertsCmd.java index 4fb5bcd0352..fb72fa06012 100644 --- a/server/src/com/cloud/api/commands/ListAlertsCmd.java +++ b/server/src/com/cloud/api/commands/ListAlertsCmd.java @@ -18,109 +18,86 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.alert.AlertVO; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.server.Criteria; import com.cloud.utils.Pair; - -public class ListAlertsCmd extends BaseCmd { - - public static final Logger s_logger = Logger.getLogger(ListAlertsCmd.class.getName()); - - private static final String s_name = "listalertsresponse"; - private static final List> s_properties = new ArrayList>(); - - static { - s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); - } - - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="type", type=CommandType.STRING) - private String type; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getType() { - return type; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - public String getName() { - return s_name; - } - - public List> getProperties() { - return s_properties; - } - - @Override - public List> execute(Map params) { - String alertType = (String) params.get(BaseCmd.Properties.TYPE.getName()); - String keyword = (String) params.get(BaseCmd.Properties.KEYWORD.getName()); - Integer page = (Integer) params.get(BaseCmd.Properties.PAGE.getName()); - Integer pageSize = (Integer) params.get(BaseCmd.Properties.PAGESIZE.getName()); - - Long startIndex = Long.valueOf(0); - int pageSizeNum = 50; - if (pageSize != null) { - pageSizeNum = pageSize.intValue(); - } - if (page != null) { - int pageNum = page.intValue(); - if (pageNum > 0) { - startIndex = Long.valueOf(pageSizeNum * (pageNum - 1)); - } - } - - Criteria c = new Criteria("lastSent", Boolean.FALSE, startIndex, Long.valueOf(pageSizeNum)); - c.addCriteria(Criteria.KEYWORD, keyword); - - if (keyword == null) - c.addCriteria(Criteria.TYPE, alertType); - - List alerts = getManagementServer().searchForAlerts(c); - - if (alerts == null) { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "unable to find alerts"); - } - - List> alertsTags = new ArrayList>(); - Object[] aTag = new Object[alerts.size()]; - int i = 0; - - for (AlertVO alert : alerts) { - List> alertData = new ArrayList>(); - alertData.add(new Pair(BaseCmd.Properties.TYPE.getName(), alert.getType())); - alertData.add(new Pair(BaseCmd.Properties.DESCRIPTION.getName(), alert.getSubject())); - alertData.add(new Pair(BaseCmd.Properties.SENT.getName(), alert.getLastSent())); - aTag[i++] = alertData; - } - - Pair alertTag = new Pair("alert", aTag); - alertsTags.add(alertTag); - return alertsTags; - - } -} +public class ListAlertsCmd extends BaseCmd{ + + public static final Logger s_logger = Logger.getLogger(ListAlertsCmd.class.getName()); + + private static final String s_name = "listalertsresponse"; + private static final List> s_properties = new ArrayList>(); + + public String getName() { + return s_name; + } + public List> getProperties() { + return s_properties; + } + + static { + s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); + } + + + @Override + public List> execute(Map params) { + String alertType = (String)params.get(BaseCmd.Properties.TYPE.getName()); + String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName()); + Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName()); + Integer pageSize = (Integer)params.get(BaseCmd.Properties.PAGESIZE.getName()); + + Long startIndex = Long.valueOf(0); + int pageSizeNum = 50; + if (pageSize != null) { + pageSizeNum = pageSize.intValue(); + } + if (page != null) { + int pageNum = page.intValue(); + if (pageNum > 0) { + startIndex = Long.valueOf(pageSizeNum * (pageNum-1)); + } + } + + Criteria c = new Criteria ("lastSent", Boolean.FALSE, startIndex, Long.valueOf(pageSizeNum)); + c.addCriteria(Criteria.KEYWORD, keyword); + + if (keyword == null) + c.addCriteria(Criteria.TYPE, alertType); + + List alerts = getManagementServer().searchForAlerts(c); + + if (alerts == null ) { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "unable to find alerts"); + } + + List> alertsTags = new ArrayList>(); + Object[] aTag = new Object[alerts.size()]; + int i=0; + + for (AlertVO alert : alerts) { + List> alertData = new ArrayList>(); + alertData.add(new Pair(BaseCmd.Properties.TYPE.getName(), alert.getType())); + alertData.add(new Pair(BaseCmd.Properties.DESCRIPTION.getName(), alert.getSubject())); + alertData.add(new Pair(BaseCmd.Properties.SENT.getName(), alert.getLastSent())); + aTag[i++] = alertData; + } + + Pair alertTag = new Pair("alert", aTag); + alertsTags.add(alertTag); + return alertsTags; + + } +} diff --git a/server/src/com/cloud/api/commands/ListAsyncJobsCmd.java b/server/src/com/cloud/api/commands/ListAsyncJobsCmd.java index 2a7563dfee4..19aaf959383 100644 --- a/server/src/com/cloud/api/commands/ListAsyncJobsCmd.java +++ b/server/src/com/cloud/api/commands/ListAsyncJobsCmd.java @@ -25,7 +25,6 @@ import java.util.List; import java.util.Map; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.AsyncJobVO; import com.cloud.server.Criteria; @@ -39,48 +38,12 @@ public class ListAsyncJobsCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.START_TZDATE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="startdate", type=CommandType.TZDATE) - private Date startDate; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Date getStartDate() { - return startDate; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListCapacityCmd.java b/server/src/com/cloud/api/commands/ListCapacityCmd.java index 08659ee7b3c..59f4fd9904a 100644 --- a/server/src/com/cloud/api/commands/ListCapacityCmd.java +++ b/server/src/com/cloud/api/commands/ListCapacityCmd.java @@ -18,24 +18,23 @@ package com.cloud.api.commands; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.HashMap; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; -import java.util.List; -import java.util.Map; +import java.util.List; +import java.util.Map; import java.util.Set; -import java.util.StringTokenizer; - -import org.apache.log4j.Logger; - +import java.util.StringTokenizer; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.capacity.CapacityVO; import com.cloud.server.Criteria; -import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.StoragePoolVO; +import com.cloud.storage.Storage.StoragePoolType; import com.cloud.utils.Pair; public class ListCapacityCmd extends BaseCmd{ @@ -46,57 +45,6 @@ public class ListCapacityCmd extends BaseCmd{ private static final String s_name = "listcapacityresponse"; private static final List> s_properties = new ArrayList>(); - static { - s_properties.add(new Pair(BaseCmd.Properties.HOST_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); - } - - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="hostid", type=CommandType.LONG) - private Long hostId; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="type", type=CommandType.STRING) - private String type; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getHostId() { - return hostId; - } - - public Long getPodId() { - return podId; - } - - public String getType() { - return type; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } @@ -104,6 +52,15 @@ public class ListCapacityCmd extends BaseCmd{ return s_properties; } + static { + s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.HOST_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); + } + public List> execute(Map params) { Long zoneId = (Long)params.get(BaseCmd.Properties.ZONE_ID.getName()); Long podId = (Long)params.get(BaseCmd.Properties.POD_ID.getName()); diff --git a/server/src/com/cloud/api/commands/ListCfgsByCmd.java b/server/src/com/cloud/api/commands/ListCfgsByCmd.java index e42f6eba497..ae27b6e92f9 100644 --- a/server/src/com/cloud/api/commands/ListCfgsByCmd.java +++ b/server/src/com/cloud/api/commands/ListCfgsByCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.configuration.ConfigurationVO; import com.cloud.server.Criteria; @@ -40,40 +39,11 @@ public class ListCfgsByCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.CATEGORY, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="category", type=CommandType.STRING) - private String category; - - @Parameter(name="name", type=CommandType.STRING) - private String configName; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getCategory() { - return category; - } - - public String getConfigName() { - return configName; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListClustersCmd.java b/server/src/com/cloud/api/commands/ListClustersCmd.java index 4c5ca1efdd6..c08eaebfe93 100644 --- a/server/src/com/cloud/api/commands/ListClustersCmd.java +++ b/server/src/com/cloud/api/commands/ListClustersCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.ClusterVO; import com.cloud.dc.DataCenterVO; @@ -44,52 +43,10 @@ public class ListClustersCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String clusterName; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public String getClusterName() { - return clusterName; - } - - public Long getPodId() { - return podId; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListDiskOfferingsCmd.java b/server/src/com/cloud/api/commands/ListDiskOfferingsCmd.java index c3c3363bc84..ecab9c4ba2d 100644 --- a/server/src/com/cloud/api/commands/ListDiskOfferingsCmd.java +++ b/server/src/com/cloud/api/commands/ListDiskOfferingsCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.server.Criteria; import com.cloud.storage.DiskOfferingVO; import com.cloud.utils.Pair; @@ -38,51 +37,14 @@ public class ListDiskOfferingsCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String diskOfferingName; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public String getDiskOfferingName() { - return diskOfferingName; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; @@ -130,7 +92,7 @@ public class ListDiskOfferingsCmd extends BaseCmd { for (DiskOfferingVO offering : offerings) { List> offeringData = new ArrayList>(); - offeringData.add(new Pair(BaseCmd.Properties.ID.getName(), Long.toString(offering.getId()))); + offeringData.add(new Pair(BaseCmd.Properties.ID.getName(), offering.getId().toString())); offeringData.add(new Pair(BaseCmd.Properties.DOMAIN_ID.getName(), offering.getDomainId())); offeringData.add(new Pair(BaseCmd.Properties.DOMAIN.getName(), getManagementServer().findDomainIdById(offering.getDomainId()).getName())); offeringData.add(new Pair(BaseCmd.Properties.NAME.getName(), offering.getName())); diff --git a/server/src/com/cloud/api/commands/ListDomainChildrenCmd.java b/server/src/com/cloud/api/commands/ListDomainChildrenCmd.java index ed13b7d3567..3e3150f56b4 100644 --- a/server/src/com/cloud/api/commands/ListDomainChildrenCmd.java +++ b/server/src/com/cloud/api/commands/ListDomainChildrenCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; import com.cloud.server.Criteria; @@ -40,51 +39,14 @@ public class ListDomainChildrenCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_RECURSIVE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_RECURSIVE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="isrecursive", type=CommandType.BOOLEAN) - private Boolean recursive; - - @Parameter(name="name", type=CommandType.STRING) - private String domainName; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public Boolean isRecursive() { - return recursive; - } - - public String getDomainName() { - return domainName; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListDomainsCmd.java b/server/src/com/cloud/api/commands/ListDomainsCmd.java index 4a45f8a65ab..42c0576fb9c 100644 --- a/server/src/com/cloud/api/commands/ListDomainsCmd.java +++ b/server/src/com/cloud/api/commands/ListDomainsCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; import com.cloud.server.Criteria; @@ -40,51 +39,14 @@ public class ListDomainsCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_LEVEL, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="level", type=CommandType.INTEGER) - private Integer level; - - @Parameter(name="name", type=CommandType.STRING) - private String domainName; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public Integer getLevel() { - return level; - } - - public String getDomainName() { - return domainName; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListEventsCmd.java b/server/src/com/cloud/api/commands/ListEventsCmd.java index 089aca5577a..7cefef97c4a 100644 --- a/server/src/com/cloud/api/commands/ListEventsCmd.java +++ b/server/src/com/cloud/api/commands/ListEventsCmd.java @@ -18,15 +18,14 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; import com.cloud.event.EventVO; @@ -42,84 +41,21 @@ public class ListEventsCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DURATION, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.LEVEL, Boolean.FALSE)); +// s_properties.add(new Pair(BaseCmd.Properties.DESCRIPTION, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.START_DATE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.END_DATE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ENTRY_TIME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.LEVEL, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.START_DATE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.DURATION, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="duration", type=CommandType.INTEGER) - private Integer duration; - - @Parameter(name="enddate", type=CommandType.DATE) - private Date endDate; - - @Parameter(name="entrytime", type=CommandType.INTEGER) - private Integer entryTime; - - @Parameter(name="startdate", type=CommandType.DATE) - private Date startDate; - - @Parameter(name="type", type=CommandType.STRING) - private String type; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Integer getDuration() { - return duration; - } - - public Date getEndDate() { - return endDate; - } - - public Integer getEntryTime() { - return entryTime; - } - - public Date getStartDate() { - return startDate; - } - - public String getType() { - return type; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListGuestOsCategoriesCmd.java b/server/src/com/cloud/api/commands/ListGuestOsCategoriesCmd.java index c0c48cb9c04..d0d2838ebb1 100644 --- a/server/src/com/cloud/api/commands/ListGuestOsCategoriesCmd.java +++ b/server/src/com/cloud/api/commands/ListGuestOsCategoriesCmd.java @@ -25,9 +25,7 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; -import com.cloud.server.Criteria; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.utils.Pair; @@ -38,32 +36,8 @@ public class ListGuestOsCategoriesCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; @@ -77,30 +51,8 @@ public class ListGuestOsCategoriesCmd extends BaseCmd { public List> execute(Map params) { List guestOSCategoryList = null; - try - { - Long id = (Long)params.get(BaseCmd.Properties.ID.getName()); - Integer pageSize = (Integer)params.get(BaseCmd.Properties.PAGESIZE.getName()); - Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName()); - - Long startIndex = Long.valueOf(0); - int pageSizeNum = 50; - if (pageSize != null) { - pageSizeNum = pageSize.intValue(); - } - if (page != null) { - int pageNum = page.intValue(); - if (pageNum > 0) { - startIndex = Long.valueOf(pageSizeNum * (pageNum-1)); - } - } - - Criteria c = new Criteria("id", Boolean.TRUE, startIndex, Long.valueOf(pageSizeNum)); - - if (id != null) { - c.addCriteria(Criteria.ID, id); - } - guestOSCategoryList = getManagementServer().listGuestOSCategoriesByCriteria(c); + try { + guestOSCategoryList = getManagementServer().listAllGuestOSCategories(); } catch (Exception ex) { s_logger.error("Exception listing guest OS categories", ex); throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to list guest OS categories due to exception: " + ex.getMessage()); diff --git a/server/src/com/cloud/api/commands/ListGuestOsCmd.java b/server/src/com/cloud/api/commands/ListGuestOsCmd.java index 3037eaf78c2..b90ad171411 100644 --- a/server/src/com/cloud/api/commands/ListGuestOsCmd.java +++ b/server/src/com/cloud/api/commands/ListGuestOsCmd.java @@ -25,9 +25,7 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; -import com.cloud.server.Criteria; import com.cloud.storage.GuestOSVO; import com.cloud.utils.Pair; @@ -38,40 +36,8 @@ public class ListGuestOsCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.OS_CATEGORY_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="oscategoryid", type=CommandType.LONG) - private Long osCategoryId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public Long getOsCategoryId() { - return osCategoryId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; @@ -85,38 +51,9 @@ public class ListGuestOsCmd extends BaseCmd { public List> execute(Map params) { List guestOSList = null; - try - { - Long id = (Long)params.get(BaseCmd.Properties.ID.getName()); - Long osCategoryId = (Long)params.get(BaseCmd.Properties.OS_CATEGORY_ID.getName()); - Integer pageSize = (Integer)params.get(BaseCmd.Properties.PAGESIZE.getName()); - Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName()); - - Long startIndex = Long.valueOf(0); - int pageSizeNum = 50; - if (pageSize != null) { - pageSizeNum = pageSize.intValue(); - } - if (page != null) { - int pageNum = page.intValue(); - if (pageNum > 0) { - startIndex = Long.valueOf(pageSizeNum * (pageNum-1)); - } - } - - Criteria c = new Criteria("id", Boolean.TRUE, startIndex, Long.valueOf(pageSizeNum)); - - if (id != null) { - c.addCriteria(Criteria.ID, id); - } - - if (osCategoryId != null) { - c.addCriteria(Criteria.OSCATEGORYID, osCategoryId); - } - guestOSList = getManagementServer().listGuestOSByCriteria(c); - } - catch (Exception ex) - { + try { + guestOSList = getManagementServer().listAllGuestOS(); + } catch (Exception ex) { s_logger.error("Exception listing guest OS", ex); throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to list guest OS due to exception: " + ex.getMessage()); } diff --git a/server/src/com/cloud/api/commands/ListHostsCmd.java b/server/src/com/cloud/api/commands/ListHostsCmd.java index 18e343cd1e6..acd39d61a26 100644 --- a/server/src/com/cloud/api/commands/ListHostsCmd.java +++ b/server/src/com/cloud/api/commands/ListHostsCmd.java @@ -27,18 +27,19 @@ import java.util.Set; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.ClusterVO; import com.cloud.host.Host; import com.cloud.host.HostStats; import com.cloud.host.HostVO; import com.cloud.host.Status.Event; -import com.cloud.offering.ServiceOffering; import com.cloud.server.Criteria; +import com.cloud.service.ServiceOffering; import com.cloud.storage.GuestOSCategoryVO; +import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.vm.UserVmVO; +//import com.cloud.vm.HostStats; public class ListHostsCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(ListHostsCmd.class.getName()); @@ -47,82 +48,17 @@ public class ListHostsCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.CLUSTER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="clusterid", type=CommandType.LONG) - private Long clusterId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String hostName; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="state", type=CommandType.STRING) - private String state; - - @Parameter(name="type", type=CommandType.STRING) - private String type; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getClusterId() { - return clusterId; - } - - public Long getId() { - return id; - } - - public String getHostName() { - return hostName; - } - - public Long getPodId() { - return podId; - } - - public String getState() { - return state; - } - - public String getType() { - return type; - } - - public Long getZoneId() { - return zoneId; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } @@ -135,8 +71,7 @@ public class ListHostsCmd extends BaseCmd { Long id = (Long) params.get(BaseCmd.Properties.ID.getName()); String name = (String) params.get(BaseCmd.Properties.NAME.getName()); Long zoneId = (Long) params.get(BaseCmd.Properties.ZONE_ID.getName()); - Long podId = (Long) params.get(BaseCmd.Properties.POD_ID.getName()); - Long clusterId = (Long) params.get(BaseCmd.Properties.CLUSTER_ID.getName()); + Long podId = (Long) params.get(BaseCmd.Properties.POD_ID.getName()); String type = (String) params.get(BaseCmd.Properties.TYPE.getName()); String state = (String) params.get(BaseCmd.Properties.STATE.getName()); String keyword = (String) params.get(BaseCmd.Properties.KEYWORD.getName()); @@ -159,8 +94,7 @@ public class ListHostsCmd extends BaseCmd { c.addCriteria(Criteria.ID, id); c.addCriteria(Criteria.NAME, name); c.addCriteria(Criteria.DATACENTERID, zoneId); - c.addCriteria(Criteria.PODID, podId); - c.addCriteria(Criteria.CLUSTERID, clusterId); + c.addCriteria(Criteria.PODID, podId); c.addCriteria(Criteria.TYPE, type); c.addCriteria(Criteria.STATE, state); diff --git a/server/src/com/cloud/api/commands/ListIPForwardingRulesCmd.java b/server/src/com/cloud/api/commands/ListIPForwardingRulesCmd.java new file mode 100644 index 00000000000..0cdcb483161 --- /dev/null +++ b/server/src/com/cloud/api/commands/ListIPForwardingRulesCmd.java @@ -0,0 +1,152 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.cloud.api.BaseCmd; +import com.cloud.api.ServerApiException; +import com.cloud.network.FirewallRuleVO; +import com.cloud.network.IPAddressVO; +import com.cloud.network.LoadBalancerVO; +import com.cloud.server.Criteria; +import com.cloud.user.Account; +import com.cloud.utils.Pair; +import com.cloud.vm.UserVmVO; + +public class ListIPForwardingRulesCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(ListIPForwardingRulesCmd.class.getName()); + + private static final String s_name = "listforwardingrulesresponse"; + private static final List> s_properties = new ArrayList>(); + + static { + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IP_ADDRESS, Boolean.TRUE)); + } + + public String getName() { + return s_name; + } + public List> getProperties() { + return s_properties; + } + + @Override + public List> execute(Map params) { + Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); + String ipAddress = (String)params.get(BaseCmd.Properties.IP_ADDRESS.getName()); + + IPAddressVO ipAddressVO = getManagementServer().findIPAddressById(ipAddress); + if (ipAddressVO == null) { + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find IP address " + ipAddress); + } + + Account addrOwner = getManagementServer().findAccountById(ipAddressVO.getAccountId()); + + // if an admin account was passed in, or no account was passed in, make sure we honor the accountName/domainId parameters + if ((account != null) && isAdmin(account.getType())) { + if (ipAddressVO.getAccountId() != null) { + if ((addrOwner != null) && !getManagementServer().isChildDomain(addrOwner.getDomainId(), account.getDomainId())) { + throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to list forwarding rules for address " + ipAddress + ", permission denied for account " + account.getId()); + } + } else { + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to list forwarding rules for address " + ipAddress + ", address not in use."); + } + } else { + if (account != null) { + if ((ipAddressVO.getAccountId() == null) || (account.getId().longValue() != ipAddressVO.getAccountId().longValue())) { + throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to list forwarding rules for address " + ipAddress + ", permission denied for account " + account.getId()); + } + addrOwner = account; + } + } + + List firewallRules = getManagementServer().listIPForwarding(ipAddress, true); + + if (firewallRules == null) { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error searching forwarding rules for address " + ipAddress); + } + + Criteria lbCriteria = new Criteria(); + lbCriteria.addCriteria(Criteria.IPADDRESS, ipAddress); + List loadBalancers = getManagementServer().searchForLoadBalancers(lbCriteria); + if (loadBalancers == null) { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error searching load balancer rules for address " + ipAddress); + } + + Map userVmCache = new HashMap(); + + List> groupsTags = new ArrayList>(); + Object[] forwardingTag = new Object[firewallRules.size()]; + int i = 0; + for (FirewallRuleVO fwRule : firewallRules) { + List> ruleData = new ArrayList>(); + + ruleData.add(new Pair(BaseCmd.Properties.ID.getName(), fwRule.getId().toString())); + ruleData.add(new Pair(BaseCmd.Properties.PUBLIC_PORT.getName(), fwRule.getPublicPort())); + ruleData.add(new Pair(BaseCmd.Properties.PRIVATE_PORT.getName(), fwRule.getPrivatePort())); + ruleData.add(new Pair(BaseCmd.Properties.PROTOCOL.getName(), fwRule.getProtocol())); + + UserVmVO userVM = userVmCache.get(fwRule.getPrivateIpAddress()); + if (userVM == null) { + Criteria c = new Criteria(); + c.addCriteria(Criteria.ACCOUNTID, new Object[] {addrOwner.getId()}); + c.addCriteria(Criteria.DATACENTERID, ipAddressVO.getDataCenterId()); + c.addCriteria(Criteria.IPADDRESS, fwRule.getPrivateIpAddress()); + List userVMs = getManagementServer().searchForUserVMs(c); + + if ((userVMs != null) && (userVMs.size() > 0)) { + userVM = userVMs.get(0); + userVmCache.put(fwRule.getPrivateIpAddress(), userVM); + } + } + + if (userVM != null) { + ruleData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID.getName(), userVM.getId())); + ruleData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_NAME.getName(), userVM.getName())); + } + + forwardingTag[i++] = ruleData; + } + Pair forwardingTags = new Pair("fowardingrule", forwardingTag); + groupsTags.add(forwardingTags); + + Object[] lbTag = new Object[loadBalancers.size()]; + i = 0; + for (LoadBalancerVO loadBalancer : loadBalancers) { + List> lbData = new ArrayList>(); + + lbData.add(new Pair(BaseCmd.Properties.ID.getName(), loadBalancer.getId().toString())); + lbData.add(new Pair(BaseCmd.Properties.PUBLIC_PORT.getName(), loadBalancer.getPublicPort())); + lbData.add(new Pair(BaseCmd.Properties.PRIVATE_PORT.getName(), loadBalancer.getPrivatePort())); + lbData.add(new Pair(BaseCmd.Properties.ALGORITHM.getName(), loadBalancer.getAlgorithm())); + + lbTag[i++] = lbData; + } + Pair lbTags = new Pair("loadbalancer", lbTag); + groupsTags.add(lbTags); + return groupsTags; + } +} diff --git a/server/src/com/cloud/api/commands/ListIsoPermissionsCmd.java b/server/src/com/cloud/api/commands/ListIsoPermissionsCmd.java deleted file mode 100644 index d655008c439..00000000000 --- a/server/src/com/cloud/api/commands/ListIsoPermissionsCmd.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.cloud.api.commands; - -import org.apache.log4j.Logger; - -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.Storage.ImageFormat; - -public class ListIsoPermissionsCmd extends ListTemplateOrIsoPermissionsCmd { - protected String getResponseName() { - return "listisopermissionsresponse"; - } - - protected String getMediaType() { - return "iso"; - } - - protected Logger getLogger() { - return Logger.getLogger(ListIsoPermissionsCmd.class.getName()); - } - - protected boolean templateIsCorrectType(VMTemplateVO template) { - return template.getFormat().equals(ImageFormat.ISO); - } -} diff --git a/server/src/com/cloud/api/commands/ListIsosCmd.java b/server/src/com/cloud/api/commands/ListIsosCmd.java index 9ee0a7f4159..939525a1a3a 100644 --- a/server/src/com/cloud/api/commands/ListIsosCmd.java +++ b/server/src/com/cloud/api/commands/ListIsosCmd.java @@ -26,7 +26,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.AsyncJobVO; import com.cloud.dc.DataCenterVO; @@ -34,8 +33,8 @@ import com.cloud.domain.DomainVO; import com.cloud.host.HostVO; import com.cloud.storage.GuestOS; import com.cloud.storage.VMTemplateHostVO; -import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.dao.VMTemplateDao.TemplateFilter; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -48,98 +47,21 @@ public class ListIsosCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.BOOTABLE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_READY, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ISO_FILTER, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_READY, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ISO_FILTER, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.BOOTABLE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="bootable", type=CommandType.BOOLEAN) - private Boolean bootable; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="ispublic", type=CommandType.BOOLEAN) - private Boolean publicIso; - - @Parameter(name="isready", type=CommandType.BOOLEAN) - private Boolean ready; - - @Parameter(name="isofilter", type=CommandType.STRING) - private String isoFilter; - - @Parameter(name="name", type=CommandType.STRING) - private String isoName; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Boolean isBootable() { - return bootable; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public Boolean isPublic() { - return publicIso; - } - - public Boolean isReady() { - return ready; - } - - public String getIsoFilter() { - return isoFilter; - } - - public String getIsoName() { - return isoName; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/ListLoadBalancerRuleInstancesCmd.java b/server/src/com/cloud/api/commands/ListLoadBalancerRuleInstancesCmd.java index a2e4db3f942..07846a3edde 100644 --- a/server/src/com/cloud/api/commands/ListLoadBalancerRuleInstancesCmd.java +++ b/server/src/com/cloud/api/commands/ListLoadBalancerRuleInstancesCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.LoadBalancerVO; import com.cloud.user.Account; @@ -40,44 +39,13 @@ public class ListLoadBalancerRuleInstancesCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.APPLIED, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="applied", type=CommandType.BOOLEAN) - private Boolean applied; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Boolean isApplied() { - return applied; - } - - public Long getId() { - return id; - } - - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - @Override public String getName() { return s_name; } - @Override public List> getProperties() { return s_properties; } @@ -121,7 +89,7 @@ public class ListLoadBalancerRuleInstancesCmd extends BaseCmd { for (UserVmVO instance : instances) { List> instanceData = new ArrayList>(); - instanceData.add(new Pair(BaseCmd.Properties.ID.getName(), Long.toString(instance.getId()))); + instanceData.add(new Pair(BaseCmd.Properties.ID.getName(), instance.getId().toString())); instanceData.add(new Pair(BaseCmd.Properties.NAME.getName(), instance.getName())); instanceData.add(new Pair(BaseCmd.Properties.DISPLAY_NAME.getName(), instance.getDisplayName())); instanceData.add(new Pair(BaseCmd.Properties.PRIVATE_IP.getName(), instance.getPrivateIpAddress())); diff --git a/server/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java b/server/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java index 9bb1ce8d027..499ec7060ee 100644 --- a/server/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java +++ b/server/src/com/cloud/api/commands/ListLoadBalancerRulesCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; import com.cloud.network.IPAddressVO; @@ -42,74 +41,17 @@ public class ListLoadBalancerRulesCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PUBLIC_IP, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String loadBalancerRuleName; - - @Parameter(name="publicip", type=CommandType.STRING) - private String publicIp; - - @Parameter(name="virtualmachineid", type=CommandType.LONG) - private Long virtualMachineId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public String getLoadBalancerRuleName() { - return loadBalancerRuleName; - } - - public String getPublicIp() { - return publicIp; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListNetworkGroupsCmd.java b/server/src/com/cloud/api/commands/ListNetworkGroupsCmd.java index fd1f31ae114..f1668d98e8f 100644 --- a/server/src/com/cloud/api/commands/ListNetworkGroupsCmd.java +++ b/server/src/com/cloud/api/commands/ListNetworkGroupsCmd.java @@ -7,7 +7,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.executor.IngressRuleResultObject; import com.cloud.async.executor.NetworkGroupResultObject; @@ -25,58 +24,15 @@ public class ListNetworkGroupsCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NETWORK_GROUP_NAME, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="networkgroupname", type=CommandType.STRING) - private String networkGroupName; - - @Parameter(name="virtualmachineid", type=CommandType.LONG) - private Long virtualMachineId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public String getNetworkGroupName() { - return networkGroupName; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListPodsByCmd.java b/server/src/com/cloud/api/commands/ListPodsByCmd.java index ed9d21804e1..2abcfd7906c 100644 --- a/server/src/com/cloud/api/commands/ListPodsByCmd.java +++ b/server/src/com/cloud/api/commands/ListPodsByCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.HostPodVO; import com.cloud.server.Criteria; @@ -45,40 +44,6 @@ public class ListPodsByCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String podName; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public String getPodName() { - return podName; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java b/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java index 9c5db89b419..180e416c69b 100644 --- a/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java +++ b/server/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java @@ -26,7 +26,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.FirewallRuleVO; import com.cloud.network.IPAddressVO; @@ -46,31 +45,9 @@ public class ListPortForwardingRulesCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.IP_ADDRESS, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="ipaddress", type=CommandType.STRING, required=true) - private String ipAddress; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getIpAddress() { - return ipAddress; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - @Override public String getName() { return s_name; } - @Override public List> getProperties() { return s_properties; } @@ -147,7 +124,7 @@ public class ListPortForwardingRulesCmd extends BaseCmd { } if (userVM != null) { - ruleData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID.getName(), Long.toString(userVM.getId()))); + ruleData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID.getName(), userVM.getId().toString())); ruleData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_NAME.getName(), userVM.getName())); } diff --git a/server/src/com/cloud/api/commands/ListPortForwardingServiceRulesCmd.java b/server/src/com/cloud/api/commands/ListPortForwardingServiceRulesCmd.java index 9b855f075df..3addbf14a22 100644 --- a/server/src/com/cloud/api/commands/ListPortForwardingServiceRulesCmd.java +++ b/server/src/com/cloud/api/commands/ListPortForwardingServiceRulesCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.AsyncJobVO; import com.cloud.network.NetworkRuleConfigVO; @@ -42,54 +41,12 @@ public class ListPortForwardingServiceRulesCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PORT_FORWARDING_SERVICE_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="portforwardingserviceid", type=CommandType.LONG) - private Long portForwardingServiceId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public Long getPortForwardingServiceId() { - return portForwardingServiceId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListPortForwardingServicesByVmCmd.java b/server/src/com/cloud/api/commands/ListPortForwardingServicesByVmCmd.java index a1e8bfa1a17..0ea3d835cea 100644 --- a/server/src/com/cloud/api/commands/ListPortForwardingServicesByVmCmd.java +++ b/server/src/com/cloud/api/commands/ListPortForwardingServicesByVmCmd.java @@ -18,20 +18,19 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.SecurityGroupVO; import com.cloud.server.Criteria; import com.cloud.user.Account; -import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; +import com.cloud.vm.UserVm; public class ListPortForwardingServicesByVmCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(ListPortForwardingServicesByVmCmd.class.getName()); @@ -40,56 +39,14 @@ public class ListPortForwardingServicesByVmCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.IP_ADDRESS, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.TRUE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IP_ADDRESS, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="ipaddress", type=CommandType.STRING) - private String ipAddress; - - @Parameter(name="virtualmachineid", type=CommandType.LONG) - private Long virtualMachineId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public String getIpAddress() { - return ipAddress; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListPortForwardingServicesCmd.java b/server/src/com/cloud/api/commands/ListPortForwardingServicesCmd.java index 8a209061093..931a51a9942 100644 --- a/server/src/com/cloud/api/commands/ListPortForwardingServicesCmd.java +++ b/server/src/com/cloud/api/commands/ListPortForwardingServicesCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; import com.cloud.network.SecurityGroupVO; @@ -41,58 +40,15 @@ public class ListPortForwardingServicesCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String portForwardingServiceName; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public String getPortForwardingServiceName() { - return portForwardingServiceName; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListPreallocatedLunsCmd.java b/server/src/com/cloud/api/commands/ListPreallocatedLunsCmd.java index 34c56e62ebc..5badeba93f5 100644 --- a/server/src/com/cloud/api/commands/ListPreallocatedLunsCmd.java +++ b/server/src/com/cloud/api/commands/ListPreallocatedLunsCmd.java @@ -25,9 +25,11 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; +import com.cloud.dc.ClusterVO; import com.cloud.server.Criteria; +import com.cloud.storage.StoragePoolVO; +import com.cloud.storage.StorageStats; import com.cloud.storage.preallocatedlun.PreallocatedLunVO; import com.cloud.utils.Pair; @@ -40,37 +42,10 @@ public class ListPreallocatedLunsCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.TARGET_IQN, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.SCOPE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="scope", type=CommandType.STRING) - private String scope; - - @Parameter(name="targetiqn", type=CommandType.STRING) - private String targetIqn; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getScope() { - return scope; - } - - public String getTargetIqn() { - return targetIqn; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListPublicIpAddressesCmd.java b/server/src/com/cloud/api/commands/ListPublicIpAddressesCmd.java index b12fd25b6aa..99c310d6048 100644 --- a/server/src/com/cloud/api/commands/ListPublicIpAddressesCmd.java +++ b/server/src/com/cloud/api/commands/ListPublicIpAddressesCmd.java @@ -18,17 +18,16 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; -import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.VlanVO; +import com.cloud.dc.Vlan.VlanType; import com.cloud.domain.DomainVO; import com.cloud.network.IPAddressVO; import com.cloud.server.Criteria; @@ -43,80 +42,18 @@ public class ListPublicIpAddressesCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ALLOCATED_ONLY, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.FOR_VIRTUAL_NETWORK, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.IP_ADDRESS, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.VLAN_DB_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ALLOCATED_ONLY, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.VLAN_DB_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IP_ADDRESS, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.FOR_VIRTUAL_NETWORK, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="allocatedonly", type=CommandType.BOOLEAN) - private Boolean allocatedOnly; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="forvirtualnetwork", type=CommandType.BOOLEAN) - private Boolean forVirtualNetwork; - - @Parameter(name="ipaddress", type=CommandType.STRING) - private String ipAddress; - - @Parameter(name="vlanid", type=CommandType.LONG) - private Long vlanId; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Boolean isAllocatedOnly() { - return allocatedOnly; - } - - public Long getDomainId() { - return domainId; - } - - public Boolean isForVirtualNetwork() { - return forVirtualNetwork; - } - - public String getIpAddress() { - return ipAddress; - } - - public Long getVlanId() { - return vlanId; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/ListRecurringSnapshotScheduleCmd.java b/server/src/com/cloud/api/commands/ListRecurringSnapshotScheduleCmd.java index 843da134a6a..af714698cfd 100644 --- a/server/src/com/cloud/api/commands/ListRecurringSnapshotScheduleCmd.java +++ b/server/src/com/cloud/api/commands/ListRecurringSnapshotScheduleCmd.java @@ -18,12 +18,11 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.SnapshotScheduleVO; import com.cloud.storage.VolumeVO; @@ -40,32 +39,6 @@ public class ListRecurringSnapshotScheduleCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="snapshotpolicyid", type=CommandType.LONG) - private Long snapshotPolicyId; - - @Parameter(name="volumeid", type=CommandType.LONG, required=true) - private Long volumeId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getSnapshotPolicyId() { - return snapshotPolicyId; - } - - public Long getVolumeId() { - return volumeId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } @@ -106,7 +79,7 @@ public class ListRecurringSnapshotScheduleCmd extends BaseCmd { snapshotData.add(new Pair(BaseCmd.Properties.ID.getName(), recurringSnapshotSchedule.getId().toString())); snapshotData.add(new Pair(BaseCmd.Properties.VOLUME_ID.getName(), recurringSnapshotSchedule.getVolumeId().toString())); snapshotData.add(new Pair(BaseCmd.Properties.SNAPSHOT_POLICY_ID.getName(), recurringSnapshotSchedule.getPolicyId().toString())); - snapshotData.add(new Pair(BaseCmd.Properties.SCHEDULED.getName(), getDateString(recurringSnapshotSchedule.getScheduledTimestamp()))); + snapshotData.add(new Pair(BaseCmd.Properties.SCHEDULED.getName(), recurringSnapshotSchedule.getScheduledTimestamp().toString())); snapshotTag[i++] = snapshotData; } List> returnTags = new ArrayList>(); diff --git a/server/src/com/cloud/api/commands/ListResourceLimitsCmd.java b/server/src/com/cloud/api/commands/ListResourceLimitsCmd.java index d537c77a344..e64616de024 100644 --- a/server/src/com/cloud/api/commands/ListResourceLimitsCmd.java +++ b/server/src/com/cloud/api/commands/ListResourceLimitsCmd.java @@ -25,13 +25,13 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; -import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.ResourceLimitVO; +import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.domain.DomainVO; import com.cloud.server.Criteria; import com.cloud.user.Account; +import com.cloud.user.AccountVO; import com.cloud.utils.Pair; public class ListResourceLimitsCmd extends BaseCmd { @@ -41,56 +41,15 @@ public class ListResourceLimitsCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.RESOURCE_TYPE, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="resourcetype", type=CommandType.INTEGER) - private Integer resourceType; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public Integer getResourceType() { - return resourceType; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; @@ -118,6 +77,7 @@ public class ListResourceLimitsCmd extends BaseCmd { throw new ServerApiException(BaseCmd.PARAM_ERROR, "You must specify domain Id for the account: " + accountName); } + //Account userAccount = getManagementServer().findAccountByName(accountName, domainId); Account userAccount = getManagementServer().findActiveAccount(accountName, domainId); if (userAccount == null) { @@ -134,21 +94,29 @@ public class ListResourceLimitsCmd extends BaseCmd { domainId = null; } else if (domainId != null) { // Look up limits for the specified domain + accountId = null; } else if (account == null) { // Look up limits for the ROOT domain + domainId = DomainVO.ROOT_DOMAIN; } else { // Look up limits for the admin's account + accountId = account.getId(); domainId = null; } } else { // Look up limits for the user's account + accountId = account.getId(); domainId = null; } - + + if (accountId == null && domainId != null && !domainId.equals(DomainVO.ROOT_DOMAIN)) { + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Only ROOT domain limits can be retrieved right now"); + } + // Map resource type ResourceType resourceType = null; try { diff --git a/server/src/com/cloud/api/commands/ListRoutersCmd.java b/server/src/com/cloud/api/commands/ListRoutersCmd.java index 406b85c963e..1a184f4dba9 100644 --- a/server/src/com/cloud/api/commands/ListRoutersCmd.java +++ b/server/src/com/cloud/api/commands/ListRoutersCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.AsyncJobVO; import com.cloud.domain.DomainVO; @@ -41,86 +40,22 @@ public class ListRoutersCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.HOST_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.HOST_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="hostid", type=CommandType.LONG) - private Long hostId; - - @Parameter(name="name", type=CommandType.STRING) - private String routerName; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="state", type=CommandType.STRING) - private String state; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getHostId() { - return hostId; - } - - public String getRouterName() { - return routerName; - } - - public Long getPodId() { - return podId; - } - - public String getState() { - return state; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - @Override public String getName() { return s_name; } - @Override public List> getProperties() { return s_properties; } @@ -197,7 +132,9 @@ public class ListRoutersCmd extends BaseCmd { for (DomainRouterVO router : routers) { List> routerData = new ArrayList>(); - routerData.add(new Pair(BaseCmd.Properties.ID.getName(), Long.toString(router.getId()))); + if (router.getId() != null) { + routerData.add(new Pair(BaseCmd.Properties.ID.getName(), router.getId().toString())); + } AsyncJobVO asyncJob = getManagementServer().findInstancePendingAsyncJob("domain_router", router.getId()); if(asyncJob != null) { routerData.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), asyncJob.getId().toString())); diff --git a/server/src/com/cloud/api/commands/ListServiceOfferingsCmd.java b/server/src/com/cloud/api/commands/ListServiceOfferingsCmd.java index 0e89e9a5187..82eab52ad97 100644 --- a/server/src/com/cloud/api/commands/ListServiceOfferingsCmd.java +++ b/server/src/com/cloud/api/commands/ListServiceOfferingsCmd.java @@ -25,11 +25,10 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; -import com.cloud.offering.ServiceOffering.GuestIpType; import com.cloud.server.Criteria; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.user.Account; import com.cloud.utils.Pair; import com.cloud.vm.UserVmVO; @@ -44,51 +43,15 @@ public class ListServiceOfferingsCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String serviceOfferingName; - - @Parameter(name="virtualmachineid", type=CommandType.LONG) - private Long virtualMachineId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public String getServiceOfferingName() { - return serviceOfferingName; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - @Override public String getName() { return s_name; } - @Override public List> getProperties() { return s_properties; } @@ -148,7 +111,7 @@ public class ListServiceOfferingsCmd extends BaseCmd { { List> offeringData = new ArrayList>(); - offeringData.add(new Pair(BaseCmd.Properties.ID.getName(), Long.toString(offering.getId()))); + offeringData.add(new Pair(BaseCmd.Properties.ID.getName(), offering.getId().toString())); offeringData.add(new Pair(BaseCmd.Properties.NAME.getName(), offering.getName())); offeringData.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT.getName(), offering.getDisplayText())); offeringData.add(new Pair(BaseCmd.Properties.CPU_NUMBER.getName(), Integer.valueOf(offering.getCpu()).toString())); diff --git a/server/src/com/cloud/api/commands/ListSnapshotPoliciesCmd.java b/server/src/com/cloud/api/commands/ListSnapshotPoliciesCmd.java index 5ecb57e1e86..f52e57fc7e0 100644 --- a/server/src/com/cloud/api/commands/ListSnapshotPoliciesCmd.java +++ b/server/src/com/cloud/api/commands/ListSnapshotPoliciesCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.SnapshotPolicyVO; import com.cloud.storage.VolumeVO; @@ -44,39 +43,6 @@ public class ListSnapshotPoliciesCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.VOLUME_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="volumeid", type=CommandType.LONG, required=true) - private Long volumeId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getVolumeId() { - return volumeId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/ListSnapshotsCmd.java b/server/src/com/cloud/api/commands/ListSnapshotsCmd.java index 8773eeed488..4f901bc87fd 100644 --- a/server/src/com/cloud/api/commands/ListSnapshotsCmd.java +++ b/server/src/com/cloud/api/commands/ListSnapshotsCmd.java @@ -25,15 +25,14 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.AsyncJobVO; import com.cloud.exception.InvalidParameterValueException; import com.cloud.server.Criteria; import com.cloud.storage.Snapshot; -import com.cloud.storage.Snapshot.SnapshotType; import com.cloud.storage.SnapshotVO; import com.cloud.storage.VolumeVO; +import com.cloud.storage.Snapshot.SnapshotType; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -44,81 +43,19 @@ public class ListSnapshotsCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.INTERVAL_TYPE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.SNAPSHOT_TYPE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.VOLUME_ID, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.INTERVAL_TYPE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.SNAPSHOT_TYPE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="intervalType", type=CommandType.STRING) - private String intervalType; - - @Parameter(name="name", type=CommandType.STRING) - private String snapshotName; - - @Parameter(name="snapshottype", type=CommandType.STRING) - private String snapshotType; - - @Parameter(name="volumeid", type=CommandType.LONG) - private Long volumeId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public String getIntervalType() { - return intervalType; - } - - public String getSnapshotName() { - return snapshotName; - } - - public String getSnapshotType() { - return snapshotType; - } - - public Long getVolumeId() { - return volumeId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } @@ -214,7 +151,7 @@ public class ListSnapshotsCmd extends BaseCmd { snapshotData.add(new Pair(BaseCmd.Properties.VOLUME_ID.getName(), volumeId)); snapshotData.add(new Pair(BaseCmd.Properties.VOLUME_NAME.getName(), volume.getName())); snapshotData.add(new Pair(BaseCmd.Properties.VOLUME_TYPE.getName(), volume.getVolumeType())); - snapshotData.add(new Pair(BaseCmd.Properties.CREATED.getName(), getDateString(snapshot.getCreated()))); + snapshotData.add(new Pair(BaseCmd.Properties.CREATED.getName(), snapshot.getCreated())); snapshotData.add(new Pair(BaseCmd.Properties.NAME.getName(), snapshot.getName())); AsyncJobVO asyncJob = getManagementServer().findInstancePendingAsyncJob("snapshot", snapshot.getId()); diff --git a/server/src/com/cloud/api/commands/ListStoragePoolsAndHostsCmd.java b/server/src/com/cloud/api/commands/ListStoragePoolsAndHostsCmd.java index 7f474325f26..3cbd24399bf 100644 --- a/server/src/com/cloud/api/commands/ListStoragePoolsAndHostsCmd.java +++ b/server/src/com/cloud/api/commands/ListStoragePoolsAndHostsCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.host.Host; import com.cloud.server.ManagementServer; import com.cloud.utils.Pair; @@ -39,76 +38,15 @@ public class ListStoragePoolsAndHostsCmd extends BaseCmd{ private static final ListHostsCmd storageHostsCmd = new ListHostsCmd(); static { - s_properties.add(new Pair(BaseCmd.Properties.IP_ADDRESS, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PATH, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IP_ADDRESS, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PATH, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="ipaddress", type=CommandType.STRING) - private String ipAddress; - - @Parameter(name="name", type=CommandType.STRING) - private String storagePoolName; - - @Parameter(name="path", type=CommandType.STRING) - private String path; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="state", type=CommandType.STRING) - private String state; - - @Parameter(name="type", type=CommandType.STRING) - private String type; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getIpAddress() { - return ipAddress; - } - - public String getStoragePoolName() { - return storagePoolName; - } - - public String getPath() { - return path; - } - - public Long getPodId() { - return podId; - } - - public String getState() { - return state; - } - - public String getType() { - return type; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; @@ -140,7 +78,7 @@ public class ListStoragePoolsAndHostsCmd extends BaseCmd{ } @Override - public Map validateParams(Map params, boolean decode) { + public Map validateParams(Map params, boolean decode) { Map result = storagePoolsCmd.validateParams(params, decode); result.putAll(storageHostsCmd.validateParams(params, decode)); return result; diff --git a/server/src/com/cloud/api/commands/ListStoragePoolsCmd.java b/server/src/com/cloud/api/commands/ListStoragePoolsCmd.java index abb5848c2f5..ff1a044247e 100644 --- a/server/src/com/cloud/api/commands/ListStoragePoolsCmd.java +++ b/server/src/com/cloud/api/commands/ListStoragePoolsCmd.java @@ -25,16 +25,13 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.ClusterVO; import com.cloud.server.Criteria; -import com.cloud.server.ManagementServer; +import com.cloud.storage.StoragePoolDetailVO; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StorageStats; -import com.cloud.storage.dao.VolumeDao; import com.cloud.utils.Pair; -import com.cloud.utils.component.ComponentLocator; public class ListStoragePoolsCmd extends BaseCmd{ public static final Logger s_logger = Logger.getLogger(ListStoragePoolsCmd.class.getName()); @@ -43,72 +40,16 @@ public class ListStoragePoolsCmd extends BaseCmd{ private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.CLUSTER_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.IP_ADDRESS, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PATH, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IP_ADDRESS, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PATH, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="clusterid", type=CommandType.LONG) - private Long clusterId; - - @Parameter(name="ipaddress", type=CommandType.STRING) - private String ipAddress; - - @Parameter(name="name", type=CommandType.STRING) - private String storagePoolName; - - @Parameter(name="path", type=CommandType.STRING) - private String path; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getClusterId() { - return clusterId; - } - - public String getIpAddress() { - return ipAddress; - } - - public String getStoragePoolName() { - return storagePoolName; - } - - public String getPath() { - return path; - } - - public Long getPodId() { - return podId; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; @@ -119,12 +60,12 @@ public class ListStoragePoolsCmd extends BaseCmd{ return s_properties; } + @SuppressWarnings("unchecked") @Override public List> execute(Map params) { String name = (String)params.get(BaseCmd.Properties.NAME.getName()); Long zoneId = (Long)params.get(BaseCmd.Properties.ZONE_ID.getName()); - Long podId = (Long)params.get(BaseCmd.Properties.POD_ID.getName()); - Long clusterId = (Long)params.get(BaseCmd.Properties.CLUSTER_ID.getName()); + Long podId = (Long)params.get(BaseCmd.Properties.POD_ID.getName()); String ipAddress = (String)params.get(BaseCmd.Properties.IP_ADDRESS.getName()); String path = (String)params.get(BaseCmd.Properties.PATH.getName()); String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName()); @@ -148,8 +89,7 @@ public class ListStoragePoolsCmd extends BaseCmd{ } else { c.addCriteria(Criteria.NAME, name); c.addCriteria(Criteria.DATACENTERID, zoneId); - c.addCriteria(Criteria.PODID, podId); - c.addCriteria(Criteria.CLUSTERID, clusterId); + c.addCriteria(Criteria.PODID, podId); c.addCriteria(Criteria.ADDRESS, ipAddress); c.addCriteria(Criteria.PATH, path); } @@ -160,8 +100,6 @@ public class ListStoragePoolsCmd extends BaseCmd{ throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "unable to find pools"); } - ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); - VolumeDao volDao = locator.getDao(VolumeDao.class); List> poolTags = new ArrayList>(); Object[] sTag = new Object[pools.size()]; int i = 0; @@ -210,11 +148,9 @@ public class ListStoragePoolsCmd extends BaseCmd{ poolData.add(new Pair(BaseCmd.Properties.TAGS.getName(), getManagementServer().getStoragePoolTags(pool.getId()))); sTag[i++] = poolData; - volDao.getCountAndTotalByPool(pool.getId()); } Pair poolTag = new Pair("storagepool", sTag); - poolTags.add(poolTag); - + poolTags.add(poolTag); return poolTags; } } diff --git a/server/src/com/cloud/api/commands/ListSystemVMsCmd.java b/server/src/com/cloud/api/commands/ListSystemVMsCmd.java index 4ae4939639c..6f79d056824 100644 --- a/server/src/com/cloud/api/commands/ListSystemVMsCmd.java +++ b/server/src/com/cloud/api/commands/ListSystemVMsCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.async.AsyncJobVO; import com.cloud.server.Criteria; import com.cloud.utils.Pair; @@ -39,86 +38,22 @@ public class ListSystemVMsCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.HOST_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.SYSTEM_VM_TYPE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.HOST_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.SYSTEM_VM_TYPE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="hostid", type=CommandType.LONG) - private Long hostId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String systemVmName; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="state", type=CommandType.STRING) - private String state; - - @Parameter(name="systemvmtype", type=CommandType.STRING) - private String systemVmType; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getHostId() { - return hostId; - } - - public Long getId() { - return id; - } - - public String getSystemVmName() { - return systemVmName; - } - - public Long getPodId() { - return podId; - } - - public String getState() { - return state; - } - - public String getSystemVmType() { - return systemVmType; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - @Override public String getName() { return s_name; } - @Override public List> getProperties() { return s_properties; } @@ -131,8 +66,7 @@ public class ListSystemVMsCmd extends BaseCmd { Long hostId = (Long)params.get(BaseCmd.Properties.HOST_ID.getName()); String name = (String)params.get(BaseCmd.Properties.NAME.getName()); String state = (String)params.get(BaseCmd.Properties.STATE.getName()); - String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName()); - String type = (String)params.get(BaseCmd.Properties.SYSTEM_VM_TYPE.getName()); + String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName()); Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName()); Integer pageSize = (Integer)params.get(BaseCmd.Properties.PAGESIZE.getName()); @@ -160,115 +94,94 @@ public class ListSystemVMsCmd extends BaseCmd { c.addCriteria(Criteria.NAME, name); c.addCriteria(Criteria.STATE, state); } - - List proxies = null; - List ssVms = null; - Object[] proxyDataArray = null; - - if(type == null) //search for all vm types - { - proxies = getManagementServer().searchForConsoleProxy(c); - ssVms = getManagementServer().searchForSecondaryStorageVm(c); - - proxyDataArray = new Object[proxies.size() + ssVms.size()]; - } - else if((type != null) && (type.equalsIgnoreCase("secondarystoragevm"))) // search for ssvm - { - ssVms = getManagementServer().searchForSecondaryStorageVm(c); - - proxyDataArray = new Object[ssVms.size()]; - } - else if((type != null) && (type.equalsIgnoreCase("consoleproxy"))) // search for consoleproxy - { - proxies = getManagementServer().searchForConsoleProxy(c); - - proxyDataArray = new Object[proxies.size()]; - } - + + List proxies = getManagementServer().searchForConsoleProxy(c); + List ssVms = getManagementServer().searchForSecondaryStorageVm(c); List> proxiesTags = new ArrayList>(); - int i = 0; - - if(proxies != null && proxies.size() > 0) - { - for (ConsoleProxyVO proxy : proxies) { - List> proxyData = new ArrayList>(); - proxyData.add(new Pair(BaseCmd.Properties.SYSTEM_VM_TYPE.getName(), "consoleproxy")); - - proxyData.add(new Pair(BaseCmd.Properties.ID.getName(), Long.toString(proxy.getId()))); - - AsyncJobVO asyncJob = getManagementServer().findInstancePendingAsyncJob("console_proxy", proxy.getId()); - if(asyncJob != null) { - proxyData.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), asyncJob.getId().toString())); - proxyData.add(new Pair(BaseCmd.Properties.JOB_STATUS.getName(), String.valueOf(asyncJob.getStatus()))); - } - - proxyData.add(new Pair(BaseCmd.Properties.ZONE_ID.getName(), Long.valueOf(proxy.getDataCenterId()).toString())); - proxyData.add(new Pair(BaseCmd.Properties.ZONE_NAME.getName(), getManagementServer().findDataCenterById(proxy.getDataCenterId()).getName())); - proxyData.add(new Pair(BaseCmd.Properties.DNS1.getName(), proxy.getDns1())); - proxyData.add(new Pair(BaseCmd.Properties.DNS2.getName(), proxy.getDns2())); - proxyData.add(new Pair(BaseCmd.Properties.NETWORK_DOMAIN.getName(), proxy.getDomain())); - proxyData.add(new Pair(BaseCmd.Properties.GATEWAY.getName(), proxy.getGateway())); - proxyData.add(new Pair(BaseCmd.Properties.NAME.getName(), proxy.getName())); - proxyData.add(new Pair(BaseCmd.Properties.POD_ID.getName(), Long.valueOf(proxy.getPodId()).toString())); - if (proxy.getHostId() != null) { - proxyData.add(new Pair(BaseCmd.Properties.HOST_ID.getName(), proxy.getHostId().toString())); - proxyData.add(new Pair(BaseCmd.Properties.HOST_NAME.getName(), getManagementServer().getHostBy(proxy.getHostId()).getName())); - } - proxyData.add(new Pair(BaseCmd.Properties.PRIVATE_IP.getName(), proxy.getPrivateIpAddress())); - proxyData.add(new Pair(BaseCmd.Properties.PRIVATE_MAC_ADDRESS.getName(), proxy.getPrivateMacAddress())); - proxyData.add(new Pair(BaseCmd.Properties.PRIVATE_NETMASK.getName(), proxy.getPrivateNetmask())); - proxyData.add(new Pair(BaseCmd.Properties.PUBLIC_IP.getName(), proxy.getPublicIpAddress())); - proxyData.add(new Pair(BaseCmd.Properties.PUBLIC_MAC_ADDRESS.getName(), proxy.getPublicMacAddress())); - proxyData.add(new Pair(BaseCmd.Properties.PUBLIC_NETMASK.getName(), proxy.getPublicNetmask())); - proxyData.add(new Pair(BaseCmd.Properties.TEMPLATE_ID.getName(), Long.valueOf(proxy.getTemplateId()).toString())); - proxyData.add(new Pair(BaseCmd.Properties.CREATED.getName(), getDateString(proxy.getCreated()))); - proxyData.add(new Pair(BaseCmd.Properties.ACTIVE_VIEWER_SESSIONS.getName(), - String.valueOf(proxy.getActiveSession()))); - - if (proxy.getState() != null) { - proxyData.add(new Pair(BaseCmd.Properties.STATE.getName(), proxy.getState().toString())); - } - - proxyDataArray[i++] = proxyData; - } - } + + Object[] proxyDataArray = new Object[proxies.size() + ssVms.size()]; + int i = 0; + + for (ConsoleProxyVO proxy : proxies) { + List> proxyData = new ArrayList>(); + proxyData.add(new Pair(BaseCmd.Properties.SYSTEM_VM_TYPE.getName(), "consoleproxy")); + + if (proxy.getId() != null) { + proxyData.add(new Pair(BaseCmd.Properties.ID.getName(), proxy.getId().toString())); + } + + AsyncJobVO asyncJob = getManagementServer().findInstancePendingAsyncJob("console_proxy", proxy.getId()); + if(asyncJob != null) { + proxyData.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), asyncJob.getId().toString())); + proxyData.add(new Pair(BaseCmd.Properties.JOB_STATUS.getName(), String.valueOf(asyncJob.getStatus()))); + } + + proxyData.add(new Pair(BaseCmd.Properties.ZONE_ID.getName(), Long.valueOf(proxy.getDataCenterId()).toString())); + proxyData.add(new Pair(BaseCmd.Properties.ZONE_NAME.getName(), getManagementServer().findDataCenterById(proxy.getDataCenterId()).getName())); + proxyData.add(new Pair(BaseCmd.Properties.DNS1.getName(), proxy.getDns1())); + proxyData.add(new Pair(BaseCmd.Properties.DNS2.getName(), proxy.getDns2())); + proxyData.add(new Pair(BaseCmd.Properties.NETWORK_DOMAIN.getName(), proxy.getDomain())); + proxyData.add(new Pair(BaseCmd.Properties.GATEWAY.getName(), proxy.getGateway())); + proxyData.add(new Pair(BaseCmd.Properties.NAME.getName(), proxy.getName())); + proxyData.add(new Pair(BaseCmd.Properties.POD_ID.getName(), Long.valueOf(proxy.getPodId()).toString())); + if (proxy.getHostId() != null) { + proxyData.add(new Pair(BaseCmd.Properties.HOST_ID.getName(), proxy.getHostId().toString())); + proxyData.add(new Pair(BaseCmd.Properties.HOST_NAME.getName(), getManagementServer().getHostBy(proxy.getHostId()).getName())); + } + proxyData.add(new Pair(BaseCmd.Properties.PRIVATE_IP.getName(), proxy.getPrivateIpAddress())); + proxyData.add(new Pair(BaseCmd.Properties.PRIVATE_MAC_ADDRESS.getName(), proxy.getPrivateMacAddress())); + proxyData.add(new Pair(BaseCmd.Properties.PRIVATE_NETMASK.getName(), proxy.getPrivateNetmask())); + proxyData.add(new Pair(BaseCmd.Properties.PUBLIC_IP.getName(), proxy.getPublicIpAddress())); + proxyData.add(new Pair(BaseCmd.Properties.PUBLIC_MAC_ADDRESS.getName(), proxy.getPublicMacAddress())); + proxyData.add(new Pair(BaseCmd.Properties.PUBLIC_NETMASK.getName(), proxy.getPublicNetmask())); + proxyData.add(new Pair(BaseCmd.Properties.TEMPLATE_ID.getName(), Long.valueOf(proxy.getTemplateId()).toString())); + proxyData.add(new Pair(BaseCmd.Properties.CREATED.getName(), getDateString(proxy.getCreated()))); + proxyData.add(new Pair(BaseCmd.Properties.ACTIVE_VIEWER_SESSIONS.getName(), + String.valueOf(proxy.getActiveSession()))); + + if (proxy.getState() != null) { + proxyData.add(new Pair(BaseCmd.Properties.STATE.getName(), proxy.getState().toString())); + } + + proxyDataArray[i++] = proxyData; + } - if(ssVms != null && ssVms.size() > 0) - { - for (SecondaryStorageVmVO ssVm : ssVms) { - List> ssvmData = new ArrayList>(); - ssvmData.add(new Pair(BaseCmd.Properties.SYSTEM_VM_TYPE.getName(), "secondarystoragevm")); - ssvmData.add(new Pair(BaseCmd.Properties.ID.getName(), ssVm.getId())); - - ssvmData.add(new Pair(BaseCmd.Properties.ZONE_ID.getName(), Long.valueOf(ssVm.getDataCenterId()).toString())); - ssvmData.add(new Pair(BaseCmd.Properties.ZONE_NAME.getName(), getManagementServer().findDataCenterById(ssVm.getDataCenterId()).getName())); - ssvmData.add(new Pair(BaseCmd.Properties.DNS1.getName(), ssVm.getDns1())); - ssvmData.add(new Pair(BaseCmd.Properties.DNS2.getName(), ssVm.getDns2())); - ssvmData.add(new Pair(BaseCmd.Properties.NETWORK_DOMAIN.getName(), ssVm.getDomain())); - ssvmData.add(new Pair(BaseCmd.Properties.GATEWAY.getName(), ssVm.getGateway())); - ssvmData.add(new Pair(BaseCmd.Properties.NAME.getName(), ssVm.getName())); - ssvmData.add(new Pair(BaseCmd.Properties.POD_ID.getName(), Long.valueOf(ssVm.getPodId()).toString())); - if (ssVm.getHostId() != null) { - ssvmData.add(new Pair(BaseCmd.Properties.HOST_ID.getName(), ssVm.getHostId().toString())); - ssvmData.add(new Pair(BaseCmd.Properties.HOST_NAME.getName(), getManagementServer().getHostBy(ssVm.getHostId()).getName())); - } - ssvmData.add(new Pair(BaseCmd.Properties.PRIVATE_IP.getName(), ssVm.getPrivateIpAddress())); - ssvmData.add(new Pair(BaseCmd.Properties.PRIVATE_MAC_ADDRESS.getName(), ssVm.getPrivateMacAddress())); - ssvmData.add(new Pair(BaseCmd.Properties.PRIVATE_NETMASK.getName(), ssVm.getPrivateNetmask())); - ssvmData.add(new Pair(BaseCmd.Properties.PUBLIC_IP.getName(), ssVm.getPublicIpAddress())); - ssvmData.add(new Pair(BaseCmd.Properties.PUBLIC_MAC_ADDRESS.getName(), ssVm.getPublicMacAddress())); - ssvmData.add(new Pair(BaseCmd.Properties.PUBLIC_NETMASK.getName(), ssVm.getPublicNetmask())); - ssvmData.add(new Pair(BaseCmd.Properties.TEMPLATE_ID.getName(), Long.valueOf(ssVm.getTemplateId()).toString())); - ssvmData.add(new Pair(BaseCmd.Properties.CREATED.getName(), getDateString(ssVm.getCreated()))); - - if (ssVm.getState() != null) { - ssvmData.add(new Pair(BaseCmd.Properties.STATE.getName(), ssVm.getState().toString())); - } - - proxyDataArray[i++] = ssvmData; - } - } - proxiesTags.add(new Pair("systemvm", proxyDataArray)); + + for (SecondaryStorageVmVO ssVm : ssVms) { + List> ssvmData = new ArrayList>(); + ssvmData.add(new Pair(BaseCmd.Properties.SYSTEM_VM_TYPE.getName(), "secondarystoragevm")); + if (ssVm.getId() != null) { + ssvmData.add(new Pair(BaseCmd.Properties.ID.getName(), ssVm.getId().toString())); + } + + ssvmData.add(new Pair(BaseCmd.Properties.ZONE_ID.getName(), Long.valueOf(ssVm.getDataCenterId()).toString())); + ssvmData.add(new Pair(BaseCmd.Properties.ZONE_NAME.getName(), getManagementServer().findDataCenterById(ssVm.getDataCenterId()).getName())); + ssvmData.add(new Pair(BaseCmd.Properties.DNS1.getName(), ssVm.getDns1())); + ssvmData.add(new Pair(BaseCmd.Properties.DNS2.getName(), ssVm.getDns2())); + ssvmData.add(new Pair(BaseCmd.Properties.NETWORK_DOMAIN.getName(), ssVm.getDomain())); + ssvmData.add(new Pair(BaseCmd.Properties.GATEWAY.getName(), ssVm.getGateway())); + ssvmData.add(new Pair(BaseCmd.Properties.NAME.getName(), ssVm.getName())); + ssvmData.add(new Pair(BaseCmd.Properties.POD_ID.getName(), Long.valueOf(ssVm.getPodId()).toString())); + if (ssVm.getHostId() != null) { + ssvmData.add(new Pair(BaseCmd.Properties.HOST_ID.getName(), ssVm.getHostId().toString())); + ssvmData.add(new Pair(BaseCmd.Properties.HOST_NAME.getName(), getManagementServer().getHostBy(ssVm.getHostId()).getName())); + } + ssvmData.add(new Pair(BaseCmd.Properties.PRIVATE_IP.getName(), ssVm.getPrivateIpAddress())); + ssvmData.add(new Pair(BaseCmd.Properties.PRIVATE_MAC_ADDRESS.getName(), ssVm.getPrivateMacAddress())); + ssvmData.add(new Pair(BaseCmd.Properties.PRIVATE_NETMASK.getName(), ssVm.getPrivateNetmask())); + ssvmData.add(new Pair(BaseCmd.Properties.PUBLIC_IP.getName(), ssVm.getPublicIpAddress())); + ssvmData.add(new Pair(BaseCmd.Properties.PUBLIC_MAC_ADDRESS.getName(), ssVm.getPublicMacAddress())); + ssvmData.add(new Pair(BaseCmd.Properties.PUBLIC_NETMASK.getName(), ssVm.getPublicNetmask())); + ssvmData.add(new Pair(BaseCmd.Properties.TEMPLATE_ID.getName(), Long.valueOf(ssVm.getTemplateId()).toString())); + ssvmData.add(new Pair(BaseCmd.Properties.CREATED.getName(), getDateString(ssVm.getCreated()))); + + if (ssVm.getState() != null) { + ssvmData.add(new Pair(BaseCmd.Properties.STATE.getName(), ssVm.getState().toString())); + } + + proxyDataArray[i++] = ssvmData; + } + proxiesTags.add(new Pair("systemvm", proxyDataArray)); return proxiesTags; } } diff --git a/server/src/com/cloud/api/commands/ListTemplateOrIsoPermissionsCmd.java b/server/src/com/cloud/api/commands/ListTemplateOrIsoPermissionsCmd.java deleted file mode 100644 index 73185fd8d52..00000000000 --- a/server/src/com/cloud/api/commands/ListTemplateOrIsoPermissionsCmd.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.cloud.api.commands; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - -import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.domain.DomainVO; -import com.cloud.storage.VMTemplateVO; -import com.cloud.user.Account; -import com.cloud.utils.Pair; - -public class ListTemplateOrIsoPermissionsCmd extends BaseCmd { - public Logger s_logger = getLogger(); - protected static final List> s_properties = new ArrayList>(); - protected String s_name = getResponseName(); - - static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); - } - - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - @Override - public String getName() { - return s_name; - } - @Override - public List> getProperties() { - return s_properties; - } - - protected boolean templateIsCorrectType(VMTemplateVO template) { - return true; - } - - protected String getResponseName() { - return "updatetemplateorisopermissionsresponse"; - } - - protected String getMediaType() { - return "templateOrIso"; - } - - protected Logger getLogger() { - return Logger.getLogger(UpdateTemplateOrIsoPermissionsCmd.class.getName()); - } - - @Override - public List> execute(Map params) { - Long id = (Long)params.get(BaseCmd.Properties.ID.getName()); - Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); - String acctName = (String)params.get(BaseCmd.Properties.ACCOUNT.getName()); - Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName()); - Long accountId = null; - - if ((account == null) || account.getType() == Account.ACCOUNT_TYPE_ADMIN) { - // validate domainId before proceeding - if (domainId != null) { - if ((account != null) && !getManagementServer().isChildDomain(account.getDomainId(), domainId)) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid domain id (" + domainId + ") given, unable to list " + getMediaType() + " permissions."); - } - if (acctName != null) { - Account userAccount = getManagementServer().findAccountByName(acctName, domainId); - if (userAccount != null) { - accountId = userAccount.getId(); - } else { - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to find account " + acctName + " in domain " + domainId); - } - } - } - } else { - accountId = account.getId(); - } - - VMTemplateVO template = getManagementServer().findTemplateById(id.longValue()); - if (template == null || !templateIsCorrectType(template)) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "unable to find " + getMediaType() + " with id " + id); - } - - if (accountId != null && !template.isPublicTemplate()) { - if (account.getType() == Account.ACCOUNT_TYPE_NORMAL && template.getAccountId() != accountId) { - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "unable to list permissions for " + getMediaType() + " with id " + id); - } else if (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) { - DomainVO accountDomain = getManagementServer().findDomainIdById(account.getDomainId()); - Account templateAccount = getManagementServer().findAccountById(template.getAccountId()); - DomainVO templateDomain = getManagementServer().findDomainIdById(templateAccount.getDomainId()); - if (!templateDomain.getPath().contains(accountDomain.getPath())) { - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "unable to list permissions for " + getMediaType() + " with id " + id); - } - } - } - - if (id == Long.valueOf(1)) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "unable to list permissions for " + getMediaType() + " with id " + id); - } - - List accountNames = getManagementServer().listTemplatePermissions(id); - - boolean isAdmin = ((account == null) || isAdmin(account.getType())); - Long templateOwnerDomain = null; - if (isAdmin) { - Account templateOwner = getManagementServer().findAccountById(template.getAccountId()); - if (templateOwner != null) { - templateOwnerDomain = templateOwner.getDomainId(); - } - } - - List> embeddedObject = new ArrayList>(); - List> returnValues = new ArrayList>(); - returnValues.add(new Pair(BaseCmd.Properties.ID.getName(), template.getId().toString())); - returnValues.add(new Pair(BaseCmd.Properties.IS_PUBLIC.getName(), Boolean.valueOf(template.isPublicTemplate()).toString())); - if (isAdmin && (templateOwnerDomain != null)) { - returnValues.add(new Pair(BaseCmd.Properties.DOMAIN_ID.getName(), templateOwnerDomain.toString())); - } - if ((accountNames != null) && !accountNames.isEmpty()) { - for (String accountName : accountNames) { - returnValues.add(new Pair(BaseCmd.Properties.ACCOUNT.getName(), accountName)); - } - } - embeddedObject.add(new Pair(getMediaType() + "permission", new Object[] { returnValues } )); - return embeddedObject; - } -} diff --git a/server/src/com/cloud/api/commands/ListTemplatePermissionsCmd.java b/server/src/com/cloud/api/commands/ListTemplatePermissionsCmd.java index 8525fc31d88..e0b9fc857ca 100644 --- a/server/src/com/cloud/api/commands/ListTemplatePermissionsCmd.java +++ b/server/src/com/cloud/api/commands/ListTemplatePermissionsCmd.java @@ -18,25 +18,114 @@ package com.cloud.api.commands; -import org.apache.log4j.Logger; - -import com.cloud.storage.Storage.ImageFormat; -import com.cloud.storage.VMTemplateVO; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; -public class ListTemplatePermissionsCmd extends ListTemplateOrIsoPermissionsCmd { - protected String getResponseName() { - return "listtemplatepermissionsresponse"; - } - - protected String getMediaType() { - return "template"; - } - - protected Logger getLogger() { - return Logger.getLogger(ListTemplatePermissionsCmd.class.getName()); - } - - protected boolean templateIsCorrectType(VMTemplateVO template) { - return !template.getFormat().equals(ImageFormat.ISO); - } +import org.apache.log4j.Logger; + +import com.cloud.api.BaseCmd; +import com.cloud.api.ServerApiException; +import com.cloud.domain.DomainVO; +import com.cloud.storage.VMTemplateVO; +import com.cloud.user.Account; +import com.cloud.utils.Pair; + +public class ListTemplatePermissionsCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(ListTemplatePermissionsCmd.class.getName()); + + private static final String s_name = "listtemplatepermissionsresponse"; + private static final List> s_properties = new ArrayList>(); + + static { + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); + } + + @Override + public String getName() { + return s_name; + } + @Override + public List> getProperties() { + return s_properties; + } + + @Override + public List> execute(Map params) { + Long templateId = (Long)params.get(BaseCmd.Properties.ID.getName()); + Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); + String acctName = (String)params.get(BaseCmd.Properties.ACCOUNT.getName()); + Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName()); + Long accountId = null; + + if ((account == null) || account.getType() == Account.ACCOUNT_TYPE_ADMIN) { + // validate domainId before proceeding + if (domainId != null) { + if ((account != null) && !getManagementServer().isChildDomain(account.getDomainId(), domainId)) { + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid domain id (" + domainId + ") given, unable to list template permissions."); + } + if (acctName != null) { + Account userAccount = getManagementServer().findAccountByName(acctName, domainId); + if (userAccount != null) { + accountId = userAccount.getId(); + } else { + throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to find account " + acctName + " in domain " + domainId); + } + } + } + } else { + accountId = account.getId(); + } + + VMTemplateVO template = getManagementServer().findTemplateById(templateId.longValue()); + if (template == null) { + throw new ServerApiException(BaseCmd.PARAM_ERROR, "unable to find template with id " + templateId); + } + + if (accountId != null && !template.isPublicTemplate()) { + if (account.getType() == Account.ACCOUNT_TYPE_NORMAL && template.getAccountId() != accountId) { + throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "unable to list permissions for template with id " + templateId); + } else if (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) { + DomainVO accountDomain = getManagementServer().findDomainIdById(account.getDomainId()); + Account templateAccount = getManagementServer().findAccountById(template.getAccountId()); + DomainVO templateDomain = getManagementServer().findDomainIdById(templateAccount.getDomainId()); + if (!templateDomain.getPath().contains(accountDomain.getPath())) { + throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "unable to list permissions for template with id " + templateId); + } + } + } + + if (templateId == Long.valueOf(1)) { + throw new ServerApiException(BaseCmd.PARAM_ERROR, "unable to list permissions fo template with id " + templateId); + } + + List accountNames = getManagementServer().listTemplatePermissions(templateId); + + boolean isAdmin = ((account == null) || isAdmin(account.getType())); + Long templateOwnerDomain = null; + if (isAdmin) { + Account templateOwner = getManagementServer().findAccountById(template.getAccountId()); + if (templateOwner != null) { + templateOwnerDomain = templateOwner.getDomainId(); + } + } + + List> embeddedObject = new ArrayList>(); + List> returnValues = new ArrayList>(); + returnValues.add(new Pair(BaseCmd.Properties.ID.getName(), template.getId().toString())); + returnValues.add(new Pair(BaseCmd.Properties.IS_PUBLIC.getName(), Boolean.valueOf(template.isPublicTemplate()).toString())); + if (isAdmin && (templateOwnerDomain != null)) { + returnValues.add(new Pair(BaseCmd.Properties.DOMAIN_ID.getName(), templateOwnerDomain.toString())); + } + if ((accountNames != null) && !accountNames.isEmpty()) { + for (String accountName : accountNames) { + returnValues.add(new Pair(BaseCmd.Properties.ACCOUNT.getName(), accountName)); + } + } + embeddedObject.add(new Pair("templatepermission", new Object[] { returnValues } )); + return embeddedObject; + } } diff --git a/server/src/com/cloud/api/commands/ListTemplatesCmd.java b/server/src/com/cloud/api/commands/ListTemplatesCmd.java index be511abea1c..efbaec91a57 100644 --- a/server/src/com/cloud/api/commands/ListTemplatesCmd.java +++ b/server/src/com/cloud/api/commands/ListTemplatesCmd.java @@ -25,15 +25,14 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.AsyncJobVO; import com.cloud.dc.DataCenterVO; import com.cloud.host.HostVO; import com.cloud.storage.GuestOS; import com.cloud.storage.VMTemplateHostVO; -import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.dao.VMTemplateDao.TemplateFilter; import com.cloud.storage.template.TemplateConstants; import com.cloud.user.Account; @@ -46,6 +45,7 @@ public class ListTemplatesCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); @@ -53,68 +53,13 @@ public class ListTemplatesCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.IS_READY, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.TEMPLATE_FILTER, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); + } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String templateName; - - @Parameter(name="templatefilter", type=CommandType.STRING, required=true) - private String templateFilter; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public String getTemplateName() { - return templateName; - } - - public String getTemplateFilter() { - return templateFilter; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; @@ -131,6 +76,8 @@ public class ListTemplatesCmd extends BaseCmd { Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName()); Long id = (Long) params.get(BaseCmd.Properties.ID.getName()); String name = (String) params.get(BaseCmd.Properties.NAME.getName()); + Boolean isPublic = (Boolean) params.get(BaseCmd.Properties.IS_PUBLIC.getName()); + Boolean isReady = (Boolean) params.get(BaseCmd.Properties.IS_READY.getName()); String templateFilterString = (String) params.get(BaseCmd.Properties.TEMPLATE_FILTER.getName()); String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName()); Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName()); diff --git a/server/src/com/cloud/api/commands/ListUsersCmd.java b/server/src/com/cloud/api/commands/ListUsersCmd.java index d88964f2647..559b3831712 100644 --- a/server/src/com/cloud/api/commands/ListUsersCmd.java +++ b/server/src/com/cloud/api/commands/ListUsersCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; import com.cloud.server.Criteria; @@ -40,73 +39,18 @@ public class ListUsersCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_TYPE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USERNAME, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_TYPE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="accounttype", type=CommandType.LONG) - private Long accountType; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="state", type=CommandType.STRING) - private String state; - - @Parameter(name="username", type=CommandType.STRING) - private String username; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getAccountType() { - return accountType; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public String getState() { - return state; - } - - public String getUsername() { - return username; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ListVMsCmd.java b/server/src/com/cloud/api/commands/ListVMsCmd.java index 2f902018c7d..7bb83d85b35 100644 --- a/server/src/com/cloud/api/commands/ListVMsCmd.java +++ b/server/src/com/cloud/api/commands/ListVMsCmd.java @@ -27,18 +27,19 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.AsyncJobVO; import com.cloud.domain.DomainVO; import com.cloud.host.HostVO; +import com.cloud.network.security.NetworkGroupVMMapVO; +import com.cloud.network.security.NetworkGroupVO; import com.cloud.server.Criteria; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; -import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.vm.VmStats; +import com.cloud.vm.UserVm; public class ListVMsCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(ListVMsCmd.class.getName()); @@ -47,89 +48,20 @@ public class ListVMsCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.HOST_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.HOST_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="hostid", type=CommandType.LONG) - private Long hostId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String instanceName; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="state", type=CommandType.STRING) - private String state; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getHostId() { - return hostId; - } - - public Long getId() { - return id; - } - - public String getInstanceName() { - return instanceName; - } - - public Long getPodId() { - return podId; - } - - public String getState() { - return state; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; @@ -204,16 +136,12 @@ public class ListVMsCmd extends BaseCmd { c.addCriteria(Criteria.ID, id); c.addCriteria(Criteria.NAME, name); c.addCriteria(Criteria.STATE, state); - - if(zoneId != null) - c.addCriteria(Criteria.DATACENTERID, zoneId); + c.addCriteria(Criteria.DATACENTERID, zoneId); // ignore these search requests if it's not an admin if (isAdmin == true) { c.addCriteria(Criteria.DOMAINID, domainId); - - if(podId != null) - c.addCriteria(Criteria.PODID, podId); + c.addCriteria(Criteria.PODID, podId); c.addCriteria(Criteria.HOSTID, hostId); } } @@ -244,7 +172,7 @@ public class ListVMsCmd extends BaseCmd { vmData.add(new Pair(BaseCmd.Properties.JOB_STATUS.getName(), String.valueOf(asyncJob.getStatus()))); } - vmData.add(new Pair(BaseCmd.Properties.ID.getName(), Long.toString(vmInstance.getId()))); + vmData.add(new Pair(BaseCmd.Properties.ID.getName(), vmInstance.getId().toString())); vmData.add(new Pair(BaseCmd.Properties.NAME.getName(), vmInstance.getName())); vmData.add(new Pair(BaseCmd.Properties.CREATED.getName(), getDateString(vmInstance.getCreated()))); vmData.add(new Pair(BaseCmd.Properties.IP_ADDRESS.getName(), vmInstance.getPrivateIpAddress())); @@ -328,8 +256,6 @@ public class ListVMsCmd extends BaseCmd { vmData.add(new Pair(BaseCmd.Properties.NETWORK_KB_WRITE.getName(), networkKbWrite)); } - vmData.add(new Pair(BaseCmd.Properties.OS_TYPE_ID.getName(),vmInstance.getGuestOSId())); - //network groups vmData.add(new Pair(BaseCmd.Properties.NETWORK_GROUP_LIST.getName(), getManagementServer().getNetworkGroupsNamesForVm(vmInstance.getId()))); diff --git a/server/src/com/cloud/api/commands/ListVlanIpRangesCmd.java b/server/src/com/cloud/api/commands/ListVlanIpRangesCmd.java index 7a43118b74d..69b6dc311d8 100644 --- a/server/src/com/cloud/api/commands/ListVlanIpRangesCmd.java +++ b/server/src/com/cloud/api/commands/ListVlanIpRangesCmd.java @@ -18,20 +18,20 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.HostPodVO; -import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.VlanVO; +import com.cloud.dc.Vlan.VlanType; import com.cloud.server.Criteria; import com.cloud.user.Account; +import com.cloud.user.AccountVO; import com.cloud.utils.Pair; public class ListVlanIpRangesCmd extends BaseCmd { @@ -41,72 +41,18 @@ public class ListVlanIpRangesCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { + s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.VLAN, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.VLAN, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="vlan", type=CommandType.STRING) - private String vlan; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getId() { - return id; - } - - public Long getPodId() { - return podId; - } - - public String getVlan() { - return vlan; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } @@ -122,6 +68,7 @@ public class ListVlanIpRangesCmd extends BaseCmd { String accountName = (String) params.get(BaseCmd.Properties.ACCOUNT.getName()); Long domainId = (Long) params.get(BaseCmd.Properties.DOMAIN_ID.getName()); Long podId = (Long) params.get(BaseCmd.Properties.POD_ID.getName()); + String name = (String) params.get(BaseCmd.Properties.NAME.getName()); String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName()); Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName()); Integer pageSize = (Integer)params.get(BaseCmd.Properties.PAGESIZE.getName()); diff --git a/server/src/com/cloud/api/commands/ListVolumesCmd.java b/server/src/com/cloud/api/commands/ListVolumesCmd.java index eb70306b43c..403654ef300 100644 --- a/server/src/com/cloud/api/commands/ListVolumesCmd.java +++ b/server/src/com/cloud/api/commands/ListVolumesCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.AsyncJobVO; import com.cloud.domain.DomainVO; @@ -44,107 +43,27 @@ public class ListVolumesCmd extends BaseCmd{ static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.HOST_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.POD_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.HOST_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="hostid", type=CommandType.LONG) - private Long hostId; - - @Parameter(name="id", type=CommandType.LONG) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String volumeName; - - @Parameter(name="podid", type=CommandType.LONG) - private Long podId; - - @Parameter(name="type", type=CommandType.STRING) - private String type; - - @Parameter(name="virtualmachineid", type=CommandType.LONG) - private Long virtualMachineId; - - @Parameter(name="zoneid", type=CommandType.LONG) - private Long zoneId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getHostId() { - return hostId; - } - - public Long getId() { - return id; - } - - public String getVolumeName() { - return volumeName; - } - - public Long getPodId() { - return podId; - } - - public String getType() { - return type; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - @Override public String getName() { return s_name; } - @Override public List> getProperties() { return s_properties; } - @Override public List> execute(Map params) { Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); Long id = (Long)params.get(BaseCmd.Properties.ID.getName()); @@ -252,17 +171,20 @@ public class ListVolumesCmd extends BaseCmd{ volumeData.add(new Pair(BaseCmd.Properties.TYPE.getName(), volume.getVolumeType())); //volumeData.add(new Pair(BaseCmd.Properties.HOST_NAME.getName(), getManagementServer().getHostBy(volume.getHostId()).getName())); - - //volume.getDeviceId() might be null - if(volume.getDeviceId() != null) - volumeData.add(new Pair(BaseCmd.Properties.DEVICE_ID.getName(), Long.valueOf(volume.getDeviceId()).toString())); - + Long instanceId = volume.getInstanceId(); if (instanceId != null) { VMInstanceVO vm = getManagementServer().findVMInstanceById(instanceId); volumeData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID.getName(), vm.getId())); volumeData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_NAME.getName(), vm.getName())); - volumeData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_DISPLAYNAME.getName(), vm.getName())); + + if (vm.getDisplayName() != null) { + volumeData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_DISPLAYNAME.getName(), vm.getDisplayName())); + } + else { + volumeData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_DISPLAYNAME.getName(), vm.getName())); + } + volumeData.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_STATE.getName(), vm.getState())); } @@ -282,12 +204,8 @@ public class ListVolumesCmd extends BaseCmd{ } String storageType; - try { - if(volume.getPoolId() == null){ - storageType = "unknown"; - } else { - storageType = getManagementServer().volumeIsOnSharedStorage(volume.getId()) ? "shared" : "local"; - } + try { + storageType = getManagementServer().volumeIsOnSharedStorage(volume.getId()) ? "shared" : "local"; } catch (InvalidParameterValueException e) { s_logger.error(e.getMessage(), e); throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Volume " + volume.getName() + " does not have a valid ID"); diff --git a/server/src/com/cloud/api/commands/ListZonesByCmd.java b/server/src/com/cloud/api/commands/ListZonesByCmd.java index bf6b2868153..e15687ea88d 100644 --- a/server/src/com/cloud/api/commands/ListZonesByCmd.java +++ b/server/src/com/cloud/api/commands/ListZonesByCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.DataCenterVO; import com.cloud.user.Account; @@ -39,29 +38,11 @@ public class ListZonesByCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.AVAILABLE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="available", type=CommandType.BOOLEAN) - private Boolean available; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Boolean isAvailable() { - return available; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/LockAccountCmd.java b/server/src/com/cloud/api/commands/LockAccountCmd.java index dc6e2bb76cb..397ec3d8eca 100644 --- a/server/src/com/cloud/api/commands/LockAccountCmd.java +++ b/server/src/com/cloud/api/commands/LockAccountCmd.java @@ -17,17 +17,16 @@ */ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - -import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.user.Account; -import com.cloud.utils.Pair; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.cloud.api.BaseCmd; +import com.cloud.api.ServerApiException; +import com.cloud.user.Account; +import com.cloud.utils.Pair; public class LockAccountCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(LockAccountCmd.class.getName()); @@ -41,32 +40,6 @@ public class LockAccountCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING, required=true) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG, required=true) - private Long domainId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/LockUserCmd.java b/server/src/com/cloud/api/commands/LockUserCmd.java index fde82869a47..5f17436c53d 100644 --- a/server/src/com/cloud/api/commands/LockUserCmd.java +++ b/server/src/com/cloud/api/commands/LockUserCmd.java @@ -17,18 +17,17 @@ */ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - -import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.cloud.utils.Pair; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.cloud.api.BaseCmd; +import com.cloud.api.ServerApiException; +import com.cloud.user.Account; +import com.cloud.user.User; +import com.cloud.utils.Pair; public class LockUserCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(LockUserCmd.class.getName()); @@ -37,29 +36,10 @@ public class LockUserCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/PrepareForMaintenanceCmd.java b/server/src/com/cloud/api/commands/PrepareForMaintenanceCmd.java index 5c4ffcbb908..951997b54a1 100644 --- a/server/src/com/cloud/api/commands/PrepareForMaintenanceCmd.java +++ b/server/src/com/cloud/api/commands/PrepareForMaintenanceCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.host.HostVO; @@ -41,25 +40,6 @@ public class PrepareForMaintenanceCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/PreparePrimaryStorageForMaintenanceCmd.java b/server/src/com/cloud/api/commands/PreparePrimaryStorageForMaintenanceCmd.java deleted file mode 100644 index f506eba3f82..00000000000 --- a/server/src/com/cloud/api/commands/PreparePrimaryStorageForMaintenanceCmd.java +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.api.commands; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - -import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.host.Status; -import com.cloud.storage.StoragePoolVO; -import com.cloud.utils.Pair; - -public class PreparePrimaryStorageForMaintenanceCmd extends BaseCmd { - public static final Logger s_logger = Logger.getLogger(PreparePrimaryStorageForMaintenanceCmd.class.getName()); - - private static final String s_name = "prepareprimarystorageformaintenanceresponse"; - private static final List> s_properties = new ArrayList>(); - - static { - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); - } - - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - public String getName() { - return s_name; - } - - public List> getProperties() { - return s_properties; - } - - public static String getResultObjectName() { - return "primarystorage"; - } - - @Override - public List> execute(Map params) { - Long storagePoolId = (Long)params.get(BaseCmd.Properties.ID.getName()); - //verify input parameters - StoragePoolVO storagePool = getManagementServer().findPoolById(storagePoolId); - - if (storagePool == null) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Primary storage with id " + storagePoolId + " doesn't exist"); - } - - if (!storagePool.getStatus().equals(Status.Up)) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Primary storage with id " + storagePoolId + " is not ready for migration, as the status is:"+storagePool.getStatus().toString()); - } - - long jobId = 0; - try { - jobId = getManagementServer().preparePrimaryStorageForMaintenanceAsync(storagePoolId); - } catch (InvalidParameterValueException e) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to prepare primary storage for maintenance: " + e.getMessage()); - } - - if(jobId == 0) { - s_logger.warn("Unable to schedule async-job for PreparePrimaryStorageForMaintenance comamnd"); - } else { - if(s_logger.isDebugEnabled()) - s_logger.debug("PreparePrimaryStorageForMaintenance command has been accepted, job id: " + jobId); - } - - List> returnValues = new ArrayList>(); - returnValues.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), Long.valueOf(jobId))); - returnValues.add(new Pair(BaseCmd.Properties.STATE.getName(), Status.PrepareForMaintenance)); - return returnValues; - } -} diff --git a/server/src/com/cloud/api/commands/QueryAsyncJobResultCmd.java b/server/src/com/cloud/api/commands/QueryAsyncJobResultCmd.java index d897536585e..898ba29aece 100644 --- a/server/src/com/cloud/api/commands/QueryAsyncJobResultCmd.java +++ b/server/src/com/cloud/api/commands/QueryAsyncJobResultCmd.java @@ -18,15 +18,14 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.AsyncJobResult; import com.cloud.async.executor.IngressRuleResultObject; @@ -45,25 +44,6 @@ public class QueryAsyncJobResultCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.JOB_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/RebootRouterCmd.java b/server/src/com/cloud/api/commands/RebootRouterCmd.java index c3885b1fd30..bc672ef4434 100644 --- a/server/src/com/cloud/api/commands/RebootRouterCmd.java +++ b/server/src/com/cloud/api/commands/RebootRouterCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -42,25 +41,6 @@ public class RebootRouterCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/RebootSystemVmCmd.java b/server/src/com/cloud/api/commands/RebootSystemVmCmd.java index f5baa46cc42..0632dd6b028 100644 --- a/server/src/com/cloud/api/commands/RebootSystemVmCmd.java +++ b/server/src/com/cloud/api/commands/RebootSystemVmCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.utils.Pair; import com.cloud.vm.VMInstanceVO; @@ -40,25 +39,6 @@ public class RebootSystemVmCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/RebootVMCmd.java b/server/src/com/cloud/api/commands/RebootVMCmd.java index 8550c16bceb..37595f62d2b 100644 --- a/server/src/com/cloud/api/commands/RebootVMCmd.java +++ b/server/src/com/cloud/api/commands/RebootVMCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -42,25 +41,6 @@ public class RebootVMCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ReconnectHostCmd.java b/server/src/com/cloud/api/commands/ReconnectHostCmd.java index 506350ff5be..69a07793c34 100644 --- a/server/src/com/cloud/api/commands/ReconnectHostCmd.java +++ b/server/src/com/cloud/api/commands/ReconnectHostCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.host.HostVO; import com.cloud.utils.Pair; @@ -40,25 +39,6 @@ public class ReconnectHostCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/RecoverVMCmd.java b/server/src/com/cloud/api/commands/RecoverVMCmd.java index 3a6d8d4d419..20dee300b36 100644 --- a/server/src/com/cloud/api/commands/RecoverVMCmd.java +++ b/server/src/com/cloud/api/commands/RecoverVMCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.exception.ResourceAllocationException; import com.cloud.user.Account; @@ -43,25 +42,6 @@ public class RecoverVMCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } @@ -74,11 +54,7 @@ public class RecoverVMCmd extends BaseCmd { public List> execute(Map params) { Long vmId = (Long)params.get(BaseCmd.Properties.ID.getName()); Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); - - //if account is removed, return error - if(account!=null && account.getRemoved() != null) - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "The account " + account.getId()+" is removed"); - + // Verify input parameters UserVmVO vmInstance = getManagementServer().findUserVMInstanceById(vmId.longValue()); if (vmInstance == null) { diff --git a/server/src/com/cloud/api/commands/RegisterCmd.java b/server/src/com/cloud/api/commands/RegisterCmd.java index f290ba2eabc..02c5bb8ce00 100644 --- a/server/src/com/cloud/api/commands/RegisterCmd.java +++ b/server/src/com/cloud/api/commands/RegisterCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.User; import com.cloud.utils.Pair; @@ -40,25 +39,6 @@ public class RegisterCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/RegisterIsoCmd.java b/server/src/com/cloud/api/commands/RegisterIsoCmd.java index cdd60384665..076b729a34a 100644 --- a/server/src/com/cloud/api/commands/RegisterIsoCmd.java +++ b/server/src/com/cloud/api/commands/RegisterIsoCmd.java @@ -25,14 +25,13 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.DataCenterVO; +import com.cloud.storage.VMTemplateHostVO; +import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Storage.FileSystem; import com.cloud.storage.Storage.ImageFormat; -import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; -import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -43,88 +42,18 @@ public class RegisterIsoCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.BOOTABLE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_FEATURED, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.OS_TYPE_ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.URL, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_FEATURED, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.OS_TYPE_ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.BOOTABLE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="bootable", type=CommandType.BOOLEAN) - private Boolean bootable; - - @Parameter(name="displaytext", type=CommandType.STRING, required=true) - private String displayText; - - @Parameter(name="isfeatured", type=CommandType.BOOLEAN) - private Boolean featured; - - @Parameter(name="ispublic", type=CommandType.BOOLEAN) - private Boolean publicIso; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String isoName; - - @Parameter(name="ostypeid", type=CommandType.LONG, required=true) - private Long osTypeId; - - @Parameter(name="url", type=CommandType.STRING, required=true) - private String url; - - @Parameter(name="zoneid", type=CommandType.LONG, required=true) - private Long zoneId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Boolean isBootable() { - return bootable; - } - - public String getDisplayText() { - return displayText; - } - - public Boolean isFeatured() { - return featured; - } - - public Boolean isPublic() { - return publicIso; - } - - public String getIsoName() { - return isoName; - } - - public Long getOsTypeId() { - return osTypeId; - } - - public String getUrl() { - return url; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/RegisterTemplateCmd.java b/server/src/com/cloud/api/commands/RegisterTemplateCmd.java index 887f7b92927..5b6799303bc 100644 --- a/server/src/com/cloud/api/commands/RegisterTemplateCmd.java +++ b/server/src/com/cloud/api/commands/RegisterTemplateCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.DataCenterVO; import com.cloud.exception.InvalidParameterValueException; @@ -44,111 +43,23 @@ public class RegisterTemplateCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.BITS, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.FORMAT, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_FEATURED, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.OS_TYPE_ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.PASSWORD_ENABLED, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.REQUIRES_HVM, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.URL, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); - + s_properties.add(new Pair(BaseCmd.Properties.BITS, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PASSWORD_ENABLED, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.REQUIRES_HVM, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_FEATURED, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.FORMAT, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.OS_TYPE_ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); + + } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="bits", type=CommandType.INTEGER) - private Integer bits; - - @Parameter(name="displaytext", type=CommandType.STRING, required=true) - private String displayText; - - @Parameter(name="format", type=CommandType.STRING, required=true) - private String format; - - @Parameter(name="isfeatured", type=CommandType.BOOLEAN) - private Boolean featured; - - @Parameter(name="ispublic", type=CommandType.BOOLEAN) - private Boolean publicTemplate; - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String templateName; - - @Parameter(name="ostypeid", type=CommandType.LONG, required=true) - private Long osTypeId; - - @Parameter(name="passwordenabled", type=CommandType.BOOLEAN) - private Boolean passwordEnabled; - - @Parameter(name="requireshvm", type=CommandType.BOOLEAN) - private Boolean requiresHvm; - - @Parameter(name="url", type=CommandType.STRING, required=true) - private String url; - - @Parameter(name="zoneid", type=CommandType.LONG, required=true) - private Long zoneId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Integer getBits() { - return bits; - } - - public String getDisplayText() { - return displayText; - } - - public String getFormat() { - return format; - } - - public Boolean isFeatured() { - return featured; - } - - public Boolean isPublic() { - return publicTemplate; - } - - public String getTemplateName() { - return templateName; - } - - public Long getOsTypeId() { - return osTypeId; - } - - public Boolean isPasswordEnabled() { - return passwordEnabled; - } - - public Boolean getRequiresHvm() { - return requiresHvm; - } - - public String getUrl() { - return url; - } - - public Long getZoneId() { - return zoneId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/RemoveFromLoadBalancerRuleCmd.java b/server/src/com/cloud/api/commands/RemoveFromLoadBalancerRuleCmd.java index 770ee2b86de..b2fb11392dc 100644 --- a/server/src/com/cloud/api/commands/RemoveFromLoadBalancerRuleCmd.java +++ b/server/src/com/cloud/api/commands/RemoveFromLoadBalancerRuleCmd.java @@ -18,15 +18,14 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.StringTokenizer; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.LoadBalancerVO; import com.cloud.user.Account; @@ -41,45 +40,13 @@ public class RemoveFromLoadBalancerRuleCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - + //s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_IDS, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="virtualmachineid", type=CommandType.LONG) - private Long virtualMachineId; - - @Parameter(name="virtualmachineids", type=CommandType.LIST, collectionType=CommandType.LONG) - private List virtualMachineIds; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - public List getVirtualMachineIds() { - return virtualMachineIds; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/RemovePortForwardingServiceCmd.java b/server/src/com/cloud/api/commands/RemovePortForwardingServiceCmd.java index d5444d13337..0f3929afd14 100644 --- a/server/src/com/cloud/api/commands/RemovePortForwardingServiceCmd.java +++ b/server/src/com/cloud/api/commands/RemovePortForwardingServiceCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.SecurityGroupVO; import com.cloud.user.Account; @@ -42,44 +41,10 @@ public class RemovePortForwardingServiceCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.PUBLIC_IP, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="publicip", type=CommandType.STRING, required=true) - private String publicIp; - - @Parameter(name="virtualmachineid", type=CommandType.LONG, required=true) - private Long virtualMachineId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public String getPublicIp() { - return publicIp; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/ResetVMPasswordCmd.java b/server/src/com/cloud/api/commands/ResetVMPasswordCmd.java index eec58c2ae25..8e458e59904 100644 --- a/server/src/com/cloud/api/commands/ResetVMPasswordCmd.java +++ b/server/src/com/cloud/api/commands/ResetVMPasswordCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; @@ -44,25 +43,6 @@ public class ResetVMPasswordCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/RevokeNetworkGroupIngressCmd.java b/server/src/com/cloud/api/commands/RevokeNetworkGroupIngressCmd.java index 75598ca3855..adbd67b5188 100644 --- a/server/src/com/cloud/api/commands/RevokeNetworkGroupIngressCmd.java +++ b/server/src/com/cloud/api/commands/RevokeNetworkGroupIngressCmd.java @@ -10,7 +10,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.security.NetworkGroupVO; import com.cloud.user.Account; @@ -24,104 +23,21 @@ public class RevokeNetworkGroupIngressCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.CIDR_LIST, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.END_PORT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ICMP_CODE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ICMP_TYPE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.NETWORK_GROUP_NAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.PROTOCOL, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.START_PORT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.END_PORT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ICMP_TYPE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ICMP_CODE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PROTOCOL, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.NETWORK_GROUP_NAME, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.CIDR_LIST, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_NETWORK_GROUP_LIST, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="cidrlist", type=CommandType.STRING) - private String cidrList; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="endport", type=CommandType.INTEGER) - private Integer endPort; - - @Parameter(name="icmpcode", type=CommandType.INTEGER) - private Integer icmpCode; - - @Parameter(name="icmptype", type=CommandType.INTEGER) - private Integer icmpType; - - @Parameter(name="networkgroupname", type=CommandType.STRING, required=true) - private String networkGroupName; - - @Parameter(name="protocol", type=CommandType.STRING) - private String protocol; - - @Parameter(name="startport", type=CommandType.INTEGER) - private Integer startPort; - - @Parameter(name="usernetworkgrouplist", type=CommandType.MAP) - private Map userNetworkGroupList; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public String getCidrList() { - return cidrList; - } - - public Long getDomainId() { - return domainId; - } - - public Integer getEndPort() { - return endPort; - } - - public Integer getIcmpCode() { - return icmpCode; - } - - public Integer getIcmpType() { - return icmpType; - } - - public String getNetworkGroupName() { - return networkGroupName; - } - - public String getProtocol() { - return protocol; - } - - public Integer getStartPort() { - return startPort; - } - - public Map getUserNetworkGroupList() { - return userNetworkGroupList; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/StartRouterCmd.java b/server/src/com/cloud/api/commands/StartRouterCmd.java index 3de0549af41..2f395cc04d8 100644 --- a/server/src/com/cloud/api/commands/StartRouterCmd.java +++ b/server/src/com/cloud/api/commands/StartRouterCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -42,25 +41,6 @@ public class StartRouterCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/StartSystemVMCmd.java b/server/src/com/cloud/api/commands/StartSystemVMCmd.java index debb6403918..13313b4cc1b 100644 --- a/server/src/com/cloud/api/commands/StartSystemVMCmd.java +++ b/server/src/com/cloud/api/commands/StartSystemVMCmd.java @@ -18,16 +18,16 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.utils.Pair; +import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.VMInstanceVO; public class StartSystemVMCmd extends BaseCmd { @@ -40,25 +40,6 @@ public class StartSystemVMCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/StartVMCmd.java b/server/src/com/cloud/api/commands/StartVMCmd.java index 5546295e25e..37e83ce6501 100644 --- a/server/src/com/cloud/api/commands/StartVMCmd.java +++ b/server/src/com/cloud/api/commands/StartVMCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -44,25 +43,6 @@ public class StartVMCmd extends BaseCmd { } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } @@ -80,11 +60,7 @@ public class StartVMCmd extends BaseCmd { Long vmId = (Long)params.get(BaseCmd.Properties.ID.getName()); Long userId = (Long)params.get(BaseCmd.Properties.USER_ID.getName()); Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); - - //if account is removed, return error - if(account!=null && account.getRemoved() != null) - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "The account " + account.getId()+" is removed"); - + //Verify input parameters UserVmVO vmInstanceCheck = getManagementServer().findUserVMInstanceById(vmId.longValue()); if (vmInstanceCheck == null) { diff --git a/server/src/com/cloud/api/commands/StopRouterCmd.java b/server/src/com/cloud/api/commands/StopRouterCmd.java index 3b9328fb8b8..24020e67bca 100644 --- a/server/src/com/cloud/api/commands/StopRouterCmd.java +++ b/server/src/com/cloud/api/commands/StopRouterCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -42,25 +41,6 @@ public class StopRouterCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/StopSystemVmCmd.java b/server/src/com/cloud/api/commands/StopSystemVmCmd.java index 6788be63f51..93b7a963002 100644 --- a/server/src/com/cloud/api/commands/StopSystemVmCmd.java +++ b/server/src/com/cloud/api/commands/StopSystemVmCmd.java @@ -18,16 +18,16 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.utils.Pair; +import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.VMInstanceVO; public class StopSystemVmCmd extends BaseCmd { @@ -39,26 +39,7 @@ public class StopSystemVmCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - + public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/StopVMCmd.java b/server/src/com/cloud/api/commands/StopVMCmd.java index 5760d8da9ad..254c510da83 100644 --- a/server/src/com/cloud/api/commands/StopVMCmd.java +++ b/server/src/com/cloud/api/commands/StopVMCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -43,25 +42,6 @@ public class StopVMCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/UpdateAccountCmd.java b/server/src/com/cloud/api/commands/UpdateAccountCmd.java index 0a39a5db108..8960475be0a 100644 --- a/server/src/com/cloud/api/commands/UpdateAccountCmd.java +++ b/server/src/com/cloud/api/commands/UpdateAccountCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -39,43 +38,9 @@ public class UpdateAccountCmd extends BaseCmd{ s_properties.add(new Pair(BaseCmd.Properties.NEW_NAME, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING, required=true) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG, required=true) - private Long domainId; - - @Parameter(name="newname", type=CommandType.STRING, required=true) - private String newName; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public String getNewName() { - return newName; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/UpdateCfgCmd.java b/server/src/com/cloud/api/commands/UpdateCfgCmd.java index 84f9afb0344..21db4339e20 100644 --- a/server/src/com/cloud/api/commands/UpdateCfgCmd.java +++ b/server/src/com/cloud/api/commands/UpdateCfgCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.User; import com.cloud.utils.Pair; @@ -38,37 +37,10 @@ public class UpdateCfgCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.VALUE, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.VALUE, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="name", type=CommandType.STRING, required=true) - private String cfgName; - - @Parameter(name="value", type=CommandType.STRING) - private String value; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getCfgName() { - return cfgName; - } - - public String getValue() { - return value; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/UpdateDiskOfferingCmd.java b/server/src/com/cloud/api/commands/UpdateDiskOfferingCmd.java index 01ffa45d14f..dcd983a3149 100644 --- a/server/src/com/cloud/api/commands/UpdateDiskOfferingCmd.java +++ b/server/src/com/cloud/api/commands/UpdateDiskOfferingCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.DiskOfferingVO; import com.cloud.user.User; @@ -37,54 +36,13 @@ public class UpdateDiskOfferingCmd extends BaseCmd{ private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.TAGS, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.TAGS, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="displaytext", type=CommandType.STRING) - private String displayText; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String diskOfferingName; - - @Parameter(name="tags", type=CommandType.STRING) - private String tags; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getDisplayText() { - return displayText; - } - - public Long getId() { - return id; - } - - public String getDiskOfferingName() { - return diskOfferingName; - } - - public String getTags() { - return tags; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; @@ -101,6 +59,7 @@ public class UpdateDiskOfferingCmd extends BaseCmd{ String displayText = (String)params.get(BaseCmd.Properties.DISPLAY_TEXT.getName()); Long userId = (Long)params.get(BaseCmd.Properties.USER_ID.getName()); String tags = (String)params.get(BaseCmd.Properties.TAGS.getName()); + Boolean editSOResult = false; if (userId == null) { userId = Long.valueOf(User.UID_SYSTEM); diff --git a/server/src/com/cloud/api/commands/UpdateDomainCmd.java b/server/src/com/cloud/api/commands/UpdateDomainCmd.java index dc3ceba3f53..05c6d7ae063 100644 --- a/server/src/com/cloud/api/commands/UpdateDomainCmd.java +++ b/server/src/com/cloud/api/commands/UpdateDomainCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; import com.cloud.user.Account; @@ -42,32 +41,6 @@ public class UpdateDomainCmd extends BaseCmd{ s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String domainName; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public String getDomainName() { - return domainName; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/UpdateHostCmd.java b/server/src/com/cloud/api/commands/UpdateHostCmd.java index 1dfe8fe02b6..8c5f60cf352 100644 --- a/server/src/com/cloud/api/commands/UpdateHostCmd.java +++ b/server/src/com/cloud/api/commands/UpdateHostCmd.java @@ -27,7 +27,6 @@ import java.util.Set; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.async.executor.HostResultObject; import com.cloud.host.Host; @@ -35,11 +34,13 @@ import com.cloud.host.HostStats; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.Status.Event; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.storage.GuestOSCategoryVO; +import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.fsm.StateMachine; import com.cloud.vm.UserVmVO; +//import com.cloud.vm.HostStats; public class UpdateHostCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(UpdateHostCmd.class.getName()); @@ -51,32 +52,6 @@ public class UpdateHostCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.OS_CATEGORY_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="oscategoryid", type=CommandType.LONG) - private Long osCategoryId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public Long getOsCategoryId() { - return osCategoryId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/UpdateIPForwardingRuleCmd.java b/server/src/com/cloud/api/commands/UpdateIPForwardingRuleCmd.java index 0a0502447dd..41f5cd55069 100644 --- a/server/src/com/cloud/api/commands/UpdateIPForwardingRuleCmd.java +++ b/server/src/com/cloud/api/commands/UpdateIPForwardingRuleCmd.java @@ -7,7 +7,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.IPAddressVO; import com.cloud.server.Criteria; @@ -26,69 +25,14 @@ public class UpdateIPForwardingRuleCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.PUBLIC_IP, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.PRIVATE_IP, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PUBLIC_PORT, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.PRIVATE_PORT, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.PROTOCOL, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.PUBLIC_IP, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.PUBLIC_PORT, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="privateip", type=CommandType.STRING) - private String privateIp; - - @Parameter(name="privateport", type=CommandType.STRING, required=true) - private String privatePort; - - @Parameter(name="protocol", type=CommandType.STRING, required=true) - private String protocol; - - @Parameter(name="publicip", type=CommandType.STRING, required=true) - private String publicIp; - - @Parameter(name="publicport", type=CommandType.STRING, required=true) - private String publicPort; - - @Parameter(name="virtualmachineid", type=CommandType.LONG) - private Long virtualMachineId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getPrivateIp() { - return privateIp; - } - - public String getPrivatePort() { - return privatePort; - } - - public String getProtocol() { - return protocol; - } - - public String getPublicIp() { - return publicIp; - } - - public String getPublicPort() { - return publicPort; - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/UpdateIsoCmd.java b/server/src/com/cloud/api/commands/UpdateIsoCmd.java index 098cc4e667e..887e593cd77 100644 --- a/server/src/com/cloud/api/commands/UpdateIsoCmd.java +++ b/server/src/com/cloud/api/commands/UpdateIsoCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.Storage; import com.cloud.storage.VMTemplateVO; @@ -39,62 +38,14 @@ public class UpdateIsoCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.BOOTABLE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.OS_TYPE_ID, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.OS_TYPE_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.BOOTABLE, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="bootable", type=CommandType.BOOLEAN) - private Boolean bootable; - - @Parameter(name="displaytext", type=CommandType.STRING) - private String displayText; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String isoName; - - @Parameter(name="ostypeid", type=CommandType.LONG) - private Long osTypeId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Boolean isBootable() { - return bootable; - } - - public String getDisplayText() { - return displayText; - } - - public Long getId() { - return id; - } - - public String isoName() { - return isoName; - } - - public Long getOsTypeId() { - return osTypeId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/UpdateIsoPermissionsCmd.java b/server/src/com/cloud/api/commands/UpdateIsoPermissionsCmd.java deleted file mode 100644 index 53fe07f6e38..00000000000 --- a/server/src/com/cloud/api/commands/UpdateIsoPermissionsCmd.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.cloud.api.commands; - -import org.apache.log4j.Logger; - -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.Storage.ImageFormat; - -public class UpdateIsoPermissionsCmd extends UpdateTemplateOrIsoPermissionsCmd { - protected String getResponseName() { - return "updateisopermissionsresponse"; - } - - protected String getMediaType() { - return "iso"; - } - - protected Logger getLogger() { - return Logger.getLogger(UpdateIsoPermissionsCmd.class.getName()); - } - - protected boolean templateIsCorrectType(VMTemplateVO template) { - return template.getFormat().equals(ImageFormat.ISO); - } -} diff --git a/server/src/com/cloud/api/commands/UpdateLoadBalancerRuleCmd.java b/server/src/com/cloud/api/commands/UpdateLoadBalancerRuleCmd.java index 360e7c1fa74..586d28d4fa6 100644 --- a/server/src/com/cloud/api/commands/UpdateLoadBalancerRuleCmd.java +++ b/server/src/com/cloud/api/commands/UpdateLoadBalancerRuleCmd.java @@ -7,7 +7,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.network.LoadBalancerVO; import com.cloud.user.Account; @@ -22,61 +21,13 @@ public class UpdateLoadBalancerRuleCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ALGORITHM, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DESCRIPTION, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DESCRIPTION, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PRIVATE_PORT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ALGORITHM, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="algorithm", type=CommandType.STRING) - private String algorithm; - - @Parameter(name="description", type=CommandType.STRING) - private String description; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String loadBalancerName; - - @Parameter(name="privateport", type=CommandType.STRING) - private String privatePort; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAlgorithm() { - return algorithm; - } - - public String getDescription() { - return description; - } - - public Long getId() { - return id; - } - - public String getLoadBalancerName() { - return loadBalancerName; - } - - public String getPrivatePort() { - return privatePort; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/UpdatePodCmd.java b/server/src/com/cloud/api/commands/UpdatePodCmd.java index 7ded253c9de..5b6a8263e25 100644 --- a/server/src/com/cloud/api/commands/UpdatePodCmd.java +++ b/server/src/com/cloud/api/commands/UpdatePodCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; @@ -39,70 +38,15 @@ public class UpdatePodCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.CIDR, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.END_IP, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.GATEWAY, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.GATEWAY, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.CIDR, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.START_IP, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.END_IP, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="cidr", type=CommandType.STRING) - private String cidr; - - @Parameter(name="endip", type=CommandType.STRING) - private String endIp; - - @Parameter(name="gateway", type=CommandType.STRING) - private String gateway; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String podName; - - @Parameter(name="startip", type=CommandType.STRING) - private String startIp; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getCidr() { - return cidr; - } - - public String getEndIp() { - return endIp; - } - - public String getGateway() { - return gateway; - } - - public Long getId() { - return id; - } - - public String getPodName() { - return podName; - } - - public String getStartIp() { - return startIp; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/UpdateResourceLimitCmd.java b/server/src/com/cloud/api/commands/UpdateResourceLimitCmd.java index a89cf26b5b5..73977c393e8 100644 --- a/server/src/com/cloud/api/commands/UpdateResourceLimitCmd.java +++ b/server/src/com/cloud/api/commands/UpdateResourceLimitCmd.java @@ -25,10 +25,9 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; -import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.ResourceLimitVO; +import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.domain.DomainVO; import com.cloud.exception.InvalidParameterValueException; import com.cloud.server.Criteria; @@ -43,53 +42,12 @@ public class UpdateResourceLimitCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.MAX, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.RESOURCE_TYPE, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.MAX, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="account", type=CommandType.STRING) - private String accountName; - - @Parameter(name="domainid", type=CommandType.LONG) - private Long domainId; - - @Parameter(name="max", type=CommandType.LONG) - private Long max; - - @Parameter(name="resourcetype", type=CommandType.INTEGER, required=true) - private Integer resourceType; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getAccountName() { - return accountName; - } - - public Long getDomainId() { - return domainId; - } - - public Long getMax() { - return max; - } - - public Integer getResourceType() { - return resourceType; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; @@ -113,7 +71,7 @@ public class UpdateResourceLimitCmd extends BaseCmd { } else if (max < -1) { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Please specify either '-1' for an infinite limit, or a limit that is at least '0'."); } - + // Map resource type ResourceType resourceType; try { @@ -121,13 +79,11 @@ public class UpdateResourceLimitCmd extends BaseCmd { } catch (ArrayIndexOutOfBoundsException e) { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Please specify a valid resource type."); } - - /* + if (accountName==null && domainId != null && !domainId.equals(DomainVO.ROOT_DOMAIN)) { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Resource limits must be made for an account or the ROOT domain."); } - */ - + if (account != null) { if (domainId != null) { if (!getManagementServer().isChildDomain(account.getDomainId(), domainId)) { @@ -138,11 +94,6 @@ public class UpdateResourceLimitCmd extends BaseCmd { } if (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) { - if ((domainId != null) && (accountName == null) && domainId.equals(account.getDomainId())) { - // if the admin is trying to update their own domain, disallow... - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to update resource limit for " + ((accountName == null) ? "" : "account " + accountName + " in ") + "domain " + domainId + ", permission denied"); - } - // If there is an existing ROOT domain limit, make sure its max isn't being exceeded Criteria c = new Criteria(); c.addCriteria(Criteria.DOMAINID, DomainVO.ROOT_DOMAIN); diff --git a/server/src/com/cloud/api/commands/UpdateServiceOfferingCmd.java b/server/src/com/cloud/api/commands/UpdateServiceOfferingCmd.java index f9807c136fe..5204faf48c8 100644 --- a/server/src/com/cloud/api/commands/UpdateServiceOfferingCmd.java +++ b/server/src/com/cloud/api/commands/UpdateServiceOfferingCmd.java @@ -18,17 +18,16 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; -import com.cloud.offering.ServiceOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.user.User; import com.cloud.utils.Pair; @@ -38,70 +37,15 @@ public class UpdateServiceOfferingCmd extends BaseCmd{ private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.OFFER_HA, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.TAGS, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USE_VIRTUAL_NETWORK, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.TAGS, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="displaytext", type=CommandType.STRING) - private String displayText; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String serviceOfferingName; - - @Parameter(name="offerha", type=CommandType.BOOLEAN) - private Boolean offerHa; - - @Parameter(name="tags", type=CommandType.STRING) - private String tags; - - @Parameter(name="usevirtualnetwork", type=CommandType.BOOLEAN) - private Boolean useVirtualNetwork; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getDisplayText() { - return displayText; - } - - public Long getId() { - return id; - } - - public String getServiceOfferingName() { - return serviceOfferingName; - } - - public Boolean getOfferHa() { - return offerHa; - } - - public String getTags() { - return tags; - } - - public Boolean getUseVirtualNetwork() { - return useVirtualNetwork; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/UpdateStoragePoolCmd.java b/server/src/com/cloud/api/commands/UpdateStoragePoolCmd.java index 9a5f49fcf98..13cfc64f111 100644 --- a/server/src/com/cloud/api/commands/UpdateStoragePoolCmd.java +++ b/server/src/com/cloud/api/commands/UpdateStoragePoolCmd.java @@ -18,14 +18,19 @@ package com.cloud.api.commands; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.ClusterVO; import com.cloud.storage.StoragePoolVO; @@ -43,32 +48,6 @@ public class UpdateStoragePoolCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.TAGS, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="tags", type=CommandType.STRING) - private String tags; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public String getTags() { - return tags; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/UpdateTemplateCmd.java b/server/src/com/cloud/api/commands/UpdateTemplateCmd.java index b8fc35dbf5f..946355352cc 100644 --- a/server/src/com/cloud/api/commands/UpdateTemplateCmd.java +++ b/server/src/com/cloud/api/commands/UpdateTemplateCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; @@ -38,69 +37,14 @@ public class UpdateTemplateCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.FORMAT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.FORMAT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.OS_TYPE_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PASSWORD_ENABLED, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="displaytext", type=CommandType.STRING) - private String displayText; - - @Parameter(name="format", type=CommandType.STRING) - private String format; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="name", type=CommandType.STRING) - private String templateName; - - @Parameter(name="ostypeid", type=CommandType.LONG) - private Long osTypeId; - - @Parameter(name="passwordenabled", type=CommandType.BOOLEAN) - private Boolean passwordEnabled; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getDisplayText() { - return displayText; - } - - public String getFormat() { - return format; - } - - public Long getId() { - return id; - } - - public String getTemplateName() { - return templateName; - } - - public Long getOsTypeId() { - return osTypeId; - } - - public Boolean isPasswordEnabled() { - return passwordEnabled; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/UpdateTemplateOrIsoPermissionsCmd.java b/server/src/com/cloud/api/commands/UpdateTemplateOrIsoPermissionsCmd.java deleted file mode 100644 index 4e8d5b3d13e..00000000000 --- a/server/src/com/cloud/api/commands/UpdateTemplateOrIsoPermissionsCmd.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.cloud.api.commands; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.StringTokenizer; - -import org.apache.log4j.Logger; - -import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.PermissionDeniedException; -import com.cloud.storage.VMTemplateVO; -import com.cloud.user.Account; -import com.cloud.utils.Pair; - -public abstract class UpdateTemplateOrIsoPermissionsCmd extends BaseCmd { - public Logger s_logger = getLogger(); - protected static final List> s_properties = new ArrayList>(); - protected String s_name = getResponseName(); - - static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_NAMES, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_FEATURED, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.OP, Boolean.FALSE)); - } - - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="accounts", type=CommandType.LIST, collectionType=CommandType.STRING) - private List accountNames; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="isfeatured", type=CommandType.BOOLEAN) - private Boolean featured; - - @Parameter(name="ispublic", type=CommandType.BOOLEAN) - private Boolean isPublic; - - @Parameter(name="op", type=CommandType.STRING) - private String operation; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public List getAccountNames() { - return accountNames; - } - - public Long getId() { - return id; - } - - public Boolean isFeatured() { - return featured; - } - - public Boolean isPublic() { - return isPublic; - } - - public String getOperation() { - return operation; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - - @Override - public String getName() { - return s_name; - } - @Override - public List> getProperties() { - return s_properties; - } - - protected boolean templateIsCorrectType(VMTemplateVO template) { - return true; - } - - protected String getResponseName() { - return "updatetemplateorisopermissionsresponse"; - } - - protected String getMediaType() { - return "templateOrIso"; - } - - protected Logger getLogger() { - return Logger.getLogger(UpdateTemplateOrIsoPermissionsCmd.class.getName()); - } - - @Override - public List> execute(Map params) { - Long id = (Long)params.get(BaseCmd.Properties.ID.getName()); - Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); - Boolean isPublic = (Boolean)params.get(BaseCmd.Properties.IS_PUBLIC.getName()); - Boolean isFeatured = (Boolean)params.get(BaseCmd.Properties.IS_FEATURED.getName()); - String accoutNames = (String)params.get(BaseCmd.Properties.ACCOUNT_NAMES.getName()); - String operation = (String)params.get(BaseCmd.Properties.OP.getName()); - - Boolean publishTemplateResult = Boolean.FALSE; - - VMTemplateVO template = getManagementServer().findTemplateById(id.longValue()); - if (template == null || !templateIsCorrectType(template)) { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "unable to find " + getMediaType() + " with id " + id); - } - - if (account != null) { - if (!isAdmin(account.getType()) && (template.getAccountId() != account.getId())) { - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "unable to update permissions for " + getMediaType() + " with id " + id); - } else if (account.getType() != Account.ACCOUNT_TYPE_ADMIN) { - Long templateOwnerDomainId = getManagementServer().findDomainIdByAccountId(template.getAccountId()); - if (!getManagementServer().isChildDomain(account.getDomainId(), templateOwnerDomainId)) { - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to update permissions for " + getMediaType() + " with id " + id); - } - } - } - - if (id == Long.valueOf(1)) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "unable to update permissions for " + getMediaType() + " with id " + id); - } - - boolean isAdmin = ((account == null) || isAdmin(account.getType())); - boolean allowPublicUserTemplates = Boolean.parseBoolean(getManagementServer().getConfigurationValue("allow.public.user.templates")); - if (!isAdmin && !allowPublicUserTemplates && isPublic != null && isPublic) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Only private " + getMediaType() + "s can be created."); - } - - // package up the accountNames as a list - List accountNameList = new ArrayList(); - if (accoutNames != null) { - if ((operation == null) || (!operation.equalsIgnoreCase("add") && !operation.equalsIgnoreCase("remove") && !operation.equalsIgnoreCase("reset"))) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid operation on accounts, the operation must be either 'add' or 'remove' in order to modify launch permissions." + - " Given operation is: '" + operation + "'"); - } - StringTokenizer st = new StringTokenizer(accoutNames, ","); - while (st.hasMoreTokens()) { - accountNameList.add(st.nextToken()); - } - } - - try { - publishTemplateResult = getManagementServer().updateTemplatePermissions(id, operation, isPublic, isFeatured, accountNameList); - } catch (InvalidParameterValueException ex) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Failed to update " + getMediaType() + " permissions for template " + template.getName() + ": internal error."); - } catch (PermissionDeniedException ex) { - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Failed to update " + getMediaType() + " permissions for template " + template.getName() + ": internal error."); - } catch (Exception ex) { - s_logger.error("Exception editing template", ex); - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to update " + getMediaType() + " permissions for template " + template.getName() + ": internal error."); - } - - List> returnValues = new ArrayList>(); - returnValues.add(new Pair(BaseCmd.Properties.SUCCESS.getName(), publishTemplateResult.toString())); - return returnValues; - } -} diff --git a/server/src/com/cloud/api/commands/UpdateTemplatePermissionsCmd.java b/server/src/com/cloud/api/commands/UpdateTemplatePermissionsCmd.java index 20852484e59..2e71851d33c 100644 --- a/server/src/com/cloud/api/commands/UpdateTemplatePermissionsCmd.java +++ b/server/src/com/cloud/api/commands/UpdateTemplatePermissionsCmd.java @@ -16,27 +16,111 @@ * */ -package com.cloud.api.commands; - -import org.apache.log4j.Logger; - -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.Storage.ImageFormat; +package com.cloud.api.commands; -public class UpdateTemplatePermissionsCmd extends UpdateTemplateOrIsoPermissionsCmd { - protected String getResponseName() { - return "updatetemplatepermissionsresponse"; - } - - protected String getMediaType() { - return "template"; - } - - protected Logger getLogger() { - return Logger.getLogger(UpdateTemplatePermissionsCmd.class.getName()); - } - - protected boolean templateIsCorrectType(VMTemplateVO template) { - return !template.getFormat().equals(ImageFormat.ISO); - } +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; + +import org.apache.log4j.Logger; + +import com.cloud.api.BaseCmd; +import com.cloud.api.ServerApiException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.PermissionDeniedException; +import com.cloud.storage.VMTemplateVO; +import com.cloud.user.Account; +import com.cloud.utils.Pair; + +public class UpdateTemplatePermissionsCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(UpdateTemplatePermissionsCmd.class.getName()); + private static final String s_name = "updatetemplatepermissionsresponse"; + private static final List> s_properties = new ArrayList>(); + + static { + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_PUBLIC, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.IS_FEATURED, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_NAMES, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.OP, Boolean.FALSE)); + } + + @Override + public String getName() { + return s_name; + } + @Override + public List> getProperties() { + return s_properties; + } + + @Override + public List> execute(Map params) { + Long templateId = (Long)params.get(BaseCmd.Properties.ID.getName()); + Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); + Boolean isPublic = (Boolean)params.get(BaseCmd.Properties.IS_PUBLIC.getName()); + Boolean isFeatured = (Boolean)params.get(BaseCmd.Properties.IS_FEATURED.getName()); + String accoutNames = (String)params.get(BaseCmd.Properties.ACCOUNT_NAMES.getName()); + String operation = (String)params.get(BaseCmd.Properties.OP.getName()); + + Boolean publishTemplateResult = Boolean.FALSE; + + VMTemplateVO template = getManagementServer().findTemplateById(templateId.longValue()); + if (template == null) { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "unable to find template with id " + templateId); + } + + if (account != null) { + if (!isAdmin(account.getType()) && (template.getAccountId() != account.getId())) { + throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "unable to update permissions for template with id " + templateId); + } else if (account.getType() != Account.ACCOUNT_TYPE_ADMIN) { + Long templateOwnerDomainId = getManagementServer().findDomainIdByAccountId(template.getAccountId()); + if (!getManagementServer().isChildDomain(account.getDomainId(), templateOwnerDomainId)) { + throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to update permissions for template with id " + templateId); + } + } + } + + if (templateId == Long.valueOf(1)) { + throw new ServerApiException(BaseCmd.PARAM_ERROR, "unable to update permissions for template with id " + templateId); + } + + boolean isAdmin = ((account == null) || isAdmin(account.getType())); + boolean allowPublicUserTemplates = Boolean.parseBoolean(getManagementServer().getConfigurationValue("allow.public.user.templates")); + if (!isAdmin && !allowPublicUserTemplates && isPublic != null && isPublic) { + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Only private templates can be created."); + } + + // package up the accountNames as a list + List accountNameList = new ArrayList(); + if (accoutNames != null) { + if ((operation == null) || (!operation.equalsIgnoreCase("add") && !operation.equalsIgnoreCase("remove") && !operation.equalsIgnoreCase("reset"))) { + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid operation on accounts, the operation must be either 'add' or 'remove' in order to modify launch permissions." + + " Given operation is: '" + operation + "'"); + } + StringTokenizer st = new StringTokenizer(accoutNames, ","); + while (st.hasMoreTokens()) { + accountNameList.add(st.nextToken()); + } + } + + try { + getManagementServer().updateTemplatePermissions(templateId, operation, isPublic, isFeatured, accountNameList); + publishTemplateResult = Boolean.TRUE; + } catch (InvalidParameterValueException ex) { + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Failed to update template permissions for template " + template.getName() + ": internal error."); + } catch (PermissionDeniedException ex) { + throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Failed to update template permissions for template " + template.getName() + ": internal error."); + } catch (Exception ex) { + s_logger.error("Exception editing template", ex); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to update template permissions for template " + template.getName() + ": internal error."); + } + + List> returnValues = new ArrayList>(); + returnValues.add(new Pair(BaseCmd.Properties.SUCCESS.getName(), publishTemplateResult.toString())); + return returnValues; + } } diff --git a/server/src/com/cloud/api/commands/UpdateUserCmd.java b/server/src/com/cloud/api/commands/UpdateUserCmd.java index 1dff585fc19..adf75e5afe1 100644 --- a/server/src/com/cloud/api/commands/UpdateUserCmd.java +++ b/server/src/com/cloud/api/commands/UpdateUserCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.user.Account; @@ -39,92 +38,17 @@ public class UpdateUserCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.API_KEY, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.EMAIL, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.FIRSTNAME, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.LASTNAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PASSWORD, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.SECRET_KEY, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.TIMEZONE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USERNAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PASSWORD, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.FIRSTNAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.LASTNAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.EMAIL, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.TIMEZONE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.API_KEY, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.SECRET_KEY, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="apikey", type=CommandType.STRING) - private String apiKey; - - @Parameter(name="email", type=CommandType.STRING) - private String email; - - @Parameter(name="firstname", type=CommandType.STRING) - private String firstname; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="lastname", type=CommandType.STRING) - private String lastname; - - @Parameter(name="password", type=CommandType.STRING) - private String password; - - @Parameter(name="secretkey", type=CommandType.STRING) - private String secretKey; - - @Parameter(name="timezone", type=CommandType.STRING) - private String timezone; - - @Parameter(name="username", type=CommandType.STRING) - private String username; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getApiKey() { - return apiKey; - } - - public String getEmail() { - return email; - } - - public String getFirstname() { - return firstname; - } - - public Long getId() { - return id; - } - - public String getLastname() { - return lastname; - } - - public String getPassword() { - return password; - } - - public String getSecretKey() { - return secretKey; - } - - public String getTimezone() { - return timezone; - } - - public String getUsername() { - return username; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/api/commands/UpdateVMCmd.java b/server/src/com/cloud/api/commands/UpdateVMCmd.java index 254e1df6b13..3f31927911b 100644 --- a/server/src/com/cloud/api/commands/UpdateVMCmd.java +++ b/server/src/com/cloud/api/commands/UpdateVMCmd.java @@ -18,14 +18,13 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.user.Account; import com.cloud.utils.Pair; @@ -37,55 +36,14 @@ public class UpdateVMCmd extends BaseCmd{ private static final List> s_properties = new ArrayList>(); static { - s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_NAME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.GROUP, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.HA_ENABLE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); - + s_properties.add(new Pair(BaseCmd.Properties.GROUP, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_NAME, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.HA_ENABLE, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="displayname", type=CommandType.STRING) - private String displayName; - - @Parameter(name="group", type=CommandType.STRING) - private String group; - - @Parameter(name="haenable", type=CommandType.BOOLEAN) - private Boolean haEnable; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getDisplayName() { - return displayName; - } - - public String getGroup() { - return group; - } - - public Boolean getHaEnable() { - return haEnable; - } - - public Long getId() { - return id; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/UpdateZoneCmd.java b/server/src/com/cloud/api/commands/UpdateZoneCmd.java index 3861daf069e..609ce62f135 100644 --- a/server/src/com/cloud/api/commands/UpdateZoneCmd.java +++ b/server/src/com/cloud/api/commands/UpdateZoneCmd.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.dc.DataCenterVO; import com.cloud.user.User; @@ -38,86 +37,17 @@ public class UpdateZoneCmd extends BaseCmd { private static final List> s_properties = new ArrayList>(); static { + s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); + s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DNS1, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DNS2, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.GUEST_CIDR_ADDRESS, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.INTERNAL_DNS1, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.INTERNAL_DNS2, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.VNET, Boolean.FALSE)); - + s_properties.add(new Pair(BaseCmd.Properties.GUEST_CIDR_ADDRESS, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="dns1", type=CommandType.STRING) - private String dns1; - - @Parameter(name="dns2", type=CommandType.STRING) - private String dns2; - - @Parameter(name="guestcidraddress", type=CommandType.STRING) - private String guestCidrAddress; - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="internaldns1", type=CommandType.STRING) - private String internalDns1; - - @Parameter(name="internaldns2", type=CommandType.STRING) - private String internalDns2; - - @Parameter(name="name", type=CommandType.STRING) - private String zoneName; - - @Parameter(name="vnet", type=CommandType.STRING) - private String vnet; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public String getDns1() { - return dns1; - } - - public String getDns2() { - return dns2; - } - - public String getGuestCidrAddress() { - return guestCidrAddress; - } - - public Long getId() { - return id; - } - - public String getInternalDns1() { - return internalDns1; - } - - public String getInternalDns2() { - return internalDns2; - } - - public String getZoneName() { - return zoneName; - } - - public String getVnet() { - return vnet; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - @Override public String getName() { return s_name; diff --git a/server/src/com/cloud/api/commands/UpgradeVMCmd.java b/server/src/com/cloud/api/commands/UpgradeVMCmd.java index cf6c153ae79..b1a5d6ee643 100644 --- a/server/src/com/cloud/api/commands/UpgradeVMCmd.java +++ b/server/src/com/cloud/api/commands/UpgradeVMCmd.java @@ -18,16 +18,16 @@ package com.cloud.api.commands; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.log4j.Logger; - +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + import com.cloud.api.BaseCmd; -import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; import com.cloud.exception.InvalidParameterValueException; +import com.cloud.service.ServiceOfferingVO; import com.cloud.user.Account; import com.cloud.user.User; import com.cloud.utils.Pair; @@ -41,37 +41,10 @@ public class UpgradeVMCmd extends BaseCmd { static { s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.SERVICE_OFFERING_ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); } - ///////////////////////////////////////////////////// - //////////////// API parameters ///////////////////// - ///////////////////////////////////////////////////// - - @Parameter(name="id", type=CommandType.LONG, required=true) - private Long id; - - @Parameter(name="serviceofferingid", type=CommandType.LONG, required=true) - private Long serviceOfferingId; - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - public Long getId() { - return id; - } - - public Long getServiceOfferingId() { - return serviceOfferingId; - } - - ///////////////////////////////////////////////////// - /////////////// API Implementation/////////////////// - ///////////////////////////////////////////////////// - public String getName() { return s_name; } diff --git a/server/src/com/cloud/async/executor/AssignToLoadBalancerExecutor.java b/server/src/com/cloud/async/executor/AssignToLoadBalancerExecutor.java index 88309abbfa2..dd9bff55619 100644 --- a/server/src/com/cloud/async/executor/AssignToLoadBalancerExecutor.java +++ b/server/src/com/cloud/async/executor/AssignToLoadBalancerExecutor.java @@ -18,9 +18,6 @@ package com.cloud.async.executor; -import java.lang.reflect.Type; -import java.util.Map; - import org.apache.log4j.Logger; import com.cloud.async.AsyncJobManager; @@ -28,7 +25,6 @@ import com.cloud.async.AsyncJobVO; import com.cloud.async.BaseAsyncJobExecutor; import com.cloud.serializer.GsonHelper; import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; public class AssignToLoadBalancerExecutor extends BaseAsyncJobExecutor { public static final Logger s_logger = Logger.getLogger(AssignToLoadBalancerExecutor.class.getName()); @@ -39,12 +35,7 @@ public class AssignToLoadBalancerExecutor extends BaseAsyncJobExecutor { Gson gson = GsonHelper.getBuilder().create(); AsyncJobManager asyncMgr = getAsyncJobMgr(); AsyncJobVO job = getJob(); - Type mapType = new TypeToken>() {}.getType(); - - Map params = gson.fromJson(job.getCmdInfo(), mapType); - for (Object paramObj : params.values()) { - s_logger.error("%%% %%% deserialized param: " + paramObj); - } + LoadBalancerParam param = gson.fromJson(job.getCmdInfo(), LoadBalancerParam.class); asyncMgr.syncAsyncJobExecution(job.getId(), "Router", param.getDomainRouterId()); diff --git a/server/src/com/cloud/async/executor/CancelPrimaryStorageMaintenanceExecutor.java b/server/src/com/cloud/async/executor/CancelPrimaryStorageMaintenanceExecutor.java deleted file mode 100644 index 4c4373e5dcd..00000000000 --- a/server/src/com/cloud/async/executor/CancelPrimaryStorageMaintenanceExecutor.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.async.executor; - -import org.apache.log4j.Logger; - -import com.cloud.api.BaseCmd; -import com.cloud.async.AsyncJobManager; -import com.cloud.async.AsyncJobResult; -import com.cloud.async.AsyncJobVO; -import com.cloud.async.BaseAsyncJobExecutor; -import com.cloud.dc.ClusterVO; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.storage.StoragePoolVO; -import com.cloud.storage.StorageStats; -import com.google.gson.Gson; - -public class CancelPrimaryStorageMaintenanceExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(CancelPrimaryStorageMaintenanceExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - Long param = gson.fromJson(job.getCmdInfo(), Long.class); - Long userId = job.getUserId(); - - try { - boolean result = managementServer.cancelPrimaryStorageMaintenance(param.longValue(), userId.longValue()); - if(result) - { - StoragePoolVO primaryStorage = managementServer.findPoolById(param); - - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - composeResultObject(primaryStorage,managementServer)); - } - else - { - StoragePoolVO primaryStorage = managementServer.findPoolById(param); - - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - composeResultObject(primaryStorage,managementServer)); - } - } catch(Exception e) { - s_logger.warn("Unable to prepare maintenance: " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - return true; - } - - private PrimaryStorageResultObject composeResultObject(StoragePoolVO storagePoolVO, ManagementServer managementServer) - { - - PrimaryStorageResultObject primaryStorageRO = new PrimaryStorageResultObject(); - - primaryStorageRO.setId(storagePoolVO.getId()); - - primaryStorageRO.setName(storagePoolVO.getName()); - primaryStorageRO.setType(storagePoolVO.getPoolType().toString()); - primaryStorageRO.setState(storagePoolVO.getStatus().toString()); - primaryStorageRO.setIpAddress(storagePoolVO.getHostAddress()); - primaryStorageRO.setZoneId(storagePoolVO.getDataCenterId()); - primaryStorageRO.setZoneName(managementServer.getDataCenterBy(storagePoolVO.getDataCenterId()).getName()); - - if (storagePoolVO.getPodId() != null && managementServer.findHostPodById(storagePoolVO.getPodId()) != null) { - primaryStorageRO.setPodId(storagePoolVO.getPodId()); - primaryStorageRO.setPodName((managementServer.findHostPodById(storagePoolVO.getPodId())).getName()); - } - - if (storagePoolVO.getCreated() != null) { - primaryStorageRO.setCreated(storagePoolVO.getCreated()); - } - primaryStorageRO.setDiskSizeTotal(storagePoolVO.getCapacityBytes()); - - StorageStats stats = managementServer.getStoragePoolStatistics(storagePoolVO.getId()); - long capacity = storagePoolVO.getCapacityBytes(); - long available = storagePoolVO.getAvailableBytes() ; - long used = capacity - available; - - if (stats != null) { - used = stats.getByteUsed(); - available = capacity - used; - } - - primaryStorageRO.setDiskSizeAllocated(used); - if (storagePoolVO.getClusterId() != null) - { - ClusterVO cluster = managementServer.findClusterById(storagePoolVO.getClusterId()); - primaryStorageRO.setClusterId(storagePoolVO.getClusterId()); - primaryStorageRO.setClusterName(cluster.getName()); - } - - primaryStorageRO.setTags(managementServer.getStoragePoolTags(storagePoolVO.getId())); - return primaryStorageRO; - - } -} diff --git a/server/src/com/cloud/async/executor/CompleteMaintenanceExecutor.java b/server/src/com/cloud/async/executor/CompleteMaintenanceExecutor.java index f3189c9b6d3..1e04fe9cdf0 100644 --- a/server/src/com/cloud/async/executor/CompleteMaintenanceExecutor.java +++ b/server/src/com/cloud/async/executor/CompleteMaintenanceExecutor.java @@ -33,9 +33,9 @@ import com.cloud.host.Host; import com.cloud.host.HostStats; import com.cloud.host.HostVO; import com.cloud.host.Status.Event; -import com.cloud.offering.ServiceOffering; import com.cloud.serializer.GsonHelper; import com.cloud.server.ManagementServer; +import com.cloud.service.ServiceOffering; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.utils.NumbersUtil; import com.cloud.vm.UserVmVO; diff --git a/server/src/com/cloud/async/executor/CreatePrivateTemplateExecutor.java b/server/src/com/cloud/async/executor/CreatePrivateTemplateExecutor.java index 2a44c5e6650..87fef05d989 100644 --- a/server/src/com/cloud/async/executor/CreatePrivateTemplateExecutor.java +++ b/server/src/com/cloud/async/executor/CreatePrivateTemplateExecutor.java @@ -27,11 +27,8 @@ import com.cloud.async.AsyncJobResult; import com.cloud.async.AsyncJobVO; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.dc.DataCenterVO; -import com.cloud.event.EventTypes; -import com.cloud.event.EventVO; import com.cloud.exception.InvalidParameterValueException; import com.cloud.host.HostVO; -import com.cloud.host.Status.Event; import com.cloud.serializer.GsonHelper; import com.cloud.server.ManagementServer; import com.cloud.storage.GuestOS; @@ -70,7 +67,7 @@ public class CreatePrivateTemplateExecutor extends VolumeOperationExecutor { Long snapshotId = param.getSnapshotId(); Long volumeId = param.getVolumeId(); - managerServer.saveStartedEvent(param.getUserId(), param.getAccountId(), EventTypes.EVENT_TEMPLATE_CREATE, "Creating Template: " +param.getName(), param.getEventId()); + // By default, assume failure String details = "Could not create private template from "; if (snapshotId != null) { @@ -145,8 +142,6 @@ public class CreatePrivateTemplateExecutor extends VolumeOperationExecutor { jobStatus = AsyncJobResult.STATUS_SUCCEEDED; resultCode = 0; details = null; - String eventParams = "id="+template.getId()+"\nname=" + template.getName() +"\nsize="+volume.getSize(); - managerServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_TEMPLATE_CREATE, "Successfully created Template " +param.getName(), eventParams ,param.getEventId()); resultObject = composeResultObject(template, templateHostRef, volume.getDataCenterId()); } @@ -171,7 +166,6 @@ public class CreatePrivateTemplateExecutor extends VolumeOperationExecutor { if (jobStatus == AsyncJobResult.STATUS_FAILED) { resultObject = details; - managerServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_TEMPLATE_CREATE, details, "" ,param.getEventId()); } asyncMgr.completeAsyncJob(jobId, jobStatus, resultCode, resultObject); return true; diff --git a/server/src/com/cloud/async/executor/CreatePrivateTemplateParam.java b/server/src/com/cloud/async/executor/CreatePrivateTemplateParam.java index 5032fa90224..9cb545d7dcf 100644 --- a/server/src/com/cloud/async/executor/CreatePrivateTemplateParam.java +++ b/server/src/com/cloud/async/executor/CreatePrivateTemplateParam.java @@ -19,12 +19,10 @@ package com.cloud.async.executor; public class CreatePrivateTemplateParam { - private long userId; - private long accountId; + private long userId; private Long volumeId; private Long snapshotId; - private long guestOsId; - private long eventId; + private long guestOsId; private String name; private String description; private Boolean requiresHvm; @@ -36,14 +34,12 @@ public class CreatePrivateTemplateParam { public CreatePrivateTemplateParam() { } - public CreatePrivateTemplateParam(long userId, long accountId, Long volumeId, long guestOsId, long eventId, String name, String description, Boolean requiresHvm, Integer bits, Boolean passwordEnabled, Boolean isPublic, Boolean featured, Long snapshotId) { - this.userId = userId; - this.accountId = accountId; + public CreatePrivateTemplateParam(long userId, Long volumeId, long guestOsId, String name, String description, Boolean requiresHvm, Integer bits, Boolean passwordEnabled, Boolean isPublic, Boolean featured, Long snapshotId) { + this.userId = userId; this.name = name; this.description = description; this.volumeId = volumeId; - this.guestOsId = guestOsId; - this.eventId = eventId; + this.guestOsId = guestOsId; this.requiresHvm = requiresHvm; this.bits = bits; this.passwordEnabled = passwordEnabled; @@ -60,14 +56,6 @@ public class CreatePrivateTemplateParam { this.userId = userId; } - public long getAccountId() { - return accountId; - } - - public void setAccountId(long accountId) { - this.accountId = accountId; - } - public long getVolumeId() { return volumeId; } @@ -92,14 +80,6 @@ public class CreatePrivateTemplateParam { this.guestOsId = guestOsId; } - public long getEventId() { - return eventId; - } - - public void setEventId(long eventId) { - this.eventId = eventId; - } - public String getName() { return name; } diff --git a/server/src/com/cloud/async/executor/DeployVMExecutor.java b/server/src/com/cloud/async/executor/DeployVMExecutor.java index b0da90c7b32..9a69b6df195 100644 --- a/server/src/com/cloud/async/executor/DeployVMExecutor.java +++ b/server/src/com/cloud/async/executor/DeployVMExecutor.java @@ -19,30 +19,31 @@ package com.cloud.async.executor; -import org.apache.log4j.Logger; +import java.util.ArrayList; +import java.util.List; +import org.apache.log4j.Logger; + import com.cloud.agent.api.Answer; import com.cloud.api.BaseCmd; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobResult; import com.cloud.async.AsyncJobVO; -import com.cloud.event.EventTypes; -import com.cloud.event.EventVO; import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientStorageCapacityException; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceAllocationException; +import com.cloud.network.security.NetworkGroupVO; import com.cloud.serializer.GsonHelper; import com.cloud.server.ManagementServer; import com.cloud.service.ServiceOfferingVO; +import com.cloud.storage.InsufficientStorageCapacityException; import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; -import com.cloud.user.User; -import com.cloud.uservm.UserVm; import com.cloud.utils.exception.ExecutionException; -import com.google.gson.Gson; +import com.cloud.vm.UserVm; +import com.google.gson.Gson; public class DeployVMExecutor extends VMOperationExecutor { public static final Logger s_logger = Logger.getLogger(DeployVMExecutor.class.getName()); @@ -63,52 +64,44 @@ public class DeployVMExecutor extends VMOperationExecutor { param.getPassword(), param.getDisplayName(), param.getGroup(), param.getUserData(), param.getNetworkGroup(), param.getEventId()); asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_SUCCEEDED, 0, composeResultObject(param.getUserId(), vm, param)); + AsyncJobResult.STATUS_SUCCEEDED, 0, composeResultObject(vm, param)); } catch (ResourceAllocationException e) { if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to deploy VM: " + e.getMessage()); - saveEvent(param, EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_CREATE, "Unable to deploy VM: VM_INSUFFICIENT_CAPACITY"); + s_logger.debug("Unable to deploy VM: " + e.getMessage()); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.VM_INSUFFICIENT_CAPACITY, e.getMessage()); } catch (ExecutionException e) { if(s_logger.isDebugEnabled()) s_logger.debug("Unable to deploy VM: " + e.getMessage()); - saveEvent(param, EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_CREATE, "Unable to deploy VM: VM_HOST_LICENSE_EXPIRED"); asyncMgr.completeAsyncJob(getJob().getId(),AsyncJobResult.STATUS_FAILED, BaseCmd.VM_HOST_LICENSE_EXPIRED, e.getMessage()); } catch (InvalidParameterValueException e) { if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to deploy VM: " + e.getMessage()); - saveEvent(param, EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_CREATE, "Unable to deploy VM: VM_INVALID_PARAM_ERROR"); + s_logger.debug("Unable to deploy VM: " + e.getMessage()); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.VM_INVALID_PARAM_ERROR, e.getMessage()); } catch (InternalErrorException e) { if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to deploy VM: " + e.getMessage()); - saveEvent(param, EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_CREATE, "Unable to deploy VM: INTERNAL_ERROR"); + s_logger.debug("Unable to deploy VM: " + e.getMessage()); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); } catch (InsufficientStorageCapacityException e) { if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to deploy VM: " + e.getMessage()); - saveEvent(param, EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_CREATE, "Unable to deploy VM: VM_INSUFFICIENT_CAPACITY"); + s_logger.debug("Unable to deploy VM: " + e.getMessage()); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.VM_INSUFFICIENT_CAPACITY, e.getMessage()); } catch (PermissionDeniedException e) { if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to deploy VM: " + e.getMessage()); - saveEvent(param, EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_CREATE, "Unable to deploy VM: ACCOUNT_ERROR"); + s_logger.debug("Unable to deploy VM: " + e.getMessage()); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.ACCOUNT_ERROR, e.getMessage()); } catch (ConcurrentOperationException e) { if(s_logger.isDebugEnabled()) s_logger.debug("Unable to deploy VM: " + e.getMessage()); - saveEvent(param, EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_CREATE, "Unable to deploy VM: INTERNAL_ERROR"); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); } catch(Exception e) { - s_logger.warn("Unable to deploy VM : " + e.getMessage(), e); - saveEvent(param, EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_CREATE, "Unable to deploy VM: INTERNAL_ERROR"); + s_logger.warn("Unable to deploy VM : " + e.getMessage(), e); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); } @@ -127,14 +120,7 @@ public class DeployVMExecutor extends VMOperationExecutor { public void processTimeout(VMOperationListener listener, long agentId, long seq) { } - private long saveEvent(DeployVMParam param, String level, String type, String description){ - - return getAsyncJobMgr().getExecutorContext().getManagementServer().saveEvent( - param.getUserId(), param.getAccountId(), - level, type, description, null, param.getEventId()); - } - - private DeployVMResultObject composeResultObject(long userId, UserVm vm, DeployVMParam param) { + private DeployVMResultObject composeResultObject(UserVm vm, DeployVMParam param) { DeployVMResultObject resultObject = new DeployVMResultObject(); if(vm == null) @@ -171,16 +157,12 @@ public class DeployVMExecutor extends VMOperationExecutor { resultObject.setDomainId(acct.getDomainId()); resultObject.setDomain(managementServer.findDomainIdById(acct.getDomainId()).getName()); } - - User userExecutingCmd = managementServer.getUser(userId); - //this is for the case where the admin deploys a vm for a normal user - Account acctForUserExecutingCmd = managementServer.findAccountById(Long.valueOf(userExecutingCmd.getAccountId())); - if ((BaseCmd.isAdmin(acctForUserExecutingCmd.getType()) && (vm.getHostId() != null)) || (BaseCmd.isAdmin(acct.getType()) && (vm.getHostId() != null))) - { - resultObject.setHostname(managementServer.getHostBy(vm.getHostId()).getName()); - resultObject.setHostid(vm.getHostId()); - } - + + if ( BaseCmd.isAdmin(acct.getType()) && (vm.getHostId() != null)) { + resultObject.setHostname(managementServer.getHostBy(vm.getHostId()).getName()); + resultObject.setHostid(vm.getHostId()); + } + String templateName = "none"; boolean templatePasswordEnabled = false; String templateDisplayText = null; diff --git a/server/src/com/cloud/async/executor/DeployVMParam.java b/server/src/com/cloud/async/executor/DeployVMParam.java index d857b5eaab3..f7008a89fcc 100644 --- a/server/src/com/cloud/async/executor/DeployVMParam.java +++ b/server/src/com/cloud/async/executor/DeployVMParam.java @@ -19,7 +19,7 @@ package com.cloud.async.executor; public class DeployVMParam extends VMOperationParam { - + private long accountId; private long dataCenterId; private long serviceOfferingId; private long templateId; @@ -41,7 +41,7 @@ public class DeployVMParam extends VMOperationParam { String displayName, String group, String userData, String [] networkGroups) { setUserId(userId); - setAccountId(accountId); + this.accountId = accountId; this.dataCenterId = dataCenterId; this.serviceOfferingId = serviceOfferingId; this.templateId = templateId; @@ -61,7 +61,7 @@ public class DeployVMParam extends VMOperationParam { String [] networkGroups, long eventId) { setUserId(userId); - setAccountId(accountId); + this.accountId = accountId; this.dataCenterId = dataCenterId; this.serviceOfferingId = serviceOfferingId; this.templateId = templateId; @@ -74,6 +74,14 @@ public class DeployVMParam extends VMOperationParam { this.setNetworkGroups(networkGroups); this.eventId = eventId; } + + public long getAccountId() { + return accountId; + } + + public void setAccountId(long accountId) { + this.accountId = accountId; + } public long getDataCenterId() { return dataCenterId; diff --git a/server/src/com/cloud/async/executor/DestroyVMExecutor.java b/server/src/com/cloud/async/executor/DestroyVMExecutor.java index d0aa20b5b8f..d44d57945c7 100644 --- a/server/src/com/cloud/async/executor/DestroyVMExecutor.java +++ b/server/src/com/cloud/async/executor/DestroyVMExecutor.java @@ -32,7 +32,6 @@ import com.cloud.event.EventState; import com.cloud.event.EventTypes; import com.cloud.event.EventVO; import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; import com.cloud.storage.VolumeVO; import com.cloud.storage.Volume.VolumeType; import com.cloud.utils.db.DB; @@ -49,32 +48,19 @@ public class DestroyVMExecutor extends VMOperationExecutor { public boolean execute() { Gson gson = GsonHelper.getBuilder().create(); AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - OperationResponse response; + AsyncJobVO job = getJob(); if(getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job.getId(), "UserVM", param.getVmId()); - return true; - // always true if it does not have sync-source - } else { - managementServer.saveStartedEvent(param.getUserId(), param.getAccountId(), EventTypes.EVENT_VM_DESTROY, "Destroying VM " +param.getVmId(), param.getEventId()); - asyncMgr.updateAsyncJobAttachment(job.getId(), "vm_instance", param.getVmId()); - response = asyncMgr.getExecutorContext().getVmMgr().executeDestroyVM(this, param); - UserVmVO vm = managementServer.findUserVMInstanceById(param.getVmId()); - String params = "id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); - - if (OperationResponse.STATUS_SUCCEEDED == response.getResultCode() ){ - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_DESTROY, "Successfully destroyed VM instance : " + param.getVmId(), params, param.getEventId()); - return true; - }else if (OperationResponse.STATUS_FAILED == response.getResultCode()){ - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_DESTROY, "Failed to stop VM instance : " + response.getResultDescription(), params, param.getEventId()); - return true; - } + VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); + asyncMgr.syncAsyncJobExecution(job.getId(), "UserVM", param.getVmId()); - } - return false; + // always true if it does not have sync-source + return true; + } else { + VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); + asyncMgr.updateAsyncJobAttachment(job.getId(), "vm_instance", param.getVmId()); + return asyncMgr.getExecutorContext().getVmMgr().executeDestroyVM(this, param); + } } @Override @@ -83,29 +69,42 @@ public class DestroyVMExecutor extends VMOperationExecutor { UserVmVO vm = listener.getVm(); VMOperationParam param = listener.getParam(); AsyncJobManager asyncMgr = getAsyncJobMgr(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - String params = "id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); + if(s_logger.isDebugEnabled()) s_logger.debug("Execute asynchronize destroy VM command: received stop-VM answer, " + vm.getHostId() + "-" + seq); + EventVO event = new EventVO(); + event.setUserId(param.getUserId()); + event.setAccountId(vm.getAccountId()); + event.setState(EventState.Completed); + event.setStartId(param.getEventId()); + event.setType(EventTypes.EVENT_VM_STOP); + event.setParameters("id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId()); + boolean stopped = false; if(answer != null && answer.getResult()) stopped = true; try { if(stopped) { - asyncMgr.getExecutorContext().getVmMgr().completeStopCommand(param.getUserId(), vm, Event.OperationSucceeded, param.getChildEventId()); + asyncMgr.getExecutorContext().getVmMgr().completeStopCommand(param.getUserId(), vm, Event.OperationSucceeded, param.getEventId()); // completeStopCommand will log the stop event, if we log it here we will end up with duplicated stop event Transaction txn = Transaction.currentTxn(); txn.start(); + event = new EventVO(); + event.setUserId(param.getUserId()); + event.setAccountId(vm.getAccountId()); + event.setType(EventTypes.EVENT_VM_DESTROY); + event.setParameters("id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId()); + event.setDescription("successfully destroyed VM instance : " + vm.getName()); + asyncMgr.getExecutorContext().getEventDao().persist(event); + asyncMgr.getExecutorContext().getAccountMgr().decrementResourceCount(vm.getAccountId(), ResourceType.user_vm); if (!asyncMgr.getExecutorContext().getVmDao().updateIf(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) { s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm.toString()); - txn.rollback(); - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_DESTROY, - "Failed to stop VM instance : " + vm.getName(), params, param.getEventId()); + txn.rollback(); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, 0, "Unable to destroy the vm because it is not in the correct state"); return; @@ -124,8 +123,7 @@ public class DestroyVMExecutor extends VMOperationExecutor { for (VolumeVO volume : volumes) { asyncMgr.getExecutorContext().getVolumeDao().detachVolume(volume.getId()); } - managementServer.saveEvent(param.getUserId(), vm.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_DESTROY, - "Successfully destroyed VM instance : " + vm.getName(), params, param.getEventId()); + txn.commit(); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, "success"); @@ -133,11 +131,10 @@ public class DestroyVMExecutor extends VMOperationExecutor { asyncMgr.getExecutorContext().getVmDao().updateIf(vm, Event.OperationFailed, vm.getHostId()); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent failed to stop VM: " + vm.getName()); - managementServer.saveEvent(param.getUserId(), vm.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_STOP, - "failed to stop VM instance : " + vm.getName(), params, param.getChildEventId()); - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_DESTROY, - "failed to stop VM instance : " + vm.getName(), params, param.getEventId()); - + + event.setDescription("failed to stop VM instance : " + vm.getName()); + event.setLevel(EventVO.LEVEL_ERROR); + asyncMgr.getExecutorContext().getEventDao().persist(event); } } catch(Exception e) { s_logger.error("Unexpected exception " + e.getMessage(), e); diff --git a/server/src/com/cloud/async/executor/OperationResponse.java b/server/src/com/cloud/async/executor/OperationResponse.java deleted file mode 100644 index 0934eb6ea9b..00000000000 --- a/server/src/com/cloud/async/executor/OperationResponse.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.cloud.async.executor; - -public class OperationResponse { - - public static final int STATUS_IN_PROGRESS = 0; - public static final int STATUS_SUCCEEDED = 1; - public static final int STATUS_FAILED = 2; - - private int resultCode; - private String resultDescription; - - public OperationResponse(int resultCode, String resultDescription) { - this.resultCode = resultCode; - this.resultDescription = resultDescription; - } - - public int getResultCode() { - return resultCode; - } - - public void setResultCode(int resultCode) { - this.resultCode = resultCode; - } - - public String getResultDescription() { - return resultDescription; - } - - public void setResultDescription(String resultDescription) { - this.resultDescription = resultDescription; - } - -} diff --git a/server/src/com/cloud/async/executor/PrepareMaintenanceExecutor.java b/server/src/com/cloud/async/executor/PrepareMaintenanceExecutor.java index 02c1f9fc822..88944621993 100644 --- a/server/src/com/cloud/async/executor/PrepareMaintenanceExecutor.java +++ b/server/src/com/cloud/async/executor/PrepareMaintenanceExecutor.java @@ -34,9 +34,9 @@ import com.cloud.host.HostStats; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.Status.Event; -import com.cloud.offering.ServiceOffering; import com.cloud.serializer.GsonHelper; import com.cloud.server.ManagementServer; +import com.cloud.service.ServiceOffering; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.utils.NumbersUtil; import com.cloud.utils.fsm.StateMachine; diff --git a/server/src/com/cloud/async/executor/PreparePrimaryStorageMaintenanceExecutor.java b/server/src/com/cloud/async/executor/PreparePrimaryStorageMaintenanceExecutor.java deleted file mode 100644 index 1d58bf8dc66..00000000000 --- a/server/src/com/cloud/async/executor/PreparePrimaryStorageMaintenanceExecutor.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.cloud.async.executor; - -import org.apache.log4j.Logger; - -import com.cloud.api.BaseCmd; -import com.cloud.async.AsyncJobManager; -import com.cloud.async.AsyncJobResult; -import com.cloud.async.AsyncJobVO; -import com.cloud.async.BaseAsyncJobExecutor; -import com.cloud.dc.ClusterVO; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.storage.StoragePoolVO; -import com.cloud.storage.StorageStats; -import com.google.gson.Gson; - -public class PreparePrimaryStorageMaintenanceExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(PreparePrimaryStorageMaintenanceExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - Long param = gson.fromJson(job.getCmdInfo(), Long.class); - Long userId = job.getUserId(); - - try { - boolean result = managementServer.preparePrimaryStorageForMaintenance(param.longValue(), userId.longValue()); - if(result) - { - StoragePoolVO primaryStorage = managementServer.findPoolById(param); - - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - composeResultObject(primaryStorage,managementServer)); - } - else - { - StoragePoolVO primaryStorage = managementServer.findPoolById(param); - - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - composeResultObject(primaryStorage,managementServer)); - } - } catch(Exception e) { - s_logger.warn("Unable to prepare maintenance: " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - return true; - } - - private PrimaryStorageResultObject composeResultObject(StoragePoolVO storagePoolVO, ManagementServer managementServer) - { - - PrimaryStorageResultObject primaryStorageRO = new PrimaryStorageResultObject(); - - primaryStorageRO.setId(storagePoolVO.getId()); - - primaryStorageRO.setName(storagePoolVO.getName()); - primaryStorageRO.setType(storagePoolVO.getPoolType().toString()); - primaryStorageRO.setState(storagePoolVO.getStatus().toString()); - primaryStorageRO.setIpAddress(storagePoolVO.getHostAddress()); - primaryStorageRO.setZoneId(storagePoolVO.getDataCenterId()); - primaryStorageRO.setZoneName(managementServer.getDataCenterBy(storagePoolVO.getDataCenterId()).getName()); - - if (storagePoolVO.getPodId() != null && managementServer.findHostPodById(storagePoolVO.getPodId()) != null) { - primaryStorageRO.setPodId(storagePoolVO.getPodId()); - primaryStorageRO.setPodName((managementServer.findHostPodById(storagePoolVO.getPodId())).getName()); - } - - if (storagePoolVO.getCreated() != null) { - primaryStorageRO.setCreated(storagePoolVO.getCreated()); - } - primaryStorageRO.setDiskSizeTotal(storagePoolVO.getCapacityBytes()); - - StorageStats stats = managementServer.getStoragePoolStatistics(storagePoolVO.getId()); - long capacity = storagePoolVO.getCapacityBytes(); - long available = storagePoolVO.getAvailableBytes() ; - long used = capacity - available; - - if (stats != null) { - used = stats.getByteUsed(); - available = capacity - used; - } - - primaryStorageRO.setDiskSizeAllocated(used); - if (storagePoolVO.getClusterId() != null) - { - ClusterVO cluster = managementServer.findClusterById(storagePoolVO.getClusterId()); - primaryStorageRO.setClusterId(storagePoolVO.getClusterId()); - primaryStorageRO.setClusterName(cluster.getName()); - } - - primaryStorageRO.setTags(managementServer.getStoragePoolTags(storagePoolVO.getId())); - return primaryStorageRO; - - } -} diff --git a/server/src/com/cloud/async/executor/PrimaryStorageResultObject.java b/server/src/com/cloud/async/executor/PrimaryStorageResultObject.java deleted file mode 100644 index f47f0f7e5f0..00000000000 --- a/server/src/com/cloud/async/executor/PrimaryStorageResultObject.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.cloud.async.executor; - -import java.util.Date; - -import com.cloud.serializer.Param; - -public class PrimaryStorageResultObject -{ - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - public long getZoneId() { - return zoneId; - } - - public void setZoneId(long zoneId) { - this.zoneId = zoneId; - } - - public String getZoneName() { - return zoneName; - } - - public void setZoneName(String zoneName) { - this.zoneName = zoneName; - } - - public Long getPodId() { - return podId; - } - - public void setPodId(Long podId) { - this.podId = podId; - } - - public String getPodName() { - return podName; - } - - public void setPodName(String podName) { - this.podName = podName; - } - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - public Long getDiskSizeTotal() { - return diskSizeTotal; - } - - public void setDiskSizeTotal(Long diskSizeTotal) { - this.diskSizeTotal = diskSizeTotal; - } - - public Long getDiskSizeAllocated() { - return diskSizeAllocated; - } - - public void setDiskSizeAllocated(Long diskSizeAllocated) { - this.diskSizeAllocated = diskSizeAllocated; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public Long getClusterId() { - return clusterId; - } - - public void setClusterId(Long clusterId) { - this.clusterId = clusterId; - } - - public String getClusterName() { - return clusterName; - } - - public void setClusterName(String clusterName) { - this.clusterName = clusterName; - } - - public String getTags() { - return tags; - } - - public void setTags(String tags) { - this.tags = tags; - } - - @Param(name="id") - private long id; - - @Param(name="name") - private String name; - - @Param(name="type") - private String type; - - @Param(name="state") - private String state; - - @Param(name="ipaddress") - private String ipAddress; - - @Param(name="zoneid") - private long zoneId; - - @Param(name="zonename") - private String zoneName; - - @Param(name="podid") - private Long podId; - - @Param(name="podname") - private String podName; - - @Param(name="path") - private String path; - - @Param(name="disksizetotal") - private Long diskSizeTotal; - - @Param(name="disksizeallocated") - private Long diskSizeAllocated; - - @Param(name="created") - private Date created; - - @Param(name="clusterid") - private Long clusterId; - - @Param(name="clustername") - private String clusterName; - - @Param(name="tags") - private String tags; - -} diff --git a/server/src/com/cloud/async/executor/RebootVMExecutor.java b/server/src/com/cloud/async/executor/RebootVMExecutor.java index 0f0b3ff9d44..4b98ae87583 100644 --- a/server/src/com/cloud/async/executor/RebootVMExecutor.java +++ b/server/src/com/cloud/async/executor/RebootVMExecutor.java @@ -29,7 +29,6 @@ import com.cloud.event.EventState; import com.cloud.event.EventTypes; import com.cloud.event.EventVO; import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; import com.cloud.vm.UserVmVO; import com.google.gson.Gson; @@ -39,34 +38,27 @@ public class RebootVMExecutor extends VMOperationExecutor { public boolean execute() { Gson gson = GsonHelper.getBuilder().create(); AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - UserVmVO vm = managementServer.findUserVMInstanceById(param.getVmId()); - OperationResponse response; + AsyncJobVO job = getJob(); if(getSyncSource() == null) { + VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); asyncMgr.syncAsyncJobExecution(job.getId(), "UserVM", param.getVmId()); // always true if it does not have sync-source return true; } else { - - managementServer.saveStartedEvent(param.getUserId(), param.getAccountId(), EventTypes.EVENT_VM_REBOOT, "Rebooting Vm with Id: "+param.getVmId(), param.getEventId()); - asyncMgr.updateAsyncJobAttachment(job.getId(), "vm_instance", param.getVmId()); - response = asyncMgr.getExecutorContext().getVmMgr().executeRebootVM(this, param); - String params = "id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); - - if (OperationResponse.STATUS_SUCCEEDED == response.getResultCode() ){ - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_REBOOT, - "Rebooting Vm with Id: " + param.getVmId(), params, param.getEventId()); - return true; - }else if (OperationResponse.STATUS_FAILED == response.getResultCode()){ - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_REBOOT, - "Failed to reboot VM instance : " + response.getResultDescription(), params, param.getEventId()); - return true; - } - return false; + VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); + EventVO event = new EventVO(); + event.setType(EventTypes.EVENT_VM_REBOOT); + event.setUserId(param.getUserId()); + UserVmVO userVm = asyncMgr.getExecutorContext().getManagementServer().findUserVMInstanceById(param.getVmId()); + event.setAccountId(userVm.getAccountId()); + event.setState(EventState.Started); + event.setStartId(param.getEventId()); + event.setDescription("Rebooting Vm with Id: "+param.getVmId()); + asyncMgr.getExecutorContext().getEventDao().persist(event); + asyncMgr.updateAsyncJobAttachment(job.getId(), "vm_instance", param.getVmId()); + return asyncMgr.getExecutorContext().getVmMgr().executeRebootVM(this, param); } } @@ -74,30 +66,34 @@ public class RebootVMExecutor extends VMOperationExecutor { UserVmVO vm = listener.getVm(); VMOperationParam param = listener.getParam(); AsyncJobManager asyncMgr = getAsyncJobMgr(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - String params = "id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); boolean jobStatusUpdated = false; try { if(s_logger.isDebugEnabled()) s_logger.debug("Execute asynchronize Reboot VM command: received answer, " + vm.getHostId() + "-" + seq); - + + EventVO event = new EventVO(); + event.setUserId(param.getUserId()); + event.setAccountId(vm.getAccountId()); + event.setType(EventTypes.EVENT_VM_REBOOT); + event.setStartId(param.getEventId()); + event.setParameters("id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId()); + if(answer != null) { asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, VMExecutorHelper.composeResultObject(asyncMgr.getExecutorContext().getManagementServer(), vm, null)); - jobStatusUpdated = true; - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_REBOOT, - "Successfully rebooted VM instance : " + vm.getName(), params, param.getEventId()); + jobStatusUpdated = true; + event.setDescription("successfully rebooted VM instance : " + vm.getName()); } else { asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent is unable to execute the command"); - jobStatusUpdated = true; - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_REBOOT, - "Failed to reboot VM instance : " + vm.getName(), params, param.getEventId()); - + jobStatusUpdated = true; + event.setDescription("failed to reboot VM instance : " + vm.getName()); + event.setLevel(EventVO.LEVEL_ERROR); } - + + asyncMgr.getExecutorContext().getEventDao().persist(event); } catch(Exception e) { s_logger.error("Unexpected exception " + e.getMessage(), e); diff --git a/server/src/com/cloud/async/executor/ReconnectExecutor.java b/server/src/com/cloud/async/executor/ReconnectExecutor.java index c7aa7076aa7..7f16636b3b5 100644 --- a/server/src/com/cloud/async/executor/ReconnectExecutor.java +++ b/server/src/com/cloud/async/executor/ReconnectExecutor.java @@ -34,9 +34,9 @@ import com.cloud.host.HostStats; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.Status.Event; -import com.cloud.offering.ServiceOffering; import com.cloud.serializer.GsonHelper; import com.cloud.server.ManagementServer; +import com.cloud.service.ServiceOffering; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; diff --git a/server/src/com/cloud/async/executor/RouterOperationResultObject.java b/server/src/com/cloud/async/executor/RouterOperationResultObject.java index ccfed01617d..6dabfee5939 100644 --- a/server/src/com/cloud/async/executor/RouterOperationResultObject.java +++ b/server/src/com/cloud/async/executor/RouterOperationResultObject.java @@ -68,7 +68,7 @@ public class RouterOperationResultObject { @Param(name="publicnetmask") private String publicNetMask; - @Param(name="guestipaddress") + @Param(name="ipaddress") private String guestIp; @Param(name="macaddress") diff --git a/server/src/com/cloud/async/executor/StartRouterExecutor.java b/server/src/com/cloud/async/executor/StartRouterExecutor.java index 5a8e647c035..8daba85408e 100644 --- a/server/src/com/cloud/async/executor/StartRouterExecutor.java +++ b/server/src/com/cloud/async/executor/StartRouterExecutor.java @@ -25,13 +25,9 @@ import com.cloud.api.BaseCmd; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobResult; import com.cloud.async.AsyncJobVO; -import com.cloud.event.EventTypes; -import com.cloud.event.EventVO; import com.cloud.exception.InternalErrorException; import com.cloud.serializer.GsonHelper; import com.cloud.server.ManagementServer; -import com.cloud.user.Account; -import com.cloud.user.User; import com.cloud.vm.DomainRouter; import com.google.gson.Gson; @@ -48,15 +44,12 @@ public class StartRouterExecutor extends VMOperationExecutor { if(getSyncSource() == null) { asyncMgr.syncAsyncJobExecution(job.getId(), "Router", param.getVmId()); return true; - } else { - boolean success = false; + } else { try { DomainRouter router = managementServer.startRouter(param.getVmId(), param.getEventId()); - if(router != null){ - success = true; + if(router != null) asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - RouterExecutorHelper.composeResultObject(managementServer, router)); - } + RouterExecutorHelper.composeResultObject(managementServer, router)); else asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "operation failed"); @@ -67,11 +60,6 @@ public class StartRouterExecutor extends VMOperationExecutor { s_logger.warn("Unable to start router " + param.getVmId() + ":" + e.getMessage(), e); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } finally { - if(!success){ - // Save completed event when operation fails - asyncMgr.getExecutorContext().getManagementServer().saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_ROUTER_START, "Failed to start router", null, param.getEventId()); - } } return true; } diff --git a/server/src/com/cloud/async/executor/StopVMExecutor.java b/server/src/com/cloud/async/executor/StopVMExecutor.java index 350836be894..c029195b1e1 100644 --- a/server/src/com/cloud/async/executor/StopVMExecutor.java +++ b/server/src/com/cloud/async/executor/StopVMExecutor.java @@ -29,7 +29,6 @@ import com.cloud.event.EventState; import com.cloud.event.EventTypes; import com.cloud.event.EventVO; import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachine.Event; import com.google.gson.Gson; @@ -41,42 +40,45 @@ public class StopVMExecutor extends VMOperationExecutor { Gson gson = GsonHelper.getBuilder().create(); AsyncJobManager asyncMgr = getAsyncJobMgr(); AsyncJobVO job = getJob(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - + if(getSyncSource() == null) { + VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); asyncMgr.syncAsyncJobExecution(job.getId(), "UserVM", param.getVmId()); // always true if it does not have sync-source return true; - } else { - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - managementServer.saveStartedEvent(param.getUserId(), param.getAccountId(), EventTypes.EVENT_VM_STOP, - "Stopping Vm with Id: "+param.getVmId(), param.getEventId()); - OperationResponse response = asyncMgr.getExecutorContext().getVmMgr().executeStopVM(this, param); - UserVmVO vm = managementServer.findUserVMInstanceById(param.getVmId()); - String params = "id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); - - if (OperationResponse.STATUS_SUCCEEDED == response.getResultCode() ){ - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_STOP, "Successfully stopped VM instance : " + param.getVmId(), params, param.getEventId()); - return true; - }else if (OperationResponse.STATUS_FAILED == response.getResultCode()){ - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_STOP, "Failed to stop VM instance : " + response.getResultDescription(), params, param.getEventId()); - return true; - } - } - return false; + } else { + VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); + EventVO event = new EventVO(); + event.setType(EventTypes.EVENT_VM_STOP); + event.setUserId(param.getUserId()); + UserVmVO userVm = asyncMgr.getExecutorContext().getManagementServer().findUserVMInstanceById(param.getVmId()); + event.setAccountId(userVm.getAccountId()); + event.setState(EventState.Started); + event.setStartId(param.getEventId()); + event.setDescription("Stopping Vm with Id: "+param.getVmId()); + asyncMgr.getExecutorContext().getEventDao().persist(event); + return asyncMgr.getExecutorContext().getVmMgr().executeStopVM(this, param); + } } public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { UserVmVO vm = listener.getVm(); VMOperationParam param = listener.getParam(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - String params = "id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); + AsyncJobManager asyncMgr = getAsyncJobMgr(); + if(s_logger.isDebugEnabled()) s_logger.debug("Execute asynchronize stop VM command: received answer, " + vm.getHostId() + "-" + seq); + EventVO event = new EventVO(); + event.setUserId(param.getUserId()); + event.setAccountId(vm.getAccountId()); + event.setType(EventTypes.EVENT_VM_STOP); + event.setState(EventState.Completed); + event.setStartId(param.getEventId()); + event.setParameters("id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId()); + boolean stopped = false; if(answer != null && answer.getResult()) stopped = true; @@ -94,9 +96,10 @@ public class StopVMExecutor extends VMOperationExecutor { asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent failed to stop VM"); jobStatusUpdated = true; - - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_STOP, - "Failed to stop VM instance : " + vm.getName(), params, param.getEventId()); + + event.setDescription("failed to stop VM instance : " + vm.getName()); + event.setLevel(EventVO.LEVEL_ERROR); + asyncMgr.getExecutorContext().getEventDao().persist(event); } } catch(Exception e) { s_logger.error("Unexpected exception " + e.getMessage(), e); @@ -107,8 +110,6 @@ public class StopVMExecutor extends VMOperationExecutor { } else { asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent failed to stop VM"); - managementServer.saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_STOP, - "Failed to stop VM instance : " + vm.getName(), params, param.getEventId()); } } } finally { diff --git a/server/src/com/cloud/async/executor/UpgradeVMExecutor.java b/server/src/com/cloud/async/executor/UpgradeVMExecutor.java index 687d11f3ebb..f8adb7ceae1 100644 --- a/server/src/com/cloud/async/executor/UpgradeVMExecutor.java +++ b/server/src/com/cloud/async/executor/UpgradeVMExecutor.java @@ -30,7 +30,7 @@ import com.cloud.server.ManagementServer; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.VMTemplateVO; import com.cloud.user.Account; -import com.cloud.uservm.UserVm; +import com.cloud.vm.UserVm; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VmStats; diff --git a/server/src/com/cloud/async/executor/VMOperationParam.java b/server/src/com/cloud/async/executor/VMOperationParam.java index 1c4e0e6465b..10bbd36bf9a 100644 --- a/server/src/com/cloud/async/executor/VMOperationParam.java +++ b/server/src/com/cloud/async/executor/VMOperationParam.java @@ -21,33 +21,23 @@ package com.cloud.async.executor; public class VMOperationParam { public static enum VmOp { Noop, Start, Stop, Reboot, Destroy}; //WARN: Noop may not actually be noop - private long userId; - private long accountId; + private long userId; private long vmId; private String isoPath; private VmOp operation; protected long eventId; - protected long childEventId;// This would be used for child events we log during the parent event. In future it can as well be a Map. public VMOperationParam() { } - // This constructor is kept for backward compatibility. REMOVE when no longer needed. + public VMOperationParam(long userId, long vmId, String isoPath, long eventId) { this.userId = userId; this.vmId = vmId; this.isoPath = isoPath; this.operation = VmOp.Noop; this.eventId = eventId; - } - public VMOperationParam(long userId, long accountId, long vmId, String isoPath, long eventId) { - this.userId = userId; - this.accountId = accountId; - this.vmId = vmId; - this.isoPath = isoPath; - this.operation = VmOp.Noop; - this.eventId = eventId; - } + } public long getUserId() { return userId; @@ -57,14 +47,6 @@ public class VMOperationParam { this.userId = userId; } - public long getAccountId() { - return accountId; - } - - public void setAccountId(long accountId) { - this.accountId = accountId; - } - public long getVmId() { return vmId; } @@ -91,11 +73,5 @@ public class VMOperationParam { public long getEventId() { return eventId; - } - public long getChildEventId() { - return childEventId; - } - public void setChildEventId(long childEventId) { - this.childEventId = childEventId; - } + } } diff --git a/server/src/com/cloud/async/executor/VmResultObject.java b/server/src/com/cloud/async/executor/VmResultObject.java index 930281823a1..fed081ab635 100644 --- a/server/src/com/cloud/async/executor/VmResultObject.java +++ b/server/src/com/cloud/async/executor/VmResultObject.java @@ -202,11 +202,6 @@ public class VmResultObject this.networkKbsWrite = networkKbsWrite; } - public long isId() - { - return id; - } - @Param(name="name") private String name; diff --git a/server/src/com/cloud/async/executor/VolumeOperationExecutor.java b/server/src/com/cloud/async/executor/VolumeOperationExecutor.java index 10f6b1c0dbc..aa8204fec4b 100644 --- a/server/src/com/cloud/async/executor/VolumeOperationExecutor.java +++ b/server/src/com/cloud/async/executor/VolumeOperationExecutor.java @@ -28,12 +28,10 @@ import com.cloud.async.AsyncJobResult; import com.cloud.async.AsyncJobVO; import com.cloud.async.BaseAsyncJobExecutor; import com.cloud.async.executor.VolumeOperationParam.VolumeOp; -import com.cloud.event.EventTypes; -import com.cloud.event.EventVO; import com.cloud.exception.InternalErrorException; import com.cloud.serializer.GsonHelper; import com.cloud.storage.VolumeVO; -import com.cloud.uservm.UserVm; +import com.cloud.vm.UserVm; import com.google.gson.Gson; @@ -53,41 +51,28 @@ public class VolumeOperationExecutor extends BaseAsyncJobExecutor { return true; } else { VolumeOperationParam param = gson.fromJson(job.getCmdInfo(), VolumeOperationParam.class); - boolean success = false; - String eventType = null; - String failureDescription = ""; + try { + VolumeOp op = param.getOp(); VolumeVO volume = null; - VolumeOp op = param.getOp(); if (op == VolumeOp.Create) { - eventType = EventTypes.EVENT_VOLUME_CREATE; - failureDescription = "Failed to create volume"; volume = asyncMgr.getExecutorContext().getManagementServer().createVolume(param.getUserId(), param.getAccountId(), param.getName(), param.getZoneId(), param.getDiskOfferingId(), param.getEventId()); if (volume.getStatus() == AsyncInstanceCreateStatus.Corrupted) { asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Failed to create volume."); } else { - success = true; asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, composeResultObject(volume, param)); } } else if (op == VolumeOp.Attach) { - eventType = EventTypes.EVENT_VOLUME_ATTACH; - failureDescription = "Failed to attach volume"; - asyncMgr.getExecutorContext().getManagementServer().attachVolumeToVM(param.getVmId(), param.getVolumeId(), param.getDeviceId(), param.getEventId()); // get the VM instance and Volume for the result object UserVm vmInstance = asyncMgr.getExecutorContext().getManagementServer().findUserVMInstanceById(param.getVmId()); VolumeVO vol = asyncMgr.getExecutorContext().getManagementServer().findVolumeById(param.getVolumeId()); - success = true; asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, composeAttachResultObject(vmInstance, vol)); } else if (op == VolumeOp.Detach) { - eventType = EventTypes.EVENT_VOLUME_DETACH; - failureDescription = "Failed to detach volume"; - asyncMgr.getExecutorContext().getManagementServer().detachVolumeFromVM(param.getVolumeId(), param.getEventId()); - success = true; asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, null); } else { throw new Exception("Invalid Volume Operation. Valid Operations are: CreateVolume, AttachVolume, and DetachVolume."); @@ -98,11 +83,6 @@ public class VolumeOperationExecutor extends BaseAsyncJobExecutor { } catch (Exception e) { s_logger.warn("Unhandled Exception executing volume operation " + param.getOp(), e); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } finally { - if(!success){ - // Save completed event when operation fails - asyncMgr.getExecutorContext().getManagementServer().saveEvent(param.getUserId(), param.getAccountId(), EventVO.LEVEL_ERROR, eventType, failureDescription, null, param.getEventId()); - } } return true; diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index d46e8f28211..fb9ee50c797 100644 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -52,8 +52,8 @@ public enum Config { // Network - GuestIpNetwork("Network", AgentManager.class, String.class, "guest.ip.network", "10.1.1.1", "The network address of the guest virtual network. Virtual machines will be assigned an IP in this subnet.", "privateip"), - GuestNetmask("Network", AgentManager.class, String.class, "guest.netmask", "255.255.255.0", "The netmask of the guest virtual network.", "netmask"), +// GuestIpNetwork("Network", AgentManager.class, String.class, "guest.ip.network", "10.1.1.1", "The network address of the guest virtual network. Virtual machines will be assigned an IP in this subnet.", "privateip"), +// GuestNetmask("Network", AgentManager.class, String.class, "guest.netmask", "255.255.255.0", "The netmask of the guest virtual network.", "netmask"), MulticastThrottlingRate("Network", ManagementServer.class, Integer.class, "multicast.throttling.rate", "10", "Default multicast rate in megabits per second allowed.", null), NetworkThrottlingRate("Network", ManagementServer.class, Integer.class, "network.throttling.rate", "200", "Default data transfer rate in megabits per second allowed.", null), @@ -73,7 +73,6 @@ public enum Config { ConsoleProxyCapacityStandby("Console Proxy", AgentManager.class, String.class, "consoleproxy.capacity.standby", "10", "The minimal number of console proxy viewer sessions that system is able to serve immediately(standby capacity)", null), ConsoleProxyCapacityScanInterval("Console Proxy", AgentManager.class, String.class, "consoleproxy.capacityscan.interval", "30000", "The time interval(in millisecond) to scan whether or not system needs more console proxy to ensure minimal standby capacity", null), ConsoleProxyCmdPort("Console Proxy", AgentManager.class, Integer.class, "consoleproxy.cmd.port", "8001", "Console proxy command port that is used to communicate with management server", null), - ConsoleProxyRestart("Console Proxy", AgentManager.class, Boolean.class, "consoleproxy.restart", "true", "Console proxy restart flag, defaulted to true", null), // obselete //ConsoleProxyDomPEnable("Console Proxy", ManagementServer.class, Boolean.class, "consoleproxy.domP.enable", null, null, null), @@ -129,7 +128,7 @@ public enum Config { UpgradeURL("Advanced", ManagementServer.class, String.class, "upgrade.url", "http://example.com:8080/client/agent/update.zip", "The upgrade URL is the URL of the management server that agents will connect to in order to automatically upgrade.", null), SystemVMUseLocalStorage("Advanced", ManagementServer.class, Boolean.class, "system.vm.use.local.storage", "false", "Indicates whether to use local storage pools or shared storage pools for system VMs.", null), CPUOverprovisioningFactor("Advanced", ManagementServer.class, String.class, "cpu.overprovisioning.factor", "1", "Used for CPU overprovisioning calculation; available CPU will be (actualCpuCapacity * cpu.overprovisioning.factor)", null), - NetworkType("Advanced", ManagementServer.class, String.class, "network.type", "vlan", "The type of network that this deployment will use.", "vlan,direct"), + NetworkType("Advanced", ManagementServer.class, String.class, "network.type", "vnet", "The type of network that this deployment will use.", "vnet,vlan,direct"), LinkLocalIpNums("Advanced", ManagementServer.class, Integer.class, "linkLocalIp.nums", "10", "The number of link local ip that needed by domR(in power of 2)", null), HypervisorType("Advanced", ManagementServer.class, String.class, "hypervisor.type", "kvm", "The type of hypervisor that this deployment will use.", "kvm,xenserver"), ManagementHostIPAdr("Advanced", ManagementServer.class, String.class, "host", "localhost", "The ip address of management server", null), @@ -163,7 +162,7 @@ public enum Config { XenBondStorageNic("Advanced", ManagementServer.class, String.class, "xen.bond.storage.nics", null, "Attempt to bond the two networks if found", null), XenHeartBeatInterval("Advanced", ManagementServer.class, Integer.class, "xen.heartbeat.interval", "60", "heartbeat to use when implementing XenServer Self Fencing", "any # of seconds"), XenPreallocatedLunSizeRange("Advanced", ManagementServer.class, Float.class, "xen.preallocated.lun.size.range", ".05", "percentage to add to disk size when allocating", null), - XenGuestNetwork("Advanced", ManagementServer.class, String.class, "xen.guest.network.device", null, "Specify for guest network name label", null), + XenGuestNetwork("Advanced", ManagementServer.class, String.class, "xen.guest.network.device", null, "Specify when the guest network does not go over the private network", null), // Premium diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java index b9fc95ba032..1633a1e636a 100644 --- a/server/src/com/cloud/configuration/ConfigurationManager.java +++ b/server/src/com/cloud/configuration/ConfigurationManager.java @@ -98,7 +98,7 @@ public interface ConfigurationManager extends Manager { * @param mirrored * @return ID */ - DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags); + DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, boolean mirrored, String tags); /** * Creates a new pod @@ -224,15 +224,4 @@ public interface ConfigurationManager extends Manager { */ boolean isPremium(); - /** - * Persists a config value via the API call - * @param instance - * @param component - * @param category - * @param name - * @param value - * @param description - * @return - */ - public boolean addConfig(String instance, String component,String category, String name, String value, String description); } diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index f5efe1c0438..489c5c560b4 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -52,8 +52,8 @@ import com.cloud.event.dao.EventDao; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.dao.IPAddressDao; -import com.cloud.offering.ServiceOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.dao.DiskOfferingDao; @@ -123,10 +123,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager { } public void updateConfiguration(long userId, String name, String value) throws InvalidParameterValueException, InternalErrorException { - if (value != null && (value.trim().isEmpty() || value.equals("null"))) { - value = null; - } - String validationMsg = validateConfigurationValue(name, value); if (validationMsg != null) { @@ -143,10 +139,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager { } private String validateConfigurationValue(String name, String value) { - if (value == null) { - return null; - } - Config c = Config.getConfig(name); value = value.trim(); @@ -704,9 +696,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager { internalDns1 = zone.getInternalDns1(); } - if(guestCidr == null) - guestCidr = zone.getGuestNetworkCidr(); - boolean checkForDuplicates = !newZoneName.equals(oldZoneName); checkZoneParameters(newZoneName, dns1, dns2, internalDns1, internalDns2, checkForDuplicates); @@ -715,7 +704,9 @@ public class ConfigurationManagerImpl implements ConfigurationManager { zone.setDns2(dns2); zone.setInternalDns1(internalDns1); zone.setInternalDns2(internalDns2); - zone.setGuestNetworkCidr(guestCidr); + + if(guestCidr != null) + zone.setGuestNetworkCidr(guestCidr); if (vnetRange != null) { zone.setVnet(vnetRange); @@ -891,10 +882,10 @@ public class ConfigurationManagerImpl implements ConfigurationManager { } } - public DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags) { + public DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, boolean mirrored, String tags) { long diskSize = numGibibytes * 1024; tags = cleanupTags(tags); - DiskOfferingVO newDiskOffering = new DiskOfferingVO(domainId, name, description, diskSize,tags); + DiskOfferingVO newDiskOffering = new DiskOfferingVO(domainId, name, description, diskSize, mirrored, tags); return _diskOfferingDao.persist(newDiskOffering); } @@ -928,7 +919,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { { if(_configDao.getValue("xen.public.network.device") == null || _configDao.getValue("xen.public.network.device").equals("")) { - throw new InternalErrorException("For adding an untagged IP range, please set up xen.public.network.device"); + throw new InternalErrorException("For adding an untagged vlan, please set up xen.public.network.device"); } } @@ -941,17 +932,17 @@ public class ConfigurationManagerImpl implements ConfigurationManager { //remove this if (vlanType.equals(VlanType.VirtualNetwork)) { if (!(accountId == null && podId == null) && false) { - throw new InvalidParameterValueException("IP ranges for the virtual network must be zone-wide."); + throw new InvalidParameterValueException("VLANs for the virtual network must be zone-wide."); } } else if (vlanType.equals(VlanType.DirectAttached)) { if (!((accountId != null && podId == null) || (accountId == null && podId != null))) { - throw new InvalidParameterValueException("Direct Attached IP ranges must either be pod-wide, or for one account."); + throw new InvalidParameterValueException("Direct Attached VLANs must either be pod-wide, or for one account."); } if (accountId != null) { // VLANs for an account must be tagged if (vlanId.equals(Vlan.UNTAGGED)) { - throw new InvalidParameterValueException("Direct Attached IP ranges for an account must be tagged."); + throw new InvalidParameterValueException("Direct Attached VLANs for an account must be tagged."); } // Check that the account ID is valid @@ -964,7 +955,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { List podsInZone = _podDao.listByDataCenterId(zone.getId()); for (HostPodVO pod : podsInZone) { if (_podVlanMapDao.listPodVlanMapsByPod(pod.getId()).size() > 0) { - throw new InvalidParameterValueException("Zone " + zone.getName() + " already has pod-wide IP ranges. A zone may contain either pod-wide IP ranges or account-wide IP ranges, but not both."); + throw new InvalidParameterValueException("Zone " + zone.getName() + " already has pod VLANs. A zone may contain either pod VLANs or account VLANs, but not both."); } } @@ -973,13 +964,13 @@ public class ConfigurationManagerImpl implements ConfigurationManager { for (AccountVlanMapVO accountVlanMap : accountVlanMaps) { VlanVO vlan = _vlanDao.findById(accountVlanMap.getVlanDbId()); if (vlan.getDataCenterId() == zone.getId().longValue()) { - throw new InvalidParameterValueException("The account " + account.getAccountName() + " is already assigned to an IP range in zone " + zone.getName() + "."); + throw new InvalidParameterValueException("The account " + account.getAccountName() + " is already assigned to the VLAN with ID " + vlan.getVlanId() + " in zone " + zone.getName() + "."); } } } else if (podId != null) { // Pod-wide VLANs must be untagged if (!vlanId.equals(Vlan.UNTAGGED)) { - throw new InvalidParameterValueException("Direct Attached IP ranges for a pod must be untagged."); + throw new InvalidParameterValueException("Direct Attached VLANs for a pod must be untagged."); } // Check that the pod ID is valid @@ -993,13 +984,13 @@ public class ConfigurationManagerImpl implements ConfigurationManager { for (AccountVlanMapVO accountVlanMap : accountVlanMaps) { VlanVO vlan = _vlanDao.findById(accountVlanMap.getVlanDbId()); if (vlan.getDataCenterId() == zone.getId().longValue()) { - throw new InvalidParameterValueException("Zone " + zone.getName() + " already has account-wide IP ranges. A zone may contain either pod-wide IP ranges or account-wide IP ranges, but not both."); + throw new InvalidParameterValueException("Zone " + zone.getName() + " already has account VLANs. A zone may contain either pod VLANs or account VLANs, but not both."); } } } } else { - throw new InvalidParameterValueException("Please specify a valid IP range type. Valid types are: " + VlanType.values().toString()); + throw new InvalidParameterValueException("Please specify a valid VLAN type. Valid types are: " + VlanType.values().toString()); } // Make sure the gateway is valid @@ -1031,7 +1022,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { String guestSubnet = NetUtils.getCidrSubNet(guestIpNetwork, cidrSizeToUse); if (newVlanSubnet.equals(guestSubnet)) { - throw new InvalidParameterValueException("The new IP range you have specified has the same subnet as the guest network in zone: " + zone.getName() + ". Please specify a different gateway/netmask."); + throw new InvalidParameterValueException("The new VLAN you have specified has the same subnet as the guest network in zone: " + zone.getName() + ". Please specify a different gateway/netmask."); } // Check if there are any errors with the IP range @@ -1053,16 +1044,16 @@ public class ConfigurationManagerImpl implements ConfigurationManager { } if (!vlanId.equals(vlan.getVlanId()) && newVlanSubnet.equals(otherVlanSubnet)) { - throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanId() + " in zone " + zone.getName() + " has the same subnet. Please specify a different gateway/netmask."); + throw new InvalidParameterValueException("The VLAN with ID " + vlan.getVlanId() + " in zone " + zone.getName() + " has the same subnet. Please specify a different gateway/netmask."); } if (vlanId.equals(vlan.getVlanId()) && newVlanSubnet.equals(otherVlanSubnet)) { if (NetUtils.ipRangesOverlap(startIP, endIP, otherVlanStartIP, otherVlanEndIP)) { - throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanId() + " already has IPs that overlap with the new range. Please specify a different start IP/end IP."); + throw new InvalidParameterValueException("The VLAN with ID " + vlan.getVlanId() + " already has IPs that overlap with the new range. Please specify a different start IP/end IP."); } if (!vlanGateway.equals(otherVlanGateway)) { - throw new InvalidParameterValueException("The IP range with tag: " + vlan.getVlanId() + " has already been added with gateway " + otherVlanGateway + ". Please specify a different tag."); + throw new InvalidParameterValueException("The VLAN with ID " + vlan.getVlanId() + " has already been added with gateway " + otherVlanGateway + ". Please specify a different VLAN ID."); } } } @@ -1103,7 +1094,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { _podVlanMapDao.persist(podVlanMapVO); } - String eventMsg = "Successfully created new IP range (tag = " + vlanId + ", gateway = " + vlanGateway + ", netmask = " + vlanNetmask + ", start IP = " + startIP; + String eventMsg = "Successfully created new VLAN (tag = " + vlanId + ", gateway = " + vlanGateway + ", netmask = " + vlanNetmask + ", start IP = " + startIP; if (endIP != null) { eventMsg += ", end IP = " + endIP; } @@ -1120,17 +1111,17 @@ public class ConfigurationManagerImpl implements ConfigurationManager { public boolean deleteVlanAndPublicIpRange(long userId, long vlanDbId) throws InvalidParameterValueException { VlanVO vlan = _vlanDao.findById(vlanDbId); if (vlan == null) { - throw new InvalidParameterValueException("Please specify a valid IP range id."); + throw new InvalidParameterValueException("Please specify a valid VLAN id."); } // Check if the VLAN has any allocated public IPs if (_publicIpAddressDao.countIPs(vlan.getDataCenterId(), vlanDbId, true) > 0) { - throw new InvalidParameterValueException("The IP range can't be deleted because it has allocated public IP addresses."); + throw new InvalidParameterValueException("The VLAN can't be deleted because it has allocated public IP addresses."); } // Check if the VLAN is being used by any domain router if (_domrDao.listByVlanDbId(vlanDbId).size() > 0) { - throw new InvalidParameterValueException("The IP range can't be deleted because it is being used by a domain router."); + throw new InvalidParameterValueException("The VLAN can't be deleted because it is being used by a domain router."); } Long accountId = null; @@ -1158,7 +1149,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { String[] ipRange = vlan.getIpRange().split("\\-"); String startIP = ipRange[0]; String endIP = (ipRange.length > 1) ? ipRange[1] : null; - String eventMsg = "Successfully deleted IP range (tag = " + vlan.getVlanId() + ", gateway = " + vlan.getVlanGateway() + ", netmask = " + vlan.getVlanNetmask() + ", start IP = " + startIP; + String eventMsg = "Successfully deleted VLAN (tag = " + vlan.getVlanId() + ", gateway = " + vlan.getVlanGateway() + ", netmask = " + vlan.getVlanNetmask() + ", start IP = " + startIP; if (endIP != null) { eventMsg += ", end IP = " + endIP; } @@ -1415,19 +1406,19 @@ public class ConfigurationManagerImpl implements ConfigurationManager { // Check that the IPs that are being added are compatible with the VLAN's gateway and netmask if (vlanNetmask == null) { - throw new InvalidParameterValueException("Please ensure that your IP range's netmask is specified"); + throw new InvalidParameterValueException("Please ensure that your VLAN's netmask is specified"); } if (endIP != null && !NetUtils.sameSubnet(startIP, endIP, vlanNetmask)) { - throw new InvalidParameterValueException("Please ensure that your start IP and end IP are in the same subnet, as per the IP range's netmask."); + throw new InvalidParameterValueException("Please ensure that your start IP and end IP are in the same subnet, as per the VLAN's netmask."); } if (!NetUtils.sameSubnet(startIP, vlanGateway, vlanNetmask)) { - throw new InvalidParameterValueException("Please ensure that your start IP is in the same subnet as your IP range's gateway, as per the IP range's netmask."); + throw new InvalidParameterValueException("Please ensure that your start IP is in the same subnet as your VLAN's gateway, as per the VLAN's netmask."); } if (endIP != null && !NetUtils.sameSubnet(endIP, vlanGateway, vlanNetmask)) { - throw new InvalidParameterValueException("Please ensure that your end IP is in the same subnet as your IP range's gateway, as per the IP range's netmask."); + throw new InvalidParameterValueException("Please ensure that your end IP is in the same subnet as your VLAN's gateway, as per the VLAN's netmask."); } } @@ -1600,8 +1591,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { logParams += ", "; } - String[] valList = param.split("\\="); - String val = (valList.length < 2) ? "null" : valList[1]; + String val = param.split("\\=")[1]; if (val.equals("null")) { continue; } @@ -1637,22 +1627,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager { if (ipRanges == null) throw new InvalidParameterValueException("The linkLocalIp.nums: " + nums + "may be wrong, should be 1~16"); return ipRanges; - } + } - @Override - public boolean addConfig(String instance, String component,String category, String name, String value, String description) - { - try - { - ConfigurationVO entity = new ConfigurationVO(category, instance, component, name, value, description); - _configDao.persist(entity); - s_logger.info("Successfully added configuration value into db: category:"+category+" instance:"+instance+" component:"+component+" name:"+name+" value:"+value); - return true; - } - catch(Exception ex) - { - s_logger.error("Unable to add the new config entry:",ex); - return false; - } - } } diff --git a/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java b/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java index db02ce8b4da..777265c02c2 100644 --- a/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java +++ b/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java @@ -18,13 +18,13 @@ package com.cloud.consoleproxy; -import java.util.Map; - -import javax.ejb.Local; -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; - +import java.util.Map; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + import com.cloud.agent.AgentManager; import com.cloud.agent.api.AgentControlAnswer; import com.cloud.agent.api.Command; @@ -35,7 +35,9 @@ import com.cloud.agent.api.GetVncPortAnswer; import com.cloud.agent.api.GetVncPortCommand; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StopCommand; +import com.cloud.agent.api.proxy.ConsoleProxyLoadAnswer; import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.consoleproxy.ConsoleProxyManager; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; @@ -48,6 +50,7 @@ import com.cloud.host.dao.HostDao; import com.cloud.utils.NumbersUtil; import com.cloud.utils.component.ComponentLocator; import com.cloud.vm.ConsoleProxyVO; +import com.cloud.vm.State; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachineManager; @@ -158,9 +161,8 @@ public class AgentBasedConsoleProxyManager implements ConsoleProxyManager, Virtu " does not have public interface, we will return its private IP for cosole proxy."); publicIp = host.getPrivateIpAddress(); } - - // FIXME: Removed State.Running does this affect the console proxy? - return new ConsoleProxyVO(1l, "EmbeddedProxy", null, null, null, + + return new ConsoleProxyVO(1l, "EmbeddedProxy", State.Running, null, null, null, "02:02:02:02:02:02", host.getPrivateIpAddress(), "255.255.255.0", diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index c0bb446a6e3..1cb292ad4ee 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -64,7 +64,6 @@ import com.cloud.async.BaseAsyncJobExecutor; import com.cloud.capacity.dao.CapacityDao; import com.cloud.cluster.ClusterManager; import com.cloud.configuration.Config; -import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; @@ -97,11 +96,11 @@ import com.cloud.info.RunningHostInfoAgregator; import com.cloud.info.RunningHostInfoAgregator.ZoneHostInfo; import com.cloud.maid.StackMaid; import com.cloud.network.IpAddrAllocator; -import com.cloud.network.NetworkManager; import com.cloud.network.IpAddrAllocator.networkInfo; +import com.cloud.network.NetworkManager; import com.cloud.network.dao.IPAddressDao; -import com.cloud.offering.ServiceOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePoolVO; @@ -199,8 +198,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, private HostPodDao _podDao; private HostDao _hostDao; private StoragePoolDao _storagePoolDao; - private ConfigurationDao _configDao; - + private VMInstanceDao _instanceDao; private AccountDao _accountDao; @@ -338,7 +336,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, // if it is a new assignment or a changed assignment, update the // record - if (vm.getProxyId() == null || vm.getProxyId().longValue() != proxy.getId()) + if (vm.getProxyId() == null || vm.getProxyId().longValue() != proxy.getId().longValue()) _instanceDao.updateProxyId(vmId, proxy.getId(), DateUtil.currentGMTTime()); proxy.setSslEnabled(_sslEnabled); @@ -369,7 +367,10 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, if (vm != null && vm.getState() != State.Running) { if (s_logger.isInfoEnabled()) - s_logger.info("Detected that vm : " + vmId + " is not currently at running state, we will fail the proxy assignment for it"); + s_logger + .info("Detected that vm : " + + vmId + + " is not currently at running state, we will fail the proxy assignment for it"); return null; } @@ -379,16 +380,27 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, if (proxy != null) { if (!isInAssignableState(proxy)) { if (s_logger.isInfoEnabled()) - s_logger.info("A previous assigned proxy is not assignable now, reassign console proxy for user vm : " + vmId); + s_logger + .info("A previous assigned proxy is not assignable now, reassign console proxy for user vm : " + + vmId); proxy = null; } else { + // Use proxy actual load info to determine allocation + // instead of static load (assigned running VMs) + // Proxy load info will be reported to management server at + // 5-second interval, the load info used here + // may be temporarily out of sync with its actual load info if (_consoleProxyDao.getProxyActiveLoad(proxy.getId()) < _capacityPerProxy || hasPreviousSession(proxy, vm)) { if (s_logger.isTraceEnabled()) - s_logger.trace("Assign previous allocated console proxy for user vm : " + vmId); + s_logger + .trace("Assign previous allocated console proxy for user vm : " + + vmId); if (proxy.getActiveSession() >= _capacityPerProxy) - s_logger.warn("Assign overloaded proxy to user VM as previous session exists, user vm : " + vmId); + s_logger + .warn("Assign overloaded proxy to user VM as previous session exists, user vm : " + + vmId); } else { proxy = null; } @@ -401,18 +413,25 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, if (proxy == null) { if (s_logger.isInfoEnabled()) - s_logger.info("No running console proxy is available, check to see if we can bring up a stopped one for data center : " + dataCenterId); + s_logger + .info("No running console proxy is available, check to see if we can bring up a stopped one for data center : " + + dataCenterId); proxy = assignProxyFromStoppedPool(dataCenterId); if (proxy == null) { if (s_logger.isInfoEnabled()) - s_logger.info("No stopped console proxy is available, need to allocate a new console proxy for data center : " + dataCenterId); + s_logger + .info("No stopped console proxy is available, need to allocate a new console proxy for data center : " + + dataCenterId); proxy = startNew(dataCenterId); } else { if (s_logger.isInfoEnabled()) - s_logger.info("Found a stopped console proxy, bring it up to running pool. proxy vm id : " - + proxy.getId() + ", data center : " + dataCenterId); + s_logger + .info("Found a stopped console proxy, bring it up to running pool. proxy vm id : " + + proxy.getId() + + ", data center : " + + dataCenterId); proxyFromStoppedPool[0] = new Boolean(true); } @@ -445,7 +464,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProxyStatus.class); } catch (Throwable e) { s_logger.warn("Unable to parse proxy session details : " - + proxy.getSessionDetails()); + + proxy.getSessionDetails()); } if (status != null && status.getConnections() != null) { @@ -461,7 +480,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, + connections[i].tag, e); } } - if (taggedVmId == vm.getId()) + if (taggedVmId == vm.getId().longValue()) return true; } @@ -470,7 +489,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, // received load-update yet // wait until session time // - if (DateUtil.currentGMTTime().getTime() - vm.getProxyAssignTime().getTime() < _proxySessionTimeoutValue) + if (DateUtil.currentGMTTime().getTime() + - vm.getProxyAssignTime().getTime() < _proxySessionTimeoutValue) return true; return false; @@ -605,12 +625,15 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, String guestIpAddress = _dcDao.allocateLinkLocalPrivateIpAddress(proxy.getDataCenterId(), routingHost.getPodId(), proxy.getId()); proxy.setGuestIpAddress(guestIpAddress); - _consoleProxyDao.updateIf(proxy, Event.OperationRetry, routingHost.getId()); + _consoleProxyDao.updateIf(proxy, Event.OperationRetry, + routingHost.getId()); proxy = _consoleProxyDao.findById(proxy.getId()); - List vols = _storageMgr.prepare(proxy, routingHost); + List vols = _storageMgr.prepare(proxy, + routingHost); if (vols == null) { - s_logger.debug("Unable to prepare storage for " + routingHost); + s_logger.debug("Unable to prepare storage for " + + routingHost); avoid.add(routingHost); continue; } @@ -637,7 +660,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, if (answer != null && answer.getResult()) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Console proxy " + proxy.getName() + " started on " + routingHost.getName()); + s_logger.debug("Console proxy " + proxy.getName() + " started on " + + routingHost.getName()); } if (answer instanceof StartConsoleProxyAnswer) { @@ -663,7 +687,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, s_logger.debug("Unable to start " + proxy.toString() + " on host " + routingHost.toString() + " due to " + answer.getDetails()); } catch (OperationTimedoutException e) { if (e.isActive()) { - s_logger.debug("Unable to start vm " + proxy.getName() + " due to operation timed out and it is active so scheduling a restart."); + s_logger.debug("Unable to start vm " + proxy.getName() + + " due to operation timed out and it is active so scheduling a restart."); _haMgr.scheduleRestart(proxy, true); return null; } @@ -709,7 +734,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, // If starting the console proxy failed due to the external // firewall not being reachable, send an alert. - if (answer != null && answer.getDetails() != null && answer.getDetails().equals("firewall")) { + if (answer != null && answer.getDetails() != null + && answer.getDetails().equals("firewall")) { SubscriptionMgr.getInstance().notifySubscribers( ConsoleProxyManager.ALERT_SUBJECT, @@ -761,7 +787,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, proxy.setPrivateIpAddress(null); freePrivateIpAddress(privateIpAddress, proxy.getDataCenterId(), proxy.getId()); } - + proxy.setStorageIp(null); _consoleProxyDao.updateIf(proxy, Event.OperationFailed, null); txn.commit(); } catch (Exception e) { @@ -788,11 +814,14 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, public ConsoleProxyVO assignProxyFromRunningPool(long dataCenterId) { if (s_logger.isTraceEnabled()) - s_logger.trace("Assign console proxy from running pool for request from data center : " + dataCenterId); + s_logger + .trace("Assign console proxy from running pool for request from data center : " + + dataCenterId); ConsoleProxyAllocator allocator = getCurrentAllocator(); assert (allocator != null); - List runningList = _consoleProxyDao.getProxyListInStates(dataCenterId, State.Running); + List runningList = _consoleProxyDao + .getProxyListInStates(dataCenterId, State.Running); if (runningList != null && runningList.size() > 0) { if (s_logger.isTraceEnabled()) { s_logger.trace("Running proxy pool size : " @@ -809,15 +838,21 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, loadInfo.put(p.first(), p.second()); if (s_logger.isTraceEnabled()) { - s_logger.trace("Running proxy instance allocation load { proxy id : " - + p.first() + ", load : " + p.second() + "}"); + s_logger + .trace("Running proxy instance allocation load { proxy id : " + + p.first() + + ", load : " + + p.second() + + "}"); } } } return allocator.allocProxy(runningList, loadInfo, dataCenterId); } else { if (s_logger.isTraceEnabled()) - s_logger.trace("Empty running proxy pool for now in data center : " + dataCenterId); + s_logger + .trace("Empty running proxy pool for now in data center : " + + dataCenterId); } return null; } @@ -835,14 +870,18 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, public ConsoleProxyVO startNew(long dataCenterId) { if (s_logger.isDebugEnabled()) - s_logger.debug("Assign console proxy from a newly started instance for request from data center : " + dataCenterId); + s_logger + .debug("Assign console proxy from a newly started instance for request from data center : " + + dataCenterId); Map context = createProxyInstance(dataCenterId); long proxyVmId = (Long) context.get("proxyVmId"); if (proxyVmId == 0) { if (s_logger.isTraceEnabled()) - s_logger.trace("Creating proxy instance failed, data center id : " + dataCenterId); + s_logger + .trace("Creating proxy instance failed, data center id : " + + dataCenterId); // release critical system resource on failure if (context.get("publicIpAddress") != null) @@ -862,7 +901,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, return proxy; } else { if (s_logger.isDebugEnabled()) - s_logger.debug("Unable to allocate console proxy storage, remove the console proxy record from DB, proxy id: " + proxyVmId); + s_logger + .debug("Unable to allocate console proxy storage, remove the console proxy record from DB, proxy id: " + + proxyVmId); SubscriptionMgr.getInstance().notifySubscribers( ConsoleProxyManager.ALERT_SUBJECT, @@ -944,7 +985,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, txn.start(); ConsoleProxyVO proxy; String name = VirtualMachineName.getConsoleProxyName(id, _instance).intern(); - proxy = new ConsoleProxyVO(id, name, guestMacAddress, null, NetUtils.getLinkLocalNetMask(), + proxy = new ConsoleProxyVO(id, name, State.Creating, guestMacAddress, null, NetUtils.getLinkLocalNetMask(), privateMacAddress, null, cidrNetmask, _template.getId(), _template.getGuestOSId(), publicMacAddress, publicIpAddress, vlanNetmask, publicIpAndVlan._vlanDbId, publicIpAndVlan._vlanid, pod.first().getId(), dataCenterId, @@ -982,10 +1023,12 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, DataCenterVO dc = _dcDao.findById(dataCenterId); HostPodVO pod = _podDao.findById(proxy.getPodId()); - final AccountVO account = _accountDao.findById(Account.ACCOUNT_ID_SYSTEM); + final AccountVO account = _accountDao + .findById(Account.ACCOUNT_ID_SYSTEM); try { - List vols = _storageMgr.create(account, proxy, _template, dc, pod, _serviceOffering, null); + List vols = _storageMgr.create(account, proxy, _template, + dc, pod, _serviceOffering, null); if (vols == null) { s_logger.error("Unable to alloc storage for console proxy"); return null; @@ -1025,10 +1068,16 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VlanType.VirtualNetwork, true); if (ipAndVlan == null) { - s_logger.debug("Unable to get public ip address (type=Virtual) for console proxy vm for data center : " + dcId); - ipAndVlan = _vlanDao.assignPodDirectAttachIpAddress(dcId, podId, Account.ACCOUNT_ID_SYSTEM, DomainVO.ROOT_DOMAIN); + s_logger + .debug("Unable to get public ip address (type=Virtual) for console proxy vm for data center : " + + dcId); + ipAndVlan = _vlanDao.assignPodDirectAttachIpAddress(dcId, podId, + Account.ACCOUNT_ID_SYSTEM, DomainVO.ROOT_DOMAIN); if (ipAndVlan == null) - s_logger.debug("Unable to get public ip address (type=DirectAttach) for console proxy vm for data center : " + dcId); + s_logger + .debug("Unable to get public ip address (type=DirectAttach) for console proxy vm for data center : " + + dcId); + } if (ipAndVlan != null) { VlanVO vlan = ipAndVlan.second(); @@ -1042,7 +1091,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, if (_IpAllocator != null && _IpAllocator.exteralIpAddressAllocatorEnabled()) { return _IpAllocator.getPrivateIpAddress(macAddr, dcId, podId).ipaddr; } else { - return _dcDao.allocatePrivateIpAddress(dcId, podId, proxyId); + return _dcDao.allocatePrivateIpAddress(dcId, podId, proxyId); } } @@ -1063,8 +1112,10 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, } private ConsoleProxyAllocator getCurrentAllocator() { + // for now, only one adapter is supported - Enumeration it = _consoleProxyAllocators.enumeration(); + Enumeration it = _consoleProxyAllocators + .enumeration(); if (it.hasMoreElements()) return it.nextElement(); @@ -1117,10 +1168,14 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, GsonBuilder gb = new GsonBuilder(); gb.setVersion(1.3); Gson gson = gb.create(); - status = gson.fromJson(answer.getDetails(), ConsoleProxyStatus.class); + status = gson.fromJson(answer.getDetails(), + ConsoleProxyStatus.class); } catch (Throwable e) { - s_logger.warn("Unable to parse load info from proxy, proxy vm id : " - + answer.getProxyVmId() + ", info : " + answer.getDetails()); + s_logger + .warn("Unable to parse load info from proxy, proxy vm id : " + + answer.getProxyVmId() + + ", info : " + + answer.getDetails()); } if (status != null) { @@ -1130,13 +1185,17 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, byte[] details = null; if (answer.getDetails() != null) - details = answer.getDetails().getBytes(Charset.forName("US-ASCII")); - _consoleProxyDao.update(answer.getProxyVmId(), count, DateUtil.currentGMTTime(), details); + details = answer.getDetails().getBytes( + Charset.forName("US-ASCII")); + _consoleProxyDao.update(answer.getProxyVmId(), count, DateUtil + .currentGMTTime(), details); } else { if (s_logger.isTraceEnabled()) - s_logger.trace("Unable to get console proxy load info, id : " + answer.getProxyVmId()); + s_logger.trace("Unable to get console proxy load info, id : " + + answer.getProxyVmId()); - _consoleProxyDao.update(answer.getProxyVmId(), 0, DateUtil.currentGMTTime(), null); + _consoleProxyDao.update(answer.getProxyVmId(), 0, DateUtil + .currentGMTTime(), null); // TODO : something is wrong with the VM, restart it? } } @@ -1152,8 +1211,11 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, Gson gson = gb.create(); status = gson.fromJson(cmd.getLoadInfo(), ConsoleProxyStatus.class); } catch (Throwable e) { - s_logger.warn("Unable to parse load info from proxy, proxy vm id : " - + cmd.getProxyVmId() + ", info : " + cmd.getLoadInfo()); + s_logger + .warn("Unable to parse load info from proxy, proxy vm id : " + + cmd.getProxyVmId() + + ", info : " + + cmd.getLoadInfo()); } if (status != null) { @@ -1163,13 +1225,17 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, byte[] details = null; if (cmd.getLoadInfo() != null) - details = cmd.getLoadInfo().getBytes(Charset.forName("US-ASCII")); - _consoleProxyDao.update(cmd.getProxyVmId(), count, DateUtil.currentGMTTime(), details); + details = cmd.getLoadInfo().getBytes( + Charset.forName("US-ASCII")); + _consoleProxyDao.update(cmd.getProxyVmId(), count, DateUtil + .currentGMTTime(), details); } else { if (s_logger.isTraceEnabled()) - s_logger.trace("Unable to get console proxy load info, id : " + cmd.getProxyVmId()); + s_logger.trace("Unable to get console proxy load info, id : " + + cmd.getProxyVmId()); - _consoleProxyDao.update(cmd.getProxyVmId(), 0, DateUtil.currentGMTTime(), null); + _consoleProxyDao.update(cmd.getProxyVmId(), 0, DateUtil + .currentGMTTime(), null); } } @@ -1179,14 +1245,16 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, if (cmd.getVmId() != null && cmd.getVmId().isEmpty()) { if (s_logger.isTraceEnabled()) - s_logger.trace("Invalid vm id sent from proxy(happens when proxy session has terminated)"); + s_logger + .trace("Invalid vm id sent from proxy(happens when proxy session has terminated)"); return new ConsoleAccessAuthenticationAnswer(cmd, false); } try { vmId = Long.parseLong(cmd.getVmId()); } catch (NumberFormatException e) { - s_logger.error("Invalid vm id " + cmd.getVmId() + " sent from console access authentication", e); + s_logger.error("Invalid vm id " + cmd.getVmId() + + " sent from console access authentication", e); return new ConsoleAccessAuthenticationAnswer(cmd, false); } @@ -1200,19 +1268,22 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, } if (vm.getHostId() == null) { - s_logger.warn("VM " + vmId + " lost host info, failed authentication request"); + s_logger.warn("VM " + vmId + + " lost host info, failed authentication request"); return new ConsoleAccessAuthenticationAnswer(cmd, false); } HostVO host = _hostDao.findById(vm.getHostId()); if (host == null) { - s_logger.warn("VM " + vmId + "'s host does not exist, fail authentication request"); + s_logger.warn("VM " + vmId + + "'s host does not exist, fail authentication request"); return new ConsoleAccessAuthenticationAnswer(cmd, false); } String sid = cmd.getSid(); if (sid == null || !sid.equals(vm.getVncPassword())) { - s_logger.warn("sid " + sid + " in url does not match stored sid " + vm.getVncPassword()); + s_logger.warn("sid " + sid + " in url does not match stored sid " + + vm.getVncPassword()); return new ConsoleAccessAuthenticationAnswer(cmd, false); } @@ -1239,9 +1310,10 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, // // for now, just log a message if (s_logger.isInfoEnabled()) - s_logger.info("Console proxy agent is connected. proxy: " + host.getName()); + s_logger.info("Console proxy agent is connected. proxy: " + + host.getName()); - /* update public/private ip address */ + /*update public/private ip address*/ if (_IpAllocator != null && _IpAllocator.exteralIpAddressAllocatorEnabled()) { try { ConsoleProxyVO console = findConsoleProxyByHost(host); @@ -1255,6 +1327,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, console.setPublicNetmask(cmd.getPublicNetmask()); _consoleProxyDao.persist(console); } catch (NumberFormatException e) { + } } } @@ -1262,7 +1335,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, @Override public void onAgentDisconnect(long agentId, com.cloud.host.Status state) { - if (state == com.cloud.host.Status.Alert || state == com.cloud.host.Status.Disconnected) { + if (state == com.cloud.host.Status.Alert + || state == com.cloud.host.Status.Disconnected) { // be it either in alert or in disconnected state, the agent process // may be gone in the VM, // we will be reacting to stop the corresponding VM and let the scan @@ -1271,18 +1345,21 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, if (host.getType() == Type.ConsoleProxy) { String name = host.getName(); if (s_logger.isInfoEnabled()) - s_logger.info("Console proxy agent disconnected, proxy: " + name); + s_logger.info("Console proxy agent disconnected, proxy: " + + name); if (name != null && name.startsWith("v-")) { String[] tokens = name.split("-"); long proxyVmId = 0; try { proxyVmId = Long.parseLong(tokens[1]); } catch (NumberFormatException e) { - s_logger.error("Unexpected exception " + e.getMessage(), e); + s_logger.error( + "Unexpected exception " + e.getMessage(), e); return; } - final ConsoleProxyVO proxy = this._consoleProxyDao.findById(proxyVmId); + final ConsoleProxyVO proxy = this._consoleProxyDao + .findById(proxyVmId); if (proxy != null) { Long hostId = proxy.getHostId(); @@ -1304,7 +1381,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, */ } else { if (s_logger.isInfoEnabled()) - s_logger.info("Console proxy agent disconnected but corresponding console proxy VM no longer exists in DB, proxy: " + name); + s_logger + .info("Console proxy agent disconnected but corresponding console proxy VM no longer exists in DB, proxy: " + + name); } } else { assert (false) : "Invalid console proxy name: " + name; @@ -1315,32 +1394,44 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, private void checkPendingProxyVMs() { // drive state to change away from transient states - List l = _consoleProxyDao.getProxyListInStates(State.Creating); + List l = _consoleProxyDao + .getProxyListInStates(State.Creating); if (l != null && l.size() > 0) { for (ConsoleProxyVO proxy : l) { if (proxy.getLastUpdateTime() == null - || (proxy.getLastUpdateTime() != null && System.currentTimeMillis() - proxy.getLastUpdateTime().getTime() > 60000)) { + || (proxy.getLastUpdateTime() != null && System + .currentTimeMillis() + - proxy.getLastUpdateTime().getTime() > 60000)) { try { ConsoleProxyVO readyProxy = null; - if (_allocProxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { + if (_allocProxyLock + .lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { try { - readyProxy = allocProxyStorage(proxy.getDataCenterId(), proxy.getId()); + readyProxy = allocProxyStorage(proxy + .getDataCenterId(), proxy.getId()); } finally { _allocProxyLock.unlock(); } if (readyProxy != null) { - GlobalLock proxyLock = GlobalLock.getInternLock(getProxyLockName(readyProxy.getId())); + GlobalLock proxyLock = GlobalLock + .getInternLock(getProxyLockName(readyProxy + .getId())); try { - if (proxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { + if (proxyLock + .lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { try { - readyProxy = start(readyProxy.getId(), 0); + readyProxy = start(readyProxy + .getId(), 0); } finally { proxyLock.unlock(); } } else { if (s_logger.isInfoEnabled()) - s_logger.info("Unable to acquire synchronization lock to start console proxy : " + readyProxy.getName()); + s_logger + .info("Unable to acquire synchronization lock to start console proxy : " + + readyProxy + .getName()); } } finally { proxyLock.releaseRef(); @@ -1348,7 +1439,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, } } else { if (s_logger.isInfoEnabled()) - s_logger.info("Unable to acquire synchronization lock to allocate proxy storage, wait for next turn"); + s_logger + .info("Unable to acquire synchronization lock to allocate proxy storage, wait for next turn"); } } catch (StorageUnavailableException e) { s_logger.warn("Storage unavailable", e); @@ -1383,23 +1475,17 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, if (s_logger.isTraceEnabled()) s_logger.trace("Begin console proxy capacity scan"); - //config var for consoleproxy.restart check - String restart = _configDao.getValue("consoleproxy.restart"); - - if(restart.equalsIgnoreCase("false")) - { - s_logger.debug("Capacity scan disabled purposefully, consoleproxy.restart = false. This happens when the primarystorage is in maintenance mode"); - return; - } - Map zoneHostInfoMap = getZoneHostInfo(); if (isServiceReady(zoneHostInfoMap)) { if (s_logger.isTraceEnabled()) - s_logger.trace("Service is ready, check to see if we need to allocate standby capacity"); + s_logger + .trace("Service is ready, check to see if we need to allocate standby capacity"); - if (!_capacityScanLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) { + if (!_capacityScanLock + .lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) { if (s_logger.isTraceEnabled()) - s_logger.trace("Capacity scan lock is used by others, skip and wait for my turn"); + s_logger + .trace("Capacity scan lock is used by others, skip and wait for my turn"); return; } @@ -1414,11 +1500,13 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, // proxy count info by data-centers (zone-id, zone-name, // count) - List l = _consoleProxyDao.getDatacenterProxyLoadMatrix(); + List l = _consoleProxyDao + .getDatacenterProxyLoadMatrix(); // running VM session count by data-centers (zone-id, // zone-name, count) - List listVmCounts = _consoleProxyDao.getDatacenterSessionLoadMatrix(); + List listVmCounts = _consoleProxyDao + .getDatacenterSessionLoadMatrix(); // indexing load info by data-center id Map mapVmCounts = new HashMap(); @@ -1428,14 +1516,21 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, for (ConsoleProxyLoadInfo info : l) { if (info.getName().equals(_instance)) { - ConsoleProxyLoadInfo vmInfo = mapVmCounts.get(info.getId()); + ConsoleProxyLoadInfo vmInfo = mapVmCounts + .get(info.getId()); - if (!checkCapacity(info, vmInfo != null ? vmInfo : new ConsoleProxyLoadInfo())) { - if (isZoneReady(zoneHostInfoMap, info.getId())) { + if (!checkCapacity(info, + vmInfo != null ? vmInfo + : new ConsoleProxyLoadInfo())) { + if (isZoneReady(zoneHostInfoMap, info + .getId())) { allocCapacity(info.getId()); } else { if (s_logger.isTraceEnabled()) - s_logger.trace("Zone " + info.getId() + " is not ready to alloc standy console proxy"); + s_logger + .trace("Zone " + + info.getId() + + " is not ready to alloc standy console proxy"); } } @@ -1447,14 +1542,21 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, // scan rest of data-centers for (ConsoleProxyLoadInfo info : l) { if (info.getId() != defaultId) { - ConsoleProxyLoadInfo vmInfo = mapVmCounts.get(info.getId()); + ConsoleProxyLoadInfo vmInfo = mapVmCounts + .get(info.getId()); - if (!checkCapacity(info, vmInfo != null ? vmInfo : new ConsoleProxyLoadInfo())) { - if (isZoneReady(zoneHostInfoMap, info.getId())) { + if (!checkCapacity(info, + vmInfo != null ? vmInfo + : new ConsoleProxyLoadInfo())) { + if (isZoneReady(zoneHostInfoMap, info + .getId())) { allocCapacity(info.getId()); } else { if (s_logger.isTraceEnabled()) - s_logger.trace("Zone " + info.getId() + " is not ready to alloc standy console proxy"); + s_logger + .trace("Zone " + + info.getId() + + " is not ready to alloc standy console proxy"); } } } @@ -1468,7 +1570,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, } else { if (s_logger.isTraceEnabled()) - s_logger.trace("Service is not ready for capacity preallocation, wait for next time"); + s_logger + .trace("Service is not ready for capacity preallocation, wait for next time"); } if (s_logger.isTraceEnabled()) @@ -1489,13 +1592,16 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, private void allocCapacity(long dataCenterId) { if (s_logger.isTraceEnabled()) - s_logger.trace("Allocate console proxy standby capacity for data center : " + dataCenterId); + s_logger + .trace("Allocate console proxy standby capacity for data center : " + + dataCenterId); boolean proxyFromStoppedPool = false; ConsoleProxyVO proxy = assignProxyFromStoppedPool(dataCenterId); if (proxy == null) { if (s_logger.isInfoEnabled()) - s_logger.info("No stopped console proxy is available, need to allocate a new console proxy"); + s_logger + .info("No stopped console proxy is available, need to allocate a new console proxy"); if (_allocProxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { try { @@ -1505,18 +1611,22 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, } } else { if (s_logger.isInfoEnabled()) - s_logger.info("Unable to acquire synchronization lock to allocate proxy resource for standby capacity, wait for next scan"); + s_logger + .info("Unable to acquire synchronization lock to allocate proxy resource for standby capacity, wait for next scan"); return; } } else { if (s_logger.isInfoEnabled()) - s_logger.info("Found a stopped console proxy, bring it up to running pool. proxy vm id : " + proxy.getId()); + s_logger + .info("Found a stopped console proxy, bring it up to running pool. proxy vm id : " + + proxy.getId()); proxyFromStoppedPool = true; } if (proxy != null) { long proxyVmId = proxy.getId(); - GlobalLock proxyLock = GlobalLock.getInternLock(getProxyLockName(proxyVmId)); + GlobalLock proxyLock = GlobalLock + .getInternLock(getProxyLockName(proxyVmId)); try { if (proxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { try { @@ -1526,7 +1636,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, } } else { if (s_logger.isInfoEnabled()) - s_logger.info("Unable to acquire synchronization lock to start proxy for standby capacity, proxy vm id : " + proxy.getId()); + s_logger + .info("Unable to acquire synchronization lock to start proxy for standby capacity, proxy vm id : " + + proxy.getId()); return; } } finally { @@ -1535,14 +1647,17 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, if (proxy == null) { if (s_logger.isInfoEnabled()) - s_logger.info("Unable to start console proxy for standby capacity, proxy vm Id : " - + proxyVmId + ", will recycle it and start a new one"); + s_logger + .info("Unable to start console proxy for standby capacity, proxy vm Id : " + + proxyVmId + + ", will recycle it and start a new one"); if (proxyFromStoppedPool) destroyProxy(proxyVmId, 0); } else { if (s_logger.isInfoEnabled()) - s_logger.info("Console proxy " + proxy.getName() + " is started"); + s_logger.info("Console proxy " + proxy.getName() + + " is started"); } } } @@ -1551,7 +1666,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, for (ZoneHostInfo zoneHostInfo : zoneHostInfoMap.values()) { if (isZoneHostReady(zoneHostInfo)) { if (s_logger.isInfoEnabled()) - s_logger.info("Zone " + zoneHostInfo.getDcId() + " is ready to launch"); + s_logger.info("Zone " + zoneHostInfo.getDcId() + + " is ready to launch"); return true; } } @@ -1564,25 +1680,34 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ZoneHostInfo zoneHostInfo = zoneHostInfoMap.get(dataCenterId); if (zoneHostInfo != null && isZoneHostReady(zoneHostInfo)) { VMTemplateVO template = _templateDao.findConsoleProxyTemplate(); - HostVO secondaryStorageHost = _storageMgr.getSecondaryStorageHost(dataCenterId); + HostVO secondaryStorageHost = _storageMgr + .getSecondaryStorageHost(dataCenterId); boolean templateReady = false; if (template != null && secondaryStorageHost != null) { - VMTemplateHostVO templateHostRef = _vmTemplateHostDao.findByHostTemplate(secondaryStorageHost.getId(), template.getId()); - templateReady = (templateHostRef != null) && (templateHostRef.getDownloadState() == Status.DOWNLOADED); + VMTemplateHostVO templateHostRef = _vmTemplateHostDao + .findByHostTemplate(secondaryStorageHost.getId(), + template.getId()); + templateReady = (templateHostRef != null) + && (templateHostRef.getDownloadState() == Status.DOWNLOADED); } if (templateReady) { - List> l = _consoleProxyDao.getDatacenterStoragePoolHostInfo(dataCenterId, _use_lvm); - if (l != null && l.size() > 0 && l.get(0).second().intValue() > 0) { + List> l = _consoleProxyDao + .getDatacenterStoragePoolHostInfo(dataCenterId, + _use_lvm); + if (l != null && l.size() > 0 + && l.get(0).second().intValue() > 0) { return true; } else { if (s_logger.isTraceEnabled()) - s_logger.trace("Primary storage is not ready, wait until it is ready to launch console proxy"); + s_logger + .trace("Primary storage is not ready, wait until it is ready to launch console proxy"); } } else { if (s_logger.isTraceEnabled()) - s_logger.trace("Zone host is ready, but console proxy template is not ready"); + s_logger + .trace("Zone host is ready, but console proxy template is not ready"); } } return false; @@ -1591,7 +1716,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, private boolean isZoneHostReady(ZoneHostInfo zoneHostInfo) { int expectedFlags = 0; if (_use_storage_vm) - expectedFlags = RunningHostInfoAgregator.ZoneHostInfo.ROUTING_HOST_MASK; + expectedFlags = RunningHostInfoAgregator.ZoneHostInfo.COMPUTING_HOST_MASK + | RunningHostInfoAgregator.ZoneHostInfo.ROUTING_HOST_MASK; else expectedFlags = RunningHostInfoAgregator.ZoneHostInfo.ALL_HOST_MASK; @@ -1600,7 +1726,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, private synchronized Map getZoneHostInfo() { Date cutTime = DateUtil.currentGMTTime(); - List l = _hostDao.getRunningHostCounts(new Date(cutTime.getTime() - ClusterManager.DEFAULT_HEARTBEAT_THRESHOLD)); + List l = _hostDao + .getRunningHostCounts(new Date(cutTime.getTime() + - ClusterManager.DEFAULT_HEARTBEAT_THRESHOLD)); RunningHostInfoAgregator aggregator = new RunningHostInfoAgregator(); if (l.size() > 0) @@ -1673,19 +1801,27 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, _sslEnabled = true; value = configs.get("consoleproxy.capacityscan.interval"); - _capacityScanInterval = NumbersUtil.parseLong(value, DEFAULT_CAPACITY_SCAN_INTERVAL); + _capacityScanInterval = NumbersUtil.parseLong(value, + DEFAULT_CAPACITY_SCAN_INTERVAL); - _capacityPerProxy = NumbersUtil.parseInt(configs.get("consoleproxy.session.max"), DEFAULT_PROXY_CAPACITY); - _standbyCapacity = NumbersUtil.parseInt(configs.get("consoleproxy.capacity.standby"), DEFAULT_STANDBY_CAPACITY); - _proxySessionTimeoutValue = NumbersUtil.parseInt(configs.get("consoleproxy.session.timeout"), DEFAULT_PROXY_SESSION_TIMEOUT); + _capacityPerProxy = NumbersUtil.parseInt(configs + .get("consoleproxy.session.max"), DEFAULT_PROXY_CAPACITY); + _standbyCapacity = NumbersUtil + .parseInt(configs.get("consoleproxy.capacity.standby"), + DEFAULT_STANDBY_CAPACITY); + _proxySessionTimeoutValue = NumbersUtil.parseInt(configs + .get("consoleproxy.session.timeout"), + DEFAULT_PROXY_SESSION_TIMEOUT); value = configs.get("consoleproxy.port"); if (value != null) - _consoleProxyPort = NumbersUtil.parseInt(value, ConsoleProxyManager.DEFAULT_PROXY_VNC_PORT); + _consoleProxyPort = NumbersUtil.parseInt(value, + ConsoleProxyManager.DEFAULT_PROXY_VNC_PORT); value = configs.get("consoleproxy.url.port"); if (value != null) - _consoleProxyUrlPort = NumbersUtil.parseInt(value, ConsoleProxyManager.DEFAULT_PROXY_URL_PORT); + _consoleProxyUrlPort = NumbersUtil.parseInt(value, + ConsoleProxyManager.DEFAULT_PROXY_URL_PORT); value = configs.get("system.vm.use.local.storage"); if (value != null && value.equalsIgnoreCase("true")) @@ -1696,8 +1832,10 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, _use_storage_vm = true; if (s_logger.isInfoEnabled()) { - s_logger.info("Console proxy max session soft limit : " + _capacityPerProxy); - s_logger.info("Console proxy standby capacity : " + _standbyCapacity); + s_logger.info("Console proxy max session soft limit : " + + _capacityPerProxy); + s_logger.info("Console proxy standby capacity : " + + _standbyCapacity); } _domain = configs.get("domain"); @@ -1716,10 +1854,12 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, value = (String) params.get("ssh.retry"); _ssh_retry = NumbersUtil.parseInt(value, 3); - Map agentMgrConfigs = configDao.getConfiguration("AgentManager", params); + Map agentMgrConfigs = configDao.getConfiguration( + "AgentManager", params); _mgmt_host = agentMgrConfigs.get("host"); if (_mgmt_host == null) { - s_logger.warn("Critical warning! Please configure your management server host address right after you have started your management server and then restart it, otherwise you won't be able to do console access"); + s_logger + .warn("Critical warning! Please configure your management server host address right after you have started your management server and then restart it, otherwise you won't be able to do console access"); } value = agentMgrConfigs.get("port"); @@ -1727,96 +1867,109 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, _consoleProxyDao = locator.getDao(ConsoleProxyDao.class); if (_consoleProxyDao == null) { - throw new ConfigurationException("Unable to get " + ConsoleProxyDao.class.getName()); + throw new ConfigurationException("Unable to get " + + ConsoleProxyDao.class.getName()); } - _consoleProxyAllocators = locator.getAdapters(ConsoleProxyAllocator.class); + _consoleProxyAllocators = locator + .getAdapters(ConsoleProxyAllocator.class); if (_consoleProxyAllocators == null || !_consoleProxyAllocators.isSet()) { throw new ConfigurationException("Unable to get proxy allocators"); } _dcDao = locator.getDao(DataCenterDao.class); if (_dcDao == null) { - throw new ConfigurationException("Unable to get " + DataCenterDao.class.getName()); + throw new ConfigurationException("Unable to get " + + DataCenterDao.class.getName()); } _templateDao = locator.getDao(VMTemplateDao.class); if (_templateDao == null) { - throw new ConfigurationException("Unable to get " + VMTemplateDao.class.getName()); + throw new ConfigurationException("Unable to get " + + VMTemplateDao.class.getName()); } _ipAddressDao = locator.getDao(IPAddressDao.class); if (_ipAddressDao == null) { - throw new ConfigurationException("Unable to get " + IPAddressDao.class.getName()); + throw new ConfigurationException("Unable to get " + + IPAddressDao.class.getName()); } _volsDao = locator.getDao(VolumeDao.class); if (_volsDao == null) { - throw new ConfigurationException("Unable to get " + VolumeDao.class.getName()); + throw new ConfigurationException("Unable to get " + + VolumeDao.class.getName()); } _podDao = locator.getDao(HostPodDao.class); if (_podDao == null) { - throw new ConfigurationException("Unable to get " + HostPodDao.class.getName()); + throw new ConfigurationException("Unable to get " + + HostPodDao.class.getName()); } _hostDao = locator.getDao(HostDao.class); if (_hostDao == null) { - throw new ConfigurationException("Unable to get " + HostDao.class.getName()); + throw new ConfigurationException("Unable to get " + + HostDao.class.getName()); } _eventDao = locator.getDao(EventDao.class); if (_eventDao == null) { - throw new ConfigurationException("Unable to get " + EventDao.class.getName()); + throw new ConfigurationException("Unable to get " + + EventDao.class.getName()); } _storagePoolDao = locator.getDao(StoragePoolDao.class); if (_storagePoolDao == null) { - throw new ConfigurationException("Unable to find " + StoragePoolDao.class); - } - - _configDao = locator.getDao(ConfigurationDao.class); - if (_configDao == null) { - throw new ConfigurationException("Unable to find " + ConfigurationDao.class); + throw new ConfigurationException("Unable to find " + + StoragePoolDao.class); } _vmTemplateHostDao = locator.getDao(VMTemplateHostDao.class); if (_vmTemplateHostDao == null) { - throw new ConfigurationException("Unable to get " + VMTemplateHostDao.class.getName()); + throw new ConfigurationException("Unable to get " + + VMTemplateHostDao.class.getName()); } _instanceDao = locator.getDao(VMInstanceDao.class); if (_instanceDao == null) - throw new ConfigurationException("Unable to get " + VMInstanceDao.class.getName()); + throw new ConfigurationException("Unable to get " + + VMInstanceDao.class.getName()); _capacityDao = locator.getDao(CapacityDao.class); if (_capacityDao == null) { - throw new ConfigurationException("Unable to get " + CapacityDao.class.getName()); + throw new ConfigurationException("Unable to get " + + CapacityDao.class.getName()); } _haDao = locator.getDao(HighAvailabilityDao.class); if (_haDao == null) { - throw new ConfigurationException("Unable to get " + HighAvailabilityDao.class.getName()); + throw new ConfigurationException("Unable to get " + + HighAvailabilityDao.class.getName()); } _accountDao = locator.getDao(AccountDao.class); if (_accountDao == null) { - throw new ConfigurationException("Unable to get " + AccountDao.class.getName()); + throw new ConfigurationException("Unable to get " + + AccountDao.class.getName()); } _vlanDao = locator.getDao(VlanDao.class); if (_vlanDao == null) { - throw new ConfigurationException("Unable to get " + VlanDao.class.getName()); + throw new ConfigurationException("Unable to get " + + VlanDao.class.getName()); } _agentMgr = locator.getManager(AgentManager.class); if (_agentMgr == null) { - throw new ConfigurationException("Unable to get " + AgentManager.class.getName()); + throw new ConfigurationException("Unable to get " + + AgentManager.class.getName()); } _networkMgr = locator.getManager(NetworkManager.class); if (_networkMgr == null) { - throw new ConfigurationException("Unable to get " + NetworkManager.class.getName()); + throw new ConfigurationException("Unable to get " + + NetworkManager.class.getName()); } _listener = new ConsoleProxyListener(this); @@ -1846,12 +1999,14 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, _IpAllocator = it.nextElement(); } - HighAvailabilityManager haMgr = locator.getManager(HighAvailabilityManager.class); + HighAvailabilityManager haMgr = locator + .getManager(HighAvailabilityManager.class); if (haMgr != null) { haMgr.registerHandler(VirtualMachine.Type.ConsoleProxy, this); } - boolean useLocalStorage = Boolean.parseBoolean((String) params.get(Config.SystemVMUseLocalStorage.key())); + boolean useLocalStorage = Boolean.parseBoolean((String) params + .get(Config.SystemVMUseLocalStorage.key())); _serviceOffering = new ServiceOfferingVO("Fake Offering For DomP", 1, _proxyRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, useLocalStorage, true, null); @@ -1877,7 +2032,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, @Override public Command cleanup(ConsoleProxyVO vm, String vmName) { if (vmName != null) { - return new StopCommand(vm, vmName, VirtualMachineName.getVnet(vmName)); + return new StopCommand(vm, vmName, VirtualMachineName + .getVnet(vmName)); } else if (vm != null) { ConsoleProxyVO vo = vm; return new StopCommand(vo, null); @@ -1904,14 +2060,15 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, String privateIpAddress = proxy.getPrivateIpAddress(); if (privateIpAddress != null) { proxy.setPrivateIpAddress(null); - freePrivateIpAddress(privateIpAddress, proxy.getDataCenterId(), proxy.getId()); + freePrivateIpAddress(privateIpAddress, proxy + .getDataCenterId(), proxy.getId()); } String guestIpAddress = proxy.getGuestIpAddress(); if (guestIpAddress != null) { proxy.setGuestIpAddress(null); _dcDao.releaseLinkLocalPrivateIpAddress(guestIpAddress, proxy.getDataCenterId(), proxy.getId()); } - + proxy.setStorageIp(null); if (!_consoleProxyDao.updateIf(proxy, ev, null)) { s_logger.debug("Unable to update the console proxy"); return; @@ -1942,19 +2099,23 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, @Override public boolean stopProxy(long proxyVmId, long startEventId) { - AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); + AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor + .getCurrentExecutor(); if (asyncExecutor != null) { AsyncJobVO job = asyncExecutor.getJob(); if (s_logger.isInfoEnabled()) - s_logger.info("Stop console proxy " + proxyVmId + ", update async job-" + job.getId()); - _asyncMgr.updateAsyncJobAttachment(job.getId(), "console_proxy", proxyVmId); + s_logger.info("Stop console proxy " + proxyVmId + + ", update async job-" + job.getId()); + _asyncMgr.updateAsyncJobAttachment(job.getId(), "console_proxy", + proxyVmId); } ConsoleProxyVO proxy = _consoleProxyDao.findById(proxyVmId); if (proxy == null) { if (s_logger.isDebugEnabled()) - s_logger.debug("Stopping console proxy failed: console proxy " + proxyVmId + " no longer exists"); + s_logger.debug("Stopping console proxy failed: console proxy " + + proxyVmId + " no longer exists"); return false; } /* @@ -1966,20 +2127,24 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, return stop(proxy, startEventId); } catch (AgentUnavailableException e) { if (s_logger.isDebugEnabled()) - s_logger.debug("Stopping console proxy " + proxy.getName() + " faled : exception " + e.toString()); + s_logger.debug("Stopping console proxy " + proxy.getName() + + " faled : exception " + e.toString()); return false; } } @Override public boolean rebootProxy(long proxyVmId, long startEventId) { - AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); + AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor + .getCurrentExecutor(); if (asyncExecutor != null) { AsyncJobVO job = asyncExecutor.getJob(); if (s_logger.isInfoEnabled()) - s_logger.info("Reboot console proxy " + proxyVmId + ", update async job-" + job.getId()); - _asyncMgr.updateAsyncJobAttachment(job.getId(), "console_proxy", proxyVmId); + s_logger.info("Reboot console proxy " + proxyVmId + + ", update async job-" + job.getId()); + _asyncMgr.updateAsyncJobAttachment(job.getId(), "console_proxy", + proxyVmId); } final ConsoleProxyVO proxy = _consoleProxyDao.findById(proxyVmId); @@ -1999,7 +2164,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, if (answer != null) { if (s_logger.isDebugEnabled()) - s_logger.debug("Successfully reboot console proxy " + proxy.getName()); + s_logger.debug("Successfully reboot console proxy " + + proxy.getName()); SubscriptionMgr.getInstance().notifySubscribers( ConsoleProxyManager.ALERT_SUBJECT, @@ -2007,8 +2173,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, new ConsoleProxyAlertEventArgs( ConsoleProxyAlertEventArgs.PROXY_REBOOTED, proxy.getDataCenterId(), proxy.getId(), proxy, - null) - ); + null)); final EventVO event = new EventVO(); event.setUserId(User.UID_SYSTEM); @@ -2016,12 +2181,14 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, event.setType(EventTypes.EVENT_PROXY_REBOOT); event.setLevel(EventVO.LEVEL_INFO); event.setStartId(startEventId); - event.setDescription("Console proxy rebooted - " + proxy.getName()); + event.setDescription("Console proxy rebooted - " + + proxy.getName()); _eventDao.persist(event); return true; } else { if (s_logger.isDebugEnabled()) - s_logger.debug("failed to reboot console proxy : " + proxy.getName()); + s_logger.debug("failed to reboot console proxy : " + + proxy.getName()); final EventVO event = new EventVO(); event.setUserId(User.UID_SYSTEM); @@ -2029,7 +2196,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, event.setType(EventTypes.EVENT_PROXY_REBOOT); event.setLevel(EventVO.LEVEL_ERROR); event.setStartId(startEventId); - event.setDescription("Rebooting console proxy failed - " + proxy.getName()); + event.setDescription("Rebooting console proxy failed - " + + proxy.getName()); _eventDao.persist(event); return false; } @@ -2039,7 +2207,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, } @Override - public boolean destroy(ConsoleProxyVO proxy) throws AgentUnavailableException { + public boolean destroy(ConsoleProxyVO proxy) + throws AgentUnavailableException { return destroyProxy(proxy.getId(), 0); } @@ -2051,8 +2220,10 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, AsyncJobVO job = asyncExecutor.getJob(); if (s_logger.isInfoEnabled()) - s_logger.info("Destroy console proxy " + vmId + ", update async job-" + job.getId()); - _asyncMgr.updateAsyncJobAttachment(job.getId(), "console_proxy", vmId); + s_logger.info("Destroy console proxy " + vmId + + ", update async job-" + job.getId()); + _asyncMgr.updateAsyncJobAttachment(job.getId(), "console_proxy", + vmId); } ConsoleProxyVO vm = _consoleProxyDao.findById(vmId); @@ -2072,7 +2243,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, } if (!_consoleProxyDao.updateIf(vm, Event.DestroyRequested, null)) { - s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vmId); + s_logger + .debug("Unable to destroy the vm because it is not in the correct state: " + + vmId); return false; } @@ -2164,22 +2337,30 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, // IPAddressVO ip = _ipAddressDao.findById(proxy.getPublicIpAddress()); // VlanVO vlan = _vlanDao.findById(new Long(ip.getVlanDbId())); - GlobalLock proxyLock = GlobalLock.getInternLock(getProxyLockName(proxy.getId())); + GlobalLock proxyLock = GlobalLock.getInternLock(getProxyLockName(proxy + .getId())); try { if (proxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { try { - StopCommand cmd = new StopCommand(proxy, true, Integer.toString(_consoleProxyPort), - Integer.toString(_consoleProxyUrlPort), proxy.getPublicIpAddress()); + StopCommand cmd = new StopCommand(proxy, true, Integer + .toString(_consoleProxyPort), Integer + .toString(_consoleProxyUrlPort), proxy + .getPublicIpAddress()); try { Long proxyHostId = proxy.getHostId(); if (proxyHostId == null) { - s_logger.debug("Unable to stop due to proxy " + proxy.getId() - + " as host is no longer available, proxy may already have been stopped"); + s_logger + .debug("Unable to stop due to proxy " + + proxy.getId() + + " as host is no longer available, proxy may already have been stopped"); return false; } - StopAnswer answer = (StopAnswer) _agentMgr.send(proxyHostId, cmd); + StopAnswer answer = (StopAnswer) _agentMgr.send( + proxyHostId, cmd); if (answer == null || !answer.getResult()) { - s_logger.debug("Unable to stop due to " + (answer == null ? "answer is null" : answer.getDetails())); + s_logger.debug("Unable to stop due to " + + (answer == null ? "answer is null" + : answer.getDetails())); final EventVO event = new EventVO(); event.setUserId(User.UID_SYSTEM); @@ -2187,7 +2368,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, event.setType(EventTypes.EVENT_PROXY_STOP); event.setLevel(EventVO.LEVEL_ERROR); event.setStartId(startEventId); - event.setDescription("Stopping console proxy failed due to negative answer from agent - " + proxy.getName()); + event + .setDescription("Stopping console proxy failed due to negative answer from agent - " + + proxy.getName()); _eventDao.persist(event); return false; } @@ -2207,7 +2390,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, event.setType(EventTypes.EVENT_PROXY_STOP); event.setLevel(EventVO.LEVEL_INFO); event.setStartId(startEventId); - event.setDescription("Console proxy stopped - " + proxy.getName()); + event.setDescription("Console proxy stopped - " + + proxy.getName()); _eventDao.persist(event); return true; } catch (OperationTimedoutException e) { @@ -2217,7 +2401,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, event.setType(EventTypes.EVENT_PROXY_STOP); event.setLevel(EventVO.LEVEL_ERROR); event.setStartId(startEventId); - event.setDescription("Stopping console proxy failed due to operation time out - " + proxy.getName()); + event + .setDescription("Stopping console proxy failed due to operation time out - " + + proxy.getName()); _eventDao.persist(event); throw new AgentUnavailableException(proxy.getHostId()); } @@ -2225,7 +2411,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, proxyLock.unlock(); } } else { - s_logger.debug("Unable to acquire console proxy lock : " + proxy.toString()); + s_logger.debug("Unable to acquire console proxy lock : " + + proxy.toString()); return false; } } finally { @@ -2237,12 +2424,15 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, public boolean migrate(ConsoleProxyVO proxy, HostVO host) { HostVO fromHost = _hostDao.findById(proxy.getId()); - if (!_consoleProxyDao.updateIf(proxy, Event.MigrationRequested, proxy.getHostId())) { - s_logger.debug("State for " + proxy.toString() + " has changed so migration can not take place."); + if (!_consoleProxyDao.updateIf(proxy, Event.MigrationRequested, proxy + .getHostId())) { + s_logger.debug("State for " + proxy.toString() + + " has changed so migration can not take place."); return false; } - MigrateCommand cmd = new MigrateCommand(proxy.getInstanceName(), host.getPrivateIpAddress(), false); + MigrateCommand cmd = new MigrateCommand(proxy.getInstanceName(), host + .getPrivateIpAddress(), false); Answer answer = _agentMgr.easySend(fromHost.getId(), cmd); if (answer == null) { return false; @@ -2257,8 +2447,10 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, public boolean completeMigration(ConsoleProxyVO proxy, HostVO host) throws AgentUnavailableException, OperationTimedoutException { - CheckVirtualMachineCommand cvm = new CheckVirtualMachineCommand(proxy.getInstanceName()); - CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(host.getId(), cvm); + CheckVirtualMachineCommand cvm = new CheckVirtualMachineCommand(proxy + .getInstanceName()); + CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr + .send(host.getId(), cvm); if (!answer.getResult()) { s_logger.debug("Unable to complete migration for " + proxy.getId()); _consoleProxyDao.updateIf(proxy, Event.AgentReportStopped, null); @@ -2285,7 +2477,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, boolean mirroredVols = proxy.isMirroredVols(); DataCenterVO dc = _dcDao.findById(proxy.getDataCenterId()); HostPodVO pod = _podDao.findById(proxy.getPodId()); - List sps = _storageMgr.getStoragePoolsForVm(proxy.getId()); + List sps = _storageMgr.getStoragePoolsForVm(proxy + .getId()); StoragePoolVO sp = sps.get(0); // FIXME List vols = _volsDao.findCreatedByInstance(routerId); @@ -2297,7 +2490,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, storageIps[1] = vols.get(1).getHostIp(); } - PrepareForMigrationCommand cmd = new PrepareForMigrationCommand(proxy.getName(), null, storageIps, vols, mirroredVols); + PrepareForMigrationCommand cmd = new PrepareForMigrationCommand(proxy + .getName(), null, storageIps, vols, mirroredVols); HostVO routingHost = null; HashSet avoid = new HashSet(); @@ -2309,11 +2503,14 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, } avoid.add(fromHost); - while ((routingHost = (HostVO) _agentMgr.findHost(Host.Type.Routing, dc, pod, sp, _serviceOffering, template, proxy, fromHost, avoid)) != null) { + while ((routingHost = (HostVO) _agentMgr + .findHost(Host.Type.Routing, dc, pod, sp, _serviceOffering, + template, proxy, fromHost, avoid)) != null) { avoid.add(routingHost); if (s_logger.isDebugEnabled()) { - s_logger.debug("Trying to migrate router to host " + routingHost.getName()); + s_logger.debug("Trying to migrate router to host " + + routingHost.getName()); } if (!_storageMgr.share(proxy, vols, routingHost, false)) { diff --git a/server/src/com/cloud/consoleproxy/StaticConsoleProxyManager.java b/server/src/com/cloud/consoleproxy/StaticConsoleProxyManager.java index 285b51776f2..0aaa9cb6794 100644 --- a/server/src/com/cloud/consoleproxy/StaticConsoleProxyManager.java +++ b/server/src/com/cloud/consoleproxy/StaticConsoleProxyManager.java @@ -29,6 +29,7 @@ import com.cloud.host.Host.Type; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; import com.cloud.vm.ConsoleProxyVO; +import com.cloud.vm.State; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.dao.ConsoleProxyDao; @@ -47,7 +48,7 @@ public class StaticConsoleProxyManager extends AgentBasedConsoleProxyManager imp @Override public ConsoleProxyVO assignProxy(long dataCenterId, long userVmId) { - ConsoleProxyVO proxy = new ConsoleProxyVO(1l, "EmbeddedProxy", null, null, null, + ConsoleProxyVO proxy = new ConsoleProxyVO(1l, "EmbeddedProxy", State.Running, null, null, null, "02:02:02:02:02:02", "127.0.0.1", "255.255.255.0", diff --git a/server/src/com/cloud/ha/InvestigatorImpl.java b/server/src/com/cloud/ha/InvestigatorImpl.java index 729bee59bca..f55f34d69c5 100644 --- a/server/src/com/cloud/ha/InvestigatorImpl.java +++ b/server/src/com/cloud/ha/InvestigatorImpl.java @@ -175,7 +175,7 @@ public class InvestigatorImpl implements Investigator { } // Host.status is up and Host.type is routing private List findHostByPod(long podId, Long excludeHostId) { - SearchCriteria sc = _hostDao.createSearchCriteria(); + SearchCriteria sc = _hostDao.createSearchCriteria(); sc.addAnd("podId", SearchCriteria.Op.EQ, podId); sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up); sc.addAnd("type", SearchCriteria.Op.EQ, Host.Type.Routing); diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index d5ae622d890..db50afd2693 100644 --- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -150,21 +150,21 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L Map hosts = Host.getAllRecords(conn); if (_checkHvm) { - for (Map.Entry entry : hosts.entrySet()) { - Host.Record record = entry.getValue(); + for (Map.Entry entry : hosts.entrySet()) { + Host.Record record = entry.getValue(); - boolean support_hvm = false; - for ( String capability : record.capabilities ) { - if(capability.contains("hvm")) { - support_hvm = true; - break; + boolean support_hvm = false; + for ( String capability : record.capabilities ) { + if(capability.contains("hvm")) { + support_hvm = true; + break; + } } - } - if( !support_hvm ) { - String msg = "Unable to add host " + record.address + " because it doesn't support hvm"; - _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); - s_logger.debug(msg); - throw new RuntimeException(msg); + if( !support_hvm ) { + String msg = "Unable to add host " + record.address + " because it doesn't support hvm"; + _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); + s_logger.debug(msg); + throw new RuntimeException(msg); } } @@ -214,17 +214,17 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L details.put(HostInfo.HOST_OS_KERNEL_VERSION, hostKernelVer); details.put(HostInfo.HYPERVISOR_VERSION, xenVersion); - if (!params.containsKey("public.network.device")) { + if (!params.containsKey("public.network.device") && _publicNic != null) { params.put("public.network.device", _publicNic); details.put("public.network.device", _publicNic); } - if (!params.containsKey("guest.network.device")) { + if (!params.containsKey("guest.network.device") && _guestNic != null) { params.put("guest.network.device", _guestNic); details.put("guest.network.device", _guestNic); } - if (!params.containsKey("private.network.device")) { + if (!params.containsKey("private.network.device") && _privateNic != null) { params.put("private.network.device", _privateNic); details.put("private.network.device", _privateNic); } @@ -345,13 +345,13 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L String poolMaster = null; String username = null; String password = null; - String address = null; + String ip = null; for (HostVO host : hosts) { _hostDao.loadDetails(host); username = host.getDetail("username"); password = host.getDetail("password"); - address = host.getDetail("url"); - Connection hostConn = _connPool.connect(address, username, password, _wait); + ip = host.getDetail("url"); + Connection hostConn = _connPool.connect(ip, username, password, _wait); try { if (hostConn == null) { continue; @@ -395,11 +395,10 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L } protected boolean checkServer(Connection conn, long dcId, Long podId, Host host, Host.Record record) { - String prodBrand = record.softwareVersion.get("product_brand").trim(); - String prodVersion = record.softwareVersion.get("product_version").trim(); + String prodBrand = record.softwareVersion.get("product_brand"); - if(!prodBrand.equals("XenCloudPlatform") || !prodVersion.equals("0.1.1")) { - String msg = "Only support XCP 0.1.1, but this one is " + prodBrand + " " + prodVersion; + if(!prodBrand.equals("XenCloudPlatform")) { + String msg = "Do not support product brand " + prodBrand; _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); s_logger.debug(msg); throw new RuntimeException(msg); @@ -438,7 +437,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L value = _params.get("xen.check.hvm"); _checkHvm = value == null ? true : Boolean.parseBoolean(value); - + value = _params.get(Config.CreatePoolsInPod.key()); _formPoolsInPod = Boolean.parseBoolean(value); diff --git a/server/src/com/cloud/hypervisor/xen/resource/XenServerPoolVO.java b/server/src/com/cloud/hypervisor/xen/resource/XenServerPoolVO.java new file mode 100644 index 00000000000..c203d5e8066 --- /dev/null +++ b/server/src/com/cloud/hypervisor/xen/resource/XenServerPoolVO.java @@ -0,0 +1,62 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.hypervisor.xen.resource; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name="xen_server_pool") +public class XenServerPoolVO { + + @Id + @Column(name="pool_uuid", updatable=false, nullable=false) + String poolUuid; + + @Column(name="pod_id", updatable=false, nullable=false) + long podId; + + @Column(name="name") + String name; + + public XenServerPoolVO(String poolUuid, long podId) { + this.poolUuid = poolUuid; + this.podId = podId; + } + + protected XenServerPoolVO() { + } + + public long getPodId() { + return podId; + } + + public String getPoolUuid() { + return poolUuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/server/src/com/cloud/network/dao/NetworkProfileDao.java b/server/src/com/cloud/hypervisor/xen/resource/dao/XenServerPoolDao.java similarity index 80% rename from server/src/com/cloud/network/dao/NetworkProfileDao.java rename to server/src/com/cloud/hypervisor/xen/resource/dao/XenServerPoolDao.java index 2938d5de2f3..e26f2466a21 100644 --- a/server/src/com/cloud/network/dao/NetworkProfileDao.java +++ b/server/src/com/cloud/hypervisor/xen/resource/dao/XenServerPoolDao.java @@ -1,7 +1,7 @@ /** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. * - * This software is licensed under the GNU General Public License v3 or later. + * This software is licensed under the GNU General Public License v3 or later. * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,11 +15,11 @@ * along with this program. If not, see . * */ -package com.cloud.network.dao; +package com.cloud.hypervisor.xen.resource.dao; -import com.cloud.network.NetworkProfileVO; +import com.cloud.hypervisor.xen.resource.XenServerPoolVO; import com.cloud.utils.db.GenericDao; -public interface NetworkProfileDao extends GenericDao { +public interface XenServerPoolDao extends GenericDao { } diff --git a/server/src/com/cloud/network/dao/NetworkProfileDaoImpl.java b/server/src/com/cloud/hypervisor/xen/resource/dao/XenServerPoolDaoImpl.java similarity index 73% rename from server/src/com/cloud/network/dao/NetworkProfileDaoImpl.java rename to server/src/com/cloud/hypervisor/xen/resource/dao/XenServerPoolDaoImpl.java index 734e378faec..e297edb2e80 100644 --- a/server/src/com/cloud/network/dao/NetworkProfileDaoImpl.java +++ b/server/src/com/cloud/hypervisor/xen/resource/dao/XenServerPoolDaoImpl.java @@ -1,7 +1,7 @@ /** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. * - * This software is licensed under the GNU General Public License v3 or later. + * This software is licensed under the GNU General Public License v3 or later. * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,15 +15,15 @@ * along with this program. If not, see . * */ -package com.cloud.network.dao; +package com.cloud.hypervisor.xen.resource.dao; import javax.ejb.Local; -import com.cloud.network.NetworkProfileVO; +import com.cloud.hypervisor.xen.resource.XenServerPoolVO; import com.cloud.utils.db.GenericDaoBase; -@Local(value=NetworkProfileDao.class) -public class NetworkProfileDaoImpl extends GenericDaoBase { - protected NetworkProfileDaoImpl() { +@Local(value=XenServerPoolDao.class) +public class XenServerPoolDaoImpl extends GenericDaoBase implements XenServerPoolDao { + protected XenServerPoolDaoImpl() { } } diff --git a/server/src/com/cloud/migration/Db20to21MigrationUtil.java b/server/src/com/cloud/migration/Db20to21MigrationUtil.java index 05955684b9c..760a61c4102 100644 --- a/server/src/com/cloud/migration/Db20to21MigrationUtil.java +++ b/server/src/com/cloud/migration/Db20to21MigrationUtil.java @@ -3,6 +3,7 @@ package com.cloud.migration; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.math.BigInteger; import java.net.NetworkInterface; import java.net.SocketException; import java.security.NoSuchAlgorithmException; @@ -38,7 +39,7 @@ import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.migration.DiskOffering21VO.Type; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VolumeVO; import com.cloud.storage.Storage.StoragePoolType; @@ -50,7 +51,6 @@ import com.cloud.utils.NumbersUtil; import com.cloud.utils.PropertiesUtil; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.db.Filter; -import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; @@ -92,21 +92,12 @@ public class Db20to21MigrationUtil { protected UserVmDao _userVmDao; protected DomainRouterDao _routerDao; protected StoragePoolDao _poolDao; - + protected long _consoleProxyServiceOfferingId; protected long _secStorageServiceOfferingId; protected long _domRServiceOfferingId; protected boolean _isPremium = false; - - protected static class DcPod { - long id; - String name; - long count; - - public DcPod() { - } - } - + private void migrateZones() { boolean createCluster = false; String value = _configDao.getValue("xen.create.pools.in.pod"); @@ -115,43 +106,43 @@ public class Db20to21MigrationUtil { } else { createCluster = true; } - + // Displaying summarize data center/pod configuration from old DB before we continue - GenericSearchBuilder sb = _dcDao.createSearchBuilder(DcPod.class); + SearchBuilder sb = _dcDao.createSearchBuilder(); sb.selectField(sb.entity().getId()); sb.selectField(sb.entity().getName()); - sb.select("count", Func.COUNT, null); + sb.select(Func.COUNT, (Object[])null); sb.groupBy(sb.entity().getId(), sb.entity().getName()); sb.done(); - - SearchCriteria sc = sb.create(); - List results = _dcDao.searchAll(sc, (Filter)null); + + SearchCriteria sc = sb.create(); + List results = _dcDao.searchAll(sc, (Filter)null); if(results.size() > 0) { System.out.println("We've found following zones are deployed in your database"); - for(DcPod cols : results) { - System.out.println("\tid: " + cols.id + ",\tname: " + cols.name + ",\tpods in zone: " + cols.count); + for(Object[] cols : results) { + System.out.println("\tid: " + cols[0] + ",\tname: " + (String)cols[1] + ",\tpods in zone: " + (Long)cols[2]); } System.out.println("From 2.0 to 2.1, pod is required to have gateway configuration"); - - for(DcPod cols : results) { - migrateZonePods(cols.id, cols.name, createCluster); - - s_logger.info("Set system VM guest MAC in zone" + cols.name); - migrateSystemVmGuestMacAndState(cols.id); + + for(Object[] cols : results) { + migrateZonePods(((BigInteger)cols[0]).longValue(), (String)cols[1], createCluster); + + s_logger.info("Set system VM guest MAC in zone" + (String)cols[1]); + migrateSystemVmGuestMacAndState(((BigInteger)cols[0]).longValue()); } } else { System.out.println("We couldn't find any zone being deployed. Skip Zone/Pod migration"); } } - + private void migrateZonePods(long zoneId, String zoneName, boolean createCluster) { SearchBuilder sb = _podDao.createSearchBuilder(); sb.and("zoneId", sb.entity().getDataCenterId(), Op.EQ); sb.done(); - - SearchCriteria sc = sb.create(); + + SearchCriteria sc = sb.create(); sc.setParameters("zoneId", zoneId); - + List pods = _podDao.searchAll(sc, null, false, false); if(pods.size() > 0) { for(HostPodVO pod : pods) { @@ -166,40 +157,40 @@ public class Db20to21MigrationUtil { _podDao.update(pod.getId(), pod); if(createCluster) migrateHostsInPod(zoneId, pod.getId(), pod.getName()); - + System.out.println("Set last_host_id for VMs in pod " + pod.getName()); migrateVmInstanceLastHostId(zoneId, pod.getId()); - + System.out.println("Setup link local addresses, it will take a while, please wait..."); String ipNums = _configDao.getValue("linkLocalIp.nums"); int nums = Integer.parseInt(ipNums); if (nums > 16 || nums <= 0) { nums = 10; } - + /*local link ip address starts from 169.254.0.2 - 169.254.(nums)*/ String[] ipRanges = NetUtils.getLinkLocalIPRange(nums); _dcDao.addLinkLocalPrivateIpAddress(zoneId, pod.getId(), ipRanges[0], ipRanges[1]); } } } - + private void migrateHostsInPod(long zoneId, long podId, String podName) { System.out.println("Creating cluster for pod " + podName); - - ClusterVO cluster = null; - + + ClusterVO cluster = null; + SearchBuilder sb = _hostDao.createSearchBuilder(); sb.and("dc", sb.entity().getDataCenterId(), Op.EQ); sb.and("pod", sb.entity().getPodId(), Op.EQ); sb.and("type", sb.entity().getType(), Op.EQ); sb.done(); - - SearchCriteria sc = sb.create(); + + SearchCriteria sc = sb.create(); sc.setParameters("dc", zoneId); sc.setParameters("pod", podId); sc.setParameters("type", Host.Type.Routing); - + // join cluster for hosts in pod List hostsInPod = _hostDao.searchAll(sc, null, false, false); if(hostsInPod.size() > 0) { @@ -207,49 +198,49 @@ public class Db20to21MigrationUtil { cluster = new ClusterVO(zoneId, podId, String.valueOf(podId)); cluster = _clusterDao.persist(cluster); } - + for(HostVO host : hostsInPod) { host.setClusterId(cluster.getId()); _hostDao.update(host.getId(), host); - + System.out.println("Join host " + host.getName() + " to auto-formed cluster"); } } - + SearchBuilder sbPool = _spDao.createSearchBuilder(); sbPool.and("dc", sbPool.entity().getDataCenterId(), Op.EQ); sbPool.and("pod", sbPool.entity().getPodId(), Op.EQ); sbPool.and("poolType", sbPool.entity().getPoolType(), Op.IN); sbPool.done(); - - SearchCriteria scPool = sbPool.create(); + + SearchCriteria scPool = sbPool.create(); scPool.setParameters("dc", zoneId); scPool.setParameters("pod", podId); scPool.setParameters("poolType", StoragePoolType.NetworkFilesystem.toString(), StoragePoolType.IscsiLUN.toString()); - + List sPoolsInPod = _spDao.searchAll(scPool, null, false, false); if(sPoolsInPod.size() > 0) { if(cluster == null) { cluster = new ClusterVO(zoneId, podId, String.valueOf(podId)); cluster = _clusterDao.persist(cluster); } - + for(StoragePoolVO spool : sPoolsInPod) { spool.setClusterId(cluster.getId()); _spDao.update(spool.getId(), spool); - + System.out.println("Join host " + spool.getName() + " to auto-formed cluster"); } } } - + private void composeDomainPath(DomainVO domain, StringBuilder sb) { if(domain.getParent() == null) { sb.append("/"); } else { DomainVO parent = _domainDao.findById(domain.getParent()); composeDomainPath(parent, sb); - + if(domain.getName().contains("/")) { System.out.println("Domain " + domain.getName() + " contains invalid domain character, replace it with -"); sb.append(domain.getName().replace('/', '-')); @@ -259,7 +250,7 @@ public class Db20to21MigrationUtil { sb.append("/"); } } - + private void migrateDomains() { System.out.println("Migrating domains..."); @@ -268,19 +259,19 @@ public class Db20to21MigrationUtil { for(DomainVO domain : domains) { StringBuilder path = new StringBuilder(); composeDomainPath(domain, path); - + System.out.println("Convert domain path, domin: " + domain.getId() + ", path:" + path.toString()); - + domain.setPath(path.toString()); _domainDao.update(domain.getId(), domain); } - + System.out.println("All domains have been migrated to 2.1 format"); } - + private void migrateServiceOfferings() { System.out.println("Migrating service offering..."); - + long seq = getServiceOfferingStartSequence(); List oldServiceOfferings = _serviceOffering20Dao.listAll(); @@ -290,6 +281,7 @@ public class Db20to21MigrationUtil { so20.getUseLocalStorage(), false, null); so21.setId(seq++); so21.setDiskSize(0); + so21 = _serviceOffering21Dao.persist(so21); if(so20.getId().longValue() != so21.getId().longValue()) { @@ -297,12 +289,12 @@ public class Db20to21MigrationUtil { updateServiceOfferingReferences(so20.getId().longValue(), so21.getId().longValue()); } } - + boolean useLocalStorage = Boolean.parseBoolean(_configDao.getValue(Config.SystemVMUseLocalStorage.key())); - + // create service offering for system VMs and update references int proxyRamSize = NumbersUtil.parseInt( - _configDao.getValue(Config.ConsoleProxyRamSize.key()), + _configDao.getValue(Config.ConsoleProxyRamSize.key()), ConsoleProxyManager.DEFAULT_PROXY_VM_RAMSIZE); ServiceOffering21VO soConsoleProxy = new ServiceOffering21VO("Fake Offering For DomP", 1, proxyRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, @@ -311,28 +303,28 @@ public class Db20to21MigrationUtil { soConsoleProxy.setUniqueName("Cloud.com-ConsoleProxy"); soConsoleProxy = _serviceOffering21Dao.persist(soConsoleProxy); _consoleProxyServiceOfferingId = soConsoleProxy.getId(); - + int secStorageVmRamSize = NumbersUtil.parseInt( - _configDao.getValue(Config.SecStorageVmRamSize.key()), + _configDao.getValue(Config.SecStorageVmRamSize.key()), SecondaryStorageVmManager.DEFAULT_SS_VM_RAMSIZE); - ServiceOffering21VO soSecondaryVm = new ServiceOffering21VO("Fake Offering For Secondary Storage VM", 1, + ServiceOffering21VO soSecondaryVm = new ServiceOffering21VO("Fake Offering For Secondary Storage VM", 1, secStorageVmRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, useLocalStorage, true, null); soSecondaryVm.setId(seq++); soSecondaryVm.setUniqueName("Cloud.com-SecondaryStorage"); soSecondaryVm = _serviceOffering21Dao.persist(soSecondaryVm); _secStorageServiceOfferingId = soSecondaryVm.getId(); - + int routerRamSize = NumbersUtil.parseInt(_configDao.getValue("router.ram.size"), 128); - ServiceOffering21VO soDomainRouter = new ServiceOffering21VO("Fake Offering For DomR", 1, + ServiceOffering21VO soDomainRouter = new ServiceOffering21VO("Fake Offering For DomR", 1, routerRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, useLocalStorage, true, null); soDomainRouter.setId(seq++); soDomainRouter.setUniqueName("Cloud.Com-SoftwareRouter"); soDomainRouter = _serviceOffering21Dao.persist(soDomainRouter); _domRServiceOfferingId = soDomainRouter.getId(); - + System.out.println("Service offering has been migrated to 2.1 format"); } - + private long getServiceOfferingStartSequence() { Transaction txn = Transaction.open(Transaction.CLOUD_DB); long seq = 0; @@ -343,13 +335,13 @@ public class Db20to21MigrationUtil { rs.next(); seq = rs.getLong(1); pstmt.close(); - + pstmt = txn.prepareAutoCloseStatement("SELECT max(id) FROM disk_offering"); rs = pstmt.executeQuery(); rs.next(); seq += rs.getLong(1); pstmt.close(); - + seq += 100; // add a gap return seq; } catch (SQLException e) { @@ -357,10 +349,10 @@ public class Db20to21MigrationUtil { } finally { txn.close(); } - + return 10000; } - + private void updateConsoleProxyServiceOfferingReferences(long serviceOfferingId) { Transaction txn = Transaction.open(Transaction.CLOUD_DB); try { @@ -368,7 +360,7 @@ public class Db20to21MigrationUtil { pstmt = txn.prepareAutoCloseStatement( "UPDATE volumes SET disk_offering_id=? WHERE instance_id IN (SELECT id FROM vm_instance WHERE type='ConsoleProxy')"); pstmt.setLong(1, serviceOfferingId); - + int rows = pstmt.executeUpdate(); s_logger.info("Update volumes for console proxy service offering change, affected rows: " + rows); } catch (SQLException e) { @@ -385,7 +377,7 @@ public class Db20to21MigrationUtil { pstmt = txn.prepareAutoCloseStatement( "UPDATE volumes SET disk_offering_id=? WHERE instance_id IN (SELECT id FROM vm_instance WHERE type='SecondaryStorageVm')"); pstmt.setLong(1, serviceOfferingId); - + int rows = pstmt.executeUpdate(); s_logger.info("Update volumes for secondary storage service offering change, affected rows: " + rows); } catch (SQLException e) { @@ -394,7 +386,7 @@ public class Db20to21MigrationUtil { txn.close(); } } - + private void updateDomainRouterServiceOfferingReferences(long serviceOfferingId) { Transaction txn = Transaction.open(Transaction.CLOUD_DB); try { @@ -402,7 +394,7 @@ public class Db20to21MigrationUtil { pstmt = txn.prepareAutoCloseStatement( "UPDATE volumes SET disk_offering_id=? WHERE instance_id IN (SELECT id FROM vm_instance WHERE type='DomainRouter')"); pstmt.setLong(1, serviceOfferingId); - + int rows = pstmt.executeUpdate(); s_logger.info("Update volumes for secondary storage service offering change, affected rows: " + rows); } catch (SQLException e) { @@ -411,73 +403,73 @@ public class Db20to21MigrationUtil { txn.close(); } } - + private void updateServiceOfferingReferences(long oldServiceOfferingId, long newServiceOfferingId) { Transaction txn = Transaction.open(Transaction.CLOUD_DB); try { PreparedStatement pstmt = null; pstmt = txn.prepareAutoCloseStatement("UPDATE user_vm SET service_offering_id=? WHERE service_offering_id=?"); - + pstmt.setLong(1, newServiceOfferingId); pstmt.setLong(2, oldServiceOfferingId); - + int rows = pstmt.executeUpdate(); s_logger.info("Update user_vm for service offering change (" + oldServiceOfferingId + "->" + newServiceOfferingId + "), affected rows: " + rows); - + } catch (SQLException e) { s_logger.error("Unhandled exception: ", e); } finally { txn.close(); } } - + private void migrateDiskOfferings() { System.out.println("Migrating disk offering..."); - + List oldDiskOfferings = _diskOffering20Dao.listAll(); long maxDiskOfferingId = _domRServiceOfferingId; - maxDiskOfferingId += 100; - + maxDiskOfferingId += 100; + for(DiskOffering20VO do20 : oldDiskOfferings) { - DiskOffering21VO do21 = new DiskOffering21VO(do20.getDomainId(), do20.getName(), do20.getDisplayText(), do20.getDiskSize(), + DiskOffering21VO do21 = new DiskOffering21VO(do20.getDomainId(), do20.getName(), do20.getDisplayText(), do20.getDiskSize(), do20.getMirrored(), null); do21.setType(Type.Disk); do21.setId(maxDiskOfferingId++); - + do21 = _diskOffering21Dao.persist(do21); if(do20.getId().longValue() != do21.getId().longValue()) { updateDiskOfferingReferences(do20.getId().longValue(), do21.getId().longValue()); } } - + FixupNullDiskOfferingInVolumes(); - + System.out.println("Disk offering has been migrated to 2.1 format"); } - + private void FixupNullDiskOfferingInVolumes() { System.out.println("Fixup NULL disk_offering_id references in volumes table ..."); - - SearchCriteria scDiskOffering = _diskOffering21Dao.createSearchCriteria(); - List offeringList = _diskOffering21Dao.searchAll(scDiskOffering, + + SearchCriteria scDiskOffering = _diskOffering21Dao.createSearchCriteria(); + List offeringList = _diskOffering21Dao.searchAll(scDiskOffering, new Filter(DiskOffering21VO.class, "diskSize", true, null, null), false, false); - + for(DiskOffering21VO offering : offeringList) { s_logger.info("Disk offering name: " + offering.getName() + ", disk size: " + offering.getDiskSizeInBytes()); } - + SearchBuilder sb = _volumeDao.createSearchBuilder(); sb.and("diskOfferingId", sb.entity().getDiskOfferingId(), Op.NULL); sb.done(); - - SearchCriteria sc = sb.create(); + + SearchCriteria sc = sb.create(); List volumes = _volumeDao.searchAll(sc, null, false, false); - + if(volumes.size() > 0) { for(VolumeVO vol : volumes) { if(vol.getInstanceId() != null) { VMInstanceVO vmInstance = _vmInstanceDao.findById(vol.getInstanceId()); - + if(vmInstance.getType() == VirtualMachine.Type.User) { // if the volume is for user VM, we can retrieve the information from service_offering_id UserVmVO userVm = _userVmDao.findById(vol.getInstanceId()); @@ -507,34 +499,34 @@ public class Db20to21MigrationUtil { break; } } - + if(!found) { System.out.println("volume: " + vol.getId() + " disck_offering_id is fixed to " + offeringList.get(offeringList.size() - 1).getId()); vol.setDiskOfferingId(offeringList.get(offeringList.size() - 1).getId()); } } - + _volumeDao.update(vol.getId(), vol); } } - + System.out.println("Disk offering fixup is done"); } - + private void updateDiskOfferingReferences(long oldDiskOfferingId, long newDiskOfferingId) { Transaction txn = Transaction.open(Transaction.CLOUD_DB); try { PreparedStatement pstmt = null; pstmt = txn.prepareAutoCloseStatement("UPDATE vm_disk SET disk_offering_id=? WHERE disk_offering_id=?"); - + pstmt.setLong(1, newDiskOfferingId); pstmt.setLong(2, oldDiskOfferingId); - + int rows = pstmt.executeUpdate(); pstmt.close(); - + s_logger.info("Update vm_disk for disk offering change (" + oldDiskOfferingId + "->" + newDiskOfferingId + "), affected rows: " + rows); - + pstmt = txn.prepareAutoCloseStatement("UPDATE volumes SET disk_offering_id=? WHERE disk_offering_id=?"); pstmt.setLong(1, newDiskOfferingId); pstmt.setLong(2, oldDiskOfferingId); @@ -547,89 +539,89 @@ public class Db20to21MigrationUtil { txn.close(); } } - + private void migrateSystemVmGuestMacAndState(long zoneId) { // for console proxy VMs SearchBuilder sb = _consoleProxyDao.createSearchBuilder(); sb.and("zoneId", sb.entity().getDataCenterId(), Op.EQ); sb.done(); - - SearchCriteria sc = sb.create(); + + SearchCriteria sc = sb.create(); sc.setParameters("zoneId", zoneId); - + List proxies =_consoleProxyDao.searchAll(sc, null, false, false); for(ConsoleProxyVO proxy : proxies) { String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(zoneId, (1L << 31)); String guestMacAddress = macAddresses[0]; - + proxy.setGuestMacAddress(guestMacAddress); if(proxy.getState() == State.Running || proxy.getState() == State.Starting) { System.out.println("System VM " + proxy.getName() + " is in active state, mark it to Stopping state for migration"); proxy.setState(State.Stopping); } - + String guestIpAddress = _dcDao.allocateLinkLocalPrivateIpAddress(proxy.getDataCenterId(), proxy.getPodId(), proxy.getId()); proxy.setGuestIpAddress(guestIpAddress); proxy.setGuestNetmask("255.255.0.0"); - + System.out.println("Assign link loal address to proxy " + proxy.getName() + ", link local address: " + guestIpAddress); _consoleProxyDao.update(proxy.getId(), proxy); } - + // for secondary storage VMs SearchBuilder sb2 = _secStorageVmDao.createSearchBuilder(); sb2.and("zoneId", sb2.entity().getDataCenterId(), Op.EQ); sb2.done(); - - SearchCriteria sc2 = sb2.create(); + + SearchCriteria sc2 = sb2.create(); sc2.setParameters("zoneId", zoneId); - + List secStorageVms =_secStorageVmDao.searchAll(sc2, null, false, false); for(SecondaryStorageVmVO secStorageVm : secStorageVms) { String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(zoneId, (1L << 31)); String guestMacAddress = macAddresses[0]; - + secStorageVm.setGuestMacAddress(guestMacAddress); if(secStorageVm.getState() == State.Running || secStorageVm.getState() == State.Starting) { System.out.println("System VM " + secStorageVm.getName() + " is in active state, mark it to Stopping state for migration"); secStorageVm.setState(State.Stopping); } - + String guestIpAddress = _dcDao.allocateLinkLocalPrivateIpAddress(secStorageVm.getDataCenterId(), secStorageVm.getPodId(), secStorageVm.getId()); secStorageVm.setGuestIpAddress(guestIpAddress); secStorageVm.setGuestNetmask("255.255.0.0"); - + System.out.println("Assign link loal address to secondary storage VM " + secStorageVm.getName() + ", link local address: " + guestIpAddress); _secStorageVmDao.update(secStorageVm.getId(), secStorageVm); } - + // for Domain Router VMs - // Although we can list those we are interested, but just too lazy, list all of them and check their states. + // Although we can list those we are interested, but just too lazy, list all of them and check their states. SearchBuilder sb3 = _routerDao.createSearchBuilder(); sb3.and("zoneId", sb3.entity().getDataCenterId(), Op.EQ); sb3.done(); - - SearchCriteria sc3 = sb3.create(); + + SearchCriteria sc3 = sb3.create(); sc3.setParameters("zoneId", zoneId); List domRs = _routerDao.searchAll(sc3, null, false, false); for(DomainRouterVO router : domRs) { if(router.getState() == State.Running || router.getState() == State.Starting) { router.setState(State.Stopping); - + System.out.println("System VM " + router.getName() + " is in active state, mark it to Stopping state for migration"); _routerDao.update(router.getId(), router); } } } - + private void migrateVmInstanceLastHostId(long zoneId, long podId) { SearchBuilder sb = _vmInstanceDao.createSearchBuilder(); sb.and("zoneId", sb.entity().getDataCenterId(), Op.EQ); sb.and("podId", sb.entity().getPodId(), Op.EQ); sb.done(); - + Random rand = new Random(); - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); sc.setParameters("zoneId", zoneId); sc.setParameters("podId", podId); List vmInstances = _vmInstanceDao.searchAll(sc, null, false, false); @@ -646,91 +638,91 @@ public class Db20to21MigrationUtil { _vmInstanceDao.update(vm.getId(), vm); } } - + private List getHostsInPod(long zoneId, long podId) { SearchBuilder sb = _hostDao.createSearchBuilder(); sb.and("zoneId", sb.entity().getDataCenterId(), Op.EQ); sb.and("podId", sb.entity().getPodId(), Op.EQ); sb.and("type", sb.entity().getType(), Op.EQ); sb.done(); - - SearchCriteria sc = sb.create(); + + SearchCriteria sc = sb.create(); sc.setParameters("zoneId", zoneId); sc.setParameters("podId", podId); sc.setParameters("type", Host.Type.Routing.toString()); - + return _hostDao.searchAll(sc, null, false, false); } - + private void migrateVolumDeviceIds() { System.out.println("Migrating device_id for volumes, this may take a while, please wait..."); - SearchCriteria sc = _vmInstanceDao.createSearchCriteria(); + SearchCriteria sc = _vmInstanceDao.createSearchCriteria(); List vmInstances = _vmInstanceDao.searchAll(sc, null, false, false); - + long deviceId = 1; for(VMInstanceVO vm: vmInstances) { SearchBuilder sb = _volumeDao.createSearchBuilder(); sb.and("instanceId", sb.entity().getInstanceId(), Op.EQ); sb.done(); - - SearchCriteria sc2 = sb.create(); + + SearchCriteria sc2 = sb.create(); sc2.setParameters("instanceId", vm.getId()); - + List volumes = _volumeDao.searchAll(sc2, null, false, false); deviceId = 1; // reset for each VM iteration for(VolumeVO vol : volumes) { if(vol.getVolumeType() == VolumeType.ROOT) { System.out.println("Setting root volume device id to zero, vol: " + vol.getName() + ", instance: " + vm.getName()); - + vol.setDeviceId(0L); } else if(vol.getVolumeType() == VolumeType.DATADISK) { System.out.println("Setting data volume device id, vol: " + vol.getName() + ", instance: " + vm.getName() + ", device id: " + deviceId); - + vol.setDeviceId(deviceId); - + // don't use device ID 3 if(++deviceId == 3) deviceId++; } else { System.out.println("Unsupported volume type found for volume: " + vol.getName()); } - + _volumeDao.update(vol.getId(), vol); } } - + System.out.println("Migrating device_id for volumes done"); } - + private void migrateVolumePoolType() { System.out.println("Migrating pool type for volumes..."); - - SearchCriteria sc = _volumeDao.createSearchCriteria(); + + SearchCriteria sc = _volumeDao.createSearchCriteria(); List volumes = _volumeDao.searchAll(sc, null, false, false); for(VolumeVO vol : volumes) { if(vol.getPoolId() != null) { StoragePoolVO pool = _poolDao.findById(vol.getPoolId()); if(pool != null) { vol.setPoolType(pool.getPoolType()); - + _volumeDao.update(vol.getId(), vol); } else { System.out.println("Unable to determine pool type for volume: " + vol.getName()); } } } - + System.out.println("Migrating pool type for volumes done"); } - + private void migrateConfiguration() { System.out.println("Migrating 2.1 configuration variables..."); - + System.out.print("Are you migrating from 2.0 Premium Edition? (yes/no): "); String answer = readInput(); if(answer != null && answer.equalsIgnoreCase("yes")) _isPremium = true; - + // Save default Configuration Table values List categories = Config.getCategories(); for (String category : categories) { @@ -738,16 +730,16 @@ public class Db20to21MigrationUtil { if (!_isPremium && category.equals("Premium")) { continue; } - + List configs = Config.getConfigs(category); for (Config c : configs) { String name = c.key(); - + // If the value is already in the table, don't reinsert it if (_configDao.getValue(name) != null) { continue; } - + String instance = "DEFAULT"; String component = c.getComponent(); String value = c.getDefaultValue(); @@ -755,7 +747,7 @@ public class Db20to21MigrationUtil { ConfigurationVO configVO = new ConfigurationVO(category, instance, component, name, value, description); _configDao.persist(configVO); } - + // If this is a premium environment, set the network type to be "vlan" if (_isPremium) { _configDao.update("network.type", "vlan"); @@ -764,76 +756,76 @@ public class Db20to21MigrationUtil { _configDao.update("secstorage.encrypt.copy", "true"); _configDao.update("secstorage.secure.copy.cert", "realhostip"); } - + boolean externalIpAlloator = Boolean.parseBoolean(_configDao.getValue("direct.attach.network.externalIpAllocator.enabled")); String hyperVisor = _configDao.getValue("hypervisor.type"); if (hyperVisor.equalsIgnoreCase("KVM") && !externalIpAlloator) { /*For KVM, it's enabled by default*/ _configDao.update("direct.attach.network.externalIpAllocator.enabled", "true"); } - + // Save the mount parent to the configuration table String mountParent = getMountParent(); if (mountParent != null) { _configDao.update("mount.parent", mountParent); } - + if(_configDao.getValue("host") == null) { String hostIpAdr = getHost(); if (hostIpAdr != null) { _configDao.update("host", hostIpAdr); } } - + // generate a single sign-on key updateSSOKey(); } - + System.out.println("Migrating 2.1 configuration done"); } private String getEthDevice() { String defaultRoute = Script.runSimpleBashScript("/sbin/route | grep default"); - + if (defaultRoute == null) { return null; } - + String[] defaultRouteList = defaultRoute.split("\\s+"); - + if (defaultRouteList.length != 8) { return null; } - + return defaultRouteList[7]; } - + protected String getHost() { NetworkInterface nic = null; String pubNic = getEthDevice(); - + if (pubNic == null) { return null; } - + try { nic = NetworkInterface.getByName(pubNic); } catch (final SocketException e) { return null; } - + String[] info = NetUtils.getNetworkParams(nic); return info[0]; } - + private String getMountParent() { return getEnvironmentProperty("mount.parent"); } - + private String getEnvironmentProperty(String name) { try { final File propsFile = PropertiesUtil.findConfigFile("environment.properties"); - + if (propsFile == null) { return null; } else { @@ -847,7 +839,7 @@ public class Db20to21MigrationUtil { return null; } } - + private void updateSSOKey() { try { String encodedKey = null; @@ -862,10 +854,10 @@ public class Db20to21MigrationUtil { s_logger.error("error generating sso key", ex); } } - + private void doMigration() { setupComponents(); - + migrateZones(); migrateDomains(); migrateServiceOfferings(); @@ -873,16 +865,16 @@ public class Db20to21MigrationUtil { migrateVolumDeviceIds(); migrateVolumePoolType(); migrateConfiguration(); - + // update disk_offering_id for system VMs. As of the id-space collision for servercie_offering_ids // before and after migration, this should be done in the last step updateConsoleProxyServiceOfferingReferences(_consoleProxyServiceOfferingId); updateSecondaryStorageServiceOfferingReferences(_secStorageServiceOfferingId); updateDomainRouterServiceOfferingReferences(_domRServiceOfferingId); - + System.out.println("Migration done"); } - + private String readInput() { try { Scanner in = new Scanner(System.in); @@ -892,11 +884,11 @@ public class Db20to21MigrationUtil { return ""; } } - + private void setupComponents() { ComponentLocator.getLocator("migration", "migration-components.xml", "log4j-cloud.xml"); ComponentLocator locator = ComponentLocator.getCurrentLocator(); - + _configDao = locator.getDao(ConfigurationDao.class); _podDao = locator.getDao(HostPodDao.class); _dcDao = locator.getDao(DataCenterDao.class); @@ -916,7 +908,7 @@ public class Db20to21MigrationUtil { _routerDao = locator.getDao(DomainRouterDao.class); _poolDao = locator.getDao(StoragePoolDao.class); } - + public static void main(String[] args) { File file = PropertiesUtil.findConfigFile("log4j-cloud.xml"); @@ -926,7 +918,7 @@ public class Db20to21MigrationUtil { } else { System.out.println("Configure log4j with default properties"); } - + new Db20to21MigrationUtil().doMigration(); System.exit(0); } diff --git a/server/src/com/cloud/migration/Db21to22MigrationUtil.java b/server/src/com/cloud/migration/Db21to22MigrationUtil.java deleted file mode 100644 index 6aa06d2c926..00000000000 --- a/server/src/com/cloud/migration/Db21to22MigrationUtil.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.cloud.migration; - -import java.io.File; -import java.util.List; - -import org.apache.log4j.xml.DOMConfigurator; - -import com.cloud.configuration.ResourceCount.ResourceType; -import com.cloud.configuration.ResourceCountVO; -import com.cloud.configuration.dao.ResourceCountDao; -import com.cloud.domain.DomainVO; -import com.cloud.domain.dao.DomainDao; -import com.cloud.user.Account; -import com.cloud.user.dao.AccountDao; -import com.cloud.utils.PropertiesUtil; -import com.cloud.utils.component.ComponentLocator; -import com.cloud.utils.db.SearchBuilder; -import com.cloud.utils.db.SearchCriteria; - -public class Db21to22MigrationUtil { - private AccountDao _accountDao; - private DomainDao _domainDao; - private ResourceCountDao _resourceCountDao; - - private void doMigration() { - setupComponents(); - - migrateResourceCounts(); - - System.out.println("Migration done"); - } - - private void migrateResourceCounts() { - System.out.println("migrating resource counts"); - SearchBuilder sb = _resourceCountDao.createSearchBuilder(); - sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ); - - for (ResourceType type : ResourceType.values()) { - SearchCriteria sc = sb.create(); - sc.setParameters("type", type); - - List resourceCounts = _resourceCountDao.search(sc, null); - for (ResourceCountVO resourceCount : resourceCounts) { - if (resourceCount.getAccountId() != null) { - Account acct = _accountDao.findById(resourceCount.getAccountId()); - Long domainId = acct.getDomainId(); - while (domainId != null) { - _resourceCountDao.updateDomainCount(domainId, type, true, resourceCount.getCount()); - DomainVO domain = _domainDao.findById(domainId); - domainId = domain.getParent(); - } - } - } - } - System.out.println("done migrating resource counts"); - } - - private void setupComponents() { - ComponentLocator.getLocator("migration", "migration-components.xml", "log4j-cloud.xml"); - ComponentLocator locator = ComponentLocator.getCurrentLocator(); - - _accountDao = locator.getDao(AccountDao.class); - _domainDao = locator.getDao(DomainDao.class); - _resourceCountDao = locator.getDao(ResourceCountDao.class); - } - - public static void main(String[] args) { - File file = PropertiesUtil.findConfigFile("log4j-cloud.xml"); - - if (file != null) { - System.out.println("Log4j configuration from : " + file.getAbsolutePath()); - DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); - } else { - System.out.println("Configure log4j with default properties"); - } - - new Db21to22MigrationUtil().doMigration(); - System.exit(0); - } -} diff --git a/server/src/com/cloud/migration/ServiceOffering20VO.java b/server/src/com/cloud/migration/ServiceOffering20VO.java index bff56722ed3..fa67d32fa51 100644 --- a/server/src/com/cloud/migration/ServiceOffering20VO.java +++ b/server/src/com/cloud/migration/ServiceOffering20VO.java @@ -11,7 +11,7 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.utils.db.GenericDao; @Entity diff --git a/server/src/com/cloud/migration/ServiceOffering21VO.java b/server/src/com/cloud/migration/ServiceOffering21VO.java index 324e6143135..232a143d55c 100644 --- a/server/src/com/cloud/migration/ServiceOffering21VO.java +++ b/server/src/com/cloud/migration/ServiceOffering21VO.java @@ -9,7 +9,7 @@ import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; import javax.persistence.Transient; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; @Entity @Table(name="service_offering_21") diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 8674a892ea8..9baac17cf86 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -27,7 +27,10 @@ import com.cloud.dc.HostPodVO; import com.cloud.dc.VlanVO; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceAllocationException; +import com.cloud.host.HostVO; +import com.cloud.network.FirewallRuleVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.user.AccountVO; import com.cloud.utils.component.Manager; @@ -64,7 +67,7 @@ public interface NetworkManager extends Manager { * @param offering service offering associated with this request * @return DomainRouterVO if created. null if not. */ - DomainRouterVO createRouter(long accountId, String ipAddress, long dcId, String domain, ServiceOfferingVO offering, long startEventId) throws ConcurrentOperationException; + DomainRouterVO createRouter(long accountId, String ipAddress, long dcId, String domain, ServiceOfferingVO offering) throws ConcurrentOperationException; /** * create a DHCP server/user data server for directly connected VMs @@ -136,7 +139,7 @@ public interface NetworkManager extends Manager { * @param so service offering associated with this request * @return public ip address. */ - public String assignSourceNatIpAddress(AccountVO account, DataCenterVO dc, String domain, ServiceOfferingVO so, long startEventId) throws ResourceAllocationException; + public String assignSourceNatIpAddress(AccountVO account, DataCenterVO dc, String domain, ServiceOfferingVO so) throws ResourceAllocationException; /** * @param fwRules list of rules to be updated @@ -195,7 +198,7 @@ public interface NetworkManager extends Manager { * * @throws ConcurrentOperationException if multiple starts are being attempted. */ - public DomainRouterVO addVirtualMachineToGuestNetwork(UserVmVO vm, String password, long startEventId) throws ConcurrentOperationException; + public DomainRouterVO addVirtualMachineToGuestNetwork(UserVmVO vm, String password) throws ConcurrentOperationException; String createZoneVlan(DomainRouterVO router); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 9a49c93c977..ab0a44160d7 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -40,8 +40,6 @@ import com.cloud.agent.api.CreateZoneVlanAnswer; import com.cloud.agent.api.CreateZoneVlanCommand; import com.cloud.agent.api.MigrateCommand; import com.cloud.agent.api.ModifySshKeysCommand; -import com.cloud.agent.api.NetworkUsageAnswer; -import com.cloud.agent.api.NetworkUsageCommand; import com.cloud.agent.api.PrepareForMigrationCommand; import com.cloud.agent.api.RebootAnswer; import com.cloud.agent.api.RebootRouterCommand; @@ -101,8 +99,9 @@ import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.SecurityGroupVMMapDao; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.network.listener.RouterStatsListener; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePoolVO; @@ -125,7 +124,6 @@ import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.StringUtils; import com.cloud.utils.component.ComponentLocator; -import com.cloud.utils.component.Inject; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; import com.cloud.utils.db.SearchBuilder; @@ -154,39 +152,37 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager private static final Logger s_logger = Logger.getLogger(NetworkManagerImpl.class); String _name; - @Inject DataCenterDao _dcDao = null; - @Inject VlanDao _vlanDao = null; - @Inject FirewallRulesDao _rulesDao = null; - @Inject SecurityGroupVMMapDao _securityGroupVMMapDao = null; - @Inject LoadBalancerDao _loadBalancerDao = null; - @Inject IPAddressDao _ipAddressDao = null; - @Inject VMTemplateDao _templateDao = null; - @Inject DiskTemplateDao _diskDao = null; - @Inject DomainRouterDao _routerDao = null; - @Inject UserDao _userDao = null; - @Inject AccountDao _accountDao = null; - @Inject DomainDao _domainDao = null; - @Inject UserStatisticsDao _userStatsDao = null; - @Inject VolumeDao _volsDao = null; - @Inject HostDao _hostDao = null; - @Inject EventDao _eventDao = null; - @Inject ConfigurationDao _configDao; - @Inject HostPodDao _podDao = null; - @Inject VMTemplateHostDao _vmTemplateHostDao = null; - @Inject UserVmDao _vmDao = null; - @Inject ResourceLimitDao _limitDao = null; - @Inject CapacityDao _capacityDao = null; - @Inject AgentManager _agentMgr; - @Inject StorageManager _storageMgr; - @Inject HighAvailabilityManager _haMgr; - @Inject AlertManager _alertMgr; - @Inject AccountManager _accountMgr; - @Inject ConfigurationManager _configMgr; - @Inject AsyncJobManager _asyncMgr; - @Inject StoragePoolDao _storagePoolDao = null; - @Inject ServiceOfferingDao _serviceOfferingDao = null; - @Inject - private UserStatisticsDao _statsDao; + DataCenterDao _dcDao = null; + VlanDao _vlanDao = null; + FirewallRulesDao _rulesDao = null; + SecurityGroupVMMapDao _securityGroupVMMapDao = null; + LoadBalancerDao _loadBalancerDao = null; + IPAddressDao _ipAddressDao = null; + VMTemplateDao _templateDao = null; + DiskTemplateDao _diskDao = null; + DomainRouterDao _routerDao = null; + UserDao _userDao = null; + AccountDao _accountDao = null; + DomainDao _domainDao = null; + UserStatisticsDao _userStatsDao = null; + VolumeDao _volsDao = null; + HostDao _hostDao = null; + EventDao _eventDao = null; + ConfigurationDao _configDao; + HostPodDao _podDao = null; + VMTemplateHostDao _vmTemplateHostDao = null; + UserVmDao _vmDao = null; + ResourceLimitDao _limitDao = null; + CapacityDao _capacityDao = null; + AgentManager _agentMgr; + StorageManager _storageMgr; + HighAvailabilityManager _haMgr; + AlertManager _alertMgr; + AccountManager _accountMgr; + ConfigurationManager _configMgr; + AsyncJobManager _asyncMgr; + StoragePoolDao _storagePoolDao = null; + ServiceOfferingDao _serviceOfferingDao = null; long _routerTemplateId = -1; int _routerRamSize; @@ -195,7 +191,6 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager String _domain; String _instance; int _routerCleanupInterval = 3600; - int _routerStatsInterval = 300; private ServiceOfferingVO _offering; private VMTemplateVO _template; @@ -217,7 +212,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } @Override @DB - public String assignSourceNatIpAddress(AccountVO account, final DataCenterVO dc, final String domain, final ServiceOfferingVO serviceOffering, long startEventId) throws ResourceAllocationException { + public String assignSourceNatIpAddress(AccountVO account, final DataCenterVO dc, final String domain, final ServiceOfferingVO serviceOffering) throws ResourceAllocationException { if (serviceOffering.getGuestIpType() == GuestIpType.DirectDual || serviceOffering.getGuestIpType() == GuestIpType.DirectSingle) { return null; } @@ -244,7 +239,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager s_logger.debug("lock account " + accountId + " is acquired"); boolean isAccountIP = false; - List addrs = listPublicIpAddressesInVirtualNetwork(account.getId(), dcId, true); + List addrs = listPublicIpAddressesInVirtualNetwork(account.getId(), dcId, true); if (addrs.size() == 0) { // Check that the maximum number of public IPs for the given accountId will not be exceeded @@ -313,7 +308,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager DomainRouterVO router = null; try { - router = createRouter(account.getId(), sourceNat, dcId, domain, serviceOffering, startEventId); + router = createRouter(account.getId(), sourceNat, dcId, domain, serviceOffering); } catch (final Exception e) { s_logger.error("Unable to create router for " + account.getAccountName(), e); } @@ -389,39 +384,39 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } String mgmtNetmask = NetUtils.getCidrNetmask(pod.getCidrSize()); final String guestIp = _ipAddressDao.assignIpAddress(accountIdForDHCPServer, domainIdForDHCPServer, guestVlan.getId(), false); + + router = + new DomainRouterVO(id, + name, + mgmtMacAddress, + null, + mgmtNetmask, + _routerTemplateId, + rtrTemplate.getGuestOSId(), + guestMacAddress, + guestIp, + guestVlan.getVlanNetmask(), + accountIdForDHCPServer, + domainIdForDHCPServer, + "FE:FF:FF:FF:FF:FF", + null, + "255.255.255.255", + guestVlan.getId(), + guestVlan.getVlanId(), + pod.getId(), + dc.getId(), + _routerRamSize, + guestVlan.getVlanGateway(), + domainNameForDHCPServer, + dc.getDns1(), + dc.getDns2()); + router.setRole(Role.DHCP_USERDATA); + router.setVnet(guestVlan.getVlanId()); - router = - new DomainRouterVO(id, - name, - mgmtMacAddress, - null, - mgmtNetmask, - _routerTemplateId, - rtrTemplate.getGuestOSId(), - guestMacAddress, - guestIp, - guestVlan.getVlanNetmask(), - accountIdForDHCPServer, - domainIdForDHCPServer, - "FE:FF:FF:FF:FF:FF", - null, - "255.255.255.255", - guestVlan.getId(), - guestVlan.getVlanId(), - pod.getId(), - dc.getId(), - _routerRamSize, - guestVlan.getVlanGateway(), - domainNameForDHCPServer, - dc.getDns1(), - dc.getDns2()); - router.setRole(Role.DHCP_USERDATA); - router.setVnet(guestVlan.getVlanId()); - - router.setLastHostId(candidateHost); + router.setLastHostId(candidateHost); txn.start(); - router = _routerDao.persist(router); + router = _routerDao.persist(router); router = _routerDao.acquire(router.getId()); if (router == null) { s_logger.debug("Unable to acquire lock on router " + id); @@ -432,14 +427,14 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager txn.commit(); - List vols = _storageMgr.create(account, router, rtrTemplate, dc, pod, _offering, null); - if (vols == null){ - _ipAddressDao.unassignIpAddress(guestIp); - _routerDao.delete(router.getId()); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to create dhcp server in storage host or pool in pod " + pod.getName() + " (id:" + pod.getId() + ")"); - } - } + List vols = _storageMgr.create(account, router, rtrTemplate, dc, pod, _offering, null); + if (vols == null){ + _ipAddressDao.unassignIpAddress(guestIp); + _routerDao.delete(router.getId()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to create dhcp server in storage host or pool in pod " + pod.getName() + " (id:" + pod.getId() + ")"); + } + } final EventVO event = new EventVO(); event.setUserId(userId); @@ -498,9 +493,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } @Override @DB - public DomainRouterVO createRouter(final long accountId, final String publicIpAddress, final long dataCenterId, - String domain, final ServiceOfferingVO offering, long startEventId) - throws ConcurrentOperationException { + public DomainRouterVO createRouter(final long accountId, final String publicIpAddress, final long dataCenterId, String domain, final ServiceOfferingVO offering) throws ConcurrentOperationException { if (s_logger.isDebugEnabled()) { s_logger.debug("Creating a router for account=" + accountId + "; publicIpAddress=" + publicIpAddress + "; dc=" + dataCenterId + "domain=" + domain); } @@ -515,25 +508,14 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager final Transaction txn = Transaction.currentTxn(); DomainRouterVO router = null; - boolean success = false; try { router = _routerDao.findBy(accountId, dataCenterId); if (router != null && router.getState() != State.Creating) { if (s_logger.isDebugEnabled()) { s_logger.debug("Router " + router.toString() + " found for account " + accountId + " in data center " + dataCenterId); } - success = true; return router; } - EventVO event = new EventVO(); - event.setUserId(1L); - event.setAccountId(accountId); - event.setType(EventTypes.EVENT_ROUTER_CREATE); - event.setState(EventState.Started); - event.setStartId(startEventId); - event.setDescription("Creating Router for account with Id: "+accountId); - event = _eventDao.persist(event); - final DataCenterVO dc = _dcDao.findById(dataCenterId); final VMTemplateVO template = _templateDao.findRoutingTemplate(); @@ -618,21 +600,24 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager avoids.add(pod.first().getId()); } + final EventVO event = new EventVO(); + event.setUserId(1L); // system user performed the action + event.setAccountId(accountId); + event.setType(EventTypes.EVENT_ROUTER_CREATE); + if (!found) { + event.setDescription("failed to create Domain Router : " + router.getName()); + event.setLevel(EventVO.LEVEL_ERROR); + _eventDao.persist(event); throw new ExecutionException("Unable to create DomainRouter"); } _routerDao.updateIf(router, Event.OperationSucceeded, null); s_logger.debug("Router created: id=" + router.getId() + "; name=" + router.getName()); - - event = new EventVO(); - event.setUserId(1L); // system user performed the action - event.setAccountId(accountId); - event.setType(EventTypes.EVENT_ROUTER_CREATE); - event.setStartId(startEventId); + event.setDescription("successfully created Domain Router : " + router.getName() + " with ip : " + publicIpAddress); _eventDao.persist(event); - success = true; + return router; } catch (final Throwable th) { if (th instanceof ExecutionException) { @@ -652,16 +637,6 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager s_logger.debug("Releasing lock on account " + account.getId() + " for createRouter"); _accountDao.release(account.getId()); } - if(!success){ - EventVO event = new EventVO(); - event.setUserId(1L); // system user performed the action - event.setAccountId(accountId); - event.setType(EventTypes.EVENT_ROUTER_CREATE); - event.setStartId(startEventId); - event.setLevel(EventVO.LEVEL_ERROR); - event.setDescription("Failed to create router for account " + accountId + " in data center " + dataCenterId); - _eventDao.persist(event); - } } } @@ -774,7 +749,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } @Override @DB - public DomainRouterVO start(long routerId, long startEventId) throws StorageUnavailableException, ConcurrentOperationException { + public DomainRouterVO start(long routerId, long eventId) throws StorageUnavailableException, ConcurrentOperationException { AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); if (asyncExecutor != null) { AsyncJobVO job = asyncExecutor.getJob(); @@ -792,14 +767,12 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager if(s_logger.isDebugEnabled()) s_logger.debug("Lock on router " + routerId + " is acquired"); - boolean started = false; try { final State state = router.getState(); if (state == State.Running) { if (s_logger.isDebugEnabled()) { s_logger.debug("Router is already started: " + router.toString()); } - started = true; return router; } @@ -809,14 +782,8 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager event.setType(EventTypes.EVENT_ROUTER_START); event.setState(EventState.Started); event.setDescription("Starting Router with Id: "+routerId); - event.setStartId(startEventId); - event = _eventDao.persist(event); - - if(startEventId == 0){ - // When route start is not asynchronous, use id of the Started event instead of Scheduled event - startEventId = event.getId(); - } - + event.setStartId(eventId); + _eventDao.persist(event); if (state == State.Destroyed || state == State.Expunging || router.getRemoved() != null) { s_logger.debug("Starting a router that's can not be started: " + router.toString()); @@ -849,12 +816,13 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager String vnet = null; boolean vnetAllocated = false; final boolean mirroredVols = router.isMirroredVols(); + boolean started = false; try { event = new EventVO(); event.setUserId(1L); event.setAccountId(router.getAccountId()); event.setType(EventTypes.EVENT_ROUTER_START); - event.setStartId(startEventId); + event.setStartId(eventId); final List vms = _vmDao.listBy(routerId, State.Starting, State.Running, State.Stopped, State.Stopping); if (vms.size() != 0) { // Find it in the existing network. @@ -864,12 +832,6 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } } } - - if (vnet != null) { - s_logger.debug("Router: " + router.getName() + " discovered vnet: " + vnet + " from existing VMs."); - } else { - s_logger.debug("Router: " + router.getName() + " was unable to discover vnet from existing VMs. Acquiring new vnet."); - } String routerMacAddress = null; if (vnet == null && router.getRole() == Role.DHCP_FIREWALL_LB_PASSWD_USERDATA) { // If not found, then get another one. @@ -985,6 +947,9 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager if (routingHost == null || retry <= 0) { + event.setDescription("unable to start Domain Router: " + router.getName()); + event.setLevel(EventVO.LEVEL_ERROR); + _eventDao.persist(event); throw new ExecutionException("Couldn't find a routingHost"); } @@ -1039,16 +1004,6 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager s_logger.debug("Releasing lock on router " + routerId); _routerDao.release(routerId); } - if (!started){ - EventVO event = new EventVO(); - event.setUserId(1L); - event.setAccountId(router.getAccountId()); - event.setType(EventTypes.EVENT_ROUTER_START); - event.setDescription("Failed to start Router with Id: "+routerId); - event.setLevel(EventVO.LEVEL_ERROR); - event.setStartId(startEventId); - _eventDao.persist(event); - } } } @@ -1760,6 +1715,16 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterMonitor")); final ComponentLocator locator = ComponentLocator.getCurrentLocator(); + _configDao = locator.getDao(ConfigurationDao.class); + if (_configDao == null) { + throw new ConfigurationException("Unable to get the configuration dao."); + } + + _configMgr = locator.getManager(ConfigurationManager.class); + if (_configMgr == null) { + throw new ConfigurationException("Unable to get the configuration manager."); + } + final Map configs = _configDao.getConfiguration("AgentManager", params); _routerTemplateId = NumbersUtil.parseInt(configs.get("router.template.id"), 1); @@ -1776,7 +1741,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager _retry = NumbersUtil.parseInt(value, 2); value = configs.get("router.stats.interval"); - _routerStatsInterval = NumbersUtil.parseInt(value, 300); + final int routerStatsInterval = NumbersUtil.parseInt(value, 300); value = configs.get("router.cleanup.interval"); _routerCleanupInterval = NumbersUtil.parseInt(value, 3600); @@ -1793,14 +1758,161 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager s_logger.info("Router configurations: " + "ramsize=" + _routerRamSize + "; templateId=" + _routerTemplateId); + _hostDao = locator.getDao(HostDao.class); + if (_hostDao == null) { + throw new ConfigurationException("Unable to get " + HostDao.class.getName()); + } + + _routerDao = locator.getDao(DomainRouterDao.class); + if (_hostDao == null) { + throw new ConfigurationException("Unable to get " + DomainRouterDao.class.getName()); + } + + _storagePoolDao = locator.getDao(StoragePoolDao.class); + if (_storagePoolDao == null) { + throw new ConfigurationException("Unable to find " + StoragePoolDao.class); + } + + _serviceOfferingDao = locator.getDao(ServiceOfferingDao.class); + if (_serviceOfferingDao == null) { + throw new ConfigurationException("Unable to find " + ServiceOfferingDao.class); + } + + _podDao = locator.getDao(HostPodDao.class); + if (_podDao == null) { + throw new ConfigurationException("Unable to get " + HostPodDao.class.getName()); + } + + _userDao = locator.getDao(UserDao.class); + if (_userDao == null) { + throw new ConfigurationException("Unable to get " + UserDao.class.getName()); + } + + _accountDao = locator.getDao(AccountDao.class); + if (_accountDao == null) { + throw new ConfigurationException("Unable to get " + AccountDao.class.getName()); + } + + _domainDao = locator.getDao(DomainDao.class); + if (_domainDao == null) { + throw new ConfigurationException("Unable to get " + DomainDao.class.getName()); + } + + _limitDao = locator.getDao(ResourceLimitDao.class); + if (_limitDao == null) { + throw new ConfigurationException("Unable to get " + ResourceLimitDao.class.getName()); + } + + _userStatsDao = locator.getDao(UserStatisticsDao.class); + if (_userStatsDao == null) { + throw new ConfigurationException("Unable to get " + UserStatisticsDao.class.getName()); + } + + _rulesDao = locator.getDao(FirewallRulesDao.class); + if (_rulesDao == null) { + throw new ConfigurationException("Unable to get " + FirewallRulesDao.class.getName()); + } + + _securityGroupVMMapDao = locator.getDao(SecurityGroupVMMapDao.class); + if (_securityGroupVMMapDao == null) { + throw new ConfigurationException("Unable to get " + SecurityGroupVMMapDao.class.getName()); + } + + _loadBalancerDao = locator.getDao(LoadBalancerDao.class); + if (_loadBalancerDao == null) { + throw new ConfigurationException("Unable to get " + LoadBalancerDao.class.getName()); + } + + _ipAddressDao = locator.getDao(IPAddressDao.class); + if (_ipAddressDao == null) { + throw new ConfigurationException("Unable to get " + IPAddressDao.class.getName()); + } + + _dcDao = locator.getDao(DataCenterDao.class); + if (_dcDao == null) { + throw new ConfigurationException("Unable to get " + DataCenterDao.class.getName()); + } + + _vlanDao = locator.getDao(VlanDao.class); + if (_vlanDao == null) { + throw new ConfigurationException("Unable to get " + VlanDao.class.getName()); + } + + _volsDao = locator.getDao(VolumeDao.class); + if (_volsDao == null) { + throw new ConfigurationException("Unable to get " + VolumeDao.class.getName()); + } + + _templateDao = locator.getDao(VMTemplateDao.class); + if (_templateDao == null) { + throw new ConfigurationException("Unable to get " + VMTemplateDao.class.getName()); + } + + _diskDao = locator.getDao(DiskTemplateDao.class); + if (_diskDao == null) { + throw new ConfigurationException("Unable to get " + DiskTemplateDao.class.getName()); + } + + _vmTemplateHostDao = locator.getDao(VMTemplateHostDao.class); + if (_vmTemplateHostDao == null) { + throw new ConfigurationException("Unable to get " + VMTemplateHostDao.class.getName()); + } + + _eventDao = locator.getDao(EventDao.class); + if (_eventDao == null) { + throw new ConfigurationException("unable to get " + EventDao.class.getName()); + } + + _vmDao = locator.getDao(UserVmDao.class); + if (_vmDao == null) { + throw new ConfigurationException("Unable to get " + UserVmDao.class.getName()); + } + final UserStatisticsDao statsDao = locator.getDao(UserStatisticsDao.class); if (statsDao == null) { throw new ConfigurationException("Unable to get " + UserStatisticsDao.class.getName()); } + _capacityDao = locator.getDao(CapacityDao.class); + if (_capacityDao == null) { + throw new ConfigurationException("Unable to get " + CapacityDao.class.getName()); + } + + _agentMgr = locator.getManager(AgentManager.class); + if (_agentMgr == null) { + throw new ConfigurationException("Unable to get " + AgentManager.class.getName()); + } + + _agentMgr.registerForHostEvents(ComponentLocator.inject(RouterStatsListener.class, routerStatsInterval), true, false, false); _agentMgr.registerForHostEvents(new SshKeysDistriMonitor(this, _hostDao, _configDao), true, false, false); + + _storageMgr = locator.getManager(StorageManager.class); + if (_storageMgr == null) { + throw new ConfigurationException("Unable to get " + StorageManager.class.getName()); + } + + _haMgr = locator.getManager(HighAvailabilityManager.class); + if (_haMgr == null) { + throw new ConfigurationException("Unable to get " + HighAvailabilityManager.class.getName()); + } + _haMgr.registerHandler(VirtualMachine.Type.DomainRouter, this); + _alertMgr = locator.getManager(AlertManager.class); + if (_alertMgr == null) { + throw new ConfigurationException("Unable to get " + AlertManager.class.getName()); + } + + _accountMgr = locator.getManager(AccountManager.class); + if (_accountMgr == null) { + throw new ConfigurationException("Unable to get " + AccountManager.class.getName()); + } + + _asyncMgr = locator.getManager(AsyncJobManager.class); + if (_asyncMgr == null) { + throw new ConfigurationException("Unable to get " + AsyncJobManager.class.getName()); + } + boolean useLocalStorage = Boolean.parseBoolean((String)params.get(Config.SystemVMUseLocalStorage.key())); _offering = new ServiceOfferingVO("Fake Offering For DomR", 1, _routerRamSize, 0, 0, 0, false, null, GuestIpType.Virtualized, useLocalStorage, true, null); _offering.setUniqueName("Cloud.Com-SoftwareRouter"); @@ -1823,7 +1935,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager @Override public boolean start() { _executor.scheduleAtFixedRate(new RouterCleanupTask(), _routerCleanupInterval, _routerCleanupInterval, TimeUnit.SECONDS); - _executor.scheduleAtFixedRate(new NetworkUsageTask(), _routerStatsInterval, _routerStatsInterval, TimeUnit.SECONDS); + return true; } @@ -1869,6 +1981,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } router.setVnet(null); + router.setStorageIp(null); String privateIpAddress = router.getPrivateIpAddress(); @@ -1980,7 +2093,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager return false; } - final StopCommand stop = new StopCommand(router, router.getInstanceName(), router.getVnet(), router.getPrivateIpAddress()); + final StopCommand stop = new StopCommand(router, router.getInstanceName(), router.getVnet()); Answer answer = null; boolean stopped = false; @@ -2154,9 +2267,9 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } @Override - public DomainRouterVO addVirtualMachineToGuestNetwork(UserVmVO vm, String password, long startEventId) throws ConcurrentOperationException { + public DomainRouterVO addVirtualMachineToGuestNetwork(UserVmVO vm, String password) throws ConcurrentOperationException { try { - DomainRouterVO router = start(vm.getDomainRouterId(), startEventId); + DomainRouterVO router = start(vm.getDomainRouterId(), 0); if (router == null) { s_logger.error("Can't find a domain router to start VM: " + vm.getName()); return null; @@ -2278,7 +2391,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager virtualNetworkVlanSB.and("vlanType", virtualNetworkVlanSB.entity().getVlanType(), SearchCriteria.Op.EQ); ipAddressSB.join("virtualNetworkVlanSB", virtualNetworkVlanSB, ipAddressSB.entity().getVlanDbId(), virtualNetworkVlanSB.entity().getId()); - SearchCriteria ipAddressSC = ipAddressSB.create(); + SearchCriteria ipAddressSC = ipAddressSB.create(); ipAddressSC.setParameters("accountId", accountId); ipAddressSC.setParameters("dataCenterId", dcId); if (sourceNat != null) { @@ -2288,60 +2401,5 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager return _ipAddressDao.search(ipAddressSC, null); } - - protected class NetworkUsageTask implements Runnable { - - public NetworkUsageTask() { - } - - public void run() { - final List routers = _routerDao.listUpByHostId(null); - s_logger.debug("Found " + routers.size() + " running routers. "); - - for (DomainRouterVO router : routers) { - String privateIP = router.getPrivateIpAddress(); - if(privateIP != null){ - final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP); - final NetworkUsageAnswer answer = (NetworkUsageAnswer)_agentMgr.easySend(router.getHostId(), usageCmd); - if(answer != null){ - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - try { - if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) { - s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics"); - continue; - } - txn.start(); - UserStatisticsVO stats = _statsDao.lock(router.getAccountId(), router.getDataCenterId()); - if (stats == null) { - s_logger.warn("unable to find stats for account: " + router.getAccountId()); - continue; - } - if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. Assuming something went wrong and persisting it. Reported: " + answer.getBytesReceived() + " Stored: " + stats.getCurrentBytesReceived()); - } - stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); - } - stats.setCurrentBytesReceived(answer.getBytesReceived()); - if (stats.getCurrentBytesSent() > answer.getBytesSent()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. Assuming something went wrong and persisting it. Reported: " + answer.getBytesSent() + " Stored: " + stats.getCurrentBytesSent()); - } - stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); - } - stats.setCurrentBytesSent(answer.getBytesSent()); - _statsDao.update(stats.getId(), stats); - txn.commit(); - } catch(Exception e) { - txn.rollback(); - s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); - } finally { - txn.close(); - } - } - } - } - } - } } diff --git a/server/src/com/cloud/network/NetworkProfileVO.java b/server/src/com/cloud/network/NetworkProfileVO.java deleted file mode 100644 index 9956014b8e2..00000000000 --- a/server/src/com/cloud/network/NetworkProfileVO.java +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.cloud.network; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import com.cloud.network.Network.BroadcastDomainType; -import com.cloud.network.Network.Mode; -import com.cloud.network.Network.TrafficType; - -/** - * NetworkProfileVO contains information about a specific network. - * - */ -@Entity -@Table(name="network_profile") -public class NetworkProfileVO { - @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) - long id; - - @Column(name="mode") - @Enumerated(value=EnumType.STRING) - Mode mode; - - @Column(name="account_id") - long accountId; - - @Column(name="broadcast_domain_type") - @Enumerated(value=EnumType.STRING) - BroadcastDomainType broadcastDomainType; - - @Column(name="traffic_type") - @Enumerated(value=EnumType.STRING) - TrafficType trafficType; - - @Column(name="gateway") - String gateway; - - @Column(name="cidr") - String cidr; - - public NetworkProfileVO() { - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public Mode getMode() { - return mode; - } - - public void setMode(Mode mode) { - this.mode = mode; - } - - public long getAccountId() { - return accountId; - } - - public void setAccountId(long accountId) { - this.accountId = accountId; - } - - public BroadcastDomainType getBroadcastDomainType() { - return broadcastDomainType; - } - - public void setBroadcastDomainType(BroadcastDomainType broadcastDomainType) { - this.broadcastDomainType = broadcastDomainType; - } - - public TrafficType getTrafficType() { - return trafficType; - } - - public void setTrafficType(TrafficType trafficType) { - this.trafficType = trafficType; - } - - public String getGateway() { - return gateway; - } - - public void setGateway(String gateway) { - this.gateway = gateway; - } - - public String getCidr() { - return cidr; - } - - public void setCidr(String cidr) { - this.cidr = cidr; - } -} diff --git a/server/src/com/cloud/network/listener/RouterStatsListener.java b/server/src/com/cloud/network/listener/RouterStatsListener.java new file mode 100755 index 00000000000..595d545a3ba --- /dev/null +++ b/server/src/com/cloud/network/listener/RouterStatsListener.java @@ -0,0 +1,167 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.network.listener; + +import java.util.Collection; + +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.Listener; +import com.cloud.agent.api.AgentControlAnswer; +import com.cloud.agent.api.AgentControlCommand; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import com.cloud.agent.api.StartupCommand; +import com.cloud.agent.api.StartupRoutingCommand; +import com.cloud.agent.api.WatchNetworkAnswer; +import com.cloud.agent.api.WatchNetworkCommand; +import com.cloud.host.HostVO; +import com.cloud.host.Status; +import com.cloud.user.UserStatisticsVO; +import com.cloud.user.dao.UserStatisticsDao; +import com.cloud.utils.component.Inject; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Transaction; +import com.cloud.vm.DomainRouterVO; +import com.cloud.vm.State; +import com.cloud.vm.VirtualMachineName; +import com.cloud.vm.dao.DomainRouterDao; + +public class RouterStatsListener implements Listener { + private static final Logger s_logger = Logger.getLogger(RouterStatsListener.class); + + @Inject + private DomainRouterDao _routerDao; + @Inject + private UserStatisticsDao _statsDao; + @Inject + private AgentManager _agentMgr; + + private int _interval; + + public RouterStatsListener(int interval) { + _interval = interval; + } + + @Override + public boolean isRecurring() { + return true; + } + + @Override @DB + public boolean processAnswer(long agentId, long seq, Answer[] answers) { + for (Answer answer : answers) { + if (!(answer instanceof WatchNetworkAnswer)) { + continue; + } + WatchNetworkAnswer watch = (WatchNetworkAnswer)answer; + Collection map = watch.getAllVms(); + for (String vmName : map) { + + long id = VirtualMachineName.getRouterId(vmName); + DomainRouterVO router = _routerDao.findById(id); + if (router == null || router.isRemoved()) { + s_logger.debug("Router is removed or non existent: " + vmName); + continue; + } + + long[] bytes = watch.getStats(vmName); + if (router.getState() != State.Running) { + s_logger.debug("Not logging anything for a router that's not running: Rx " + bytes[1] + " and Tx " + bytes[0]); + continue; + } + if (s_logger.isTraceEnabled()) { + s_logger.trace("VM " + vmName + " Tx: " + bytes[0] + " Rx: " + bytes[1]); + } + Transaction txn = Transaction.currentTxn(); + try { + txn.start(); + + UserStatisticsVO stats = _statsDao.lock(router.getAccountId(), router.getDataCenterId()); + if (stats == null) { + s_logger.warn("unable to find stats for account: " + router.getAccountId()); + txn.rollback(); + continue; + } + if (stats.getCurrentBytesReceived() > bytes[1]) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. Assuming something went wrong and persisting it. Reported: " + bytes[1] + " Stored: " + stats.getCurrentBytesReceived()); + } + stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); + } + stats.setCurrentBytesReceived(bytes[1]); + if (stats.getCurrentBytesSent() > bytes[0]) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. Assuming something went wrong and persisting it. Reported: " + bytes[0] + " Stored: " + stats.getCurrentBytesSent()); + } + stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); + } + stats.setCurrentBytesSent(bytes[0]); + _statsDao.update(stats.getId(), stats); + txn.commit(); + } catch(Exception e) { + s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + " Rx: " + bytes[1] + "; Tx: " + bytes[0]); + } + } + } + return true; + } + + @Override + public boolean processCommand(long agentId, long seq, Command[] commands) { + return false; + } + + @Override + public AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd) { + return null; + } + + @Override + public boolean processDisconnect(long agentId, Status state) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Disconnected caleld on " + agentId + " with status " + state.toString()); + } + return true; + } + + @Override + public boolean processConnect(HostVO agent, StartupCommand cmd) { + if (cmd instanceof StartupRoutingCommand) { + long agentId = agent.getId(); + s_logger.debug("Sending WatchNetworkCommand to " + agentId); + WatchNetworkCommand watch = new WatchNetworkCommand(_interval); + _agentMgr.gatherStats(agentId, watch, this); + } + return true; + } + + @Override + public boolean processTimeout(long agentId, long seq) { + return true; + } + + @Override + public int getTimeout() { + return -1; + } + + protected RouterStatsListener() { + } +} diff --git a/server/src/com/cloud/network/security/NetworkGroupManager.java b/server/src/com/cloud/network/security/NetworkGroupManager.java index 75f02e0b824..2f5bdf4e15b 100644 --- a/server/src/com/cloud/network/security/NetworkGroupManager.java +++ b/server/src/com/cloud/network/security/NetworkGroupManager.java @@ -24,10 +24,10 @@ import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceInUseException; import com.cloud.server.Criteria; import com.cloud.user.AccountVO; -import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.utils.component.Manager; import com.cloud.vm.State; +import com.cloud.vm.UserVm; /** * Ensures that network firewall rules stay updated as VMs go up and down diff --git a/server/src/com/cloud/network/security/NetworkGroupManagerImpl.java b/server/src/com/cloud/network/security/NetworkGroupManagerImpl.java index 96ad145c1b6..478e8c8a166 100644 --- a/server/src/com/cloud/network/security/NetworkGroupManagerImpl.java +++ b/server/src/com/cloud/network/security/NetworkGroupManagerImpl.java @@ -59,7 +59,6 @@ import com.cloud.server.ManagementServer; import com.cloud.user.Account; import com.cloud.user.AccountVO; import com.cloud.user.dao.AccountDao; -import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; @@ -71,6 +70,7 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.State; +import com.cloud.vm.UserVm; import com.cloud.vm.dao.UserVmDao; @Local(value={NetworkGroupManager.class}) @@ -794,7 +794,7 @@ public class NetworkGroupManagerImpl implements NetworkGroupManager { sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId()); } - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (accountId != null) { sc.setParameters("accountId", accountId); if (networkGroup != null) { diff --git a/server/src/com/cloud/server/ConfigurationServer.java b/server/src/com/cloud/server/ConfigurationServer.java index 69292346ee0..b5ddb58a223 100644 --- a/server/src/com/cloud/server/ConfigurationServer.java +++ b/server/src/com/cloud/server/ConfigurationServer.java @@ -21,6 +21,7 @@ package com.cloud.server; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; + /** * ConfigurationServer is the public interface to talk to the Configuration Server. * This is the Server that is run right before the Management Server. diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index ba45f291447..3e79802dc31 100644 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@ -125,7 +125,15 @@ public class ConfigurationServerImpl implements ConfigurationServer { s_logger.debug("ConfigurationServer made secondary storage copy encrypted."); _configDao.update("secstorage.secure.copy.cert", "realhostip"); - s_logger.debug("ConfigurationServer made secondary storage copy use realhostip."); + s_logger.debug("ConfigurationServer made secondary storage copy use realhostip."); + + //Add default manual snapshot policy + SnapshotPolicyVO snapPolicy = new SnapshotPolicyVO(0L, "00", "GMT", (short)4, 0); + _snapPolicyDao.persist(snapPolicy); + + // Save Virtual Networking service offerings + _configMgr.createServiceOffering(User.UID_SYSTEM, "Small Instance, Virtual Networking", 1, 512, 500, "Small Instance, Virtual Networking, $0.05 per hour", false, false, true, null); + _configMgr.createServiceOffering(User.UID_SYSTEM, "Medium Instance, Virtual Networking", 1, 1024, 1000, "Medium Instance, Virtual Networking, $0.10 per hour", false, false, true, null); } boolean externalIpAlloator = Boolean.parseBoolean(_configDao.getValue("direct.attach.network.externalIpAllocator.enabled")); @@ -138,18 +146,12 @@ public class ConfigurationServerImpl implements ConfigurationServer { // Save Direct Networking service offerings _configMgr.createServiceOffering(User.UID_SYSTEM, "Small Instance, Direct Networking", 1, 512, 500, "Small Instance, Direct Networking, $0.05 per hour", false, false, false, null); _configMgr.createServiceOffering(User.UID_SYSTEM, "Medium Instance, Direct Networking", 1, 1024, 1000, "Medium Instance, Direct Networking, $0.10 per hour", false, false, false, null); - // Save Virtual Networking service offerings - _configMgr.createServiceOffering(User.UID_SYSTEM, "Small Instance, Virtual Networking", 1, 512, 500, "Small Instance, Virtual Networking, $0.05 per hour", false, false, true, null); - _configMgr.createServiceOffering(User.UID_SYSTEM, "Medium Instance, Virtual Networking", 1, 1024, 1000, "Medium Instance, Virtual Networking, $0.10 per hour", false, false, true, null); + // Save default disk offerings - _configMgr.createDiskOffering(DomainVO.ROOT_DOMAIN, "Small", "Small Disk, 5 GB", 5, null); - _configMgr.createDiskOffering(DomainVO.ROOT_DOMAIN, "Medium", "Medium Disk, 20 GB", 20, null); - _configMgr.createDiskOffering(DomainVO.ROOT_DOMAIN, "Large", "Large Disk, 100 GB", 100, null); + _configMgr.createDiskOffering(DomainVO.ROOT_DOMAIN, "Small", "Small Disk, 5 GB", 5, false, null); + _configMgr.createDiskOffering(DomainVO.ROOT_DOMAIN, "Medium", "Medium Disk, 20 GB", 20, false, null); + _configMgr.createDiskOffering(DomainVO.ROOT_DOMAIN, "Large", "Large Disk, 100 GB", 100, false, null); - //Add default manual snapshot policy - SnapshotPolicyVO snapPolicy = new SnapshotPolicyVO(0L, "00", "GMT", (short)4, 0); - _snapPolicyDao.persist(snapPolicy); - // Save the mount parent to the configuration table String mountParent = getMountParent(); if (mountParent != null) { @@ -229,7 +231,7 @@ public class ConfigurationServerImpl implements ConfigurationServer { */ private String[] getGatewayAndNetmask() { - String defaultRoute = Script.runSimpleBashScript("/sbin/ip route | grep default"); + String defaultRoute = Script.runSimpleBashScript("/sbin/route | grep default"); if (defaultRoute == null) { return null; @@ -237,12 +239,12 @@ public class ConfigurationServerImpl implements ConfigurationServer { String[] defaultRouteList = defaultRoute.split("\\s+"); - if (defaultRouteList.length != 7) { + if (defaultRouteList.length != 8) { return null; } - String gateway = defaultRouteList[2]; - String ethDevice = defaultRouteList[4]; + String gateway = defaultRouteList[1]; + String ethDevice = defaultRouteList[7]; String netmask = null; if (ethDevice != null) { @@ -412,7 +414,7 @@ public class ConfigurationServerImpl implements ConfigurationServer { } String already = _configDao.getValue("ssh.privatekey"); - if (already == null || already.isEmpty()) { + if (already == null) { if (s_logger.isInfoEnabled()) { s_logger.info("Need to store in the database"); } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 3a87d379d15..af98dff3217 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -26,6 +26,7 @@ import java.net.URLEncoder; import java.net.UnknownHostException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -38,7 +39,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.StringTokenizer; import java.util.TimeZone; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -59,11 +59,9 @@ import com.cloud.alert.AlertManager; import com.cloud.alert.AlertVO; import com.cloud.alert.dao.AlertDao; import com.cloud.api.BaseCmd; -import com.cloud.api.ServerApiException; import com.cloud.api.commands.AssociateIPAddrCmd; import com.cloud.api.commands.AuthorizeNetworkGroupIngressCmd; import com.cloud.api.commands.CancelMaintenanceCmd; -import com.cloud.api.commands.CancelPrimaryStorageMaintenanceCmd; import com.cloud.api.commands.CopyTemplateCmd; import com.cloud.api.commands.CreatePortForwardingServiceRuleCmd; import com.cloud.api.commands.CreateTemplateCmd; @@ -73,7 +71,6 @@ import com.cloud.api.commands.DeleteTemplateCmd; import com.cloud.api.commands.DeleteUserCmd; import com.cloud.api.commands.DeployVMCmd; import com.cloud.api.commands.PrepareForMaintenanceCmd; -import com.cloud.api.commands.PreparePrimaryStorageForMaintenanceCmd; import com.cloud.api.commands.ReconnectHostCmd; import com.cloud.api.commands.StartRouterCmd; import com.cloud.api.commands.StartSystemVMCmd; @@ -103,15 +100,15 @@ import com.cloud.async.executor.SecurityGroupParam; import com.cloud.async.executor.UpdateLoadBalancerParam; import com.cloud.async.executor.UpgradeVMParam; import com.cloud.async.executor.VMOperationParam; -import com.cloud.async.executor.VMOperationParam.VmOp; import com.cloud.async.executor.VolumeOperationParam; +import com.cloud.async.executor.VMOperationParam.VmOp; import com.cloud.async.executor.VolumeOperationParam.VolumeOp; import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ConfigurationVO; -import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.ResourceLimitVO; +import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ResourceLimitDao; import com.cloud.consoleproxy.ConsoleProxyManager; @@ -121,8 +118,8 @@ import com.cloud.dc.DataCenterIpAddressVO; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.PodVlanMapVO; -import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.VlanVO; +import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.dao.AccountVlanMapDao; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; @@ -140,7 +137,6 @@ import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.DiscoveryException; import com.cloud.exception.InsufficientAddressCapacityException; -import com.cloud.exception.InsufficientStorageCapacityException; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.NetworkRuleConflictException; @@ -175,35 +171,38 @@ import com.cloud.network.security.NetworkGroupManager; import com.cloud.network.security.NetworkGroupRulesVO; import com.cloud.network.security.NetworkGroupVO; import com.cloud.network.security.dao.NetworkGroupDao; -import com.cloud.offering.ServiceOffering; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.pricing.PricingVO; +import com.cloud.pricing.dao.PricingDao; import com.cloud.serializer.GsonHelper; import com.cloud.server.auth.UserAuthenticator; +import com.cloud.service.ServiceOffering; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.DiskTemplateVO; import com.cloud.storage.GuestOS; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.storage.GuestOSVO; +import com.cloud.storage.InsufficientStorageCapacityException; import com.cloud.storage.LaunchPermissionVO; import com.cloud.storage.Snapshot; -import com.cloud.storage.Snapshot.SnapshotType; import com.cloud.storage.SnapshotPolicyVO; import com.cloud.storage.SnapshotScheduleVO; import com.cloud.storage.SnapshotVO; import com.cloud.storage.Storage; -import com.cloud.storage.Storage.FileSystem; -import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StorageStats; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.VolumeStats; import com.cloud.storage.VolumeVO; +import com.cloud.storage.Snapshot.SnapshotType; +import com.cloud.storage.Storage.FileSystem; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.dao.DiskOfferingDao; import com.cloud.storage.dao.DiskTemplateDao; import com.cloud.storage.dao.GuestOSCategoryDao; @@ -213,9 +212,9 @@ import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.SnapshotPolicyDao; import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.storage.dao.VMTemplateDao.TemplateFilter; import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VMTemplateDao.TemplateFilter; import com.cloud.storage.preallocatedlun.PreallocatedLunVO; import com.cloud.storage.preallocatedlun.dao.PreallocatedLunDao; import com.cloud.storage.secondary.SecondaryStorageVmManager; @@ -235,14 +234,13 @@ import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserAccountDao; import com.cloud.user.dao.UserDao; import com.cloud.user.dao.UserStatisticsDao; -import com.cloud.uservm.UserVm; import com.cloud.utils.DateUtil; -import com.cloud.utils.DateUtil.IntervalType; import com.cloud.utils.EnumUtils; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.PasswordGenerator; import com.cloud.utils.StringUtils; +import com.cloud.utils.DateUtil.IntervalType; import com.cloud.utils.component.Adapters; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.concurrency.NamedThreadFactory; @@ -261,6 +259,7 @@ import com.cloud.vm.DomainRouter; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.SecondaryStorageVmVO; import com.cloud.vm.State; +import com.cloud.vm.UserVm; import com.cloud.vm.UserVmManager; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; @@ -310,6 +309,7 @@ public class ManagementServerImpl implements ManagementServer { private final VMTemplateDao _templateDao; private final VMTemplateHostDao _templateHostDao; private final LaunchPermissionDao _launchPermissionDao; + private final PricingDao _pricingDao; private final DomainDao _domainDao; private final AccountDao _accountDao; private final ResourceLimitDao _resourceLimitDao; @@ -406,6 +406,7 @@ public class ManagementServerImpl implements ManagementServer { _templateDao = locator.getDao(VMTemplateDao.class); _templateHostDao = locator.getDao(VMTemplateHostDao.class); _launchPermissionDao = locator.getDao(LaunchPermissionDao.class); + _pricingDao = locator.getDao(PricingDao.class); _domainDao = locator.getDao(DomainDao.class); _accountDao = locator.getDao(AccountDao.class); _resourceLimitDao = locator.getDao(ResourceLimitDao.class); @@ -974,7 +975,7 @@ public class ManagementServerImpl implements ManagementServer { if (securityGroups != null) { for (SecurityGroupVO securityGroup : securityGroups) { // All vm instances have been destroyed, delete the security group -> instance_id mappings - SearchCriteria sc = _securityGroupVMMapDao.createSearchCriteria(); + SearchCriteria sc = _securityGroupVMMapDao.createSearchCriteria(); sc.addAnd("securityGroupId", SearchCriteria.Op.EQ, securityGroup.getId()); _securityGroupVMMapDao.delete(sc); @@ -1239,7 +1240,7 @@ public class ManagementServerImpl implements ManagementServer { /* * Save event after starting execution of an async job */ - public Long saveStartedEvent(Long userId, Long accountId, String type, String description, long startEventId) { + private Long saveStartedEvent(Long userId, Long accountId, String type, String description, long startEventId) { EventVO event = new EventVO(); event.setUserId(userId); event.setAccountId(accountId); @@ -1317,8 +1318,7 @@ public class ManagementServerImpl implements ManagementServer { return event.getId(); } - @Override - public Long saveEvent(Long userId, Long accountId, String level, String type, String description, String params, long startEventId) { + private Long saveEvent(Long userId, Long accountId, String level, String type, String description, String params, long startEventId) { EventVO event = new EventVO(); event.setUserId(userId); event.setAccountId(accountId); @@ -1451,19 +1451,20 @@ public class ManagementServerImpl implements ManagementServer { List ipAddrsList = new ArrayList(); for (VlanVO vlan : vlansForAccount){ ipAddrsList.addAll(_publicIpAddressDao.assignAcccountSpecificIps(accountId, account.getDomainId().longValue(), vlan.getId(), false)); - + long size = ipAddrsList.size(); _accountMgr.incrementResourceCount(accountId, ResourceType.public_ip, size); s_logger.debug("Assigning new ip addresses " +ipAddrsList); } if(ipAddrsList.isEmpty()) return; - - String params = "\nsourceNat=" + false + "\ndcId=" + zoneId; - - // Associate the IP's to DomR - boolean success = _networkMgr.associateIP(router,ipAddrsList, true); - String errorMsg = "Unable to assign public IP address pool"; + + // Associate the IP's to DomR + boolean success = true; + String params = "\nsourceNat=" + false + "\ndcId=" + zoneId; + ArrayList dummyipAddrList = new ArrayList(); + success = _networkMgr.associateIP(router,ipAddrsList, true); + String errorMsg = "Unable to assign public IP address pool"; if (!success) { s_logger.debug(errorMsg); for(String ip : ipAddrsList){ @@ -1656,7 +1657,12 @@ public class ManagementServerImpl implements ManagementServer { if (!vlan.getVlanType().equals(VlanType.VirtualNetwork)) { throw new IllegalArgumentException("only ip addresses that belong to a virtual network may be disassociated."); } - + + //Check for account wide pool. It will have an entry for account_vlan_map. + if (_accountVlanMapDao.findAccountVlanMap(accountId,ipVO.getVlanDbId()) != null){ + throw new PermissionDeniedException(publicIPAddress + " belongs to Account wide IP pool and cannot be disassociated"); + } + txn.start(); boolean success = _networkMgr.releasePublicIpAddress(userId, publicIPAddress); if (success) @@ -1863,7 +1869,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public List listPublicIpAddressesBy(Long accountId, boolean allocatedOnly, Long zoneId, Long vlanDbId) { - SearchCriteria sc = _publicIpAddressDao.createSearchCriteria(); + SearchCriteria sc = _publicIpAddressDao.createSearchCriteria(); if (accountId != null) sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); @@ -1963,8 +1969,6 @@ public class ManagementServerImpl implements ManagementServer { } long eventId = saveScheduledEvent(1L, volume.getAccountId(), EventTypes.EVENT_VOLUME_ATTACH, "attaching volume: "+volumeId+" to Vm: "+vmId); VolumeOperationParam param = new VolumeOperationParam(); - param.setUserId(1); - param.setAccountId(volume.getAccountId()); param.setOp(VolumeOp.Attach); param.setVmId(vmId); param.setVolumeId(volumeId); @@ -2017,8 +2021,6 @@ public class ManagementServerImpl implements ManagementServer { long eventId = saveScheduledEvent(1L, volume.getAccountId(), EventTypes.EVENT_VOLUME_DETACH, "detaching volume: "+volumeId+" from Vm: "+vmId); VolumeOperationParam param = new VolumeOperationParam(); - param.setUserId(1); - param.setAccountId(volume.getAccountId()); param.setOp(VolumeOp.Detach); param.setVolumeId(volumeId); param.setEventId(eventId); @@ -2047,12 +2049,13 @@ public class ManagementServerImpl implements ManagementServer { boolean success = _vmMgr.attachISOToVM(vmId, isoId, attach); if (success) { + VMInstanceVO updatedInstance = _vmInstanceDao.createForUpdate(); if (attach) { - vm.setIsoId(iso.getId().longValue()); + updatedInstance.setIsoId(iso.getId().longValue()); } else { - vm.setIsoId(null); + updatedInstance.setIsoId(null); } - _userVmDao.update(vmId, vm); + _vmInstanceDao.update(vmId, updatedInstance); if (attach) { saveEvent(userId, vm.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ISO_ATTACH, "Successfully attached ISO: " + iso.getName() + " to VM with ID: " + vmId, @@ -2079,7 +2082,7 @@ public class ManagementServerImpl implements ManagementServer { } VMTemplateVO iso = _templateDao.findById(isoId); - if (iso == null || !iso.getFormat().equals(ImageFormat.ISO)) { + if (iso == null) { throw new InvalidParameterValueException("Unable to find ISO with id " + isoId); } @@ -2116,7 +2119,7 @@ public class ManagementServerImpl implements ManagementServer { Long isoId = userVM.getIsoId(); if (isoId == null) { - throw new InvalidParameterValueException("The specified VM has no ISO attached to it."); + throw new InvalidParameterValueException("Please specify a valid ISO."); } State vmState = userVM.getState(); @@ -2279,7 +2282,7 @@ public class ManagementServerImpl implements ManagementServer { } else { if (offering.getGuestIpType() == GuestIpType.Virtualized) { try { - externalIp = _networkMgr.assignSourceNatIpAddress(account, dc, domain, offering, startEventId); + externalIp = _networkMgr.assignSourceNatIpAddress(account, dc, domain, offering); } catch (ResourceAllocationException rae) { throw rae; } @@ -2319,13 +2322,13 @@ public class ManagementServerImpl implements ManagementServer { String executionExceptionMsg= ""; String storageUnavailableExceptionMsg = ""; String concurrentOperationExceptionMsg = ""; - UserVmVO started = null; + UserVm started = null; if (isIso) { String isoPath = _storageMgr.getAbsoluteIsoPath(templateId, dataCenterId); try { - started = _vmMgr.startVirtualMachine(userId, created.getId(), password, isoPath, startEventId); + started = _vmMgr.startVirtualMachine(userId, created.getId(), password, isoPath); } catch (ExecutionException e) { @@ -2347,7 +2350,7 @@ public class ManagementServerImpl implements ManagementServer { { try { - started = _vmMgr.startVirtualMachine(userId, created.getId(), password, null, startEventId); + started = _vmMgr.startVirtualMachine(userId, created.getId(), password, null); } catch (ExecutionException e) { @@ -2396,11 +2399,12 @@ public class ManagementServerImpl implements ManagementServer { } else { if (isIso) { - started.setIsoId(templateId); - _userVmDao.update(started.getId(), started); + VMInstanceVO updatedInstance = _vmInstanceDao.createForUpdate(); + updatedInstance.setIsoId(templateId); + _vmInstanceDao.update(started.getId(), updatedInstance); started = _userVmDao.findById(started.getId()); } - + String params = "\nsourceNat=" + false + "\ndcId=" + dc.getId(); try { associateIpAddressListToAccount(userId, accountId, dc.getId(),null); } catch (InsufficientAddressCapacityException e) { @@ -2526,7 +2530,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public UserVm startVirtualMachine(long userId, long vmId, String isoPath) throws InternalErrorException, ExecutionException, StorageUnavailableException, ConcurrentOperationException { - return _vmMgr.startVirtualMachine(userId, vmId, isoPath, 0); + return _vmMgr.startVirtualMachine(userId, vmId, isoPath); } @Override @@ -2560,7 +2564,7 @@ public class ManagementServerImpl implements ManagementServer { long eventId = saveScheduledEvent(userId, userVm.getAccountId(), EventTypes.EVENT_VM_STOP, "stopping Vm with Id: "+vmId); - VMOperationParam param = new VMOperationParam(userId, userVm.getAccountId(), vmId, null, eventId); + VMOperationParam param = new VMOperationParam(userId, vmId, null, eventId); Gson gson = GsonHelper.getBuilder().create(); AsyncJobVO job = new AsyncJobVO(); @@ -2586,7 +2590,7 @@ public class ManagementServerImpl implements ManagementServer { long eventId = saveScheduledEvent(userId, userVm.getAccountId(), EventTypes.EVENT_VM_REBOOT, "rebooting Vm with Id: "+vmId); - VMOperationParam param = new VMOperationParam(userId, userVm.getAccountId(), vmId, null, eventId); + VMOperationParam param = new VMOperationParam(userId, vmId, null, eventId); Gson gson = GsonHelper.getBuilder().create(); AsyncJobVO job = new AsyncJobVO(); @@ -2611,7 +2615,7 @@ public class ManagementServerImpl implements ManagementServer { UserVmVO userVm = _userVmDao.findById(vmId); long eventId = saveScheduledEvent(userId, userVm.getAccountId(), EventTypes.EVENT_VM_DESTROY, "destroying Vm with Id: "+vmId); - VMOperationParam param = new VMOperationParam(userId, userVm.getAccountId(), vmId, null, eventId); + VMOperationParam param = new VMOperationParam(userId, vmId, null, eventId); Gson gson = GsonHelper.getBuilder().create(); AsyncJobVO job = new AsyncJobVO(); @@ -2720,13 +2724,13 @@ public class ManagementServerImpl implements ManagementServer { @Override public void updateVirtualMachine(long vmId, String displayName, String group, boolean enable, Long userId, long accountId) { - UserVmVO vm = _userVmDao.findById(vmId); + VMInstanceVO vm = _vmInstanceDao.findById(vmId); if (vm == null) { throw new CloudRuntimeException("Unable to find virual machine with id " + vmId); } boolean haEnabled = vm.isHaEnabled(); - _userVmDao.updateVM(vmId, displayName, group, enable); + _vmInstanceDao.updateVM(vmId, displayName, group, enable); if (haEnabled != enable) { String description = null; String type = null; @@ -3027,7 +3031,7 @@ public class ManagementServerImpl implements ManagementServer { List existingVMMaps = _securityGroupVMMapDao.listBySecurityGroup(securityGroupId.longValue()); if ((existingVMMaps != null) && !existingVMMaps.isEmpty()) { for (SecurityGroupVMMapVO existingVMMap : existingVMMaps) { - if (existingVMMap.getInstanceId() == userVm.getId()) { + if (existingVMMap.getInstanceId() == userVm.getId().longValue()) { if (s_logger.isDebugEnabled()) { s_logger.debug("port forwarding service " + securityGroupId + " is already applied to virtual machine " + userVm.toString() + ", skipping assignment."); } @@ -3380,55 +3384,58 @@ public class ManagementServerImpl implements ManagementServer { } } - Pair privateIpPort = mappedPublicPorts.get(publicPort); - if (privateIpPort != null) { - if (privateIpPort.first().equals(userVm.getGuestIpAddress()) && privateIpPort.second().equals(privatePort)) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("skipping the creating of firewall rule " + ipAddress + ":" + publicPort + " to " + userVm.getGuestIpAddress() + ":" + privatePort + "; rule already exists."); + if (userVm != null) { + Pair privateIpPort = mappedPublicPorts.get(publicPort); + if (privateIpPort != null) { + if (privateIpPort.first().equals(userVm.getGuestIpAddress()) && privateIpPort.second().equals(privatePort)) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("skipping the creating of firewall rule " + ipAddress + ":" + publicPort + " to " + userVm.getGuestIpAddress() + ":" + privatePort + "; rule already exists."); + } + return null; // already mapped + } else { + throw new NetworkRuleConflictException("An existing port forwarding service rule for " + ipAddress + ":" + publicPort + + " already exists, found while trying to create mapping to " + userVm.getGuestIpAddress() + ":" + privatePort + ((securityGroupId == null) ? "." : " from port forwarding service " + + securityGroupId.toString() + ".")); } - return null; // already mapped - } else { - throw new NetworkRuleConflictException("An existing port forwarding service rule for " + ipAddress + ":" + publicPort - + " already exists, found while trying to create mapping to " + userVm.getGuestIpAddress() + ":" + privatePort + ((securityGroupId == null) ? "." : " from port forwarding service " - + securityGroupId.toString() + ".")); } + + FirewallRuleVO newFwRule = new FirewallRuleVO(); + newFwRule.setEnabled(true); + newFwRule.setForwarding(true); + newFwRule.setPrivatePort(privatePort); + newFwRule.setProtocol(protocol); + newFwRule.setPublicPort(publicPort); + newFwRule.setPublicIpAddress(ipAddress); + newFwRule.setPrivateIpAddress(userVm.getGuestIpAddress()); + newFwRule.setGroupId(securityGroupId); + + // In 1.0 the rules were always persisted when a user created a rule. When the rules get sent down + // the stopOnError parameter is set to false, so the agent will apply all rules that it can. That + // behavior is preserved here by persisting the rule before sending it to the agent. + _firewallRulesDao.persist(newFwRule); + + boolean success = _networkMgr.updateFirewallRule(newFwRule, null, null); + + // Save and create the event + String description; + String ruleName = "ip forwarding"; + String level = EventVO.LEVEL_INFO; + Account account = _accountDao.findById(userVm.getAccountId()); + + if (success == true) { + description = "created new " + ruleName + " rule [" + newFwRule.getPublicIpAddress() + ":" + newFwRule.getPublicPort() + "]->[" + + newFwRule.getPrivateIpAddress() + ":" + newFwRule.getPrivatePort() + "]" + " " + newFwRule.getProtocol(); + } else { + level = EventVO.LEVEL_ERROR; + description = "failed to create new " + ruleName + " rule [" + newFwRule.getPublicIpAddress() + ":" + newFwRule.getPublicPort() + "]->[" + + newFwRule.getPrivateIpAddress() + ":" + newFwRule.getPrivatePort() + "]" + " " + newFwRule.getProtocol(); + } + + saveEvent(Long.valueOf(userId), account.getId(), level, EventTypes.EVENT_NET_RULE_ADD, description); + + return newFwRule; } - - FirewallRuleVO newFwRule = new FirewallRuleVO(); - newFwRule.setEnabled(true); - newFwRule.setForwarding(true); - newFwRule.setPrivatePort(privatePort); - newFwRule.setProtocol(protocol); - newFwRule.setPublicPort(publicPort); - newFwRule.setPublicIpAddress(ipAddress); - newFwRule.setPrivateIpAddress(userVm.getGuestIpAddress()); - newFwRule.setGroupId(securityGroupId); - - // In 1.0 the rules were always persisted when a user created a rule. When the rules get sent down - // the stopOnError parameter is set to false, so the agent will apply all rules that it can. That - // behavior is preserved here by persisting the rule before sending it to the agent. - _firewallRulesDao.persist(newFwRule); - - boolean success = _networkMgr.updateFirewallRule(newFwRule, null, null); - - // Save and create the event - String description; - String ruleName = "ip forwarding"; - String level = EventVO.LEVEL_INFO; - Account account = _accountDao.findById(userVm.getAccountId()); - - if (success == true) { - description = "created new " + ruleName + " rule [" + newFwRule.getPublicIpAddress() + ":" + newFwRule.getPublicPort() + "]->[" - + newFwRule.getPrivateIpAddress() + ":" + newFwRule.getPrivatePort() + "]" + " " + newFwRule.getProtocol(); - } else { - level = EventVO.LEVEL_ERROR; - description = "failed to create new " + ruleName + " rule [" + newFwRule.getPublicIpAddress() + ":" + newFwRule.getPublicPort() + "]->[" - + newFwRule.getPrivateIpAddress() + ":" + newFwRule.getPrivatePort() + "]" + " " + newFwRule.getProtocol(); - } - - saveEvent(Long.valueOf(userId), account.getId(), level, EventTypes.EVENT_NET_RULE_ADD, description); - - return newFwRule; + return null; } @DB @@ -3757,7 +3764,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public List getEvents(long userId, long accountId, Long domainId, String type, String level, Date startDate, Date endDate) { - SearchCriteria sc = _eventDao.createSearchCriteria(); + SearchCriteria sc = _eventDao.createSearchCriteria(); if (userId > 0) { sc.addAnd("userId", SearchCriteria.Op.EQ, userId); } @@ -3823,9 +3830,9 @@ public class ManagementServerImpl implements ManagementServer { sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId()); } - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _userAccountDao.createSearchCriteria(); + SearchCriteria ssc = _userAccountDao.createSearchCriteria(); ssc.addOr("username", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("firstname", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("lastname", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -3870,7 +3877,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public List searchForServiceOfferings(Criteria c) { Filter searchFilter = new Filter(ServiceOfferingVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _offeringsDao.createSearchCriteria(); + SearchCriteria sc = _offeringsDao.createSearchCriteria(); Object name = c.getCriteria(Criteria.NAME); Object vmIdObj = c.getCriteria(Criteria.INSTANCEID); @@ -3878,7 +3885,7 @@ public class ManagementServerImpl implements ManagementServer { Object keyword = c.getCriteria(Criteria.KEYWORD); if (keyword != null) { - SearchCriteria ssc = _offeringsDao.createSearchCriteria(); + SearchCriteria ssc = _offeringsDao.createSearchCriteria(); ssc.addOr("displayText", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -3911,7 +3918,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public List searchForClusters(Criteria c) { Filter searchFilter = new Filter(ClusterVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _clusterDao.createSearchCriteria(); + SearchCriteria sc = _clusterDao.createSearchCriteria(); Object id = c.getCriteria(Criteria.ID); Object name = c.getCriteria(Criteria.NAME); @@ -3940,19 +3947,18 @@ public class ManagementServerImpl implements ManagementServer { @Override public List searchForServers(Criteria c) { Filter searchFilter = new Filter(HostVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _hostDao.createSearchCriteria(); + SearchCriteria sc = _hostDao.createSearchCriteria(); Object name = c.getCriteria(Criteria.NAME); Object type = c.getCriteria(Criteria.TYPE); Object state = c.getCriteria(Criteria.STATE); Object zone = c.getCriteria(Criteria.DATACENTERID); Object pod = c.getCriteria(Criteria.PODID); - Object cluster = c.getCriteria(Criteria.CLUSTERID); Object id = c.getCriteria(Criteria.ID); Object keyword = c.getCriteria(Criteria.KEYWORD); if (keyword != null) { - SearchCriteria ssc = _hostDao.createSearchCriteria(); + SearchCriteria ssc = _hostDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("status", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -3979,9 +3985,6 @@ public class ManagementServerImpl implements ManagementServer { if (pod != null) { sc.addAnd("podId", SearchCriteria.Op.EQ, pod); } - if (cluster != null) { - sc.addAnd("clusterId", SearchCriteria.Op.EQ, cluster); - } return _hostDao.search(sc, searchFilter); } @@ -3989,7 +3992,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public List searchForPods(Criteria c) { Filter searchFilter = new Filter(HostPodVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _hostPodDao.createSearchCriteria(); + SearchCriteria sc = _hostPodDao.createSearchCriteria(); String podName = (String) c.getCriteria(Criteria.NAME); Long id = (Long) c.getCriteria(Criteria.ID); @@ -3997,7 +4000,7 @@ public class ManagementServerImpl implements ManagementServer { Object keyword = c.getCriteria(Criteria.KEYWORD); if (keyword != null) { - SearchCriteria ssc = _hostPodDao.createSearchCriteria(); + SearchCriteria ssc = _hostPodDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -4031,7 +4034,7 @@ public class ManagementServerImpl implements ManagementServer { } Filter searchFilter = new Filter(DataCenterVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _dcDao.createSearchCriteria(); + SearchCriteria sc = _dcDao.createSearchCriteria(); String zoneName = (String) c.getCriteria(Criteria.ZONENAME); @@ -4071,9 +4074,9 @@ public class ManagementServerImpl implements ManagementServer { sb.join("podVlanMapSearch", podVlanMapSearch, sb.entity().getId(), podVlanMapSearch.entity().getVlanDbId()); } - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _vlanDao.createSearchCriteria(); + SearchCriteria ssc = _vlanDao.createSearchCriteria(); ssc.addOr("vlanId", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("ipRange", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("vlanId", SearchCriteria.Op.SC, ssc); @@ -4125,14 +4128,14 @@ public class ManagementServerImpl implements ManagementServer { @Override public List searchForConfigurations(Criteria c, boolean showHidden) { Filter searchFilter = new Filter(ConfigurationVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _configDao.createSearchCriteria(); + SearchCriteria sc = _configDao.createSearchCriteria(); Object name = c.getCriteria(Criteria.NAME); Object category = c.getCriteria(Criteria.CATEGORY); Object keyword = c.getCriteria(Criteria.KEYWORD); if (keyword != null) { - SearchCriteria ssc = _configDao.createSearchCriteria(); + SearchCriteria ssc = _configDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("instance", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("component", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -4161,7 +4164,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public List searchForAlertServers(Criteria c) { Filter searchFilter = new Filter(HostVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _hostDao.createSearchCriteria(); + SearchCriteria sc = _hostDao.createSearchCriteria(); Object[] states = (Object[]) c.getCriteria(Criteria.STATE); @@ -4189,10 +4192,10 @@ public class ManagementServerImpl implements ManagementServer { sb.and("format", sb.entity().getFormat(), SearchCriteria.Op.NEQ); sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ); - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _templateDao.createSearchCriteria(); + SearchCriteria ssc = _templateDao.createSearchCriteria(); ssc.addOr("displayName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("group", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -4276,6 +4279,17 @@ public class ManagementServerImpl implements ManagementServer { return _hostPodDao.listByDataCenterId(dataCenterId); } + @Override + public PricingVO findPricingByTypeAndId(String type, Long id) { + return _pricingDao.findByTypeAndId(type, id); + } + + @Override + public Long createPricing(Long id, float price, String priceUnit, String type, Long typeId, Date created) { + PricingVO pricing = new PricingVO(id, price, priceUnit, type, typeId, created); + return _pricingDao.persist(pricing).getId(); + } + @Override public void updateConfiguration(long userId, String name, String value) throws InvalidParameterValueException, InternalErrorException { _configMgr.updateConfiguration(userId, name, value); @@ -4296,6 +4310,11 @@ public class ManagementServerImpl implements ManagementServer { return _configMgr.deleteServiceOffering(userId, serviceOfferingId); } + private void updatePricing(Long id, float price, String priceUnit, String type, Long typeId, Date created) { + PricingVO pricing = new PricingVO(id, price, priceUnit, type, typeId, created); + _pricingDao.update(pricing); + } + @Override public HostPodVO createPod(long userId, String podName, Long zoneId, String gateway, String cidr, String startIp, String endIp) throws InvalidParameterValueException, InternalErrorException { return _configMgr.createPod(userId, podName, zoneId, gateway, cidr, startIp, endIp); @@ -4401,9 +4420,9 @@ public class ManagementServerImpl implements ManagementServer { sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId()); } - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _accountDao.createSearchCriteria(); + SearchCriteria ssc = _accountDao.createSearchCriteria(); ssc.addOr("accountName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -4510,7 +4529,7 @@ public class ManagementServerImpl implements ManagementServer { sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ); sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ); - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (accountId != null) { sc.setParameters("accountId", accountId); @@ -4608,10 +4627,10 @@ public class ManagementServerImpl implements ManagementServer { Long creator = (Long) c.getCriteria(Criteria.CREATED_BY); Object keyword = c.getCriteria(Criteria.KEYWORD); - SearchCriteria sc = _templateDao.createSearchCriteria(); + SearchCriteria sc = _templateDao.createSearchCriteria(); if (keyword != null) { - SearchCriteria ssc = _templateDao.createSearchCriteria(); + SearchCriteria ssc = _templateDao.createSearchCriteria(); ssc.addOr("displayText", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -4761,20 +4780,6 @@ public class ManagementServerImpl implements ManagementServer { VMTemplateVO template = _templateDao.createForUpdate(id); if (name != null) { - // Check for duplicate name - VMTemplateVO foundTemplate = _templateDao.findByTemplateName(name); - if (foundTemplate != null) - { - if(foundTemplate.getId()==id) - { - //do nothing, you are updating the same template you own - } - else - { - s_logger.error("updateTemplate - Template name " + name + " already exists "); - return false; - } - } template.setName(name); } @@ -4842,8 +4847,10 @@ public class ManagementServerImpl implements ManagementServer { if (zoneId != null && (_hostDao.findSecondaryStorageHost(zoneId) == null)) { throw new InvalidParameterValueException("Failed to find a secondary storage host in the specified zone."); } + + long eventId = saveScheduledEvent(userId, template.getAccountId(), EventTypes.EVENT_TEMPLATE_DELETE, "deleting template with Id: "+templateId); - DeleteTemplateParam param = new DeleteTemplateParam(userId, templateId, zoneId, 0); + DeleteTemplateParam param = new DeleteTemplateParam(userId, templateId, zoneId, eventId); Gson gson = GsonHelper.getBuilder().create(); AsyncJobVO job = new AsyncJobVO(); @@ -4880,10 +4887,6 @@ public class ManagementServerImpl implements ManagementServer { throw new InvalidParameterValueException("Please specify a valid template/ISO."); } - if (template.getFormat().equals(ImageFormat.ISO) && template.getName().equals("xs-tools.iso")) { - throw new InvalidParameterValueException("The XenServer Tools ISO cannot be copied."); - } - DataCenterVO sourceZone = _dcDao.findById(sourceZoneId); if (sourceZone == null) { throw new InvalidParameterValueException("Please specify a valid source zone."); @@ -4949,7 +4952,9 @@ public class ManagementServerImpl implements ManagementServer { throw new InvalidParameterValueException("Failed to find a secondary storage host in the specified zone."); } - DeleteTemplateParam param = new DeleteTemplateParam(userId, isoId, zoneId, 0); + long eventId = saveScheduledEvent(userId, iso.getAccountId(), EventTypes.EVENT_ISO_DELETE, "deleting ISO with Id: "+isoId+" from zone: "+zoneId); + + DeleteTemplateParam param = new DeleteTemplateParam(userId, isoId, zoneId, eventId); Gson gson = GsonHelper.getBuilder().create(); AsyncJobVO job = new AsyncJobVO(); @@ -5027,10 +5032,10 @@ public class ManagementServerImpl implements ManagementServer { } // populate the search criteria with the values passed in - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _userVmDao.createSearchCriteria(); + SearchCriteria ssc = _userVmDao.createSearchCriteria(); ssc.addOr("displayName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("group", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -5075,15 +5080,9 @@ public class ManagementServerImpl implements ManagementServer { if (zone != null) { sc.setParameters("dataCenterId", zone); - - if(state == null) - sc.setParameters("stateNEQ", "Destroyed"); } if (pod != null) { sc.setParameters("podId", pod); - - if(state == null) - sc.setParameters("stateNEQ", "Destroyed"); } if (hostId != null) { @@ -5268,7 +5267,7 @@ public class ManagementServerImpl implements ManagementServer { sb.join("groupId", securityGroupSearch, securityGroupSearch.entity().getId(), sb.entity().getSecurityGroupId()); } - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (id != null) { sc.setParameters("id", id); @@ -5323,9 +5322,9 @@ public class ManagementServerImpl implements ManagementServer { sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId()); } - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _eventDao.createSearchCriteria(); + SearchCriteria ssc = _eventDao.createSearchCriteria(); ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("level", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -5441,9 +5440,9 @@ public class ManagementServerImpl implements ManagementServer { sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId()); } - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _routerDao.createSearchCriteria(); + SearchCriteria ssc = _routerDao.createSearchCriteria(); ssc.addOr("displayName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("instanceName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -5482,7 +5481,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public List searchForConsoleProxy(Criteria c) { Filter searchFilter = new Filter(ConsoleProxyVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _consoleProxyDao.createSearchCriteria(); + SearchCriteria sc = _consoleProxyDao.createSearchCriteria(); Object id = c.getCriteria(Criteria.ID); Object name = c.getCriteria(Criteria.NAME); @@ -5493,7 +5492,7 @@ public class ManagementServerImpl implements ManagementServer { Object keyword = c.getCriteria(Criteria.KEYWORD); if (keyword != null) { - SearchCriteria ssc = _consoleProxyDao.createSearchCriteria(); + SearchCriteria ssc = _consoleProxyDao.createSearchCriteria(); ssc.addOr("displayName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("group", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -5589,9 +5588,9 @@ public class ManagementServerImpl implements ManagementServer { } // now set the SC criteria... - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _volumeDao.createSearchCriteria(); + SearchCriteria ssc = _volumeDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("nameLabel", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("volumeType", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -5699,7 +5698,7 @@ public class ManagementServerImpl implements ManagementServer { sb.and("allocated", sb.entity().getAllocated(), SearchCriteria.Op.NNULL); } - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (accountIds != null) { if ((accountIds.length == 1) && (accountIds[0] != null)) { sc.setParameters("accountIdEQ", accountIds[0]); @@ -5884,6 +5883,32 @@ public class ManagementServerImpl implements ManagementServer { saveEvent(userId, userAcct.getAccountId(), EventTypes.EVENT_USER_LOGOUT, "user has logged out"); } + @Override + public String updateTemplatePricing(long userId, Long id, float price) { + VMTemplateVO template = _templateDao.findById(id); + + if (template == null) { + return "Template (id=" + id + ") does not exist"; + } + + // update the price for the offering if it exists, else update it. + PricingVO existingPrice = _pricingDao.findByTypeAndId("VMTemplate", id); + DecimalFormat decimalFormat = new DecimalFormat("#.###"); + + if (existingPrice == null) { + PricingVO pricing = new PricingVO(null, new Float(decimalFormat.format(price)), "per hour", "VMTemplate", id, new Date()); + _pricingDao.persist(pricing); + } else { + updatePricing(existingPrice.getId(), new Float(decimalFormat.format(price)), "per hour", "VMTemplate", id, new Date()); + } + + UserAccount userAcct = _userAccountDao.findById(Long.valueOf(userId)); + + saveEvent(userId, userAcct.getAccountId(), EventTypes.EVENT_TEMPLATE_UPDATE, "Set price of template: " + template.getName() + " to " + price + + " per hour"); + return null; + } + @Override public NetworkRuleConfigVO createOrUpdateRule(long userId, long securityGroupId, String address, String port, String privateIpAddress, String privatePort, String protocol, String algorithm) throws InvalidParameterValueException, PermissionDeniedException, NetworkRuleConflictException, InternalErrorException { @@ -6018,45 +6043,12 @@ public class ManagementServerImpl implements ManagementServer { return _templateDao.listAll(); } - public List listGuestOSByCriteria(Criteria c) - { - - Filter searchFilter = new Filter(GuestOSVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - Long id = (Long) c.getCriteria(Criteria.ID); - Long osCategoryId = (Long) c.getCriteria(Criteria.OSCATEGORYID); - - SearchBuilder sb = _guestOSDao.createSearchBuilder(); - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - sb.and("categoryId", sb.entity().getCategoryId(), SearchCriteria.Op.EQ); - - SearchCriteria sc = sb.create(); - - if (id != null) { - sc.setParameters("id",id); - } - - if (osCategoryId != null) { - sc.setParameters("categoryId", osCategoryId); - } - - return _guestOSDao.search(sc, searchFilter); + public List listAllGuestOS() { + return _guestOSDao.listAll(); } - public List listGuestOSCategoriesByCriteria(Criteria c) - { - Filter searchFilter = new Filter(GuestOSCategoryVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - Long id = (Long) c.getCriteria(Criteria.ID); - - SearchBuilder sb = _guestOSCategoryDao.createSearchBuilder(); - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - - SearchCriteria sc = sb.create(); - - if (id != null) { - sc.setParameters("id",id); - } - - return _guestOSCategoryDao.search(sc, searchFilter); + public List listAllGuestOSCategories() { + return _guestOSCategoryDao.listAll(); } public String getConfigurationValue(String name) { @@ -6191,10 +6183,10 @@ public class ManagementServerImpl implements ManagementServer { sb.and("level", sb.entity().getLevel(), SearchCriteria.Op.EQ); sb.and("path", sb.entity().getPath(), SearchCriteria.Op.LIKE); - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _domainDao.createSearchCriteria(); + SearchCriteria ssc = _domainDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); @@ -6224,10 +6216,10 @@ public class ManagementServerImpl implements ManagementServer { String domainName = (String) c.getCriteria(Criteria.NAME); Object keyword = c.getCriteria(Criteria.KEYWORD); - SearchCriteria sc = _domainDao.createSearchCriteria(); + SearchCriteria sc = _domainDao.createSearchCriteria(); if (keyword != null) { - SearchCriteria ssc = _domainDao.createSearchCriteria(); + SearchCriteria ssc = _domainDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); @@ -6246,7 +6238,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public DomainVO createDomain(String name, Long ownerId, Long parentId) { - SearchCriteria sc = _domainDao.createSearchCriteria(); + SearchCriteria sc = _domainDao.createSearchCriteria(); sc.addAnd("name", SearchCriteria.Op.EQ, name); sc.addAnd("parent", SearchCriteria.Op.EQ, parentId); List domains = _domainDao.search(sc, null); @@ -6313,7 +6305,7 @@ public class ManagementServerImpl implements ManagementServer { private boolean cleanupDomain(Long domainId, Long ownerId) { boolean success = true; { - SearchCriteria sc = _domainDao.createSearchCriteria(); + SearchCriteria sc = _domainDao.createSearchCriteria(); sc.addAnd("parent", SearchCriteria.Op.EQ, domainId); List domains = _domainDao.search(sc, null); @@ -6325,11 +6317,11 @@ public class ManagementServerImpl implements ManagementServer { { // delete users which will also delete accounts and release resources for those accounts - SearchCriteria sc = _accountDao.createSearchCriteria(); + SearchCriteria sc = _accountDao.createSearchCriteria(); sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); List accounts = _accountDao.search(sc, null); for (AccountVO account : accounts) { - SearchCriteria userSc = _userDao.createSearchCriteria(); + SearchCriteria userSc = _userDao.createSearchCriteria(); userSc.addAnd("accountId", SearchCriteria.Op.EQ, account.getId()); List users = _userDao.search(userSc, null); for (UserVO user : users) { @@ -6350,7 +6342,7 @@ public class ManagementServerImpl implements ManagementServer { } public void updateDomain(Long domainId, String domainName) { - SearchCriteria sc = _domainDao.createSearchCriteria(); + SearchCriteria sc = _domainDao.createSearchCriteria(); sc.addAnd("name", SearchCriteria.Op.EQ, domainName); List domains = _domainDao.search(sc, null); if ((domains == null) || domains.isEmpty()) { @@ -6388,13 +6380,13 @@ public class ManagementServerImpl implements ManagementServer { @Override public List searchForAlerts(Criteria c) { Filter searchFilter = new Filter(AlertVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _alertDao.createSearchCriteria(); + SearchCriteria sc = _alertDao.createSearchCriteria(); Object type = c.getCriteria(Criteria.TYPE); Object keyword = c.getCriteria(Criteria.KEYWORD); if (keyword != null) { - SearchCriteria ssc = _alertDao.createSearchCriteria(); + SearchCriteria ssc = _alertDao.createSearchCriteria(); ssc.addOr("subject", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("subject", SearchCriteria.Op.SC, ssc); @@ -6416,7 +6408,7 @@ public class ManagementServerImpl implements ManagementServer { _alertMgr.recalculateCapacity(); Filter searchFilter = new Filter(CapacityVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _capacityDao.createSearchCriteria(); + SearchCriteria sc = _capacityDao.createSearchCriteria(); Object type = c.getCriteria(Criteria.TYPE); Object zoneId = c.getCriteria(Criteria.DATACENTERID); @@ -6527,7 +6519,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public List listSnapshots(Criteria c, String interval) throws InvalidParameterValueException { Filter searchFilter = new Filter(SnapshotVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _snapshotDao.createSearchCriteria(); + SearchCriteria sc = _snapshotDao.createSearchCriteria(); Object volumeId = c.getCriteria(Criteria.VOLUMEID); Object name = c.getCriteria(Criteria.NAME); @@ -6551,7 +6543,7 @@ public class ManagementServerImpl implements ManagementServer { } if (keyword != null) { - SearchCriteria ssc = _snapshotDao.createSearchCriteria(); + SearchCriteria ssc = _snapshotDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); @@ -6638,8 +6630,7 @@ public class ManagementServerImpl implements ManagementServer { throw new InvalidParameterValueException("Please specify a valid guest OS."); } - long eventId = saveScheduledEvent(userId, volume.getAccountId(), EventTypes.EVENT_TEMPLATE_CREATE, "creating template" +name); - CreatePrivateTemplateParam param = new CreatePrivateTemplateParam(userId, volume.getAccountId(), volumeId, guestOSId, eventId, name, description, requiresHvm, bits, passwordEnabled, isPublic, featured, snapshotId); + CreatePrivateTemplateParam param = new CreatePrivateTemplateParam(userId, volumeId, guestOSId, name, description, requiresHvm, bits, passwordEnabled, isPublic, featured, snapshotId); Gson gson = GsonHelper.getBuilder().create(); AsyncJobVO job = new AsyncJobVO(); @@ -6775,9 +6766,9 @@ public class ManagementServerImpl implements ManagementServer { } */ - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _diskOfferingDao.createSearchCriteria(); + SearchCriteria ssc = _diskOfferingDao.createSearchCriteria(); ssc.addOr("displayText", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -6809,14 +6800,14 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException { + public DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, boolean mirrored, String tags) throws InvalidParameterValueException { if (numGibibytes < 1) { throw new InvalidParameterValueException("Please specify a disk size of at least 1 Gb."); } else if (numGibibytes > _maxVolumeSizeInGb) { throw new InvalidParameterValueException("The maximum size for a disk is " + _maxVolumeSizeInGb + " Gb."); } - return _configMgr.createDiskOffering(domainId, name, description, numGibibytes, tags); + return _configMgr.createDiskOffering(domainId, name, description, numGibibytes, mirrored, tags); } @Override @@ -6880,7 +6871,6 @@ public class ManagementServerImpl implements ManagementServer { @Override public long deleteSecurityGroupAsync(long userId, Long accountId, long securityGroupId) { - long eventId = saveScheduledEvent(userId, accountId, EventTypes.EVENT_PORT_FORWARDING_SERVICE_DELETE, "deleting security group with Id: " + securityGroupId); SecurityGroupParam param = new SecurityGroupParam(userId, securityGroupId, null, null, null, eventId); Gson gson = GsonHelper.getBuilder().create(); @@ -6973,9 +6963,9 @@ public class ManagementServerImpl implements ManagementServer { sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId()); } - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _securityGroupDao.createSearchCriteria(); + SearchCriteria ssc = _securityGroupDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -7003,7 +6993,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public Map> searchForSecurityGroupsByVM(Criteria c) { Filter searchFilter = new Filter(SecurityGroupVMMapVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _securityGroupVMMapDao.createSearchCriteria(); + SearchCriteria sc = _securityGroupVMMapDao.createSearchCriteria(); Object instanceId = c.getCriteria(Criteria.INSTANCEID); Object ipAddress = c.getCriteria(Criteria.ADDRESS); @@ -7059,7 +7049,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public LoadBalancerVO findLoadBalancer(Long accountId, String name) { - SearchCriteria sc = _loadBalancerDao.createSearchCriteria(); + SearchCriteria sc = _loadBalancerDao.createSearchCriteria(); sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); sc.addAnd("name", SearchCriteria.Op.EQ, name); List loadBalancers = _loadBalancerDao.search(sc, null); @@ -7228,7 +7218,7 @@ public class ManagementServerImpl implements ManagementServer { throw new InvalidParameterValueException("guest vm " + userVm.getName() + " (id:" + userVm.getId() + ") does not belong to the owner of load balancer " + loadBalancer.getName() + " (owner is account id " + loadBalancer.getAccountId() + ")"); } - } else if (router.getId() != nextRouter.getId()) { + } else if (router.getId().longValue() != nextRouter.getId().longValue()) { throw new InvalidParameterValueException("guest vm " + userVm.getName() + " (id:" + userVm.getId() + ") belongs to router " + nextRouter.getName() + ", previous vm in list belongs to router " + router.getName()); } @@ -7362,42 +7352,9 @@ public class ManagementServerImpl implements ManagementServer { } @Override @DB - public long assignToLoadBalancerAsync(/*long userId, long loadBalancerId, List instanceIds, */Map params) { + public long assignToLoadBalancerAsync(long userId, long loadBalancerId, List instanceIds) { LoadBalancerVO loadBalancer = null; try { - // unpack the params - String accountName = params.get(BaseCmd.Properties.ACCOUNT.getName()); - String domainIdStr = params.get(BaseCmd.Properties.DOMAIN_ID.getName()); - String loadBalancerIdStr = params.get(BaseCmd.Properties.ID.getName()); - String instanceIdStr = params.get(BaseCmd.Properties.VIRTUAL_MACHINE_ID.getName()); - String instanceIdList = params.get(BaseCmd.Properties.VIRTUAL_MACHINE_IDS.getName()); - - Long domainId = null; - if (domainIdStr != null) { - domainId = Long.valueOf(domainIdStr); - } - - Long loadBalancerId = null; - if (loadBalancerIdStr != null) { - loadBalancerId = Long.valueOf(loadBalancerIdStr); - } - - List instanceIds = new ArrayList(); - if (instanceIdList != null) { - StringTokenizer st = new StringTokenizer(instanceIdList, ","); - while (st.hasMoreTokens()) { - String token = st.nextToken(); - try { - Long nextInstanceId = Long.parseLong(token); - instanceIds.add(nextInstanceId); - } catch (NumberFormatException nfe) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "The virtual machine id " + token + " is not a valid parameter."); - } - } - } else if (instanceIdStr != null) { - instanceIds.add(Long.valueOf(instanceIdStr)); - } - loadBalancer = _loadBalancerDao.acquire(loadBalancerId); // if unable to lock the load balancer, throw an exception @@ -7407,7 +7364,6 @@ public class ManagementServerImpl implements ManagementServer { IPAddressVO ipAddress = _publicIpAddressDao.findById(loadBalancer.getIpAddress()); DomainRouterVO router = _routerDao.findBy(loadBalancer.getAccountId(), ipAddress.getDataCenterId()); - params.put("domainrouterid", Long.valueOf(router.getId()).toString()); List mappedVMs = _loadBalancerVMMapDao.listByLoadBalancerId(loadBalancerId); for (LoadBalancerVMMapVO mappedVM : mappedVMs) { @@ -7428,15 +7384,14 @@ public class ManagementServerImpl implements ManagementServer { _loadBalancerVMMapDao.persist(loadBalancerMapping); } -// LoadBalancerParam param = new LoadBalancerParam(userId, router.getId(), loadBalancerId, instanceIds); + LoadBalancerParam param = new LoadBalancerParam(userId, router.getId(), loadBalancerId, instanceIds); Gson gson = GsonHelper.getBuilder().create(); AsyncJobVO job = new AsyncJobVO(); job.setUserId(UserContext.current().getUserId()); job.setAccountId(loadBalancer.getAccountId()); job.setCmd("AssignToLoadBalancer"); -// job.setCmdInfo(gson.toJson(param)); - job.setCmdInfo(gson.toJson(params)); + job.setCmdInfo(gson.toJson(param)); return _asyncMgr.submitAsyncJob(job, true); } finally { if (loadBalancer != null) { @@ -7734,9 +7689,9 @@ public class ManagementServerImpl implements ManagementServer { sb.join("lbVMSearch", lbVMSearch, sb.entity().getId(), lbVMSearch.entity().getLoadBalancerId()); } - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); if (keyword != null) { - SearchCriteria ssc = _loadBalancerDao.createSearchCriteria(); + SearchCriteria ssc = _loadBalancerDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -7789,6 +7744,7 @@ public class ManagementServerImpl implements ManagementServer { return; } + Transaction txn = Transaction.open(Transaction.CLOUD_DB); try { List accounts = _accountDao.findCleanups(); s_logger.info("Found " + accounts.size() + " accounts to cleanup"); @@ -7803,6 +7759,7 @@ public class ManagementServerImpl implements ManagementServer { } catch (Exception e) { s_logger.error("Exception ", e); } finally { + txn.close(); lock.unlock(); } } catch (Exception e) { @@ -7894,19 +7851,18 @@ public class ManagementServerImpl implements ManagementServer { @Override public List searchForStoragePools(Criteria c) { Filter searchFilter = new Filter(StoragePoolVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _poolDao.createSearchCriteria(); + SearchCriteria sc = _poolDao.createSearchCriteria(); Object name = c.getCriteria(Criteria.NAME); Object host = c.getCriteria(Criteria.HOST); Object path = c.getCriteria(Criteria.PATH); Object zone = c.getCriteria(Criteria.DATACENTERID); Object pod = c.getCriteria(Criteria.PODID); - Object cluster = c.getCriteria(Criteria.CLUSTERID); Object address = c.getCriteria(Criteria.ADDRESS); Object keyword = c.getCriteria(Criteria.KEYWORD); if (keyword != null) { - SearchCriteria ssc = _poolDao.createSearchCriteria(); + SearchCriteria ssc = _poolDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("type", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -7931,9 +7887,6 @@ public class ManagementServerImpl implements ManagementServer { if (address != null) { sc.addAnd("hostAddress", SearchCriteria.Op.EQ, address); } - if (cluster != null) { - sc.addAnd("clusterId", SearchCriteria.Op.EQ, cluster); - } return _poolDao.search(sc, searchFilter); } @@ -7958,7 +7911,7 @@ public class ManagementServerImpl implements ManagementServer { public List searchForAsyncJobs(Criteria c) { Filter searchFilter = new Filter(AsyncJobVO.class, c.getOrderBy(), c .getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _jobDao.createSearchCriteria(); + SearchCriteria sc = _jobDao.createSearchCriteria(); Object accountId = c.getCriteria(Criteria.ACCOUNTID); Object status = c.getCriteria(Criteria.STATUS); @@ -8149,7 +8102,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public List searchForSecondaryStorageVm(Criteria c) { Filter searchFilter = new Filter(SecondaryStorageVmVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _secStorageVmDao.createSearchCriteria(); + SearchCriteria sc = _secStorageVmDao.createSearchCriteria(); Object id = c.getCriteria(Criteria.ID); Object name = c.getCriteria(Criteria.NAME); @@ -8160,7 +8113,7 @@ public class ManagementServerImpl implements ManagementServer { Object keyword = c.getCriteria(Criteria.KEYWORD); if (keyword != null) { - SearchCriteria ssc = _secStorageVmDao.createSearchCriteria(); + SearchCriteria ssc = _secStorageVmDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("displayName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); ssc.addOr("instanceName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); @@ -8441,7 +8394,7 @@ public class ManagementServerImpl implements ManagementServer { public List getPreAllocatedLuns(Criteria c) { Filter searchFilter = new Filter(PreallocatedLunVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); - SearchCriteria sc = _lunDao.createSearchCriteria(); + SearchCriteria sc = _lunDao.createSearchCriteria(); Object targetIqn = c.getCriteria(Criteria.TARGET_IQN); Object scope = c.getCriteria(Criteria.SCOPE); @@ -8478,84 +8431,5 @@ public class ManagementServerImpl implements ManagementServer { return _networkGroupMgr.getNetworkGroupsNamesForVm(vmId); } - - @Override - public boolean checkLocalStorageConfigVal() - { - String value = _configs.get("use.local.storage"); - - if(value!=null && value.equalsIgnoreCase("true")) - return true; - else - return false; - } - - @Override - public boolean addConfig(String instance, String component,String category, String name, String value, String description) - { - return _configMgr.addConfig(category, instance, component, name, value, description); - } - - public boolean preparePrimaryStorageForMaintenance(long primaryStorageId, long userId) { - return _storageMgr.preparePrimaryStorageForMaintenance(primaryStorageId, userId); - - } - - public long preparePrimaryStorageForMaintenanceAsync(long primaryStorageId) throws InvalidParameterValueException - { - StoragePoolVO primaryStorage = _poolDao.findById(primaryStorageId); - - if (primaryStorage == null) { - s_logger.debug("Unable to find primary storage id: " + primaryStorageId); - throw new InvalidParameterValueException("Unable to find storage pool with ID: " + primaryStorageId + ". Please specify a valid primary storage ID."); - } - - if (_poolDao.countBy(primaryStorage.getId(), Status.PrepareForMaintenance, Status.ErrorInMaintenance, Status.Maintenance) > 0) { - throw new InvalidParameterValueException("There are other primary storages in maintenance mode."); - } - - //set the state to maintenance - primaryStorage.setStatus(Status.PrepareForMaintenance); - _poolDao.persist(primaryStorage); - - Long param = new Long(primaryStorageId); - Gson gson = GsonHelper.getBuilder().create(); - - AsyncJobVO job = new AsyncJobVO(); - job.setUserId(UserContext.current().getUserId()); - job.setAccountId(Account.ACCOUNT_ID_SYSTEM); - job.setCmd("PreparePrimaryStorageMaintenance"); - job.setCmdInfo(gson.toJson(param)); - job.setCmdOriginator(PreparePrimaryStorageForMaintenanceCmd.getResultObjectName()); - return _asyncMgr.submitAsyncJob(job); - - } - - public boolean cancelPrimaryStorageMaintenance(long primaryStorageId, long userId) - { - return _storageMgr.cancelPrimaryStorageForMaintenance(primaryStorageId, userId); - } - - public long cancelPrimaryStorageMaintenanceAsync(long primaryStorageId) throws InvalidParameterValueException - { - StoragePoolVO primaryStorage = _poolDao.findById(primaryStorageId); - - if (primaryStorage == null) { - s_logger.debug("Unable to find primary storage id: " + primaryStorageId); - throw new InvalidParameterValueException("Unable to find storage pool with ID: " + primaryStorageId + ". Please specify a valid primary storage ID."); - } - - Long param = new Long(primaryStorageId); - Gson gson = GsonHelper.getBuilder().create(); - - AsyncJobVO job = new AsyncJobVO(); - job.setUserId(UserContext.current().getUserId()); - job.setAccountId(Account.ACCOUNT_ID_SYSTEM); - job.setCmd("CancelPrimaryStorageMaintenance"); - job.setCmdInfo(gson.toJson(param)); - job.setCmdOriginator(CancelPrimaryStorageMaintenanceCmd.getResultObjectName()); - return _asyncMgr.submitAsyncJob(job); - - } } diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java index c3b87f7eb00..13574178544 100644 --- a/server/src/com/cloud/server/StatsCollector.java +++ b/server/src/com/cloud/server/StatsCollector.java @@ -53,6 +53,7 @@ import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StorageStats; import com.cloud.storage.VolumeStats; import com.cloud.storage.VolumeVO; +import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.storage.dao.VolumeDao; @@ -147,7 +148,7 @@ public class StatsCollector { try { s_logger.debug("HostStatsCollector is running..."); - SearchCriteria sc = _hostDao.createSearchCriteria(); + SearchCriteria sc = _hostDao.createSearchCriteria(); sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString()); sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.Storage.toString()); sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.ConsoleProxy.toString()); @@ -187,7 +188,7 @@ public class StatsCollector { try { s_logger.debug("VmStatsCollector is running..."); - SearchCriteria sc = _hostDao.createSearchCriteria(); + SearchCriteria sc = _hostDao.createSearchCriteria(); sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString()); sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.Storage.toString()); sc.addAnd("type", SearchCriteria.Op.NEQ, Host.Type.ConsoleProxy.toString()); @@ -232,6 +233,9 @@ public class StatsCollector { _VmStats.put(vmId, statsInMemory); } } + + + //_VmStats.putAll(vmStatsById); } } catch (InternalErrorException e) { @@ -253,7 +257,7 @@ public class StatsCollector { class StorageCollector implements Runnable { public void run() { try { - SearchCriteria sc = _hostDao.createSearchCriteria(); + SearchCriteria sc = _hostDao.createSearchCriteria(); sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString()); sc.addAnd("type", SearchCriteria.Op.EQ, Host.Type.Storage.toString()); diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java index 361aea1d464..1901f43cad3 100644 --- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java +++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java @@ -27,7 +27,6 @@ import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; -import com.cloud.api.BaseCmd; import com.cloud.host.HostVO; import com.cloud.server.ManagementServer; import com.cloud.user.Account; @@ -64,9 +63,9 @@ public class ConsoleProxyServlet extends HttpServlet { return; } - String userId = (String)session.getAttribute(BaseCmd.Properties.USER_ID.getName()); - String account = (String)session.getAttribute(BaseCmd.Properties.ACCOUNT.getName()); - Account accountObj = (Account)session.getAttribute(BaseCmd.Properties.ACCOUNT_OBJ.getName()); + String userId = (String)session.getAttribute("userId"); + String account = (String)session.getAttribute("account"); + Account accountObj = (Account)session.getAttribute("accountobj"); // Do a sanity check here to make sure the user hasn't already been deleted if ((userId == null) || (account == null) || (accountObj == null) || !verifyUser(Long.valueOf(userId))) { diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 312f2c02d2c..ff71916fc4e 100644 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -62,14 +62,12 @@ import com.cloud.async.AsyncJobExecutor; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobVO; import com.cloud.async.BaseAsyncJobExecutor; -import com.cloud.async.executor.VMOperationParam; import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.consoleproxy.ConsoleProxyManager; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.DataCenterDao; @@ -79,11 +77,8 @@ import com.cloud.event.EventTypes; import com.cloud.event.EventVO; import com.cloud.event.dao.EventDao; import com.cloud.exception.AgentUnavailableException; -import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.DiscoveryException; -import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InternalErrorException; -import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceInUseException; @@ -95,8 +90,7 @@ import com.cloud.host.Host.Type; import com.cloud.host.dao.DetailsDao; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor; -import com.cloud.network.NetworkManager; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.Storage.ImageFormat; @@ -114,15 +108,12 @@ import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VMTemplatePoolDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.listener.StoragePoolMonitor; -import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.storage.snapshot.SnapshotManager; import com.cloud.storage.snapshot.SnapshotScheduler; import com.cloud.template.TemplateManager; import com.cloud.user.Account; import com.cloud.user.AccountManager; -import com.cloud.user.User; import com.cloud.user.dao.AccountDao; -import com.cloud.uservm.UserVm; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.component.Adapters; @@ -136,13 +127,10 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.ExecutionException; -import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.State; -import com.cloud.vm.UserVmManager; +import com.cloud.vm.UserVm; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; -import com.cloud.vm.VirtualMachine; -import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; @@ -151,7 +139,6 @@ public class StorageManagerImpl implements StorageManager { private static final Logger s_logger = Logger.getLogger(StorageManagerImpl.class); protected String _name; - @Inject protected UserVmManager _userVmMgr; @Inject protected AgentManager _agentMgr; @Inject protected TemplateManager _tmpltMgr; @Inject protected AsyncJobManager _asyncMgr; @@ -159,12 +146,8 @@ public class StorageManagerImpl implements StorageManager { @Inject protected SnapshotScheduler _snapshotScheduler; @Inject protected AccountManager _accountMgr; @Inject protected ConfigurationManager _configMgr; - @Inject protected ConsoleProxyManager _consoleProxyMgr; - @Inject protected SecondaryStorageVmManager _secStorageMgr; - @Inject protected NetworkManager _networkMgr; @Inject protected VolumeDao _volsDao; @Inject protected HostDao _hostDao; - @Inject protected ConsoleProxyDao _consoleProxyDao; @Inject protected DetailsDao _detailsDao; @Inject protected SnapshotDao _snapshotDao; protected Adapters _storagePoolAllocators; @@ -207,21 +190,6 @@ public class StorageManagerImpl implements StorageManager { @Override public boolean share(VMInstanceVO vm, List vols, HostVO host, boolean cancelPreviousShare) { - - //this check is done for maintenance mode for primary storage - //if any one of the volume is unusable, we return false - //if we return false, the allocator will try to switch to another PS if available - for(VolumeVO vol: vols) - { - if(vol.getRemoved()!=null) - { - s_logger.warn("Volume id:"+vol.getId()+" is removed, cannot share on this instance"); - //not ok to share - return false; - } - } - - //ok to share return true; } @@ -307,7 +275,7 @@ public class StorageManagerImpl implements StorageManager { activeVmSB.and("state", activeVmSB.entity().getState(), SearchCriteria.Op.IN); volumeSB.join("activeVmSB", activeVmSB, volumeSB.entity().getInstanceId(), activeVmSB.entity().getId()); - SearchCriteria volumeSC = volumeSB.create(); + SearchCriteria volumeSC = volumeSB.create(); volumeSC.setParameters("poolId", storagePool.getId()); volumeSC.setJoinParameters("activeVmSB", "state", new Object[] {State.Creating, State.Starting, State.Running, State.Stopping, State.Migrating}); @@ -385,7 +353,7 @@ public class StorageManagerImpl implements StorageManager { protected DiskCharacteristicsTO createDiskCharacteristics(VolumeVO volume, VMTemplateVO template, DataCenterVO dc, DiskOfferingVO diskOffering) { if (volume.getVolumeType() == VolumeType.ROOT && Storage.ImageFormat.ISO != template.getFormat()) { - SearchCriteria sc = HostTemplateStatesSearch.create(); + SearchCriteria sc = HostTemplateStatesSearch.create(); sc.setParameters("id", template.getId()); sc.setParameters("state", com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOADED); sc.setJoinParameters("host", "dcId", dc.getId()); @@ -662,7 +630,6 @@ public class StorageManagerImpl implements StorageManager { accountId, volumeId, backedUpSnapshotUuid, - snapshot.getName(), templatePath); String basicErrMsg = "Failed to create volume from " + snapshot.getName() + " for volume: " + volume.getId(); @@ -710,9 +677,6 @@ public class StorageManagerImpl implements StorageManager { pod = _podDao.lock(podId, true); if (pod == null) { txn.rollback(); - volume.setStatus(AsyncInstanceCreateStatus.Failed); - volume.setDestroyed(true); - _volsDao.persist(volume); throw new CloudRuntimeException("Unable to acquire lock on the pod " + podId); } @@ -750,7 +714,7 @@ public class StorageManagerImpl implements StorageManager { break; } - volume.setPoolId(null); + volume.setPoolId(pool.getId()); _volsDao.persist(volume); s_logger.debug("Retrying the create because it failed on pool " + pool); @@ -1256,7 +1220,6 @@ public class StorageManagerImpl implements StorageManager { pool.setPodId(podId); pool.setName(poolName); pool.setClusterId(clusterId); - pool.setStatus(Status.Up); pool = _storagePoolDao.persist(pool, details); if (_hypervisorType.equalsIgnoreCase("KVM") && allHosts.isEmpty()) { return pool; @@ -1393,10 +1356,10 @@ public class StorageManagerImpl implements StorageManager { StoragePoolHostVO poolHost = _poolHostDao.findByPoolHost(pool.getId(), hostId); if (poolHost == null) { - poolHost = new StoragePoolHostVO(pool.getId(), hostId, mspAnswer.getPoolInfo().getLocalPath().replaceAll("//", "/")); + poolHost = new StoragePoolHostVO(pool.getId(), hostId, mspAnswer.getPoolInfo().getLocalPath()); _poolHostDao.persist(poolHost); } else { - poolHost.setLocalPath(mspAnswer.getPoolInfo().getLocalPath().replaceAll("//", "/")); + poolHost.setLocalPath(mspAnswer.getPoolInfo().getLocalPath()); } pool.setAvailableBytes(mspAnswer.getPoolInfo().getAvailableBytes()); pool.setCapacityBytes(mspAnswer.getPoolInfo().getCapacityBytes()); @@ -1477,65 +1440,60 @@ public class StorageManagerImpl implements StorageManager { @Override @DB - public VolumeVO createVolume(long accountId, long userId, String userSpecifiedName, DataCenterVO dc, DiskOfferingVO diskOffering, long startEventId) - { - String volumeName = ""; - VolumeVO createdVolume = null; - - try - { - // Determine the volume's name - volumeName = getRandomVolumeName(); - - // Create the Volume object and save it so that we can return it to the user - Account account = _accountDao.findById(accountId); - VolumeVO volume = new VolumeVO(null, userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.VolumeType.DATADISK); - volume.setPoolId(null); - volume.setDataCenterId(dc.getId()); - volume.setPodId(null); - volume.setAccountId(accountId); - volume.setDomainId(account.getDomainId().longValue()); - volume.setMirrorState(MirrorState.NOT_MIRRORED); - volume.setDiskOfferingId(diskOffering.getId()); - volume.setStorageResourceType(StorageResourceType.STORAGE_POOL); - volume.setInstanceId(null); - volume.setUpdated(new Date()); - volume.setStatus(AsyncInstanceCreateStatus.Creating); - volume.setDomainId(account.getDomainId().longValue()); - volume = _volsDao.persist(volume); - - AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); - if (asyncExecutor != null) { - AsyncJobVO job = asyncExecutor.getJob(); - - if (s_logger.isInfoEnabled()) - s_logger.info("CreateVolume created a new instance " + volume.getId() + ", update async job-" + job.getId() + " progress status"); - - _asyncMgr.updateAsyncJobAttachment(job.getId(), "volume", volume.getId()); - _asyncMgr.updateAsyncJobStatus(job.getId(), BaseCmd.PROGRESS_INSTANCE_CREATED, volume.getId()); - } - - List poolsToAvoid = new ArrayList(); - Set podsToAvoid = new HashSet(); - Pair pod = null; - - while ((pod = _agentMgr.findPod(null, null, dc, account.getId(), podsToAvoid)) != null) { - if ((createdVolume = createVolume(volume, null, null, dc, pod.first(), null, null, diskOffering, poolsToAvoid)) != null) { - break; - } else { - podsToAvoid.add(pod.first().getId()); - } - } - - // Create an event - EventVO event = new EventVO(); - event.setAccountId(accountId); - event.setUserId(userId); - event.setType(EventTypes.EVENT_VOLUME_CREATE); - event.setStartId(startEventId); - - Transaction txn = Transaction.currentTxn(); + public VolumeVO createVolume(long accountId, long userId, String userSpecifiedName, DataCenterVO dc, DiskOfferingVO diskOffering, long startEventId) { + // Determine the volume's name + String volumeName = getRandomVolumeName(); + // Create the Volume object and save it so that we can return it to the user + Account account = _accountDao.findById(accountId); + VolumeVO volume = new VolumeVO(null, userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.VolumeType.DATADISK); + volume.setPoolId(null); + volume.setDataCenterId(dc.getId()); + volume.setPodId(null); + volume.setAccountId(accountId); + volume.setDomainId(account.getDomainId().longValue()); + volume.setMirrorState(MirrorState.NOT_MIRRORED); + volume.setDiskOfferingId(diskOffering.getId()); + volume.setStorageResourceType(StorageResourceType.STORAGE_POOL); + volume.setInstanceId(null); + volume.setUpdated(new Date()); + volume.setStatus(AsyncInstanceCreateStatus.Creating); + volume.setDomainId(account.getDomainId().longValue()); + volume = _volsDao.persist(volume); + + AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); + if (asyncExecutor != null) { + AsyncJobVO job = asyncExecutor.getJob(); + + if (s_logger.isInfoEnabled()) + s_logger.info("CreateVolume created a new instance " + volume.getId() + ", update async job-" + job.getId() + " progress status"); + + _asyncMgr.updateAsyncJobAttachment(job.getId(), "volume", volume.getId()); + _asyncMgr.updateAsyncJobStatus(job.getId(), BaseCmd.PROGRESS_INSTANCE_CREATED, volume.getId()); + } + + List poolsToAvoid = new ArrayList(); + Set podsToAvoid = new HashSet(); + Pair pod = null; + VolumeVO createdVolume = null; + + while ((pod = _agentMgr.findPod(null, null, dc, account.getId(), podsToAvoid)) != null) { + if ((createdVolume = createVolume(volume, null, null, dc, pod.first(), null, null, diskOffering, poolsToAvoid)) != null) { + break; + } else { + podsToAvoid.add(pod.first().getId()); + } + } + + // Create an event + EventVO event = new EventVO(); + event.setAccountId(accountId); + event.setUserId(userId); + event.setType(EventTypes.EVENT_VOLUME_CREATE); + event.setStartId(startEventId); + + Transaction txn = Transaction.currentTxn(); + try { txn.start(); if (createdVolume != null) { @@ -1549,14 +1507,18 @@ public class StorageManagerImpl implements StorageManager { event.setLevel(EventVO.LEVEL_INFO); event.setDescription("Created volume: " + createdVolume.getName() + " with size: " + sizeMB + " MB in pool: " + pool.getName()); event.setParameters(eventParams); - _eventDao.persist(event); } else { // Mark the existing volume record as corrupted volume.setStatus(AsyncInstanceCreateStatus.Corrupted); volume.setDestroyed(true); _volsDao.update(volume.getId(), volume); - } - + + // Set event parameters + event.setLevel(EventVO.LEVEL_ERROR); + event.setDescription("Failed to create volume with size: " + diskOffering.getDiskSizeInBytes() / (1024 * 1024) + " mb"); + } + + _eventDao.persist(event); txn.commit(); } catch (Exception e) { s_logger.error("Unhandled exception while saving volume " + volumeName, e); @@ -1595,7 +1557,7 @@ public class StorageManagerImpl implements StorageManager { @Override public void createCapacityEntry(StoragePoolVO storagePool) { - SearchCriteria capacitySC = _capacityDao.createSearchCriteria(); + SearchCriteria capacitySC = _capacityDao.createSearchCriteria(); capacitySC.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, storagePool.getId()); capacitySC.addAnd("dataCenterId", SearchCriteria.Op.EQ, storagePool.getDataCenterId()); capacitySC.addAnd("capacityType", SearchCriteria.Op.EQ, CapacityVO.CAPACITY_TYPE_STORAGE); @@ -1672,7 +1634,8 @@ public class StorageManagerImpl implements StorageManager { hostId = storagePoolHost.getHostId(); HostVO hostVO = _hostDao.findById(hostId); if (shouldBeSnapshotCapable) { - if (hostVO == null ) { + if (hostVO == null || hostVO.getHypervisorType() != Hypervisor.Type.XenServer) { + // Only XenServer hosts are snapshot capable. hostsToAvoid.add(hostId); continue; } @@ -1814,7 +1777,7 @@ public class StorageManagerImpl implements StorageManager { } public List getStoragePoolsForVm(long vmId) { - SearchCriteria sc = PoolsUsedByVmSearch.create(); + SearchCriteria sc = PoolsUsedByVmSearch.create(); sc.setJoinParameters("volumes", "vm", vmId); return _storagePoolDao.search(sc, null); @@ -1829,322 +1792,4 @@ public class StorageManagerImpl implements StorageManager { assert storagePoolVO != null; return storagePoolVO.getUuid(); } - - @Override - @DB - public boolean preparePrimaryStorageForMaintenance(long primaryStorageId, long userId) - { - boolean destroyVolumes = false; - long count = 1; - long consoleProxyId = 0; - long ssvmId = 0; - try - { - //1. Get the primary storage record - StoragePoolVO primaryStorage = _storagePoolDao.findById(primaryStorageId); - - if(primaryStorage == null) - { - s_logger.warn("The primary storage does not exist"); - return false; - } - - //check to see if other ps exist - //if they do, then we can migrate over the system vms to them, destroy volumes for sys vms - //if they dont, then do NOT destroy the volumes on this one - count = _storagePoolDao.countBy(primaryStorage.getId(), Status.Up); - if(count>1) - { - destroyVolumes = true; - } - - //2. Get a list of all the volumes within this storage pool - List allVolumes = _volsDao.findByPoolId(primaryStorageId); - List markedVolumes = new ArrayList(); - - //3. Each volume has an instance associated with it, stop the instance if running - for(VolumeVO volume : allVolumes) - { - VMInstanceVO vmInstance = _vmInstanceDao.findById(volume.getInstanceId()); - - //shut down the running vms - if(vmInstance.getState().equals(State.Running) || vmInstance.getState().equals(State.Stopped) || vmInstance.getState().equals(State.Stopping) || vmInstance.getState().equals(State.Starting)) - { - - //if the instance is of type consoleproxy, call the console proxy - if(vmInstance.getType().equals(VirtualMachine.Type.ConsoleProxy)) - { - //add this volume to be removed if flag=true - if(destroyVolumes) - markedVolumes.add(volume); - - //make sure it is not restarted again, update config to set flag to false - _configMgr.updateConfiguration(userId, "consoleproxy.restart", "false"); - - //create a dummy event - long eventId = saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_PROXY_STOP, "stopping console proxy with Id: "+vmInstance.getId()); - - //call the consoleproxymanager - if(!_consoleProxyMgr.stopProxy(vmInstance.getId(), eventId)) - { - s_logger.warn("There was an error stopping the console proxy id: "+vmInstance.getId()+" ,cannot enable storage maintenance"); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } - else - { - if(destroyVolumes) - { - //proxy vm is stopped, and we have another ps available - //get the id for restart - consoleProxyId = vmInstance.getId(); - } - } - } - - //if the instance is of type uservm, call the user vm manager - if(vmInstance.getType().equals(VirtualMachine.Type.User)) - { - - if(!_userVmMgr.stopVirtualMachine(userId, vmInstance.getId())) - { - s_logger.warn("There was an error stopping the user vm id: "+vmInstance.getId()+" ,cannot enable storage maintenance"); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } - } - - //if the instance is of type secondary storage vm, call the secondary storage vm manager - if(vmInstance.getType().equals(VirtualMachine.Type.SecondaryStorageVm)) - { - //add this volume to be removed if flag=true - if(destroyVolumes) - markedVolumes.add(volume); - - //create a dummy event - long eventId1 = saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_STOP, "stopping ssvm with Id: "+vmInstance.getId()); - - if(!_secStorageMgr.stopSecStorageVm(vmInstance.getId(), eventId1)) - { - s_logger.warn("There was an error stopping the ssvm id: "+vmInstance.getId()+" ,cannot enable storage maintenance"); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } - else - { - if(destroyVolumes) - { - //ss vm is stopped, and we have another ps available - //get the id for restart - ssvmId = vmInstance.getId(); - } - } - - } - - //if the instance is of type domain router vm, call the network manager - if(vmInstance.getType().equals(VirtualMachine.Type.DomainRouter)) - { - //add this volume to be removed if flag=true - if(destroyVolumes) - markedVolumes.add(volume); - - //create a dummy event - long eventId2 = saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_ROUTER_STOP, "stopping domain router with Id: "+vmInstance.getId()); - - if(!_networkMgr.stopRouter(vmInstance.getId(), eventId2)) - { - s_logger.warn("There was an error stopping the domain router id: "+vmInstance.getId()+" ,cannot enable primary storage maintenance"); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } - } - - } - } - - //4. Mark the volumes as removed - for(VolumeVO vol : markedVolumes) - { - _volsDao.remove(vol.getId()); - } - - //5. Restart all the system vms conditionally - if(destroyVolumes) //this means we have another ps. Ok to restart - { - //create a dummy event - long eventId = saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_START, "starting ssvm with Id: "+ssvmId); - if(_secStorageMgr.startSecStorageVm(ssvmId, eventId)==null) - { - s_logger.warn("There was an error starting the ssvm id: "+ssvmId+" on another storage pool, cannot enable primary storage maintenance"); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } - - //create a dummy event - long eventId1 = saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_PROXY_START, "starting console proxy with Id: "+consoleProxyId); - - //Restore config val for consoleproxy.restart to true - _configMgr.updateConfiguration(userId, "consoleproxy.restart", "true"); - - if(_consoleProxyMgr.startProxy(consoleProxyId, eventId1)==null) - { - s_logger.warn("There was an error starting the console proxy id: "+consoleProxyId+" on another storage pool, cannot enable primary storage maintenance"); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; } - } - - //6. Update the status - primaryStorage.setStatus(Status.Maintenance); - _storagePoolDao.persist(primaryStorage); - - } catch (Exception e) { - s_logger.error("Exception in enabling primary storage maintenance:"+e); - } - - return true; - } - - private Long saveScheduledEvent(Long userId, Long accountId, String type, String description) - { - EventVO event = new EventVO(); - event.setUserId(userId); - event.setAccountId(accountId); - event.setType(type); - event.setState(EventState.Scheduled); - event.setDescription("Scheduled async job for "+description); - event = _eventDao.persist(event); - return event.getId(); - } - - @Override - @DB - public boolean cancelPrimaryStorageForMaintenance(long primaryStorageId,long userId) - { - //1. Get the primary storage record - StoragePoolVO primaryStorage = _storagePoolDao.findById(primaryStorageId); - - if(primaryStorage == null) - { - s_logger.warn("The primary storage does not exist"); - return false; - } - - //2. Get a list of all the volumes within this storage pool - List allVolumes = _volsDao.findByPoolId(primaryStorageId); - - //3. If the volume is not removed AND not destroyed, start the vm corresponding to it - for(VolumeVO volume: allVolumes) - { - if((!volume.destroyed) && (volume.removed==null)) - { - VMInstanceVO vmInstance = _vmInstanceDao.findById(volume.getInstanceId()); - - if(vmInstance.getState().equals(State.Stopping) || vmInstance.getState().equals(State.Stopped)) - { - //if the instance is of type consoleproxy, call the console proxy - if(vmInstance.getType().equals(VirtualMachine.Type.ConsoleProxy)) - { - - //create a dummy event - long eventId = saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_PROXY_START, "starting console proxy with Id: "+vmInstance.getId()); - - if(_consoleProxyMgr.startProxy(vmInstance.getId(), eventId)==null) - { - s_logger.warn("There was an error starting the console proxy id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } - } - - //if the instance is of type ssvm, call the ssvm manager - if(vmInstance.getType().equals(VirtualMachine.Type.SecondaryStorageVm)) - { - - //create a dummy event - long eventId = saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_START, "starting ssvm with Id: "+vmInstance.getId()); - - if(_secStorageMgr.startSecStorageVm(vmInstance.getId(), eventId)==null) - { - s_logger.warn("There was an error starting the ssvm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } - } - - //if the instance is of type user vm, call the user vm manager - if(vmInstance.getType().equals(VirtualMachine.Type.User)) - { - - //create a dummy event - long eventId = saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_VM_START, "starting ssvm with Id: "+vmInstance.getId()); - - try { - if(_userVmMgr.start(vmInstance.getId(), eventId)==null) - { - s_logger.warn("There was an error starting the ssvm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } - } catch (StorageUnavailableException e) { - s_logger.warn("There was an error starting the ssvm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"); - s_logger.warn(e); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } catch (InsufficientCapacityException e) { - s_logger.warn("There was an error starting the ssvm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"); - s_logger.warn(e); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } catch (ConcurrentOperationException e) { - s_logger.warn("There was an error starting the ssvm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"); - s_logger.warn(e); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } catch (ExecutionException e) { - s_logger.warn("There was an error starting the ssvm id: "+vmInstance.getId()+" on storage pool, cannot complete primary storage maintenance"); - s_logger.warn(e); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } - } - - } - } - } - - //Restore config val for consoleproxy.restart to true - try { - _configMgr.updateConfiguration(userId, "consoleproxy.restart", "true"); - } catch (InvalidParameterValueException e) { - s_logger.warn("Error changing consoleproxy.restart back to false at end of cancel maintenance:"+e); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } catch (InternalErrorException e) { - s_logger.warn("Error changing consoleproxy.restart back to false at end of cancel maintenance:"+e); - primaryStorage.setStatus(Status.ErrorInMaintenance); - _storagePoolDao.persist(primaryStorage); - return false; - } - - //Change the storage state back to up - primaryStorage.setStatus(Status.Up); - _storagePoolDao.persist(primaryStorage); - - return true; - } } diff --git a/server/src/com/cloud/storage/allocator/AbstractStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/AbstractStoragePoolAllocator.java index ed8d67ca8a3..908e7f82948 100644 --- a/server/src/com/cloud/storage/allocator/AbstractStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/AbstractStoragePoolAllocator.java @@ -31,8 +31,8 @@ import com.cloud.agent.api.to.DiskCharacteristicsTO; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.host.Host; import com.cloud.host.HostVO; -import com.cloud.offering.ServiceOffering; import com.cloud.server.StatsCollector; +import com.cloud.service.ServiceOffering; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolVO; diff --git a/server/src/com/cloud/storage/allocator/FirstFitStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/FirstFitStoragePoolAllocator.java index ae9bf16f7db..08ce2417542 100644 --- a/server/src/com/cloud/storage/allocator/FirstFitStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/FirstFitStoragePoolAllocator.java @@ -28,8 +28,8 @@ import org.apache.log4j.Logger; import com.cloud.agent.api.to.DiskCharacteristicsTO; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; -import com.cloud.offering.ServiceOffering; import com.cloud.server.StatsCollector; +import com.cloud.service.ServiceOffering; import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; diff --git a/server/src/com/cloud/storage/allocator/GarbageCollectingStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/GarbageCollectingStoragePoolAllocator.java index 9bb42ce5c90..5fd61423688 100644 --- a/server/src/com/cloud/storage/allocator/GarbageCollectingStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/GarbageCollectingStoragePoolAllocator.java @@ -30,7 +30,7 @@ import com.cloud.agent.api.to.DiskCharacteristicsTO; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePool; import com.cloud.storage.VMTemplateVO; diff --git a/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java index 6c77e946c2a..935dd7d529e 100644 --- a/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java @@ -17,6 +17,8 @@ */ package com.cloud.storage.allocator; +import java.math.BigInteger; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -33,9 +35,9 @@ import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; -import com.cloud.offering.ServiceOffering; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.service.ServiceOffering; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolHostVO; @@ -45,7 +47,6 @@ import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.utils.DateUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.component.Inject; -import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Func; @@ -73,7 +74,7 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator { @Inject CapacityDao _capacityDao; @Inject ConfigurationDao _configDao; - protected GenericSearchBuilder VmsOnPoolSearch; + protected SearchBuilder VmsOnPoolSearch; private int _hoursToSkipStoppedVMs = 24; @@ -116,11 +117,16 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator { StoragePoolHostVO spHost = hostsInSPool.get(0); - SearchCriteria sc = VmsOnPoolSearch.create(); + SearchCriteria sc = VmsOnPoolSearch.create(); sc.setJoinParameters("volumeJoin", "poolId", pool.getId()); sc.setParameters("state", State.Expunging); - List vmsOnHost = _vmInstanceDao.searchAll(sc, null); + List results = _vmInstanceDao.searchAll(sc, null); + List vmsOnHost = new ArrayList(); + for(Object[] row : results) { + vmsOnHost.add(new Long(((BigInteger)row[0]).longValue())); + } + if(s_logger.isDebugEnabled()) { s_logger.debug("Found " + vmsOnHost.size() + " VM instances are alloacated at host " + spHost.getHostId() + " with local storage pool " + pool.getName()); for(Long vmId : vmsOnHost) @@ -161,7 +167,7 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator { s_logger.debug("Calculated static-allocated memory for VMs on host " + hostId + ": " + usedMemory + " bytes, requesting memory: " + (so != null ? so.getRamSize()*1024L*1024L : "") + " bytes"); - SearchCriteria sc = _capacityDao.createSearchCriteria(); + SearchCriteria sc = _capacityDao.createSearchCriteria(); sc.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, hostId); sc.addAnd("capacityType", SearchCriteria.Op.EQ, CapacityVO.CAPACITY_TYPE_MEMORY); List capacities = _capacityDao.search(sc, null); @@ -279,8 +285,8 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator { _routerRamSize = NumbersUtil.parseInt(configs.get("router.ram.size"), 128); _proxyRamSize = NumbersUtil.parseInt(configs.get("consoleproxy.ram.size"), 1024); - VmsOnPoolSearch = _vmInstanceDao.createSearchBuilder(Long.class); - VmsOnPoolSearch.select(null, Func.DISTINCT, VmsOnPoolSearch.entity().getId()); + VmsOnPoolSearch = _vmInstanceDao.createSearchBuilder(); + VmsOnPoolSearch.select(Func.DISTINCT, VmsOnPoolSearch.entity().getId()); VmsOnPoolSearch.and("removed", VmsOnPoolSearch.entity().getRemoved(), SearchCriteria.Op.NULL); VmsOnPoolSearch.and("state", VmsOnPoolSearch.entity().getState(), SearchCriteria.Op.NIN); diff --git a/server/src/com/cloud/storage/allocator/RandomStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/RandomStoragePoolAllocator.java index ee0b6252911..19ae594deb3 100644 --- a/server/src/com/cloud/storage/allocator/RandomStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/RandomStoragePoolAllocator.java @@ -28,8 +28,8 @@ import org.apache.log4j.Logger; import com.cloud.agent.api.to.DiskCharacteristicsTO; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; -import com.cloud.offering.ServiceOffering; import com.cloud.server.StatsCollector; +import com.cloud.service.ServiceOffering; import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; diff --git a/server/src/com/cloud/storage/allocator/StoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/StoragePoolAllocator.java index 8d592ec4bfb..bf2705eee7a 100644 --- a/server/src/com/cloud/storage/allocator/StoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/StoragePoolAllocator.java @@ -23,7 +23,7 @@ import com.cloud.agent.api.to.DiskCharacteristicsTO; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.host.Host; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.storage.StoragePool; import com.cloud.storage.VMTemplateVO; import com.cloud.utils.component.Adapter; diff --git a/server/src/com/cloud/storage/allocator/UseLocalForRootAllocator.java b/server/src/com/cloud/storage/allocator/UseLocalForRootAllocator.java index 1423b214349..6db3f04861b 100644 --- a/server/src/com/cloud/storage/allocator/UseLocalForRootAllocator.java +++ b/server/src/com/cloud/storage/allocator/UseLocalForRootAllocator.java @@ -29,7 +29,7 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.host.Host; -import com.cloud.offering.ServiceOffering; +import com.cloud.service.ServiceOffering; import com.cloud.storage.StoragePool; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume.VolumeType; diff --git a/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDaoImpl.java b/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDaoImpl.java index 79fce87a75e..6004dc89a1a 100644 --- a/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDaoImpl.java +++ b/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDaoImpl.java @@ -17,6 +17,7 @@ */ package com.cloud.storage.preallocatedlun.dao; +import java.math.BigDecimal; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -35,7 +36,6 @@ import com.cloud.storage.preallocatedlun.PreallocatedLunVO; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; @@ -50,9 +50,9 @@ public class PreallocatedLunDaoImpl extends GenericDaoBase TakeSearch; private final SearchBuilder ReleaseSearch; - private final GenericSearchBuilder DetailsSearch; - private final GenericSearchBuilder TotalSizeSearch; - private final GenericSearchBuilder UsedSizeSearch; + private final SearchBuilder DetailsSearch; + private final SearchBuilder TotalSizeSearch; + private final SearchBuilder UsedSizeSearch; private final SearchBuilder DeleteSearch; private final String TakeSqlPrefix = "SELECT ext_lun_alloc.* FROM ext_lun_alloc LEFT JOIN ext_lun_details ON ext_lun_details.ext_lun_id = ext_lun_alloc.id WHERE (ext_lun_alloc.target_iqn=?) AND (ext_lun_alloc.size>=?) AND (ext_lun_alloc.size<=?) AND "; @@ -70,23 +70,23 @@ public class PreallocatedLunDaoImpl extends GenericDaoBase targetSearch = createSearchBuilder(); targetSearch.and("targetiqn", targetSearch.entity().getTargetIqn(), SearchCriteria.Op.EQ); DetailsSearch.join("target", targetSearch, targetSearch.entity().getId(), DetailsSearch.entity().getLunId()); - DetailsSearch.select(null, Func.DISTINCT, DetailsSearch.entity().getTag()); + DetailsSearch.select(Func.DISTINCT, DetailsSearch.entity().getTag()); DetailsSearch.done(); targetSearch.done(); - TotalSizeSearch = createSearchBuilder(Long.class); + TotalSizeSearch = createSearchBuilder(); TotalSizeSearch.and("target", TotalSizeSearch.entity().getTargetIqn(), SearchCriteria.Op.EQ); - TotalSizeSearch.select(null, Func.SUM, TotalSizeSearch.entity().getSize()); + TotalSizeSearch.select(Func.SUM, TotalSizeSearch.entity().getSize()); TotalSizeSearch.done(); - UsedSizeSearch = createSearchBuilder(Long.class); + UsedSizeSearch = createSearchBuilder(); UsedSizeSearch.and("target", UsedSizeSearch.entity().getTargetIqn(), SearchCriteria.Op.EQ); UsedSizeSearch.and("taken", UsedSizeSearch.entity().getTaken(), SearchCriteria.Op.NNULL); - UsedSizeSearch.select(null, Func.SUM, UsedSizeSearch.entity().getSize()); + UsedSizeSearch.select(Func.SUM, UsedSizeSearch.entity().getSize()); UsedSizeSearch.done(); DeleteSearch = createSearchBuilder(); @@ -97,7 +97,7 @@ public class PreallocatedLunDaoImpl extends GenericDaoBase sc = DeleteSearch.create(); + SearchCriteria sc = DeleteSearch.create(); sc.setParameters("id", id); return delete(sc) > 0; @@ -105,7 +105,7 @@ public class PreallocatedLunDaoImpl extends GenericDaoBase sc = ReleaseSearch.create(); + SearchCriteria sc = ReleaseSearch.create(); sc.setParameters("lun", lunId); sc.setParameters("target", targetIqn); sc.setParameters("instanceId", instanceId); @@ -181,35 +181,41 @@ public class PreallocatedLunDaoImpl extends GenericDaoBase sc = TotalSizeSearch.create(); + SearchCriteria sc = TotalSizeSearch.create(); sc.setParameters("target", targetIqn); - List results = searchAll(sc, null); - if (results.size() == 0) { + List results = searchAll(sc, null); + if (results.size() == 0 || results.get(0)[0] == null) { return 0; } - return results.get(0); + return ((BigDecimal)(results.get(0)[0])).longValue(); } @Override public long getUsedSize(String targetIqn) { - SearchCriteria sc = UsedSizeSearch.create(); + SearchCriteria sc = UsedSizeSearch.create(); sc.setParameters("target", targetIqn); - List results = searchAll(sc, null); - if (results.size() == 0) { + List results = searchAll(sc, null); + if (results.size() == 0 || results.get(0)[0] == null) { return 0; } - return results.get(0); + return ((BigDecimal)(results.get(0)[0])).longValue(); } @Override public List findDistinctTagsForTarget(String targetIqn) { - SearchCriteria sc = DetailsSearch.create(); + SearchCriteria sc = DetailsSearch.create(); sc.setJoinParameters("target", "targetiqn", targetIqn); - return _detailsDao.searchAll(sc, null); + List results = _detailsDao.searchAll(sc); + List tags = new ArrayList(results.size()); + for (Object[] result : results) { + tags.add((String)result[0]); + } + + return tags; } @Override @DB diff --git a/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDetailsDao.java b/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDetailsDao.java index 940ae35f51b..92a6d3d2447 100644 --- a/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDetailsDao.java +++ b/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDetailsDao.java @@ -17,8 +17,14 @@ */ package com.cloud.storage.preallocatedlun.dao; +import java.util.List; + import com.cloud.storage.preallocatedlun.PreallocatedLunDetailVO; import com.cloud.utils.db.GenericDao; +import com.cloud.utils.db.SearchCriteria; public interface PreallocatedLunDetailsDao extends GenericDao { + List searchAll(SearchCriteria sc); + + // List findLunIdsWithTags(String... tags); } diff --git a/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDetailsDaoImpl.java b/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDetailsDaoImpl.java index 8b83bfd92f9..eecb0249ca0 100644 --- a/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDetailsDaoImpl.java +++ b/server/src/com/cloud/storage/preallocatedlun/dao/PreallocatedLunDetailsDaoImpl.java @@ -17,15 +17,77 @@ */ package com.cloud.storage.preallocatedlun.dao; +import java.util.List; + import javax.ejb.Local; import com.cloud.storage.preallocatedlun.PreallocatedLunDetailVO; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchCriteria; @Local(value=PreallocatedLunDetailsDao.class) @DB(txn=false) public class PreallocatedLunDetailsDaoImpl extends GenericDaoBase implements PreallocatedLunDetailsDao { + private static final String SearchTagsSql = "SELECT ext_lun_details.ext_lun_id from ext_lun_details where "; protected PreallocatedLunDetailsDaoImpl() { } + @Override + public List searchAll(SearchCriteria sc) { + return searchAll(sc, null); + } + + public List findLunIdsWithTags(int limit, String... tags) { + return null; + } + /* + private static final String DetailsSql = + "SELECT storage_pool_details.pool_id, count(*) from cloud.storage_pool_details where storage_pool_details.pool_id in ("; + +protected StoragePoolDetailsDaoImpl() { + super(); +} + +public List findPoolIdsByDetails(Map details, long... poolIds) { + StringBuilder sql = new StringBuilder(DetailsSql); + if (poolIds.length > 0) { + sql.append("storage_pool_details.pool_id in ("); + for (long poolId : poolIds) { + sql.append(poolId).append(","); + } + sql.delete(sql.length()-1, sql.length()); + sql.append(") AND ("); + } + + for (Map.Entry detail : details.entrySet()) { + sql.append("(").append("name=").append(detail.getKey()).append(" AND "); + sql.append("value=").append(detail.getValue()).append(") OR "); + } + sql.delete(sql.length() - 3, sql.length()); + if (poolIds.length > 0) { + sql.append(")"); + } + sql.append("GROUP BY storage_pool_details.pool_id"); + Transaction txn = Transaction.currentTxn(); + + int count = details.size(); + + PreparedStatement pstmt; + try { + pstmt = txn.prepareAutoCloseStatement(sql.toString()); + ResultSet rs = pstmt.executeQuery(); + List results = new ArrayList(); + + while (rs.next()) { + if (rs.getInt(2) >= count) { + results.add(rs.getLong(1)); + } + } + return results; + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to execute " + sql.toString(), e); + } +} +*/ + } diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index dadef9db822..529e710266e 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -86,8 +86,8 @@ import com.cloud.network.IpAddrAllocator; import com.cloud.network.NetworkManager; import com.cloud.network.IpAddrAllocator.networkInfo; import com.cloud.network.dao.IPAddressDao; -import com.cloud.offering.ServiceOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePoolVO; @@ -233,6 +233,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V @Override public SecondaryStorageVmVO startSecStorageVm(long secStorageVmId, long startEventId) { try { + saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_START, "Starting secondary storage Vm Id: "+secStorageVmId, startEventId); return start(secStorageVmId, startEventId); } catch (StorageUnavailableException e) { s_logger.warn("Exception while trying to start secondary storage vm", e); @@ -248,10 +249,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V @Override @DB public SecondaryStorageVmVO start(long secStorageVmId, long startEventId) throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException { - long eventId = saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_START, "Starting secondary storage Vm Id: "+secStorageVmId, startEventId); - if(startEventId == 0){ - startEventId = eventId; - } + AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); if (asyncExecutor != null) { AsyncJobVO job = asyncExecutor.getJob(); @@ -264,7 +262,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId); if (secStorageVm == null || secStorageVm.getRemoved() != null) { s_logger.debug("secondary storage vm is not found: " + secStorageVmId); - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_START, "secondary storage vm is not found", startEventId); return null; } @@ -303,7 +300,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V if (s_logger.isTraceEnabled()) s_logger.trace("Secondary storage vm is already started: " + secStorageVm.getName()); - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_START, "Secondary storage vm is already started", startEventId); return secStorageVm; } @@ -419,7 +415,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } catch (OperationTimedoutException e) { if (e.isActive()) { s_logger.debug("Unable to start vm " + secStorageVm.getName() + " due to operation timed out and it is active so scheduling a restart."); - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_START, "Unable to start vm due to operation timed out", startEventId); _haMgr.scheduleRestart(secStorageVm, true); return null; } @@ -498,6 +493,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V secStorageVm.setPrivateIpAddress(null); freePrivateIpAddress(privateIpAddress, secStorageVm.getDataCenterId(), secStorageVm.getId()); } + secStorageVm.setStorageIp(null); _secStorageVmDao.updateIf(secStorageVm, Event.OperationFailed, null); txn.commit(); } catch (Exception e) { @@ -670,17 +666,15 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V @DB protected Map createSecStorageVmInstance(long dataCenterId) { - long startEventId = saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_CREATE, "Creating secondary storage Vm in zone : "+dataCenterId, 0); + Map context = new HashMap(); String publicIpAddress = null; HostVO secHost = _hostDao.findSecondaryStorageHost(dataCenterId); if (secHost == null) { String msg = "No secondary storage available in zone " + dataCenterId + ", cannot create secondary storage vm"; s_logger.warn(msg); - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_CREATE, msg, startEventId); throw new CloudRuntimeException(msg); } - boolean success = false; Transaction txn = Transaction.currentTxn(); try { DataCenterVO dc = _dcDao.findById(dataCenterId); @@ -741,7 +735,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V SecondaryStorageVmVO secStorageVm; String name = VirtualMachineName.getSystemVmName(id, _instance, "s").intern(); - secStorageVm = new SecondaryStorageVmVO(id, name, guestMacAddress, null, NetUtils.getLinkLocalNetMask(), + secStorageVm = new SecondaryStorageVmVO(id, name, State.Creating, guestMacAddress, null, NetUtils.getLinkLocalNetMask(), privateMacAddress, null, cidrNetmask, _template.getId(), _template.getGuestOSId(), publicMacAddress, publicIpAddress, vlanNetmask, publicIpAndVlan._vlanDbId, publicIpAndVlan._vlanid, pod.first().getId(), dataCenterId, vlanGateway, null, @@ -755,11 +749,10 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V event.setAccountId(Account.ACCOUNT_ID_SYSTEM); event.setType(EventTypes.EVENT_SSVM_CREATE); event.setLevel(EventVO.LEVEL_INFO); - event.setStartId(startEventId); event.setDescription("New Secondary Storage VM created - " + secStorageVm.getName()); _eventDao.persist(event); txn.commit(); - success = true; + context.put("secStorageVmId", secStorageVmId); return context; } catch (Throwable e) { @@ -767,10 +760,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V context.put("secStorageVmId", (long) 0); return context; - } finally { - if(!success){ - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_CREATE, "Failed to create secondary storage Vm", startEventId); - } } } @@ -1103,7 +1092,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V public boolean isZoneReady(Map zoneHostInfoMap, long dataCenterId) { ZoneHostInfo zoneHostInfo = zoneHostInfoMap.get(dataCenterId); - if(zoneHostInfo != null && (zoneHostInfo.getFlags() & RunningHostInfoAgregator.ZoneHostInfo.ROUTING_HOST_MASK) != 0) { + if(zoneHostInfo != null && (zoneHostInfo.getFlags() & RunningHostInfoAgregator.ZoneHostInfo.COMPUTING_HOST_MASK) != 0) { VMTemplateVO template = _templateDao.findConsoleProxyTemplate(); HostVO secHost = _hostDao.findSecondaryStorageHost(dataCenterId); if (secHost == null) { @@ -1424,6 +1413,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V secStorageVm.setGuestIpAddress(null); _dcDao.releaseLinkLocalPrivateIpAddress(guestIpAddress, secStorageVm.getDataCenterId(), secStorageVm.getId()); } + secStorageVm.setStorageIp(null); if (!_secStorageVmDao.updateIf(secStorageVm, ev, null)) { s_logger.debug("Unable to update the secondary storage vm"); return; @@ -1462,18 +1452,14 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V s_logger.info("Stop secondary storage vm " + secStorageVmId + ", update async job-" + job.getId()); _asyncMgr.updateAsyncJobAttachment(job.getId(), "secStorageVm", secStorageVmId); } - long eventId = saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_STOP, "Stopping secondary storage Vm with Id: "+secStorageVmId, startEventId); - if(startEventId == 0){ - startEventId = eventId; - } + SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId); if (secStorageVm == null) { - String msg = "Stopping secondary storage vm failed: secondary storage vm " + secStorageVmId + " no longer exists"; if (s_logger.isDebugEnabled()) - s_logger.debug(msg); - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_STOP, msg, startEventId); + s_logger.debug("Stopping secondary storage vm failed: secondary storage vm " + secStorageVmId + " no longer exists"); return false; } + saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_STOP, "Stopping secondary storage Vm Id: "+secStorageVmId, startEventId); try { return stop(secStorageVm, startEventId); } catch (AgentUnavailableException e) { @@ -1495,17 +1481,13 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } final SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId); - - long eventId = saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_REBOOT, "Rebooting secondary storage Vm Id: "+secStorageVmId, startEventId); - if(startEventId == 0 ){ - startEventId = eventId; - } if (secStorageVm == null || secStorageVm.getState() == State.Destroyed) { - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_REBOOT, "Rebooting secondary storage Vm failed", startEventId); return false; } + saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_REBOOT, "Rebooting secondary storage Vm Id: "+secStorageVmId, startEventId); + if (secStorageVm.getState() == State.Running && secStorageVm.getHostId() != null) { final RebootCommand cmd = new RebootCommand(secStorageVm.getInstanceName()); final Answer answer = _agentMgr.easySend(secStorageVm.getHostId(), cmd); @@ -1531,14 +1513,20 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V _eventDao.persist(event); return true; } else { - String msg = "Rebooting Secondary Storage VM failed - " + secStorageVm.getName(); - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_REBOOT, msg, startEventId); + + final EventVO event = new EventVO(); + event.setUserId(User.UID_SYSTEM); + event.setAccountId(Account.ACCOUNT_ID_SYSTEM); + event.setType(EventTypes.EVENT_SSVM_REBOOT); + event.setLevel(EventVO.LEVEL_ERROR); + event.setStartId(startEventId); + event.setDescription("Rebooting Secondary Storage VM failed - " + secStorageVm.getName()); + _eventDao.persist(event); if (s_logger.isDebugEnabled()) - s_logger.debug(msg); + s_logger.debug("failed to reboot secondary storage vm : " + secStorageVm.getName()); return false; } } else { - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_REBOOT, "Secondary Storage not in running state. Starting Vm", startEventId); return startSecStorageVm(secStorageVmId, 0) != null; } } @@ -1560,30 +1548,23 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V s_logger.info("Destroy secondary storage vm " + vmId + ", update async job-" + job.getId()); _asyncMgr.updateAsyncJobAttachment(job.getId(), "secstorage_vm", vmId); } - - long eventId = saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_DESTROY, "Destroying secondary storage Vm Id: "+vmId, startEventId); - if(startEventId == 0 ){ - startEventId = eventId; - } SecondaryStorageVmVO vm = _secStorageVmDao.findById(vmId); if (vm == null || vm.getState() == State.Destroyed) { - String msg = "Unable to find vm or vm is destroyed: " + vmId; if (s_logger.isDebugEnabled()) { - s_logger.debug(msg); + s_logger.debug("Unable to find vm or vm is destroyed: " + vmId); } - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_DESTROY, msg, startEventId); return true; } + + saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_DESTROY, "Destroying secondary storage Vm Id: "+vmId, startEventId); if (s_logger.isDebugEnabled()) { s_logger.debug("Destroying secondary storage vm vm " + vmId); } if (!_secStorageVmDao.updateIf(vm, Event.DestroyRequested, null)) { - String msg = "Unable to destroy the vm because it is not in the correct state: " + vmId; - s_logger.debug(msg); - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_DESTROY, msg, startEventId); + s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vmId); return false; } @@ -1662,9 +1643,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V @Override public boolean stop(SecondaryStorageVmVO secStorageVm, long startEventId) throws AgentUnavailableException { if (!_secStorageVmDao.updateIf(secStorageVm, Event.StopRequested, secStorageVm.getHostId())) { - String msg = "Unable to stop secondary storage vm: " + secStorageVm.toString(); - s_logger.debug(msg); - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_STOP, msg, startEventId); + s_logger.debug("Unable to stop secondary storage vm: " + secStorageVm.toString()); return false; } @@ -1683,9 +1662,15 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V try { StopAnswer answer = (StopAnswer) _agentMgr.send(secStorageVm.getHostId(), cmd); if (answer == null || !answer.getResult()) { - String msg = "Unable to stop due to " + (answer == null ? "answer is null" : answer.getDetails()); - s_logger.debug(msg); - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_STOP, msg, startEventId); + s_logger.debug("Unable to stop due to " + (answer == null ? "answer is null" : answer.getDetails())); + final EventVO event = new EventVO(); + event.setUserId(User.UID_SYSTEM); + event.setAccountId(Account.ACCOUNT_ID_SYSTEM); + event.setType(EventTypes.EVENT_SSVM_STOP); + event.setLevel(EventVO.LEVEL_ERROR); + event.setStartId(startEventId); + event.setDescription("Stopping secondary storage vm failed due to negative answer from agent - " + secStorageVm.getName()); + _eventDao.persist(event); return false; } completeStopCommand(secStorageVm, Event.OperationSucceeded); @@ -1706,18 +1691,21 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V _eventDao.persist(event); return true; } catch (OperationTimedoutException e) { - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_STOP, - "Stopping secondary storage vm failed due to operation time out - " + secStorageVm.getName(), startEventId); + final EventVO event = new EventVO(); + event.setUserId(User.UID_SYSTEM); + event.setAccountId(Account.ACCOUNT_ID_SYSTEM); + event.setType(EventTypes.EVENT_SSVM_STOP); + event.setLevel(EventVO.LEVEL_ERROR); + event.setStartId(startEventId); + event.setDescription("Stopping secondary storage vm failed due to operation time out - " + secStorageVm.getName()); + _eventDao.persist(event); throw new AgentUnavailableException(secStorageVm.getHostId()); } } finally { secStorageVmLock.unlock(); } } else { - String msg = "Unable to acquire secondary storage vm lock : " + secStorageVm.toString(); - s_logger.debug(msg); - saveFailedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_STOP, msg, startEventId); - + s_logger.debug("Unable to acquire secondary storage vm lock : " + secStorageVm.toString()); return false; } } finally { @@ -1870,17 +1858,4 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V return event.getId(); return null; } - - private void saveFailedEvent(Long userId, Long accountId, String type, String description, long startEventId) { - EventVO event = new EventVO(); - event.setUserId(userId); - event.setAccountId(accountId); - event.setType(type); - event.setState(EventState.Completed); - event.setLevel(EventVO.LEVEL_ERROR); - event.setDescription(description); - event.setStartId(startEventId); - _eventDao.persist(event); - return; - } } diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index ec5e9f63963..c4dc99911e6 100644 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -20,8 +20,10 @@ package com.cloud.storage.snapshot; import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import javax.ejb.Local; import javax.naming.ConfigurationException; @@ -32,6 +34,8 @@ import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.BackupSnapshotAnswer; import com.cloud.agent.api.BackupSnapshotCommand; +import com.cloud.agent.api.CreateVolumeFromSnapshotAnswer; +import com.cloud.agent.api.CreateVolumeFromSnapshotCommand; import com.cloud.agent.api.DeleteSnapshotBackupCommand; import com.cloud.agent.api.DeleteSnapshotsDirCommand; import com.cloud.agent.api.ManageSnapshotAnswer; @@ -41,6 +45,7 @@ import com.cloud.agent.api.ValidateSnapshotCommand; import com.cloud.api.BaseCmd; import com.cloud.api.commands.CreateSnapshotCmd; import com.cloud.api.commands.CreateVolumeCmd; +import com.cloud.async.AsyncInstanceCreateStatus; import com.cloud.async.AsyncJobExecutor; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobVO; @@ -48,6 +53,8 @@ import com.cloud.async.BaseAsyncJobExecutor; import com.cloud.async.executor.SnapshotOperationParam; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.event.EventState; import com.cloud.event.EventTypes; @@ -56,21 +63,30 @@ import com.cloud.event.dao.EventDao; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceAllocationException; +import com.cloud.host.HostVO; import com.cloud.host.dao.DetailsDao; import com.cloud.host.dao.HostDao; import com.cloud.serializer.GsonHelper; +import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.Snapshot; import com.cloud.storage.SnapshotPolicyRefVO; import com.cloud.storage.SnapshotPolicyVO; import com.cloud.storage.SnapshotScheduleVO; import com.cloud.storage.SnapshotVO; import com.cloud.storage.StorageManager; +import com.cloud.storage.StoragePool; +import com.cloud.storage.StoragePoolVO; +import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStoragePoolVO; +import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; import com.cloud.storage.Snapshot.SnapshotType; import com.cloud.storage.Snapshot.Status; import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.Volume.MirrorState; +import com.cloud.storage.Volume.StorageResourceType; import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.dao.DiskOfferingDao; import com.cloud.storage.dao.SnapshotDao; @@ -82,12 +98,15 @@ import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VMTemplatePoolDao; import com.cloud.storage.dao.VolumeDao; +import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; +import com.cloud.user.UserVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.utils.DateUtil; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; import com.cloud.utils.db.DB; @@ -215,7 +234,7 @@ public class SnapshotManagerImpl implements SnapshotManager { ImageFormat format = getImageFormat(volume.getId()); if (format != null) { - if (!(format == ImageFormat.VHD || format == ImageFormat.ISO || format == ImageFormat.QCOW2)) { + if (!(format == ImageFormat.VHD || format == ImageFormat.ISO)) { // We only create snapshots for root disks created from templates or ISOs. s_logger.error("Currently, a snapshot can be taken from a Root Disk only if it is created from a 1) template in VHD format or 2) from an ISO."); runSnap = false; @@ -320,7 +339,7 @@ public class SnapshotManagerImpl implements SnapshotManager { VMInstanceVO vmInstance = _vmDao.findById(volume.getInstanceId()); String vmDisplayName = "detached"; if(vmInstance != null) { - vmDisplayName = vmInstance.getName(); + vmDisplayName = vmInstance.getDisplayName(); } String snapshotName = vmDisplayName + "_" + volume.getName() + "_" + timeString; @@ -344,7 +363,7 @@ public class SnapshotManagerImpl implements SnapshotManager { txn.commit(); // Send a ManageSnapshotCommand to the agent - ManageSnapshotCommand cmd = new ManageSnapshotCommand(ManageSnapshotCommand.CREATE_SNAPSHOT, id, volume.getPath(), snapshotName, _vmDao.findById(volume.getInstanceId()).getInstanceName()); + ManageSnapshotCommand cmd = new ManageSnapshotCommand(ManageSnapshotCommand.CREATE_SNAPSHOT, id, volume.getPath(), snapshotName); String basicErrMsg = "Failed to create snapshot for volume: " + volume.getId(); ManageSnapshotAnswer answer = (ManageSnapshotAnswer) _storageMgr.sendToHostsOnStoragePool(volume.getPoolId(), cmd, basicErrMsg, _totalRetries, _pauseInterval, _shouldBeSnapshotCapable); @@ -501,6 +520,8 @@ public class SnapshotManagerImpl implements SnapshotManager { // If the first snapshot of the root volume is empty, it's parent will point to the base template. // So pass the template uuid as the fake previous snapshot. Long templateId = volume.getTemplateId(); + // ROOT disks are created off templates have templateIds + assert templateId != null; Long poolId = volume.getPoolId(); if (templateId != null && poolId != null) { VMTemplateStoragePoolVO vmTemplateStoragePoolVO = @@ -528,7 +549,6 @@ public class SnapshotManagerImpl implements SnapshotManager { accountId, volumeId, snapshotUuid, - snapshot.getName(), prevSnapshotUuid, prevBackupUuid, firstBackupUuid, @@ -709,7 +729,7 @@ public class SnapshotManagerImpl implements SnapshotManager { details = "Unable find template id: " + templateId + " for root disk volumeId: " + volumeId; s_logger.error(details); } - else if (template.getFormat() == ImageFormat.VHD || template.getFormat() == ImageFormat.QCOW2) { + else if (template.getFormat() == ImageFormat.VHD) { // We support creating snapshots of Root Disk created from template only in VHD format. VMTemplateStoragePoolVO templateStoragePoolVO = _templatePoolDao.findByPoolTemplate(volume.getPoolId(), templateId); if (templateStoragePoolVO != null) { @@ -884,7 +904,6 @@ public class SnapshotManagerImpl implements SnapshotManager { accountId, volumeId, backupOfSnapshot, - snapshot.getName(), backupOfNextSnapshot); details = "Failed to destroy snapshot id:" + snapshotId + " for volume: " + volume.getId(); @@ -1014,7 +1033,7 @@ public class SnapshotManagerImpl implements SnapshotManager { // even if mostRecentSnapshot.removed() != null, we still have to explicitly remove it from the primary storage. // Then deleting the volume VDI will GC the base copy and nothing will be left on primary storage. String mostRecentSnapshotUuid = mostRecentSnapshot.getPath(); - DeleteSnapshotsDirCommand cmd = new DeleteSnapshotsDirCommand(primaryStoragePoolNameLabel, secondaryStoragePoolURL, dcId, accountId, volumeId, mostRecentSnapshotUuid, mostRecentSnapshot.getName()); + DeleteSnapshotsDirCommand cmd = new DeleteSnapshotsDirCommand(primaryStoragePoolNameLabel, secondaryStoragePoolURL, dcId, accountId, volumeId, mostRecentSnapshotUuid); String basicErrMsg = "Failed to destroy snapshotsDir for: " + volume.getId() + " under account: " + accountId; Answer answer = null; Long poolId = volume.getPoolId(); @@ -1155,14 +1174,14 @@ public class SnapshotManagerImpl implements SnapshotManager { @Override public List listPoliciesforSnapshot(long snapshotId) { - SearchCriteria sc = PoliciesForSnapSearch.create(); + SearchCriteria sc = PoliciesForSnapSearch.create(); sc.setJoinParameters("policyRef", "snapshotId", snapshotId); return _snapshotPolicyDao.search(sc, null); } @Override public List listSnapsforPolicy(long policyId, Filter filter) { - SearchCriteria sc = PolicySnapshotSearch.create(); + SearchCriteria sc = PolicySnapshotSearch.create(); sc.setJoinParameters("policy", "policyId", policyId); return _snapshotDao.search(sc, filter); } @@ -1227,7 +1246,6 @@ public class SnapshotManagerImpl implements SnapshotManager { accountId, volumeId, backupOfSnapshot, - snapshot.getName(), backupOfNextSnapshot); String basicErrMsg = "Failed to destroy snapshot id: " + snapshotId + " for volume id: " + volumeId; Answer answer = _storageMgr.sendToHostsOnStoragePool(volume.getPoolId(), cmd, basicErrMsg, _totalRetries, _pauseInterval, _shouldBeSnapshotCapable); diff --git a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java index e76904fa228..899772d2320 100644 --- a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java @@ -129,7 +129,7 @@ public class SnapshotSchedulerImpl implements SnapshotScheduler { } private void checkStatusOfCurrentlyExecutingSnapshots() { - SearchCriteria sc = _snapshotScheduleDao.createSearchCriteria(); + SearchCriteria sc = _snapshotScheduleDao.createSearchCriteria(); sc.addAnd("asyncJobId", SearchCriteria.Op.NNULL); List snapshotSchedules = _snapshotScheduleDao.search(sc, null); for (SnapshotScheduleVO snapshotSchedule : snapshotSchedules) { @@ -201,7 +201,7 @@ public class SnapshotSchedulerImpl implements SnapshotScheduler { @DB public Long scheduleManualSnapshot(Long userId, Long volumeId) { // Check if there is another manual snapshot scheduled which hasn't been executed yet. - SearchCriteria sc = _snapshotScheduleDao.createSearchCriteria(); + SearchCriteria sc = _snapshotScheduleDao.createSearchCriteria(); sc.addAnd("volumeId", SearchCriteria.Op.EQ, volumeId); sc.addAnd("policyId", SearchCriteria.Op.EQ, Snapshot.MANUAL_POLICY_ID); @@ -393,7 +393,6 @@ public class SnapshotSchedulerImpl implements SnapshotScheduler { } else { TimerTask timerTask = new TimerTask() { - @Override public void run() { Date currentTimestamp = new Date(); poll(currentTimestamp); diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 700aa85c42c..10517880140 100644 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -57,6 +57,7 @@ import com.cloud.storage.VolumeVO; import com.cloud.storage.Storage.FileSystem; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; +import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.dao.SnapshotDao; import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.StoragePoolHostDao; @@ -170,7 +171,7 @@ public class TemplateManagerImpl implements TemplateManager { } } - SearchCriteria sc = HostTemplateStatesSearch.create(); + SearchCriteria sc = HostTemplateStatesSearch.create(); sc.setParameters("id", templateId); sc.setParameters("state", Status.DOWNLOADED); sc.setJoinParameters("host", "dcId", pool.getDataCenterId()); @@ -354,6 +355,14 @@ public class TemplateManagerImpl implements TemplateManager { if (template == null || template.getRemoved() != null) { throw new InternalErrorException("Please specify a valid template."); } + EventVO event = new EventVO(); + event.setUserId(userId); + event.setAccountId(template.getAccountId()); + event.setType(EventTypes.EVENT_TEMPLATE_DELETE); + event.setState(EventState.Started); + event.setDescription("Deleting template with Id: "+templateId); + event.setStartId(startEventId); + event = _eventDao.persist(event); String zoneName; List secondaryStorageHosts; diff --git a/server/src/com/cloud/test/DatabaseConfig.java b/server/src/com/cloud/test/DatabaseConfig.java index 2be08d86823..2a910d1c5e8 100644 --- a/server/src/com/cloud/test/DatabaseConfig.java +++ b/server/src/com/cloud/test/DatabaseConfig.java @@ -49,8 +49,8 @@ import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; -import com.cloud.offering.ServiceOffering.GuestIpType; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.service.dao.ServiceOfferingDaoImpl; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.dao.DiskOfferingDaoImpl; @@ -768,7 +768,7 @@ public class DatabaseConfig { String name = _currentObjectParams.get("name"); String displayText = _currentObjectParams.get("displayText"); int diskSpace = Integer.parseInt(_currentObjectParams.get("diskSpace")); -// boolean mirroring = Boolean.parseBoolean(_currentObjectParams.get("mirrored")); + boolean mirroring = Boolean.parseBoolean(_currentObjectParams.get("mirrored")); String tags = _currentObjectParams.get("tags"); if (tags != null && tags.length() > 0) { @@ -780,7 +780,8 @@ public class DatabaseConfig { newTags.delete(newTags.length() - 1, newTags.length()); tags = newTags.toString(); } - DiskOfferingVO diskOffering = new DiskOfferingVO(domainId, name, displayText, diskSpace, tags); + + DiskOfferingVO diskOffering = new DiskOfferingVO(domainId, name, displayText, diskSpace, mirroring, tags); DiskOfferingDaoImpl offering = ComponentLocator.inject(DiskOfferingDaoImpl.class); try { offering.persist(diskOffering); diff --git a/server/src/com/cloud/user/AccountManager.java b/server/src/com/cloud/user/AccountManager.java index a30021935ff..9b92dd2130a 100644 --- a/server/src/com/cloud/user/AccountManager.java +++ b/server/src/com/cloud/user/AccountManager.java @@ -18,11 +18,14 @@ package com.cloud.user; +import java.util.List; + import com.cloud.configuration.ResourceCount; -import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.ResourceLimitVO; -import com.cloud.domain.DomainVO; +import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.exception.InvalidParameterValueException; +import com.cloud.storage.VMTemplateVO; +import com.cloud.user.AccountVO; import com.cloud.utils.component.Manager; /** @@ -45,18 +48,9 @@ public interface AccountManager extends Manager { * @param type * @return resource limit */ - public long findCorrectResourceLimit(AccountVO account, ResourceType type); - - /** - * Finds the resource limit for a specified domain and type. If the domain has an infinite limit, will check - * up the domain hierarchy - * @param account - * @param type - * @return resource limit - */ - public long findCorrectResourceLimit(DomainVO domain, ResourceType type); - - /** + public long findCorrectResourceLimit(AccountVO account, ResourceType type); + + /** * Increments the resource count * @param accountId * @param type @@ -76,10 +70,9 @@ public interface AccountManager extends Manager { * Checks if a limit has been exceeded for an account * @param account * @param type - * @param count the number of resources being allocated, count will be added to current allocation and compared against maximum allowed allocation * @return true if the limit has been exceeded */ - public boolean resourceLimitExceeded(AccountVO account, ResourceCount.ResourceType type, long...count); + public boolean resourceLimitExceeded(AccountVO account, ResourceCount.ResourceType type); /** * Gets the count of resources for a resource type and account diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index c1ce0c4897f..65e32f4856a 100644 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -38,7 +38,6 @@ import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.db.Filter; -import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.SearchCriteria; @Local(value={AccountManager.class}) @@ -50,9 +49,8 @@ public class AccountManagerImpl implements AccountManager { private DomainDao _domainDao; private UserDao _userDao; private VMTemplateDao _templateDao; - private ResourceLimitDao _resourceLimitDao; - private ResourceCountDao _resourceCountDao; - private final GlobalLock m_resourceCountLock = GlobalLock.getInternLock("resource.count"); + ResourceLimitDao _resourceLimitDao; + ResourceCountDao _resourceCountDao; @Override public boolean configure(final String name, final Map params) throws ConfigurationException { @@ -106,54 +104,17 @@ public class AccountManagerImpl implements AccountManager { public boolean stop() { return true; } - - @Override + public void incrementResourceCount(long accountId, ResourceType type, Long...delta) { long numToIncrement = (delta.length == 0) ? 1 : delta[0].longValue(); - - if (m_resourceCountLock.lock(120)) { // 2 minutes - try { - _resourceCountDao.updateAccountCount(accountId, type, true, numToIncrement); - - // on a per-domain basis, increment the count - // FIXME: can this increment be done on the database side in a custom update statement? - Account account = _accountDao.findById(accountId); - Long domainId = account.getDomainId(); - while (domainId != null) { - _resourceCountDao.updateDomainCount(domainId, type, true, numToIncrement); - DomainVO domain = _domainDao.findById(domainId); - domainId = domain.getParent(); - } - } finally { - m_resourceCountLock.unlock(); - } - } + _resourceCountDao.updateCount(accountId, type, true, numToIncrement); } - - @Override + public void decrementResourceCount(long accountId, ResourceType type, Long...delta) { long numToDecrement = (delta.length == 0) ? 1 : delta[0].longValue(); - - if (m_resourceCountLock.lock(120)) { // 2 minutes - try { - _resourceCountDao.updateAccountCount(accountId, type, false, numToDecrement); - - // on a per-domain basis, decrement the count - // FIXME: can this decrement be done on the database side in a custom update statement? - Account account = _accountDao.findById(accountId); - Long domainId = account.getDomainId(); - while (domainId != null) { - _resourceCountDao.updateDomainCount(domainId, type, false, numToDecrement); - DomainVO domain = _domainDao.findById(domainId); - domainId = domain.getParent(); - } - } finally { - m_resourceCountLock.unlock(); - } - } + _resourceCountDao.updateCount(accountId, type, false, numToDecrement); } - - @Override + public long findCorrectResourceLimit(AccountVO account, ResourceType type) { long max = -1; @@ -164,12 +125,8 @@ public class AccountManagerImpl implements AccountManager { max = limit.getMax().longValue(); } else { // If the account has an infinite limit, check the ROOT domain - Long domainId = account.getDomainId(); - while ((domainId != null) && (limit == null)) { - limit = _resourceLimitDao.findByDomainIdAndType(domainId, type); - DomainVO domain = _domainDao.findById(domainId); - domainId = domain.getParent(); - } + Long domainId = DomainVO.ROOT_DOMAIN; + limit = _resourceLimitDao.findByDomainIdAndType(domainId, type); if (limit != null) { max = limit.getMax().longValue(); @@ -178,82 +135,29 @@ public class AccountManagerImpl implements AccountManager { return max; } - - @Override - public long findCorrectResourceLimit(DomainVO domain, ResourceType type) { - long max = -1; - - // Check account - ResourceLimitVO limit = _resourceLimitDao.findByDomainIdAndType(domain.getId(), type); - - if (limit != null) { - max = limit.getMax().longValue(); - } else { - // check domain hierarchy - Long domainId = domain.getParent(); - while ((domainId != null) && (limit == null)) { - limit = _resourceLimitDao.findByDomainIdAndType(domainId, type); - DomainVO tmpDomain = _domainDao.findById(domainId); - domainId = tmpDomain.getParent(); - } - if (limit != null) { - max = limit.getMax().longValue(); - } - } - - return max; - } - - @Override - public boolean resourceLimitExceeded(AccountVO account, ResourceType type, long...count) { - long numResources = ((count.length == 0) ? 1 : count[0]); - + public boolean resourceLimitExceeded(AccountVO account, ResourceType type) { // Don't place any limits on system or admin accounts long accountType = account.getType(); if (accountType == Account.ACCOUNT_TYPE_ADMIN || accountType == Account.ACCOUNT_ID_SYSTEM) { return false; } + + long max = findCorrectResourceLimit(account, type); + + if (max >= 0) { + long potentialCount = _resourceCountDao.getCount(account.getId(), type) + 1; + return (potentialCount > max); + } else { + return false; + } - if (m_resourceCountLock.lock(120)) { // 2 minutes - try { - // Check account - ResourceLimitVO limit = _resourceLimitDao.findByAccountIdAndType(account.getId(), type); - - if (limit != null) { - long potentialCount = _resourceCountDao.getAccountCount(account.getId(), type) + numResources; - if (potentialCount > limit.getMax().longValue()) { - return true; - } - } - - // check all domains in the account's domain hierarchy - Long domainId = account.getDomainId(); - while (domainId != null) { - ResourceLimitVO domainLimit = _resourceLimitDao.findByDomainIdAndType(domainId, type); - if (domainLimit != null) { - long domainCount = _resourceCountDao.getDomainCount(domainId, type); - if ((domainCount + numResources) > domainLimit.getMax().longValue()) { - return true; - } - } - DomainVO domain = _domainDao.findById(domainId); - domainId = domain.getParent(); - } - } finally { - m_resourceCountLock.unlock(); - } - } - - return false; } - - @Override + public long getResourceCount(AccountVO account, ResourceType type) { - return _resourceCountDao.getAccountCount(account.getId(), type); + return _resourceCountDao.getCount(account.getId(), type); } - - @Override + public ResourceLimitVO updateResourceLimit(Long domainId, Long accountId, ResourceType type, Long max) throws InvalidParameterValueException { // Either a domainId or an accountId must be passed in, but not both. if ((domainId == null) && (accountId == null)) { @@ -270,13 +174,6 @@ public class AccountManagerImpl implements AccountManager { } else if (account.getType() == Account.ACCOUNT_TYPE_ADMIN || account.getType() == Account.ACCOUNT_ID_SYSTEM) { throw new InvalidParameterValueException("Please specify a non-admin account."); } - - DomainVO domain = _domainDao.findById(account.getDomainId()); - long parentMaximum = findCorrectResourceLimit(domain, type); - if ((parentMaximum >= 0) && ((max.longValue() == -1) || (max.longValue() > parentMaximum))) { - throw new InvalidParameterValueException("Account " + account.getAccountName() + "(id: " + accountId + ") has maximum allowed resource limit " + parentMaximum + - " for " + type + ", please specify a value less that or equal to " + parentMaximum); - } } else if (domainId != null) { DomainVO domain = _domainDao.findById(domainId); if (domain == null) { @@ -284,16 +181,6 @@ public class AccountManagerImpl implements AccountManager { } else if (domain.getRemoved() != null) { throw new InvalidParameterValueException("Please specify an active domain."); } - - Long parentDomainId = domain.getParent(); - if (parentDomainId != null) { - DomainVO parentDomain = _domainDao.findById(parentDomainId); - long parentMaximum = findCorrectResourceLimit(parentDomain, type); - if ((parentMaximum >= 0) && (max.longValue() > parentMaximum)) { - throw new InvalidParameterValueException("Domain " + domain.getName() + "(id: " + domainId + ") has maximum allowed resource limit " + parentMaximum + - " for " + type + ", please specify a value less that or equal to " + parentMaximum); - } - } } // A valid limit type must be passed in @@ -303,7 +190,7 @@ public class AccountManagerImpl implements AccountManager { // Check if a limit with the specified domainId/accountId/type combo already exists Filter searchFilter = new Filter(ResourceLimitVO.class, null, false, null, null); - SearchCriteria sc = _resourceLimitDao.createSearchCriteria(); + SearchCriteria sc = _resourceLimitDao.createSearchCriteria(); if (domainId != null) { sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); @@ -327,6 +214,7 @@ public class AccountManagerImpl implements AccountManager { // Persist the new Limit return _resourceLimitDao.persist(new ResourceLimitVO(domainId, accountId, type, max)); } + } } diff --git a/server/src/com/cloud/vm/MauriceMoss.java b/server/src/com/cloud/vm/MauriceMoss.java deleted file mode 100644 index 1223b63012e..00000000000 --- a/server/src/com/cloud/vm/MauriceMoss.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.cloud.vm; - -import com.cloud.offerings.NetworkOfferingVO; -import com.cloud.service.ServiceOfferingVO; -import com.cloud.storage.DiskOfferingVO; - -public class MauriceMoss implements VmManager { - - @Override - public VMInstanceVO allocate(VMInstanceVO vm, ServiceOfferingVO serviceOffering, NetworkOfferingVO[] networkOfferings, DiskOfferingVO[] diskOffering) { - return null; - } - - /* (non-Javadoc) - * @see com.cloud.vm.VmManager#create(com.cloud.vm.VMInstanceVO) - */ - @Override - public void create(VMInstanceVO vm) { - // TODO Auto-generated method stub - - } - - /* (non-Javadoc) - * @see com.cloud.vm.VmManager#destroy() - */ - @Override - public void destroy() { - // TODO Auto-generated method stub - - } - - /* (non-Javadoc) - * @see com.cloud.vm.VmManager#start() - */ - @Override - public void start() { - // TODO Auto-generated method stub - - } - - /* (non-Javadoc) - * @see com.cloud.vm.VmManager#stop() - */ - @Override - public void stop() { - // TODO Auto-generated method stub - - } - -} diff --git a/server/src/com/cloud/vm/NicVO.java b/server/src/com/cloud/vm/NicVO.java deleted file mode 100644 index 8d6c69a2569..00000000000 --- a/server/src/com/cloud/vm/NicVO.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.cloud.vm; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.Table; - -import com.cloud.network.Network.Mode; -import com.cloud.network.Network.TrafficType; - -@Entity -@Table(name="network") -public class NicVO implements Nic { - protected NicVO() { - } - - @Id - @GeneratedValue(strategy=GenerationType.IDENTITY) - @Column(name="id") - long id; - - @Column(name="instance_id") - long instanceId; - - @Column(name="type") - @Enumerated(value=EnumType.STRING) - TrafficType trafficType; - - @Column(name="ip4_address") - String ip4Address; - - @Column(name="mac_address") - String macAddress; - - @Column(name="netmask") - String netMask; - - @Column(name="mode") - @Enumerated(value=EnumType.STRING) - Mode mode; - - @Column(name="network_profile_id") - long networkProfileId; - - @Column(name="String") - String vlan; - - @Column(name="state") - @Enumerated(value=EnumType.STRING) - State state; - - @Override - public String getIp4Address() { - return ip4Address; - } - - public void setIp4Address(String address) { - ip4Address = address; - } - - @Override - public String getMacAddress() { - return macAddress; - } - - @Override - public State getState() { - return state; - } - - @Override - public long getId() { - return id; - } - - @Override - public long getInstanceId() { - return instanceId; - } - - @Override - public long getNetworkProfileId() { - return networkProfileId; - } -} diff --git a/server/src/com/cloud/vm/UserVmManager.java b/server/src/com/cloud/vm/UserVmManager.java index b56d6a7273a..cbd9fe3b43c 100644 --- a/server/src/com/cloud/vm/UserVmManager.java +++ b/server/src/com/cloud/vm/UserVmManager.java @@ -22,14 +22,12 @@ import java.util.List; import com.cloud.agent.api.VmStatsEntry; import com.cloud.async.executor.DestroyVMExecutor; -import com.cloud.async.executor.OperationResponse; import com.cloud.async.executor.RebootVMExecutor; import com.cloud.async.executor.StartVMExecutor; import com.cloud.async.executor.StopVMExecutor; import com.cloud.async.executor.VMOperationParam; import com.cloud.dc.DataCenterVO; import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientStorageCapacityException; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceAllocationException; @@ -37,13 +35,16 @@ import com.cloud.exception.StorageUnavailableException; import com.cloud.network.security.NetworkGroupVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.DiskOfferingVO; +import com.cloud.storage.InsufficientStorageCapacityException; import com.cloud.storage.SnapshotVO; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; import com.cloud.user.AccountVO; -import com.cloud.uservm.UserVm; import com.cloud.utils.component.Manager; import com.cloud.utils.exception.ExecutionException; +import com.cloud.vm.UserVm; +import com.cloud.vm.UserVmVO; +import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachine.Event; /** @@ -53,7 +54,6 @@ import com.cloud.vm.VirtualMachine.Event; */ public interface UserVmManager extends Manager, VirtualMachineManager { - static final int MAX_USER_DATA_LENGTH_BYTES = 2048; /** * @param hostId get all of the virtual machines that belong to one host. @@ -89,7 +89,7 @@ public interface UserVmManager extends Manager, VirtualMachineManager * @param vmId the id of the virtual machine. */ boolean destroyVirtualMachine(long userId, long vmId); - OperationResponse executeDestroyVM(DestroyVMExecutor executor, VMOperationParam param); + boolean executeDestroyVM(DestroyVMExecutor executor, VMOperationParam param); /** @@ -134,7 +134,7 @@ public interface UserVmManager extends Manager, VirtualMachineManager * @throws StorageUnavailableException * @throws ConcurrentOperationException */ - UserVmVO startVirtualMachine(long userId, long vmId, String isoPath, long startEventId) throws ExecutionException, StorageUnavailableException, ConcurrentOperationException; + UserVmVO startVirtualMachine(long userId, long vmId, String isoPath) throws ExecutionException, StorageUnavailableException, ConcurrentOperationException; boolean executeStartVM(StartVMExecutor executor, VMOperationParam param); /** @@ -147,7 +147,7 @@ public interface UserVmManager extends Manager, VirtualMachineManager * @throws StorageUnavailableException * @throws ConcurrentOperationException */ - UserVmVO startVirtualMachine(long userId, long vmId, String password, String isoPath, long startEventId) throws ExecutionException, StorageUnavailableException, ConcurrentOperationException; + UserVmVO startVirtualMachine(long userId, long vmId, String password, String isoPath) throws ExecutionException, StorageUnavailableException, ConcurrentOperationException; /** * Stops the virtual machine @@ -156,7 +156,7 @@ public interface UserVmManager extends Manager, VirtualMachineManager * @return true if stopped; false if problems. */ boolean stopVirtualMachine(long userId, long vmId); - OperationResponse executeStopVM(StopVMExecutor executor, VMOperationParam param); + boolean executeStopVM(StopVMExecutor executor, VMOperationParam param); void completeStopCommand(long userId, UserVmVO vm, Event e, long startEventId); @@ -179,7 +179,7 @@ public interface UserVmManager extends Manager, VirtualMachineManager HashMap getVirtualMachineStatistics(long hostId, String hostName, List vmIds) throws InternalErrorException; boolean rebootVirtualMachine(long userId, long vmId); - OperationResponse executeRebootVM(RebootVMExecutor executor, VMOperationParam param); + boolean executeRebootVM(RebootVMExecutor executor, VMOperationParam param); boolean recoverVirtualMachine(long vmId) throws ResourceAllocationException; @@ -217,4 +217,5 @@ public interface UserVmManager extends Manager, VirtualMachineManager */ void releaseGuestIpAddress(UserVmVO userVm); + } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index b4876bc7566..bd45c389526 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -69,7 +69,6 @@ import com.cloud.async.AsyncJobResult; import com.cloud.async.AsyncJobVO; import com.cloud.async.BaseAsyncJobExecutor; import com.cloud.async.executor.DestroyVMExecutor; -import com.cloud.async.executor.OperationResponse; import com.cloud.async.executor.RebootVMExecutor; import com.cloud.async.executor.StartVMExecutor; import com.cloud.async.executor.StopVMExecutor; @@ -119,9 +118,10 @@ import com.cloud.network.dao.SecurityGroupDao; import com.cloud.network.dao.SecurityGroupVMMapDao; import com.cloud.network.security.NetworkGroupManager; import com.cloud.network.security.NetworkGroupVO; -import com.cloud.offering.ServiceOffering; -import com.cloud.offering.ServiceOffering.GuestIpType; +import com.cloud.pricing.dao.PricingDao; +import com.cloud.service.ServiceOffering; import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.ServiceOffering.GuestIpType; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.GuestOSVO; @@ -156,7 +156,6 @@ import com.cloud.user.UserVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.user.dao.UserStatisticsDao; -import com.cloud.uservm.UserVm; import com.cloud.utils.DateUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; @@ -202,6 +201,7 @@ public class UserVmManagerImpl implements UserVmManager { @Inject LoadBalancerDao _loadBalancerDao = null; @Inject IPAddressDao _ipAddressDao = null; @Inject HostPodDao _podDao = null; + @Inject PricingDao _pricingDao = null; @Inject CapacityDao _capacityDao = null; @Inject NetworkManager _networkMgr = null; @Inject StorageManager _storageMgr = null; @@ -411,6 +411,9 @@ public class UserVmManagerImpl implements UserVmManager { if (details != null && !details.isEmpty()) errorMsg += "; " + details; } + event.setDescription(errorMsg); + event.setLevel(EventVO.LEVEL_ERROR); + _eventDao.persist(event); throw new InternalErrorException(errorMsg); } } @@ -484,6 +487,9 @@ public class UserVmManagerImpl implements UserVmManager { errorMsg += "; " + details; } + event.setDescription(errorMsg); + event.setLevel(EventVO.LEVEL_ERROR); + _eventDao.persist(event); throw new InternalErrorException(errorMsg); } } @@ -522,8 +528,8 @@ public class UserVmManagerImpl implements UserVmManager { } @Override - public UserVmVO startVirtualMachine(long userId, long vmId, String isoPath, long startEventId) throws ExecutionException, StorageUnavailableException, ConcurrentOperationException { - return startVirtualMachine(userId, vmId, null, isoPath, startEventId); + public UserVmVO startVirtualMachine(long userId, long vmId, String isoPath) throws ExecutionException, StorageUnavailableException, ConcurrentOperationException { + return startVirtualMachine(userId, vmId, null, isoPath); } @Override @@ -558,9 +564,9 @@ public class UserVmManagerImpl implements UserVmManager { } @Override - public UserVmVO startVirtualMachine(long userId, long vmId, String password, String isoPath, long startEventId) throws ExecutionException, StorageUnavailableException, ConcurrentOperationException { + public UserVmVO startVirtualMachine(long userId, long vmId, String password, String isoPath) throws ExecutionException, StorageUnavailableException, ConcurrentOperationException { try { - return start(userId, vmId, password, isoPath, startEventId); + return start(userId, vmId, password, isoPath, 0); } catch (StorageUnavailableException e) { s_logger.debug("Unable to start vm because storage is unavailable: " + e.getMessage()); throw e; @@ -608,20 +614,9 @@ public class UserVmManagerImpl implements UserVmManager { } return vm; } - String eventParams = "id=" + vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); - event = new EventVO(); - event.setType(EventTypes.EVENT_VM_START); - event.setUserId(userId); - event.setAccountId(vm.getAccountId()); - event.setParameters(eventParams); - event.setState(EventState.Completed); - event.setStartId(startEventId); + if (state.isTransitional()) { - String description = "Concurrent operations on the vm " + vm.getId() + " - " + vm.getName() + "; state = " + state.toString(); - event.setDescription(description); - event.setLevel(EventVO.LEVEL_ERROR); - _eventDao.persist(event); - throw new ConcurrentOperationException(description); + throw new ConcurrentOperationException("Concurrent operations on the vm " + vm.getId() + " - " + vm.getName() + "; state = " + state.toString()); } DataCenterVO dc = _dcDao.findById(vm.getDataCenterId()); @@ -650,11 +645,7 @@ public class UserVmManagerImpl implements UserVmManager { String guestOSDescription; GuestOSVO guestOS = _guestOSDao.findById(vm.getGuestOSId()); if (guestOS == null) { - String description = "Could not find guest OS description for vm: " + vm.getName(); - s_logger.debug(description); - event.setDescription(description); - event.setLevel(EventVO.LEVEL_ERROR); - _eventDao.persist(event); + s_logger.debug("Could not find guest OS description for vm: " + vm.getName()); return null; } else { guestOSDescription = guestOS.getName(); @@ -664,32 +655,34 @@ public class UserVmManagerImpl implements UserVmManager { HostVO host = (HostVO) _agentMgr.findHost(Host.Type.Routing, dc, pod, sp, offering, template, vm, null, avoid); - if (host == null) { - String description = "Unable to find any host for " + vm.toString(); - s_logger.error(description); - event.setDescription(description); - event.setLevel(EventVO.LEVEL_ERROR); - _eventDao.persist(event); + if (host == null) { + s_logger.error("Unable to find any host for " + vm.toString()); return null; } if (!_vmDao.updateIf(vm, Event.StartRequested, host.getId())) { - String description = "Unable to start VM " + vm.toString() + " because the state is not correct."; - s_logger.error(description); - event.setDescription(description); - event.setLevel(EventVO.LEVEL_ERROR); - _eventDao.persist(event); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to start VM " + vm.toString() + " because the state is not correct."); + } return null; } boolean started = false; Transaction txn = Transaction.currentTxn(); try { + String eventParams = "id=" + vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ndoId=" + diskOfferingId + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); + event = new EventVO(); + event.setType(EventTypes.EVENT_VM_START); + event.setUserId(userId); + event.setAccountId(vm.getAccountId()); + event.setParameters(eventParams); + event.setState(EventState.Completed); + event.setStartId(startEventId); String vnet = null; DomainRouterVO router = null; if (vm.getDomainRouterId() != null) { - router = _networkMgr.addVirtualMachineToGuestNetwork(vm, password, startEventId); + router = _networkMgr.addVirtualMachineToGuestNetwork(vm, password); if (router == null) { s_logger.error("Unable to add vm " + vm.getId() + " - " + vm.getName()); _vmDao.updateIf(vm, Event.OperationFailed, null); @@ -704,8 +697,6 @@ public class UserVmManagerImpl implements UserVmManager { } vnet = router.getVnet(); - s_logger.debug("VM: " + vm.getName() + " discovered vnet: " + vnet + " from router: " + router.getName()); - if(NetworkManager.USE_POD_VLAN){ if(vm.getPodId() != router.getPodId()){ //VM is in a different Pod @@ -753,13 +744,13 @@ public class UserVmManagerImpl implements UserVmManager { } - if( retry < _retry ) { + vm.setStorageIp(storageIps[0]); + + if( retry < _retry) { if (!_vmDao.updateIf(vm, Event.OperationRetry, host.getId())) { - String description = "Unable to start VM " + vm.toString() + " because the state is not correct."; - s_logger.debug(description); - event.setDescription(description); - event.setLevel(EventVO.LEVEL_ERROR); - _eventDao.persist(event); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to start VM " + vm.toString() + " because the state is not correct."); + } return null; } } @@ -813,13 +804,9 @@ public class UserVmManagerImpl implements UserVmManager { s_logger.debug("Unable to start " + vm.toString() + " on host " + host.toString() + " due to " + answer.getDetails()); } catch (OperationTimedoutException e) { if (e.isActive()) { - String description = "Unable to start vm " + vm.getName() + " due to operation timed out and it is active so scheduling a restart."; + s_logger.debug("Unable to start vm " + vm.getName() + " due to operation timed out and it is active so scheduling a restart."); _haMgr.scheduleRestart(vm, true); host = null; - s_logger.debug(description); - event.setDescription(description); - event.setLevel(EventVO.LEVEL_ERROR); - _eventDao.persist(event); return null; } } catch (AgentUnavailableException e) { @@ -871,6 +858,7 @@ public class UserVmManagerImpl implements UserVmManager { if (!started) { vm.setVnet(null); + vm.setStorageIp(null); txn.start(); if (_vmDao.updateIf(vm, Event.OperationFailed, null)) { @@ -888,10 +876,6 @@ public class UserVmManagerImpl implements UserVmManager { s_logger.warn(th.getMessage()); throw (ExecutionException)th; } - String description = "Unable to start VM " + vm.getName() + " because of an unknown exception"; - event.setDescription(description); - event.setLevel(EventVO.LEVEL_ERROR); - _eventDao.persist(event); return null; } } @@ -914,64 +898,52 @@ public class UserVmManagerImpl implements UserVmManager { } @Override - public OperationResponse executeStopVM(final StopVMExecutor executor, final VMOperationParam param) { + public boolean executeStopVM(final StopVMExecutor executor, final VMOperationParam param) { final UserVmVO vm = _vmDao.findById(param.getVmId()); - OperationResponse response; - String resultDescription = "Success"; - if (vm == null || vm.getRemoved() != null) { - resultDescription = "VM is either removed or deleted"; executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_SUCCEEDED, 0, resultDescription); + AsyncJobResult.STATUS_SUCCEEDED, 0, "VM is either removed or deleted"); + if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize stop VM command: " +resultDescription); - response = new OperationResponse(OperationResponse.STATUS_SUCCEEDED, resultDescription); - return response; + s_logger.debug("Execute asynchronize stop VM command: VM is either removed or deleted"); + return true; } State state = vm.getState(); if (state == State.Stopped) { - resultDescription = "VM is already stopped"; executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_SUCCEEDED, 0, resultDescription); + AsyncJobResult.STATUS_SUCCEEDED, 0, "VM is already stopped"); if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize stop VM command: " +resultDescription); - response = new OperationResponse(OperationResponse.STATUS_SUCCEEDED, resultDescription); - return response; + s_logger.debug("Execute asynchronize stop VM command: VM is already stopped"); + return true; } if (state == State.Creating || state == State.Destroyed || state == State.Expunging) { - resultDescription = "VM is not in a stoppable state"; executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_SUCCEEDED, 0, resultDescription); + AsyncJobResult.STATUS_SUCCEEDED, 0, "VM is not in a stoppable state"); if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize stop VM command: " +resultDescription); - response = new OperationResponse(OperationResponse.STATUS_SUCCEEDED, resultDescription); - return response; + s_logger.debug("Execute asynchronize stop VM command: VM is not in a stoppable state"); + return true; } if (!_vmDao.updateIf(vm, Event.StopRequested, vm.getHostId())) { - resultDescription = "VM is not in a state to stop"; executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); + AsyncJobResult.STATUS_FAILED, 0, "VM is not in a state to stop"); if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize stop VM command: " +resultDescription); - response = new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); - return response; + s_logger.debug("Execute asynchronize stop VM command: VM is not in a state to stop"); + return true; } if (vm.getHostId() == null) { - resultDescription = "VM host is null (invalid VM)"; executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); + AsyncJobResult.STATUS_FAILED, 0, "VM host is null (invalid VM)"); if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize stop VM command: " +resultDescription); - response = new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); - return response; + s_logger.debug("Execute asynchronize stop VM command: VM host is null (invalid VM)"); + return true; } AsyncJobExecutor asyncExecutor = BaseAsyncJobExecutor.getCurrentExecutor(); @@ -984,19 +956,31 @@ public class UserVmManagerImpl implements UserVmManager { try { long seq = _agentMgr.send(vm.getHostId(), new Command[] {cmd}, true, new VMOperationListener(executor, param, vm, 0)); - resultDescription = "Execute asynchronize stop VM command: sending command to agent, seq - " + seq; + if(s_logger.isDebugEnabled()) - s_logger.debug(resultDescription); - response = new OperationResponse(OperationResponse.STATUS_IN_PROGRESS, resultDescription); - return response; + s_logger.debug("Execute asynchronize stop VM command: sending command to agent, seq - " + seq); + + return false; } catch (AgentUnavailableException e) { - resultDescription = "Agent is not available"; executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); + AsyncJobResult.STATUS_FAILED, 0, "Agent is not available"); _vmDao.updateIf(vm, Event.OperationFailed, vm.getHostId()); - response = new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); - return response; + try { + EventVO event = new EventVO(); + event.setUserId(param.getUserId()); + event.setAccountId(vm.getAccountId()); + event.setType(EventTypes.EVENT_VM_STOP); + event.setState(EventState.Completed); + event.setStartId(param.getEventId()); + event.setParameters("id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId()); + event.setDescription("failed to stop VM instance : " + vm.getName()); + event.setLevel(EventVO.LEVEL_ERROR); + _eventDao.persist(event); + } catch(Exception ex) { + s_logger.warn("Unable to save event due to unexpected exception, ", ex); + } + return true; } } @@ -1040,18 +1024,16 @@ public class UserVmManagerImpl implements UserVmManager { } @Override - public OperationResponse executeRebootVM(RebootVMExecutor executor, VMOperationParam param) { + public boolean executeRebootVM(RebootVMExecutor executor, VMOperationParam param) { final UserVmVO vm = _vmDao.findById(param.getVmId()); - String resultDescription; - if (vm == null || vm.getState() == State.Destroyed || vm.getState() == State.Expunging || vm.getRemoved() != null) { - resultDescription = "VM does not exist or in destroying state"; executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); + AsyncJobResult.STATUS_FAILED, 0, "VM does not exist or in destroying state"); + if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize Reboot VM command: " +resultDescription); - return new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); + s_logger.debug("Execute asynchronize Reboot VM command: VM does not exist or in destroying state"); + return true; } if (vm.getState() == State.Running && vm.getHostId() != null) { @@ -1059,21 +1041,20 @@ public class UserVmManagerImpl implements UserVmManager { try { long seq = _agentMgr.send(vm.getHostId(), new Command[] {cmd}, true, new VMOperationListener(executor, param, vm, 0)); - resultDescription = "Execute asynchronize Reboot VM command: sending command to agent, seq - " + seq; + if(s_logger.isDebugEnabled()) - s_logger.debug(resultDescription); - return new OperationResponse(OperationResponse.STATUS_IN_PROGRESS, resultDescription); + s_logger.debug("Execute asynchronize Reboot VM command: sending command to agent, seq - " + seq); + return false; } catch (AgentUnavailableException e) { - resultDescription = "Agent is not available"; executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); - return new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); + AsyncJobResult.STATUS_FAILED, 0, "Agent is not available"); + return true; } } - resultDescription = "VM is not running or agent host is disconnected"; + executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); - return new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); + AsyncJobResult.STATUS_FAILED, 0, "VM is not running or agent host is disconnected"); + return true; } @Override @@ -1201,7 +1182,7 @@ public class UserVmManagerImpl implements UserVmManager { userVm.setGuestIpAddress(null); //_vmDao.update(userVm.getId(), userVm); FIXME need an updateIf } - + @Override @DB public UserVmVO createVirtualMachine(Long vmId, long userId, AccountVO account, DataCenterVO dc, ServiceOfferingVO offering, VMTemplateVO template, DiskOfferingVO diskOffering, String displayName, String group, String userData, List avoids, long startEventId) throws InternalErrorException, ResourceAllocationException { long accountId = account.getId(); @@ -1359,6 +1340,10 @@ public class UserVmManagerImpl implements UserVmManager { eventDescription += " (" + vm.getDisplayName() + ")"; } } + + event.setDescription(eventDescription); + event.setLevel(EventVO.LEVEL_ERROR); + _eventDao.persist(event); if (th instanceof ResourceAllocationException) { throw (ResourceAllocationException)th; @@ -1419,92 +1404,91 @@ public class UserVmManagerImpl implements UserVmManager { } @Override @DB - public OperationResponse executeDestroyVM(DestroyVMExecutor executor, VMOperationParam param) { + public boolean executeDestroyVM(DestroyVMExecutor executor, VMOperationParam param) { UserVmVO vm = _vmDao.findById(param.getVmId()); State state = vm.getState(); - OperationResponse response; - String resultDescription = "Success"; - if (vm == null || state == State.Destroyed || state == State.Expunging || vm.getRemoved() != null) { if (s_logger.isDebugEnabled()) { s_logger.debug("Unable to find vm or vm is destroyed: " + param.getVmId()); } - resultDescription = "VM does not exist or already in destroyed state"; - response = new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); + executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); - return response; + AsyncJobResult.STATUS_FAILED, 0, "VM does not exist or already in destroyed state"); + return true; } if(state == State.Stopping) { if (s_logger.isDebugEnabled()) { s_logger.debug("VM is being stopped: " + param.getVmId()); } - resultDescription = "VM is being stopped, please re-try later"; - response = new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); + executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); - return response; + AsyncJobResult.STATUS_FAILED, 0, "VM is being stopped, please re-try later"); + return true; } if (state == State.Running) { if (vm.getHostId() == null) { - resultDescription = "VM host is null (invalid VM)"; - response = new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); + AsyncJobResult.STATUS_FAILED, 0, "VM host is null (invalid VM)"); + if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize destroy VM command: " + resultDescription); - return response; + s_logger.debug("Execute asynchronize destroy VM command: VM host is null (invalid VM)"); + return true; } if (!_vmDao.updateIf(vm, Event.StopRequested, vm.getHostId())) { - resultDescription = "Failed to issue stop command, please re-try later"; - response = new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); + AsyncJobResult.STATUS_FAILED, 0, "Failed to issue stop command, please re-try later"); + if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize destroy VM command:" + resultDescription); - return response; + s_logger.debug("Execute asynchronize destroy VM command: failed to issue stop command, please re-try later"); + return true; } - long childEventId = executor.getAsyncJobMgr().getExecutorContext().getManagementServer().saveStartedEvent(param.getUserId(), param.getAccountId(), - EventTypes.EVENT_VM_STOP, "stopping vm " + vm.getName(), 0); - param.setChildEventId(childEventId); + StopCommand cmd = new StopCommand(vm, vm.getInstanceName(), vm.getVnet()); try { long seq = _agentMgr.send(vm.getHostId(), new Command[] {cmd}, true, new VMOperationListener(executor, param, vm, 0)); - resultDescription = "Execute asynchronize destroy VM command: sending stop command to agent, seq - " + seq; + if(s_logger.isDebugEnabled()) - s_logger.debug(resultDescription); - response = new OperationResponse(OperationResponse.STATUS_IN_PROGRESS, resultDescription); - return response; + s_logger.debug("Execute asynchronize destroy VM command: sending stop command to agent, seq - " + seq); + + return false; } catch (AgentUnavailableException e) { - resultDescription = "Agent is not available"; - response = new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); - return response; + AsyncJobResult.STATUS_FAILED, 0, "Agent is not available"); + return true; } } Transaction txn = Transaction.currentTxn(); - txn.start(); + txn.start(); + + EventVO event = new EventVO(); + event.setUserId(param.getUserId()); + event.setAccountId(vm.getAccountId()); + event.setType(EventTypes.EVENT_VM_DESTROY); + event.setStartId(param.getEventId()); + event.setParameters("id="+vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId()); + if(!vm.getName().equals(vm.getDisplayName())) + event.setDescription("successfully destroyed VM instance : " + vm.getName()+"("+vm.getDisplayName()+")"); + else + event.setDescription("successfully destroyed VM instance : " + vm.getName()); + _eventDao.persist(event); _accountMgr.decrementResourceCount(vm.getAccountId(), ResourceType.user_vm); - if (!_vmDao.updateIf(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId()) ) { - resultDescription = "Unable to destroy the vm because it is not in the correct state"; - s_logger.debug(resultDescription + vm.toString()); + if (!_vmDao.updateIf(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) { + s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm.toString()); txn.rollback(); - response = new OperationResponse(OperationResponse.STATUS_FAILED, resultDescription); executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultDescription); - return response; + AsyncJobResult.STATUS_FAILED, 0, "Unable to destroy the vm because it is not in the correct state"); + return true; } // Now that the VM is destroyed, clean the network rules associated with it. - cleanNetworkRules(param.getUserId(), vm.getId()); + cleanNetworkRules(param.getUserId(), vm.getId().longValue()); // Mark the VM's root disk as destroyed List volumes = _volsDao.findByInstanceAndType(vm.getId(), VolumeType.ROOT); @@ -1519,10 +1503,9 @@ public class UserVmManagerImpl implements UserVmManager { } txn.commit(); - response = new OperationResponse(OperationResponse.STATUS_SUCCEEDED, resultDescription); executor.getAsyncJobMgr().completeAsyncJob(executor.getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, "success"); - return response; + return true; } @Override @DB @@ -1718,6 +1701,7 @@ public class UserVmManagerImpl implements UserVmManager { vm.setVnet(null); vm.setProxyAssignTime(null); vm.setProxyId(null); + vm.setStorageIp(null); txn.start(); @@ -2017,7 +2001,7 @@ public class UserVmManagerImpl implements UserVmManager { SnapshotVO snapshot = _snapshotDao.findById(Long.valueOf(snapshotId)); if (snapshot != null) { VolumeVO volume = _volsDao.findById(snapshot.getVolumeId()); - ManageSnapshotCommand cmd = new ManageSnapshotCommand(ManageSnapshotCommand.DESTROY_SNAPSHOT, snapshotId, snapshot.getPath(), snapshot.getName(), null); + ManageSnapshotCommand cmd = new ManageSnapshotCommand(ManageSnapshotCommand.DESTROY_SNAPSHOT, snapshotId, snapshot.getPath(), snapshot.getName()); Answer answer = null; String basicErrMsg = "Failed to destroy template snapshot: " + snapshot.getName(); @@ -2054,7 +2038,7 @@ public class UserVmManagerImpl implements UserVmManager { id = snapshot.getId(); // Send a ManageSnapshotCommand to the agent - ManageSnapshotCommand cmd = new ManageSnapshotCommand(ManageSnapshotCommand.CREATE_SNAPSHOT, id, volume.getPath(), snapshotName, null); + ManageSnapshotCommand cmd = new ManageSnapshotCommand(ManageSnapshotCommand.CREATE_SNAPSHOT, id, volume.getPath(), snapshotName); String basicErrMsg = "Failed to create snapshot for volume: " + volume.getId(); // This can be sent to a KVM host too. We are only taking snapshots on primary storage, which doesn't require XenServer. @@ -2294,7 +2278,6 @@ public class UserVmManagerImpl implements UserVmManager { accountId, volumeId, backupSnapshotUUID, - snapshot.getName(), origTemplateInstallPath, templateId, name); @@ -2316,6 +2299,17 @@ public class UserVmManagerImpl implements UserVmManager { String basicErrMsg = "Failed to create template from snapshot: " + snapshot.getName(); // This can be sent to a KVM host too. CreatePrivateTemplateAnswer answer = (CreatePrivateTemplateAnswer) _storageMgr.sendToHostsOnStoragePool(volume.getPoolId(), cmd, basicErrMsg); + // Don't proceed further if there was an exception above. + if (answer == null) { + return null; + } + + String eventParams = "id="+templateId+"\nname=" + name + "\ndcId=" + zoneId +"\nsize="+volume.getSize(); + EventVO event = new EventVO(); + event.setUserId(userId.longValue()); + event.setAccountId(snapshot.getAccountId()); + event.setType(EventTypes.EVENT_TEMPLATE_CREATE); + event.setParameters(eventParams); if ((answer != null) && answer.getResult()) { @@ -2364,12 +2358,19 @@ public class UserVmManagerImpl implements UserVmManager { templateHostVO.setInstallPath(answer.getPath()); templateHostVO.setLastUpdated(new Date()); templateHostVO.setSize(answer.getVirtualSize()); - _templateHostDao.persist(templateHostVO); + _templateHostDao.persist(templateHostVO); + + event.setDescription("Created template " + name + " from snapshot " + snapshotId); + event.setLevel(EventVO.LEVEL_INFO); + _eventDao.persist(event); // Increment the number of templates _accountMgr.incrementResourceCount(volume.getAccountId(), ResourceType.template); - } else { + } else { + event.setDescription("Failed to create template " + name + " from snapshot " + snapshotId); + event.setLevel(EventVO.LEVEL_ERROR); + _eventDao.persist(event); // Remove the template record _templateDao.remove(templateId); @@ -2533,22 +2534,8 @@ public class UserVmManagerImpl implements UserVmManager { break; // if we got here, we found a host and can stop searching the pods } - if (poolId == 0) { - if(vm != null && vm.getName()!=null && vm.getDisplayName() != null) - { - if(!vm.getName().equals(vm.getDisplayName())) - s_logger.debug("failed to create VM instance : " + name+"("+vm.getInstanceName()+")"); - else - s_logger.debug("failed to create VM instance : " + name); - } - else - { - s_logger.debug("failed to create VM instance : " + name); - } - return null; - } - txn.start(); + EventVO event = new EventVO(); event.setUserId(userId); event.setAccountId(accountId); @@ -2556,6 +2543,26 @@ public class UserVmManagerImpl implements UserVmManager { event.setStartId(startEventId); event.setState(EventState.Completed); String diskOfferingIdentifier = (diskOffering != null) ? String.valueOf(diskOffering.getId()) : "-1"; + + if (poolId == 0) { + if(vm != null && vm.getName()!=null && vm.getDisplayName() != null) + { + if(!vm.getName().equals(vm.getDisplayName())) + event.setDescription("failed to create VM instance : " + name+"("+vm.getInstanceName()+")"); + else + event.setDescription("failed to create VM instance : " + name); + } + else + { + event.setDescription("failed to create VM instance : " + name); + } + event.setLevel(EventVO.LEVEL_ERROR); + _eventDao.persist(event); + String eventParams = "\nvmName=" + name + "\nsoId=" + serviceOfferingId + "\ndoId=" + diskOfferingIdentifier + "\ntId=" + templateId + "\ndcId=" + dataCenterId; + event.setParameters(eventParams); + txn.commit(); + return null; + } String eventParams = "id=" + vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ndoId=" + diskOfferingIdentifier + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); event.setParameters(eventParams); if(!vm.getName().equals(vm.getDisplayName())) @@ -2682,24 +2689,8 @@ public class UserVmManagerImpl implements UserVmManager { break; // if we got here, we found a host and can stop searching the pods } - if (poolId == 0) { - if(vm != null && vm.getName()!=null && vm.getDisplayName() != null) - { - if(!vm.getName().equals(vm.getDisplayName())) - s_logger.debug("failed to create VM instance : " + name+"("+vm.getDisplayName()+")"); - else - s_logger.debug("failed to create VM instance : " + name); - } - else - { - s_logger.debug("failed to create VM instance : " + name); - } - - txn.commit(); - return null; - } txn.start(); - + EventVO event = new EventVO(); event.setUserId(userId); event.setAccountId(accountId); @@ -2707,6 +2698,27 @@ public class UserVmManagerImpl implements UserVmManager { event.setStartId(startEventId); event.setState(EventState.Completed); String diskOfferingIdentifier = (diskOffering != null) ? String.valueOf(diskOffering.getId()) : "-1"; + + if (poolId == 0) { + if(vm != null && vm.getName()!=null && vm.getDisplayName() != null) + { + if(!vm.getName().equals(vm.getDisplayName())) + event.setDescription("failed to create VM instance : " + name+"("+vm.getDisplayName()+")"); + else + event.setDescription("failed to create VM instance : " + name); + } + else + { + event.setDescription("failed to create VM instance : " + name); + } + + event.setLevel(EventVO.LEVEL_ERROR); + _eventDao.persist(event); + String eventParams = "\nvmName=" + name + "\nsoId=" + serviceOfferingId + "\ndoId=" + diskOfferingIdentifier + "\ntId=" + templateId + "\ndcId=" + dataCenterId; + event.setParameters(eventParams); + txn.commit(); + return null; + } String eventParams = "id=" + vm.getId() + "\nvmName=" + vm.getName() + "\nsoId=" + vm.getServiceOfferingId() + "\ndoId=" + diskOfferingIdentifier + "\ntId=" + vm.getTemplateId() + "\ndcId=" + vm.getDataCenterId(); event.setParameters(eventParams); if(!vm.getName().equals(vm.getDisplayName())) @@ -2763,4 +2775,5 @@ public class UserVmManagerImpl implements UserVmManager { } } } + } diff --git a/setup/.project b/setup/.project index 2ab02813e01..66073caf5cd 100644 --- a/setup/.project +++ b/setup/.project @@ -5,13 +5,7 @@ - - org.eclipse.jdt.core.javabuilder - - - - org.eclipse.jdt.core.javanature diff --git a/setup/db/create-index-fk.sql b/setup/db/create-index-fk.sql index 16bcb289747..4d158b74a42 100644 --- a/setup/db/create-index-fk.sql +++ b/setup/db/create-index-fk.sql @@ -26,11 +26,6 @@ ALTER TABLE `cloud`.`op_ha_work` ADD INDEX `i_op_ha_work__step`(`step`); ALTER TABLE `cloud`.`op_ha_work` ADD INDEX `i_op_ha_work__type`(`type`); ALTER TABLE `cloud`.`op_ha_work` ADD INDEX `i_op_ha_work__mgmt_server_id`(`mgmt_server_id`); -ALTER TABLE `cloud`.`network_profiles` ADD CONSTRAINT `fk_network_profiles__account_id` FOREIGN KEY `fk_network_profiles__account_id`(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE; - -ALTER TABLE `cloud`.`nics` ADD CONSTRAINT `fk_nics__instance_id` FOREIGN KEY `fk_nics__instance_id`(`instance_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE; -ALTER TABLE `cloud`.`nics` ADD CONSTRAINT `fk_nics__network_profile_id` FOREIGN KEY `fk_nics__network_profile_id`(`network_profile_id`) REFERENCES `network_profiles`(`id`); - ALTER TABLE `cloud`.`op_dc_ip_address_alloc` ADD INDEX `i_op_dc_ip_address_alloc__pod_id__data_center_id__taken` (`pod_id`, `data_center_id`, `taken`, `instance_id`); ALTER TABLE `cloud`.`op_dc_ip_address_alloc` ADD UNIQUE `i_op_dc_ip_address_alloc__ip_address__data_center_id`(`ip_address`, `data_center_id`); ALTER TABLE `cloud`.`op_dc_ip_address_alloc` ADD CONSTRAINT `fk_op_dc_ip_address_alloc__pod_id` FOREIGN KEY `fk_op_dc_ip_address_alloc__pod_id` (`pod_id`) REFERENCES `host_pod_ref` (`id`) ON DELETE CASCADE; @@ -50,7 +45,6 @@ ALTER TABLE `cloud`.`host` ADD CONSTRAINT `fk_host__pod_id` FOREIGN KEY `fk_host ALTER TABLE `cloud`.`host` ADD INDEX `i_host__pod_id`(`pod_id`); ALTER TABLE `cloud`.`host` ADD CONSTRAINT `fk_host__cluster_id` FOREIGN KEY `fk_host__cluster_id`(`cluster_id`) REFERENCES `cloud`.`cluster`(`id`); -ALTER TABLE `cloud`.`op_host` ADD CONSTRAINT `fk_op_host__id` FOREIGN KEY `fk_op_host__id`(`id`) REFERENCES `host`(`id`) ON DELETE CASCADE; ALTER TABLE `cloud`.`host_details` ADD CONSTRAINT `fk_host_details__host_id` FOREIGN KEY `fk_host_details__host_id`(`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE; ALTER TABLE `cloud`.`storage_pool` ADD CONSTRAINT `fk_storage_pool__pod_id` FOREIGN KEY `fk_storage_pool__pod_id` (`pod_id`) REFERENCES `host_pod_ref` (`id`) ON DELETE CASCADE; @@ -60,6 +54,7 @@ ALTER TABLE `cloud`.`storage_pool` ADD CONSTRAINT `fk_storage_pool__cluster_id` ALTER TABLE `cloud`.`storage_pool_details` ADD CONSTRAINT `fk_storage_pool_details__pool_id` FOREIGN KEY `fk_storage_pool__pool_id`(`pool_id`) REFERENCES `storage_pool`(`id`) ON DELETE CASCADE; ALTER TABLE `cloud`.`storage_pool_details` ADD INDEX `i_storage_pool_details__name__value`(`name`, `value`); +ALTER TABLE `cloud`.`op_vm_host` ADD CONSTRAINT `fk_op_vm_host__id` FOREIGN KEY `fk_op_vm_host__id` (`id`) REFERENCES `host` (`id`) ON DELETE CASCADE; ALTER TABLE `cloud`.`user` ADD INDEX `i_user__secret_key_removed`(`secret_key`, `removed`); ALTER TABLE `cloud`.`user` ADD INDEX `i_user__removed`(`removed`); @@ -82,7 +77,7 @@ ALTER TABLE `cloud`.`resource_limit` ADD CONSTRAINT `fk_resource_limit__domain_i ALTER TABLE `cloud`.`resource_limit` ADD INDEX `i_resource_limit__domain_id`(`domain_id`); ALTER TABLE `cloud`.`resource_limit` ADD CONSTRAINT `fk_resource_limit__account_id` FOREIGN KEY `fk_resource_limit__account_id` (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE; ALTER TABLE `cloud`.`resource_limit` ADD INDEX `i_resource_limit__account_id`(`account_id`); - + ALTER TABLE `cloud`.`event` ADD INDEX `i_event__created`(`created`); ALTER TABLE `cloud`.`event` ADD INDEX `i_event__user_id`(`user_id`); ALTER TABLE `cloud`.`event` ADD INDEX `i_event__account_id` (`account_id`); @@ -144,7 +139,6 @@ ALTER TABLE `cloud`.`domain_router` ADD INDEX `i_domain_router__account_id`(`acc ALTER TABLE `cloud`.`domain_router` ADD CONSTRAINT `fk_domain_router__vlan_id` FOREIGN KEY `fk_domain_router__vlan_id` (`vlan_db_id`) REFERENCES `vlan` (`id`); ALTER TABLE `cloud`.`domain_router` ADD INDEX `i_domain_router__vlan_id`(`vlan_db_id`); -ALTER TABLE `cloud`.`domain_router` ADD CONSTRAINT `fk_domain_route__id` FOREIGN KEY `fk_domain_router__id` (`id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE; ALTER TABLE `cloud`.`console_proxy` ADD CONSTRAINT `fk_console_proxy__vlan_id` FOREIGN KEY `fk_console_proxy__vlan_id` (`vlan_db_id`) REFERENCES `vlan` (`id`); ALTER TABLE `cloud`.`console_proxy` ADD INDEX `i_console_proxy__vlan_id`(`vlan_db_id`); diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index d58e157bffe..ddc98126274 100644 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -73,43 +73,6 @@ DROP TABLE IF EXISTS `cloud`.`ext_lun_alloc`; DROP TABLE IF EXISTS `cloud`.`storage_pool_details`; DROP TABLE IF EXISTS `cloud`.`ext_lun_details`; DROP TABLE IF EXISTS `cloud`.`cluster`; -DROP TABLE IF EXISTS `cloud`.`nics`; -DROP TABLE IF EXISTS `cloud`.`network_profiles`; -DROP TABLE IF EXISTS `cloud`.`network_offerings`; - -CREATE TABLE `cloud`.`network_profiles` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `name` varchar(255) COMMENT 'name for this network', - `account_id` bigint unsigned NOT NULL COMMENT 'Owner of this network configuration', - `traffic_type` varchar(32) NOT NULL COMMENT 'type of traffic going through this network', - `broadcast_domain_type` varchar(32) NOT NULL COMMENT 'type of broadcast domain used', - `gateway` varchar(15) NOT NULL COMMENT 'gateway for this network profile', - `cidr` varchar(32) NOT NULL COMMENT 'network cidr', - `mode` varchar(32) NOT NULL COMMENT 'How to retrieve ip address in this network', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`nics` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', - `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance id', - `ip4_address` varchar(15) COMMENT 'ip4 address', - `mac_address` varchar(17) COMMENT 'mac address', - `network_profile_id` bigint unsigned NOT NULL COMMENT 'network id', - `vlan` varchar(64) COMMENT 'Virtualized network identifier', - `state` varchar(32) NOT NULL COMMENT 'state of the creation', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`network_offerings` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', - `name` varchar(64) NOT NULL COMMENT 'network offering', - `type` varchar(32) NOT NULL COMMENT 'type of network', - `display_text` varchar(255) NOT NULL COMMENT 'text to display to users', - `nw_rate` smallint unsigned default 200 COMMENT 'network rate throttle mbits/s', - `mc_rate` smallint unsigned default 10 COMMENT 'mcast rate throttle mbits/s', - `concurrent_connections` smallint unsigned COMMENT 'concurrent connections supported on this network', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`cluster` ( `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', @@ -293,7 +256,7 @@ CREATE TABLE `cloud`.`data_center` ( `vnet` varchar(255), `router_mac_address` varchar(17) NOT NULL DEFAULT '02:00:00:00:00:01' COMMENT 'mac address for the router within the domain', `mac_address` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Next available mac address for the ethernet card interacting with public internet', - `guest_network_cidr` varchar(18), + `guest_network_cidr` varchar(15), PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -397,12 +360,6 @@ CREATE TABLE `cloud`.`host` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `cloud`.`op_host` ( - `id` bigint unsigned NOT NULL UNIQUE COMMENT 'host id', - `sequence` bigint unsigned DEFAULT 1 NOT NULL COMMENT 'sequence for the host communication', - PRIMARY KEY (`id`) -) ENGINE = InnoDB DEFAULT CHARSET=utf8; - CREATE TABLE `cloud`.`host_details` ( `id` bigint unsigned NOT NULL auto_increment, `host_id` bigint unsigned NOT NULL COMMENT 'host id', @@ -424,6 +381,13 @@ CREATE TABLE `cloud`.`mshost` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `cloud`.`op_vm_host` ( + `id` bigint unsigned NOT NULL UNIQUE COMMENT 'foreign key to host_id', + `vnc_ports` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'vnc ports open on the host', + `start_at` int(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Start the vnc port look up at this bit', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE `cloud`.`user` ( `id` bigint unsigned NOT NULL auto_increment, `username` varchar(255) NOT NULL, @@ -501,37 +465,21 @@ CREATE TABLE `cloud`.`vm_template` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -CREATE TABLE `cloud`.`vm_instance2` ( - `id` bigint unsigned UNIQUE NOT NULL, - `instance_name` varchar(255) NOT NULL COMMENT 'name of the vm instance running on the hosts', - `state` varchar(32) NOT NULL, - `update_count` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'date state was updated', - `vm_template_id` bigint unsigned, - `guest_os_id` bigint unsigned NOT NULL, - `host_id` bigint unsigned, - `last_host_id` bigint unsigned COMMENT 'tentative host for first run or last host that it has been running on', - `proxy_id` bigint unsigned NULL COMMENT 'console proxy allocated in previous session', - `proxy_assign_time` DATETIME NULL COMMENT 'time when console proxy was assigned', - `vnc_password` varchar(255) NOT NULL COMMENT 'vnc password', - `ha_enabled` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Should HA be enabled for this VM', - `update_time` datetime COMMENT 'date the destroy was requested', - `created` datetime NOT NULL COMMENT 'date created', - `removed` datetime COMMENT 'date removed if not null', - `type` varchar(32) NOT NULL COMMENT 'type of vm it is', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - CREATE TABLE `cloud`.`vm_instance` ( `id` bigint unsigned UNIQUE NOT NULL, `name` varchar(255) NOT NULL, + `display_name` varchar(255), + `group` varchar(255), `instance_name` varchar(255) NOT NULL COMMENT 'name of the vm instance running on the hosts', `state` varchar(32) NOT NULL, `vm_template_id` bigint unsigned, + `iso_id` bigint unsigned, `guest_os_id` bigint unsigned NOT NULL, `private_mac_address` varchar(17), `private_ip_address` varchar(15), `private_netmask` varchar(15), `pod_id` bigint unsigned NOT NULL, + `storage_ip` varchar(15), `data_center_id` bigint unsigned NOT NULL COMMENT 'Data Center the instance belongs to', `host_id` bigint unsigned, `last_host_id` bigint unsigned COMMENT 'tentative host for first run or last host that it has been running on', @@ -548,12 +496,20 @@ CREATE TABLE `cloud`.`vm_instance` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `cloud`.`pricing` ( + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, + `price` FLOAT UNSIGNED NOT NULL, + `price_unit` VARCHAR(45) NOT NULL, + `type` VARCHAR(255) NOT NULL, + `type_id` INTEGER UNSIGNED, + `created` DATETIME NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + CREATE TABLE `cloud`.`user_vm` ( `id` bigint unsigned UNIQUE NOT NULL, - `group` varchar(255), - `iso_id` bigint unsigned, - `display_name` varchar(255), `domain_router_id` bigint unsigned COMMENT 'router id', + `service_offering_id` bigint unsigned NOT NULL COMMENT 'service offering id', `vnet` varchar(18) COMMENT 'vnet', `dc_vlan` varchar(18) COMMENT 'zone vlan', `account_id` bigint unsigned NOT NULL COMMENT 'user id of owner', @@ -565,7 +521,6 @@ CREATE TABLE `cloud`.`user_vm` ( `external_mac_address` varchar(17) COMMENT 'mac address within the external network', `external_vlan_db_id` bigint unsigned COMMENT 'foreign key into vlan table', `user_data` varchar(2048), - `service_offering_id` bigint unsigned NOT NULL COMMENT 'service offering id', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -702,8 +657,7 @@ CREATE TABLE `cloud`.`resource_limit` ( CREATE TABLE `cloud`.`resource_count` ( `id` bigint unsigned NOT NULL auto_increment, - `account_id` bigint unsigned, - `domain_id` bigint unsigned, + `account_id` bigint unsigned NOT NULL, `type` varchar(255), `count` bigint NOT NULL default '0', PRIMARY KEY (`id`) @@ -893,7 +847,6 @@ CREATE TABLE `cloud`.`storage_pool` ( `created` datetime COMMENT 'date the pool created', `removed` datetime COMMENT 'date removed if not null', `update_time` DATETIME, - `status` varchar(32), PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/setup/db/deploy-db-dev.sh b/setup/db/deploy-db-dev.sh index 3e20af62042..d3b010afeba 100755 --- a/setup/db/deploy-db-dev.sh +++ b/setup/db/deploy-db-dev.sh @@ -39,6 +39,21 @@ PATHSEP=':' if [[ $OSTYPE == "cygwin" ]] ; then export CATALINA_HOME=`cygpath -m $CATALINA_HOME` PATHSEP=';' +else + mysql="mysql" + service mysql status > /dev/null 2>/dev/null + if [ $? -eq 1 ]; then + mysql="mysqld" + service mysqld status > /dev/null 2>/dev/null + if [ $? -ne 0 ]; then + printf "Unable to find mysql daemon\n" + exit 7 + fi + fi + + echo "Starting mysql" + service $mysql start > /dev/null 2>/dev/null + fi echo "Recreating Database." @@ -64,8 +79,6 @@ fi CP=./ -CP=${CP}$PATHSEP$CATALINA_HOME/conf - for file in $CATALINA_HOME/webapps/client/WEB-INF/lib/*.jar do CP=${CP}$PATHSEP$file @@ -75,7 +88,7 @@ for file in $CATALINA_HOME/lib/*.jar; do CP=${CP}$PATHSEP$file done -echo CP is $CP +#echo CP is $CP java -cp $CP com.cloud.test.DatabaseConfig $* diff --git a/setup/db/migration/schema-21to22.sql b/setup/db/migration/schema-21to22.sql deleted file mode 100644 index 108ed2a9e20..00000000000 --- a/setup/db/migration/schema-21to22.sql +++ /dev/null @@ -1,9 +0,0 @@ --- --- Schema upgrade from 2.1 to 2.2 --- - -ALTER TABLE `cloud`.`data_center` MODIFY COLUMN `guest_network_cidr` varchar(18); -- modify column width to 18 from 15 - -ALTER TABLE `cloud`.`resource_count` ADD COLUMN `domain_id` bigint unsigned; -- add the new column -ALTER TABLE `cloud`.`resource_count` MODIFY COLUMN `account_id` bigint unsigned; -- modify the column to allow NULL values -ALTER TABLE `cloud`.`storage_pool` add COLUMN STATUS varchar(32) not null; -- new status column for maintenance mode support for primary storage diff --git a/ui/content/tab_accounts.html b/ui/content/tab_accounts.html index 91857da6f63..5a63bb419c5 100644 --- a/ui/content/tab_accounts.html +++ b/ui/content/tab_accounts.html @@ -1,3 +1,5 @@ + +