diff --git a/agent/.classpath b/agent/.classpath index f36c50ee1f6..f2bd7d7bc6e 100644 --- a/agent/.classpath +++ b/agent/.classpath @@ -12,5 +12,6 @@ + diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index e5319d555d8..8598b9fa29b 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -53,6 +53,7 @@ import javax.ejb.Local; import javax.naming.ConfigurationException; import org.apache.log4j.Logger; +import org.apache.xmlrpc.XmlRpcException; import org.libvirt.Connect; import org.libvirt.Domain; import org.libvirt.DomainInfo; @@ -78,6 +79,7 @@ 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.CleanupNetworkRulesCmd; import com.cloud.agent.api.Command; import com.cloud.agent.api.CreatePrivateTemplateFromSnapshotCommand; import com.cloud.agent.api.CreatePrivateTemplateFromVolumeCommand; @@ -104,16 +106,17 @@ import com.cloud.agent.api.ManageSnapshotAnswer; import com.cloud.agent.api.ManageSnapshotCommand; import com.cloud.agent.api.MigrateAnswer; import com.cloud.agent.api.MigrateCommand; -import com.cloud.agent.api.MirrorCommand; import com.cloud.agent.api.ModifySshKeysCommand; import com.cloud.agent.api.ModifyStoragePoolAnswer; import com.cloud.agent.api.ModifyStoragePoolCommand; +import com.cloud.agent.api.NetworkRulesSystemVmCommand; import com.cloud.agent.api.NetworkUsageAnswer; import com.cloud.agent.api.NetworkUsageCommand; import com.cloud.agent.api.PingCommand; import com.cloud.agent.api.PingRoutingCommand; import com.cloud.agent.api.PingRoutingWithNwGroupsCommand; import com.cloud.agent.api.PingTestCommand; +import com.cloud.agent.api.PrepareForMigrationAnswer; import com.cloud.agent.api.PrepareForMigrationCommand; import com.cloud.agent.api.ReadyAnswer; import com.cloud.agent.api.ReadyCommand; @@ -165,8 +168,9 @@ import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource; import com.cloud.exception.InternalErrorException; import com.cloud.host.Host.Type; import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.network.NetworkEnums.RouterPrivateIpStrategy; import com.cloud.network.Networks.BroadcastDomainType; +import com.cloud.network.Networks.RouterPrivateIpStrategy; +import com.cloud.network.Networks.IsolationType; import com.cloud.network.Networks.TrafficType; import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResourceBase; @@ -798,8 +802,6 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return execute((GetHostStatsCommand)cmd); } else if (cmd instanceof CheckStateCommand) { return executeRequest(cmd); - } else if (cmd instanceof MirrorCommand) { - return executeRequest(cmd); } else if (cmd instanceof CheckHealthCommand) { return execute((CheckHealthCommand)cmd); } else if (cmd instanceof PrepareForMigrationCommand) { @@ -866,6 +868,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return execute((CheckSshCommand) cmd); } else if (cmd instanceof NetworkUsageCommand) { return execute((NetworkUsageCommand) cmd); + } else if (cmd instanceof NetworkRulesSystemVmCommand) { + return execute((NetworkRulesSystemVmCommand)cmd); + } else if (cmd instanceof CleanupNetworkRulesCmd) { + return execute((CleanupNetworkRulesCmd)cmd); } else { s_logger.warn("Unsupported command "); return Answer.createUnsupportedCommandAnswer(cmd); @@ -887,7 +893,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } KVMHABase.NfsStoragePool sp = new KVMHABase.NfsStoragePool(cmd.getPool().getUuid(), - cmd.getPool().getHostAddress(), + cmd.getPool().getHost(), cmd.getPool().getPath(), _mountPoint + File.separator + cmd.getPool().getUuid(), PoolType.PrimaryStorage); @@ -1083,7 +1089,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv String result = command.execute(); if (result != null) { s_logger.debug("Failed to backup snaptshot: " + result); - return new BackupSnapshotAnswer(cmd, false, result, null); + return new BackupSnapshotAnswer(cmd, false, result, null, true); } /*Delete the snapshot on primary*/ @@ -1119,15 +1125,15 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv result = command.execute(); if (result != null) { s_logger.debug("Failed to backup snapshot: " + result); - return new BackupSnapshotAnswer(cmd, false, "Failed to backup snapshot: " + result, null); + return new BackupSnapshotAnswer(cmd, false, "Failed to backup snapshot: " + result, null, true); } } } catch (LibvirtException e) { - return new BackupSnapshotAnswer(cmd, false, e.toString(), null); + return new BackupSnapshotAnswer(cmd, false, e.toString(), null, true); } catch (URISyntaxException e) { - return new BackupSnapshotAnswer(cmd, false, e.toString(), null); + return new BackupSnapshotAnswer(cmd, false, e.toString(), null, true); } - return new BackupSnapshotAnswer(cmd, true, null, snapshotDestPath + File.separator + snapshotName); + return new BackupSnapshotAnswer(cmd, true, null, snapshotDestPath + File.separator + snapshotName, true); } protected DeleteSnapshotBackupAnswer execute(final DeleteSnapshotBackupCommand cmd) { @@ -1571,6 +1577,11 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } } + private Answer execute(CleanupNetworkRulesCmd cmd) { + boolean result = cleanup_rules(); + return new Answer(cmd, result, ""); + } + protected GetVncPortAnswer execute(GetVncPortCommand cmd) { try { Connect conn = LibvirtConnection.getConnection(); @@ -1725,6 +1736,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv _vms.put(cmd.getVmName(), State.Running); } } + return new CheckVirtualMachineAnswer(cmd, state, vncPort); } catch (LibvirtException e) { return new CheckVirtualMachineAnswer(cmd, e.getMessage()); @@ -1816,26 +1828,44 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } private synchronized Answer execute(PrepareForMigrationCommand cmd) { -// final String vmName = cmd.getVmName(); -// String result = null; -// -// if (cmd.getVnet() != null && !isDirectAttachedNetwork(cmd.getVnet())) { -// final String vnet = getVnetId(cmd.getVnet()); -// if (vnet != null) { -// try { -// createVnet(vnet, _pifs.first()); /*TODO: Need to add public network for domR*/ -// } catch (InternalErrorException e) { -// return new PrepareForMigrationAnswer(cmd, false, result); -// } -// } -// } -// -// synchronized(_vms) { -// _vms.put(vmName, State.Migrating); -// } -// -// return new PrepareForMigrationAnswer(cmd, result == null, result); - return null; + + VirtualMachineTO vm = cmd.getVirtualMachine(); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Preparing host for migrating " + vm); + } + + NicTO[] nics = vm.getNics(); + try { + Connect conn = LibvirtConnection.getConnection(); + for (NicTO nic : nics) { + String vlanId = null; + if (nic.getBroadcastType() == BroadcastDomainType.Vlan) { + URI broadcastUri = nic.getBroadcastUri(); + vlanId = broadcastUri.getHost(); + } + if (nic.getType() == TrafficType.Guest) { + if (nic.getBroadcastType() == BroadcastDomainType.Vlan && !vlanId.equalsIgnoreCase("untagged")){ + createVlanBr(vlanId, _pifs.first()); + } + } else if (nic.getType() == TrafficType.Control) { + /*Make sure the network is still there*/ + createControlNetwork(conn); + } else if (nic.getType() == TrafficType.Public) { + if (nic.getBroadcastType() == BroadcastDomainType.Vlan && !vlanId.equalsIgnoreCase("untagged")) { + createVlanBr(vlanId, _pifs.second()); + } + } + } + synchronized (_vms) { + _vms.put(vm.getName(), State.Migrating); + } + + return new PrepareForMigrationAnswer(cmd); + } catch (LibvirtException e) { + return new PrepareForMigrationAnswer(cmd, e.toString()); + } catch (InternalErrorException e) { + return new PrepareForMigrationAnswer(cmd, e.toString()); + } } public void createVnet(String vnetId, String pif) throws InternalErrorException { @@ -2207,7 +2237,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv if (vmSpec.getType() != VirtualMachine.Type.User) { default_network_rules_for_systemvm(vmName); } else { - default_network_rules(vmName, vmSpec.getNics()[0].getIp(), vmSpec.getId(), vmSpec.getNics()[0].getMac()); + NicTO[] nics = vmSpec.getNics(); + for (NicTO nic : nics) { + if (nic.getIsolationUri() != null && nic.getIsolationUri().getScheme().equalsIgnoreCase(IsolationType.Ec2.toString())) { + default_network_rules(vmName, vmSpec.getNics()[0].getIp(), vmSpec.getId(), vmSpec.getNics()[0].getMac()); + } + } } // Attach each data volume to the VM, if there is a deferred attached disk @@ -2220,8 +2255,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return new StartAnswer(cmd); } catch (Exception e) { s_logger.warn("Exception ", e); - if (conn != null) - handleVmStartFailure(conn, vmName, vm); + if (conn != null) { + handleVmStartFailure(conn, vmName, vm); + } return new StartAnswer(cmd, e.getMessage()); } finally { synchronized (_vms) { @@ -3472,6 +3508,19 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return true; } + private boolean cleanup_rules() { + if (!_can_bridge_firewall) { + return false; + } + Script cmd = new Script(_securityGroupPath, _timeout, s_logger); + cmd.add("cleanup_rules"); + String result = cmd.execute(); + if (result != null) { + return false; + } + return true; + } + private String get_rule_logs_for_vms() { Script cmd = new Script(_securityGroupPath, _timeout, s_logger); cmd.add("get_rule_logs_for_vms"); @@ -3575,4 +3624,13 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv } return storage; } + + private Answer execute(NetworkRulesSystemVmCommand cmd) { + boolean success = false; + if (cmd.getType() != VirtualMachine.Type.User) { + success = default_network_rules_for_systemvm(cmd.getVmName()); + } + + return new Answer(cmd, success, ""); + } } diff --git a/api/.classpath b/api/.classpath index e52580d102b..dc73036afd7 100644 --- a/api/.classpath +++ b/api/.classpath @@ -5,5 +5,6 @@ + diff --git a/core/src/com/cloud/agent/api/AgentControlAnswer.java b/api/src/com/cloud/agent/api/AgentControlAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/AgentControlAnswer.java rename to api/src/com/cloud/agent/api/AgentControlAnswer.java diff --git a/core/src/com/cloud/agent/api/AgentControlCommand.java b/api/src/com/cloud/agent/api/AgentControlCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/AgentControlCommand.java rename to api/src/com/cloud/agent/api/AgentControlCommand.java diff --git a/core/src/com/cloud/agent/api/AttachIsoCommand.java b/api/src/com/cloud/agent/api/AttachIsoCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/AttachIsoCommand.java rename to api/src/com/cloud/agent/api/AttachIsoCommand.java diff --git a/core/src/com/cloud/agent/api/AttachVolumeAnswer.java b/api/src/com/cloud/agent/api/AttachVolumeAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/AttachVolumeAnswer.java rename to api/src/com/cloud/agent/api/AttachVolumeAnswer.java diff --git a/core/src/com/cloud/agent/api/AttachVolumeCommand.java b/api/src/com/cloud/agent/api/AttachVolumeCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/AttachVolumeCommand.java rename to api/src/com/cloud/agent/api/AttachVolumeCommand.java diff --git a/core/src/com/cloud/agent/api/BackupSnapshotAnswer.java b/api/src/com/cloud/agent/api/BackupSnapshotAnswer.java similarity index 87% rename from core/src/com/cloud/agent/api/BackupSnapshotAnswer.java rename to api/src/com/cloud/agent/api/BackupSnapshotAnswer.java index 93b5fe78520..807ce0d3851 100644 --- a/core/src/com/cloud/agent/api/BackupSnapshotAnswer.java +++ b/api/src/com/cloud/agent/api/BackupSnapshotAnswer.java @@ -20,14 +20,16 @@ package com.cloud.agent.api; public class BackupSnapshotAnswer extends Answer { private String backupSnapshotName; + private boolean full; protected BackupSnapshotAnswer() { } - public BackupSnapshotAnswer(BackupSnapshotCommand cmd, boolean success, String result, String backupSnapshotName) { + public BackupSnapshotAnswer(BackupSnapshotCommand cmd, boolean success, String result, String backupSnapshotName, boolean full) { super(cmd, success, result); this.backupSnapshotName = backupSnapshotName; + this.full = full; } /** @@ -36,4 +38,8 @@ public class BackupSnapshotAnswer extends Answer { public String getBackupSnapshotName() { return backupSnapshotName; } + + public boolean isFull() { + return full; + } } diff --git a/core/src/com/cloud/agent/api/BackupSnapshotCommand.java b/api/src/com/cloud/agent/api/BackupSnapshotCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/BackupSnapshotCommand.java rename to api/src/com/cloud/agent/api/BackupSnapshotCommand.java diff --git a/core/src/com/cloud/agent/api/CancelCommand.java b/api/src/com/cloud/agent/api/CancelCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/CancelCommand.java rename to api/src/com/cloud/agent/api/CancelCommand.java diff --git a/core/src/com/cloud/agent/api/ChangeAgentAnswer.java b/api/src/com/cloud/agent/api/ChangeAgentAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/ChangeAgentAnswer.java rename to api/src/com/cloud/agent/api/ChangeAgentAnswer.java diff --git a/core/src/com/cloud/agent/api/ChangeAgentCommand.java b/api/src/com/cloud/agent/api/ChangeAgentCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/ChangeAgentCommand.java rename to api/src/com/cloud/agent/api/ChangeAgentCommand.java diff --git a/core/src/com/cloud/agent/api/CheckHealthAnswer.java b/api/src/com/cloud/agent/api/CheckHealthAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/CheckHealthAnswer.java rename to api/src/com/cloud/agent/api/CheckHealthAnswer.java diff --git a/core/src/com/cloud/agent/api/CheckHealthCommand.java b/api/src/com/cloud/agent/api/CheckHealthCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/CheckHealthCommand.java rename to api/src/com/cloud/agent/api/CheckHealthCommand.java diff --git a/core/src/com/cloud/agent/api/CheckOnHostAnswer.java b/api/src/com/cloud/agent/api/CheckOnHostAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/CheckOnHostAnswer.java rename to api/src/com/cloud/agent/api/CheckOnHostAnswer.java diff --git a/core/src/com/cloud/agent/api/CheckOnHostCommand.java b/api/src/com/cloud/agent/api/CheckOnHostCommand.java similarity index 93% rename from core/src/com/cloud/agent/api/CheckOnHostCommand.java rename to api/src/com/cloud/agent/api/CheckOnHostCommand.java index 38f808713ba..2bbb564acd4 100644 --- a/core/src/com/cloud/agent/api/CheckOnHostCommand.java +++ b/api/src/com/cloud/agent/api/CheckOnHostCommand.java @@ -18,7 +18,7 @@ package com.cloud.agent.api; import com.cloud.agent.api.to.HostTO; -import com.cloud.host.HostVO; +import com.cloud.host.Host; public class CheckOnHostCommand extends Command { HostTO host; @@ -27,7 +27,7 @@ public class CheckOnHostCommand extends Command { } - public CheckOnHostCommand(HostVO host) { + public CheckOnHostCommand(Host host) { this.host = new HostTO(host); } diff --git a/core/src/com/cloud/agent/api/CheckStateAnswer.java b/api/src/com/cloud/agent/api/CheckStateAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/CheckStateAnswer.java rename to api/src/com/cloud/agent/api/CheckStateAnswer.java diff --git a/core/src/com/cloud/agent/api/CheckStateCommand.java b/api/src/com/cloud/agent/api/CheckStateCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/CheckStateCommand.java rename to api/src/com/cloud/agent/api/CheckStateCommand.java diff --git a/core/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java b/api/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java rename to api/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java diff --git a/core/src/com/cloud/agent/api/CheckVirtualMachineCommand.java b/api/src/com/cloud/agent/api/CheckVirtualMachineCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/CheckVirtualMachineCommand.java rename to api/src/com/cloud/agent/api/CheckVirtualMachineCommand.java diff --git a/core/src/com/cloud/agent/api/CleanupNetworkRulesCmd.java b/api/src/com/cloud/agent/api/CleanupNetworkRulesCmd.java similarity index 100% rename from core/src/com/cloud/agent/api/CleanupNetworkRulesCmd.java rename to api/src/com/cloud/agent/api/CleanupNetworkRulesCmd.java diff --git a/core/src/com/cloud/agent/api/ConsoleAccessAuthenticationAnswer.java b/api/src/com/cloud/agent/api/ConsoleAccessAuthenticationAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/ConsoleAccessAuthenticationAnswer.java rename to api/src/com/cloud/agent/api/ConsoleAccessAuthenticationAnswer.java diff --git a/core/src/com/cloud/agent/api/ConsoleAccessAuthenticationCommand.java b/api/src/com/cloud/agent/api/ConsoleAccessAuthenticationCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/ConsoleAccessAuthenticationCommand.java rename to api/src/com/cloud/agent/api/ConsoleAccessAuthenticationCommand.java diff --git a/core/src/com/cloud/agent/api/ConsoleProxyLoadReportCommand.java b/api/src/com/cloud/agent/api/ConsoleProxyLoadReportCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/ConsoleProxyLoadReportCommand.java rename to api/src/com/cloud/agent/api/ConsoleProxyLoadReportCommand.java diff --git a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java b/api/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java rename to api/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java diff --git a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java b/api/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java rename to api/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java diff --git a/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotAnswer.java b/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/CreateVolumeFromSnapshotAnswer.java rename to api/src/com/cloud/agent/api/CreateVolumeFromSnapshotAnswer.java diff --git a/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java b/api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java rename to api/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java diff --git a/core/src/com/cloud/agent/api/CronCommand.java b/api/src/com/cloud/agent/api/CronCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/CronCommand.java rename to api/src/com/cloud/agent/api/CronCommand.java diff --git a/core/src/com/cloud/agent/api/DeleteSnapshotBackupAnswer.java b/api/src/com/cloud/agent/api/DeleteSnapshotBackupAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/DeleteSnapshotBackupAnswer.java rename to api/src/com/cloud/agent/api/DeleteSnapshotBackupAnswer.java diff --git a/core/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java b/api/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java rename to api/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java diff --git a/core/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java b/api/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java rename to api/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java diff --git a/core/src/com/cloud/agent/api/DeleteStoragePoolCommand.java b/api/src/com/cloud/agent/api/DeleteStoragePoolCommand.java similarity index 70% rename from core/src/com/cloud/agent/api/DeleteStoragePoolCommand.java rename to api/src/com/cloud/agent/api/DeleteStoragePoolCommand.java index 5f16b454bbb..98972e2be31 100644 --- a/core/src/com/cloud/agent/api/DeleteStoragePoolCommand.java +++ b/api/src/com/cloud/agent/api/DeleteStoragePoolCommand.java @@ -21,34 +21,34 @@ package com.cloud.agent.api; import java.io.File; import java.util.UUID; -import com.cloud.storage.StoragePoolVO; +import com.cloud.agent.api.to.StorageFilerTO; +import com.cloud.storage.StoragePool; public class DeleteStoragePoolCommand extends Command { - StoragePoolVO pool; + StorageFilerTO pool; public static final String LOCAL_PATH_PREFIX="/mnt/"; String localPath; - public DeleteStoragePoolCommand() { } - public DeleteStoragePoolCommand(StoragePoolVO pool, String localPath) { - this.pool = new StoragePoolVO(pool); + public DeleteStoragePoolCommand(StoragePool pool, String localPath) { + this.pool = new StorageFilerTO(pool); this.localPath = localPath; } - public DeleteStoragePoolCommand(StoragePoolVO pool) { - this(new StoragePoolVO(pool), LOCAL_PATH_PREFIX + File.separator + UUID.nameUUIDFromBytes((pool.getHostAddress() + pool.getPath()).getBytes())); + public DeleteStoragePoolCommand(StoragePool pool) { + this(pool, LOCAL_PATH_PREFIX + File.separator + UUID.nameUUIDFromBytes((pool.getHostAddress() + pool.getPath()).getBytes())); } - public StoragePoolVO getPool() { + public StorageFilerTO getPool() { return pool; } - public void setPool(StoragePoolVO pool) { - this.pool = new StoragePoolVO(pool); + public void setPool(StoragePool pool) { + this.pool = new StorageFilerTO(pool); } @Override diff --git a/core/src/com/cloud/agent/api/FenceAnswer.java b/api/src/com/cloud/agent/api/FenceAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/FenceAnswer.java rename to api/src/com/cloud/agent/api/FenceAnswer.java diff --git a/core/src/com/cloud/agent/api/FenceCommand.java b/api/src/com/cloud/agent/api/FenceCommand.java similarity index 92% rename from core/src/com/cloud/agent/api/FenceCommand.java rename to api/src/com/cloud/agent/api/FenceCommand.java index 3b47909ce87..ffbc01e51aa 100644 --- a/core/src/com/cloud/agent/api/FenceCommand.java +++ b/api/src/com/cloud/agent/api/FenceCommand.java @@ -17,8 +17,8 @@ */ package com.cloud.agent.api; -import com.cloud.host.HostVO; -import com.cloud.vm.VMInstanceVO; +import com.cloud.host.Host; +import com.cloud.vm.VirtualMachine; public class FenceCommand extends Command { @@ -30,7 +30,7 @@ public class FenceCommand extends Command { String hostGuid; String hostIp; - public FenceCommand(VMInstanceVO vm, HostVO host) { + public FenceCommand(VirtualMachine vm, Host host) { super(); vmName = vm.getInstanceName(); hostGuid = host.getGuid(); diff --git a/core/src/com/cloud/agent/api/GetFileStatsAnswer.java b/api/src/com/cloud/agent/api/GetFileStatsAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/GetFileStatsAnswer.java rename to api/src/com/cloud/agent/api/GetFileStatsAnswer.java diff --git a/core/src/com/cloud/agent/api/GetFileStatsCommand.java b/api/src/com/cloud/agent/api/GetFileStatsCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/GetFileStatsCommand.java rename to api/src/com/cloud/agent/api/GetFileStatsCommand.java diff --git a/core/src/com/cloud/agent/api/GetHostStatsAnswer.java b/api/src/com/cloud/agent/api/GetHostStatsAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/GetHostStatsAnswer.java rename to api/src/com/cloud/agent/api/GetHostStatsAnswer.java diff --git a/core/src/com/cloud/agent/api/GetHostStatsCommand.java b/api/src/com/cloud/agent/api/GetHostStatsCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/GetHostStatsCommand.java rename to api/src/com/cloud/agent/api/GetHostStatsCommand.java diff --git a/core/src/com/cloud/agent/api/GetStorageStatsAnswer.java b/api/src/com/cloud/agent/api/GetStorageStatsAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/GetStorageStatsAnswer.java rename to api/src/com/cloud/agent/api/GetStorageStatsAnswer.java diff --git a/core/src/com/cloud/agent/api/GetStorageStatsCommand.java b/api/src/com/cloud/agent/api/GetStorageStatsCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/GetStorageStatsCommand.java rename to api/src/com/cloud/agent/api/GetStorageStatsCommand.java diff --git a/core/src/com/cloud/agent/api/GetVmStatsAnswer.java b/api/src/com/cloud/agent/api/GetVmStatsAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/GetVmStatsAnswer.java rename to api/src/com/cloud/agent/api/GetVmStatsAnswer.java diff --git a/core/src/com/cloud/agent/api/GetVmStatsCommand.java b/api/src/com/cloud/agent/api/GetVmStatsCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/GetVmStatsCommand.java rename to api/src/com/cloud/agent/api/GetVmStatsCommand.java diff --git a/core/src/com/cloud/agent/api/GetVncPortAnswer.java b/api/src/com/cloud/agent/api/GetVncPortAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/GetVncPortAnswer.java rename to api/src/com/cloud/agent/api/GetVncPortAnswer.java diff --git a/core/src/com/cloud/agent/api/GetVncPortCommand.java b/api/src/com/cloud/agent/api/GetVncPortCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/GetVncPortCommand.java rename to api/src/com/cloud/agent/api/GetVncPortCommand.java diff --git a/core/src/com/cloud/agent/api/HostStatsEntry.java b/api/src/com/cloud/agent/api/HostStatsEntry.java similarity index 100% rename from core/src/com/cloud/agent/api/HostStatsEntry.java rename to api/src/com/cloud/agent/api/HostStatsEntry.java diff --git a/core/src/com/cloud/agent/api/MaintainAnswer.java b/api/src/com/cloud/agent/api/MaintainAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/MaintainAnswer.java rename to api/src/com/cloud/agent/api/MaintainAnswer.java diff --git a/core/src/com/cloud/agent/api/MaintainCommand.java b/api/src/com/cloud/agent/api/MaintainCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/MaintainCommand.java rename to api/src/com/cloud/agent/api/MaintainCommand.java diff --git a/core/src/com/cloud/agent/api/ManageSnapshotAnswer.java b/api/src/com/cloud/agent/api/ManageSnapshotAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/ManageSnapshotAnswer.java rename to api/src/com/cloud/agent/api/ManageSnapshotAnswer.java diff --git a/core/src/com/cloud/agent/api/ManageSnapshotCommand.java b/api/src/com/cloud/agent/api/ManageSnapshotCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/ManageSnapshotCommand.java rename to api/src/com/cloud/agent/api/ManageSnapshotCommand.java diff --git a/core/src/com/cloud/agent/api/MigrateAnswer.java b/api/src/com/cloud/agent/api/MigrateAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/MigrateAnswer.java rename to api/src/com/cloud/agent/api/MigrateAnswer.java diff --git a/core/src/com/cloud/agent/api/MigrateCommand.java b/api/src/com/cloud/agent/api/MigrateCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/MigrateCommand.java rename to api/src/com/cloud/agent/api/MigrateCommand.java diff --git a/core/src/com/cloud/agent/api/ModifySshKeysCommand.java b/api/src/com/cloud/agent/api/ModifySshKeysCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/ModifySshKeysCommand.java rename to api/src/com/cloud/agent/api/ModifySshKeysCommand.java diff --git a/core/src/com/cloud/agent/api/NetworkUsageAnswer.java b/api/src/com/cloud/agent/api/NetworkUsageAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/NetworkUsageAnswer.java rename to api/src/com/cloud/agent/api/NetworkUsageAnswer.java diff --git a/core/src/com/cloud/agent/api/NetworkUsageCommand.java b/api/src/com/cloud/agent/api/NetworkUsageCommand.java similarity index 82% rename from core/src/com/cloud/agent/api/NetworkUsageCommand.java rename to api/src/com/cloud/agent/api/NetworkUsageCommand.java index 5ecf9741959..43472fe4383 100644 --- a/core/src/com/cloud/agent/api/NetworkUsageCommand.java +++ b/api/src/com/cloud/agent/api/NetworkUsageCommand.java @@ -21,6 +21,7 @@ package com.cloud.agent.api; public class NetworkUsageCommand extends Command { private String privateIP; private String domRName; + private String option; protected NetworkUsageCommand() { @@ -31,6 +32,13 @@ public class NetworkUsageCommand extends Command { this.privateIP = privateIP; this.domRName = domRName; } + + public NetworkUsageCommand(String privateIP, String domRName, String option) + { + this.privateIP = privateIP; + this.domRName = domRName; + this.option = option; + } public String getPrivateIP() { return privateIP; @@ -40,6 +48,10 @@ public class NetworkUsageCommand extends Command { return domRName; } + public String getOption() { + return option; + } + /** * {@inheritDoc} */ diff --git a/core/src/com/cloud/agent/api/PingAnswer.java b/api/src/com/cloud/agent/api/PingAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/PingAnswer.java rename to api/src/com/cloud/agent/api/PingAnswer.java diff --git a/core/src/com/cloud/agent/api/PingCommand.java b/api/src/com/cloud/agent/api/PingCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/PingCommand.java rename to api/src/com/cloud/agent/api/PingCommand.java diff --git a/core/src/com/cloud/agent/api/PingRoutingCommand.java b/api/src/com/cloud/agent/api/PingRoutingCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/PingRoutingCommand.java rename to api/src/com/cloud/agent/api/PingRoutingCommand.java diff --git a/api/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java b/api/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java new file mode 100644 index 00000000000..06a4de581b7 --- /dev/null +++ b/api/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java @@ -0,0 +1,48 @@ +/** + * Copyright (C) 2010 Cloud.com. 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.HashMap; +import java.util.Map; + +import com.cloud.host.Host; +import com.cloud.utils.Pair; +import com.cloud.vm.VirtualMachine.State; + + +public class PingRoutingWithNwGroupsCommand extends PingRoutingCommand { + HashMap> newGroupStates; + + protected PingRoutingWithNwGroupsCommand() { + super(); + } + + public PingRoutingWithNwGroupsCommand(Host.Type type, long id, Map states, HashMap> nwGrpStates) { + super(type, id, states); + newGroupStates = nwGrpStates; + } + + public HashMap> getNewGroupStates() { + return newGroupStates; + } + + public void setNewGroupStates(HashMap> newGroupStates) { + this.newGroupStates = newGroupStates; + } +} diff --git a/core/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java b/api/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java rename to api/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java diff --git a/core/src/com/cloud/agent/api/PingStorageCommand.java b/api/src/com/cloud/agent/api/PingStorageCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/PingStorageCommand.java rename to api/src/com/cloud/agent/api/PingStorageCommand.java diff --git a/core/src/com/cloud/agent/api/PingTestCommand.java b/api/src/com/cloud/agent/api/PingTestCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/PingTestCommand.java rename to api/src/com/cloud/agent/api/PingTestCommand.java diff --git a/core/src/com/cloud/agent/api/PoolEjectCommand.java b/api/src/com/cloud/agent/api/PoolEjectCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/PoolEjectCommand.java rename to api/src/com/cloud/agent/api/PoolEjectCommand.java diff --git a/core/src/com/cloud/agent/api/PrepareForMigrationAnswer.java b/api/src/com/cloud/agent/api/PrepareForMigrationAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/PrepareForMigrationAnswer.java rename to api/src/com/cloud/agent/api/PrepareForMigrationAnswer.java diff --git a/core/src/com/cloud/agent/api/PrepareForMigrationCommand.java b/api/src/com/cloud/agent/api/PrepareForMigrationCommand.java similarity index 81% rename from core/src/com/cloud/agent/api/PrepareForMigrationCommand.java rename to api/src/com/cloud/agent/api/PrepareForMigrationCommand.java index c9d7e87fcb1..f73b75c752f 100644 --- a/core/src/com/cloud/agent/api/PrepareForMigrationCommand.java +++ b/api/src/com/cloud/agent/api/PrepareForMigrationCommand.java @@ -17,10 +17,7 @@ */ package com.cloud.agent.api; -import java.util.List; - import com.cloud.agent.api.to.VirtualMachineTO; -import com.cloud.storage.VolumeVO; public class PrepareForMigrationCommand extends StartCommand { @@ -31,10 +28,6 @@ public class PrepareForMigrationCommand extends StartCommand { super(vm); } - public PrepareForMigrationCommand(String vmName, String vnet, String[] storageHosts, List vols, boolean mirrored) { - //super(vmName, storageHosts, vols, mirrored); - } - @Override public boolean executeInSequence() { return true; diff --git a/core/src/com/cloud/agent/api/ReadyAnswer.java b/api/src/com/cloud/agent/api/ReadyAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/ReadyAnswer.java rename to api/src/com/cloud/agent/api/ReadyAnswer.java diff --git a/core/src/com/cloud/agent/api/ReadyCommand.java b/api/src/com/cloud/agent/api/ReadyCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/ReadyCommand.java rename to api/src/com/cloud/agent/api/ReadyCommand.java diff --git a/core/src/com/cloud/agent/api/RebootAnswer.java b/api/src/com/cloud/agent/api/RebootAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/RebootAnswer.java rename to api/src/com/cloud/agent/api/RebootAnswer.java diff --git a/core/src/com/cloud/agent/api/RebootCommand.java b/api/src/com/cloud/agent/api/RebootCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/RebootCommand.java rename to api/src/com/cloud/agent/api/RebootCommand.java diff --git a/core/src/com/cloud/agent/api/RebootRouterCommand.java b/api/src/com/cloud/agent/api/RebootRouterCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/RebootRouterCommand.java rename to api/src/com/cloud/agent/api/RebootRouterCommand.java diff --git a/core/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java b/api/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java similarity index 50% rename from core/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java rename to api/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java index a27cbfa95ab..1b2f7b3e84b 100644 --- a/core/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java +++ b/api/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java @@ -18,74 +18,17 @@ package com.cloud.agent.api; -import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; -import com.cloud.agent.transport.Request; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; import com.google.gson.annotations.Expose; -import com.google.gson.reflect.TypeToken; public class SecStorageFirewallCfgCommand extends Command { private static final Logger s_logger = Logger.getLogger(SecStorageFirewallCfgCommand.class); - public static class PortConfigListTypeAdaptor implements JsonDeserializer>, JsonSerializer> { - static final GsonBuilder s_gBuilder; - static { - s_gBuilder = Request.initBuilder(); - } - - static final Type listType = new TypeToken>() {}.getType(); - - public PortConfigListTypeAdaptor() { - } - - public JsonElement serialize(List src, Type typeOfSrc, JsonSerializationContext context) { - if (src.size() == 0) { - s_logger.info("Returning JsonNull"); - return new JsonNull(); - } - Gson json = s_gBuilder.create(); - s_logger.debug("Returning gson tree"); - JsonArray array = new JsonArray(); - for (PortConfig pc : src) { - array.add(json.toJsonTree(pc)); - } - - return array; - } - - public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) - throws JsonParseException { - if (json.isJsonNull()) { - return new ArrayList(); - } - Gson jsonp = s_gBuilder.create(); - List pcs = new ArrayList(); - JsonArray array = json.getAsJsonArray(); - Iterator it = array.iterator(); - while (it.hasNext()) { - JsonElement element = it.next(); - pcs.add(jsonp.fromJson(element, PortConfig.class)); - } - return pcs; - } - - } public static class PortConfig { @Expose boolean add; @Expose String sourceIp; diff --git a/core/src/com/cloud/agent/api/SecStorageSetupCommand.java b/api/src/com/cloud/agent/api/SecStorageSetupCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/SecStorageSetupCommand.java rename to api/src/com/cloud/agent/api/SecStorageSetupCommand.java diff --git a/core/src/com/cloud/agent/api/SecurityIngressRuleAnswer.java b/api/src/com/cloud/agent/api/SecurityIngressRuleAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/SecurityIngressRuleAnswer.java rename to api/src/com/cloud/agent/api/SecurityIngressRuleAnswer.java diff --git a/core/src/com/cloud/agent/api/SecurityIngressRulesCmd.java b/api/src/com/cloud/agent/api/SecurityIngressRulesCmd.java similarity index 100% rename from core/src/com/cloud/agent/api/SecurityIngressRulesCmd.java rename to api/src/com/cloud/agent/api/SecurityIngressRulesCmd.java diff --git a/core/src/com/cloud/agent/api/SetupAnswer.java b/api/src/com/cloud/agent/api/SetupAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/SetupAnswer.java rename to api/src/com/cloud/agent/api/SetupAnswer.java diff --git a/core/src/com/cloud/agent/api/SetupCommand.java b/api/src/com/cloud/agent/api/SetupCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/SetupCommand.java rename to api/src/com/cloud/agent/api/SetupCommand.java diff --git a/core/src/com/cloud/agent/api/ShutdownCommand.java b/api/src/com/cloud/agent/api/ShutdownCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/ShutdownCommand.java rename to api/src/com/cloud/agent/api/ShutdownCommand.java diff --git a/core/src/com/cloud/agent/api/SnapshotCommand.java b/api/src/com/cloud/agent/api/SnapshotCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/SnapshotCommand.java rename to api/src/com/cloud/agent/api/SnapshotCommand.java diff --git a/core/src/com/cloud/agent/api/StartAnswer.java b/api/src/com/cloud/agent/api/StartAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/StartAnswer.java rename to api/src/com/cloud/agent/api/StartAnswer.java diff --git a/core/src/com/cloud/agent/api/StartupAnswer.java b/api/src/com/cloud/agent/api/StartupAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/StartupAnswer.java rename to api/src/com/cloud/agent/api/StartupAnswer.java diff --git a/core/src/com/cloud/agent/api/StartupCommand.java b/api/src/com/cloud/agent/api/StartupCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/StartupCommand.java rename to api/src/com/cloud/agent/api/StartupCommand.java diff --git a/core/src/com/cloud/agent/api/StartupExternalFirewallCommand.java b/api/src/com/cloud/agent/api/StartupExternalFirewallCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/StartupExternalFirewallCommand.java rename to api/src/com/cloud/agent/api/StartupExternalFirewallCommand.java diff --git a/core/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java b/api/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java rename to api/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java diff --git a/core/src/com/cloud/agent/api/StartupProxyCommand.java b/api/src/com/cloud/agent/api/StartupProxyCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/StartupProxyCommand.java rename to api/src/com/cloud/agent/api/StartupProxyCommand.java diff --git a/core/src/com/cloud/agent/api/StartupRoutingCommand.java b/api/src/com/cloud/agent/api/StartupRoutingCommand.java similarity index 98% rename from core/src/com/cloud/agent/api/StartupRoutingCommand.java rename to api/src/com/cloud/agent/api/StartupRoutingCommand.java index f55bad47a01..390a4787431 100755 --- a/core/src/com/cloud/agent/api/StartupRoutingCommand.java +++ b/api/src/com/cloud/agent/api/StartupRoutingCommand.java @@ -20,7 +20,7 @@ import java.util.HashMap; import java.util.Map; import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.network.NetworkEnums.RouterPrivateIpStrategy; +import com.cloud.network.Networks.RouterPrivateIpStrategy; import com.cloud.vm.VirtualMachine.State; public class StartupRoutingCommand extends StartupCommand { diff --git a/core/src/com/cloud/agent/api/StartupStorageCommand.java b/api/src/com/cloud/agent/api/StartupStorageCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/StartupStorageCommand.java rename to api/src/com/cloud/agent/api/StartupStorageCommand.java diff --git a/core/src/com/cloud/agent/api/StopAnswer.java b/api/src/com/cloud/agent/api/StopAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/StopAnswer.java rename to api/src/com/cloud/agent/api/StopAnswer.java diff --git a/core/src/com/cloud/agent/api/StopCommand.java b/api/src/com/cloud/agent/api/StopCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/StopCommand.java rename to api/src/com/cloud/agent/api/StopCommand.java diff --git a/core/src/com/cloud/agent/api/UpgradeAnswer.java b/api/src/com/cloud/agent/api/UpgradeAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/UpgradeAnswer.java rename to api/src/com/cloud/agent/api/UpgradeAnswer.java diff --git a/core/src/com/cloud/agent/api/UpgradeCommand.java b/api/src/com/cloud/agent/api/UpgradeCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/UpgradeCommand.java rename to api/src/com/cloud/agent/api/UpgradeCommand.java diff --git a/core/src/com/cloud/agent/api/ValidateSnapshotAnswer.java b/api/src/com/cloud/agent/api/ValidateSnapshotAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/ValidateSnapshotAnswer.java rename to api/src/com/cloud/agent/api/ValidateSnapshotAnswer.java diff --git a/core/src/com/cloud/agent/api/ValidateSnapshotCommand.java b/api/src/com/cloud/agent/api/ValidateSnapshotCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/ValidateSnapshotCommand.java rename to api/src/com/cloud/agent/api/ValidateSnapshotCommand.java diff --git a/core/src/com/cloud/agent/api/VmStatsEntry.java b/api/src/com/cloud/agent/api/VmStatsEntry.java similarity index 100% rename from core/src/com/cloud/agent/api/VmStatsEntry.java rename to api/src/com/cloud/agent/api/VmStatsEntry.java diff --git a/core/src/com/cloud/agent/api/check/CheckSshAnswer.java b/api/src/com/cloud/agent/api/check/CheckSshAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/check/CheckSshAnswer.java rename to api/src/com/cloud/agent/api/check/CheckSshAnswer.java diff --git a/core/src/com/cloud/agent/api/check/CheckSshCommand.java b/api/src/com/cloud/agent/api/check/CheckSshCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/check/CheckSshCommand.java rename to api/src/com/cloud/agent/api/check/CheckSshCommand.java diff --git a/core/src/com/cloud/agent/api/proxy/CheckConsoleProxyLoadCommand.java b/api/src/com/cloud/agent/api/proxy/CheckConsoleProxyLoadCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/proxy/CheckConsoleProxyLoadCommand.java rename to api/src/com/cloud/agent/api/proxy/CheckConsoleProxyLoadCommand.java diff --git a/core/src/com/cloud/agent/api/proxy/ConsoleProxyLoadAnswer.java b/api/src/com/cloud/agent/api/proxy/ConsoleProxyLoadAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/proxy/ConsoleProxyLoadAnswer.java rename to api/src/com/cloud/agent/api/proxy/ConsoleProxyLoadAnswer.java diff --git a/core/src/com/cloud/agent/api/proxy/ProxyCommand.java b/api/src/com/cloud/agent/api/proxy/ProxyCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/proxy/ProxyCommand.java rename to api/src/com/cloud/agent/api/proxy/ProxyCommand.java diff --git a/core/src/com/cloud/agent/api/proxy/UpdateCertificateCommand.java b/api/src/com/cloud/agent/api/proxy/UpdateCertificateCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/proxy/UpdateCertificateCommand.java rename to api/src/com/cloud/agent/api/proxy/UpdateCertificateCommand.java diff --git a/core/src/com/cloud/agent/api/proxy/WatchConsoleProxyLoadCommand.java b/api/src/com/cloud/agent/api/proxy/WatchConsoleProxyLoadCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/proxy/WatchConsoleProxyLoadCommand.java rename to api/src/com/cloud/agent/api/proxy/WatchConsoleProxyLoadCommand.java diff --git a/api/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java b/api/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java index e1078227cec..a672fdb4100 100644 --- a/api/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java +++ b/api/src/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java @@ -26,10 +26,14 @@ import com.cloud.agent.api.to.LoadBalancerTO; public class LoadBalancerConfigCommand extends NetworkElementCommand { LoadBalancerTO[] loadBalancers; + protected LoadBalancerConfigCommand() { + + } + public LoadBalancerConfigCommand( LoadBalancerTO[] loadBalancers) { this.loadBalancers = loadBalancers; } - + public LoadBalancerTO[] getLoadBalancers() { return loadBalancers; diff --git a/core/src/com/cloud/agent/api/routing/RemoteAccessVpnCfgCommand.java b/api/src/com/cloud/agent/api/routing/RemoteAccessVpnCfgCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/routing/RemoteAccessVpnCfgCommand.java rename to api/src/com/cloud/agent/api/routing/RemoteAccessVpnCfgCommand.java diff --git a/core/src/com/cloud/agent/api/routing/SavePasswordCommand.java b/api/src/com/cloud/agent/api/routing/SavePasswordCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/routing/SavePasswordCommand.java rename to api/src/com/cloud/agent/api/routing/SavePasswordCommand.java diff --git a/core/src/com/cloud/agent/api/routing/UserDataCommand.java b/api/src/com/cloud/agent/api/routing/UserDataCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/routing/UserDataCommand.java rename to api/src/com/cloud/agent/api/routing/UserDataCommand.java diff --git a/core/src/com/cloud/agent/api/routing/VpnUsersCfgCommand.java b/api/src/com/cloud/agent/api/routing/VpnUsersCfgCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/routing/VpnUsersCfgCommand.java rename to api/src/com/cloud/agent/api/routing/VpnUsersCfgCommand.java diff --git a/core/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java b/api/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java rename to api/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java diff --git a/core/src/com/cloud/agent/api/storage/AbstractUploadCommand.java b/api/src/com/cloud/agent/api/storage/AbstractUploadCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/AbstractUploadCommand.java rename to api/src/com/cloud/agent/api/storage/AbstractUploadCommand.java diff --git a/core/src/com/cloud/agent/api/storage/CopyVolumeAnswer.java b/api/src/com/cloud/agent/api/storage/CopyVolumeAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/CopyVolumeAnswer.java rename to api/src/com/cloud/agent/api/storage/CopyVolumeAnswer.java diff --git a/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java b/api/src/com/cloud/agent/api/storage/CopyVolumeCommand.java similarity index 87% rename from core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java rename to api/src/com/cloud/agent/api/storage/CopyVolumeCommand.java index 152bd1563e0..3e367230795 100644 --- a/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java +++ b/api/src/com/cloud/agent/api/storage/CopyVolumeCommand.java @@ -19,13 +19,14 @@ package com.cloud.agent.api.storage; import com.cloud.agent.api.Command; -import com.cloud.storage.StoragePoolVO; +import com.cloud.agent.api.to.StorageFilerTO; +import com.cloud.storage.StoragePool; public class CopyVolumeCommand extends Command { long volumeId; String volumePath; - StoragePoolVO pool; + StorageFilerTO pool; String secondaryStorageURL; boolean toSecondaryStorage; String vmName; @@ -33,10 +34,10 @@ public class CopyVolumeCommand extends Command { public CopyVolumeCommand() { } - public CopyVolumeCommand(long volumeId, String volumePath, StoragePoolVO pool, String secondaryStorageURL, boolean toSecondaryStorage) { + public CopyVolumeCommand(long volumeId, String volumePath, StoragePool pool, String secondaryStorageURL, boolean toSecondaryStorage) { this.volumeId = volumeId; this.volumePath = volumePath; - this.pool = pool; + this.pool = new StorageFilerTO(pool); this.secondaryStorageURL = secondaryStorageURL; this.toSecondaryStorage = toSecondaryStorage; } @@ -54,7 +55,7 @@ public class CopyVolumeCommand extends Command { return volumeId; } - public StoragePoolVO getPool() { + public StorageFilerTO getPool() { return pool; } diff --git a/core/src/com/cloud/agent/api/storage/CreateAnswer.java b/api/src/com/cloud/agent/api/storage/CreateAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/CreateAnswer.java rename to api/src/com/cloud/agent/api/storage/CreateAnswer.java diff --git a/core/src/com/cloud/agent/api/storage/CreateEntityDownloadURLAnswer.java b/api/src/com/cloud/agent/api/storage/CreateEntityDownloadURLAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/CreateEntityDownloadURLAnswer.java rename to api/src/com/cloud/agent/api/storage/CreateEntityDownloadURLAnswer.java diff --git a/core/src/com/cloud/agent/api/storage/CreateEntityDownloadURLCommand.java b/api/src/com/cloud/agent/api/storage/CreateEntityDownloadURLCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/CreateEntityDownloadURLCommand.java rename to api/src/com/cloud/agent/api/storage/CreateEntityDownloadURLCommand.java diff --git a/core/src/com/cloud/agent/api/storage/CreatePrivateTemplateAnswer.java b/api/src/com/cloud/agent/api/storage/CreatePrivateTemplateAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/CreatePrivateTemplateAnswer.java rename to api/src/com/cloud/agent/api/storage/CreatePrivateTemplateAnswer.java diff --git a/core/src/com/cloud/agent/api/storage/CreatePrivateTemplateCommand.java b/api/src/com/cloud/agent/api/storage/CreatePrivateTemplateCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/CreatePrivateTemplateCommand.java rename to api/src/com/cloud/agent/api/storage/CreatePrivateTemplateCommand.java diff --git a/core/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLAnswer.java b/api/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLAnswer.java rename to api/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLAnswer.java diff --git a/core/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLCommand.java b/api/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLCommand.java rename to api/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLCommand.java diff --git a/core/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java b/api/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java similarity index 96% rename from core/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java rename to api/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java index f65b07d755f..5d09d3dd9d8 100644 --- a/core/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java +++ b/api/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java @@ -19,7 +19,6 @@ package com.cloud.agent.api.storage; import com.cloud.agent.api.Command; -import com.cloud.storage.StoragePoolVO; public class DeleteTemplateCommand extends Command { diff --git a/core/src/com/cloud/agent/api/storage/DestroyAnswer.java b/api/src/com/cloud/agent/api/storage/DestroyAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/DestroyAnswer.java rename to api/src/com/cloud/agent/api/storage/DestroyAnswer.java diff --git a/core/src/com/cloud/agent/api/storage/DestroyCommand.java b/api/src/com/cloud/agent/api/storage/DestroyCommand.java similarity index 85% rename from core/src/com/cloud/agent/api/storage/DestroyCommand.java rename to api/src/com/cloud/agent/api/storage/DestroyCommand.java index 6a624e983c2..c5e3de08b85 100755 --- a/core/src/com/cloud/agent/api/storage/DestroyCommand.java +++ b/api/src/com/cloud/agent/api/storage/DestroyCommand.java @@ -19,9 +19,9 @@ package com.cloud.agent.api.storage; import com.cloud.agent.api.to.VolumeTO; import com.cloud.storage.Storage; -import com.cloud.storage.StoragePoolVO; -import com.cloud.storage.VMTemplateStoragePoolVO; -import com.cloud.storage.VolumeVO; +import com.cloud.storage.StoragePool; +import com.cloud.storage.VMTemplateStorageResourceAssoc; +import com.cloud.storage.Volume; public class DestroyCommand extends StorageCommand { // in VMware, things are designed around VM instead of volume, we need it the volume VM context if the volume is attached @@ -31,12 +31,12 @@ public class DestroyCommand extends StorageCommand { protected DestroyCommand() { } - public DestroyCommand(StoragePoolVO pool, VolumeVO volume, String vmName) { + public DestroyCommand(StoragePool pool, Volume volume, String vmName) { this.volume = new VolumeTO(volume, pool); this.vmName = vmName; } - public DestroyCommand(StoragePoolVO pool, VMTemplateStoragePoolVO templatePoolRef) { + public DestroyCommand(StoragePool pool, VMTemplateStorageResourceAssoc templatePoolRef) { volume = new VolumeTO(templatePoolRef.getId(), null, Storage.StorageResourceType.STORAGE_POOL, pool.getPoolType(), pool.getUuid(), null, pool.getPath(), templatePoolRef.getInstallPath(), templatePoolRef.getTemplateSize(), null); diff --git a/core/src/com/cloud/agent/api/storage/DownloadAnswer.java b/api/src/com/cloud/agent/api/storage/DownloadAnswer.java similarity index 91% rename from core/src/com/cloud/agent/api/storage/DownloadAnswer.java rename to api/src/com/cloud/agent/api/storage/DownloadAnswer.java index 6fc8599374d..5b361944f39 100644 --- a/core/src/com/cloud/agent/api/storage/DownloadAnswer.java +++ b/api/src/com/cloud/agent/api/storage/DownloadAnswer.java @@ -21,14 +21,14 @@ import java.io.File; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; -import com.cloud.storage.VMTemplateHostVO; +import com.cloud.storage.VMTemplateStorageResourceAssoc; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; public class DownloadAnswer extends Answer { private String jobId; private int downloadPct; private String errorString; - private VMTemplateHostVO.Status downloadStatus; + private VMTemplateStorageResourceAssoc.Status downloadStatus; private String downloadPath; private String installPath; private long templateSize = 0L; @@ -45,7 +45,7 @@ public class DownloadAnswer extends Answer { return downloadStatus.toString(); } - public VMTemplateHostVO.Status getDownloadStatus() { + public VMTemplateStorageResourceAssoc.Status getDownloadStatus() { return downloadStatus; } @@ -94,8 +94,9 @@ public class DownloadAnswer extends Answer { } private static String fixPath(String path){ - if (path == null) - return path; + if (path == null) { + return path; + } if (path.startsWith(File.separator)) { path=path.substring(File.separator.length()); } @@ -105,7 +106,7 @@ public class DownloadAnswer extends Answer { return path; } - public void setDownloadStatus(VMTemplateHostVO.Status downloadStatus) { + public void setDownloadStatus(VMTemplateStorageResourceAssoc.Status downloadStatus) { this.downloadStatus = downloadStatus; } diff --git a/core/src/com/cloud/agent/api/storage/DownloadCommand.java b/api/src/com/cloud/agent/api/storage/DownloadCommand.java similarity index 94% rename from core/src/com/cloud/agent/api/storage/DownloadCommand.java rename to api/src/com/cloud/agent/api/storage/DownloadCommand.java index ea5c37806f0..700eb0e40a4 100644 --- a/core/src/com/cloud/agent/api/storage/DownloadCommand.java +++ b/api/src/com/cloud/agent/api/storage/DownloadCommand.java @@ -17,8 +17,8 @@ */ package com.cloud.agent.api.storage; -import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Storage.ImageFormat; +import com.cloud.template.VirtualMachineTemplate; /** @@ -64,9 +64,9 @@ public class DownloadCommand extends AbstractDownloadCommand { this.maxDownloadSizeInBytes = that.getMaxDownloadSizeInBytes(); } - public DownloadCommand(VMTemplateVO template, Long maxDownloadSizeInBytes) { + public DownloadCommand(VirtualMachineTemplate template, Long maxDownloadSizeInBytes) { super(template.getUniqueName(), template.getUrl(), template.getFormat(), template.getAccountId()); - this.hvm = template.requiresHvm(); + this.hvm = template.isRequiresHvm(); this.checksum = template.getChecksum(); this.id = template.getId(); this.description = template.getDisplayText(); diff --git a/core/src/com/cloud/agent/api/storage/DownloadProgressCommand.java b/api/src/com/cloud/agent/api/storage/DownloadProgressCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/DownloadProgressCommand.java rename to api/src/com/cloud/agent/api/storage/DownloadProgressCommand.java diff --git a/core/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityAnswer.java b/api/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityAnswer.java rename to api/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityAnswer.java diff --git a/core/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityCommand.java b/api/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityCommand.java rename to api/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityCommand.java diff --git a/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadAnswer.java b/api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadAnswer.java rename to api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadAnswer.java diff --git a/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java b/api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java rename to api/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java diff --git a/core/src/com/cloud/agent/api/storage/StorageCommand.java b/api/src/com/cloud/agent/api/storage/StorageCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/StorageCommand.java rename to api/src/com/cloud/agent/api/storage/StorageCommand.java diff --git a/core/src/com/cloud/agent/api/storage/UpgradeDiskAnswer.java b/api/src/com/cloud/agent/api/storage/UpgradeDiskAnswer.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/UpgradeDiskAnswer.java rename to api/src/com/cloud/agent/api/storage/UpgradeDiskAnswer.java diff --git a/core/src/com/cloud/agent/api/storage/UpgradeDiskCommand.java b/api/src/com/cloud/agent/api/storage/UpgradeDiskCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/UpgradeDiskCommand.java rename to api/src/com/cloud/agent/api/storage/UpgradeDiskCommand.java diff --git a/core/src/com/cloud/agent/api/storage/UploadAnswer.java b/api/src/com/cloud/agent/api/storage/UploadAnswer.java similarity index 83% rename from core/src/com/cloud/agent/api/storage/UploadAnswer.java rename to api/src/com/cloud/agent/api/storage/UploadAnswer.java index b878bf7ca6b..d122218fcda 100755 --- a/core/src/com/cloud/agent/api/storage/UploadAnswer.java +++ b/api/src/com/cloud/agent/api/storage/UploadAnswer.java @@ -4,7 +4,7 @@ import java.io.File; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; -import com.cloud.storage.UploadVO; +import com.cloud.storage.Upload; public class UploadAnswer extends Answer { @@ -12,7 +12,7 @@ public class UploadAnswer extends Answer { private String jobId; private int uploadPct; private String errorString; - private UploadVO.Status uploadStatus; + private Upload.Status uploadStatus; private String uploadPath; private String installPath; public Long templateSize = 0L; @@ -28,7 +28,7 @@ public class UploadAnswer extends Answer { return uploadStatus.toString(); } - public UploadVO.Status getUploadStatus() { + public Upload.Status getUploadStatus() { return uploadStatus; } @@ -50,7 +50,7 @@ public class UploadAnswer extends Answer { } public UploadAnswer(String jobId, int uploadPct, String errorString, - UploadVO.Status uploadStatus, String fileSystemPath, String installPath, long templateSize) { + Upload.Status uploadStatus, String fileSystemPath, String installPath, long templateSize) { super(); this.jobId = jobId; this.uploadPct = uploadPct; @@ -62,7 +62,7 @@ public class UploadAnswer extends Answer { } public UploadAnswer(String jobId, int uploadPct, Command command, - UploadVO.Status uploadStatus, String fileSystemPath, String installPath) { + Upload.Status uploadStatus, String fileSystemPath, String installPath) { super(command); this.jobId = jobId; this.uploadPct = uploadPct; @@ -72,8 +72,9 @@ public class UploadAnswer extends Answer { } private static String fixPath(String path){ - if (path == null) - return path; + if (path == null) { + return path; + } if (path.startsWith(File.separator)) { path=path.substring(File.separator.length()); } @@ -83,7 +84,7 @@ public class UploadAnswer extends Answer { return path; } - public void setUploadStatus(UploadVO.Status uploadStatus) { + public void setUploadStatus(Upload.Status uploadStatus) { this.uploadStatus = uploadStatus; } diff --git a/core/src/com/cloud/agent/api/storage/UploadCommand.java b/api/src/com/cloud/agent/api/storage/UploadCommand.java similarity index 78% rename from core/src/com/cloud/agent/api/storage/UploadCommand.java rename to api/src/com/cloud/agent/api/storage/UploadCommand.java index a3f0695694b..6b50bba308b 100644 --- a/core/src/com/cloud/agent/api/storage/UploadCommand.java +++ b/api/src/com/cloud/agent/api/storage/UploadCommand.java @@ -1,15 +1,14 @@ package com.cloud.agent.api.storage; -import com.cloud.storage.VMTemplateHostVO; -import com.cloud.storage.Upload.Type; -import com.cloud.storage.VMTemplateVO; -import com.cloud.agent.api.storage.AbstractUploadCommand; import com.cloud.agent.api.storage.DownloadCommand.PasswordAuth; +import com.cloud.agent.api.to.TemplateTO; +import com.cloud.storage.Upload.Type; +import com.cloud.template.VirtualMachineTemplate; public class UploadCommand extends AbstractUploadCommand { - private VMTemplateVO template; + private TemplateTO template; private String url; private String installPath; private boolean hvm; @@ -20,14 +19,14 @@ public class UploadCommand extends AbstractUploadCommand { private long id; private Type type; - public UploadCommand(VMTemplateVO template, String url, VMTemplateHostVO vmTemplateHost) { + public UploadCommand(VirtualMachineTemplate template, String url, String installPath, long sizeInBytes) { - this.template = template; + this.template = new TemplateTO(template); this.url = url; - this.installPath = vmTemplateHost.getInstallPath(); + this.installPath = installPath; this.checksum = template.getChecksum(); this.id = template.getId(); - this.templateSizeInBytes = vmTemplateHost.getSize(); + this.templateSizeInBytes = sizeInBytes; } @@ -56,19 +55,21 @@ public class UploadCommand extends AbstractUploadCommand { } - public VMTemplateVO getTemplate() { + public TemplateTO getTemplate() { return template; } - public void setTemplate(VMTemplateVO template) { + public void setTemplate(TemplateTO template) { this.template = template; } - public String getUrl() { + @Override + public String getUrl() { return url; } - public void setUrl(String url) { + @Override + public void setUrl(String url) { this.url = url; } diff --git a/core/src/com/cloud/agent/api/storage/UploadProgressCommand.java b/api/src/com/cloud/agent/api/storage/UploadProgressCommand.java similarity index 100% rename from core/src/com/cloud/agent/api/storage/UploadProgressCommand.java rename to api/src/com/cloud/agent/api/storage/UploadProgressCommand.java diff --git a/core/src/com/cloud/agent/api/to/HostTO.java b/api/src/com/cloud/agent/api/to/HostTO.java similarity index 97% rename from core/src/com/cloud/agent/api/to/HostTO.java rename to api/src/com/cloud/agent/api/to/HostTO.java index 91cfa65437e..bb80215666d 100644 --- a/core/src/com/cloud/agent/api/to/HostTO.java +++ b/api/src/com/cloud/agent/api/to/HostTO.java @@ -17,7 +17,7 @@ */ package com.cloud.agent.api.to; -import com.cloud.host.HostVO; +import com.cloud.host.Host; public class HostTO { private String guid; @@ -29,7 +29,7 @@ public class HostTO { protected HostTO() { } - public HostTO(HostVO vo) { + public HostTO(Host vo) { guid = vo.getGuid(); privateNetwork = new NetworkTO(vo.getPrivateIpAddress(), vo.getPrivateNetmask(), vo.getPrivateMacAddress()); if (vo.getPublicIpAddress() != null) { diff --git a/api/src/com/cloud/agent/api/to/IpAddressTO.java b/api/src/com/cloud/agent/api/to/IpAddressTO.java index d85998e4941..799a1658f69 100644 --- a/api/src/com/cloud/agent/api/to/IpAddressTO.java +++ b/api/src/com/cloud/agent/api/to/IpAddressTO.java @@ -13,9 +13,10 @@ public class IpAddressTO { private String vlanNetmask; private String vifMacAddress; private String guestIp; + private Integer networkRate; - public IpAddressTO(String ipAddress, boolean add, boolean firstIP, boolean sourceNat, String vlanId, String vlanGateway, String vlanNetmask, String vifMacAddress, String guestIp) { + public IpAddressTO(String ipAddress, boolean add, boolean firstIP, boolean sourceNat, String vlanId, String vlanGateway, String vlanNetmask, String vifMacAddress, String guestIp, Integer networkRate) { this.publicIp = ipAddress; this.add = add; this.firstIP = firstIP; @@ -25,6 +26,7 @@ public class IpAddressTO { this.vlanNetmask = vlanNetmask; this.vifMacAddress = vifMacAddress; this.guestIp = guestIp; + this.networkRate = networkRate; } protected IpAddressTO() { @@ -73,5 +75,9 @@ public class IpAddressTO { public String getVifMacAddress() { return vifMacAddress; } + + public Integer getNetworkRate() { + return networkRate; + } } diff --git a/api/src/com/cloud/agent/api/to/NicTO.java b/api/src/com/cloud/agent/api/to/NicTO.java index 95e0de0447e..3b73ca1f0b0 100644 --- a/api/src/com/cloud/agent/api/to/NicTO.java +++ b/api/src/com/cloud/agent/api/to/NicTO.java @@ -5,7 +5,7 @@ package com.cloud.agent.api.to; public class NicTO extends NetworkTO { int deviceId; - Integer networkRateMbps; + int networkRateMbps; Integer networkRateMulticastMbps; boolean defaultNic; diff --git a/core/src/com/cloud/agent/api/to/TemplateTO.java b/api/src/com/cloud/agent/api/to/TemplateTO.java similarity index 89% rename from core/src/com/cloud/agent/api/to/TemplateTO.java rename to api/src/com/cloud/agent/api/to/TemplateTO.java index 02372598170..126a7b911e1 100644 --- a/core/src/com/cloud/agent/api/to/TemplateTO.java +++ b/api/src/com/cloud/agent/api/to/TemplateTO.java @@ -17,9 +17,8 @@ */ package com.cloud.agent.api.to; -import com.cloud.storage.VMTemplateStoragePoolVO; -import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Storage.ImageFormat; +import com.cloud.template.VirtualMachineTemplate; public class TemplateTO { private long id; @@ -29,7 +28,7 @@ public class TemplateTO { protected TemplateTO() { } - public TemplateTO(VMTemplateVO template, VMTemplateStoragePoolVO storedAt) { + public TemplateTO(VirtualMachineTemplate template) { this.id = template.getId(); this.uniqueName = template.getUniqueName(); this.format = template.getFormat(); diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 7b9f96a1bcf..d2c3fcc80ff 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -129,6 +129,7 @@ public class ApiConstants { public static final String SECRET_KEY = "secretkey"; public static final String SECURITY_GROUP_LIST = "securitygrouplist"; public static final String SECURITY_GROUP_NAME = "securitygroupname"; + public static final String SECURITY_GROUP_ID = "securitygroupid"; public static final String SENT = "sent"; public static final String SENT_BYTES = "sentbytes"; public static final String SERVICE_OFFERING_ID = "serviceofferingid"; @@ -178,5 +179,6 @@ public class ApiConstants { public static final String IS_DEFAULT = "isdefault"; public static final String IS_SYSTEM = "issystem"; public static final String AVAILABILITY = "availability"; + public static final String NETWORKRATE = "networkrate"; } diff --git a/api/src/com/cloud/api/commands/AuthorizeSecurityGroupIngressCmd.java b/api/src/com/cloud/api/commands/AuthorizeSecurityGroupIngressCmd.java index 1dc774b402b..17ff761afb9 100644 --- a/api/src/com/cloud/api/commands/AuthorizeSecurityGroupIngressCmd.java +++ b/api/src/com/cloud/api/commands/AuthorizeSecurityGroupIngressCmd.java @@ -32,6 +32,7 @@ import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; +import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.response.IngressRuleResponse; import com.cloud.api.response.SecurityGroupResponse; import com.cloud.event.EventTypes; @@ -65,8 +66,8 @@ public class AuthorizeSecurityGroupIngressCmd extends BaseAsyncCmd { @Parameter(name=ApiConstants.ICMP_CODE, type=CommandType.INTEGER, description="error code for this icmp message") private Integer icmpCode; - @Parameter(name=ApiConstants.SECURITY_GROUP_NAME, type=CommandType.STRING, required=true, description="the security group name") - private String securityGroupName; + @Parameter(name=ApiConstants.SECURITY_GROUP_ID, type=CommandType.LONG, required=true, description="The ID of the security group") + private Long securityGroupId; @Parameter(name=ApiConstants.CIDR_LIST, type=CommandType.LIST, collectionType=CommandType.STRING, description="the cidr list associated") private List cidrList; @@ -109,8 +110,8 @@ public class AuthorizeSecurityGroupIngressCmd extends BaseAsyncCmd { return icmpType; } - public String getSecurityGroupName() { - return securityGroupName; + public Long getSecurityGroupId() { + return securityGroupId; } public String getProtocol() { @@ -192,7 +193,7 @@ public class AuthorizeSecurityGroupIngressCmd extends BaseAsyncCmd { sb.append(""); } - return "authorizing ingress to group: " + getSecurityGroupName() + " to " + sb.toString(); + return "authorizing ingress to group: " + getSecurityGroupId() + " to " + sb.toString(); } @Override diff --git a/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java b/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java index 2c6822254f5..9e95f07bb1f 100644 --- a/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java +++ b/api/src/com/cloud/api/commands/CreateNetworkOfferingCmd.java @@ -58,6 +58,9 @@ public class CreateNetworkOfferingCmd extends BaseCmd { @Parameter(name=ApiConstants.AVAILABILITY, type=CommandType.STRING, description="the availability of network offering. Default value is Required") private String availability; + + @Parameter(name=ApiConstants.NETWORKRATE, type=CommandType.INTEGER, description="data transfer rate in megabits per second allowed.") + private Integer networkRate; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -91,6 +94,10 @@ public class CreateNetworkOfferingCmd extends BaseCmd { //Verify availability return availability == null ? Availability.Required.toString() : availability; } + + public Integer getNetworkRate() { + return networkRate; + } ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// diff --git a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java index 51fe94a76c0..8501b7c2147 100644 --- a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java @@ -31,6 +31,7 @@ import com.cloud.event.EventTypes; import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.rules.PortForwardingRule; +import com.cloud.user.Account; import com.cloud.user.UserContext; import com.cloud.utils.net.Ip; @@ -163,7 +164,13 @@ public class CreatePortForwardingRuleCmd extends BaseAsyncCreateCmd implements @Override public long getEntityOwnerId() { - return _entityMgr.findById(PortForwardingRule.class, getEntityId()).getAccountId(); + Account account = UserContext.current().getCaller(); + + if (account != null) { + return account.getId(); + } + + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked } @Override diff --git a/api/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java b/api/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java index d746eace132..66300fa072b 100644 --- a/api/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java +++ b/api/src/com/cloud/api/commands/CreateVlanIpRangeCmd.java @@ -29,6 +29,7 @@ import com.cloud.api.response.VlanIpRangeResponse; import com.cloud.dc.Vlan; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.ResourceUnavailableException; @Implementation(description="Creates a VLAN IP range.", responseObject=VlanIpRangeResponse.class) public class CreateVlanIpRangeCmd extends BaseCmd { @@ -132,7 +133,7 @@ public class CreateVlanIpRangeCmd extends BaseCmd { } @Override - public void execute(){ + public void execute() throws ResourceUnavailableException{ try { Vlan result = _configService.createVlanAndPublicIpRange(this); if (result != null) { @@ -148,6 +149,6 @@ public class CreateVlanIpRangeCmd extends BaseCmd { } catch (InsufficientCapacityException ex) { s_logger.info(ex); throw new ServerApiException(BaseCmd.INSUFFICIENT_CAPACITY_ERROR, ex.getMessage()); - } + } } } diff --git a/api/src/com/cloud/api/commands/DeleteSecurityGroupCmd.java b/api/src/com/cloud/api/commands/DeleteSecurityGroupCmd.java index 46ca04a800d..515cabd1b11 100644 --- a/api/src/com/cloud/api/commands/DeleteSecurityGroupCmd.java +++ b/api/src/com/cloud/api/commands/DeleteSecurityGroupCmd.java @@ -7,6 +7,7 @@ import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; +import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.response.SuccessResponse; import com.cloud.exception.ResourceInUseException; @@ -25,8 +26,8 @@ public class DeleteSecurityGroupCmd extends BaseCmd { @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.LONG, description="the domain ID of account owning the security group") private Long domainId; - @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, required=true, description="the security group name") - private String securityGroupName; + @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="The ID of the security group") + private Long id; ///////////////////////////////////////////////////// @@ -41,11 +42,12 @@ public class DeleteSecurityGroupCmd extends BaseCmd { return domainId; } - public String getSecurityGroupName() { - return securityGroupName; + public Long getId() { + return id; } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/com/cloud/api/commands/DeployVMCmd.java b/api/src/com/cloud/api/commands/DeployVMCmd.java index c0a7fc2abd3..6f4343f365f 100644 --- a/api/src/com/cloud/api/commands/DeployVMCmd.java +++ b/api/src/com/cloud/api/commands/DeployVMCmd.java @@ -215,7 +215,7 @@ public class DeployVMCmd extends BaseAsyncCreateCmd { @Override public String getEventType() { - return EventTypes.EVENT_VM_START; + return EventTypes.EVENT_VM_CREATE; } @Override diff --git a/api/src/com/cloud/api/commands/ListAccountsCmd.java b/api/src/com/cloud/api/commands/ListAccountsCmd.java index 004f62a4952..e8a7ac0b3ec 100644 --- a/api/src/com/cloud/api/commands/ListAccountsCmd.java +++ b/api/src/com/cloud/api/commands/ListAccountsCmd.java @@ -26,6 +26,7 @@ import com.cloud.api.ApiConstants; import com.cloud.api.BaseListCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; +import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.response.AccountResponse; import com.cloud.api.response.ListResponse; import com.cloud.user.Account; @@ -57,7 +58,9 @@ public class ListAccountsCmd extends BaseListCmd { @Parameter(name=ApiConstants.STATE, type=CommandType.STRING, description="list accounts by state. Valid states are enabled, disabled, and locked.") private String state; - + @Parameter(name=ApiConstants.IS_RECURSIVE, type=CommandType.BOOLEAN, description="defaults to false, but if true, lists all accounts from the parent specified by the domain id till leaves.") + private Boolean recursive; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -85,6 +88,10 @@ public class ListAccountsCmd extends BaseListCmd { public String getState() { return state; } + + public Boolean isRecursive() { + return recursive; + } ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// diff --git a/api/src/com/cloud/api/commands/ListHypervisorsCmd.java b/api/src/com/cloud/api/commands/ListHypervisorsCmd.java index 60fc69bfae0..e017fc2eb66 100644 --- a/api/src/com/cloud/api/commands/ListHypervisorsCmd.java +++ b/api/src/com/cloud/api/commands/ListHypervisorsCmd.java @@ -21,8 +21,10 @@ import java.util.ArrayList; import org.apache.log4j.Logger; +import com.cloud.api.ApiConstants; import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; +import com.cloud.api.Parameter; import com.cloud.api.response.HypervisorResponse; import com.cloud.api.response.ListResponse; @@ -36,18 +38,39 @@ public class ListHypervisorsCmd extends BaseCmd { return s_name; } + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, description="the zone id for listing hypervisors.") + private Long zoneId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getZoneId() { + return this.zoneId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + @Override public void execute(){ String[] result = _mgr.getHypervisors(this); ListResponse response = new ListResponse(); ArrayList responses = new ArrayList(); - for (String hypervisor : result) { - HypervisorResponse hypervisorResponse = new HypervisorResponse(); - hypervisorResponse.setName(hypervisor); - hypervisorResponse.setObjectName("hypervisor"); - responses.add(hypervisorResponse); + if(result != null) { + for (String hypervisor : result) { + HypervisorResponse hypervisorResponse = new HypervisorResponse(); + hypervisorResponse.setName(hypervisor); + hypervisorResponse.setObjectName("hypervisor"); + responses.add(hypervisorResponse); + } } - response.setResponses(responses); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java b/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java index 3d0ce6d3c81..bb012859a13 100644 --- a/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java +++ b/api/src/com/cloud/api/commands/ListPortForwardingRulesCmd.java @@ -42,6 +42,12 @@ public class ListPortForwardingRulesCmd extends BaseListCmd { @Parameter(name=ApiConstants.IP_ADDRESS, type=CommandType.STRING, description="the IP address of the port forwarding services") private String ipAddress; + + @Parameter(name=ApiConstants.ACCOUNT, type=CommandType.STRING, description="account. Must be used with the domainId parameter.") + private String accountName; + + @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.LONG, description="the domain ID. If used with the account parameter, lists port forwarding rules for the specified account in this domain.") + private Long domainId; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -50,6 +56,14 @@ public class ListPortForwardingRulesCmd extends BaseListCmd { public String getIpAddress() { return ipAddress; } + + public String getAccountName() { + return accountName; + } + + public Long getDomainId() { + return domainId; + } ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// diff --git a/api/src/com/cloud/api/commands/ListSnapshotsCmd.java b/api/src/com/cloud/api/commands/ListSnapshotsCmd.java index e01f0e7a71b..0e8b4cd048a 100644 --- a/api/src/com/cloud/api/commands/ListSnapshotsCmd.java +++ b/api/src/com/cloud/api/commands/ListSnapshotsCmd.java @@ -26,6 +26,7 @@ import com.cloud.api.ApiConstants; import com.cloud.api.BaseListCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; +import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.response.ListResponse; import com.cloud.api.response.SnapshotResponse; import com.cloud.async.AsyncJob; @@ -62,6 +63,8 @@ public class ListSnapshotsCmd extends BaseListCmd { @Parameter(name=ApiConstants.VOLUME_ID, type=CommandType.LONG, description="the ID of the disk volume") private Long volumeId; + @Parameter(name=ApiConstants.IS_RECURSIVE, type=CommandType.BOOLEAN, description="defaults to false, but if true, lists all snapshots from the parent specified by the domain id till leaves.") + private Boolean recursive; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -94,6 +97,10 @@ public class ListSnapshotsCmd extends BaseListCmd { return volumeId; } + public Boolean isRecursive() { + return recursive; + + } ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/com/cloud/api/commands/ListVMsCmd.java b/api/src/com/cloud/api/commands/ListVMsCmd.java index db5f7238e78..d90cf80128c 100644 --- a/api/src/com/cloud/api/commands/ListVMsCmd.java +++ b/api/src/com/cloud/api/commands/ListVMsCmd.java @@ -47,6 +47,9 @@ public class ListVMsCmd extends BaseListCmd { @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.LONG, description="the domain ID. If used with the account parameter, lists virtual machines for the specified account in this domain.") private Long domainId; + @Parameter(name=ApiConstants.IS_RECURSIVE, type=CommandType.BOOLEAN, description="defaults to false, but if true, lists all vms from the parent specified by the domain id till leaves.") + private Boolean recursive; + @Parameter(name=ApiConstants.GROUP_ID, type=CommandType.LONG, description="the group ID") private Long groupId; @@ -126,6 +129,9 @@ public class ListVMsCmd extends BaseListCmd { return networkId; } + public Boolean isRecursive() { + return recursive; + } ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/com/cloud/api/commands/ListVolumesCmd.java b/api/src/com/cloud/api/commands/ListVolumesCmd.java index 368aeade8fe..ee4282e2d2f 100755 --- a/api/src/com/cloud/api/commands/ListVolumesCmd.java +++ b/api/src/com/cloud/api/commands/ListVolumesCmd.java @@ -26,6 +26,7 @@ import com.cloud.api.ApiConstants; import com.cloud.api.BaseListCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; +import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.response.ListResponse; import com.cloud.api.response.VolumeResponse; import com.cloud.async.AsyncJob; @@ -68,6 +69,9 @@ public class ListVolumesCmd extends BaseListCmd { @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, description="the ID of the availability zone") private Long zoneId; + @Parameter(name=ApiConstants.IS_RECURSIVE, type=CommandType.BOOLEAN, description="defaults to false, but if true, lists all volumes from the parent specified by the domain id till leaves.") + private Boolean recursive; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -108,6 +112,10 @@ public class ListVolumesCmd extends BaseListCmd { return zoneId; } + public Boolean isRecursive() { + return recursive; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/com/cloud/api/commands/RebootVMCmd.java b/api/src/com/cloud/api/commands/RebootVMCmd.java index f63833f7bec..d88386ceb29 100644 --- a/api/src/com/cloud/api/commands/RebootVMCmd.java +++ b/api/src/com/cloud/api/commands/RebootVMCmd.java @@ -28,6 +28,8 @@ import com.cloud.api.ServerApiException; import com.cloud.api.response.UserVmResponse; import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.user.Account; import com.cloud.uservm.UserVm; @@ -89,7 +91,7 @@ public class RebootVMCmd extends BaseAsyncCmd { } @Override - public void execute(){ + public void execute() throws ResourceUnavailableException, InsufficientCapacityException{ UserVm result = _userVmService.rebootVirtualMachine(this); if (result !=null){ UserVmResponse response = _responseGenerator.createUserVmResponse(result); diff --git a/api/src/com/cloud/api/commands/ResetVMPasswordCmd.java b/api/src/com/cloud/api/commands/ResetVMPasswordCmd.java index 234156fd7ec..4b62ab30de0 100644 --- a/api/src/com/cloud/api/commands/ResetVMPasswordCmd.java +++ b/api/src/com/cloud/api/commands/ResetVMPasswordCmd.java @@ -30,6 +30,8 @@ import com.cloud.api.ServerApiException; import com.cloud.api.response.UserVmResponse; import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.user.Account; import com.cloud.uservm.UserVm; @@ -107,7 +109,7 @@ public class ResetVMPasswordCmd extends BaseAsyncCmd { Random _rand = new Random(System.currentTimeMillis()); @Override - public void execute(){ + public void execute() throws ResourceUnavailableException, InsufficientCapacityException{ password = Long.toHexString(_rand.nextLong()); UserVm result = _userVmService.resetVMPassword(this, password); if (result != null){ diff --git a/api/src/com/cloud/api/commands/RestartNetworkCmd.java b/api/src/com/cloud/api/commands/RestartNetworkCmd.java index b03c5d73ca9..32a91b75afd 100644 --- a/api/src/com/cloud/api/commands/RestartNetworkCmd.java +++ b/api/src/com/cloud/api/commands/RestartNetworkCmd.java @@ -44,20 +44,14 @@ public class RestartNetworkCmd extends BaseAsyncCmd { //////////////// API parameters ///////////////////// ///////////////////////////////////////////////////// - @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, required=true, description="the ID of the availability zone you want to acquire an public IP address from") - private Long zoneId; - @Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.LONG, description="The network this ip address should be associated to.") - private Long networkId; + @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="The network this ip address should be associated to.") + private Long id; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// - - public long getZoneId() { - return zoneId; - } public String getEventDescription() { return "Restarting network: " + getNetworkId(); @@ -68,13 +62,13 @@ public class RestartNetworkCmd extends BaseAsyncCmd { } public long getEntityOwnerId() { - return _networkService.getNetwork(networkId).getAccountId(); + return _networkService.getNetwork(id).getAccountId(); } public Long getNetworkId() { - Network network = _networkService.getNetwork(networkId); + Network network = _networkService.getNetwork(id); if (network == null) { - throw new InvalidParameterValueException("Unable to find network by id " + networkId); + throw new InvalidParameterValueException("Unable to find network by id " + id); } else { return network.getId(); } diff --git a/api/src/com/cloud/api/commands/RevokeSecurityGroupIngressCmd.java b/api/src/com/cloud/api/commands/RevokeSecurityGroupIngressCmd.java index 916a72153f1..75032d2ac12 100644 --- a/api/src/com/cloud/api/commands/RevokeSecurityGroupIngressCmd.java +++ b/api/src/com/cloud/api/commands/RevokeSecurityGroupIngressCmd.java @@ -13,6 +13,7 @@ import com.cloud.api.BaseCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; import com.cloud.api.ServerApiException; +import com.cloud.api.BaseCmd.CommandType; import com.cloud.api.response.SuccessResponse; import com.cloud.event.EventTypes; import com.cloud.user.Account; @@ -47,8 +48,8 @@ public class RevokeSecurityGroupIngressCmd extends BaseAsyncCmd { @Parameter(name=ApiConstants.ICMP_TYPE, type=CommandType.INTEGER, description="type for this icmp message") private Integer icmpType; - @Parameter(name=ApiConstants.SECURITY_GROUP_NAME, type=CommandType.STRING, required=true, description="name of the security group") - private String securityGroupName; + @Parameter(name=ApiConstants.SECURITY_GROUP_ID, type=CommandType.LONG, required=true, description="The ID of the security group") + private Long securityGroupId; @Parameter(name=ApiConstants.PROTOCOL, type=CommandType.STRING, description="protocol used") private String protocol; @@ -87,8 +88,8 @@ public class RevokeSecurityGroupIngressCmd extends BaseAsyncCmd { return icmpType; } - public String getSecurityGroupName() { - return securityGroupName; + public Long getSecurityGroupId() { + return securityGroupId; } public String getProtocol() { @@ -165,7 +166,7 @@ public class RevokeSecurityGroupIngressCmd extends BaseAsyncCmd { sb.append(""); } - return "revoking ingress from group: " + getSecurityGroupName() + " for " + sb.toString(); + return "revoking ingress from group: " + getSecurityGroupId() + " for " + sb.toString(); } @Override diff --git a/api/src/com/cloud/api/response/AccountResponse.java b/api/src/com/cloud/api/response/AccountResponse.java index a4ed2931ea8..98f4172757a 100644 --- a/api/src/com/cloud/api/response/AccountResponse.java +++ b/api/src/com/cloud/api/response/AccountResponse.java @@ -17,6 +17,8 @@ */ package com.cloud.api.response; +import java.util.List; + import com.cloud.api.ApiConstants; import com.cloud.serializer.Param; import com.google.gson.annotations.SerializedName; @@ -99,6 +101,9 @@ public class AccountResponse extends BaseResponse { @SerializedName(ApiConstants.IS_CLEANUP_REQUIRED) @Param(description="true if the account requires cleanup") private Boolean cleanupRequired; + + @SerializedName("user") @Param(description="the list of users associated with account", responseObject = NicResponse.class) + private List users; public Long getId() { return id; @@ -307,4 +312,12 @@ public class AccountResponse extends BaseResponse { public void setCleanupRequired(Boolean cleanupRequired) { this.cleanupRequired = cleanupRequired; } + + public List getUsers() { + return this.users; + } + + public void setUsers(List users) { + this.users = users; + } } diff --git a/api/src/com/cloud/api/response/NetworkOfferingResponse.java b/api/src/com/cloud/api/response/NetworkOfferingResponse.java index 47bf6e98436..c0310bf51f6 100644 --- a/api/src/com/cloud/api/response/NetworkOfferingResponse.java +++ b/api/src/com/cloud/api/response/NetworkOfferingResponse.java @@ -2,6 +2,7 @@ package com.cloud.api.response; import java.util.Date; +import com.cloud.api.ApiConstants; import com.cloud.serializer.Param; import com.google.gson.annotations.SerializedName; @@ -35,6 +36,9 @@ public class NetworkOfferingResponse extends BaseResponse{ @SerializedName("availability") @Param(description="availability of the network offering") private String availability; + + @SerializedName(ApiConstants.NETWORKRATE) @Param(description="data transfer rate in megabits per second allowed.") + private Integer networkRate; public Long getId() { return id; @@ -123,4 +127,12 @@ public class NetworkOfferingResponse extends BaseResponse{ public void setAvailability(String availability) { this.availability = availability; } + + public Integer getNetworkRate() { + return networkRate; + } + + public void setNetworkRate(Integer networkRate) { + this.networkRate = networkRate; + } } diff --git a/api/src/com/cloud/configuration/ConfigurationService.java b/api/src/com/cloud/configuration/ConfigurationService.java index a98965e23c9..b4e9f404890 100644 --- a/api/src/com/cloud/configuration/ConfigurationService.java +++ b/api/src/com/cloud/configuration/ConfigurationService.java @@ -28,9 +28,12 @@ import com.cloud.dc.Vlan; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Networks.TrafficType; import com.cloud.offering.DiskOffering; import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; +import com.cloud.user.Account; public interface ConfigurationService { @@ -173,7 +176,7 @@ public interface ConfigurationService { * @throws * @return The new Vlan object */ - Vlan createVlanAndPublicIpRange(CreateVlanIpRangeCmd cmd) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException; + Vlan createVlanAndPublicIpRange(CreateVlanIpRangeCmd cmd) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException, ResourceUnavailableException; boolean deleteVlanIpRange(DeleteVlanIpRangeCmd cmd); @@ -184,5 +187,13 @@ public interface ConfigurationService { List searchForNetworkOfferings(ListNetworkOfferingsCmd cmd); boolean deleteNetworkOffering(DeleteNetworkOfferingCmd cmd); + + NetworkOffering getNetworkOffering(long id); + + Integer getNetworkRate(long networkOfferingId); + + Account getVlanAccount(long vlanId); + + List listNetworkOfferings(TrafficType trafficType, boolean systemOnly); } diff --git a/api/src/com/cloud/event/ActionEvent.java b/api/src/com/cloud/event/ActionEvent.java index f489e380cb2..61ff14ba968 100644 --- a/api/src/com/cloud/event/ActionEvent.java +++ b/api/src/com/cloud/event/ActionEvent.java @@ -28,6 +28,7 @@ import java.lang.annotation.Target; @Retention(RUNTIME) public @interface ActionEvent { boolean create() default false; + boolean async() default false; String eventType(); String eventDescription(); } diff --git a/api/src/com/cloud/host/Host.java b/api/src/com/cloud/host/Host.java index 3aaa504069c..ef5baf1cb53 100755 --- a/api/src/com/cloud/host/Host.java +++ b/api/src/com/cloud/host/Host.java @@ -19,8 +19,7 @@ package com.cloud.host; import java.util.Date; -import com.cloud.host.Status; -import com.cloud.hypervisor.Hypervisor.HypervisorType;; +import com.cloud.hypervisor.Hypervisor.HypervisorType; /** @@ -56,7 +55,7 @@ public interface Host { /** * @return id of the host. */ - Long getId(); + long getId(); /** * @return name of the machine. @@ -145,27 +144,46 @@ public interface Host { /** * @return version */ - public String getVersion(); + String getVersion(); /* * @return total size */ - public long getTotalSize(); + long getTotalSize(); /* * @return capabilities */ - public String getCapabilities(); + String getCapabilities(); /* * @return last pinged time */ - public long getLastPinged(); + long getLastPinged(); /* * @return management server id */ - public Long getManagementServerId(); + Long getManagementServerId(); /* *@return removal date */ - public Date getRemoved(); + Date getRemoved(); + + Long getClusterId(); + + String getPublicIpAddress(); + + String getPublicNetmask(); + + String getPrivateNetmask(); + + String getStorageNetmask(); + + String getStorageMacAddress(); + + String getPublicMacAddress(); + + String getPrivateMacAddress(); + + String getStorageNetmaskDeux(); + + String getStorageMacAddressDeux(); - public Long getClusterId(); } diff --git a/core/src/com/cloud/host/HostEnvironment.java b/api/src/com/cloud/host/HostEnvironment.java similarity index 100% rename from core/src/com/cloud/host/HostEnvironment.java rename to api/src/com/cloud/host/HostEnvironment.java diff --git a/core/src/com/cloud/host/HostStats.java b/api/src/com/cloud/host/HostStats.java similarity index 100% rename from core/src/com/cloud/host/HostStats.java rename to api/src/com/cloud/host/HostStats.java diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index 5b0a9da8860..a6a83d83f85 100644 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -26,6 +26,7 @@ import com.cloud.api.commands.ListNetworksCmd; import com.cloud.api.commands.RestartNetworkCmd; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceAllocationException; @@ -51,7 +52,7 @@ public interface NetworkService { List searchForNetworks(ListNetworksCmd cmd) throws InvalidParameterValueException, PermissionDeniedException; boolean deleteNetwork(long networkId) throws InvalidParameterValueException, PermissionDeniedException; - boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException; + boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; int getActiveNicsInNetwork(long networkId); diff --git a/api/src/com/cloud/network/Networks.java b/api/src/com/cloud/network/Networks.java index 889ca567047..4527574a4d3 100644 --- a/api/src/com/cloud/network/Networks.java +++ b/api/src/com/cloud/network/Networks.java @@ -36,6 +36,14 @@ public class Networks { Firewall } + public enum RouterPrivateIpStrategy { + None, + DcGlobal, //global to data center + HostLocal; + + public static String DummyPrivateIp = "169.254.1.1"; + } + /** * Different ways to assign ip address to this network. */ diff --git a/api/src/com/cloud/network/element/NetworkElement.java b/api/src/com/cloud/network/element/NetworkElement.java index ec49880afe5..36a20dc0cc3 100644 --- a/api/src/com/cloud/network/element/NetworkElement.java +++ b/api/src/com/cloud/network/element/NetworkElement.java @@ -78,6 +78,15 @@ public interface NetworkElement extends Adapter { */ boolean shutdown(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException; + /** + * The network is being restarted. + * @param network + * @param context + * @return + * @throws ConcurrentOperationException + * @throws ResourceUnavailableException + */ + boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; /** * The network is being destroyed. diff --git a/api/src/com/cloud/network/ovs/OvsCreateTunnelAnswer.java b/api/src/com/cloud/network/ovs/OvsCreateTunnelAnswer.java new file mode 100644 index 00000000000..3c4cc45aef4 --- /dev/null +++ b/api/src/com/cloud/network/ovs/OvsCreateTunnelAnswer.java @@ -0,0 +1,68 @@ +package com.cloud.network.ovs; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; + +public class OvsCreateTunnelAnswer extends Answer { + Long from; + Long to; + long account; + String inPortName; + + //for debug info + String fromIp; + String toIp; + String key; + String bridge; + + public OvsCreateTunnelAnswer(Command cmd, boolean success, String details, String bridge) { + super(cmd, success, details); + OvsCreateTunnelCommand c = (OvsCreateTunnelCommand)cmd; + from = c.getFrom(); + to = c.getTo(); + account = c.getAccount(); + inPortName = "[]"; + fromIp = c.getFromIp(); + toIp = c.getRemoteIp(); + key = c.getKey(); + this.bridge = bridge; + } + + public OvsCreateTunnelAnswer(Command cmd, boolean success, String details, String inPortName, String bridge) { + this(cmd, success, details, bridge); + this.inPortName = inPortName; + } + + + public Long getFrom() { + return from; + } + + public Long getTo() { + return to; + } + + public long getAccount() { + return account; + } + + public String getInPortName() { + return inPortName; + } + + public String getFromIp() { + return fromIp; + } + + public String getToIp() { + return toIp; + } + + public String getKey() { + return key; + } + + public String getBridge() { + return bridge; + } +} diff --git a/api/src/com/cloud/network/ovs/OvsCreateTunnelCommand.java b/api/src/com/cloud/network/ovs/OvsCreateTunnelCommand.java new file mode 100644 index 00000000000..8ac772d07e2 --- /dev/null +++ b/api/src/com/cloud/network/ovs/OvsCreateTunnelCommand.java @@ -0,0 +1,53 @@ +package com.cloud.network.ovs; + +import com.cloud.agent.api.Command; + +public class OvsCreateTunnelCommand extends Command { + String key; + String remoteIp; + Long from; + Long to; + long account; + + //for debug info + String fromIp; + + @Override + public boolean executeInSequence() { + return true; + } + + public OvsCreateTunnelCommand(String remoteIp, String key, Long from, Long to, long account, String fromIp) { + this.remoteIp = remoteIp; + this.key = key; + this.from = from; + this.to = to; + this.account = account; + this.fromIp = fromIp; + } + + public String getKey() { + return key; + } + + public String getRemoteIp() { + return remoteIp; + } + + public Long getFrom() { + return from; + } + + public Long getTo() { + return to; + } + + public long getAccount() { + return account; + } + + public String getFromIp() { + return fromIp; + } + +} diff --git a/api/src/com/cloud/network/ovs/OvsDestroyTunnelCommand.java b/api/src/com/cloud/network/ovs/OvsDestroyTunnelCommand.java new file mode 100644 index 00000000000..65e12179ab0 --- /dev/null +++ b/api/src/com/cloud/network/ovs/OvsDestroyTunnelCommand.java @@ -0,0 +1,27 @@ +package com.cloud.network.ovs; + +import com.cloud.agent.api.Command; + +public class OvsDestroyTunnelCommand extends Command { + long account; + String inPortName; + + public OvsDestroyTunnelCommand(long account, String inPortName) { + this.account = account; + this.inPortName = inPortName; + } + + public long getAccount() { + return account; + } + + public String getInPortName() { + return inPortName; + } + + @Override + public boolean executeInSequence() { + return true; + } + +} diff --git a/api/src/com/cloud/network/router/VirtualRouter.java b/api/src/com/cloud/network/router/VirtualRouter.java index 51c9cb2341a..152611f3bdb 100755 --- a/api/src/com/cloud/network/router/VirtualRouter.java +++ b/api/src/com/cloud/network/router/VirtualRouter.java @@ -39,21 +39,6 @@ public interface VirtualRouter extends VirtualMachine { public String getPublicNetmask(); - public String getPrivateNetmask(); - - public String getVnet(); - - public String getVlanId(); - - public String getZoneVlan(); - - public String getGuestZoneMacAddress(); - - /** - * @return the gateway address for the router to use. - */ - public String getGateway(); - /** * @return the ram size for this machine. */ @@ -66,26 +51,9 @@ public interface VirtualRouter extends VirtualMachine { */ String getPublicIpAddress(); - String getDns1(); - String getDns2(); String getDomain(); - /** - * @return account id that the domain router belongs to. - */ - long getAccountId(); - - /** - * @return domain id that the domain router belongs to. - */ - long getDomainId(); - Role getRole(); - - /** - * @return the range of dhcp addresses served (start and end) - */ - String[] getDhcpRange(); void setRamSize(int ramSize); } diff --git a/api/src/com/cloud/resource/Concierge.java b/api/src/com/cloud/resource/Concierge.java deleted file mode 100644 index 04b1538ef5b..00000000000 --- a/api/src/com/cloud/resource/Concierge.java +++ /dev/null @@ -1,10 +0,0 @@ -/** - * - */ -package com.cloud.resource; - -import com.cloud.utils.component.Adapter; - -public interface Concierge extends Adapter { - -} diff --git a/api/src/com/cloud/resource/Resource.java b/api/src/com/cloud/resource/Resource.java deleted file mode 100644 index cb76142513e..00000000000 --- a/api/src/com/cloud/resource/Resource.java +++ /dev/null @@ -1,123 +0,0 @@ -/** - * - */ -package com.cloud.resource; - -import java.util.Date; -import java.util.List; -import java.util.Set; - -import com.cloud.utils.fsm.FiniteState; -import com.cloud.utils.fsm.StateMachine; - -/** - * Indicates a resource in CloudStack. - * Any resource that requires an reservation and release system - * must implement this interface. - * - */ -public interface Resource { - enum Event { - ReservationRequested, - ReleaseRequested, - CancelRequested, - OperationCompleted, - OperationFailed, - } - - enum State implements FiniteState { - Allocated("Resource is allocated but not reserved"), - Reserving("Resource is being reserved right now"), - Reserved("Resource has been reserved."), - Releasing("Resource is being released"), - Deallocating("Resource is being deallocated"); - - String _description; - - @Override - public StateMachine getStateMachine() { - return s_fsm; - } - - @Override - public State getNextState(Event event) { - return s_fsm.getNextState(this, event); - } - - @Override - public List getFromStates(Event event) { - return s_fsm.getFromStates(this, event); - } - - @Override - public Set getPossibleEvents() { - return s_fsm.getPossibleEvents(this); - } - - private State(String description) { - _description = description; - } - - @Override - public String getDescription() { - return _description; - } - - final static private StateMachine s_fsm = new StateMachine(); - static { - s_fsm.addTransition(State.Allocated, Event.ReservationRequested, State.Reserving); - s_fsm.addTransition(State.Reserving, Event.CancelRequested, State.Allocated); - s_fsm.addTransition(State.Reserving, Event.OperationCompleted, State.Reserved); - s_fsm.addTransition(State.Reserving, Event.OperationFailed, State.Allocated); - s_fsm.addTransition(State.Reserved, Event.ReleaseRequested, State.Releasing); - s_fsm.addTransition(State.Releasing, Event.OperationCompleted, State.Allocated); - s_fsm.addTransition(State.Releasing, Event.OperationFailed, State.Reserved); - } - } - - enum ReservationStrategy { - PlaceHolder, - Create, - Start; - } - - /** - * @return id in the CloudStack database - */ - long getId(); - - /** - * @return reservation id returned by the allocation source. This can be the - * String version of the database id if the allocation source does not need it's - * own implementation of the reservation id. This is passed back to the - * allocation source to release the resource. - */ - String getReservationId(); - - /** - * @return unique name for the allocation source. - */ - String getReserver(); - - /** - * @return the time a reservation request was made to the allocation source. - */ - Date getUpdateTime(); - - /** - * @return the expected reservation interval. -1 indicates - */ - int getExpectedReservationInterval(); - - /** - * @return the expected release interval. - */ - int getExpectedReleaseInterval(); - - /** - * @return the reservation state of the resource. - */ - State getState(); - - ReservationStrategy getReservationStrategy(); -} diff --git a/core/src/com/cloud/storage/StorageStats.java b/api/src/com/cloud/storage/StorageStats.java similarity index 100% rename from core/src/com/cloud/storage/StorageStats.java rename to api/src/com/cloud/storage/StorageStats.java diff --git a/core/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java b/api/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java similarity index 61% rename from core/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java rename to api/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java index d42c7f10cb7..a78db8d3ac4 100644 --- a/core/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java +++ b/api/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java @@ -26,40 +26,42 @@ import java.util.Date; public interface VMTemplateStorageResourceAssoc { public static enum Status {UNKNOWN, DOWNLOAD_ERROR, NOT_DOWNLOADED, DOWNLOAD_IN_PROGRESS, DOWNLOADED, ABANDONED, UPLOADED, NOT_UPLOADED, UPLOAD_ERROR, UPLOAD_IN_PROGRESS} - public String getInstallPath(); + String getInstallPath(); - public long getTemplateId(); + long getTemplateId(); - public void setTemplateId(long templateId); + void setTemplateId(long templateId); - public int getDownloadPercent(); + int getDownloadPercent(); - public void setDownloadPercent(int downloadPercent); + void setDownloadPercent(int downloadPercent); - public void setDownloadState(Status downloadState); + void setDownloadState(Status downloadState); - public Long getId(); + long getId(); - public Date getCreated(); + Date getCreated(); - public Date getLastUpdated(); + Date getLastUpdated(); - public void setLastUpdated(Date date); + void setLastUpdated(Date date); - public void setInstallPath(String installPath); + void setInstallPath(String installPath); - public Status getDownloadState(); + Status getDownloadState(); - public void setLocalDownloadPath(String localPath); + void setLocalDownloadPath(String localPath); - public String getLocalDownloadPath(); + String getLocalDownloadPath(); - public void setErrorString(String errorString); + void setErrorString(String errorString); - public String getErrorString(); + String getErrorString(); - public void setJobId(String jobId); + void setJobId(String jobId); - public String getJobId();; + String getJobId();; + + long getTemplateSize(); } diff --git a/api/src/com/cloud/storage/Volume.java b/api/src/com/cloud/storage/Volume.java index 2e650fb5179..b830eefb8ac 100755 --- a/api/src/com/cloud/storage/Volume.java +++ b/api/src/com/cloud/storage/Volume.java @@ -152,7 +152,6 @@ public interface Volume extends ControlledEntity, BasedOn { Date getCreated(); AsyncInstanceCreateStatus getStatus(); - boolean getDestroyed(); long getDiskOfferingId(); diff --git a/core/src/com/cloud/storage/VolumeStats.java b/api/src/com/cloud/storage/VolumeStats.java similarity index 100% rename from core/src/com/cloud/storage/VolumeStats.java rename to api/src/com/cloud/storage/VolumeStats.java diff --git a/api/src/com/cloud/template/VirtualMachineTemplate.java b/api/src/com/cloud/template/VirtualMachineTemplate.java index 6228f95ac3e..3a40f25f1fb 100755 --- a/api/src/com/cloud/template/VirtualMachineTemplate.java +++ b/api/src/com/cloud/template/VirtualMachineTemplate.java @@ -77,4 +77,10 @@ public interface VirtualMachineTemplate extends ControlledEntity { HypervisorType getHypervisorType(); int getBits(); + + String getUniqueName(); + + String getUrl(); + + String getChecksum(); } diff --git a/api/src/com/cloud/user/AccountService.java b/api/src/com/cloud/user/AccountService.java index 839abac4864..20019cbfa12 100644 --- a/api/src/com/cloud/user/AccountService.java +++ b/api/src/com/cloud/user/AccountService.java @@ -33,10 +33,12 @@ import com.cloud.api.commands.UpdateAccountCmd; import com.cloud.api.commands.UpdateResourceLimitCmd; import com.cloud.api.commands.UpdateUserCmd; import com.cloud.configuration.ResourceLimit; +import com.cloud.domain.Domain; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceUnavailableException; +import com.cloud.utils.Pair; public interface AccountService { @@ -143,6 +145,8 @@ public interface AccountService { Account finalizeOwner(Account caller, String accountName, Long domainId); + Pair finalizeAccountDomainForList(Account caller, String accountName, Long domainId); + Account getActiveAccount(String accountName, Long domainId); Account getActiveAccount(Long accountId); @@ -150,5 +154,7 @@ public interface AccountService { Account getAccount(Long accountId); User getActiveUser(long userId); + + Domain getDomain(long id); } diff --git a/api/src/com/cloud/user/UserContext.java b/api/src/com/cloud/user/UserContext.java index 1a48d159bd5..c4ec8ef7d93 100644 --- a/api/src/com/cloud/user/UserContext.java +++ b/api/src/com/cloud/user/UserContext.java @@ -32,6 +32,7 @@ public class UserContext { private String sessionId; private Account account; private long startEventId = 0; + private long accountId; private boolean apiServer; @@ -112,4 +113,12 @@ public class UserContext { return startEventId; } + public long getAccountId() { + return accountId; + } + + public void setAccountId(long accountId) { + this.accountId = accountId; + } + } diff --git a/api/src/com/cloud/uservm/UserVm.java b/api/src/com/cloud/uservm/UserVm.java index 4b0c90abe73..3cfe57babda 100755 --- a/api/src/com/cloud/uservm/UserVm.java +++ b/api/src/com/cloud/uservm/UserVm.java @@ -25,38 +25,6 @@ import com.cloud.vm.VirtualMachine; */ public interface UserVm extends VirtualMachine, ControlledEntity { - /** - * @return service offering id - */ - @Override - long getServiceOfferingId(); - - /** - * @return the domain router associated with this vm. - Long getDomainRouterId(); - */ - - /** - * @return the vnet associated with this vm. - */ - String getVnet(); - - /** - * @return the domain this vm instance belongs to. - */ - @Override - long getDomainId(); - - /** - * @return ip address within the guest network. - */ - String getGuestIpAddress(); - - /** - * @return mac address of the guest network. - */ - String getGuestMacAddress(); - Long getIsoId(); String getDisplayName(); @@ -65,8 +33,6 @@ public interface UserVm extends VirtualMachine, ControlledEntity { String getPassword(); - Long getDomainRouterId(); - void setUserData(String userData); String getDetail(String name); diff --git a/api/src/com/cloud/vm/Nic.java b/api/src/com/cloud/vm/Nic.java index 0576b553e6a..951dbe22950 100644 --- a/api/src/com/cloud/vm/Nic.java +++ b/api/src/com/cloud/vm/Nic.java @@ -18,15 +18,112 @@ package com.cloud.vm; import java.net.URI; +import java.util.Date; +import java.util.List; +import java.util.Set; import com.cloud.network.Networks.Mode; -import com.cloud.resource.Resource; +import com.cloud.utils.fsm.FiniteState; +import com.cloud.utils.fsm.StateMachine; /** * Nic represents one nic on the VM. */ -public interface Nic extends Resource { +public interface Nic { + enum Event { + ReservationRequested, + ReleaseRequested, + CancelRequested, + OperationCompleted, + OperationFailed, + } + + public enum State implements FiniteState { + Allocated("Resource is allocated but not reserved"), + Reserving("Resource is being reserved right now"), + Reserved("Resource has been reserved."), + Releasing("Resource is being released"), + Deallocating("Resource is being deallocated"); + + String _description; + + @Override + public StateMachine getStateMachine() { + return s_fsm; + } + + @Override + public State getNextState(Event event) { + return s_fsm.getNextState(this, event); + } + + @Override + public List getFromStates(Event event) { + return s_fsm.getFromStates(this, event); + } + + @Override + public Set getPossibleEvents() { + return s_fsm.getPossibleEvents(this); + } + + private State(String description) { + _description = description; + } + + @Override + public String getDescription() { + return _description; + } + + final static private StateMachine s_fsm = new StateMachine(); + static { + s_fsm.addTransition(State.Allocated, Event.ReservationRequested, State.Reserving); + s_fsm.addTransition(State.Reserving, Event.CancelRequested, State.Allocated); + s_fsm.addTransition(State.Reserving, Event.OperationCompleted, State.Reserved); + s_fsm.addTransition(State.Reserving, Event.OperationFailed, State.Allocated); + s_fsm.addTransition(State.Reserved, Event.ReleaseRequested, State.Releasing); + s_fsm.addTransition(State.Releasing, Event.OperationCompleted, State.Allocated); + s_fsm.addTransition(State.Releasing, Event.OperationFailed, State.Reserved); + } + } + + public enum ReservationStrategy { + PlaceHolder, + Create, + Start; + } + + /** + * @return id in the CloudStack database + */ + long getId(); + + /** + * @return reservation id returned by the allocation source. This can be the + * String version of the database id if the allocation source does not need it's + * own implementation of the reservation id. This is passed back to the + * allocation source to release the resource. + */ + String getReservationId(); + + /** + * @return unique name for the allocation source. + */ + String getReserver(); + + /** + * @return the time a reservation request was made to the allocation source. + */ + Date getUpdateTime(); + + /** + * @return the reservation state of the resource. + */ + State getState(); + + ReservationStrategy getReservationStrategy(); boolean isDefaultNic(); String getIp4Address(); @@ -54,5 +151,4 @@ public interface Nic extends Resource { URI getIsolationUri(); URI getBroadcastUri(); - } diff --git a/api/src/com/cloud/vm/NicProfile.java b/api/src/com/cloud/vm/NicProfile.java index 1786e2b2235..519d5e3eb2e 100644 --- a/api/src/com/cloud/vm/NicProfile.java +++ b/api/src/com/cloud/vm/NicProfile.java @@ -10,8 +10,7 @@ import com.cloud.network.Networks.AddressFormat; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; -import com.cloud.resource.Resource; -import com.cloud.resource.Resource.ReservationStrategy; +import com.cloud.vm.Nic.ReservationStrategy; public class NicProfile { long id; @@ -34,6 +33,7 @@ public class NicProfile { Integer deviceId; String dns1; String dns2; + int networkRate; public String getDns1() { return dns1; @@ -182,8 +182,12 @@ public class NicProfile { public void setIp4Address(String ip4Address) { this.ip4Address = ip4Address; } + + public int getNetworkRate() { + return networkRate; + } - public NicProfile(Nic nic, Network network, URI broadcastUri, URI isolationUri) { + public NicProfile(Nic nic, Network network, URI broadcastUri, URI isolationUri, Integer networkRate) { this.id = nic.getId(); this.networkId = network.getId(); this.gateway = nic.getGateway(); @@ -203,6 +207,9 @@ public class NicProfile { this.netmask = nic.getNetmask(); this.dns1 = network.getDns1(); this.dns2 = network.getDns2(); + if (networkRate != null) { + this.networkRate = networkRate; + } } public NicProfile(long id, BroadcastDomainType type, Mode mode, long vmId) { @@ -212,7 +219,7 @@ public class NicProfile { this.vmId = vmId; } - public NicProfile(Resource.ReservationStrategy strategy, String ip4Address, String macAddress, String gateway, String netmask) { + public NicProfile(ReservationStrategy strategy, String ip4Address, String macAddress, String gateway, String netmask) { this.format = AddressFormat.Ip4; this.ip4Address = ip4Address; this.macAddress = macAddress; diff --git a/api/src/com/cloud/vm/UserVmService.java b/api/src/com/cloud/vm/UserVmService.java index b102c7cbcb0..85b873cdd2b 100755 --- a/api/src/com/cloud/vm/UserVmService.java +++ b/api/src/com/cloud/vm/UserVmService.java @@ -73,7 +73,7 @@ public interface UserVmService { * @param cmd - the command specifying vmId, password * @return the VM if reset worked successfully, null otherwise */ - UserVm resetVMPassword(ResetVMPasswordCmd cmd, String password); + UserVm resetVMPassword(ResetVMPasswordCmd cmd, String password) throws ResourceUnavailableException, InsufficientCapacityException; /** * Attaches the specified volume to the specified VM @@ -93,7 +93,7 @@ public interface UserVmService { UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, ExecutionException, ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; UserVm stopVirtualMachine(StopVMCmd cmd) throws ServerApiException, ConcurrentOperationException; - UserVm rebootVirtualMachine(RebootVMCmd cmd); + UserVm rebootVirtualMachine(RebootVMCmd cmd) throws InsufficientCapacityException, ResourceUnavailableException; UserVm updateVirtualMachine(UpdateVMCmd cmd); UserVm recoverVirtualMachine(RecoverVMCmd cmd) throws ResourceAllocationException; diff --git a/core/src/com/cloud/vm/VmStats.java b/api/src/com/cloud/vm/VmStats.java similarity index 100% rename from core/src/com/cloud/vm/VmStats.java rename to api/src/com/cloud/vm/VmStats.java diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties index aa3523cc0fa..18190deb55f 100644 --- a/client/WEB-INF/classes/resources/messages.properties +++ b/client/WEB-INF/classes/resources/messages.properties @@ -36,6 +36,168 @@ label.cluster=Cluster label.domain.name=Domain Name label.advanced=Advanced label.details=Details +label.users=Users +label.detaching.disk=Detaching Disk +label.id=ID +label.role=Role +label.account.name=Account Name +label.vms=VMs +label.ips=IPs +label.ip=IP +label.bytes.received=Bytes Received +label.bytes.sent=Bytes Sent +label.state=State +label.save=Save +label.cancel=Cancel +label.add.account=Add Account +label.add.user=Add User +label.waiting=Waiting +label.api.key=API Key +label.secret.key=Secret Key +label.email=Email +label.first.name=First Name +label.last.name=Last Name +label.timezone=Timezone +label.instance.limits=Instance Limits +label.instance=Instance +label.ip.limits=Public IP Limits +label.volume.limits=Volume Limits +label.snapshot.limits=Snapshot Limits +label.template.limits=Template Limits +label.adding=Adding +label.sent=Sent +label.user=User +label.domain.admin=Domain Admin +label.admin=Admin +label.by.role=By Role +label.type=Type +label.type.id=Type ID +label.description=Description +label.hypervisor.type=Hypervisor Type +label.cluster.type=Cluster Type +label.host.name=Host Name +label.vcenter.datastore=vCenter Datastore +label.vcenter.address=vCenter Address +label.vcenter.username=vCenter Username +label.vcenter.password=vCenter Password +label.vcenter.datacenter=vCenter Datacenter +label.vcenter.host=vCenter Host +label.protocol=Protocol +label.nfs=NFS +label.iscsi=iSCSI +label.vmfs=VMFS +label.server=Server +label.path=Path +label.target.iqn=Target IQN +label.lun=LUN +label.tags=Tags +label.system.capacity=System Wide Capacity +label.public.ips=Public IP Addresses +label.allocated=Allocated +label.private.ips=Private IP Addresses +label.private.ip=Private IP Address +label.guest.ip=Guest IP Address +label.memory.allocated=Memory Allocated +label.memory.used=Memory Used +label.cpu.allocated=CPU Allocated +label.primary.allocated=Primary Storage Allocated +label.used=Used +label.primary.used=Primary Storage Used +label.secondary.used=Secondary Storage Used +label.general.alerts=General Alerts +label.no.alerts=No Recent Alerts +label.host.alerts=Host Alerts +label.disk.volume=Disk Volume +label.snapshots=Snapshots +label.accounts=Accounts +label.recent.errors=Recent Errors +label.no.errors=No Recent Errors +label.resources=Resources +label.running.vms=Running VMs +label.stopped.vms=Stopped VMs +label.total.vms=Total VMs +label.available.public.ips=Available Public IP Addresses +label.owned.public.ips=Owned Public IP Addresses +label.my.account=My Account +label.account.id=Account ID +label.account=Account +label.display.text=Display Text +label.disk.size=Disk Size +label.add.disk.offering=Add Disk Offering +label.custom.disk.size=Custom Disk Size +label.no=No +label.yes=Yes +label.public=Public +label.admin.accounts=Admin Accounts +label.resource.limits=Resource Limits +label.instances=Instances +label.add.domain=Add Domain +label.parent.domain=Parent Domain +label.volumes=Volumes +label.initiated.by=Initiated By +label.owner.account=Owner Account +label.level=Level +label.date=Date +label.by.type=By Type +label.by.level=By Level +label.info=Info +label.warn=Warn +label.error=Error +label.value=Value +label.edit=Edit +label.hosts=Hosts +label.host=Host +label.virtual.appliances=Virtual Appliances +label.system.vms=System VMs +label.statistics=Statistics +label.ip.address=IP Address +label.version=Version +label.os.preference=OS Preference +label.last.disconnected=Last Disconnected +label.cpu=CPU +label.memory.total=Memory Total +label.network.read=Network Read +label.network.write=Network Write +label.ip.or.fqdn=IP or FQDN +label.disk.total=Disk Total +label.disk.allocated=Disk Allocated +label.created=Created +label.system.vm.type=System VM Type +label.public.ip=Public IP Address +label.by.state=By State +label.port.forwarding=Port Forwarding +label.load.balancer=Load Balancer +label.vpn=VPN +label.vlan=VLAN +label.source.nat=Source NAT +label.network.type=Network Type +label.network.id=Network ID +label.associated.network.id=Associated Network ID +label.static.nat=Static NAT +label.static.nat.to=Static NAT to +label.public.port=Public Port +label.private.port=Private Port +label.protocol=Protocol +label.algorithm=Algorithm +label.enabling.vpn=Enabling VPN +label.acquire.new.ip=Acquire New IP +label.manage=Manage +label.delete=Delete +label.assign=Assign +label.assign.to.load.balancer=Assigning instance to load balancer +label.remove.from.load.balancer=Removing instance from load balancer +label.revoke=Revoke +label.removing.user=Removing User +label.enabling.vpn.access=Enabling VPN Access +label.disabling.vpn.access=Disabling VPN Access +label.adding.user=Adding User +label.service.offering=Service Offering + +label.lang.english=English +label.lang.chinese=Chinese + +label.theme.default=Default Theme +label.theme.grey=Custom - Grey label.menu.dashboard=Dashboard label.menu.instances=Instances @@ -58,6 +220,8 @@ label.menu.my.isos=My ISOs label.menu.featured.isos=Featured ISOs label.menu.community.isos=Community ISOs label.menu.accounts=Accounts +label.menu.my.accounts=My Accounts +label.menu.all.accounts=All Accounts label.menu.domains=Domains label.menu.events=Events label.menu.alerts=Alerts @@ -69,15 +233,36 @@ label.menu.system.vms=System VMs label.menu.configuration=Configuration label.menu.service.offerings=Service Offerings label.menu.disk.offerings=Disk Offerings +label.menu.network.offerings=Network Offerings label.menu.global.settings=Global Settings label.menu.security.groups=Security Groups + label.vm.start=Start VM label.vm.stop=Stop VM label.vm.reboot=Reboot VM label.vm.destroy=Destroy VM #Messages +message.edit.limits=Please specify limits to the following resources. A "-1" indicates no limit to the amount of resources create. +message.disable.account=Please confirm you want to disable this account. By disabling the account, all users for this account will no longer have access to their cloud resources. All running virtual machines will be immediately shut down. +message.lock.account=Please confirm you want to lock this account. By locking the account, all users for this account will no longer be able to manage their cloud resources. Existing resources can still be accessed. +message.enable.account=Please confirm you want to enable this account.user +message.new.user=Specify the following to add a new user to the account +message.edit.confirm=Please confirm your changes before clicking 'Save' +message.add.host=Please specify the following parameters to add a new host +message.add.primary=Please specify the following parameters to add a new primary storage +message.add.disk.offering=Please specify the following parameters to add a new disk offering +message.restart.mgmt.server=Please restart your management server(s) for your new settings to take effect. +message.update.os.preference=Please choose a OS preference for this host. All virtual instances with similar preferences will be first allocated to this host before choosing another. +message.enabled.vpn=Your VPN access is currently enabled and can be accessed via the IP +message.enabled.vpn.ip.sec=Your IPSec pre-shared key is +message.enable.vpn=VPN access is currently not enabled. Please click here to enable VPN. +message.remove.vpn.access=Please confirm you want to remove VPN access from the following user +message.enable.vpn.access=VPN is currently disabled for this IP Address. Would you like to enable VPN access? +message.disable.vpn.access=Please confirm you want to disable VPN Access. +message.acquire.public.ip=Please select a zone from which you want to acquire your new IP from. +message.allow.vpn.access=Please enter a username and password of the user that you want to allow VPN access. #Errors error.login=Your username/password does not match our records. diff --git a/client/WEB-INF/classes/resources/resource.properties b/client/WEB-INF/classes/resources/resource.properties index 260e5ca880e..0422dc41523 100644 --- a/client/WEB-INF/classes/resources/resource.properties +++ b/client/WEB-INF/classes/resources/resource.properties @@ -112,43 +112,13 @@ please.specify.the.new.name.you.want.to.change.for.the.virtual.machine = Please please.specify.the.new.group.you.want.to.assign.the.virtual.machine.to = Please specify the new group you want to assign the virtual machine to after.changing.service.offering.you.must.restart.the.virtual.machine.for.new.service.offering.to.take.effect = After changing service offering, you must restart the virtual machine for the new service offering to take effect. creating.a.template.of.disk.volume.could.take.up.to.several.hours.depending.on.the.size.of.the.disk.volume = Creating a template of disk volume could take up to several hours depending on the size of the disk volume -please.confirm.you.want.to.change.the.root.password.for.the.virtual.machine = Please confirm you want to change the ROOT password for the virtual machine -please.confirm.you.want.to.enable.HA.for.your.virtual.machine.once.HA.is.enabled.your.virtual.machine.will.be.automatically.restarted.in.the.event.it.is.detected.to.have.failed = Please confirm you want to enable HA for your virtual machine. Once HA is enabled, your virtual machine will be automatically restarted in the event it is detected to have failed. -please.confirm.you.want.to.disable.HA.for.the.virtual.machine.once.HA.is.disabled.the.virtual.machine.will.no.longer.be.automatically.restarted.in.the.event.of.a.failure = Please confirm you want to disable HA for the virtual machine. Once HA is disabled, the virtual machine will no longer be be automatically restarted in the event of a failure. -the.ISO.is.used.by.all.zones.please.confirm.you.want.to.delete.it.from.all.zones = The ISO is used by all zones. Please confirm you want to delete it from all zones. -please.confirm.you.want.to.delete.the.ISO = Please confirm you want to delete the ISO -the.template.is.used.by.all.zones.please.confirm.you.want.to.delete.it.from.all.zones = The template is used by all zones. Please confirm you want to delete it from all zones. -please.confirm.you.want.to.delete.the.template = Please confirm you want to delete the template please.specify.limits.to.the.various.resources.-1.means.the.resource.has.no.limits = Please specify limits to the various resources. -1 means the resource has no limits. please.confirm.you.want.to.disable.account.that.will.prevent.account.access.to.the.cloud.and.shut.down.all.existing.virtual.machines = Please confirm you want to disable account that will prevent account access to the cloud and shut down all existing virtual machines. please.confirm.you.want.to.lock.account.that.will.prevent.account.access.to.the.cloud = Please confirm you want to lock account that will prevent account access to the cloud. please.confirm.you.want.to.enable.account = Please confirm you want to enable account. please.select.an.available.zone.to.associate.your.new.ip.with..acquiring.additional.ip.may.cost.you.an.additional.dollars.per.month. = Please select an availability zone to associate your new IP with. Acquiring additional IP may cost you an additional dollars per month. -please.confirm.you.want.to.release.this.IP.address = Please confirm you want to release this IP address please.restart.your.management.server.for.your.new.settings.to.take.effect = Please RESTART your management server for your new settings to take effect -enabling.maintenance.mode.will.cause.a.live.migration.of.all.running.instances.on.this.host.to.any.available.host = Enabling maintenance mode will cause a live migration of all running instances on this host to any available host. -please.confirm.you.want.to.cancel.maintenance.for.the.host = Please confirm you want to cancel maintenance for the host -please.confirm.you.want.to.force.a.reconnection.for.the.host = Please confirm you want to force a reconnection for the host -please.confirm.you.want.to.remove.the.host.from.the.management.server = Please confirm you want to remove the host from the management server Please.choose.a.OS.preference.for.this.host..Virtual.machines.will.always.be.allocated.to.hosts.with.an.OS.preference.that.matches.with.the.OS.type.of.the.template.chosen.for.the.virtual.machine.before.choosing.other.hosts. = Please choose a OS preference for this host. Virtual machines will always be allocated to hosts with an OS preference that matches with the OS type of the template chosen for the virtual machine before choosing other hosts. -please.confirm.you.want.to.delete.the.primary.storage = Please confirm you want to delete the primary storage -please.confirm.you.want.to.delete.the.secondary.storage = Please confirm you want to delete the secondary storage - -please.confirm.you.want.to.start.instance = Please confirm you want to start instance -please.confirm.you.want.to.stop.instance = Please confirm you want to stop instance -please.confirm.you.want.to.reboot.instance = Please confirm you want to reboot instance -please.confirm.you.want.to.destroy.instance = Please confirm you want to destroy instance -please.confirm.you.want.to.restore.instance = Please confirm you want to restore instance - -please.confirm.you.want.to.start.router = Please confirm you want to start router -please.confirm.you.want.to.stop.router = Please confirm you want to stop router -please.confirm.you.want.to.reboot.router = Please confirm you want to reboot router - - -please.confirm.you.want.to.start.systemVM = Please confirm you want to start system VM -please.confirm.you.want.to.stop.systemVM = Please confirm you want to stop system VM -please.confirm.you.want.to.reboot.systemVM = Please confirm you want to reboot system VM - customizable.during.VM.creation = Customizable during VM creation physical.resources = Physical Resources diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index 84b56bebca6..f021a7fe50c 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -61,9 +61,6 @@ - - - diff --git a/console-proxy/.classpath b/console-proxy/.classpath index 521b7a55fa9..5a34eae6642 100644 --- a/console-proxy/.classpath +++ b/console-proxy/.classpath @@ -4,6 +4,6 @@ - + diff --git a/console-viewer/.classpath b/console-viewer/.classpath index 170f58a8bbb..e8a8d8c0a84 100644 --- a/console-viewer/.classpath +++ b/console-viewer/.classpath @@ -2,6 +2,6 @@ - + diff --git a/core/.classpath b/core/.classpath index db9b9a922f1..f014c3e0d03 100644 --- a/core/.classpath +++ b/core/.classpath @@ -38,6 +38,7 @@ - + + diff --git a/core/src/com/cloud/agent/api/CheckOnVmAnswer.java b/core/src/com/cloud/agent/api/CheckOnVmAnswer.java deleted file mode 100644 index 84885962223..00000000000 --- a/core/src/com/cloud/agent/api/CheckOnVmAnswer.java +++ /dev/null @@ -1,52 +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.agent.api; - -public class CheckOnVmAnswer extends Answer { - boolean determined; - boolean alive; - - protected CheckOnVmAnswer() { - } - - public CheckOnVmAnswer(CheckOnVmCommand cmd, Boolean alive) { - this(cmd, alive, null); - } - - public CheckOnVmAnswer(CheckOnVmCommand cmd, Boolean alive, String details) { - super(cmd, true, details); - if (alive == null) { - determined = false; - } else { - determined = true; - this.alive = alive; - } - } - - public CheckOnVmAnswer(CheckOnVmCommand cmd, Exception e) { - super(cmd, e); - } - - public boolean isDetermined() { - return determined; - } - - public boolean isAlive() { - return alive; - } -} diff --git a/core/src/com/cloud/agent/api/CheckOnVmCommand.java b/core/src/com/cloud/agent/api/CheckOnVmCommand.java deleted file mode 100644 index 09275570aa0..00000000000 --- a/core/src/com/cloud/agent/api/CheckOnVmCommand.java +++ /dev/null @@ -1,41 +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.agent.api; - -import com.cloud.host.HostVO; -import com.cloud.vm.VMInstanceVO; - -/** - * @author ahuang - * - */ -public class CheckOnVmCommand extends Command { - - protected CheckOnVmCommand() { - } - - public CheckOnVmCommand(VMInstanceVO vm, HostVO host) { - - } - - @Override - public boolean executeInSequence() { - return false; - } - -} diff --git a/core/src/com/cloud/agent/api/MirrorAnswer.java b/core/src/com/cloud/agent/api/MirrorAnswer.java deleted file mode 100644 index eb627ab6a82..00000000000 --- a/core/src/com/cloud/agent/api/MirrorAnswer.java +++ /dev/null @@ -1,85 +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.agent.api; - -import java.util.ArrayList; -import java.util.List; - -import com.cloud.storage.Volume; -import com.cloud.storage.VolumeVO; - - -/** - * @author chiradeep - * - */ -public class MirrorAnswer extends Answer { - public enum MirrorState { - NOT_MIRRORED, - ACTIVE, - DEGRADED, - FAILED - } - - public enum DiskState { - ACTIVE, - REBUILD, - FAILED - } - - public class MirrorInfo { - public Volume.VolumeType volType; - public VolumeVO vol1; - public VolumeVO vol2; - public DiskState disk1State; - public DiskState disk2State; - public MirrorState mirrorState; - public int rebuildPct; - } - - String vmName; - //List mirrorInfo = new ArrayList(); - String error; - - - protected MirrorAnswer() { - } - - - public MirrorAnswer(MirrorCommand cmd, String vmName, String err) { - super(cmd, false, err); - this.vmName = vmName; - } - - public MirrorAnswer(MirrorCommand cmd, String vmName){ - super(cmd, true, null); - this.vmName = vmName; - } - - public String getVmName() { - return vmName; - } - - - public void setVmName(String vmName) { - this.vmName = vmName; - } - - - -} diff --git a/core/src/com/cloud/agent/api/MirrorCommand.java b/core/src/com/cloud/agent/api/MirrorCommand.java deleted file mode 100644 index c7d10f4abe5..00000000000 --- a/core/src/com/cloud/agent/api/MirrorCommand.java +++ /dev/null @@ -1,104 +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.agent.api; - -import java.util.List; - -import com.cloud.storage.VolumeVO; - -public class MirrorCommand extends Command { - - protected String vmName; - protected String removeHost; - protected String addHost; - protected List removeVols; - protected List addVols; - - - public MirrorCommand(String vmName, String removeHost, String addHost, - List removeVols, List addVols) { - super(); - this.vmName = vmName; - this.removeHost = removeHost; - this.addHost = addHost; - this.removeVols = removeVols; - this.addVols = addVols; - } - - protected MirrorCommand() { - //satisfies gson - } - - public String getVmName() { - return vmName; - } - - - public void setVmName(String vmName) { - this.vmName = vmName; - } - - - public String getRemoveHost() { - return removeHost; - } - - - public void setRemoveHost(String removeHost) { - this.removeHost = removeHost; - } - - - public String getAddHost() { - return addHost; - } - - - public void setAddHost(String addHost) { - this.addHost = addHost; - } - - - public List getRemoveVols() { - return removeVols; - } - - - public void setRemoveVols(List removeVols) { - this.removeVols = removeVols; - } - - - public List getAddVols() { - return addVols; - } - - - public void setAddVols(List addVols) { - this.addVols = addVols; - } - - - @Override - public boolean executeInSequence() { - return true; - } - - -} \ No newline at end of file diff --git a/core/src/com/cloud/agent/api/NetworkRulesSystemVmCommand.java b/core/src/com/cloud/agent/api/NetworkRulesSystemVmCommand.java new file mode 100644 index 00000000000..79539051334 --- /dev/null +++ b/core/src/com/cloud/agent/api/NetworkRulesSystemVmCommand.java @@ -0,0 +1,69 @@ +package com.cloud.agent.api; + +import com.cloud.vm.VirtualMachine; + +public class NetworkRulesSystemVmCommand extends Command { + /** + * 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 . + * + */ + + private String vmName; + private long vmId; + private String pubIp; + private String mac; + private VirtualMachine.Type type; + + protected NetworkRulesSystemVmCommand() { + + } + + public NetworkRulesSystemVmCommand(String vmName, VirtualMachine.Type type) { + this.vmName = vmName; + } + + public NetworkRulesSystemVmCommand(String vmName, long vmId, String publicIP, String mac, VirtualMachine.Type type) { + this.vmName = vmName; + this.vmId = vmId; + this.pubIp = publicIP; + this.mac = mac; + this.type = type; + } + + public String getVmName() { + return vmName; + } + + public long getVmId() { + return vmId; + } + + public String getIp() { + return pubIp; + } + + public String getMac() { + return mac; + } + + public VirtualMachine.Type getType() { + return type; + } + @Override + public boolean executeInSequence() { + return false; + } +} diff --git a/core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java b/core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java deleted file mode 100644 index 09b4748ff91..00000000000 --- a/core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com. 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.HashMap; -import java.util.Map; - -import com.cloud.agent.transport.Request; -import com.cloud.host.Host; -import com.cloud.utils.Pair; -import com.cloud.vm.VirtualMachine.State; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - - -public class PingRoutingWithNwGroupsCommand extends PingRoutingCommand { - HashMap> newGroupStates; - - public static class NwGroupsCommandTypeAdaptor implements JsonDeserializer>, JsonSerializer> { - static final GsonBuilder s_gBuilder; - static { - s_gBuilder = Request.initBuilder(); - } - - public NwGroupsCommandTypeAdaptor() { - } - - @Override - public JsonElement serialize(Pair src, - java.lang.reflect.Type typeOfSrc, JsonSerializationContext context) { - JsonArray array = new JsonArray(); - Gson json = s_gBuilder.create(); - if(src.first() != null) { - array.add(json.toJsonTree(src.first())); - } else { - array.add(new JsonNull()); - } - - if (src.second() != null) { - array.add(json.toJsonTree(src.second())); - } else { - array.add(new JsonNull()); - } - - return array; - } - - @Override - public Pair deserialize(JsonElement json, - java.lang.reflect.Type type, JsonDeserializationContext context) - throws JsonParseException { - Pair pairs = new Pair(null, null); - JsonArray array = json.getAsJsonArray(); - if (array.size() != 2) { - return pairs; - } - JsonElement element = array.get(0); - if (!element.isJsonNull()) { - pairs.first(element.getAsLong()); - } - - element = array.get(1); - if (!element.isJsonNull()) { - pairs.second(element.getAsLong()); - } - - return pairs; - } - - } - protected PingRoutingWithNwGroupsCommand() { - super(); - } - - public PingRoutingWithNwGroupsCommand(Host.Type type, long id, Map states, HashMap> nwGrpStates) { - super(type, id, states); - newGroupStates = nwGrpStates; - } - - public HashMap> getNewGroupStates() { - return newGroupStates; - } - - public void setNewGroupStates(HashMap> newGroupStates) { - this.newGroupStates = newGroupStates; - } -} diff --git a/core/src/com/cloud/agent/api/routing/LoadBalancerCfgCommand.java b/core/src/com/cloud/agent/api/routing/LoadBalancerCfgCommand.java deleted file mode 100644 index 3190e2a35d8..00000000000 --- a/core/src/com/cloud/agent/api/routing/LoadBalancerCfgCommand.java +++ /dev/null @@ -1,76 +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.agent.api.routing; - -import com.cloud.network.LoadBalancerConfigurator; - -/** - * @author chiradeep - * - */ -public class LoadBalancerCfgCommand extends NetworkElementCommand { - private String [] config; - private String [] addFwRules; - private String [] removeFwRules;; - private String routerName; - private String routerIp; - - //no-args to satisfy gson - protected LoadBalancerCfgCommand() { - - } - - public LoadBalancerCfgCommand(String[] config, String[][] addRemoveRules, String routerName, String routerIp) { - super(); - this.config = config; - this.addFwRules = addRemoveRules[LoadBalancerConfigurator.ADD]; - this.removeFwRules = addRemoveRules[LoadBalancerConfigurator.REMOVE]; - this.routerName = routerName; - this.routerIp = routerIp; - } - - public String getRouterName() { - return routerName; - } - - public String getRouterIp() { - return routerIp; - } - - public String[] getConfig() { - return config; - } - - public void setConfig(String[] config) { - this.config = config; - } - - public String[] getAddFwRules() { - return addFwRules; - } - - public String[] getRemoveFwRules() { - return removeFwRules; - } - - @Override - public boolean executeInSequence() { - return false; - } - -} diff --git a/core/src/com/cloud/agent/api/storage/ShareAnswer.java b/core/src/com/cloud/agent/api/storage/ShareAnswer.java deleted file mode 100644 index 1ddbdd33505..00000000000 --- a/core/src/com/cloud/agent/api/storage/ShareAnswer.java +++ /dev/null @@ -1,44 +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.agent.api.storage; - -import java.util.Map; - -import com.cloud.agent.api.Answer; - -public class ShareAnswer extends Answer { - - protected ShareAnswer() { - } - - Map mapping; - - public ShareAnswer(ShareCommand cmd, Map mapping) { - super(cmd, true, null); - this.mapping = mapping; - } - - public ShareAnswer(ShareCommand cmd, String details) { - super(cmd, false, details); - } - - public Map getMappings() { - return mapping; - } - -} diff --git a/core/src/com/cloud/agent/api/storage/ShareCommand.java b/core/src/com/cloud/agent/api/storage/ShareCommand.java deleted file mode 100644 index 09ad9957594..00000000000 --- a/core/src/com/cloud/agent/api/storage/ShareCommand.java +++ /dev/null @@ -1,89 +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.agent.api.storage; - -import java.util.List; - -import com.cloud.storage.VolumeVO; - -public class ShareCommand extends StorageCommand { - public static String UnshareAll = "unshare_all"; - - private boolean share; - private boolean removePreviousShare; - private List volumes; - private String vmName; - private String initiatorIqn; - - protected ShareCommand() { - } - - public ShareCommand(String vmName, List vols, String initiatorIqn, boolean removePreviousShare) { - super(); - this.vmName = vmName; - this.initiatorIqn = initiatorIqn; - this.share = true; - this.volumes = vols; - this.removePreviousShare = removePreviousShare; - } - - public ShareCommand(String vmName, List vols, String initiatorIqn) { - super(); - this.vmName = vmName; - this.initiatorIqn = initiatorIqn; - this.share = false; - this.volumes = vols; - this.removePreviousShare = true; - } - - public ShareCommand(String vmName, List vols) { - super(); - this.vmName = vmName; - this.initiatorIqn = UnshareAll; - this.share = false; - this.volumes = vols; - this.removePreviousShare = true; - } - - // NOTE: We set this to false because we leave it up to the business logic - // to make sure it is already created before calling shared. - @Override - public boolean executeInSequence() { - return false; - } - - public boolean isShare() { - return share; - } - - public List getVolumes() { - return volumes; - } - - public String getVmName() { - return vmName; - } - - public String getInitiatorIqn() { - return initiatorIqn; - } - - public boolean removePreviousShare() { - return removePreviousShare; - } -} diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java index c1357c1385d..393198c0fe7 100755 --- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java +++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java @@ -47,9 +47,8 @@ import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand; import com.cloud.agent.api.routing.DhcpEntryCommand; import com.cloud.agent.api.routing.IPAssocCommand; import com.cloud.agent.api.routing.IpAssocAnswer; -import com.cloud.agent.api.routing.LoadBalancerCfgCommand; -import com.cloud.agent.api.routing.NetworkElementCommand; import com.cloud.agent.api.routing.LoadBalancerConfigCommand; +import com.cloud.agent.api.routing.NetworkElementCommand; import com.cloud.agent.api.routing.SavePasswordCommand; import com.cloud.agent.api.routing.SetPortForwardingRulesAnswer; import com.cloud.agent.api.routing.SetPortForwardingRulesCommand; @@ -98,8 +97,6 @@ public class VirtualRoutingResource implements Manager { try { if (cmd instanceof SetPortForwardingRulesCommand ) { return execute((SetPortForwardingRulesCommand)cmd); - }else if (cmd instanceof LoadBalancerCfgCommand) { - return execute((LoadBalancerCfgCommand)cmd); } else if (cmd instanceof LoadBalancerConfigCommand) { return execute((LoadBalancerConfigCommand)cmd); } else if (cmd instanceof IPAssocCommand) { @@ -239,39 +236,6 @@ public class VirtualRoutingResource implements Manager { return new Answer(cmd); } - protected Answer execute(final LoadBalancerCfgCommand cmd) { - - File tmpCfgFile = null; - try { - String cfgFilePath = ""; - String routerIP = null; - - if (cmd.getRouterIp() != null) { - tmpCfgFile = File.createTempFile(cmd.getRouterIp().replace('.', '_'), "cfg"); - final PrintWriter out - = new PrintWriter(new BufferedWriter(new FileWriter(tmpCfgFile))); - for (int i=0; i < cmd.getConfig().length; i++) { - out.println(cmd.getConfig()[i]); - } - out.close(); - cfgFilePath = tmpCfgFile.getAbsolutePath(); - routerIP = cmd.getRouterIp(); - } - - final String result = setLoadBalancerConfig(cfgFilePath, - cmd.getAddFwRules(), cmd.getRemoveFwRules(), - routerIP); - - return new Answer(cmd, result == null, result); - } catch (final IOException e) { - return new Answer(cmd, false, e.getMessage()); - } finally { - if (tmpCfgFile != null) { - tmpCfgFile.delete(); - } - } - } - protected Answer execute(final IPAssocCommand cmd) { IpAddressTO[] ips = cmd.getIpAddresses(); String[] results = new String[cmd.getIpAddresses().length]; diff --git a/core/src/com/cloud/agent/transport/Request.java b/core/src/com/cloud/agent/transport/Request.java index c8a3e22ad73..298eeed1107 100755 --- a/core/src/com/cloud/agent/transport/Request.java +++ b/core/src/com/cloud/agent/transport/Request.java @@ -19,14 +19,14 @@ package com.cloud.agent.transport; import java.lang.reflect.Type; import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; -import com.cloud.agent.api.PingRoutingWithNwGroupsCommand; -import com.cloud.agent.api.SecStorageFirewallCfgCommand; import com.cloud.agent.api.SecStorageFirewallCfgCommand.PortConfig; import com.cloud.exception.UnsupportedVersionException; import com.cloud.storage.VolumeVO; @@ -35,6 +35,14 @@ import com.cloud.utils.Pair; import com.cloud.utils.exception.CloudRuntimeException; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; import com.google.gson.reflect.TypeToken; /** @@ -64,8 +72,9 @@ public class Request { public static Version get(final byte ver) throws UnsupportedVersionException { for (final Version version : Version.values()) { - if (ver == version.ordinal()) + if (ver == version.ordinal()) { return version; + } } throw new UnsupportedVersionException("Can't lookup version: " + ver, UnsupportedVersionException.UnknownVersion); } @@ -86,8 +95,8 @@ public class Request { s_gBuilder.registerTypeAdapter(Answer[].class, new ArrayTypeAdaptor()); final Type listType = new TypeToken>() {}.getType(); s_gBuilder.registerTypeAdapter(listType, new VolListTypeAdaptor()); - s_gBuilder.registerTypeAdapter(new TypeToken>() {}.getType(), new SecStorageFirewallCfgCommand.PortConfigListTypeAdaptor()); - s_gBuilder.registerTypeAdapter(new TypeToken>() {}.getType(), new PingRoutingWithNwGroupsCommand.NwGroupsCommandTypeAdaptor()); + s_gBuilder.registerTypeAdapter(new TypeToken>() {}.getType(), new PortConfigListTypeAdaptor()); + s_gBuilder.registerTypeAdapter(new TypeToken>() {}.getType(), new NwGroupsCommandTypeAdaptor()); s_logger.info("Builder inited."); } @@ -368,4 +377,103 @@ public class Request { public static boolean isControl(final byte[] bytes) { return (bytes[3] & FLAG_CONTROL) > 0; } + + public static class NwGroupsCommandTypeAdaptor implements JsonDeserializer>, JsonSerializer> { + static final GsonBuilder s_gBuilder; + static { + s_gBuilder = Request.initBuilder(); + } + + public NwGroupsCommandTypeAdaptor() { + } + + @Override + public JsonElement serialize(Pair src, + java.lang.reflect.Type typeOfSrc, JsonSerializationContext context) { + JsonArray array = new JsonArray(); + Gson json = s_gBuilder.create(); + if(src.first() != null) { + array.add(json.toJsonTree(src.first())); + } else { + array.add(new JsonNull()); + } + + if (src.second() != null) { + array.add(json.toJsonTree(src.second())); + } else { + array.add(new JsonNull()); + } + + return array; + } + + @Override + public Pair deserialize(JsonElement json, + java.lang.reflect.Type type, JsonDeserializationContext context) + throws JsonParseException { + Pair pairs = new Pair(null, null); + JsonArray array = json.getAsJsonArray(); + if (array.size() != 2) { + return pairs; + } + JsonElement element = array.get(0); + if (!element.isJsonNull()) { + pairs.first(element.getAsLong()); + } + + element = array.get(1); + if (!element.isJsonNull()) { + pairs.second(element.getAsLong()); + } + + return pairs; + } + + } + + public static class PortConfigListTypeAdaptor implements JsonDeserializer>, JsonSerializer> { + static final GsonBuilder s_gBuilder; + static { + s_gBuilder = Request.initBuilder(); + } + + static final Type listType = new TypeToken>() {}.getType(); + + public PortConfigListTypeAdaptor() { + } + + @Override + public JsonElement serialize(List src, Type typeOfSrc, JsonSerializationContext context) { + if (src.size() == 0) { + s_logger.info("Returning JsonNull"); + return new JsonNull(); + } + Gson json = s_gBuilder.create(); + s_logger.debug("Returning gson tree"); + JsonArray array = new JsonArray(); + for (PortConfig pc : src) { + array.add(json.toJsonTree(pc)); + } + + return array; + } + + @Override + public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + if (json.isJsonNull()) { + return new ArrayList(); + } + Gson jsonp = s_gBuilder.create(); + List pcs = new ArrayList(); + JsonArray array = json.getAsJsonArray(); + Iterator it = array.iterator(); + while (it.hasNext()) { + JsonElement element = it.next(); + pcs.add(jsonp.fromJson(element, PortConfig.class)); + } + return pcs; + } + + } } diff --git a/core/src/com/cloud/host/HostVO.java b/core/src/com/cloud/host/HostVO.java index 53f0c6c5b7b..af1bea360a1 100644 --- a/core/src/com/cloud/host/HostVO.java +++ b/core/src/com/cloud/host/HostVO.java @@ -38,6 +38,7 @@ import javax.persistence.Transient; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.Storage.StoragePoolType; +import com.cloud.utils.NumbersUtil; import com.cloud.utils.db.GenericDao; @Entity @@ -48,7 +49,7 @@ public class HostVO implements Host { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") - private Long id; + private long id; @Column(name="disconnected") @Temporal(value=TemporalType.TIMESTAMP) @@ -144,7 +145,8 @@ public class HostVO implements Host { return storageNetmaskDeux; } - public Long getClusterId() { + @Override + public Long getClusterId() { return clusterId; } @@ -331,7 +333,7 @@ public class HostVO implements Host { protected HostVO() { } - public HostVO(Long id, + public HostVO(long id, String name, Type type, String privateIpAddress, @@ -364,7 +366,7 @@ public class HostVO implements Host { this.fsType = fsType; } - public HostVO(Long id, + public HostVO(long id, String name, Type type, String privateIpAddress, @@ -486,6 +488,7 @@ public class HostVO implements Host { this.managementServerId = managementServerId; } + @Override public long getLastPinged() { return lastPinged; } @@ -495,10 +498,12 @@ public class HostVO implements Host { return parent; } + @Override public long getTotalSize() { return totalSize; } + @Override public String getCapabilities() { return caps; } @@ -508,10 +513,12 @@ public class HostVO implements Host { return created; } + @Override public Date getRemoved() { return removed; } + @Override public String getVersion() { return version; } @@ -520,7 +527,8 @@ public class HostVO implements Host { this.type = type; } - public Long getId() { + @Override + public long getId() { return id; } @@ -544,10 +552,12 @@ public class HostVO implements Host { return podId; } + @Override public Long getManagementServerId() { return managementServerId; } + @Override public Date getDisconnectedOn() { return disconnectedOn; } @@ -566,6 +576,7 @@ public class HostVO implements Host { this.guid = guid; } + @Override public Integer getCpus() { return cpus; } @@ -600,7 +611,7 @@ public class HostVO implements Host { @Override public int hashCode() { - return id != null ? id.hashCode() : -1; + return NumbersUtil.hash(id); } @Override @@ -614,7 +625,7 @@ public class HostVO implements Host { @Override public String toString() { - return new StringBuilder(type.toString()).append("-").append(Long.toString(id)).append("-").append(name).toString(); + return new StringBuilder(type.toString()).append("-").append(id).append("-").append(name).toString(); } public void setHypervisorType(HypervisorType hypervisorType) { diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index bff6a33059a..e418f53974f 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -92,6 +92,7 @@ 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.NetworkRulesSystemVmCommand; import com.cloud.agent.api.PingCommand; import com.cloud.agent.api.PingRoutingCommand; import com.cloud.agent.api.PingRoutingWithNwGroupsCommand; @@ -126,7 +127,6 @@ import com.cloud.agent.api.proxy.WatchConsoleProxyLoadCommand; import com.cloud.agent.api.routing.DhcpEntryCommand; import com.cloud.agent.api.routing.IPAssocCommand; import com.cloud.agent.api.routing.IpAssocAnswer; -import com.cloud.agent.api.routing.LoadBalancerCfgCommand; import com.cloud.agent.api.routing.LoadBalancerConfigCommand; import com.cloud.agent.api.routing.NetworkElementCommand; import com.cloud.agent.api.routing.RemoteAccessVpnCfgCommand; @@ -143,8 +143,6 @@ import com.cloud.agent.api.storage.CreatePrivateTemplateAnswer; import com.cloud.agent.api.storage.DestroyCommand; import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer; import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; -import com.cloud.agent.api.storage.ShareAnswer; -import com.cloud.agent.api.storage.ShareCommand; import com.cloud.agent.api.to.IpAddressTO; import com.cloud.agent.api.to.NicTO; import com.cloud.agent.api.to.PortForwardingRuleTO; @@ -155,6 +153,7 @@ import com.cloud.dc.Vlan; import com.cloud.exception.InternalErrorException; import com.cloud.host.Host.Type; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.hypervisor.xen.resource.XenServerConnectionPool.XenServerConnection; import com.cloud.network.HAProxyConfigurator; import com.cloud.network.LoadBalancerConfigurator; import com.cloud.network.Networks; @@ -163,14 +162,16 @@ import com.cloud.network.Networks.IsolationType; import com.cloud.network.Networks.TrafficType; import com.cloud.network.ovs.OvsCreateGreTunnelAnswer; import com.cloud.network.ovs.OvsCreateGreTunnelCommand; +import com.cloud.network.ovs.OvsCreateTunnelAnswer; +import com.cloud.network.ovs.OvsCreateTunnelCommand; import com.cloud.network.ovs.OvsDeleteFlowCommand; +import com.cloud.network.ovs.OvsDestroyTunnelCommand; import com.cloud.network.ovs.OvsSetTagAndFlowAnswer; import com.cloud.network.ovs.OvsSetTagAndFlowCommand; import com.cloud.resource.ServerResource; import com.cloud.storage.Storage; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; -import com.cloud.storage.StoragePoolVO; import com.cloud.storage.Volume; import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.VolumeVO; @@ -199,6 +200,7 @@ import com.xensource.xenapi.PIF; import com.xensource.xenapi.Pool; import com.xensource.xenapi.SR; import com.xensource.xenapi.Session; +import com.xensource.xenapi.Task; import com.xensource.xenapi.Types; import com.xensource.xenapi.Types.BadServerResponse; import com.xensource.xenapi.Types.IpConfigurationMode; @@ -284,12 +286,7 @@ public abstract class CitrixResourceBase implements ServerResource { @Override public void disconnected() { - } - - protected VDI cloudVDIcopy(Connection conn, VDI vdi, SR sr) throws BadServerResponse, XenAPIException, XmlRpcException{ - return vdi.copy(conn, sr); - } - + } protected Pair getVmByNameLabel(Connection conn, Host host, String nameLabel, boolean getRecord) throws XmlRpcException, XenAPIException { Set vms = host.getResidentVMs(conn); @@ -321,20 +318,19 @@ public abstract class CitrixResourceBase implements ServerResource { return true; } - + protected boolean pingxenserver() { - Connection conn = _connPool.slaveConnect(_host.ip, _username, _password); - if ( conn == null ) { - return false; - } else { - try { - Session.localLogout(conn); - } catch (Exception e) { - - } - conn.dispose(); + XenServerConnection conn = (XenServerConnection) getConnection(); + try { + Host host = Host.getByUuid(conn, _host.uuid); + host.enable(conn); + return true; + } catch (Exception e) { + String msg = "Catch Exception " + e.getClass().getName() + " : Enable host(" + _host.uuid + ") in pool(" + conn.getPoolUuid() + ") failed due to " + + e.toString(); + s_logger.warn(msg); } - return true; + return false; } protected String logX(XenAPIObject obj, String msg) { @@ -349,8 +345,6 @@ public abstract class CitrixResourceBase implements ServerResource { return execute((CreateCommand) cmd); } else if (cmd instanceof SetPortForwardingRulesCommand) { return execute((SetPortForwardingRulesCommand) cmd); - } else if (cmd instanceof LoadBalancerCfgCommand) { - return execute((LoadBalancerCfgCommand) cmd); } else if (cmd instanceof LoadBalancerConfigCommand) { return execute((LoadBalancerConfigCommand) cmd); } else if (cmd instanceof IPAssocCommand) { @@ -387,8 +381,6 @@ public abstract class CitrixResourceBase implements ServerResource { return execute((MigrateCommand) cmd); } else if (cmd instanceof DestroyCommand) { return execute((DestroyCommand) cmd); - } else if (cmd instanceof ShareCommand) { - return execute((ShareCommand) cmd); } else if (cmd instanceof ModifyStoragePoolCommand) { return execute((ModifyStoragePoolCommand) cmd); } else if (cmd instanceof DeleteStoragePoolCommand) { @@ -449,6 +441,12 @@ public abstract class CitrixResourceBase implements ServerResource { return execute((OvsDeleteFlowCommand)cmd); } else if (cmd instanceof CleanupNetworkRulesCmd){ return execute((CleanupNetworkRulesCmd)cmd); + } else if (cmd instanceof NetworkRulesSystemVmCommand) { + return execute((NetworkRulesSystemVmCommand)cmd); + } else if (cmd instanceof OvsCreateTunnelCommand) { + return execute((OvsCreateTunnelCommand)cmd); + } else if (cmd instanceof OvsDestroyTunnelCommand) { + return execute((OvsDestroyTunnelCommand)cmd); } else { return Answer.createUnsupportedCommandAnswer(cmd); } @@ -517,10 +515,12 @@ public abstract class CitrixResourceBase implements ServerResource { vifr.network = nw; dom0vif = VIF.create(conn, vifr); dom0vif.plug(conn); + dom0vif.unplug(conn); } else { s_logger.debug("already have a vif on dom0 for " + networkDesc); if (!dom0vif.getCurrentlyAttached(conn)) { dom0vif.plug(conn); + dom0vif.unplug(conn); } } } @@ -553,6 +553,29 @@ public abstract class CitrixResourceBase implements ServerResource { return null; } + private synchronized Network createTunnelNetwork(Connection conn, long account) { + try { + String nwName = "OVSTunnel" + account; + Network nw = null; + Network.Record rec = new Network.Record(); + Set networks = Network.getByNameLabel(conn, nwName); + + if (networks.size() == 0) { + rec.nameDescription = "tunnel network for account " + account; + rec.nameLabel = nwName; + nw = Network.create(conn, rec); + } else { + nw = networks.iterator().next(); + } + + enableXenServerNetwork(conn, nw, "OVSTunnel", "tunnel network for account " + account); + return nw; + } catch (Exception e) { + s_logger.warn("create tunnel network failed", e); + return null; + } + } + protected Network getNetwork(Connection conn, NicTO nic) throws XenAPIException, XmlRpcException { Pair network = getNativeNetworkForTraffic(conn, nic.getType()); if (nic.getBroadcastUri() != null && nic.getBroadcastUri().toString().contains("untagged")) { @@ -565,7 +588,13 @@ public abstract class CitrixResourceBase implements ServerResource { } else if (nic.getBroadcastType() == BroadcastDomainType.Native || nic.getBroadcastType() == BroadcastDomainType.LinkLocal) { return network.first(); } else if (nic.getBroadcastType() == BroadcastDomainType.Vswitch) { - return setupvSwitchNetwork(conn); + URI broadcastUri = nic.getBroadcastUri(); + if (broadcastUri.getHost().equalsIgnoreCase("vlan")) { + return setupvSwitchNetwork(conn); + } else { + long account = Long.parseLong(broadcastUri.getHost()); + return createTunnelNetwork(conn, account); + } } throw new CloudRuntimeException("Unable to support this type of network broadcast domain: " + nic.getBroadcastUri()); @@ -745,7 +774,9 @@ public abstract class CitrixResourceBase implements ServerResource { if (vmSpec.getBootloader() == BootloaderType.CD) { vm.setPVBootloader(conn, "eliloader"); Map otherConfig = vm.getOtherConfig(conn); - otherConfig.put( "install-repository", "cdrom"); + if ( ! vm.getOtherConfig(conn).containsKey("install-repository") ) { + otherConfig.put( "install-repository", "cdrom"); + } vm.setOtherConfig(conn, otherConfig); } else if (vmSpec.getBootloader() == BootloaderType.PyGrub ){ vm.setPVBootloader(conn, "pygrub"); @@ -930,16 +961,6 @@ public abstract class CitrixResourceBase implements ServerResource { } } } - if (vmSpec.getType() == VirtualMachine.Type.DomainRouter) { - // Create network usage rules for domR - NicTO[] nics = vmSpec.getNics(); - for (NicTO nic : nics) { - if(nic.getType() == TrafficType.Control){ - networkUsage(conn, nic.getIp(), "create", null); - break; - } - } - } state = State.Running; return new StartAnswer(cmd); @@ -1094,63 +1115,6 @@ public abstract class CitrixResourceBase implements ServerResource { return new SetPortForwardingRulesAnswer(cmd, results); } - protected Answer execute(final LoadBalancerCfgCommand cmd) { - Connection conn = getConnection(); - String routerIp = cmd.getRouterIp(); - - if (routerIp == null) { - return new Answer(cmd); - } - - String tmpCfgFilePath = "/tmp/" + cmd.getRouterIp().replace('.', '_') + ".cfg"; - String tmpCfgFileContents = ""; - for (int i = 0; i < cmd.getConfig().length; i++) { - tmpCfgFileContents += cmd.getConfig()[i]; - tmpCfgFileContents += "\n"; - } - - String result = callHostPlugin(conn, "vmops", "createFile", "filepath", tmpCfgFilePath, "filecontents", tmpCfgFileContents); - - if (result == null || result.isEmpty()) { - return new Answer(cmd, false, "LoadBalancerCfgCommand failed to create HA proxy cfg file."); - } - - String[] addRules = cmd.getAddFwRules(); - String[] removeRules = cmd.getRemoveFwRules(); - - String args = ""; - args += "-i " + routerIp; - args += " -f " + tmpCfgFilePath; - - StringBuilder sb = new StringBuilder(); - if (addRules.length > 0) { - for (int i = 0; i < addRules.length; i++) { - sb.append(addRules[i]).append(','); - } - - args += " -a " + sb.toString(); - } - - sb = new StringBuilder(); - if (removeRules.length > 0) { - for (int i = 0; i < removeRules.length; i++) { - sb.append(removeRules[i]).append(','); - } - - args += " -d " + sb.toString(); - } - - result = callHostPlugin(conn, "vmops", "setLoadBalancerRule", "args", args); - - if (result == null || result.isEmpty()) { - return new Answer(cmd, false, "LoadBalancerCfgCommand failed"); - } - - callHostPlugin(conn, "vmops", "deleteFile", "filepath", tmpCfgFilePath); - - return new Answer(cmd); - } - protected Answer execute(final LoadBalancerConfigCommand cmd) { Connection conn = getConnection(); String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); @@ -1316,7 +1280,7 @@ public abstract class CitrixResourceBase implements ServerResource { } protected void assignPublicIpAddress(Connection conn, final String vmName, final String privateIpAddress, final String publicIpAddress, final boolean add, final boolean firstIP, - final boolean sourceNat, final String vlanId, final String vlanGateway, final String vlanNetmask, final String vifMacAddress, String guestIp) throws InternalErrorException { + final boolean sourceNat, final String vlanId, final String vlanGateway, final String vlanNetmask, final String vifMacAddress, String guestIp, Integer networkRate) throws InternalErrorException { try { VM router = getVM(conn, vmName); @@ -1355,7 +1319,7 @@ public abstract class CitrixResourceBase implements ServerResource { nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlanId)); } nic.setDeviceId(Integer.parseInt(vifDeviceNum)); - nic.setNetworkRateMbps(200); + nic.setNetworkRateMbps(networkRate); correctVif = createVif(conn, vmName, router, nic); correctVif.plug(conn); @@ -1394,11 +1358,6 @@ public abstract class CitrixResourceBase implements ServerResource { args += " -g "; args += vlanGateway; - if(guestIp!=null){ - args += " -G "; - args += guestIp; - } - String result = callHostPlugin(conn, "vmops", "ipassoc", "args", args); if (result == null || result.isEmpty()) { throw new InternalErrorException("Xen plugin \"ipassoc\" failed."); @@ -1448,7 +1407,7 @@ public abstract class CitrixResourceBase implements ServerResource { for (IpAddressTO ip : ips) { assignPublicIpAddress(conn, routerName, routerIp, ip.getPublicIp(), ip.isAdd(), ip.isFirstIP(), ip.isSourceNat(), ip.getVlanId(), - ip.getVlanGateway(), ip.getVlanNetmask(), ip.getVifMacAddress(), ip.getGuestIp()); + ip.getVlanGateway(), ip.getVlanNetmask(), ip.getVifMacAddress(), ip.getGuestIp(), ip.getNetworkRate()); results[i++] = ip.getPublicIp() + " - success"; } } catch (InternalErrorException e) { @@ -2670,25 +2629,49 @@ public abstract class CitrixResourceBase implements ServerResource { vm.setMemoryDynamicMax(conn, memsize); vm.setMemoryStaticMax(conn, memsize); } - - void shutdownVM(Connection conn, VM vm, String vmName) throws XmlRpcException { - try { - vm.cleanShutdown(conn); - } catch (Types.XenAPIException e) { - s_logger.debug("Unable to cleanShutdown VM(" + vmName + ") on host(" + _host.uuid +") due to " + e.toString() + ", try hard shutdown"); + + private void waitForTask(Connection c, Task task, long pollInterval, long timeout) throws XenAPIException, XmlRpcException { + long beginTime = System.currentTimeMillis(); + while (task.getStatus(c) == Types.TaskStatusType.PENDING) { try { - vm.hardShutdown(conn); - } catch (Exception e1) { - String msg = "Unable to hardShutdown VM(" + vmName + ") on host(" + _host.uuid +") due to " + e.toString(); - s_logger.warn(msg, e1); - throw new CloudRuntimeException(msg); + Thread.sleep(pollInterval); + } catch (InterruptedException e) { + } + if( System.currentTimeMillis() - beginTime > timeout){ + String msg = "Async " + timeout/100 + " seconds timeout for task " + task.toString(); + s_logger.warn(msg); + task.cancel(c); + throw new Types.BadAsyncResult(msg); } } } + private void checkForSuccess(Connection c, Task task) throws XenAPIException, XmlRpcException { + if (task.getStatus(c) == Types.TaskStatusType.SUCCESS) { + return; + } else { + String msg = "Task failed! Task record:\n" + task.getRecord(c); + s_logger.warn(msg); + task.cancel(c); + throw new Types.BadAsyncResult(msg); + } + } + void rebootVM(Connection conn, VM vm, String vmName) throws XmlRpcException { + Task task = null; try { - vm.cleanReboot(conn); + task = vm.cleanRebootAsync(conn); + try { + //poll every 1 seconds , timeout after 10 minutes + waitForTask(conn, task, 1000, 10 * 60 * 1000); + checkForSuccess(conn, task); + } catch (Types.HandleInvalid e) { + if (vm.getPowerState(conn) == Types.VmPowerState.RUNNING) { + task = null; + return; + } + throw new CloudRuntimeException("Reboot VM catch HandleInvalid and VM is not in RUNNING state"); + } } catch (XenAPIException e) { s_logger.debug("Unable to Clean Reboot VM(" + vmName + ") on host(" + _host.uuid +") due to " + e.toString() + ", try hard reboot"); try { @@ -2698,26 +2681,196 @@ public abstract class CitrixResourceBase implements ServerResource { s_logger.warn(msg, e1); throw new CloudRuntimeException(msg); } + }finally { + if( task != null) { + try { + task.destroy(conn); + } catch (Exception e1) { + s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid +") due to " + e1.toString()); + } + } + } + } + + void shutdownVM(Connection conn, VM vm, String vmName) throws XmlRpcException { + Task task = null; + try { + task = vm.cleanShutdownAsync(conn); + try { + //poll every 1 seconds , timeout after 10 minutes + waitForTask(conn, task, 1000, 10 * 60 * 1000); + checkForSuccess(conn, task); + } catch (Types.HandleInvalid e) { + if (vm.getPowerState(conn) == Types.VmPowerState.HALTED) { + task = null; + return; + } + throw new CloudRuntimeException("Shutdown VM catch HandleInvalid and VM is not in HALTED state"); + } + } catch (XenAPIException e) { + s_logger.debug("Unable to cleanShutdown VM(" + vmName + ") on host(" + _host.uuid +") due to " + e.toString()); + try { + vm.hardShutdown(conn); + return; + } catch (Exception e1) { + String msg = "Unable to hardShutdown VM(" + vmName + ") on host(" + _host.uuid +") due to " + e.toString(); + s_logger.warn(msg, e1); + throw new CloudRuntimeException(msg); + } + }finally { + if( task != null) { + try { + task.destroy(conn); + } catch (Exception e1) { + s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid +") due to " + e1.toString()); + } + } } } void startVM(Connection conn, Host host, VM vm, String vmName) throws XmlRpcException { + Task task = null; try { - vm.startOn(conn, host, false, true); - } catch (Exception e) { + task = vm.startOnAsync(conn, host, false, true); + try { + //poll every 1 seconds , timeout after 10 minutes + waitForTask(conn, task, 1000, 10 * 60 * 1000); + checkForSuccess(conn, task); + } catch (Types.HandleInvalid e) { + if (vm.getPowerState(conn) == Types.VmPowerState.RUNNING) { + task = null; + return; + } + throw new CloudRuntimeException("Shutdown VM catch HandleInvalid and VM is not in RUNNING state"); + } + } catch (XenAPIException e) { String msg = "Unable to start VM(" + vmName + ") on host(" + _host.uuid +") due to " + e.toString(); s_logger.warn(msg, e); throw new CloudRuntimeException(msg); + }finally { + if( task != null) { + try { + task.destroy(conn); + } catch (Exception e1) { + s_logger.debug("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid +") due to " + e1.toString()); + } + } } } - + + protected VDI cloudVDIcopy(Connection conn, VDI vdi, SR sr) throws XenAPIException, XmlRpcException { + Task task = null; + try { + task = vdi.copyAsync(conn, sr); + // poll every 5 seconds , timeout after 2 hours + waitForTask(conn, task, 5 * 1000, 2 * 60 * 60 * 1000); + checkForSuccess(conn, task); + VDI dvdi = Types.toVDI(task, conn); + return dvdi; + } finally { + if (task != null) { + try { + task.destroy(conn); + } catch (Exception e1) { + s_logger.warn("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to " + + e1.toString()); + } + } + } + } + + protected String backupSnapshot(Connection conn, String primaryStorageSRUuid, Long dcId, Long accountId, + Long volumeId, String secondaryStorageMountPath, String snapshotUuid, String prevBackupUuid, Boolean isISCSI) { + String backupSnapshotUuid = null; + + if (prevBackupUuid == null) { + prevBackupUuid = ""; + } + + // Each argument is put in a separate line for readability. + // Using more lines does not harm the environment. + String results = callHostPluginAsync(conn, "vmopsSnapshot", "backupSnapshot", 60 * 60 * 1000, + "primaryStorageSRUuid", primaryStorageSRUuid, "dcId", dcId.toString(), "accountId", accountId + .toString(), "volumeId", volumeId.toString(), "secondaryStorageMountPath", + secondaryStorageMountPath, "snapshotUuid", snapshotUuid, "prevBackupUuid", prevBackupUuid, "isISCSI", + isISCSI.toString()); + + if (results == null || results.isEmpty()) { + // errString is already logged. + return null; + } + + String[] tmp = results.split("#"); + String status = tmp[0]; + backupSnapshotUuid = tmp[1]; + + // status == "1" if and only if backupSnapshotUuid != null + // So we don't rely on status value but return backupSnapshotUuid as an + // indicator of success. + String failureString = "Could not copy backupUuid: " + backupSnapshotUuid + " of volumeId: " + volumeId + + " from primary storage " + primaryStorageSRUuid + " to secondary storage " + + secondaryStorageMountPath; + if (status != null && status.equalsIgnoreCase("1") && backupSnapshotUuid != null) { + s_logger.debug("Successfully copied backupUuid: " + backupSnapshotUuid + " of volumeId: " + volumeId + + " to secondary storage"); + } else { + s_logger.debug(failureString + ". Failed with status: " + status); + return null; + } + return backupSnapshotUuid; + } + + protected String callHostPluginAsync(Connection conn, String plugin, String cmd, int timeout, String... params) { + Map args = new HashMap(); + Task task = null; + try { + for (int i = 0; i < params.length; i += 2) { + args.put(params[i], params[i + 1]); + } + if (s_logger.isTraceEnabled()) { + s_logger.trace("callHostPlugin executing for command " + cmd + " with " + getArgsString(args)); + } + Host host = Host.getByUuid(conn, _host.uuid); + task = host.callPluginAsync(conn, plugin, cmd, args); + // poll every 60 seconds + waitForTask(conn, task, 20 * 1000, timeout); + checkForSuccess(conn, task); + String result = task.getResult(conn); + if (s_logger.isTraceEnabled()) { + s_logger.trace("callHostPlugin Result: " + result); + } + return result.replace("", "").replace("", "").replace("\n", ""); + } catch (Types.HandleInvalid e) { + s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + + " due to HandleInvalid clazz:" + e.clazz + ", handle:" + e.handle); + } catch (XenAPIException e) { + s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + + e.toString(), e); + } catch (XmlRpcException e) { + s_logger.warn("callHostPlugin failed for cmd: " + cmd + " with args " + getArgsString(args) + " due to " + + e.getMessage(), e); + } finally { + if (task != null) { + try { + task.destroy(conn); + } catch (Exception e1) { + s_logger.warn("unable to destroy task(" + task.toString() + ") on host(" + _host.uuid + ") due to " + + e1.toString()); + } + } + } + return null; + } + protected StopAnswer execute(final StopCommand cmd) { Connection conn = getConnection(); String vmName = cmd.getVmName(); try { Set vms = VM.getByNameLabel(conn, vmName); // stop vm which is running on this host or is in halted state - for (VM vm : vms) { + Iterator iter = vms.iterator(); + while ( iter.hasNext() ) { + VM vm = iter.next(); VM.Record vmr = vm.getRecord(conn); if (vmr.powerState != VmPowerState.RUNNING) { continue; @@ -2728,7 +2881,7 @@ public abstract class CitrixResourceBase implements ServerResource { if (vmr.residentOn.getUuid(conn).equals(_host.uuid)) { continue; } - vms.remove(vm); + iter.remove(); } if (vms.size() == 0) { @@ -3846,6 +3999,52 @@ public abstract class CitrixResourceBase implements ServerResource { return Boolean.valueOf(callHostPlugin(conn, "vmops", "can_bridge_firewall", "host_uuid", _host.uuid)); } + private Answer execute(OvsDestroyTunnelCommand cmd) { + Connection conn = getConnection(); + try { + Network nw = createTunnelNetwork(conn, cmd.getAccount()); + if (nw == null) { + return new Answer(cmd, false, "No network found"); + } + + String bridge = nw.getBridge(conn); + String result = callHostPlugin(conn, "ovstunnel", "destroy_tunnel", "bridge", bridge, "in_port", cmd.getInPortName()); + if (result.equalsIgnoreCase("SUCCESS")) { + return new Answer(cmd, true, result); + } else { + return new Answer(cmd, false, result); + } + } catch (Exception e) { + s_logger.warn("caught execption when destroy ovs tunnel", e); + return new Answer(cmd, false, e.getMessage()); + } + } + + private OvsCreateTunnelAnswer execute(OvsCreateTunnelCommand cmd) { + Connection conn = getConnection(); + String bridge = "unknown"; + try { + Network nw = createTunnelNetwork(conn, cmd.getAccount()); + if (nw == null) { + return new OvsCreateTunnelAnswer(cmd, false, "Cannot create network", bridge); + } + + bridge = nw.getBridge(conn); + String result = callHostPlugin(conn, "ovstunnel", "create_tunnel", "bridge", bridge, "remote_ip", cmd.getRemoteIp(), "key", cmd.getKey(), "from", cmd.getFrom().toString(), "to", cmd + .getTo().toString()); + + String[] res = result.split(":"); + if (res.length == 2 && res[0].equalsIgnoreCase("SUCCESS")) { + return new OvsCreateTunnelAnswer(cmd, true, result, res[1], bridge); + } else { + return new OvsCreateTunnelAnswer(cmd, false, result, bridge); + } + } catch (Exception e) { + s_logger.warn("caught execption when creating ovs tunnel", e); + return new OvsCreateTunnelAnswer(cmd, false, e.getMessage(), bridge); + } + } + private Answer execute(OvsDeleteFlowCommand cmd) { _isOvs = true; @@ -3983,15 +4182,14 @@ public abstract class CitrixResourceBase implements ServerResource { protected Answer execute(DeleteStoragePoolCommand cmd) { Connection conn = getConnection(); - StoragePoolVO pool = cmd.getPool(); - StorageFilerTO poolTO = new StorageFilerTO(pool); + StorageFilerTO poolTO = cmd.getPool(); try { SR sr = getStorageRepository(conn, poolTO); removeSR(conn, sr); Answer answer = new Answer(cmd, true, "success"); return answer; } catch (Exception e) { - String msg = "DeleteStoragePoolCommand XenAPIException:" + e.getMessage() + " host:" + _host.uuid + " pool: " + pool.getName() + pool.getHostAddress() + pool.getPath(); + String msg = "DeleteStoragePoolCommand XenAPIException:" + e.getMessage() + " host:" + _host.uuid + " pool: " + poolTO.getHost() + poolTO.getPath(); s_logger.warn(msg, e); return new Answer(cmd, false, msg); } @@ -4553,30 +4751,10 @@ public abstract class CitrixResourceBase implements ServerResource { return new Answer(cmd, true, "Success"); } - public ShareAnswer execute(final ShareCommand cmd) { - Connection conn = getConnection(); - if (!cmd.isShare()) { - SR sr = getISOSRbyVmName(conn, cmd.getVmName()); - try { - if (sr != null) { - Set vms = VM.getByNameLabel(conn, cmd.getVmName()); - if (vms.size() == 0) { - removeSR(conn, sr); - } - } - } catch (Exception e) { - String msg = "SR.getNameLabel failed due to " + e.getMessage() + e.toString(); - s_logger.warn(msg); - } - } - return new ShareAnswer(cmd, new HashMap()); - } - public CopyVolumeAnswer execute(final CopyVolumeCommand cmd) { Connection conn = getConnection(); String volumeUUID = cmd.getVolumePath(); - StoragePoolVO pool = cmd.getPool(); - StorageFilerTO poolTO = new StorageFilerTO(pool); + StorageFilerTO poolTO = cmd.getPool(); String secondaryStorageURL = cmd.getSecondaryStorageURL(); URI uri = null; @@ -5099,10 +5277,12 @@ public abstract class CitrixResourceBase implements ServerResource { String secondaryStoragePoolURL = cmd.getSecondaryStoragePoolURL(); String snapshotUuid = cmd.getSnapshotUuid(); // not null: Precondition. String prevBackupUuid = cmd.getPrevBackupUuid(); + String prevSnapshotUuid = cmd.getPrevSnapshotUuid(); // By default assume failure String details = null; boolean success = false; String snapshotBackupUuid = null; + boolean fullbackup = true; try { SR primaryStorageSR = getSRByNameLabelandHost(conn, primaryStorageNameLabel); if (primaryStorageSR == null) { @@ -5111,22 +5291,30 @@ public abstract class CitrixResourceBase implements ServerResource { URI uri = new URI(secondaryStoragePoolURL); String secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath(); - + VDI snapshotVdi = getVDIbyUuid(conn, snapshotUuid); - if (prevBackupUuid == null) { + if ( prevBackupUuid != null ) { + try { + VDI preSnapshotVdi = getVDIbyUuid(conn, prevSnapshotUuid); + if ( snapshotVdi.getParent(conn).getParent(conn) == preSnapshotVdi.getParent(conn) ) { + fullbackup = false; + } + } catch (Exception e) { + } + } + + if (fullbackup) { // the first snapshot is always a full snapshot String folder = "snapshots/" + accountId + "/" + volumeId; if( !createSecondaryStorageFolder(conn, secondaryStorageMountPath, folder)) { details = " Filed to create folder " + folder + " in secondary storage"; s_logger.warn(details); - return new BackupSnapshotAnswer(cmd, success, details, snapshotBackupUuid); + return new BackupSnapshotAnswer(cmd, false, details, null, false); } - String snapshotMountpoint = secondaryStoragePoolURL + "/" + folder; SR snapshotSr = null; try { snapshotSr = createNfsSRbyURI(conn, new URI(snapshotMountpoint), false); - VDI snapshotVdi = getVDIbyUuid(conn, snapshotUuid); VDI backedVdi = cloudVDIcopy(conn, snapshotVdi, snapshotSr); snapshotBackupUuid = backedVdi.getUuid(conn); success = true; @@ -5136,21 +5324,16 @@ public abstract class CitrixResourceBase implements ServerResource { } } } else { - String primaryStorageSRUuid = primaryStorageSR.getUuid(conn); - Boolean isISCSI = IsISCSI(primaryStorageSR.getType(conn)); - snapshotBackupUuid = backupSnapshot(conn, primaryStorageSRUuid, dcId, accountId, volumeId, secondaryStorageMountPath, - snapshotUuid, prevBackupUuid, isISCSI); - success = (snapshotBackupUuid != null); + String primaryStorageSRUuid = primaryStorageSR.getUuid(conn); + Boolean isISCSI = IsISCSI(primaryStorageSR.getType(conn)); + snapshotBackupUuid = backupSnapshot(conn, primaryStorageSRUuid, dcId, accountId, volumeId, secondaryStorageMountPath, snapshotUuid, prevBackupUuid, isISCSI); + success = (snapshotBackupUuid != null); } - if (success) { details = "Successfully backedUp the snapshotUuid: " + snapshotUuid + " to secondary storage."; - String volumeUuid = cmd.getVolumePath(); destroySnapshotOnPrimaryStorageExceptThis(conn, volumeUuid, snapshotUuid); - } - } catch (XenAPIException e) { details = "BackupSnapshot Failed due to " + e.toString(); s_logger.warn(details, e); @@ -5159,7 +5342,7 @@ public abstract class CitrixResourceBase implements ServerResource { s_logger.warn(details, e); } - return new BackupSnapshotAnswer(cmd, success, details, snapshotBackupUuid); + return new BackupSnapshotAnswer(cmd, success, details, snapshotBackupUuid, fullbackup); } protected CreateVolumeFromSnapshotAnswer execute(final CreateVolumeFromSnapshotCommand cmd) { @@ -5254,7 +5437,7 @@ public abstract class CitrixResourceBase implements ServerResource { } } } - return new DeleteSnapshotBackupAnswer(cmd, success, details); + return new DeleteSnapshotBackupAnswer(cmd, true, details); } protected Answer execute(DeleteSnapshotsDirCommand cmd) { @@ -5505,48 +5688,7 @@ public abstract class CitrixResourceBase implements ServerResource { } return success; - } - - // Each argument is put in a separate line for readability. - // Using more lines does not harm the environment. - protected String backupSnapshot(Connection conn, String primaryStorageSRUuid, Long dcId, Long accountId, Long volumeId, String secondaryStorageMountPath, - String snapshotUuid, String prevBackupUuid, Boolean isISCSI) { - String backupSnapshotUuid = null; - - if (prevBackupUuid == null) { - prevBackupUuid = ""; - } - - // Each argument is put in a separate line for readability. - // Using more lines does not harm the environment. - String results = callHostPluginWithTimeOut(conn, "vmopsSnapshot", "backupSnapshot", 110*60, "primaryStorageSRUuid", primaryStorageSRUuid, "dcId", - dcId.toString(), "accountId", accountId.toString(), "volumeId", volumeId.toString(), "secondaryStorageMountPath", - secondaryStorageMountPath, "snapshotUuid", snapshotUuid, "prevBackupUuid", prevBackupUuid, "isISCSI", isISCSI.toString()); - - if (results == null || results.isEmpty()) { - // errString is already logged. - return null; - } - - String[] tmp = results.split("#"); - String status = tmp[0]; - backupSnapshotUuid = tmp[1]; - - // status == "1" if and only if backupSnapshotUuid != null - // So we don't rely on status value but return backupSnapshotUuid as an - // indicator of success. - String failureString = "Could not copy backupUuid: " + backupSnapshotUuid + " of volumeId: " + volumeId + " from primary storage " + primaryStorageSRUuid - + " to secondary storage " + secondaryStorageMountPath; - if (status != null && status.equalsIgnoreCase("1") && backupSnapshotUuid != null) { - s_logger.debug("Successfully copied backupUuid: " + backupSnapshotUuid + " of volumeId: " + volumeId + " to secondary storage"); - } else { - s_logger.debug(failureString + ". Failed with status: " + status); - return null; - } - - return backupSnapshotUuid; - } - + } protected String getVhdParent(Connection conn, String primaryStorageSRUuid, String snapshotUuid, Boolean isISCSI) { String parentUuid = callHostPlugin(conn, "vmopsSnapshot", "getVhdParent", "primaryStorageSRUuid", primaryStorageSRUuid, @@ -5745,4 +5887,17 @@ public abstract class CitrixResourceBase implements ServerResource { protected String getGuestOsType(String stdType, boolean bootFromCD) { return stdType; } + + private Answer execute(NetworkRulesSystemVmCommand cmd) { + boolean success = true; + Connection conn = getConnection(); + if (cmd.getType() != VirtualMachine.Type.User) { + String result = callHostPlugin(conn, "vmops", "default_network_rules_systemvm", "vmName", cmd.getVmName()); + if (result == null || result.isEmpty() || !Boolean.parseBoolean(result)) { + success = false; + } + } + + return new Answer(cmd, success, ""); + } } diff --git a/core/src/com/cloud/network/NetworkEnums.java b/core/src/com/cloud/network/NetworkEnums.java deleted file mode 100644 index 100507d30f8..00000000000 --- a/core/src/com/cloud/network/NetworkEnums.java +++ /dev/null @@ -1,32 +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; - -/** - * @author chiradeep - * - */ -public class NetworkEnums { - public enum RouterPrivateIpStrategy { - None, - DcGlobal, //global to data center - HostLocal; - - public static String DummyPrivateIp = "169.254.1.1"; - } -} diff --git a/core/src/com/cloud/storage/VMTemplateHostVO.java b/core/src/com/cloud/storage/VMTemplateHostVO.java index 77cbe8d8dd7..9b558c63a0e 100755 --- a/core/src/com/cloud/storage/VMTemplateHostVO.java +++ b/core/src/com/cloud/storage/VMTemplateHostVO.java @@ -18,19 +18,19 @@ package com.cloud.storage; -import java.util.Date; - -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 javax.persistence.Temporal; -import javax.persistence.TemporalType; - +import java.util.Date; + +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 javax.persistence.Temporal; +import javax.persistence.TemporalType; + import com.cloud.utils.db.GenericDaoBase; /** @@ -95,7 +95,8 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc { @Column(name="destroyed") boolean destroyed = false; - public String getInstallPath() { + @Override + public String getInstallPath() { return installPath; } @@ -107,47 +108,58 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc { this.hostId = hostId; } - public long getTemplateId() { + @Override + public long getTemplateId() { return templateId; } - public void setTemplateId(long templateId) { + @Override + public void setTemplateId(long templateId) { this.templateId = templateId; } - public int getDownloadPercent() { + @Override + public int getDownloadPercent() { return downloadPercent; } - public void setDownloadPercent(int downloadPercent) { + @Override + public void setDownloadPercent(int downloadPercent) { this.downloadPercent = downloadPercent; } - public void setDownloadState(Status downloadState) { + @Override + public void setDownloadState(Status downloadState) { this.downloadState = downloadState; } - public Long getId() { + @Override + public long getId() { return id; } - public Date getCreated() { + @Override + public Date getCreated() { return created; } - public Date getLastUpdated() { + @Override + public Date getLastUpdated() { return lastUpdated; } - public void setLastUpdated(Date date) { + @Override + public void setLastUpdated(Date date) { lastUpdated = date; } - public void setInstallPath(String installPath) { + @Override + public void setInstallPath(String installPath) { this.installPath = installPath; } - public Status getDownloadState() { + @Override + public Status getDownloadState() { return downloadState; } @@ -178,27 +190,33 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc { } - public void setLocalDownloadPath(String localPath) { + @Override + public void setLocalDownloadPath(String localPath) { this.localDownloadPath = localPath; } - public String getLocalDownloadPath() { + @Override + public String getLocalDownloadPath() { return localDownloadPath; } - public void setErrorString(String errorString) { + @Override + public void setErrorString(String errorString) { this.errorString = errorString; } - public String getErrorString() { + @Override + public String getErrorString() { return errorString; } - public void setJobId(String jobId) { + @Override + public void setJobId(String jobId) { this.jobId = jobId; } - public String getJobId() { + @Override + public String getJobId() { return jobId; } @@ -274,5 +292,10 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc { public boolean isCopy() { return isCopy; } + + @Override + public long getTemplateSize() { + return -1; + } } diff --git a/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java b/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java index 3044e716286..cd4894624d9 100644 --- a/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java +++ b/core/src/com/cloud/storage/VMTemplateStoragePoolVO.java @@ -18,19 +18,19 @@ package com.cloud.storage; -import java.util.Date; - -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 javax.persistence.Temporal; -import javax.persistence.TemporalType; - +import java.util.Date; + +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 javax.persistence.Temporal; +import javax.persistence.TemporalType; + import com.cloud.utils.db.GenericDaoBase; /** @@ -43,7 +43,7 @@ import com.cloud.utils.db.GenericDaoBase; public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) - Long id; + long id; @Column(name="pool_id") private long poolId; @@ -72,11 +72,13 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc{ @Column (name="marked_for_gc") boolean markedForGC; - public String getInstallPath() { + @Override + public String getInstallPath() { return installPath; } - public long getTemplateSize() { + @Override + public long getTemplateSize() { return templateSize; } @@ -88,47 +90,58 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc{ this.poolId = poolId; } - public long getTemplateId() { + @Override + public long getTemplateId() { return templateId; } - public void setTemplateId(long templateId) { + @Override + public void setTemplateId(long templateId) { this.templateId = templateId; } - public int getDownloadPercent() { + @Override + public int getDownloadPercent() { return downloadPercent; } - public void setDownloadPercent(int downloadPercent) { + @Override + public void setDownloadPercent(int downloadPercent) { this.downloadPercent = downloadPercent; } - public void setDownloadState(Status downloadState) { + @Override + public void setDownloadState(Status downloadState) { this.downloadState = downloadState; } - public Long getId() { + @Override + public long getId() { return id; } - public Date getCreated() { + @Override + public Date getCreated() { return created; } - public Date getLastUpdated() { + @Override + public Date getLastUpdated() { return lastUpdated; } - public void setLastUpdated(Date date) { + @Override + public void setLastUpdated(Date date) { lastUpdated = date; } - public void setInstallPath(String installPath) { + @Override + public void setInstallPath(String installPath) { this.installPath = installPath; } - public Status getDownloadState() { + @Override + public Status getDownloadState() { return downloadState; } @@ -161,27 +174,33 @@ public class VMTemplateStoragePoolVO implements VMTemplateStorageResourceAssoc{ } - public void setLocalDownloadPath(String localPath) { + @Override + public void setLocalDownloadPath(String localPath) { this.localDownloadPath = localPath; } - public String getLocalDownloadPath() { + @Override + public String getLocalDownloadPath() { return localDownloadPath; } - public void setErrorString(String errorString) { + @Override + public void setErrorString(String errorString) { this.errorString = errorString; } - public String getErrorString() { + @Override + public String getErrorString() { return errorString; } - public void setJobId(String jobId) { + @Override + public void setJobId(String jobId) { this.jobId = jobId; } - public String getJobId() { + @Override + public String getJobId() { return jobId; } diff --git a/core/src/com/cloud/storage/VolumeVO.java b/core/src/com/cloud/storage/VolumeVO.java index ceebc5e036f..19204ff446d 100755 --- a/core/src/com/cloud/storage/VolumeVO.java +++ b/core/src/com/cloud/storage/VolumeVO.java @@ -84,9 +84,6 @@ public class VolumeVO implements Volume { @Column(name="pod_id") Long podId; - @Column(name="destroyed") - boolean destroyed = false; - @Column(name="created") Date created; @@ -104,10 +101,6 @@ public class VolumeVO implements Volume { @Column(name="disk_offering_id") long diskOfferingId; - @Expose - @Column(name="mirror_vol") - Long mirrorVolume; - @Column(name="template_id") Long templateId; @@ -119,11 +112,6 @@ public class VolumeVO implements Volume { @Enumerated(EnumType.STRING) VolumeType volumeType = Volume.VolumeType.UNKNOWN; - @Expose - @Column(name="mirror_state") - @Enumerated(EnumType.STRING) - MirrorState mirrorState = Volume.MirrorState.NOT_MIRRORED; - @Expose @Column(name="pool_type") @Enumerated(EnumType.STRING) @@ -185,8 +173,6 @@ public class VolumeVO implements Volume { this.size = size; this.status = AsyncInstanceCreateStatus.Creating; this.templateId = null; - this.mirrorState = MirrorState.NOT_MIRRORED; - this.mirrorVolume = null; this.storageResourceType = Storage.StorageResourceType.STORAGE_POOL; this.poolType = null; } @@ -199,8 +185,6 @@ public class VolumeVO implements Volume { this.accountId = accountId; this.domainId = domainId; this.size = size; - this.mirrorVolume = null; - this.mirrorState = MirrorState.NOT_MIRRORED; this.diskOfferingId = diskOfferingId; this.status = AsyncInstanceCreateStatus.Creating; this.state = State.Allocated; @@ -319,7 +303,8 @@ public class VolumeVO implements Volume { return instanceId; } - public Long getDeviceId() { + @Override + public Long getDeviceId() { return deviceId; } @@ -380,18 +365,11 @@ public class VolumeVO implements Volume { volumeType = type; } - public boolean getDestroyed() { - return destroyed; - } - - public Date getCreated() { + @Override + public Date getCreated() { return created; } - public void setDestroyed(boolean destroyed) { - this.destroyed = destroyed; - } - public Date getRemoved() { return removed; } @@ -400,15 +378,8 @@ public class VolumeVO implements Volume { this.removed = removed; } - public MirrorState getMirrorState() { - return mirrorState; - } - - public void setMirrorState(MirrorState mirrorState) { - this.mirrorState = mirrorState; - } - - public long getDiskOfferingId() { + @Override + public long getDiskOfferingId() { return diskOfferingId; } @@ -433,14 +404,6 @@ public class VolumeVO implements Volume { this.firstSnapshotBackupUuid = firstSnapshotBackupUuid; } - public Long getMirrorVolume() { - return mirrorVolume; - } - - public void setMirrorVolume(Long mirrorVolume) { - this.mirrorVolume = mirrorVolume; - } - @Override public Storage.StorageResourceType getStorageResourceType() { return storageResourceType; @@ -459,6 +422,7 @@ public class VolumeVO implements Volume { this.poolId = poolId; } + @Override public AsyncInstanceCreateStatus getStatus() { return status; } diff --git a/core/src/com/cloud/storage/resource/StoragePoolResource.java b/core/src/com/cloud/storage/resource/StoragePoolResource.java index 7178607b113..9979b787217 100644 --- a/core/src/com/cloud/storage/resource/StoragePoolResource.java +++ b/core/src/com/cloud/storage/resource/StoragePoolResource.java @@ -23,10 +23,8 @@ import com.cloud.agent.api.storage.CopyVolumeCommand; import com.cloud.agent.api.storage.CreateAnswer; import com.cloud.agent.api.storage.CreateCommand; import com.cloud.agent.api.storage.DestroyCommand; -import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer; -import com.cloud.agent.api.storage.ShareAnswer; -import com.cloud.agent.api.storage.ShareCommand; +import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; public interface StoragePoolResource { // FIXME: Should have a PrimaryStorageDownloadAnswer @@ -35,8 +33,6 @@ public interface StoragePoolResource { // FIXME: Should have an DestroyAnswer Answer execute(DestroyCommand cmd); - ShareAnswer execute(ShareCommand cmd); - CopyVolumeAnswer execute(CopyVolumeCommand cmd); CreateAnswer execute(CreateCommand cmd); diff --git a/core/src/com/cloud/vm/ConsoleProxyVO.java b/core/src/com/cloud/vm/ConsoleProxyVO.java index e863cb2d233..148ab090590 100644 --- a/core/src/com/cloud/vm/ConsoleProxyVO.java +++ b/core/src/com/cloud/vm/ConsoleProxyVO.java @@ -41,24 +41,6 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; @DiscriminatorValue(value="ConsoleProxy") public class ConsoleProxyVO extends VMInstanceVO implements ConsoleProxy { - @Column(name="gateway", nullable=false) - private String gateway; - - @Column(name="dns1") - private String dns1; - - @Column(name="dns2") - private String dns2; - - @Column(name="guest_mac_address") - private String guestMacAddress; - - @Column(name="guest_ip_address") - private String guestIpAddress; - - @Column(name="guest_netmask") - private String guestNetmask; - @Column(name="public_ip_address", nullable=false) private String publicIpAddress; @@ -68,15 +50,6 @@ public class ConsoleProxyVO extends VMInstanceVO implements ConsoleProxy { @Column(name="public_netmask", nullable=false) private String publicNetmask; - @Column(name="vlan_db_id") - private Long vlanDbId; - - @Column(name="vlan_id") - private String vlanId; - - @Column(name="domain", nullable=false) - private String domain; - @Column(name="ram_size", updatable=false, nullable=false) private int ramSize; @@ -108,22 +81,6 @@ public class ConsoleProxyVO extends VMInstanceVO implements ConsoleProxy { super(); } - public void setGateway(String gateway) { - this.gateway = gateway; - } - - public void setDns1(String dns1) { - this.dns1 = dns1; - } - - public void setDns2(String dns2) { - this.dns2 = dns2; - } - - public void setDomain(String domain) { - this.domain = domain; - } - public void setPublicIpAddress(String publicIpAddress) { this.publicIpAddress = publicIpAddress; } @@ -136,18 +93,6 @@ public class ConsoleProxyVO extends VMInstanceVO implements ConsoleProxy { this.publicMacAddress = publicMacAddress; } - public void setGuestIpAddress(String guestIpAddress) { - this.guestIpAddress = guestIpAddress; - } - - public void setGuestNetmask(String guestNetmask) { - this.guestNetmask = guestNetmask; - } - - public void setGuestMacAddress(String guestMacAddress) { - this.guestMacAddress = guestMacAddress; - } - public void setRamSize(int ramSize) { this.ramSize = ramSize; } @@ -164,21 +109,6 @@ public class ConsoleProxyVO extends VMInstanceVO implements ConsoleProxy { this.sessionDetails = details; } - @Override - public String getGateway() { - return this.gateway; - } - - @Override - public String getDns1() { - return this.dns1; - } - - @Override - public String getDns2() { - return this.dns2; - } - @Override public String getPublicIpAddress() { return this.publicIpAddress; @@ -193,37 +123,7 @@ public class ConsoleProxyVO extends VMInstanceVO implements ConsoleProxy { public String getPublicMacAddress() { return this.publicMacAddress; } - - - public String getGuestIpAddress() { - return this.guestIpAddress; - } - - - public String getGuestNetmask() { - return this.guestNetmask; - } - - - public String getGuestMacAddress() { - return this.guestMacAddress; - } - @Override - public Long getVlanDbId() { - return vlanDbId; - } - - @Override - public String getVlanId() { - return vlanId; - } - - @Override - public String getDomain() { - return this.domain; - } - @Override public int getRamSize() { return this.ramSize; diff --git a/core/src/com/cloud/vm/DomainRouterVO.java b/core/src/com/cloud/vm/DomainRouterVO.java index 9137cb860ec..241410e11b4 100755 --- a/core/src/com/cloud/vm/DomainRouterVO.java +++ b/core/src/com/cloud/vm/DomainRouterVO.java @@ -28,7 +28,6 @@ import javax.persistence.Table; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.router.VirtualRouter; -import com.cloud.utils.net.NetUtils; /** * VirtualMachineRouterVO implements all the fields stored for a domain router. @@ -41,9 +40,6 @@ public class DomainRouterVO extends VMInstanceVO implements VirtualRouter { @Column(name="ram_size", nullable=false) private int ramSize; - @Column(name="gateway") - private String gateway; - @Column(name="public_ip_address") private String publicIpAddress; @@ -53,12 +49,6 @@ public class DomainRouterVO extends VMInstanceVO implements VirtualRouter { @Column(name="public_netmask") private String publicNetmask; - @Column(name="vlan_db_id") - private Long vlanDbId; - - @Column(name="vlan_id") - private String vlanId; - @Column(name="guest_mac_address") private String guestMacAddress; @@ -68,24 +58,9 @@ public class DomainRouterVO extends VMInstanceVO implements VirtualRouter { @Column(name="guest_netmask") private String guestNetmask; - @Column(name="dns1") - private String dns1; - - @Column(name="dns2") - private String dns2; - @Column(name="domain", nullable=false) private String domain; - @Column(name="vnet") - private String vnet; - - @Column(name="dc_vlan") - private String zoneVlan; - - @Column(name="guest_dc_mac_address") - private String guestZoneMacAddress; - @Column(name="network_id") long networkId; @@ -109,10 +84,6 @@ public class DomainRouterVO extends VMInstanceVO implements VirtualRouter { this.domain = networkDomain; } - public void setGateway(String gateway) { - this.gateway = gateway; - } - public void setPublicIpAddress(String publicIpAddress) { this.publicIpAddress = publicIpAddress; } @@ -142,27 +113,10 @@ public class DomainRouterVO extends VMInstanceVO implements VirtualRouter { this.guestIpAddress = routerIpAddress; } - public void setDns1(String dns1) { - this.dns1 = dns1; - } - - public void setDns2(String dns2) { - this.dns2 = dns2; - } - public void setDomain(String domain) { this.domain = domain; } - public void setVnet(String vnet) { - this.vnet = vnet; - } - - @Override - public String getVnet() { - return vnet; - } - @Override public long getDataCenterId() { return dataCenterId; @@ -187,16 +141,6 @@ public class DomainRouterVO extends VMInstanceVO implements VirtualRouter { super(); } - @Override - public String getDns1() { - return dns1; - } - - @Override - public String getDns2() { - return dns2; - } - @Override public String getDomain() { return domain; @@ -212,34 +156,16 @@ public class DomainRouterVO extends VMInstanceVO implements VirtualRouter { this.ramSize = ramSize; } - @Override - public String getGateway() { - return gateway; - } - @Override public String getPublicIpAddress() { return publicIpAddress; } - @Override - public String getVlanId() { - return vlanId; - } - @Override public String getGuestMacAddress() { return guestMacAddress; } - public void setVlanDbId(Long vlanDbId) { - this.vlanDbId = vlanDbId; - } - - public Long getVlanDbId() { - return vlanDbId; - } - @Override public Role getRole() { return role; @@ -249,33 +175,6 @@ public class DomainRouterVO extends VMInstanceVO implements VirtualRouter { this.role = role; } - @Override - public String[] getDhcpRange() { - if (guestIpAddress != null && guestNetmask != null) { - long cidrSize = NetUtils.getCidrSize(guestNetmask); - return NetUtils.getIpRangeFromCidr(guestIpAddress, cidrSize); - } - return new String[2]; - } - - public void setZoneVlan(String zoneVlan) { - this.zoneVlan = zoneVlan; - } - - @Override - public String getZoneVlan() { - return zoneVlan; - } - - public void setGuestZoneMacAddress(String guestZoneMacAddress) { - this.guestZoneMacAddress = guestZoneMacAddress; - } - - @Override - public String getGuestZoneMacAddress() { - return guestZoneMacAddress; - } - public void setServiceOfferingId(long serviceOfferingId) { this.serviceOfferingId = serviceOfferingId; } diff --git a/core/src/com/cloud/vm/SecondaryStorageVmVO.java b/core/src/com/cloud/vm/SecondaryStorageVmVO.java index c4d2e6ecad5..fc66537a7b7 100644 --- a/core/src/com/cloud/vm/SecondaryStorageVmVO.java +++ b/core/src/com/cloud/vm/SecondaryStorageVmVO.java @@ -39,15 +39,6 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; @DiscriminatorValue(value="SecondaryStorageVm") public class SecondaryStorageVmVO extends VMInstanceVO implements SecondaryStorageVm { - @Column(name="gateway", nullable=false) - private String gateway; - - @Column(name="dns1") - private String dns1; - - @Column(name="dns2") - private String dns2; - @Column(name="public_ip_address", nullable=false) private String publicIpAddress; @@ -57,24 +48,6 @@ public class SecondaryStorageVmVO extends VMInstanceVO implements SecondaryStora @Column(name="public_netmask", nullable=false) private String publicNetmask; - @Column(name="guest_mac_address") - private String guestMacAddress; - - @Column(name="guest_ip_address") - private String guestIpAddress; - - @Column(name="guest_netmask") - private String guestNetmask; - - @Column(name="vlan_db_id") - private Long vlanDbId; - - @Column(name="vlan_id") - private String vlanId; - - @Column(name="domain", nullable=false) - private String domain; - @Column(name="guid", nullable=false) private String guid; @@ -100,22 +73,6 @@ public class SecondaryStorageVmVO extends VMInstanceVO implements SecondaryStora super(); } - public void setGateway(String gateway) { - this.gateway = gateway; - } - - public void setDns1(String dns1) { - this.dns1 = dns1; - } - - public void setDns2(String dns2) { - this.dns2 = dns2; - } - - public void setDomain(String domain) { - this.domain = domain; - } - public void setPublicIpAddress(String publicIpAddress) { this.publicIpAddress = publicIpAddress; } @@ -128,18 +85,6 @@ public class SecondaryStorageVmVO extends VMInstanceVO implements SecondaryStora this.publicMacAddress = publicMacAddress; } - public void setGuestIpAddress(String guestIpAddress) { - this.guestIpAddress = guestIpAddress; - } - - public void setGuestNetmask(String guestNetmask) { - this.guestNetmask = guestNetmask; - } - - public void setGuestMacAddress(String guestMacAddress) { - this.guestMacAddress = guestMacAddress; - } - public void setRamSize(int ramSize) { this.ramSize = ramSize; } @@ -148,21 +93,6 @@ public class SecondaryStorageVmVO extends VMInstanceVO implements SecondaryStora this.lastUpdateTime = time; } - @Override - public String getGateway() { - return this.gateway; - } - - @Override - public String getDns1() { - return this.dns1; - } - - @Override - public String getDns2() { - return this.dns2; - } - @Override public String getPublicIpAddress() { return this.publicIpAddress; @@ -178,36 +108,6 @@ public class SecondaryStorageVmVO extends VMInstanceVO implements SecondaryStora return this.publicMacAddress; } - - public String getGuestIpAddress() { - return this.guestIpAddress; - } - - - public String getGuestNetmask() { - return this.guestNetmask; - } - - - public String getGuestMacAddress() { - return this.guestMacAddress; - } - - @Override - public Long getVlanDbId() { - return vlanDbId; - } - - @Override - public String getVlanId() { - return vlanId; - } - - @Override - public String getDomain() { - return this.domain; - } - @Override public int getRamSize() { return this.ramSize; diff --git a/core/src/com/cloud/vm/SystemVm.java b/core/src/com/cloud/vm/SystemVm.java index 7e1fd3387c2..21d5027246e 100644 --- a/core/src/com/cloud/vm/SystemVm.java +++ b/core/src/com/cloud/vm/SystemVm.java @@ -20,16 +20,9 @@ package com.cloud.vm; import java.util.Date; public interface SystemVm extends VirtualMachine { - public String getGateway(); - public String getDns1(); - public String getDns2(); - public String getDomain(); public String getPublicIpAddress(); public String getPublicNetmask(); public String getPublicMacAddress(); - public Long getVlanDbId(); - public String getVlanId(); - public String getPrivateNetmask(); public int getRamSize(); public Date getLastUpdateTime(); } diff --git a/core/src/com/cloud/vm/UserVmVO.java b/core/src/com/cloud/vm/UserVmVO.java index eff39465915..2fa2be2947c 100755 --- a/core/src/com/cloud/vm/UserVmVO.java +++ b/core/src/com/cloud/vm/UserVmVO.java @@ -36,33 +36,9 @@ import com.cloud.uservm.UserVm; @PrimaryKeyJoinColumn(name="id") public class UserVmVO extends VMInstanceVO implements UserVm { - @Column(name="domain_router_id", updatable=true, nullable=true) - Long domainRouterId; - - @Column(name="vnet", length=10, updatable=true, nullable=true) - String vnet; - - @Column(name="guest_ip_address") - String guestIpAddress; - - @Column(name="guest_mac_address") - String guestMacAddress; - - @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="external_mac_address") - String externalMacAddress; - - @Column(name="external_vlan_db_id") - private Long externalVlanDbId; - @Column(name="user_data", updatable=true, nullable=true, length=2048) private String userData; @@ -83,54 +59,11 @@ public class UserVmVO extends VMInstanceVO implements UserVm { this.password = password; } - @Override - public String getGuestIpAddress() { - return guestIpAddress; - } - - public void setGuestIpAddress(String guestIpAddress) { - this.guestIpAddress = guestIpAddress; - setPrivateIpAddress(guestIpAddress); - } - - @Override - public String getGuestMacAddress() { - return guestMacAddress; - } - - public void setGuestMacAddress(String guestMacAddress) { - this.guestMacAddress = guestMacAddress; - setPrivateMacAddress(guestMacAddress); - - } - - public String getGuestNetmask() { - return guestNetmask; - } - - public void setGuestNetmask(String guestNetmask) { - this.guestNetmask = guestNetmask; - setPrivateNetmask(guestNetmask); - } - @Override public Long getIsoId() { return isoId; } - @Override - public Long getDomainRouterId() { - return domainRouterId; - } - - public void setDomainRouterId(long domainRouterId) { - this.domainRouterId = domainRouterId; - } - - public void setVnet(String vnet) { - this.vnet = vnet; - } - @Override public long getServiceOfferingId() { return serviceOfferingId; @@ -140,11 +73,6 @@ public class UserVmVO extends VMInstanceVO implements UserVm { this.serviceOfferingId = serviceOfferingId; } - @Override - public String getVnet() { - return vnet; - } - public UserVmVO(long id, String instanceName, String displayName, @@ -167,34 +95,10 @@ public class UserVmVO extends VMInstanceVO implements UserVm { super(); } - public String getExternalIpAddress() { - return externalIpAddress; - } - public void setIsoId(Long id) { this.isoId = id; } - public void setExternalIpAddress(String externalIpAddress) { - this.externalIpAddress = externalIpAddress; - } - - public String getExternalMacAddress() { - return externalMacAddress; - } - - public void setExternalMacAddress(String externalMacAddress) { - this.externalMacAddress = externalMacAddress; - } - - public void setExternalVlanDbId(Long vlanDbId) { - this.externalVlanDbId = vlanDbId; - } - - public Long getExternalVlanDbId() { - return externalVlanDbId; - } - @Override public void setUserData(String userData) { this.userData = userData; diff --git a/core/src/com/cloud/vm/VMInstanceVO.java b/core/src/com/cloud/vm/VMInstanceVO.java index da61416df3c..23cd9ef9707 100644 --- a/core/src/com/cloud/vm/VMInstanceVO.java +++ b/core/src/com/cloud/vm/VMInstanceVO.java @@ -99,9 +99,6 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/.project b/deps/.project index 2d10b0c4b06..901f15e089b 100644 --- a/deps/.project +++ b/deps/.project @@ -1,11 +1,17 @@ - - - deps - - - - - - - - + + + deps + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/patches/systemvm/debian/config/etc/init.d/cloud-early-config b/patches/systemvm/debian/config/etc/init.d/cloud-early-config index 1c4fbd6cde1..03cb7837dee 100755 --- a/patches/systemvm/debian/config/etc/init.d/cloud-early-config +++ b/patches/systemvm/debian/config/etc/init.d/cloud-early-config @@ -85,6 +85,7 @@ patch() { if [ "$shouldpatch" == "true" ] then log_it "Rebooting system since we patched init scripts" + sync sleep 2 reboot fi @@ -157,8 +158,11 @@ setup_common() { init_interfaces $1 $2 $3 setup_interface "0" $ETH0_IP $ETH0_MASK $GW setup_interface "1" $ETH1_IP $ETH1_MASK $GW - setup_interface "2" $ETH2_IP $ETH2_MASK $GW - + if [ -n "$ETH2_IP" ] + then + setup_interface "2" $ETH2_IP $ETH2_MASK $GW + fi + echo $NAME > /etc/hostname echo 'AVAHI_DAEMON_DETECT_LOCAL=0' > /etc/default/avahi-daemon hostname $NAME @@ -224,7 +228,13 @@ setup_apache2() { setup_router() { log_action_begin_msg "Setting up virtual router system vm" - setup_common eth0 eth1 eth2 + if [ -n "$ETH2_IP" ] + then + setup_common eth0 eth1 eth2 + else + setup_common eth0 eth1 + fi + setup_dnsmasq setup_apache2 $ETH0_IP diff --git a/scripts/vm/hypervisor/xenserver/ovstunnel b/scripts/vm/hypervisor/xenserver/ovstunnel new file mode 100755 index 00000000000..22da51390c5 --- /dev/null +++ b/scripts/vm/hypervisor/xenserver/ovstunnel @@ -0,0 +1,262 @@ +#!/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 util +from util import CommandException +import hostvmstats +import socket +import stat +import base64 +import tempfile +from os.path import exists as _exists +from time import localtime as _localtime, asctime as _asctime + +vSwitchDBPidFile = "/var/run/openvswitch/ovsdb-server.pid" +vSwitchDBDaemonName = "ovsdb-server" +vSwitchPidFile = "/var/run/openvswitch/ovs-vswitchd.pid" +vsctlPath = "/usr/bin/ovs-vsctl" +ofctlPath = "/usr/bin/ovs-ofctl" +vSwitchDaemonName = "ovs-vswitchd" + +logFile = "/var/log/ovstunnel.log" +fLog = None + +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 + +def open_log (): + global fLog + + try: + if fLog == None: + fLog = open (logFile, "a") + except IOError, e: + #print e + pass + +def pr (str): + global fLog + + if fLog != None: + str = "[%s]:" % _asctime (_localtime()) + str + "\n" + fLog.write (str) + +def close_log (): + global fLog + + if fLog != None: + fLog.close () + +def is_process_run (pidFile, name): + try: + fpid = open (pidFile, "r") + pid = fpid.readline () + fpid.close () + except IOError, e: + return -1 + + pid = pid[:-1] + ps = os.popen ("ps -ae") + for l in ps: + if pid in l and name in l: + ps.close () + return 0 + + ps.close () + return -2 + +def is_tool_exist (name): + if _exists (name): + return 0 + return -1 + + +def check_switch (): + global result + + ret = is_process_run (vSwitchDBPidFile, vSwitchDBDaemonName); + if ret < 0: + if ret == -1: return "NO_DB_PID_FILE" + if ret == -2: return "DB_NOT_RUN" + + ret = is_process_run (vSwitchPidFile, vSwitchDaemonName) + if ret < 0: + if ret == -1: return "NO_SWITCH_PID_FILE" + if ret == -2: return "SWITCH_NOT_RUN" + + if is_tool_exist (vsctlPath) < 0: + return "NO_VSCTL" + + if is_tool_exist (ofctlPath) < 0: + return "NO_OFCTL" + + return "SUCCESS" + +def do_cmd (cmds, lines=False): + cmd = "" + for i in cmds: + cmd += " " + cmd += i + + pr("do command '%s'" % cmd) + f = os.popen (cmd) + if lines == True: + res = f.readlines () + else: + res = f.readline () + res = res[:-1] + f.close () + + if lines == False: + pr("command output '%s'" % res) + return res + +######################## GRE creation utils ########################## +# UUID's format is 8-4-4-4-12 +def is_uuid (uuid): + list = uuid.split ("-") + + if len (list) != 5: + return -1 + + if len (list[0]) != 8 or len (list[1]) != 4 \ + or len (list[2]) != 4 or len (list[3]) != 4 \ + or len (list[4]) != 12: + return -1 + + return 0 + +def set_flood_flow(bridge, inport): + flow = "in_port=%s idle_timeout=0 hard_timeout=0 priority=10000 actions=flood" % inport + add_flow(bridge, flow) + +@echo +def create_tunnel (session, args): + bridge = args.pop("bridge") + remoteIP = args.pop("remote_ip") + greKey = args.pop("key") + srcHost = args.pop("from") + dstHost = args.pop("to") + + res = check_switch() + if res != "SUCCESS": + return res + + name = "%s-%s-%s-%s" % (bridge, srcHost, dstHost, greKey) + + wait = [vsctlPath, "--timeout=30 wait-until bridge %s -- get bridge %s name" % \ + (bridge, bridge)] + res = do_cmd(wait) + if bridge not in res: + pr("WARNIING:Can't find bridge %s for creating tunnel!" % bridge) + result = "COMMAND_FAILED_NO_BRIDGE" + return result + + createInterface = [vsctlPath, "create interface", "name=%s" % name, \ + 'type=gre options:remote_ip=%s options:key=%s' % (remoteIP, greKey)] + ifaceUUID = do_cmd (createInterface) + if is_uuid (ifaceUUID) < 0: + pr("create interface failed, %s is not UUID" % ifaceUUID) + result = "COMMAND_FAILED_CREATE_INTERFACE_FAILED" + return result + + createPort = [vsctlPath, "create port", "name=%s" % name, \ + "interfaces=[%s]" % ifaceUUID] + portUUID = do_cmd (createPort) + if is_uuid (portUUID) < 0: + pr("create port failed, %s is not UUID" % portUUID) + result = "COMMAND_FAILED_CREATE_PORT_FAILED" + return result + + addBridge = [vsctlPath, "add bridge %s" % bridge, "ports %s" % portUUID] + do_cmd (addBridge) + + wait = [vsctlPath, "--timeout=30 wait-until port %s -- get port %s name" % \ + (name, name)] + res = do_cmd(wait) + if name in res: + port = get_field_of_interface(name, "ofport"); + if port == "[]": + return "COMMAND_FAILED_PORT_IS_[]" + + noFlood = [ofctlPath, "mod-port %s %s noflood" % (bridge, \ + port)] + do_cmd(noFlood) + + set_flood_flow(bridge, port) + pr("create tunnel successful(bridge=%s, remote_ip=%s, key=%s, from=%s, to=%s" % \ + (bridge, remoteIP, greKey, srcHost, dstHost)) + result = "SUCCESS:%s" % name + else: + pr("create gre tunnel failed") + result = "COMMAND_FAILED_CREATE_TUNNEL_FAILED" + + return result +######################## End GRE creation utils ########################## + +def del_all_flows(bridge): + delFlow = [ofctlPath, "del-flows %s" % bridge] + do_cmd(delFlow) + + normalFlow = "priority=0 idle_timeout=0 hard_timeout=0 actions=normal" + add_flow(bridge, normalFlow) + +def del_flows(bridge, ofport): + delFlow = [ofctlPath, 'del-flows %s "in_port=%s"' % (bridge, ofport)] + do_cmd(delFlow) + +def del_port(bridge, port): + delPort = [vsctlPath, "del-port %s %s" % (bridge, port)] + do_cmd(delPort) + +@echo +def destroy_tunnel(session, args): + bridge = args.pop("bridge") + inPort = args.pop("in_port") + + # delete all gre ports on bridge + if inPort == "[]": + listPorts = [vsctlPath, "list-ports %s" % bridge] + res = do_cmd(listPorts, True) + for p in res: + if bridge in p: + del_port(bridge, p) + del_all_flows(bridge) + else: + ofport = get_field_of_interface(inPort, "ofport") + del_flows(bridge, ofport) + del_port(bridge, inPort) + + return "SUCCESS" + +def get_field_of_interface(nameOruuid, field): + listIface = [vsctlPath, "list interface", nameOruuid] + res = do_cmd(listIface, True) + + for i in res: + if field in i: + (x, r) = i.split(":") + return r.lstrip().rstrip() + return None + + +def add_flow(bridge, flow): + param = bridge + ' "%s"' % flow + addflow = ["ovs-ofctl add-flow", param] + do_cmd (addflow) + +if __name__ == "__main__": + open_log() + XenAPIPlugin.dispatch({"create_tunnel":create_tunnel, "destroy_tunnel":destroy_tunnel}) + close_log() + diff --git a/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch b/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch index 8042e30d103..9bc7f0a9d69 100644 --- a/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch +++ b/scripts/vm/hypervisor/xenserver/xenserver56fp1/patch @@ -13,6 +13,7 @@ NFSSR.py=/opt/xensource/sm nfs.py=/opt/xensource/sm vmops=..,0755,/etc/xapi.d/plugins ovsgre=..,0755,/etc/xapi.d/plugins +ovstunnel=..,0755,/etc/xapi.d/plugins vmopsSnapshot=..,0755,/etc/xapi.d/plugins hostvmstats.py=..,0755,/opt/xensource/sm systemvm.iso=../../../../../vms,0644,/opt/xensource/packages/iso diff --git a/scripts/vm/network/security_group.py b/scripts/vm/network/security_group.py index abd7da8c441..e8597a2c7e0 100755 --- a/scripts/vm/network/security_group.py +++ b/scripts/vm/network/security_group.py @@ -434,7 +434,6 @@ def add_network_rules(vm_name, vm_id, vm_ip, signature, seqno, vmMac, rules): try: vmName = vm_name domId = getvmId(vmName) - vm_name = '-'.join(vm_name.split('-')[:-1]) vmchain = vm_name changes = check_rule_log_for_vm(vmName, vm_id, vm_ip, domId, signature, seqno) @@ -447,14 +446,17 @@ def add_network_rules(vm_name, vm_id, vm_ip, signature, seqno, vmMac, rules): logging.debug("Change detected in vmId or vmIp or domId, resetting default rules") default_network_rules(vmName, vm_ip, vm_id, vmMac) + if rules == "" or rules == None: + return 'true' + lines = rules.split(';') print lines logging.debug(" programming network rules for IP: " + vm_ip + " vmname=" + vm_name) #iptables('-F', vmchain) - print lines for line in lines: + tokens = line.split(':') if len(tokens) != 4: continue @@ -473,16 +475,16 @@ def add_network_rules(vm_name, vm_id, vm_ip, signature, seqno, vmMac, rules): if ips: if protocol == 'all': for ip in ips: - iptables = "iptables -I " + vmchain + " -m state --state NEW -m iprange --src-range " + ip + " -j ACCEPT" + iptables = "iptables -I " + vmchain + " -m state --state NEW -s " + ip + " -j ACCEPT" elif protocol != 'icmp': for ip in ips: - iptables = "iptables -I " + vmchain + " -p " + protocol + " -m " + protocol + " --dport " + range + " -m state --state NEW -m iprange --src-range " + ip + " -j ACCEPT" + iptables = "iptables -I " + vmchain + " -p " + protocol + " -m " + protocol + " --dport " + range + " -m state --state NEW -s " + ip + " -j ACCEPT" else: range = start + "/" + end if start == "-1": range = "any" for ip in ips: - iptables = "iptables -I " + vmchain + " -p icmp --icmp-type " + range + " -m iprange --src-range " + ip + " -j ACCEPT" + iptables = "iptables -I " + vmchain + " -p icmp --icmp-type " + range + " -s " + ip + " -j ACCEPT" execute(iptables) if allow_any and protocol != 'all': @@ -497,7 +499,6 @@ def add_network_rules(vm_name, vm_id, vm_ip, signature, seqno, vmMac, rules): iptables = "iptables -A " + vmchain + " -j DROP" execute(iptables) - if write_rule_log_for_vm(vmName, vm_id, vm_ip, domId, signature, seqno) == False: return 'false' @@ -548,3 +549,5 @@ if __name__ == '__main__': get_rule_logs_for_vms() elif cmd == "add_network_rules": add_network_rules(option.vmName, option.vmID, option.vmIP, option.sig, option.seq, option.vmMAC, option.rules) + elif cmd == "cleanup_rules": + cleanup_rules() diff --git a/server/.classpath b/server/.classpath index b18c9660ffe..52b60598f7d 100644 --- a/server/.classpath +++ b/server/.classpath @@ -1,25 +1,26 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index d6ef574a7e6..437e4c4bf76 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -1445,12 +1445,14 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, String hostDesc = "name: " + host.getName() + " (id:" + host.getId() + "), availability zone: " + dcVO.getName() + ", pod: " + podVO.getName(); - _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, - host.getDataCenterId(), host.getPodId(), - "Host disconnected, " + hostDesc, - "If the agent for host [" + hostDesc - + "] is not restarted within " + _alertWait - + " seconds, HA will begin on the VMs"); + if((host.getType() != Host.Type.SecondaryStorage) && (host.getType() != Host.Type.ConsoleProxy)){ + _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, + host.getDataCenterId(), host.getPodId(), + "Host disconnected, " + hostDesc, + "If the agent for host [" + hostDesc + + "] is not restarted within " + _alertWait + + " seconds, HA will begin on the VMs"); + } event = Event.AgentDisconnected; } } else { 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 a45e8891551..354e077a5e3 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java @@ -77,8 +77,8 @@ public class UserConcentratedAllocator implements PodAllocator { @Inject VMInstanceDao _vmInstanceDao; Random _rand = new Random(System.currentTimeMillis()); - private int _hoursToSkipStoppedVMs = 24; - private int _hoursToSkipDestroyedVMs = 0; + private int _secondsToSkipStoppedVMs = 86400; + private int _secondsToSkipDestroyedVMs = 0; private int _secStorageVmRamSize = 1024; private int _proxyRamSize = 256; @@ -206,14 +206,14 @@ public class UserConcentratedAllocator implements PodAllocator { if(vm.getState() == State.Stopped || vm.getState() == State.Destroyed) { // for Stopped/Destroyed VMs, we will skip counting it if it hasn't been used for a while - int _hoursToSkipVMs = _hoursToSkipStoppedVMs; + int secondsToSkipVMs = _secondsToSkipStoppedVMs; if (vm.getState() == State.Destroyed) { - _hoursToSkipVMs = _hoursToSkipDestroyedVMs; + secondsToSkipVMs = _secondsToSkipDestroyedVMs; } long millisecondsSinceLastUpdate = DateUtil.currentGMTTime().getTime() - vm.getUpdateTime().getTime(); - if(millisecondsSinceLastUpdate > _hoursToSkipVMs*3600000L) { + if(millisecondsSinceLastUpdate > secondsToSkipVMs*1000L) { if(s_logger.isDebugEnabled()) { s_logger.debug("Skip counting " + vm.getState().toString() + " vm " + vm.getInstanceName() + " in capacity allocation as it has been " + vm.getState().toString().toLowerCase() + " for " + millisecondsSinceLastUpdate/60000 + " minutes"); } @@ -320,10 +320,11 @@ public class UserConcentratedAllocator implements PodAllocator { _name = name; Map configs = _configDao.getConfiguration("management-server", params); - String stoppedValue = configs.get("capacity.skipcounting.hours"); - String destroyedValue = configs.get("capacity.skipcounting.destroyed.hours"); - _hoursToSkipStoppedVMs = NumbersUtil.parseInt(stoppedValue, 24); - _hoursToSkipDestroyedVMs = NumbersUtil.parseInt(destroyedValue, 0); + String stoppedValue = configs.get("vm.resource.release.interval"); + // String destroyedValue = configs.get("capacity.skipcounting.destroyed.hours"); + String destroyedValue = null; + _secondsToSkipStoppedVMs = NumbersUtil.parseInt(stoppedValue, 86400); + _secondsToSkipDestroyedVMs = NumbersUtil.parseInt(destroyedValue, 0); // TODO this is not good, there should be one place to get these values _secStorageVmRamSize = NumbersUtil.parseInt(configs.get("secstorage.vm.ram.size"), 256); diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index b397cbd5adf..4e86b306e3f 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -7,6 +7,7 @@ import java.util.Map; import com.cloud.agent.AgentManager; import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobVO; +import com.cloud.configuration.ConfigurationService; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.dc.AccountVlanMapVO; import com.cloud.dc.ClusterVO; @@ -79,6 +80,7 @@ import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.UserStatisticsVO; +import com.cloud.user.UserVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.user.dao.UserStatisticsDao; @@ -137,6 +139,7 @@ public class ApiDBUtils { private static DataCenterDao _zoneDao; private static NetworkOfferingDao _networkOfferingDao; private static NetworkDao _networkDao; + private static ConfigurationService _configMgr; static { _ms = (ManagementServer)ComponentLocator.getComponent(ManagementServer.Name); @@ -150,6 +153,7 @@ public class ApiDBUtils { _storageMgr = locator.getManager(StorageManager.class); _userVmMgr = locator.getManager(UserVmManager.class); _networkMgr = locator.getManager(NetworkManager.class); + _configMgr = locator.getManager(ConfigurationService.class); _accountDao = locator.getDao(AccountDao.class); _accountVlanMapDao = locator.getDao(AccountVlanMapDao.class); @@ -187,7 +191,7 @@ public class ApiDBUtils { ///////////////////////////////////////////////////////////// // ManagementServer methods // ///////////////////////////////////////////////////////////// - + public static VMInstanceVO findVMInstanceById(long vmId) { return _ms.findVMInstanceById(vmId); } @@ -427,6 +431,10 @@ public class ApiDBUtils { public static VolumeVO findVolumeById(Long volumeId) { return _volumeDao.findByIdIncludingRemoved(volumeId); } + + public static List listUsersByAccount(long accountId) { + return _userDao.listByAccount(accountId); + } public static DataCenterVO findZoneById(Long zoneId) { return _zoneDao.findById(zoneId); @@ -521,4 +529,12 @@ public class ApiDBUtils { } } + public static Integer getNetworkRate(long networkOfferingId) { + return _configMgr.getNetworkRate(networkOfferingId); + } + + public static Account getVlanAccount(long vlanId) { + return _configMgr.getVlanAccount(vlanId); + } + } diff --git a/server/src/com/cloud/api/ApiDispatcher.java b/server/src/com/cloud/api/ApiDispatcher.java index bafe991e27a..34ad2d93639 100644 --- a/server/src/com/cloud/api/ApiDispatcher.java +++ b/server/src/com/cloud/api/ApiDispatcher.java @@ -64,19 +64,13 @@ public class ApiDispatcher { public void dispatchCreateCmd(BaseAsyncCreateCmd cmd, Map params) { - boolean created = false; String errorMsg = ""; - long startId = 0; - - if(cmd.getCreateEventType() != null){ - startId = cmd.saveStartedEvent(cmd.getCreateEventType(), cmd.getCreateEventDescription(), 0L); - } - setupParameters(cmd, params); try { + UserContext ctx = UserContext.current(); + ctx.setAccountId(cmd.getEntityOwnerId()); cmd.create(); - created = true; } catch (Throwable t) { if (t instanceof InvalidParameterValueException || t instanceof IllegalArgumentException) { s_logger.info(t.getMessage()); @@ -121,27 +115,21 @@ public class ApiDispatcher { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, BaseCmd.USER_ERROR_MESSAGE); } } - } finally { - if(cmd.getCreateEventType() != null){ - if (created){ - cmd.saveCompletedEvent(EventVO.LEVEL_INFO, cmd.getCreateEventType(), cmd.getCreateEventDescription()+" successfull. Id: "+cmd.getEntityId(), startId); - } else { - cmd.saveCompletedEvent(EventVO.LEVEL_ERROR, cmd.getCreateEventType(), cmd.getCreateEventDescription()+" failed. "+errorMsg, startId); - } - } } } public void dispatch(BaseCmd cmd, Map params) { - boolean success = false; String errorMsg = ""; setupParameters(cmd, params); try { if(cmd instanceof BaseAsyncCmd){ - ((BaseAsyncCmd)cmd).saveStartedEvent(); + UserContext ctx = UserContext.current(); + BaseAsyncCmd asyncCmd = (BaseAsyncCmd)cmd; + ctx.setAccountId(asyncCmd.getEntityOwnerId()); + String startEventId = params.get("ctxStartEventId"); + ctx.setStartEventId(Long.valueOf(startEventId)); } cmd.execute(); - success = true; } catch (Throwable t) { if (t instanceof InvalidParameterValueException || t instanceof IllegalArgumentException) { s_logger.info(t.getMessage()); @@ -186,15 +174,6 @@ public class ApiDispatcher { throw new ServerApiException(BaseCmd.INTERNAL_ERROR, BaseCmd.USER_ERROR_MESSAGE); } } - } finally { - if(cmd instanceof BaseAsyncCmd){ - BaseAsyncCmd asyncCmd = (BaseAsyncCmd)cmd; - if(success){ - asyncCmd.saveCompletedEvent(EventVO.LEVEL_INFO, asyncCmd.getEventDescription()+" completed successfully"); - } else { - asyncCmd.saveCompletedEvent(EventVO.LEVEL_ERROR, asyncCmd.getEventDescription()+" failed. "+errorMsg); - } - } } } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index e3db40ed3a4..68c0e281fa4 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -142,6 +142,7 @@ import com.cloud.user.User; import com.cloud.user.UserAccount; import com.cloud.user.UserContext; import com.cloud.user.UserStatisticsVO; +import com.cloud.user.UserVO; import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.utils.net.NetUtils; @@ -309,6 +310,30 @@ public class ApiResponseHelper implements ResponseGenerator { accountResponse.setVmRunning(vmRunning); accountResponse.setObjectName("account"); + //adding all the users for an account as part of the response obj + List usersForAccount = ApiDBUtils.listUsersByAccount(account.getAccountId()); + List userResponseList = new ArrayList(); + for(UserVO user : usersForAccount) { + UserResponse userResponse = new UserResponse(); + userResponse.setAccountName(account.getAccountName()); + userResponse.setAccountType(account.getType()); + userResponse.setApiKey(user.getApiKey()); + userResponse.setCreated(user.getCreated()); + userResponse.setDomainId(account.getDomainId()); + userResponse.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName()); + userResponse.setEmail(user.getEmail()); + userResponse.setFirstname(user.getFirstname()); + userResponse.setId(user.getId()); + userResponse.setSecretKey(user.getSecretKey()); + userResponse.setLastname(user.getLastname()); + userResponse.setState(user.getState().toString()); + userResponse.setTimezone(user.getTimezone()); + userResponse.setUsername(user.getUsername()); + + userResponseList.add(userResponse); + } + + accountResponse.setUsers(userResponseList); return accountResponse; } @@ -568,20 +593,12 @@ public class ApiResponseHelper implements ResponseGenerator { vlanResponse.setStartIp(range[0]); vlanResponse.setEndIp(range[1]); - Long networkId = vlan.getNetworkId(); - if (networkId != null) { - vlanResponse.setNetworkId(vlan.getNetworkId()); - Network network = ApiDBUtils.findNetworkById(networkId); - if (network != null) { - Long accountId = network.getAccountId(); - //Set account information - if (accountId != null) { - Account account = ApiDBUtils.findAccountById(accountId); - vlanResponse.setAccountName(account.getAccountName()); - vlanResponse.setDomainId(account.getDomainId()); - vlanResponse.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName()); - } - } + vlanResponse.setNetworkId(vlan.getNetworkId()); + Account owner = ApiDBUtils.getVlanAccount(vlan.getId()); + if (owner != null) { + vlanResponse.setAccountName(owner.getAccountName()); + vlanResponse.setDomainId(owner.getDomainId()); + vlanResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); } vlanResponse.setObjectName("vlan"); @@ -743,7 +760,12 @@ public class ApiResponseHelper implements ResponseGenerator { VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId); volResponse.setVirtualMachineId(vm.getId()); volResponse.setVirtualMachineName(vm.getName()); - volResponse.setVirtualMachineDisplayName(vm.getName()); + if(vm.getType().equals(VirtualMachine.Type.User)) { + UserVm userVm = ApiDBUtils.findUserVmById(vm.getId()); + volResponse.setVirtualMachineDisplayName(userVm.getDisplayName()); + }else { + volResponse.setVirtualMachineDisplayName(vm.getName()); + } volResponse.setVirtualMachineState(vm.getState().toString()); } @@ -802,7 +824,7 @@ public class ApiResponseHelper implements ResponseGenerator { } volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString()); volResponse.setAttached(volume.getAttached()); - volResponse.setDestroyed(volume.getDestroyed()); + volResponse.setDestroyed(volume.getState() == Volume.State.Destroy); VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId()); boolean isExtractable = template != null&& template.isExtractable()&& !(template.getTemplateType()== TemplateType.SYSTEM); volResponse.setExtractable(isExtractable); @@ -1166,7 +1188,6 @@ public class ApiResponseHelper implements ResponseGenerator { vmResponse.setSystemVmType(vm.getType().toString().toLowerCase()); vmResponse.setZoneId(vm.getDataCenterId()); - vmResponse.setNetworkDomain(vm.getDomain()); vmResponse.setName(vm.getName()); vmResponse.setPodId(vm.getPodId()); vmResponse.setTemplateId(vm.getTemplateId()); @@ -1848,7 +1869,7 @@ public class ApiResponseHelper implements ResponseGenerator { ListResponse response = new ListResponse(); List isoResponses = new ArrayList(); - for (Pair isoZonePair : isoZonePairSet) { + for (Pair isoZonePair : isoZonePairSet) { VMTemplateVO iso = ApiDBUtils.findTemplateById(isoZonePair.first()); if ( (isBootable == null || !isBootable) && iso.getTemplateType() == TemplateType.PERHOST ) { TemplateResponse isoResponse = new TemplateResponse(); @@ -1862,8 +1883,14 @@ public class ApiResponseHelper implements ResponseGenerator { isoResponse.setFeatured(iso.isFeatured()); isoResponse.setCrossZones(iso.isCrossZones()); isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setCreated(iso.getCreated()); isoResponse.setPasswordEnabled(false); - isoResponse.setDomainId(iso.getDomainId()); + Account owner = ApiDBUtils.findAccountById(iso.getAccountId()); + if (owner != null) { + isoResponse.setAccount(owner.getAccountName()); + isoResponse.setDomainId(owner.getDomainId()); + isoResponse.setDomainName(ApiDBUtils.findDomainById(owner.getDomainId()).getName()); + } isoResponse.setObjectName("iso"); isoResponses.add(isoResponse); response.setResponses(isoResponses); @@ -2187,6 +2214,7 @@ public class ApiResponseHelper implements ResponseGenerator { response.setIsDefault(offering.isDefault()); response.setSpecifyVlan(offering.getSpecifyVlan()); response.setAvailability(offering.getAvailability().toString()); + response.setNetworkRate(ApiDBUtils.getNetworkRate(offering.getId())); response.setObjectName("networkoffering"); return response; } diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 1251dd75bf2..924a8b0b019 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -370,6 +370,7 @@ public class ApiServer implements HttpRequestHandler { Long objectId = null; if (cmdObj instanceof BaseAsyncCreateCmd) { BaseAsyncCreateCmd createCmd = (BaseAsyncCreateCmd)cmdObj; + ctx.setAccountId(createCmd.getEntityOwnerId()); _dispatcher.dispatchCreateCmd(createCmd, params); objectId = createCmd.getEntityId(); params.put("id", objectId.toString()); @@ -386,13 +387,21 @@ public class ApiServer implements HttpRequestHandler { params.put("ctxAccountId", String.valueOf(account.getId())); } + long startEventId = ctx.getStartEventId(); + asyncCmd.setStartEventId(startEventId); + // save the scheduled event Long eventId = EventUtils.saveScheduledEvent((userId == null) ? User.UID_SYSTEM : userId, asyncCmd.getEntityOwnerId(), - asyncCmd.getEventType(), asyncCmd.getEventDescription()); - - if (eventId != null) { - params.put("starteventid", eventId.toString()); + asyncCmd.getEventType(), asyncCmd.getEventDescription(), startEventId); + if(startEventId == 0){ + //There was no create event before, set current event id as start eventId + startEventId = eventId; } + + params.put("ctxStartEventId", String.valueOf(startEventId)); + + ctx.setAccountId(asyncCmd.getEntityOwnerId()); + AsyncJobVO job = new AsyncJobVO(); job.setInstanceId((objectId == null) ? asyncCmd.getInstanceId() : objectId); @@ -654,16 +663,6 @@ public class ApiServer implements HttpRequestHandler { Account account = _ms.findAccountById(userAcct.getAccountId()); - String hypervisorType = _ms.getConfigurationValue("hypervisor.type"); - if (hypervisorType == null) { - hypervisorType = "kvm"; - } - - String directAttachSecurityGroupsEnabled = _ms.getConfigurationValue("direct.attach.security.groups.enabled"); - if(directAttachSecurityGroupsEnabled == null) { - directAttachSecurityGroupsEnabled = "false"; - } - // set the userId and account object for everyone session.setAttribute("userid", userAcct.getId()); session.setAttribute("username", userAcct.getUsername()); @@ -673,8 +672,6 @@ public class ApiServer implements HttpRequestHandler { session.setAttribute("account", account.getAccountName()); session.setAttribute("domainid", account.getDomainId()); session.setAttribute("type", Short.valueOf(account.getType()).toString()); - session.setAttribute("hypervisortype", hypervisorType); - session.setAttribute("directattachsecuritygroupsenabled", directAttachSecurityGroupsEnabled); if (timezone != null) { session.setAttribute("timezone", timezone); diff --git a/server/src/com/cloud/api/doc/Command.java b/server/src/com/cloud/api/doc/Command.java index 6aa8ef92e07..9416919ac06 100644 --- a/server/src/com/cloud/api/doc/Command.java +++ b/server/src/com/cloud/api/doc/Command.java @@ -68,16 +68,18 @@ public class Command { public Argument getReqArgByName(String name){ for (Argument a : this.getRequest()) { - if (a.getName().equals(name)) - return a; + if (a.getName().equals(name)) { + return a; + } } return null; } public Argument getResArgByName(String name){ for (Argument a : this.getResponse()) { - if (a.getName().equals(name)) - return a; + if (a.getName().equals(name)) { + return a; + } } return null; } diff --git a/server/src/com/cloud/async/executor/AssignToLoadBalancerExecutor.java b/server/src/com/cloud/async/executor/AssignToLoadBalancerExecutor.java deleted file mode 100644 index d0cbc682cc6..00000000000 --- a/server/src/com/cloud/async/executor/AssignToLoadBalancerExecutor.java +++ /dev/null @@ -1,66 +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 java.lang.reflect.Type; -import java.util.Map; - -import org.apache.log4j.Logger; - -import com.cloud.async.AsyncJobManager; -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()); - - @Override - public boolean execute() { - /* - if (getSyncSource() == null) { - 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()); - - // always true if it does not have sync-source - return true; - } else { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - - LoadBalancerParam param = gson.fromJson(job.getCmdInfo(), LoadBalancerParam.class); -// return asyncMgr.getExecutorContext().getNetworkMgr().executeAssignToLoadBalancer(this, param); - return true; - } - */ - return true; - } -} diff --git a/server/src/com/cloud/async/executor/AttachISOExecutor.java b/server/src/com/cloud/async/executor/AttachISOExecutor.java deleted file mode 100644 index 1b10a024d8d..00000000000 --- a/server/src/com/cloud/async/executor/AttachISOExecutor.java +++ /dev/null @@ -1,92 +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.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.serializer.GsonHelper; -import com.google.gson.Gson; - -public class AttachISOExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(AttachISOExecutor.class.getName()); - - public boolean execute() { - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - Gson gson = GsonHelper.getBuilder().create(); - - /* - if(getSyncSource() == null) { - AttachISOParam param = gson.fromJson(job.getCmdInfo(), AttachISOParam.class); - asyncMgr.syncAsyncJobExecution(job.getId(), "AttachISO", param.getVmId()); - - // always true if it does not have sync-source - return true; - } else { - AttachISOParam param = gson.fromJson(job.getCmdInfo(), AttachISOParam.class); - - long vmId = param.getVmId(); - long userId = param.getUserId(); - long isoId = param.getIsoId(); - boolean attach = param.isAttach(); - - // Build the success/failure messages - String successMsg; - String failureMsg; - - if (attach) { - successMsg = "Successfully inserted CD."; - failureMsg = "Failed to insert CD. Please make sure an existing CD is not currently in use."; - } else { - successMsg = "Successfully ejected CD."; - failureMsg = "Failed to eject CD. Please make sure an existing CD is not currently in use."; - } - - try { - boolean result = asyncMgr.getExecutorContext().getManagementServer().attachISOToVM(vmId, userId, isoId, attach, param.getEventId()); - if (result) - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, successMsg); - else - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, failureMsg); - } catch(Exception e) { - s_logger.warn("Unable to attach ISO: " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } - - return true; - } - */ - return true; - } - - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - } - - public void processDisconnect(VMOperationListener listener, long agentId) { - } - - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - } - -} diff --git a/server/src/com/cloud/async/executor/AttachISOParam.java b/server/src/com/cloud/async/executor/AttachISOParam.java deleted file mode 100644 index 4db4f8b58c8..00000000000 --- a/server/src/com/cloud/async/executor/AttachISOParam.java +++ /dev/null @@ -1,61 +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; - -public class AttachISOParam { - private long vmId; - private long userId; - private long isoId; - private boolean attach; - private long eventId; - - public AttachISOParam() { - } - - public AttachISOParam(long vmId, long userId, long isoId, boolean attach) { - this.vmId = vmId; - this.userId = userId; - this.isoId = isoId; - this.attach = attach; - } - - public long getVmId() { - return vmId; - } - - public long getUserId() { - return userId; - } - - public long getIsoId() { - return isoId; - } - - public boolean isAttach() { - return attach; - } - - public void setEventId(long eventId) { - this.eventId = eventId; - } - - public long getEventId() { - return eventId; - } -} diff --git a/server/src/com/cloud/async/executor/AttachVolumeOperationResultObject.java b/server/src/com/cloud/async/executor/AttachVolumeOperationResultObject.java deleted file mode 100644 index 86ccebe8e03..00000000000 --- a/server/src/com/cloud/async/executor/AttachVolumeOperationResultObject.java +++ /dev/null @@ -1,103 +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 com.cloud.serializer.Param; - -public class AttachVolumeOperationResultObject { - @Param(name="virtualmachineid") - private Long virtualMachineId; - - @Param(name="vmname") - private String vmName; - - @Param(name="vmdisplayname") - private String vmDisplayName; - - @Param(name="vmstate") - private String vmState; - - @Param(name="id") - private Long volumeId; - - @Param(name="name") - private String volumeName; - - @Param(name="storagetype") - String storageType; - - public AttachVolumeOperationResultObject() { - } - - public Long getVirtualMachineId() { - return virtualMachineId; - } - - public void setVirtualMachineId(Long virtualMachineId) { - this.virtualMachineId = virtualMachineId; - } - - public String getVmName() { - return vmName; - } - - public void setVmName(String vmName) { - this.vmName = vmName; - } - - public String getVmDisplayName() { - return vmDisplayName; - } - - public void setVmDisplayName(String vmDisplayName) { - this.vmDisplayName = vmDisplayName; - } - - public String getVmState() { - return vmState; - } - - public void setVmState(String vmState) { - this.vmState = vmState; - } - - public Long getVolumeId() { - return volumeId; - } - - public void setVolumeId(Long volumeId) { - this.volumeId = volumeId; - } - - public String getVolumeName() { - return volumeName; - } - - public void setVolumeName(String volumeName) { - this.volumeName = volumeName; - } - - public String getStorageType() { - return storageType; - } - - public void setStorageType(String storageType) { - this.storageType = storageType; - } -} diff --git a/server/src/com/cloud/async/executor/AuthorizeSecurityGroupIngressExecutor.java b/server/src/com/cloud/async/executor/AuthorizeSecurityGroupIngressExecutor.java deleted file mode 100644 index 3f1477a6474..00000000000 --- a/server/src/com/cloud/async/executor/AuthorizeSecurityGroupIngressExecutor.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.cloud.async.executor; - -import java.util.ArrayList; -import java.util.List; - -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.network.security.IngressRuleVO; -import com.cloud.network.security.SecurityGroupRulesVO; -import com.cloud.network.security.SecurityGroupVO; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.user.AccountVO; -import com.google.gson.Gson; - -public class AuthorizeSecurityGroupIngressExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(AuthorizeSecurityGroupIngressExecutor.class.getName()); - - @Override - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - SecurityGroupIngressParam param = gson.fromJson(job.getCmdInfo(), SecurityGroupIngressParam.class); - AccountVO account = param.getAccount(); - - /* - if (getSyncSource() == null) { - SecurityGroupVO networkGroup = managementServer.findNetworkGroupByName(param.getAccount().getId(), param.getGroupName()); - if(networkGroup == null) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, - BaseCmd.PARAM_ERROR, "Unable to find network group " + param.getGroupName() + " for account " + account.getAccountName() + " (id: " + account.getId() + ")"); - } else { - asyncMgr.syncAsyncJobExecution(job.getId(), "SecurityGroup", networkGroup.getId()); - } - return true; - } else { - try { - List addedRules = managementServer.authorizeNetworkGroupIngress(account, param.getGroupName(), param.getProtocol(), param.getStartPort(), param.getEndPort(), param.getCidrList(), param.getAuthorizedGroups()); - if ((addedRules != null) && !addedRules.isEmpty()) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, composeResultObject(managementServer, account.getId(), param.getGroupName(), addedRules)); - } else { - if (addedRules == null) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "Failed to authorize network group ingress for group: " + param.getGroupName() + " for account: " + account.getAccountName() + " (id: " + account.getId() + ")"); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.PARAM_ERROR, - "Failed to authorize network group ingress for group: " + param.getGroupName() + ", ingress rules already exist."); - } - } - } catch(Exception e) { - s_logger.warn("Failed to authorize network group ingress from group: " + param.getGroupName() + " for account: " + account.getAccountName() + " (id: " + account.getId() + ")", e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "Failed to authorize network group ingress from group: " + param.getGroupName() + " for account: " + account.getAccountName() + " (id: " + account.getId() + ")"); - } - } - */ - - return true; - } - - private SecurityGroupResultObject composeResultObject(ManagementServer ms, Long accountId, String groupName, List addedRules) { - SecurityGroupVO networkGroup = ms.findNetworkGroupByName(accountId, groupName); - List groupRules = new ArrayList(); - for (IngressRuleVO ingressRule : addedRules) { - SecurityGroupRulesVO groupRule = new SecurityGroupRulesVO(networkGroup.getId(), networkGroup.getName(), networkGroup.getDescription(), networkGroup.getDomainId(), - networkGroup.getAccountId(), networkGroup.getAccountName(), ingressRule.getId(), ingressRule.getStartPort(), ingressRule.getEndPort(), - ingressRule.getProtocol(), ingressRule.getAllowedNetworkId(), ingressRule.getAllowedSecurityGroup(), ingressRule.getAllowedSecGrpAcct(), - ingressRule.getAllowedSourceIpCidr()); - groupRules.add(groupRule); - } - List results = SecurityGroupResultObject.transposeNetworkGroups(groupRules); - if ((results != null) && !results.isEmpty()) { - return results.get(0); - } - return null; - } -} diff --git a/server/src/com/cloud/async/executor/ConsoleProxyExecutorHelper.java b/server/src/com/cloud/async/executor/ConsoleProxyExecutorHelper.java deleted file mode 100644 index b56540e0a08..00000000000 --- a/server/src/com/cloud/async/executor/ConsoleProxyExecutorHelper.java +++ /dev/null @@ -1,54 +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 com.cloud.server.ManagementServer; -import com.cloud.vm.ConsoleProxyVO; - -public class ConsoleProxyExecutorHelper { - - public static ConsoleProxyOperationResultObject composeResultObject(ManagementServer managementServer, ConsoleProxyVO proxy) { - ConsoleProxyOperationResultObject result = new ConsoleProxyOperationResultObject(); - result.setId(proxy.getId()); - result.setName(proxy.getName()); - result.setZoneId(proxy.getDataCenterId()); - result.setZoneName(managementServer.findDataCenterById(proxy.getDataCenterId()).getName()); - result.setDns1(proxy.getDns1()); - result.setDns2(proxy.getDns2()); - result.setNetworkDomain(proxy.getDomain()); - result.setGateway(proxy.getGateway()); - result.setPodId(proxy.getPodId()); - result.setHostId(proxy.getHostId()); - if(proxy.getHostId() != null) - result.setHostName(managementServer.getHostBy(proxy.getHostId()).getName()); - - result.setPrivateIp(proxy.getPrivateIpAddress()); - result.setPrivateMac(proxy.getPrivateMacAddress()); - result.setPrivateNetmask(proxy.getPrivateNetmask()); - result.setPublicIp(proxy.getPublicIpAddress()); - result.setPublicMac(proxy.getPublicMacAddress()); - result.setPublicNetmask(proxy.getPublicNetmask()); - result.setTemplateId(proxy.getTemplateId()); - result.setCreated(proxy.getCreated()); - result.setActionSessions(proxy.getActiveSession()); - result.setState(proxy.getState().toString()); - - return result; - } -} diff --git a/server/src/com/cloud/async/executor/ConsoleProxyOperationResultObject.java b/server/src/com/cloud/async/executor/ConsoleProxyOperationResultObject.java deleted file mode 100644 index 111e1a623ef..00000000000 --- a/server/src/com/cloud/async/executor/ConsoleProxyOperationResultObject.java +++ /dev/null @@ -1,260 +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 java.util.Date; - -import com.cloud.serializer.Param; - -public class ConsoleProxyOperationResultObject { - - @Param(name="id") - private long id; - - @Param(name="name") - private String name; - - @Param(name="zoneid") - private long zoneId; - - @Param(name="zonename") - private String zoneName; - - @Param(name="dns1") - private String dns1; - - @Param(name="dns2") - private String dns2; - - @Param(name="networkdomain") - private String networkDomain; - - @Param(name="gateway") - private String gateway; - - @Param(name="podid") - private long podId; - - @Param(name="hostid") - private Long hostId; - - @Param(name="hostname") - private String hostName; - - @Param(name="privateip") - private String privateIp; - - @Param(name="privatemacaddress") - private String privateMac; - - @Param(name="privatenetmask") - private String privateNetmask; - - @Param(name="publicip") - private String publicIp; - - @Param(name="publicmacaddress") - private String publicMac; - - @Param(name="publicnetmask") - private String publicNetmask; - - @Param(name="templateid") - private long templateId; - - @Param(name="created") - private Date created; - - @Param(name="activeviewersessions") - private int actionSessions; - - @Param(name="state") - private String state; - - public ConsoleProxyOperationResultObject() { - } - - 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 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 String getDns1() { - return dns1; - } - - public void setDns1(String dns1) { - this.dns1 = dns1; - } - - public String getDns2() { - return dns2; - } - - public void setDns2(String dns2) { - this.dns2 = dns2; - } - - public String getNetworkDomain() { - return networkDomain; - } - - public void setNetworkDomain(String networkDomain) { - this.networkDomain = networkDomain; - } - - public String getGateway() { - return gateway; - } - - public void setGateway(String gateway) { - this.gateway = gateway; - } - - public long getPodId() { - return podId; - } - - public void setPodId(long podId) { - this.podId = podId; - } - - public Long getHostId() { - return hostId; - } - - public void setHostId(Long hostId) { - this.hostId = hostId; - } - - public String getHostName() { - return hostName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - - public String getPrivateIp() { - return privateIp; - } - - public void setPrivateIp(String privateIp) { - this.privateIp = privateIp; - } - - public String getPrivateMac() { - return privateMac; - } - - public void setPrivateMac(String privateMac) { - this.privateMac = privateMac; - } - - public String getPrivateNetmask() { - return privateNetmask; - } - - public void setPrivateNetmask(String privateNetmask) { - this.privateNetmask = privateNetmask; - } - - public String getPublicIp() { - return publicIp; - } - - public void setPublicIp(String publicIp) { - this.publicIp = publicIp; - } - - public String getPublicMac() { - return publicMac; - } - - public void setPublicMac(String publicMac) { - this.publicMac = publicMac; - } - - public String getPublicNetmask() { - return publicNetmask; - } - - public void setPublicNetmask(String publicNetmask) { - this.publicNetmask = publicNetmask; - } - - public long getTemplateId() { - return templateId; - } - - public void setTemplateId(long templateId) { - this.templateId = templateId; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public int getActionSessions() { - return actionSessions; - } - - public void setActionSessions(int actionSessions) { - this.actionSessions = actionSessions; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } -} diff --git a/server/src/com/cloud/async/executor/CopyTemplateExecutor.java b/server/src/com/cloud/async/executor/CopyTemplateExecutor.java deleted file mode 100644 index 2364e5df66b..00000000000 --- a/server/src/com/cloud/async/executor/CopyTemplateExecutor.java +++ /dev/null @@ -1,135 +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.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.async.BaseAsyncJobExecutor; -import com.cloud.dc.DataCenterVO; -import com.cloud.domain.Domain; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.storage.VMTemplateHostVO; -import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; -import com.cloud.storage.VMTemplateVO; -import com.cloud.user.Account; -import com.google.gson.Gson; - -public class CopyTemplateExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(CopyTemplateExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - - CopyTemplateParam param = gson.fromJson(job.getCmdInfo(), CopyTemplateParam.class); - - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - - try { - boolean success = managementServer.copyTemplate(param.getUserId(), param.getTemplateId(), param.getSourceZoneId(), param.getDestZoneId()); - - if (success) { - VMTemplateVO template = managementServer.findTemplateById(param.getTemplateId()); - DataCenterVO destZone = managementServer.findDataCenterById(param.getDestZoneId()); -// VMTemplateHostVO templateHostRef = managementServer.findTemplateHostRef(param.getTemplateId(), destZone.getId()); - long guestOsId = template.getGuestOSId(); - Account owner = managementServer.findAccountById(template.getAccountId()); - -// DomainVO domain = managementServer.findDomainIdById(owner.getDomainId()); -// String guestOSName = managementServer.findGuestOSById(guestOsId).getName(); -// asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, composeResultObject(template, templateHostRef, destZone,guestOSName, owner, domain)); - - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Failed to copy template."); - } - - } catch (Exception e) { - s_logger.warn("Unable to copy template: " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } - - return true; - } - - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - } - - public void processDisconnect(VMOperationListener listener, long agentId) { - } - - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - } - - private CopyTemplateResultObject composeResultObject(VMTemplateVO template, VMTemplateHostVO templateHostRef, DataCenterVO destZone, String guestOSName, Account owner, Domain domain) { - CopyTemplateResultObject resultObject = new CopyTemplateResultObject(); - - - // If the user is an admin, add the template download status - boolean isAdmin = false; - - if(owner.getType() == Account.ACCOUNT_TYPE_ADMIN) - isAdmin = true; - - if (isAdmin || owner.getId() == template.getAccountId()) { - // add download status - if (templateHostRef.getDownloadState()!=Status.DOWNLOADED) { - String templateStatus = "Processing"; - if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { - if (templateHostRef.getDownloadPercent() == 100) { - templateStatus = "Installing Template"; - } else { - templateStatus = templateHostRef.getDownloadPercent() + "% Downloaded"; - } - } else { - templateStatus = templateHostRef.getErrorString(); - } - resultObject.setTemplateStatus(templateStatus); - } else if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { - resultObject.setTemplateStatus("Download Complete"); - } else { - resultObject.setTemplateStatus("Successfully Installed"); - } - } - - resultObject.setAccountName(owner.getAccountName()); - resultObject.setDomainId(owner.getDomainId()); - resultObject.setDomainName(domain.getName()); - resultObject.setId(template.getId()); - resultObject.setName(template.getName()); - resultObject.setDisplayText(template.getDisplayText()); - resultObject.setPublic(template.isPublicTemplate()); - resultObject.setOsTypeName(guestOSName); - resultObject.setCreated(templateHostRef.getCreated()); - resultObject.setReady(templateHostRef != null && templateHostRef.getDownloadState() == Status.DOWNLOADED); - resultObject.setFeatured(template.isFeatured()); - resultObject.setPasswordEnabled(template.getEnablePassword()); - resultObject.setFormat(template.getFormat()); - resultObject.setGuestOsId(template.getGuestOSId()); - resultObject.setZoneId(destZone.getId()); - resultObject.setZoneName(destZone.getName()); - return resultObject; - } -} diff --git a/server/src/com/cloud/async/executor/CopyTemplateParam.java b/server/src/com/cloud/async/executor/CopyTemplateParam.java deleted file mode 100644 index 09f11542bb6..00000000000 --- a/server/src/com/cloud/async/executor/CopyTemplateParam.java +++ /dev/null @@ -1,64 +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; - -public class CopyTemplateParam { - - private long userId; - private long templateId; - private Long sourceZoneId; - private Long destZoneId; - private long eventId; - - public CopyTemplateParam() { - } - - public CopyTemplateParam(long userId, long templateId, Long sourceZoneId, Long destZoneId, long eventId) { - this.userId = userId; - this.templateId = templateId; - this.sourceZoneId = sourceZoneId; - this.destZoneId = destZoneId; - this.eventId = eventId; - } - - public long getUserId() { - return userId; - } - - public long getTemplateId() { - return templateId; - } - - public Long getSourceZoneId() { - return sourceZoneId; - } - - public Long getDestZoneId() { - return destZoneId; - } - - public void setEventId(long eventId) { - this.eventId = eventId; - } - - public long getEventId() { - return eventId; - } - -} diff --git a/server/src/com/cloud/async/executor/CopyTemplateResultObject.java b/server/src/com/cloud/async/executor/CopyTemplateResultObject.java deleted file mode 100644 index 63f7a0b03da..00000000000 --- a/server/src/com/cloud/async/executor/CopyTemplateResultObject.java +++ /dev/null @@ -1,235 +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 java.util.Date; - -import com.cloud.serializer.Param; -import com.cloud.storage.Storage.ImageFormat; - -public class CopyTemplateResultObject { - @Param(name="id") - private long id; - - @Param(name="name") - private String name; - - @Param(name="displaytext") - private String displayText; - - @Param(name="ispublic", propName="public") - private boolean isPublic; - -// @Param(name="requireshvm") -// private Boolean requiresHvm; -// -// @Param(name="bits") -// private Integer bits; - - @Param(name="created") - private Date created; - - @Param(name="isready", propName="ready") - private boolean isReady; - - @Param(name="isfeatured", propName="featured") - private boolean isFeatured; - - @Param(name="passwordenabled") - private boolean passwordEnabled; - - @Param(name="format") - private ImageFormat format; - - @Param(name="ostypeid") - private long guestOsId; - - @Param(name="zoneid") - private long zoneId; - - @Param(name="zonename") - private String zoneName; - - @Param(name="ostypename") - private String osTypeName; - - @Param(name="account") - private String accountName; - - @Param(name="domain") - private String domainName; - - @Param(name="domainid") - private long domainId; - - @Param(name="templatestatus") - private String templateStatus; - - public String getTemplateStatus() { - return templateStatus; - } - - public void setTemplateStatus(String templateStatus) { - this.templateStatus = templateStatus; - } - - 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 getDisplayText() { - return displayText; - } - - public void setDisplayText(String displayText) { - this.displayText = displayText; - } - - public boolean isPublic() { - return isPublic; - } - - public void setPublic(boolean isPublic) { - this.isPublic = isPublic; - } - -// public boolean isRequiresHvm() { -// return requiresHvm; -// } -// -// public void setRequiresHvm(boolean requiresHvm) { -// this.requiresHvm = requiresHvm; -// } -// -// public int getBits() { -// return bits; -// } -// -// public void setBits(int bits) { -// this.bits = bits; -// } - - public Date getCreated() { - return created; - } - - public String getOsTypeName() { - return this.osTypeName; - } - - public void setCreated(Date created) { - this.created = created; - } - - public boolean isReady() { - return isReady; - } - - public void setReady(boolean isReady) { - this.isReady = isReady; - } - - public boolean isFeatured() { - return isFeatured; - } - - public void setFeatured(boolean isFeatured) { - this.isFeatured = isFeatured; - } - - public boolean isPasswordEnabled() { - return passwordEnabled; - } - - public void setPasswordEnabled(boolean passwordEnabled) { - this.passwordEnabled = passwordEnabled; - } - - public ImageFormat getFormat() { - return format; - } - - public void setFormat(ImageFormat format) { - this.format = format; - } - - public long getGuestOsId() { - return guestOsId; - } - - public void setGuestOsId(long guestOsId) { - this.guestOsId = guestOsId; - } - - public void setOsTypeName(String osTypeName) { - this.osTypeName = osTypeName; - } - - public void setAccountName(String accountName) { - this.accountName = accountName; - } - - public void setDomainName(String domainName) { - this.domainName = domainName; - } - - public void setDomainId(long domainId) { - this.domainId = domainId; - } - - public long getZoneId() { - return zoneId; - } - - public long getDomainId() { - return domainId; - } - - public String getAccountName(){ - return accountName; - } - - public String getDomainName(){ - return domainName; - } - - public void setZoneId(long zoneId) { - this.zoneId = zoneId; - } - - public String getZoneName() { - return zoneName; - } - - public void setZoneName(String zoneName) { - this.zoneName = zoneName; - } -} diff --git a/server/src/com/cloud/async/executor/CreateOrUpdateRuleExecutor.java b/server/src/com/cloud/async/executor/CreateOrUpdateRuleExecutor.java deleted file mode 100644 index 529600bdfe2..00000000000 --- a/server/src/com/cloud/async/executor/CreateOrUpdateRuleExecutor.java +++ /dev/null @@ -1,119 +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.exception.InternalErrorException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.NetworkRuleConflictException; -import com.cloud.exception.PermissionDeniedException; -import com.cloud.network.NetworkRuleConfigVO; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.google.gson.Gson; - -public class CreateOrUpdateRuleExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(CreateOrUpdateRuleExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - CreateOrUpdateRuleParam param = gson.fromJson(job.getCmdInfo(), CreateOrUpdateRuleParam.class); - - /* - try { - if(s_logger.isDebugEnabled()) - s_logger.debug("Executing createOrUpdateRule, uid: " + job.getUserId() + ", pfservice id: " + param.getSecurityGroupId() - + ", addr: " + param.getAddress() + ", port: " + param.getPort() + ", private IP: " + param.getPrivateIpAddress() - + ", private port: " + param.getPrivatePort() + ", protocol: " + param.getProtocol() + ", algorithm: " + param.getAlgorithm()); - - NetworkRuleConfigVO rule = managementServer.createOrUpdateRule(job.getUserId(), param.getSecurityGroupId(), - param.getAddress(), param.getPort(), param.getPrivateIpAddress(), param.getPrivatePort(), - param.getProtocol(), param.getAlgorithm()); - - if(rule != null) { - if(s_logger.isDebugEnabled()) - s_logger.debug("createOrUpdateRule executed successfully, complete async-execution"); - - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - composeResultObject(managementServer, param, rule)); - - } else { - s_logger.warn("createOrUpdateRule execution failed: null rule object is returned, complete async-execution"); - - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "operation failed"); - } - } catch (InvalidParameterValueException e) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to creat or update rule: " + e.getMessage()); - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.PARAM_ERROR, e.getMessage()); - } catch (PermissionDeniedException e) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to creat or update rule: " + e.getMessage()); - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.PARAM_ERROR, e.getMessage()); - } catch (NetworkRuleConflictException e) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to creat or update rule: " + e.getMessage()); - if(param.isForwarding()) - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.NET_CONFLICT_IPFW_RULE_ERROR, e.getMessage()); - else - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.NET_CONFLICT_LB_RULE_ERROR, e.getMessage()); - } catch (InternalErrorException e) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to creat or update rule: " + e.getMessage()); - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } catch(Exception e) { - s_logger.warn("Unable to creat or update rule: " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } - */ - return true; - } - - private CreateOrUpdateRuleResultObject composeResultObject(ManagementServer managementServer, - CreateOrUpdateRuleParam param, NetworkRuleConfigVO rule) { - - CreateOrUpdateRuleResultObject resultObject = new CreateOrUpdateRuleResultObject(); - resultObject.setRuleId(rule.getId()); - resultObject.setPublicIp(param.getAddress()); - resultObject.setPublicPort(Integer.valueOf(param.getPort())); - resultObject.setPrivateIp(param.getPrivateIpAddress()); - resultObject.setPrivatePort(Integer.valueOf(param.getPrivatePort())); - resultObject.setEnabled(true); - resultObject.setAlgorithm(param.getAlgorithm()); - resultObject.setProtocol(param.getProtocol()); - resultObject.setPortForwardingServiceId(param.getSecurityGroupId()); - return resultObject; - } -} diff --git a/server/src/com/cloud/async/executor/CreateOrUpdateRuleParam.java b/server/src/com/cloud/async/executor/CreateOrUpdateRuleParam.java deleted file mode 100644 index 6e420cfdd82..00000000000 --- a/server/src/com/cloud/async/executor/CreateOrUpdateRuleParam.java +++ /dev/null @@ -1,140 +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; - -public class CreateOrUpdateRuleParam { - private boolean isForwarding; - private long userId; - private Long accountId; - private String address; - private String port; - private String privateIpAddress; - private String privatePort; - private String protocol; - private String algorithm; - private Long domainId; - private Long securityGroupId; - - public CreateOrUpdateRuleParam() { - } - - public CreateOrUpdateRuleParam(boolean isForwarding, long userId, Long accountId, String address, - String port, String privateIpAddress, String privatePort, String protocol, String algorithm, Long domainId, Long securityGroupId) { - this.isForwarding = isForwarding; - this.userId = userId; - this.accountId = accountId; - this.address = address; - this.port = port; - this.privateIpAddress = privateIpAddress; - this.privatePort = privatePort; - this.protocol = protocol; - this.algorithm = algorithm; - this.domainId = domainId; - this.securityGroupId = securityGroupId; - } - - public boolean isForwarding() { - return isForwarding; - } - - public void setForwarding(boolean isForwarding) { - this.isForwarding = isForwarding; - } - - public long getUserId() { - return userId; - } - - public void setUserId(long userId) { - this.userId = userId; - } - - public Long getAccountId() { - return accountId; - } - - public void setAccountId(Long accountId) { - this.accountId = accountId; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public String getPort() { - return port; - } - - public void setPort(String port) { - this.port = port; - } - - public String getPrivateIpAddress() { - return privateIpAddress; - } - - public void setPrivateIpAddress(String privateIpAddress) { - this.privateIpAddress = privateIpAddress; - } - - public String getPrivatePort() { - return privatePort; - } - - public void setPrivatePort(String privatePort) { - this.privatePort = privatePort; - } - - public String getProtocol() { - return protocol; - } - - public void setProtocol(String protocol) { - this.protocol = protocol; - } - - public String getAlgorithm() { - return algorithm; - } - - public void setAlgorithm(String algorithm) { - this.algorithm = algorithm; - } - - public Long getDomainId() { - return domainId; - } - - public void setDomainId(Long domainId) { - this.domainId = domainId; - } - - public Long getSecurityGroupId() { - return securityGroupId; - } - - public void setSecurityGroupId(Long securityGroupId) { - this.securityGroupId = securityGroupId; - } - -} diff --git a/server/src/com/cloud/async/executor/CreateOrUpdateRuleResultObject.java b/server/src/com/cloud/async/executor/CreateOrUpdateRuleResultObject.java deleted file mode 100644 index e9516861c31..00000000000 --- a/server/src/com/cloud/async/executor/CreateOrUpdateRuleResultObject.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.async.executor; - -import com.cloud.serializer.Param; - -public class CreateOrUpdateRuleResultObject { - - @Param(name="id") - private long ruleId; - - @Param(name="publicip") - private String publicIp; - - @Param(name="publicport") - private int publicPort; - - @Param(name="privateip") - private String privateIp; - - @Param(name="privateport") - private int privatePort; - - @Param(name="isenabled") - private boolean isEnabled; - - @Param(name="protocol") - private String protocol; - - @Param(name="algorithm") - private String algorithm; - - @Param(name="portforwardingserviceid") - private Long portForwardingServiceId; - - public Long getPortForwardingServiceId() { - return portForwardingServiceId; - } - - public void setPortForwardingServiceId(Long portForwardingServiceId) { - this.portForwardingServiceId = portForwardingServiceId; - } - - public String getAlgorithm() { - return algorithm; - } - - public void setAlgorithm(String algorithm) { - this.algorithm = algorithm; - } - - public long getRuleId() { - return ruleId; - } - - public void setRuleId(long ruleId) { - this.ruleId = ruleId; - } - - public String getPublicIp() { - return publicIp; - } - - public void setPublicIp(String publicIp) { - this.publicIp = publicIp; - } - - public int getPublicPort() { - return publicPort; - } - - public void setPublicPort(int publicPort) { - this.publicPort = publicPort; - } - - public String getPrivateIp() { - return privateIp; - } - - public void setPrivateIp(String privateIp) { - this.privateIp = privateIp; - } - - public int getPrivatePort() { - return privatePort; - } - - public void setPrivatePort(int privatePort) { - this.privatePort = privatePort; - } - - public boolean isEnabled() { - return isEnabled; - } - - public void setEnabled(boolean isEnabled) { - this.isEnabled = isEnabled; - } - - public String getProtocol() { - return protocol; - } - - public void setProtocol(String protocol) { - this.protocol = protocol; - } -} diff --git a/server/src/com/cloud/async/executor/CreatePrivateTemplateExecutor.java b/server/src/com/cloud/async/executor/CreatePrivateTemplateExecutor.java deleted file mode 100644 index 64b8c55b11a..00000000000 --- a/server/src/com/cloud/async/executor/CreatePrivateTemplateExecutor.java +++ /dev/null @@ -1,194 +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.AsyncJobExecutorContext; -import com.cloud.async.AsyncJobManager; -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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.storage.GuestOS; -import com.cloud.storage.Snapshot; -import com.cloud.storage.VMTemplateHostVO; -import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VolumeVO; -import com.cloud.user.Account; -import com.cloud.user.AccountManager; -import com.cloud.user.AccountVO; -import com.cloud.vm.UserVmManager; -import com.google.gson.Gson; - -public class CreatePrivateTemplateExecutor extends VolumeOperationExecutor { - public static final Logger s_logger = Logger.getLogger(CreatePrivateTemplateExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - - /* - if(getSyncSource() == null) { - CreatePrivateTemplateParam param = gson.fromJson(job.getCmdInfo(), CreatePrivateTemplateParam.class); - asyncMgr.syncAsyncJobExecution(job.getId(), "Volume", param.getVolumeId()); - - // always true if it does not have sync-source - return true; - } else { - CreatePrivateTemplateParam param = gson.fromJson(job.getCmdInfo(), CreatePrivateTemplateParam.class); - - AsyncJobExecutorContext asyncJobExecutorContext = asyncMgr.getExecutorContext(); - ManagementServer managerServer = asyncJobExecutorContext.getManagementServer(); - AccountManager accountManager = asyncJobExecutorContext.getAccountMgr(); - UserVmManager vmMgr = asyncJobExecutorContext.getVmMgr(); - - 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) { - details += "snapshot with id: " + snapshotId; - } - else { - details += "volume with id: " + volumeId; - } - // Job details - Long jobId = getJob().getId(); - int jobStatus = AsyncJobResult.STATUS_FAILED; - int resultCode = BaseCmd.INTERNAL_ERROR; - Object resultObject = null; - try { - // Check that the resource limit for templates won't be exceeded - VolumeVO volume = managerServer.findAnyVolumeById(volumeId); - - if (volume == null) { - throw new InvalidParameterValueException("Could not find active volume with ID " + volumeId); - } - - AccountVO account = (AccountVO) managerServer.findAccountById(volume.getAccountId()); - if (accountManager.resourceLimitExceeded(account, ResourceType.template)) { - details += ", reason: The maximum number of templates for the specified account has been exceeded."; - } - else { - VMTemplateVO template = vmMgr.createPrivateTemplateRecord(param.getUserId(), - param.getVolumeId(), - param.getName(), - param.getDescription(), - param.getGuestOsId(), - param.getRequiresHvm(), - param.getBits(), - param.isPasswordEnabled(), - param.isPublic(), - param.isFeatured()); - - if (template != null) { - - if(s_logger.isInfoEnabled()) - s_logger.info("CreatePrivateTemplate created a new instance " + template.getId() - + ", update async job-" + job.getId() + " progress status"); - - asyncMgr.updateAsyncJobAttachment(job.getId(), "vm_template", template.getId()); - asyncMgr.updateAsyncJobStatus(job.getId(), BaseCmd.PROGRESS_INSTANCE_CREATED, template.getId()); - - template = managerServer.createPrivateTemplate(template, param.getUserId(), snapshotId, volumeId, param.getName(), param.getDescription()); - - if (template != null) { - VMTemplateHostVO templateHostRef = managerServer.findTemplateHostRef(template.getId(), - volume.getDataCenterId()); - jobStatus = AsyncJobResult.STATUS_SUCCEEDED; - resultCode = 0; - details = null; - String eventParams = "id=" + template.getId() + "\nname=" + template.getName() + "\nsize=" - + volume.getSize() + "\ndcId=" + volume.getDataCenterId(); - 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()); - } - - } - } - } catch (InvalidParameterValueException e) { - details += ", reason: " + e.getMessage(); - s_logger.error(details, e); - resultCode = BaseCmd.PARAM_ERROR; - } catch (Exception e) { - details += ", reason: " + e.getMessage(); - s_logger.error(details, e); - } - - 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; - } - */ - return true; - } - - private CreatePrivateTemplateResultObject composeResultObject(VMTemplateVO template, VMTemplateHostVO templateHostRef, Long dataCenterId) { - CreatePrivateTemplateResultObject resultObject = new CreatePrivateTemplateResultObject(); - - resultObject.setId(template.getId()); - resultObject.setName(template.getName()); - resultObject.setDisplayText(template.getDisplayText()); - resultObject.setPublic(template.isPublicTemplate()); - resultObject.setCreated(templateHostRef.getCreated()); - resultObject.setReady(templateHostRef != null && templateHostRef.getDownloadState() == Status.DOWNLOADED); - resultObject.setPasswordEnabled(template.getEnablePassword()); - resultObject.setCrossZones(template.isCrossZones()); - ManagementServer managerServer = getAsyncJobMgr().getExecutorContext().getManagementServer(); -// GuestOS os = managerServer.findGuestOSById(template.getGuestOSId()); -// if (os != null) { -// resultObject.setOsTypeId(os.getId()); -// resultObject.setOsTypeName(os.getDisplayName()); -// } else { -// resultObject.setOsTypeId(-1L); -// resultObject.setOsTypeName(""); -// } - - Account owner = managerServer.findAccountById(template.getAccountId()); - if (owner != null) { - resultObject.setAccount(owner.getAccountName()); - resultObject.setDomainId(owner.getDomainId()); -// resultObject.setDomainName(managerServer.findDomainIdById(owner.getDomainId()).getName()); - } - - - DataCenterVO zone = managerServer.findDataCenterById(dataCenterId); - if (zone != null) { - resultObject.setZoneId(zone.getId()); - resultObject.setZoneName(zone.getName()); - } - - return resultObject; - } -} diff --git a/server/src/com/cloud/async/executor/CreatePrivateTemplateParam.java b/server/src/com/cloud/async/executor/CreatePrivateTemplateParam.java deleted file mode 100644 index 5032fa90224..00000000000 --- a/server/src/com/cloud/async/executor/CreatePrivateTemplateParam.java +++ /dev/null @@ -1,154 +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; - -public class CreatePrivateTemplateParam { - private long userId; - private long accountId; - private Long volumeId; - private Long snapshotId; - private long guestOsId; - private long eventId; - private String name; - private String description; - private Boolean requiresHvm; - private Integer bits; - private Boolean passwordEnabled; - private Boolean isPublic; - private Boolean isFeatured; - - 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; - this.name = name; - this.description = description; - this.volumeId = volumeId; - this.guestOsId = guestOsId; - this.eventId = eventId; - this.requiresHvm = requiresHvm; - this.bits = bits; - this.passwordEnabled = passwordEnabled; - this.isPublic = isPublic; - this.isFeatured = featured; - this.snapshotId = snapshotId; - } - - public long getUserId() { - return userId; - } - - public void setUserId(long userId) { - this.userId = userId; - } - - public long getAccountId() { - return accountId; - } - - public void setAccountId(long accountId) { - this.accountId = accountId; - } - - public long getVolumeId() { - return volumeId; - } - - public void setVmId(long volumeId) { - this.volumeId = volumeId; - } - - public Long getSnapshotId() { - return snapshotId; - } - - public void setSnapshotId(Long snapshotId) { - this.snapshotId = snapshotId; - } - - public long getGuestOsId() { - return guestOsId; - } - - public void setGuestOsId(long guestOsId) { - this.guestOsId = guestOsId; - } - - public long getEventId() { - return eventId; - } - - public void setEventId(long eventId) { - this.eventId = eventId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Boolean getRequiresHvm() { - return requiresHvm; - } - - public void setRequiresHvm(Boolean requiresHvm) { - this.requiresHvm = requiresHvm; - } - - public Integer getBits() { - return bits; - } - - public void setBits(Integer bits) { - this.bits = bits; - } - - public Boolean isPasswordEnabled() { - return passwordEnabled; - } - - public void setPasswordEnabled(Boolean passwordEnabled) { - this.passwordEnabled = passwordEnabled; - } - - public Boolean isPublic() { - return isPublic; - } - - public boolean isFeatured() { - return isFeatured; - } - - public void setIsPublic(Boolean isPublic) { - this.isPublic = isPublic; - } -} diff --git a/server/src/com/cloud/async/executor/CreatePrivateTemplateResultObject.java b/server/src/com/cloud/async/executor/CreatePrivateTemplateResultObject.java deleted file mode 100644 index 56725f7e65c..00000000000 --- a/server/src/com/cloud/async/executor/CreatePrivateTemplateResultObject.java +++ /dev/null @@ -1,225 +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 java.util.Date; - -import com.cloud.serializer.Param; - -public class CreatePrivateTemplateResultObject { - @Param(name="id") - private long id; - - @Param(name="name") - private String name; - - @Param(name="displaytext") - private String displayText; - - @Param(name="ispublic", propName="public") - private boolean isPublic; - -// @Param(name="requireshvm") -// private boolean requiresHvm; -// -// @Param(name="bits") -// private int bits; - - @Param(name="created") - private Date created; - - @Param(name="isready", propName="ready") - private boolean isReady; - - @Param(name="passwordenabled") - private boolean passwordEnabled; - - @Param(name="crossZones") - private boolean crossZones; - - @Param(name="ostypeid") - private Long osTypeId; - - @Param(name="ostypename") - private String osTypeName; - - @Param(name="accountid") - private Long accountId; - - @Param(name="account") - private String account; - - @Param(name="zoneid") - private Long zoneId; - - @Param(name="zonename") - private String zoneName; - - @Param(name="domain") - private String domainName; - - @Param(name="domainid") - private long domainId; - - - 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 getAccountId() { - return accountId; - } - - public void setAccountId(Long accountId) { - this.accountId = accountId; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public Long getOsTypeId() { - return osTypeId; - } - - public void setOsTypeId(Long osTypeId) { - this.osTypeId = osTypeId; - } - - public String getOsTypeName() { - return osTypeName; - } - - public void setOsTypeName(String osTypeName) { - this.osTypeName = osTypeName; - } - - 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 getDisplayText() { - return displayText; - } - - public void setDisplayText(String displayText) { - this.displayText = displayText; - } - - public boolean isPublic() { - return isPublic; - } - - public void setPublic(boolean isPublic) { - this.isPublic = isPublic; - } - -// public boolean isRequiresHvm() { -// return requiresHvm; -// } -// -// public void setRequiresHvm(boolean requiresHvm) { -// this.requiresHvm = requiresHvm; -// } -// -// public int getBits() { -// return bits; -// } -// -// public void setBits(int bits) { -// this.bits = bits; -// } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public boolean isReady() { - return isReady; - } - - public void setReady(boolean isReady) { - this.isReady = isReady; - } - - public boolean isPasswordEnabled() { - return passwordEnabled; - } - - public void setPasswordEnabled(boolean passwordEnabled) { - this.passwordEnabled = passwordEnabled; - } - - public boolean isCrossZones() { - return crossZones; - } - - public void setCrossZones(boolean crossZones) { - this.crossZones = crossZones; - } - - public long getDomainId() { - return domainId; - } - - public String getDomainName(){ - return domainName; - } - - public void setDomainName(String domainName) { - this.domainName = domainName; - } - - public void setDomainId(long domainId) { - this.domainId = domainId; - } - -} diff --git a/server/src/com/cloud/async/executor/CreateSnapshotExecutor.java b/server/src/com/cloud/async/executor/CreateSnapshotExecutor.java deleted file mode 100755 index 5143b0cbf85..00000000000 --- a/server/src/com/cloud/async/executor/CreateSnapshotExecutor.java +++ /dev/null @@ -1,144 +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.async.AsyncJobManager; -import com.cloud.async.AsyncJobVO; -import com.cloud.async.BaseAsyncJobExecutor; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.storage.Snapshot; -import com.cloud.storage.Snapshot.Type; -import com.cloud.user.Account; -import com.google.gson.Gson; - -public class CreateSnapshotExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(CreateSnapshotExecutor.class.getName()); - - public boolean execute() { - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - Gson gson = GsonHelper.getBuilder().create(); - - /* - if (getSyncSource() == null) { - SnapshotOperationParam param = gson.fromJson(job.getCmdInfo(), SnapshotOperationParam.class); - asyncMgr.syncAsyncJobExecution(job.getId(), "Volume", param.getVolumeId()); - - // always true if it does not have sync-source - return true; - } else { - SnapshotOperationParam param = gson.fromJson(job.getCmdInfo(), SnapshotOperationParam.class); - SnapshotManager snapshotManager = asyncMgr.getExecutorContext().getSnapshotMgr(); - ManagementServer managementServer = getAsyncJobMgr().getExecutorContext().getManagementServer(); - VolumeDao volumeDao = asyncMgr.getExecutorContext().getVolumeDao(); - long volumeId = param.getVolumeId(); - long policyId = param.getPolicyId(); - long startEventId = param.getEventId(); - - long snapshotId = 0; - long userId = param.getUserId(); - - // By default assume that everything has failed. - boolean backedUp = false; - Long jobId = getJob().getId(); - int result = AsyncJobResult.STATUS_FAILED; - int errorCode = BaseCmd.INTERNAL_ERROR; - Object resultObject = "Failed to create snapshot."; - VolumeVO vol = null; - - try { - vol = volumeDao.acquire(volumeId, 10); - if( vol != null) { - managementServer.saveStartedEvent(userId, vol.getAccountId(), EventTypes.EVENT_SNAPSHOT_CREATE, "Start creating snapshot for volume:"+volumeId, startEventId); - SnapshotVO snapshot = snapshotManager.createSnapshot(userId, volumeId, policyId); - - if (snapshot != null && snapshot.getStatus() == Snapshot.Status.CreatedOnPrimary) { - snapshotId = snapshot.getId(); - asyncMgr.updateAsyncJobStatus(jobId, BaseCmd.PROGRESS_INSTANCE_CREATED, snapshotId); - backedUp = snapshotManager.backupSnapshotToSecondaryStorage(userId, snapshot, startEventId); - if (backedUp) { - result = AsyncJobResult.STATUS_SUCCEEDED; - errorCode = 0; // Success - resultObject = composeResultObject(snapshot); - } - else { - // More specific error - resultObject = "Created snapshot: " + snapshotId + " on primary but failed to backup on secondary"; - } - } else if (snapshot != null && snapshot.getStatus() == Snapshot.Status.EmptySnapshot) { - resultObject ="There is no change since last snapshot, please use last snapshot"; - s_logger.warn(resultObject); - } - } else { - resultObject = "Another snapshot is being created for " + volumeId + " try another time "; - s_logger.warn(resultObject); - } - } catch(Exception e) { - resultObject = "Unable to create snapshot: " + e.getMessage(); - s_logger.warn(resultObject, e); - } finally { - if( vol != null ){ - volumeDao.release(volumeId); - } - } - - // In all cases, ensure that we call completeAsyncJob to the asyncMgr. - asyncMgr.completeAsyncJob(jobId, result, errorCode, resultObject); - - // Cleanup jobs to do after the snapshot has been created. - snapshotManager.postCreateSnapshot(userId, volumeId, snapshotId, policyId, backedUp); - return true; - } - */ - return true; - } - - private CreateSnapshotResultObject composeResultObject(Snapshot snapshot) { - CreateSnapshotResultObject resultObject = new CreateSnapshotResultObject(); - ManagementServer managementServer = getAsyncJobMgr().getExecutorContext().getManagementServer(); -// VolumeVO volume = managementServer.findVolumeById(snapshot.getVolumeId()); - - resultObject.setId(snapshot.getId()); - long domainId = -1; - Account account = getAsyncJobMgr().getExecutorContext().getAccountDao().findById(snapshot.getAccountId()); - if(account != null) - { - resultObject.setAccountName(account.getAccountName()); - domainId = account.getDomainId(); - - if(domainId != -1) - { - resultObject.setDomainId(domainId); -// resultObject.setDomainName(getAsyncJobMgr().getExecutorContext().getManagementServer().findDomainIdById(domainId).getName()); - } - - } - String snapshotTypeStr = Type.values()[snapshot.getSnapshotType()].name(); - resultObject.setSnapshotType(snapshotTypeStr); - resultObject.setVolumeId(snapshot.getVolumeId()); -// resultObject.setVolumeName(volume.getName()); -// resultObject.setVolumeType(volume.getVolumeType()); - resultObject.setCreated(snapshot.getCreated()); - resultObject.setName(snapshot.getName()); - return resultObject; - } -} diff --git a/server/src/com/cloud/async/executor/CreateSnapshotResultObject.java b/server/src/com/cloud/async/executor/CreateSnapshotResultObject.java deleted file mode 100644 index 6f07e7c6502..00000000000 --- a/server/src/com/cloud/async/executor/CreateSnapshotResultObject.java +++ /dev/null @@ -1,149 +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 java.util.Date; - -import com.cloud.serializer.Param; -import com.cloud.storage.Volume.VolumeType; - -public class CreateSnapshotResultObject { - - @Param(name="id") - private long id; - - @Param(name="account") - private String accountName; - - @Param(name="volumeid") - private long volumeId; - - @Param(name="domainid") - private long domainId; - - @Param(name="domainname") - private String domainName; - - @Param(name="created") - private Date created; - - @Param(name="name") - private String name; - - @Param(name="path") - private String path; - - @Param(name="snapshottype") - private String snapshotType; - - @Param(name="volumename") - private String volumeName; - - @Param(name="volumetype") - private VolumeType volumeType; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getAccountName() { - return accountName; - } - - public void setAccountName(String accountName) { - this.accountName = accountName; - } - - public long getVolumeId() { - return volumeId; - } - - public void setVolumeId(long volumeId) { - this.volumeId = volumeId; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - - public void setDomainId(long domainId) { - this.domainId = domainId; - } - - public long getDomainId() { - return domainId; - } - - public void setDomainName(String domainName) { - this.domainName = domainName; - } - - public String getDomainName() { - return domainName; - } - - public void setSnapshotType(String snapshotType){ - this.snapshotType = snapshotType; - } - - public String getSnapshotType(){ - return this.snapshotType; - } - - public String getVolumeName() { - return volumeName; - } - - public void setVolumeName(String volumeName) { - this.volumeName = volumeName; - } - - public VolumeType getVolumeType() { - return volumeType; - } - - public void setVolumeType(VolumeType volumeType) { - this.volumeType = volumeType; - } -} diff --git a/server/src/com/cloud/async/executor/CreateVolumeFromSnapshotExecutor.java b/server/src/com/cloud/async/executor/CreateVolumeFromSnapshotExecutor.java deleted file mode 100644 index 28f893ab7b2..00000000000 --- a/server/src/com/cloud/async/executor/CreateVolumeFromSnapshotExecutor.java +++ /dev/null @@ -1,134 +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.AsyncInstanceCreateStatus; -import com.cloud.async.AsyncJobExecutorContext; -import com.cloud.async.AsyncJobManager; -import com.cloud.async.AsyncJobResult; -import com.cloud.async.AsyncJobVO; -import com.cloud.async.BaseAsyncJobExecutor; -import com.cloud.configuration.ResourceCount.ResourceType; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.ResourceAllocationException; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.storage.Snapshot; -import com.cloud.storage.StorageManager; -import com.cloud.storage.VolumeVO; -import com.cloud.user.Account; -import com.cloud.user.AccountManager; -import com.cloud.user.AccountVO; -import com.google.gson.Gson; - -public class CreateVolumeFromSnapshotExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(CreateVolumeFromSnapshotExecutor.class.getName()); - - public boolean execute() { - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobExecutorContext context = asyncMgr.getExecutorContext(); - ManagementServer managerServer = context.getManagementServer(); - //SnapshotManager snapshotManager = context.getSnapshotMgr(); - StorageManager storageManager = context.getStorageMgr(); - AccountManager accountManager = context.getAccountMgr(); - /* - if (getSyncSource() == null) { - SnapshotOperationParam param = gson.fromJson(job.getCmdInfo(), SnapshotOperationParam.class); - asyncMgr.syncAsyncJobExecution(job.getId(), "Volume", param.getVolumeId()); - - // always true if it does not have sync-source - return true; - } else { - SnapshotOperationParam param = gson.fromJson(job.getCmdInfo(), SnapshotOperationParam.class); - VolumeVO volume = null; - - // By default assume that everything has failed. - Long jobId = getJob().getId(); - int result = AsyncJobResult.STATUS_FAILED; - int errorCode = BaseCmd.INTERNAL_ERROR; - Object resultObject = "Failed to create volume from snapshot: " + param.getSnapshotId(); - - try { - long accountId = param.getAccountId(); - long userId = param.getUserId(); - long snapshotId = param.getSnapshotId(); - String volumeName = param.getName(); - Snapshot snapshot = managerServer.findSnapshotById(snapshotId); - if (snapshot == null) { - throw new InvalidParameterValueException("The snapshot was deleted after createVolumeFromSnapshot command was issued."); - } - AccountVO account = (AccountVO) managerServer.findAccountById(snapshot.getAccountId()); - - // Check that the resource limit for volumes won't be exceeded - if (accountManager.resourceLimitExceeded(account, ResourceType.volume)) { - ResourceAllocationException rae = new ResourceAllocationException("Maximum number of volumes for account: " + account.getAccountName() + " has been exceeded."); - rae.setResourceType("volume"); - throw rae; - } - - volume = storageManager.createVolumeFromSnapshot(userId, accountId, snapshotId, volumeName, param.getEventId()); - - if (volume != null && volume.getStatus() == AsyncInstanceCreateStatus.Created) { - result = AsyncJobResult.STATUS_SUCCEEDED; - errorCode = 0; // Success - resultObject = composeResultObject(volume); - // Increment the number of volumes - accountManager.incrementResourceCount(accountId, ResourceType.volume); - } - } catch(Exception e) { - resultObject = (String)resultObject + ", reason: " + e.getMessage(); - s_logger.warn(resultObject, e); - } - // In all cases, ensure that we call completeAsyncJob to the asyncMgr. - asyncMgr.completeAsyncJob(jobId, result, errorCode, resultObject); - return true; - } - */ - return true; - } - - private VolumeOperationResultObject composeResultObject(VolumeVO volume) - { - VolumeOperationResultObject resultObject = new VolumeOperationResultObject(); - ManagementServer managementServer = getAsyncJobMgr().getExecutorContext().getManagementServer(); - resultObject.setId(volume.getId()); - resultObject.setName(volume.getName()); - resultObject.setVolumeType(volume.getVolumeType()); - resultObject.setVolumeSize(volume.getSize()); - resultObject.setDiskOfferingId(volume.getDiskOfferingId()); - resultObject.setCreatedDate(volume.getCreated()); - resultObject.setState(volume.getStatus()); - Long accountId = volume.getAccountId(); - Account account = managementServer.findAccountById(accountId); - resultObject.setAccountName(account.getAccountName()); - resultObject.setDomainId(volume.getDomainId()); -// resultObject.setDomain(managementServer.findDomainIdById(volume.getDomainId()).getName()); - resultObject.setZoneId(volume.getDataCenterId()); -// resultObject.setZoneName(getAsyncJobMgr().getExecutorContext().getManagementServer().getDataCenterBy(volume.getDataCenterId()).getName()); - resultObject.setStorageType("shared"); // NOTE: You can never create a local disk volume but if that changes, we need to change this - if (volume.getPoolId() != null) - resultObject.setStorage(managementServer.findPoolById(volume.getPoolId()).getName()); - return resultObject; - } -} diff --git a/server/src/com/cloud/async/executor/DeleteDomainExecutor.java b/server/src/com/cloud/async/executor/DeleteDomainExecutor.java deleted file mode 100644 index bc09b62d19a..00000000000 --- a/server/src/com/cloud/async/executor/DeleteDomainExecutor.java +++ /dev/null @@ -1,56 +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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.google.gson.Gson; - -public class DeleteDomainExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(DeleteDomainExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - DeleteDomainParam param = gson.fromJson(job.getCmdInfo(), DeleteDomainParam.class); - - /* - try { - String result = managementServer.deleteDomain(param.getDomainId(), param.getOwnerId(), param.getCleanup()); - if (result == null) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, "success"); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, result); - } - } catch(Exception e) { - s_logger.warn("Unable to delete domain : " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } - */ - return true; - } -} diff --git a/server/src/com/cloud/async/executor/DeleteDomainParam.java b/server/src/com/cloud/async/executor/DeleteDomainParam.java deleted file mode 100644 index 740ab6827c1..00000000000 --- a/server/src/com/cloud/async/executor/DeleteDomainParam.java +++ /dev/null @@ -1,44 +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; - -public class DeleteDomainParam { - private Long domainId; - private Long ownerId; - private Boolean cleanup; - - public DeleteDomainParam() {} - - public DeleteDomainParam(Long domainId, Long ownerId, Boolean cleanup) { - this.domainId = domainId; - this.ownerId = ownerId; - this.cleanup = cleanup; - } - - public Long getDomainId() { - return domainId; - } - - public Long getOwnerId() { - return ownerId; - } - - public Boolean getCleanup() { - return cleanup; - } -} diff --git a/server/src/com/cloud/async/executor/DeleteLoadBalancerExecutor.java b/server/src/com/cloud/async/executor/DeleteLoadBalancerExecutor.java deleted file mode 100644 index 34c042e53e9..00000000000 --- a/server/src/com/cloud/async/executor/DeleteLoadBalancerExecutor.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.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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.google.gson.Gson; - -public class DeleteLoadBalancerExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(DeleteLoadBalancerExecutor.class.getName()); - - @Override - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - LoadBalancerParam param = gson.fromJson(job.getCmdInfo(), LoadBalancerParam.class); - - /* - if (getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job.getId(), "Router", param.getDomainRouterId()); - - // always true if it does not have sync-source - return true; - } else { - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - try { - boolean result = managementServer.deleteLoadBalancer(param.getUserId(), param.getLoadBalancerId().longValue()); - if (result) - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, Boolean.valueOf(result).toString()); - else - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - Boolean.valueOf(result).toString()); - } catch(Exception e) { - s_logger.warn("Unable to delete load balancer : " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - return true; - } - */ - return true; - } -} diff --git a/server/src/com/cloud/async/executor/DeleteNetworkRuleConfigExecutor.java b/server/src/com/cloud/async/executor/DeleteNetworkRuleConfigExecutor.java deleted file mode 100644 index b6694438d3e..00000000000 --- a/server/src/com/cloud/async/executor/DeleteNetworkRuleConfigExecutor.java +++ /dev/null @@ -1,51 +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 com.cloud.async.AsyncJobManager; -import com.cloud.async.AsyncJobResult; -import com.cloud.async.AsyncJobVO; -import com.cloud.async.BaseAsyncJobExecutor; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.google.gson.Gson; - -public class DeleteNetworkRuleConfigExecutor extends BaseAsyncJobExecutor { - - @Override - 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); - - /* - boolean success = managementServer.deleteNetworkRuleConfig(job.getUserId(), param.longValue()); - if (success) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, "success"); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, 0, "failed"); - } - */ - - return true; - } - -} diff --git a/server/src/com/cloud/async/executor/DeleteRuleExecutor.java b/server/src/com/cloud/async/executor/DeleteRuleExecutor.java deleted file mode 100644 index 027cc586a8f..00000000000 --- a/server/src/com/cloud/async/executor/DeleteRuleExecutor.java +++ /dev/null @@ -1,72 +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.exception.InternalErrorException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.PermissionDeniedException; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.google.gson.Gson; - -public class DeleteRuleExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(DeleteRuleExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - DeleteRuleParam param = gson.fromJson(job.getCmdInfo(), DeleteRuleParam.class); - /* - try { - managementServer.deleteRule(param.getRuleId(), param.getUserId(), param.getAccountId()); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - "success"); - } catch (InvalidParameterValueException e) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to delete rule: " + e.getMessage()); - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.PARAM_ERROR, e.getMessage()); - } catch (PermissionDeniedException e) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to delete rule: " + e.getMessage()); - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.PARAM_ERROR, e.getMessage()); - } catch (InternalErrorException e) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to delete rule: " + e.getMessage()); - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } catch(Exception e) { - s_logger.warn("Unable to delete rule: " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } - */ - return true; - } -} diff --git a/server/src/com/cloud/async/executor/DeleteRuleParam.java b/server/src/com/cloud/async/executor/DeleteRuleParam.java deleted file mode 100644 index 680df511a6f..00000000000 --- a/server/src/com/cloud/async/executor/DeleteRuleParam.java +++ /dev/null @@ -1,58 +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; - -public class DeleteRuleParam { - private long ruleId; - private long userId; - private long accountId; - - public DeleteRuleParam() { - } - - public DeleteRuleParam(long id, long userId, long accountId) { - this.ruleId = id; - this.userId = userId; - this.accountId = accountId; - } - - public long getRuleId() { - return ruleId; - } - - public void setRuleId(long ruleId) { - this.ruleId = ruleId; - } - - public long getUserId() { - return userId; - } - - public void setUserId(long userId) { - this.userId = userId; - } - - public long getAccountId() { - return accountId; - } - - public void setAccountId(long accountId) { - this.accountId = accountId; - } -} diff --git a/server/src/com/cloud/async/executor/DeleteSnapshotExecutor.java b/server/src/com/cloud/async/executor/DeleteSnapshotExecutor.java deleted file mode 100644 index 4ca3c013b96..00000000000 --- a/server/src/com/cloud/async/executor/DeleteSnapshotExecutor.java +++ /dev/null @@ -1,83 +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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.storage.Snapshot; -import com.cloud.storage.snapshot.SnapshotManager; -import com.google.gson.Gson; - -public class DeleteSnapshotExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(DeleteSnapshotExecutor.class.getName()); - - public boolean execute() { - - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - SnapshotManager snapshotManager = asyncMgr.getExecutorContext().getSnapshotMgr(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - - /* - if(getSyncSource() == null) { - SnapshotOperationParam param = gson.fromJson(job.getCmdInfo(), SnapshotOperationParam.class); - Snapshot snapshot = managementServer.findSnapshotById(param.getSnapshotId()); - if(snapshot != null) { - asyncMgr.syncAsyncJobExecution(job.getId(), "Volume", snapshot.getVolumeId()); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "snapshot no long exists"); - } - - // always true if it does not have sync-source - return true; - } else { - SnapshotOperationParam param = gson.fromJson(job.getCmdInfo(), SnapshotOperationParam.class); - Long jobId = getJob().getId(); - int result = AsyncJobResult.STATUS_FAILED; - int errorCode = BaseCmd.INTERNAL_ERROR; - Object resultObject = "Failed to delete snapshot."; - - try { - if(snapshotManager.deleteSnapshot(param.getUserId(), param.getSnapshotId(), param.getPolicyId())) { - result = AsyncJobResult.STATUS_SUCCEEDED; - errorCode = 0; - resultObject = "success"; // Might want to put something more substantial later. - } - } catch(Exception e) { - resultObject = "Unable to destroy snapshot: " + e.getMessage(); - s_logger.warn(resultObject, e); - } - // In all cases, ensure that we call completeAsyncJob to the asyncMgr. - asyncMgr.completeAsyncJob(jobId, result, errorCode, resultObject); - return true; - } - */ - return true; - } - -} diff --git a/server/src/com/cloud/async/executor/DeleteUserExecutor.java b/server/src/com/cloud/async/executor/DeleteUserExecutor.java deleted file mode 100644 index 0628e8afb45..00000000000 --- a/server/src/com/cloud/async/executor/DeleteUserExecutor.java +++ /dev/null @@ -1,70 +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.event.EventTypes; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.google.gson.Gson; -import com.cloud.user.User; -import com.google.gson.Gson; - -public class DeleteUserExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(DeleteUserExecutor.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); - /* - try { - if(managementServer.deleteUser(param.longValue())) { - DeleteUserParam param = gson.fromJson(job.getCmdInfo(), DeleteUserParam.class); - - try { - User user = managementServer.getUser(param.getUserId(), true); - String description = "Starting deleting User " + user.getUsername() + " (id: " + param.getUserId() - + ") for accountId = " + user.getAccountId(); - managementServer.saveStartedEvent(1L, 1L, EventTypes.EVENT_USER_DELETE, description, param.getEventId()); - - if(managementServer.deleteUser(param.getUserId())) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - "success"); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "operation failed"); - } - } catch(Exception e) { - s_logger.warn("Unable to delete User " + param.getUserId() + ": " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - */ - return true; - } -} diff --git a/server/src/com/cloud/async/executor/DeleteUserParam.java b/server/src/com/cloud/async/executor/DeleteUserParam.java deleted file mode 100644 index 97974992c1f..00000000000 --- a/server/src/com/cloud/async/executor/DeleteUserParam.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.cloud.async.executor; - -public class DeleteUserParam { - - private Long userId; - private Long eventId; - - public DeleteUserParam() {} - - public DeleteUserParam(Long userId, Long eventId) { - this.userId = userId; - this.eventId = eventId; - - } - - public Long getUserId() { - return userId; - } - - public Long getEventId() { - return eventId; - } - - -} diff --git a/server/src/com/cloud/async/executor/DeployVMExecutor.java b/server/src/com/cloud/async/executor/DeployVMExecutor.java deleted file mode 100644 index a962e9bf29a..00000000000 --- a/server/src/com/cloud/async/executor/DeployVMExecutor.java +++ /dev/null @@ -1,253 +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.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.EventUtils; -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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.service.ServiceOfferingVO; -import com.cloud.storage.StoragePoolVO; -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VolumeVO; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.cloud.uservm.UserVm; -import com.cloud.utils.Pair; -import com.cloud.utils.exception.ExecutionException; -import com.cloud.vm.InstanceGroupVO; -import com.google.gson.Gson; - -public class DeployVMExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(DeployVMExecutor.class.getName()); - - @Override - public boolean execute() { - // currently deploy VM operation will not be sync-ed with any queue, execute it directly - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - - DeployVMParam param = gson.fromJson(job.getCmdInfo(), DeployVMParam.class); - /* - try { - UserVm vm = asyncMgr.getExecutorContext().getManagementServer().deployVirtualMachine( - param.getUserId(), param.getAccountId(), param.getDataCenterId(), - param.getServiceOfferingId(), - param.getTemplateId(), param.getDiskOfferingId(), param.getDomain(), - param.getPassword(), param.getDisplayName(), param.getGroup(), param.getUserData(), param.getNetworkGroup(), param.getEventId(), param.getSize()); - - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_SUCCEEDED, 0, composeResultObject(param.getUserId(), 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"); - 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"); - 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"); - 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"); - 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"); - 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"); - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } - */ - return true; - } - - @Override - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - } - - @Override - public void processDisconnect(VMOperationListener listener, long agentId) { - } - - @Override - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - } - - private long saveEvent(DeployVMParam param, String level, String type, String description){ - return EventUtils.saveEvent(param.getUserId(), param.getAccountId(), level, type, description, null, param.getEventId()); - } - - private DeployVMResultObject composeResultObject(long userId, UserVm vm, DeployVMParam param) { - DeployVMResultObject resultObject = new DeployVMResultObject(); - - if(vm == null) - return resultObject; - - resultObject.setId(vm.getId()); - resultObject.setName(vm.getName()); - resultObject.setCreated(vm.getCreated()); - resultObject.setZoneId(vm.getDataCenterId()); - resultObject.setZoneName(getAsyncJobMgr().getExecutorContext().getManagementServer().findDataCenterById(vm.getDataCenterId()).getName()); - resultObject.setIpAddress(vm.getPrivateIpAddress()); - resultObject.setServiceOfferingId(vm.getServiceOfferingId()); - resultObject.setHaEnabled(vm.isHaEnabled()); - if (vm.getDisplayName() == null || vm.getDisplayName().length() == 0) { - resultObject.setDisplayName(vm.getName()); - } - else { - resultObject.setDisplayName(vm.getDisplayName()); - } - - if(vm.getState() != null) - resultObject.setState(vm.getState().toString()); - - ManagementServer managementServer = getAsyncJobMgr().getExecutorContext().getManagementServer(); - - InstanceGroupVO group = managementServer.getGroupForVm(vm.getId()); - if (group != null) { - resultObject.setGroupId(group.getId()); - resultObject.setGroup(group.getName()); - } - - VMTemplateVO template = managementServer.findTemplateById(vm.getTemplateId()); - - Account acct = managementServer.findAccountById(Long.valueOf(vm.getAccountId())); - if (acct != null) { - resultObject.setAccount(acct.getAccountName()); - 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()); - } - - String templateName = "none"; - boolean templatePasswordEnabled = false; - String templateDisplayText = null; - - if (template != null) { - templateName = template.getName(); - templatePasswordEnabled = template.getEnablePassword(); - templateDisplayText = template.getDisplayText(); - if (templateDisplayText == null) { - templateDisplayText = templateName; - } - } - - if (templatePasswordEnabled) { - resultObject.setPassword(param.getPassword()); - } - - // ISO Info - Long isoId = vm.getIsoId(); - if (isoId != null) { - VMTemplateVO iso = getAsyncJobMgr().getExecutorContext().getManagementServer().findTemplateById(isoId.longValue()); - if (iso != null) { - resultObject.setIsoId(isoId.longValue()); - resultObject.setIsoName(iso.getName()); - resultObject.setTemplateId(isoId.longValue()); - resultObject.setTemplateName(iso.getName()); - - templateDisplayText = iso.getDisplayText(); - if(templateDisplayText == null) - templateDisplayText = iso.getName(); - resultObject.setIsoDisplayText(templateDisplayText); - resultObject.setTemplateDisplayText(templateDisplayText); - } - } - else - { - resultObject.setTemplateId(vm.getTemplateId()); - resultObject.setTemplateName(templateName); - resultObject.setTemplateDisplayText(templateDisplayText); - resultObject.setPasswordEnabled(templatePasswordEnabled); - } - - ServiceOfferingVO offering = managementServer.findServiceOfferingById(vm.getServiceOfferingId()); - resultObject.setServiceOfferingId(vm.getServiceOfferingId()); - resultObject.setServiceOfferingName(offering.getName()); - - resultObject.setCpuNumber(String.valueOf(offering.getCpu())); - resultObject.setCpuSpeed(String.valueOf(offering.getSpeed())); - resultObject.setMemory(String.valueOf(offering.getRamSize())); - - //root device related -// VolumeVO rootVolume = managementServer.findRootVolume(vm.getId()); -// if(rootVolume!=null) -// { -// resultObject.setRootDeviceId(rootVolume.getDeviceId()); -// StoragePoolVO storagePool = managementServer.findPoolById(rootVolume.getPoolId()); -// resultObject.setRootDeviceType(storagePool.getPoolType().toString()); -// } - -// resultObject.setNetworkGroupList(managementServer.getNetworkGroupsNamesForVm(vm.getId())); - return resultObject; - } -} diff --git a/server/src/com/cloud/async/executor/DeployVMParam.java b/server/src/com/cloud/async/executor/DeployVMParam.java deleted file mode 100644 index 4727b51142c..00000000000 --- a/server/src/com/cloud/async/executor/DeployVMParam.java +++ /dev/null @@ -1,169 +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; - -public class DeployVMParam extends VMOperationParam { - - private long dataCenterId; - private long serviceOfferingId; - private long templateId; - private Long diskOfferingId; - private String domain; - private String password; - private String displayName; - private String group; - private String userData; - private long domainId; - private String [] networkGroups; - private long size; - - public DeployVMParam() { - } - - public DeployVMParam(long userId, long accountId, long dataCenterId, - long serviceOfferingId, long templateId, - Long diskOfferingId, String domain, String password, - String displayName, String group, String userData, String [] networkGroups) { - - setUserId(userId); - setAccountId(accountId); - this.dataCenterId = dataCenterId; - this.serviceOfferingId = serviceOfferingId; - this.templateId = templateId; - this.diskOfferingId = diskOfferingId; - this.domain = domain; - this.password = password; - this.displayName = displayName; - this.group = group; - this.userData = userData; - this.setNetworkGroups(networkGroups); - } - - public DeployVMParam(long userId, long accountId, long dataCenterId, - long serviceOfferingId, long templateId, - Long diskOfferingId, String domain, String password, - String displayName, String group, String userData, - String [] networkGroups, long eventId, long size) { - - setUserId(userId); - setAccountId(accountId); - this.dataCenterId = dataCenterId; - this.serviceOfferingId = serviceOfferingId; - this.templateId = templateId; - this.diskOfferingId = diskOfferingId; - this.domain = domain; - this.password = password; - this.displayName = displayName; - this.group = group; - this.userData = userData; - this.setNetworkGroups(networkGroups); - this.eventId = eventId; - this.size = size; - } - - public long getSize(){ - return size; - } - - public long getDataCenterId() { - return dataCenterId; - } - - public void setDataCenterId(long dataCenterId) { - this.dataCenterId = dataCenterId; - } - - public long getServiceOfferingId() { - return serviceOfferingId; - } - - public void setServiceOfferingId(long serviceOfferingId) { - this.serviceOfferingId = serviceOfferingId; - } - - public Long getDiskOfferingId() { - return diskOfferingId; - } - - public void setDiskOfferingId(Long diskOfferingId) { - this.diskOfferingId = diskOfferingId; - } - - public long getTemplateId() { - return templateId; - } - - public void setTemplateId(long templateId) { - this.templateId = templateId; - } - - public String getDomain() { - return domain; - } - - public void setDomain(String domain) { - this.domain = domain; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - public String getGroup() { - return group; - } - - public void setGroup(String group) { - this.group = group; - } - public long getDomainId() { - return domainId; - } - public void setDomainId(long domainId) { - this.domainId = domainId; - } - - public void setUserData(String userData) { - this.userData = userData; - } - - public String getUserData() { - return userData; - } - - public void setNetworkGroups(String [] networkGroups) { - this.networkGroups = networkGroups; - } - - public String [] getNetworkGroup() { - return networkGroups; - } -} diff --git a/server/src/com/cloud/async/executor/DeployVMResultObject.java b/server/src/com/cloud/async/executor/DeployVMResultObject.java deleted file mode 100644 index be0982ecc9e..00000000000 --- a/server/src/com/cloud/async/executor/DeployVMResultObject.java +++ /dev/null @@ -1,413 +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 java.util.Date; - -import com.cloud.serializer.Param; - -public class DeployVMResultObject { - - @Param(name="id") - private long id; - - @Param(name="name") - private String name; - - @Param(name="created") - private Date created; - - @Param(name="zoneid") - - private Long zoneId; - - @Param(name="zonename") - private String zoneName; - - @Param(name="ipaddress") - private String ipAddress; - - @Param(name="serviceofferingid") - private Long serviceOfferingId; - - @Param(name="haenable") - private boolean haEnabled; - - @Param(name="state") - private String state; - - @Param(name="templateid") - private Long templateId; - - @Param(name="isoid") - private Long isoId; - - @Param(name="password") - private String password; - - @Param(name="templatename") - private String templateName; - - @Param(name="isoname") - private String isoName; - - @Param(name="templatedisplaytext") - private String templateDisplayText; - - @Param(name="isodisplaytext") - private String isoDisplayText; - - @Param(name="passwordenabled") - private boolean passwordEnabled; - - @Param(name="serviceofferingname") - private String serviceOfferingName; - - @Param(name="diskofferingid") - private Long diskOfferingId; - - @Param(name="diskofferingname") - private String diskOfferingName; - - @Param(name="cpunumber") - private String cpuNumber; - - @Param(name="cpuspeed") - private String cpuSpeed; - - @Param(name="memory") - private String memory; - - @Param(name="storage") - private String storage; - - @Param(name="displayname") - private String displayName; - - @Param(name="group") - private String group; - - @Param(name="groupid") - private Long groupId; - - @Param(name="domainid") - private Long domainId; - - @Param(name="domain") - private String domain; - - @Param(name="account") - private String account; - - @Param(name="hostname") - private String hostname; - - @Param(name="hostid") - private Long hostid; - - @Param(name="securitygrouplist") - private String securityGroupList; - - @Param(name="rootdeviceid") - private Long rootDeviceId; - - @Param(name="rootdevicetype") - private String rootDeviceType; - - public Long getRootDeviceId(){ - return this.rootDeviceId; - } - - public void setRootDeviceId(Long rootDeviceId){ - this.rootDeviceId = rootDeviceId; - } - - public String getRootDeviceType(){ - return this.rootDeviceType; - } - - public void setRootDeviceType(String deviceType){ - this.rootDeviceType = deviceType; - } - - public String getSecurityGroupList(){ - return this.securityGroupList; - } - - public void setSecurityGroupList(String nGroups){ - this.securityGroupList = nGroups; - } - - public String getIsoDisplayText() { - return isoDisplayText; - } - - public void setIsoDisplayText(String text) { - this.isoDisplayText = text; - } - - 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 Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - 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 String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - public Long getServiceOfferingId() { - return serviceOfferingId; - } - - public void setServiceOfferingId(Long serviceOfferingId) { - this.serviceOfferingId = serviceOfferingId; - } - - public boolean isHaEnabled() { - return haEnabled; - } - - public void setHaEnabled(boolean haEnabled) { - this.haEnabled = haEnabled; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public Long getTemplateId() { - return templateId; - } - - public void setTemplateId(Long templateId) { - this.templateId = templateId; - } - - public Long getIsoId() { - return isoId; - } - - public void setIsoId(Long isoId) { - this.isoId = isoId; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getTemplateName() { - return templateName; - } - - public void setTemplateName(String templateName) { - this.templateName = templateName; - } - - public String getIsoName() { - return isoName; - } - - public void setIsoName(String isoName) { - this.isoName = isoName; - } - - public String getTemplateDisplayText() { - return templateDisplayText; - } - - public void setTemplateDisplayText(String templateDisplayText) { - this.templateDisplayText = templateDisplayText; - } - - public boolean isPasswordEnabled() { - return passwordEnabled; - } - - public void setPasswordEnabled(boolean passwordEnabled) { - this.passwordEnabled = passwordEnabled; - } - - public String getServiceOfferingName() { - return serviceOfferingName; - } - - public void setServiceOfferingName(String serviceOfferingName) { - this.serviceOfferingName = serviceOfferingName; - } - - public Long getDiskOfferingId() { - return diskOfferingId; - } - - public void setDiskOfferingId(Long diskOfferingId) { - this.diskOfferingId = diskOfferingId; - } - - public String getDiskOfferingName() { - return diskOfferingName; - } - - public void setDiskOfferingName(String diskOfferingName) { - this.diskOfferingName = diskOfferingName; - } - - public String getCpuNumber() { - return cpuNumber; - } - - public void setCpuNumber(String cpuNumber) { - this.cpuNumber = cpuNumber; - } - - public String getCpuSpeed() { - return cpuSpeed; - } - - public void setCpuSpeed(String cpuSpeed) { - this.cpuSpeed = cpuSpeed; - } - - public String getMemory() { - return memory; - } - - public void setMemory(String memory) { - this.memory = memory; - } - - public String getStorage() { - return storage; - } - - public void setStorage(String stroage) { - this.storage = stroage; - } - - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - public String getGroup() { - return group; - } - - public void setGroup(String group) { - this.group = group; - } - - public Long getGroupId() { - return groupId; - } - - public void setGroupId(Long groupId) { - this.groupId = groupId; - } - - public Long getDomainId() { - return domainId; - } - - public void setDomainId(Long domainId) { - this.domainId = domainId; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public String getHostname() { - return hostname; - } - - public void setHostname(String hostname) { - this.hostname = hostname; - } - - public Long getHostid() { - return hostid; - } - - public void setHostid(Long hostid) { - this.hostid = hostid; - } - - public String getDomain() { - return domain; - } - - public void setDomain(String domain) { - this.domain = domain; - } - -} diff --git a/server/src/com/cloud/async/executor/DestroyConsoleProxyExecutor.java b/server/src/com/cloud/async/executor/DestroyConsoleProxyExecutor.java deleted file mode 100644 index 95d09928fdb..00000000000 --- a/server/src/com/cloud/async/executor/DestroyConsoleProxyExecutor.java +++ /dev/null @@ -1,73 +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.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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.google.gson.Gson; - -public class DestroyConsoleProxyExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(DestroyConsoleProxyExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - /* - if(getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job.getId(), "ConsoleProxy", param.getVmId()); - return true; - } else { - try { - boolean result = managementServer.destroyConsoleProxy(param.getVmId(), param.getEventId()); - if(result) - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - "success"); - else - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "operation failed"); - } catch(Exception e) { - s_logger.warn("Unable to destroy console proxy " + param.getVmId() + ":" + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - return true; - } - */ - return true; - } - - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - } - - public void processDisconnect(VMOperationListener listener, long agentId) { - } - - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - } -} diff --git a/server/src/com/cloud/async/executor/DisableAccountExecutor.java b/server/src/com/cloud/async/executor/DisableAccountExecutor.java deleted file mode 100644 index bb72cebd05f..00000000000 --- a/server/src/com/cloud/async/executor/DisableAccountExecutor.java +++ /dev/null @@ -1,162 +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 java.util.List; - -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.async.SyncQueueItemVO; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.user.AccountVO; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.Transaction; -import com.cloud.vm.DomainRouterVO; -import com.google.gson.Gson; - -public class DisableAccountExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(DisableAccountExecutor.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); - -// SyncQueueItemVO syncItem = getSyncSource(); -// if(syncItem == null) { -// initialSchedule(managementServer, param.longValue()); -// } else { -// if(allRouterOperationCeased(job)) { -// if(s_logger.isInfoEnabled()) -// s_logger.info("All previous router operations have ceased, we can now disable account " + param); -// -// if(managementServer.disableAccount(param.longValue())) { -// asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, -// "success"); -// } else { -// asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, -// "failed"); -// } -// } else { -// if(s_logger.isInfoEnabled()) -// s_logger.info("Previous operation on router " + syncItem.getContentId() -// + " has ceased, still more to go to disable account " + param); -// } -// } - return true; - } - - public void initialSchedule(ManagementServer managementServer, long accountId) { - AsyncJobManager asyncMgr = getAsyncJobMgr(); - - AccountVO account = asyncMgr.getExecutorContext().getAccountDao().acquireInLockTable(accountId); - - if(account == null) { - s_logger.warn("Unable to acquire account." + accountId + " to execute disable account command"); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "unabled to acquire account." + accountId + " lock"); - return; - } - -// try { -// List routers = asyncMgr.getExecutorContext().getRouterDao().listBy(accountId); -// if(routers.size() > 0) { -// scheduleOperationAfterAllRouterOperations(managementServer, accountId, routers); -// } else { -// if(s_logger.isInfoEnabled()) -// s_logger.info("Account " + accountId + " does not have running router, disable the account directly"); -// -// if(managementServer.disableAccount(accountId)) { -// asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, -// "success"); -// } else { -// asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, -// "failed"); -// } -// } -// } catch (Exception e) { -// s_logger.warn("Unable to disable account: " + e.getMessage(), e); -// asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, -// e.getMessage()); -// } finally { -// asyncMgr.getExecutorContext().getAccountDao().releaseFromLockTable(accountId); -// } - } - - @DB - protected void scheduleOperationAfterAllRouterOperations(ManagementServer managementServer, long accountId, - List routers) { - - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - - Transaction txn = Transaction.currentTxn(); - try { - txn.start(); - - asyncMgr.updateAsyncJobStatus(job.getId(), routers.size(), ""); - for(DomainRouterVO router : routers) { - if(s_logger.isInfoEnabled()) - s_logger.info("Serialize DisableAccount operation on account " + accountId - + " with previous activities on router " + router.getId()); - asyncMgr.syncAsyncJobExecution(job, "Router", router.getId()); - } - - txn.commit(); - } catch (Exception e) { - txn.rollback(); - s_logger.warn("Unexpected exception " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - } - - @DB - protected boolean allRouterOperationCeased(AsyncJobVO job) { - AsyncJobManager asyncMgr = getAsyncJobMgr(); - Transaction txn = Transaction.currentTxn(); - - try { - txn.start(); - - AsyncJobVO jobUpdate = asyncMgr.getExecutorContext().getJobDao().lockRow(job.getId(), true); - int progress = jobUpdate.getProcessStatus(); - jobUpdate.setProcessStatus(progress -1); - asyncMgr.getExecutorContext().getJobDao().update(job.getId(), jobUpdate); - - txn.commit(); - - return progress == 1; - } catch(Exception e) { - s_logger.warn("Unexpected exception " + e.getMessage(), e); - - txn.rollback(); - } - return false; - } -} diff --git a/server/src/com/cloud/async/executor/DisableUserExecutor.java b/server/src/com/cloud/async/executor/DisableUserExecutor.java deleted file mode 100644 index 7d7a7b7ba7e..00000000000 --- a/server/src/com/cloud/async/executor/DisableUserExecutor.java +++ /dev/null @@ -1,191 +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 java.util.List; - -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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.user.Account; -import com.cloud.user.UserVO; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.Transaction; -import com.cloud.vm.DomainRouterVO; -import com.google.gson.Gson; - -public class DisableUserExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(DisableUserExecutor.class.getName()); - - @Override - 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); - /* - SyncQueueItemVO syncItem = getSyncSource(); - if(syncItem == null) { - initialSchedule(managementServer, param.longValue()); - } else { - if(allRouterOperationCeased(job)) { - if(s_logger.isInfoEnabled()) - s_logger.info("All previous router operations have ceased, we can now disable account of the user " + param); - - UserVO user = asyncMgr.getExecutorContext().getUserDao().findById(param.longValue()); - if(user != null) { - if(managementServer.disableAccount(user.getAccountId())) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - "success"); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "failed"); - } - } else { - if(s_logger.isInfoEnabled()) - s_logger.info("User " + param + " no longer exists, assuming it is already disbled"); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - "success"); - } - } else { - if(s_logger.isInfoEnabled()) - s_logger.info("Previous operation on router " + syncItem.getContentId() - + " has ceased, still more to go to disable account for user " + param); - } - } - */ - return true; - } - - public void initialSchedule(ManagementServer managementServer, long userId) { - AsyncJobManager asyncMgr = getAsyncJobMgr(); - UserVO user = asyncMgr.getExecutorContext().getUserDao().findById(userId); - if(user == null) { - if(s_logger.isInfoEnabled()) { - s_logger.info("User " + userId + " does not exist"); - } - - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "User " + userId + " does not exist"); - return; - } - /* - if(managementServer.disableUser(userId)) { - if(needToDisableAccount(user)) { - if(s_logger.isInfoEnabled()) - s_logger.info("This is the only user " + userId + " left for the account " + user.getAccountId() + ", we will disable account as well"); - - List routers = asyncMgr.getExecutorContext().getRouterDao().listBy(user.getAccountId()); - if(routers.size() > 0) { - scheduleOperationAfterAllRouterOperations(managementServer, user.getAccountId(), routers); - } else { - if(s_logger.isInfoEnabled()) - s_logger.info("Account " + user.getAccountId() + " does not have DomR to serialize with, disable it directly"); - - // no router being created under the account, disable the account directly - if(managementServer.disableAccount(user.getAccountId())) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - "success"); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "failed"); - } - } - } - } else { - if(s_logger.isInfoEnabled()) - s_logger.info("Unable to disable user " + userId); - - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "Unable to disable user " + userId); - } - */ - } - - private boolean needToDisableAccount(UserVO user) { - AsyncJobManager asyncMgr = getAsyncJobMgr(); - - List allUsersByAccount = asyncMgr.getExecutorContext().getUserDao().listByAccount(user.getAccountId()); - for (UserVO oneUser : allUsersByAccount) { - if (oneUser.getState().equals(Account.State.enabled)) { - return false; - } - } - return true; - } - - @DB - protected void scheduleOperationAfterAllRouterOperations(ManagementServer managementServer, long accountId, - List routers) { - - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - - Transaction txn = Transaction.currentTxn(); - try { - txn.start(); - - asyncMgr.updateAsyncJobStatus(job.getId(), routers.size(), ""); - for(DomainRouterVO router : routers) { - if(s_logger.isInfoEnabled()) { - s_logger.info("Serialize DisableUser operation with previous activities on router " + router.getId()); - } - asyncMgr.syncAsyncJobExecution(job, "Router", router.getId()); - } - - txn.commit(); - } catch (Exception e) { - txn.rollback(); - s_logger.warn("Unexpected exception " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - } - - @DB - protected boolean allRouterOperationCeased(AsyncJobVO job) { - AsyncJobManager asyncMgr = getAsyncJobMgr(); - Transaction txn = Transaction.currentTxn(); - - try { - txn.start(); - - AsyncJobVO jobUpdate = asyncMgr.getExecutorContext().getJobDao().lockRow(job.getId(), true); - int progress = jobUpdate.getProcessStatus(); - jobUpdate.setProcessStatus(progress -1); - asyncMgr.getExecutorContext().getJobDao().update(job.getId(), jobUpdate); - - txn.commit(); - - return progress == 1; - } catch(Exception e) { - s_logger.warn("Unexpected exception " + e.getMessage(), e); - - txn.rollback(); - } - return false; - } -} diff --git a/server/src/com/cloud/async/executor/DisassociateIpAddressParam.java b/server/src/com/cloud/async/executor/DisassociateIpAddressParam.java deleted file mode 100644 index cd8519aa16b..00000000000 --- a/server/src/com/cloud/async/executor/DisassociateIpAddressParam.java +++ /dev/null @@ -1,59 +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; - -public class DisassociateIpAddressParam { - - private long userId; - private long accountId; - private String ipAddress; - - public DisassociateIpAddressParam() { - } - - public DisassociateIpAddressParam(long userId, long accountId, String ipAddress) { - this.userId = userId; - this.accountId = accountId; - this.ipAddress = ipAddress; - } - - public long getUserId() { - return userId; - } - - public void setUserId(long userId) { - this.userId = userId; - } - - public long getAccountId() { - return accountId; - } - - public void setAccountId(long accountId) { - this.accountId = accountId; - } - - public String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } -} diff --git a/server/src/com/cloud/async/executor/ExtractJobResultObject.java b/server/src/com/cloud/async/executor/ExtractJobResultObject.java old mode 100755 new mode 100644 index aa68e8ad475..27fc0efee07 --- a/server/src/com/cloud/async/executor/ExtractJobResultObject.java +++ b/server/src/com/cloud/async/executor/ExtractJobResultObject.java @@ -1,167 +1,167 @@ -package com.cloud.async.executor; - -import java.util.Date; - -import com.cloud.async.AsyncInstanceCreateStatus; -import com.cloud.serializer.Param; -import com.cloud.storage.Volume.VolumeType; -import com.cloud.storage.upload.UploadState; - -public class ExtractJobResultObject { - - public ExtractJobResultObject(Long accountId, String typeName, String currState, int uploadPercent, Long uploadId){ - this.accountId = accountId; - this.name = typeName; - this.state = currState; - this.id = uploadId; - this.uploadPercent = uploadPercent; - } - - public ExtractJobResultObject(Long accountId, String typeName, String currState, Long uploadId, String url){ - this.accountId = accountId; - this.name = typeName; - this.state = currState; - this.id = uploadId; - this.url = url; - } - - public ExtractJobResultObject(){ - } - - @Param(name="id") - private long id; - - @Param(name="name") - private String name; - - @Param(name="uploadPercentage") - private int uploadPercent; - - @Param(name="uploadStatus") - private String uploadStatus; - - @Param(name="accountid") - long accountId; - - @Param(name="result_string") - String result_string; - - @Param(name="created") - private Date createdDate; - - @Param(name="state") - private String state; - - @Param(name="storagetype") - String storageType; - - @Param(name="storage") - private String storage; - - @Param(name="zoneid") - private Long zoneId; - - @Param(name="zonename") - private String zoneName; - - @Param(name="url") - private String url; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public int getUploadPercent() { - return uploadPercent; - } - - public void setUploadPercent(int i) { - this.uploadPercent = i; - } - - public String getUploadStatus() { - return uploadStatus; - } - - public void setUploadStatus(String uploadStatus) { - this.uploadStatus = uploadStatus; - } - - public String getResult_string() { - return result_string; - } - - public void setResult_string(String resultString) { - result_string = resultString; - } - - - 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 String getStorage() { - return storage; - } - - public void setStorage(String storage) { - this.storage = storage; - } - - public void setId(long id) { - this.id = id; - } - - public long getId() { - return id; - } - - public void setName(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setCreatedDate(Date createdDate) { - this.createdDate = createdDate; - } - - public Date getCreatedDate() { - return createdDate; - } - - public void setState(String status) { - this.state = status; - } - - public String getState() { - return state; - } - - public void setStorageType (String storageType) { - this.storageType = storageType; - } - - public String getStorageType() { - return storageType; - } - -} +package com.cloud.async.executor; + +import java.util.Date; + +import com.cloud.async.AsyncInstanceCreateStatus; +import com.cloud.serializer.Param; +import com.cloud.storage.Volume.VolumeType; +import com.cloud.storage.upload.UploadState; + +public class ExtractJobResultObject { + + public ExtractJobResultObject(Long accountId, String typeName, String currState, int uploadPercent, Long uploadId){ + this.accountId = accountId; + this.name = typeName; + this.state = currState; + this.id = uploadId; + this.uploadPercent = uploadPercent; + } + + public ExtractJobResultObject(Long accountId, String typeName, String currState, Long uploadId, String url){ + this.accountId = accountId; + this.name = typeName; + this.state = currState; + this.id = uploadId; + this.url = url; + } + + public ExtractJobResultObject(){ + } + + @Param(name="id") + private long id; + + @Param(name="name") + private String name; + + @Param(name="uploadPercentage") + private int uploadPercent; + + @Param(name="uploadStatus") + private String uploadStatus; + + @Param(name="accountid") + long accountId; + + @Param(name="result_string") + String result_string; + + @Param(name="created") + private Date createdDate; + + @Param(name="state") + private String state; + + @Param(name="storagetype") + String storageType; + + @Param(name="storage") + private String storage; + + @Param(name="zoneid") + private Long zoneId; + + @Param(name="zonename") + private String zoneName; + + @Param(name="url") + private String url; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public int getUploadPercent() { + return uploadPercent; + } + + public void setUploadPercent(int i) { + this.uploadPercent = i; + } + + public String getUploadStatus() { + return uploadStatus; + } + + public void setUploadStatus(String uploadStatus) { + this.uploadStatus = uploadStatus; + } + + public String getResult_string() { + return result_string; + } + + public void setResult_string(String resultString) { + result_string = resultString; + } + + + 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 String getStorage() { + return storage; + } + + public void setStorage(String storage) { + this.storage = storage; + } + + public void setId(long id) { + this.id = id; + } + + public long getId() { + return id; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + public Date getCreatedDate() { + return createdDate; + } + + public void setState(String status) { + this.state = status; + } + + public String getState() { + return state; + } + + public void setStorageType (String storageType) { + this.storageType = storageType; + } + + public String getStorageType() { + return storageType; + } + +} diff --git a/server/src/com/cloud/async/executor/ExtractTemplateExecutor.java b/server/src/com/cloud/async/executor/ExtractTemplateExecutor.java deleted file mode 100755 index 6229002ac7f..00000000000 --- a/server/src/com/cloud/async/executor/ExtractTemplateExecutor.java +++ /dev/null @@ -1,38 +0,0 @@ -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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.google.gson.Gson; - -public class ExtractTemplateExecutor extends BaseAsyncJobExecutor { - - public static final Logger s_logger = Logger.getLogger(ExtractTemplateExecutor.class.getName()); - @Override - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - - ExtractTemplateParam param = gson.fromJson(job.getCmdInfo(), ExtractTemplateParam.class); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - - /* - try { - managementServer.extractTemplate(param.getUrl(), param.getTemplateId(), param.getZoneId(), param.getEventId(), getJob().getId(), param.getExtractMode()); - } catch (Exception e) { - s_logger.warn("Unable to extract template: " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } - */ - - return true; - } - -} diff --git a/server/src/com/cloud/async/executor/ExtractTemplateParam.java b/server/src/com/cloud/async/executor/ExtractTemplateParam.java deleted file mode 100644 index 8fb2dbf2284..00000000000 --- a/server/src/com/cloud/async/executor/ExtractTemplateParam.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.cloud.async.executor; - -import com.cloud.storage.Upload; - -public class ExtractTemplateParam { - - private long userId; - private long templateId; - private Long zoneId; - private long eventId; - private String url; - private Upload.Mode extractMode; - - public ExtractTemplateParam() { - } - - public ExtractTemplateParam(long userId, long templateId, Long zoneId, long eventId, String url) { - this.userId = userId; - this.templateId = templateId; - this.zoneId = zoneId; - this.eventId = eventId; - this.url = url; - this.extractMode = Upload.Mode.FTP_UPLOAD; - } - - public ExtractTemplateParam(long userId, long templateId, Long zoneId, long eventId, String url, Upload.Mode mode) { - this.userId = userId; - this.templateId = templateId; - this.zoneId = zoneId; - this.eventId = eventId; - this.url = url; - this.extractMode = mode; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public long getUserId() { - return userId; - } - - public long getTemplateId() { - return templateId; - } - - public Long getZoneId() { - return zoneId; - } - - public void setEventId(long eventId) { - this.eventId = eventId; - } - - public long getEventId() { - return eventId; - } - - public Upload.Mode getExtractMode() { - return extractMode; - } - - public void setExtractMode(Upload.Mode extractMode) { - this.extractMode = extractMode; - } - -} diff --git a/server/src/com/cloud/async/executor/ExtractVolumeExecutor.java b/server/src/com/cloud/async/executor/ExtractVolumeExecutor.java deleted file mode 100644 index 71ee35f1506..00000000000 --- a/server/src/com/cloud/async/executor/ExtractVolumeExecutor.java +++ /dev/null @@ -1,40 +0,0 @@ -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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.google.gson.Gson; - -public class ExtractVolumeExecutor extends BaseAsyncJobExecutor { - - public static final Logger s_logger = Logger.getLogger(ExtractVolumeExecutor.class.getName()); - - @Override - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - - ExtractTemplateParam param = gson.fromJson(job.getCmdInfo(), ExtractTemplateParam.class); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - - /* - try { - managementServer.extractVolume(param.getUrl(), param.getTemplateId(), param.getZoneId(), param.getEventId(), getJob().getId()); - - } catch (Exception e) { - s_logger.warn("Unable to extract volume: " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } - */ - - return true; - } - -} diff --git a/server/src/com/cloud/async/executor/HostResultObject.java b/server/src/com/cloud/async/executor/HostResultObject.java deleted file mode 100644 index 652d7539c64..00000000000 --- a/server/src/com/cloud/async/executor/HostResultObject.java +++ /dev/null @@ -1,442 +0,0 @@ -package com.cloud.async.executor; - -/** - * 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 . - * - */ -import java.util.Date; -import java.util.Set; - -import com.cloud.host.Status.Event; -import com.cloud.serializer.Param; - -public class HostResultObject { - @Param(name="id") - private long id; - - @Param(name="averageload") - private long averageLoad; - - @Param(name="name") - private String name; - - @Param(name="state") - private String state; - - @Param(name="type") - private String type; - - @Param(name="ipaddress") - private String ipAddress; - - @Param(name="hypervisor") - private String hypervisorType; - - @Param(name="fstype") - private String fsType; - -// @Param(name="available") -// private boolean available; -// -// @Param(name="setup") -// private boolean setup; - - @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="cpuallocated") - private String cpuAllocated; - - @Param(name="cpuused") - private String cpuUsed; - - @Param(name="cpunumber") - private long cpuNumber; - - @Param(name="url") - private String storageUrl; - - @Param(name="cpuspeed") - private Long cpuSpeed; - - @Param(name="memorytotal") - private long totalMemory; - - @Param(name="memoryallocated") - private long memoryAllocated; - - @Param(name="memoryused") - private long memoryUsed; - - @Param(name="disksizetotal") - private long diskSizeTotal; - - @Param(name="disksizeallocated") - private long diskSizeAllocated; - - @Param(name="capabilities") - private String caps; - - @Param(name="totalsize") - private Long totalSize; - - @Param(name="managementserverid") - private Long managementServerId; - - @Param(name="version") - private String version; - - @Param(name="created") - private Date created; - - @Param(name="removed") - private Date removed; - - @Param(name="disconnected") - private Date disconnected; - - @Param(name="events") - private Set events; - - @Param(name="oscategoryid") - private Long osCategoryId; - - @Param(name="oscategoryname") - private String osCategoryName; - - @Param(name="lastpinged") - private long lastPinged; - - @Param(name="networkkbsread") - private Long networkKbsRead; - - @Param(name="networkkbswrite") - private Long networkKbsWrite; - - public long getId(){ - return this.id; - } - - public void setId(long id){ - this.id = id; - } - - public void setOsCategoryId(long osCategoryId){ - this.osCategoryId = osCategoryId; - } - - public void setOsCategoryName(String osCategoryName){ - this.osCategoryName = osCategoryName; - } - - public Long getOsCategoryId(){ - return this.osCategoryId; - } - - public String getOsCategoryName(){ - return this.osCategoryName; - } - - public HostResultObject() { - } - - public SetgetEvents() - { - return this.events; - } - - public void setEvents(Set eventSet) - { - this.events = eventSet; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - public String getHypervisorType() { - return hypervisorType; - } - - public void setHypervisorType(String hypervisorType) { - this.hypervisorType = hypervisorType; - } - - public String getFsType() { - return fsType; - } - - public void setFsType(String fsType) { - this.fsType = fsType; - } - -// public boolean isAvailable() { -// return available; -// } -// -// public void setAvailable(boolean available) { -// this.available = available; -// } -// -// public boolean isSetup() { -// return setup; -// } -// -// public void setSetup(boolean setup) { -// this.setup = setup; -// } - - public long getZoneId() { - return zoneId; - } - - public void setZoneId(long zoneId) { - this.zoneId = zoneId; - } - - public String getZoneName() { - return zoneName; - } - - public String getPodName() { - return podName; - } - - public void setZoneName(String zoneName) { - this.zoneName = zoneName; - } - - public void setPodName(String podName) { - this.podName = podName; - } - - public Long getPodId() { - return podId; - } - - public void setPodId(Long podId) { - this.podId = podId; - } - - public String getCpuAllocated() { - return cpuAllocated; - } - - public void setCpuAllocated(String cpuAllocated) { - this.cpuAllocated = cpuAllocated; - } - - public String getCpuUsed() { - return cpuUsed; - } - - public void setCpuUsed(String cpuUsed) { - this.cpuUsed = cpuUsed; - } - - public long getCpuNumber() { - return cpuNumber; - } - - public void setCpuNumber(long cpuNumber) { - this.cpuNumber = cpuNumber; - } - - public String getStorageUrl() { - return storageUrl; - } - - public void setStorageUrl(String storageUrl) { - this.storageUrl = storageUrl; - } - - public Long getCpuSpeed() { - return cpuSpeed; - } - - public void setCpuSpeed(Long cpuSpeed) { - this.cpuSpeed = cpuSpeed; - } - - public long getTotalMemory() { - return totalMemory; - } - - public void setTotalMemory(long totalMemory) { - this.totalMemory = totalMemory; - } - - public long getMemoryAllocated() { - return memoryAllocated; - } - - public void setMemoryAllocated(long memoryAllocated) { - this.memoryAllocated = memoryAllocated; - } - - public long getMemoryUsed() { - return memoryUsed; - } - - public void setMemoryUsed(long memoryUsed) { - this.memoryUsed = memoryUsed; - } - -// public long getDiskSize() { -// return diskSizeTotal; -// } - - public long isDiskSizeTotal() { - return diskSizeTotal; - } - - public void setDiskSizeTotal(long diskSizeTotal) { - this.diskSizeTotal = diskSizeTotal; - } - - public long getDiskSizeAllocated() { - return diskSizeAllocated; - } - - public void setDiskSizeAllocated(long diskSizeAllocated) { - this.diskSizeAllocated = diskSizeAllocated; - } - - public String getCaps() { - return caps; - } - - public void setCaps(String caps) { - this.caps = caps; - } - - public Long getTotalSize() { - return totalSize; - } - - public void setTotalSize(Long totalSize) { - this.totalSize = totalSize; - } - - public long getLastPinged() { - return lastPinged; - } - - public void setLastPinged(long l) { - this.lastPinged = l; - } - - public Long getManagementServerId() { - return managementServerId; - } - - public void setManagementServerId(Long managementServerId) { - this.managementServerId = managementServerId; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public Date getRemoved() { - return removed; - } - - public void setRemoved(Date removed) { - this.removed = removed; - } - - public Date getDisconnected() { - return disconnected; - } - - public void setDisconnected(Date disconnected) { - this.disconnected = disconnected; - } - - public long getAverageLoad(){ - return this.averageLoad; - } - - public void setAverageLoad(long averageLoad){ - this.averageLoad = averageLoad; - } - - public Long getNetworkKbsRead(){ - return this.networkKbsRead; - } - - public void setNetworkKbsRead(long networkKbsRead){ - this.networkKbsRead = networkKbsRead; - } - - public Long getNetworkKbsWrite(){ - return this.networkKbsWrite; - } - - public void setNetworkKbsWrite(long networkKbsWrite){ - this.networkKbsWrite = networkKbsWrite; - } -} diff --git a/server/src/com/cloud/async/executor/LoadBalancerParam.java b/server/src/com/cloud/async/executor/LoadBalancerParam.java deleted file mode 100644 index 34b2263024f..00000000000 --- a/server/src/com/cloud/async/executor/LoadBalancerParam.java +++ /dev/null @@ -1,70 +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 java.util.List; - -public class LoadBalancerParam { - private Long userId; - private Long domainRouterId; - private Long loadBalancerId; - private List instanceIdList; - - public LoadBalancerParam() { - } - - public LoadBalancerParam(Long userId, Long domainRouterId, Long loadBalancerId, List instanceIdList) { - this.userId = userId; - this.domainRouterId = domainRouterId; - this.loadBalancerId = loadBalancerId; - this.instanceIdList = instanceIdList; - } - - public Long getUserId() { - return userId; - } - - public void setUserId(Long userId) { - this.userId = userId; - } - - public Long getDomainRouterId() { - return domainRouterId; - } - - public void setDomainRouterId(Long domainRouterId) { - this.domainRouterId = domainRouterId; - } - - public Long getLoadBalancerId() { - return loadBalancerId; - } - - public void setLoadBalancerId(Long securityGroupId) { - this.loadBalancerId = securityGroupId; - } - - public List getInstanceIdList() { - return instanceIdList; - } - - public void setInstanceId(List instanceIdList) { - this.instanceIdList = instanceIdList; - } -} 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 deleted file mode 100644 index 2b90631aef0..00000000000 --- a/server/src/com/cloud/async/executor/PrepareMaintenanceExecutor.java +++ /dev/null @@ -1,189 +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 java.text.DecimalFormat; -import java.util.List; -import java.util.Set; - -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.host.Host; -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.storage.GuestOSCategoryVO; -import com.cloud.utils.fsm.StateMachine; -import com.cloud.vm.UserVmVO; -import com.google.gson.Gson; - -public class PrepareMaintenanceExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(PrepareMaintenanceExecutor.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); - /* - try { - boolean result = managementServer.prepareForMaintenance(param.longValue()); - if(result) - { - HostVO host = managementServer.getHostBy(param); - final StateMachine sm = new StateMachine(); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - composeResultObject(host,sm,managementServer)); - } - else - { - HostVO host = managementServer.getHostBy(param); - final StateMachine sm = new StateMachine(); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - composeResultObject(host,sm,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 HostResultObject composeResultObject(HostVO hostVO, StateMachine sm, ManagementServer managementServer) - { - - HostResultObject hostRO = new HostResultObject(); - - hostRO.setId(hostVO.getId()); - - hostRO.setName(hostVO.getName()); - hostRO.setState(hostVO.getStatus().toString()); - - if(hostVO.getDisconnectedOn() != null) - hostRO.setDisconnected(hostVO.getDisconnectedOn()); - - - if (hostVO.getType() != null) { - hostRO.setType(hostVO.getType().toString()); - } - -// GuestOSCategoryVO guestOSCategory = managementServer.getHostGuestOSCategory(hostVO.getId()); -// if (guestOSCategory != null) { -// hostRO.setOsCategoryId(guestOSCategory.getId()); -// hostRO.setOsCategoryName(guestOSCategory.getName()); -// } - - - hostRO.setIpAddress(hostVO.getPrivateIpAddress()); - hostRO.setZoneId(hostVO.getDataCenterId()); -// hostRO.setZoneName(managementServer.getDataCenterBy(hostVO.getDataCenterId()).getName()); - - if (hostVO.getPodId() != null && managementServer.findHostPodById(hostVO.getPodId()) != null) { - hostRO.setPodId(hostVO.getPodId()); - hostRO.setPodName((managementServer.findHostPodById(hostVO.getPodId())).getName()); - } - - hostRO.setVersion(hostVO.getVersion().toString()); - - if (hostVO.getHypervisorType() != null) { - hostRO.setHypervisorType(hostVO.getHypervisorType().toString()); - } - - if ((hostVO.getCpus() != null) && (hostVO.getSpeed() != null) && !(hostVO.getType().toString().equals("Storage"))) - { - - hostRO.setCpuNumber(hostVO.getCpus()); - hostRO.setCpuSpeed(hostVO.getSpeed()); - // calculate cpu allocated by vm - int cpu = 0; - String cpuAlloc = null; - DecimalFormat decimalFormat = new DecimalFormat("#.##"); -// List instances = managementServer.listUserVMsByHostId(hostVO.getId()); -// for (UserVmVO vm : instances) { -// ServiceOffering so = managementServer.findServiceOfferingById(vm.getServiceOfferingId()); -// cpu += so.getCpu() * so.getSpeed(); -// } - cpuAlloc = decimalFormat.format(((float) cpu / (float) (hostVO.getCpus() * hostVO.getSpeed())) * 100f) + "%"; - hostRO.setCpuAllocated(cpuAlloc); - - // calculate cpu utilized - String cpuUsed = null; -// HostStats hostStats = managementServer.getHostStatistics(hostVO.getId()); -// if (hostStats != null) { -// float cpuUtil = (float) hostStats.getCpuUtilization(); -// cpuUsed = decimalFormat.format(cpuUtil) + "%"; -// hostRO.setCpuUsed(cpuUsed); -// -// long avgLoad = (long)hostStats.getAverageLoad(); -// hostRO.setAverageLoad(avgLoad); -// -// long networkKbsRead = (long)hostStats.getNetworkReadKBs(); -// hostRO.setNetworkKbsRead(networkKbsRead); -// -// long networkKbsWrite = (long)hostStats.getNetworkWriteKBs(); -// hostRO.setNetworkKbsWrite(networkKbsWrite); -// } - } - - if ( hostVO.getType() == Host.Type.Routing ) { - Long memory = hostVO.getTotalMemory(); - hostRO.setTotalMemory(memory); - // calculate memory allocated by systemVM and userVm - long mem = managementServer.getMemoryUsagebyHost(hostVO.getId()); - hostRO.setMemoryAllocated(mem); - // calculate memory utilized, we don't provide memory over commit - hostRO.setMemoryUsed(mem); - // calculate memory utilized - } - if (hostVO.getType().toString().equals("Storage")) { - hostRO.setDiskSizeTotal(hostVO.getTotalSize()); - hostRO.setDiskSizeAllocated(0); - } - hostRO.setCaps(hostVO.getCapabilities()); - hostRO.setLastPinged(hostVO.getLastPinged()); - if (hostVO.getManagementServerId() != null) { - hostRO.setManagementServerId(hostVO.getManagementServerId()); - } - - if (hostVO.getCreated() != null) { - hostRO.setCreated(hostVO.getCreated()); - } - if (hostVO.getRemoved() != null) { - hostRO.setRemoved(hostVO.getRemoved()); - } - - Set possibleEvents = hostVO.getStatus().getPossibleEvents(); - hostRO.setEvents(possibleEvents); - - return hostRO; - - } -} 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 84cf0e573f2..00000000000 --- a/server/src/com/cloud/async/executor/PreparePrimaryStorageMaintenanceExecutor.java +++ /dev/null @@ -1,117 +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/RebootConsoleProxyExecutor.java b/server/src/com/cloud/async/executor/RebootConsoleProxyExecutor.java deleted file mode 100644 index c0eccab5726..00000000000 --- a/server/src/com/cloud/async/executor/RebootConsoleProxyExecutor.java +++ /dev/null @@ -1,79 +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.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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.vm.ConsoleProxyVO; -import com.google.gson.Gson; - -public class RebootConsoleProxyExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(RebootConsoleProxyExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - /* - if(getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job, "ConsoleProxy", param.getVmId()); - return true; - } else { - try { - boolean result = managementServer.rebootConsoleProxy(param.getVmId(), param.getEventId()); - if(result) - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - composeResultObject(managementServer, param.getVmId())); - else - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "operation failed"); - } catch(Exception e) { - s_logger.warn("Unable to reboot console proxy " + param.getVmId() + ":" + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - return true; - } - */ - return true; - } - - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - } - - public void processDisconnect(VMOperationListener listener, long agentId) { - } - - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - } - - private ConsoleProxyOperationResultObject composeResultObject(ManagementServer managementServer, long proxyVmId) { - ConsoleProxyVO proxy = managementServer.findConsoleProxyById(proxyVmId); - return ConsoleProxyExecutorHelper.composeResultObject(managementServer, proxy); - } -} diff --git a/server/src/com/cloud/async/executor/RebootRouterExecutor.java b/server/src/com/cloud/async/executor/RebootRouterExecutor.java deleted file mode 100644 index fa534471b9a..00000000000 --- a/server/src/com/cloud/async/executor/RebootRouterExecutor.java +++ /dev/null @@ -1,83 +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.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.exception.InternalErrorException; -import com.cloud.network.router.VirtualRouter; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.google.gson.Gson; - -public class RebootRouterExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(RebootRouterExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - - /* - if(getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job, "Router", param.getVmId()); - return true; - } else { - try { - if(managementServer.rebootRouter(param.getVmId(), param.getEventId())) { - DomainRouter router = managementServer.findDomainRouterById(param.getVmId()); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - RouterExecutorHelper.composeResultObject(managementServer, router)); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "operation failed"); - } - } catch (InternalErrorException e) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Unable to reboot router " + param.getVmId() + ":" + e.getMessage()); - - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } catch(Exception e) { - s_logger.warn("Unable to reboot router " + param.getVmId() + ":" + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - return true; - } - */ - return true; - } - - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - } - - public void processDisconnect(VMOperationListener listener, long agentId) { - } - - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - } -} diff --git a/server/src/com/cloud/async/executor/RebootVMExecutor.java b/server/src/com/cloud/async/executor/RebootVMExecutor.java deleted file mode 100644 index 0051893dd7c..00000000000 --- a/server/src/com/cloud/async/executor/RebootVMExecutor.java +++ /dev/null @@ -1,142 +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.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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.vm.UserVmVO; -import com.google.gson.Gson; - -public class RebootVMExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(RebootVMExecutor.class.getName()); - - 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; - - /* - if(getSyncSource() == null) { - 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; - } - */ - return true; - } - - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - UserVmVO vm = listener.getVm(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - - boolean jobStatusUpdated = false; - try { - if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize Reboot VM command: received answer, " + vm.getHostId() + "-" + seq); - - if(answer != null) { - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_SUCCEEDED, 0, VMExecutorHelper.composeResultObject(asyncMgr.getExecutorContext().getManagementServer(), vm, null)); - jobStatusUpdated = true; - } else { - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent is unable to execute the command"); - - jobStatusUpdated = true; - } - - } catch(Exception e) { - s_logger.error("Unexpected exception " + e.getMessage(), e); - - if(!jobStatusUpdated) { - if(answer != null) { - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_SUCCEEDED, 0, VMExecutorHelper.composeResultObject(asyncMgr.getExecutorContext().getManagementServer(), vm, null)); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, "Agent is unable to execute the command"); - } - } - } finally { - asyncMgr.releaseSyncSource(this); - } - } - - public void processDisconnect(VMOperationListener listener, long agentId) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize Reboot VM command: agent " + agentId + " disconnected"); - - processDisconnectAndTimeout(listener, "agent is disconnected"); - } - - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Execute asynchronize Reboot VM command: timed out, " + agentId + "-" + seq); - - processDisconnectAndTimeout(listener, "operation timed out"); - } - - private void processDisconnectAndTimeout(VMOperationListener listener, String resultMessage) { - - AsyncJobManager asyncMgr = getAsyncJobMgr(); - - boolean jobStatusUpdated = false; - try { - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultMessage); - jobStatusUpdated = true; - } catch (Exception e) { - s_logger.error("Unexpected exception " + e.getMessage(), e); - if(!jobStatusUpdated) - asyncMgr.completeAsyncJob(getJob().getId(), - AsyncJobResult.STATUS_FAILED, 0, resultMessage); - } finally { - asyncMgr.releaseSyncSource(this); - } - } -} diff --git a/server/src/com/cloud/async/executor/ReconnectExecutor.java b/server/src/com/cloud/async/executor/ReconnectExecutor.java deleted file mode 100644 index 0fe39d4b4b5..00000000000 --- a/server/src/com/cloud/async/executor/ReconnectExecutor.java +++ /dev/null @@ -1,199 +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 java.text.DecimalFormat; -import java.util.List; -import java.util.Set; - -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.host.Host; -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.storage.GuestOSCategoryVO; -import com.cloud.utils.fsm.StateMachine; -import com.cloud.vm.UserVmVO; -import com.google.gson.Gson; - -public class ReconnectExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(ReconnectExecutor.class.getName()); - - @Override - public boolean execute() { - - AsyncJobManager asyncMgr = getAsyncJobMgr(); - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobVO job = getJob(); - - /* - if(getSyncSource() == null) { - Long param = gson.fromJson(job.getCmdInfo(), Long.class); - asyncMgr.syncAsyncJobExecution(job.getId(), "host", param.longValue()); - - // always true if it does not have sync-source - return true; - } else { - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - Long param = gson.fromJson(job.getCmdInfo(), Long.class); - - try { - boolean success = managementServer.reconnect(param.longValue()); - if(success) - { - HostVO host = managementServer.getHostBy(param); - final StateMachine sm = new StateMachine(); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, composeResultObject(host,sm,managementServer)); - } - else - { - HostVO host = managementServer.getHostBy(param); - final StateMachine sm = new StateMachine(); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - composeResultObject(host,sm, managementServer)); - } - } catch(Exception e) { - s_logger.warn("Unable to reconnect host " + param + ": " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - } - */ - return true; - } - - private HostResultObject composeResultObject(HostVO hostVO, StateMachine sm, ManagementServer managementServer) - { - HostResultObject hostRO = new HostResultObject(); - - hostRO.setId(hostVO.getId()); - - hostRO.setName(hostVO.getName()); - hostRO.setState(hostVO.getStatus().toString()); - - if(hostVO.getDisconnectedOn() != null) - hostRO.setDisconnected(hostVO.getDisconnectedOn()); - - - if (hostVO.getType() != null) { - hostRO.setType(hostVO.getType().toString()); - } - -// GuestOSCategoryVO guestOSCategory = managementServer.getHostGuestOSCategory(hostVO.getId()); -// if (guestOSCategory != null) { -// hostRO.setOsCategoryId(guestOSCategory.getId()); -// hostRO.setOsCategoryName(guestOSCategory.getName()); -// } - - - hostRO.setIpAddress(hostVO.getPrivateIpAddress()); - hostRO.setZoneId(hostVO.getDataCenterId()); -// hostRO.setZoneName(managementServer.getDataCenterBy(hostVO.getDataCenterId()).getName()); - - if (hostVO.getPodId() != null && managementServer.findHostPodById(hostVO.getPodId()) != null) { - hostRO.setPodId(hostVO.getPodId()); - hostRO.setPodName((managementServer.findHostPodById(hostVO.getPodId())).getName()); - } - - hostRO.setVersion(hostVO.getVersion().toString()); - - if (hostVO.getHypervisorType() != null) { - hostRO.setHypervisorType(hostVO.getHypervisorType().toString()); - } - - if ((hostVO.getCpus() != null) && (hostVO.getSpeed() != null) && !(hostVO.getType().toString().equals("Storage"))) - { - - hostRO.setCpuNumber(hostVO.getCpus()); - hostRO.setCpuSpeed(hostVO.getSpeed()); - // calculate cpu allocated by vm - int cpu = 0; - String cpuAlloc = null; - DecimalFormat decimalFormat = new DecimalFormat("#.##"); -// List instances = managementServer.listUserVMsByHostId(hostVO.getId()); -// for (UserVmVO vm : instances) { -// ServiceOffering so = managementServer.findServiceOfferingById(vm.getServiceOfferingId()); -// cpu += so.getCpu() * so.getSpeed(); -// } - cpuAlloc = decimalFormat.format(((float) cpu / (float) (hostVO.getCpus() * hostVO.getSpeed())) * 100f) + "%"; - hostRO.setCpuAllocated(cpuAlloc); - - // calculate cpu utilized - String cpuUsed = null; -// HostStats hostStats = managementServer.getHostStatistics(hostVO.getId()); -// if (hostStats != null) { -// float cpuUtil = (float) hostStats.getCpuUtilization(); -// cpuUsed = decimalFormat.format(cpuUtil) + "%"; -// hostRO.setCpuUsed(cpuUsed); -// -// long avgLoad = (long)hostStats.getAverageLoad(); -// hostRO.setAverageLoad(avgLoad); -// -// long networkKbsRead = (long)hostStats.getNetworkReadKBs(); -// hostRO.setNetworkKbsRead(networkKbsRead); -// -// long networkKbsWrite = (long)hostStats.getNetworkWriteKBs(); -// hostRO.setNetworkKbsWrite(networkKbsWrite); -// } - } - - if ( hostVO.getType() == Host.Type.Routing ) { - Long memory = hostVO.getTotalMemory(); - hostRO.setTotalMemory(memory); - // calculate memory allocated by systemVM and userVm - long mem = managementServer.getMemoryUsagebyHost(hostVO.getId()); - hostRO.setMemoryAllocated(mem); - // calculate memory utilized, we don't provide memory over commit - hostRO.setMemoryUsed(mem); - - } - if (hostVO.getType().toString().equals("Storage")) { - hostRO.setDiskSizeTotal(hostVO.getTotalSize()); - hostRO.setDiskSizeAllocated(0); - } - hostRO.setCaps(hostVO.getCapabilities()); - hostRO.setLastPinged(hostVO.getLastPinged()); - if (hostVO.getManagementServerId() != null) { - hostRO.setManagementServerId(hostVO.getManagementServerId()); - } - - if (hostVO.getCreated() != null) { - hostRO.setCreated(hostVO.getCreated()); - } - if (hostVO.getRemoved() != null) { - hostRO.setRemoved(hostVO.getRemoved()); - } - - Set possibleEvents = hostVO.getStatus().getPossibleEvents(); - hostRO.setEvents(possibleEvents); - - return hostRO; - - } -} diff --git a/server/src/com/cloud/async/executor/RecurringSnapshotParam.java b/server/src/com/cloud/async/executor/RecurringSnapshotParam.java deleted file mode 100644 index 834e07872ec..00000000000 --- a/server/src/com/cloud/async/executor/RecurringSnapshotParam.java +++ /dev/null @@ -1,70 +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; - -public class RecurringSnapshotParam extends VMOperationParam { - private int hourlyMax; - private int dailyMax; - private int weeklyMax; - private int monthlyMax; - - public RecurringSnapshotParam() { - } - - public RecurringSnapshotParam(long userId, long vmId, int hourlyMax, int dailyMax, int weeklyMax, int monthlyMax) { - setUserId(userId); - setVmId(vmId); - this.hourlyMax = hourlyMax; - this.dailyMax = dailyMax; - this.weeklyMax = weeklyMax; - this.monthlyMax = monthlyMax; - } - - public int getHourlyMax() { - return hourlyMax; - } - - public void setHourlyMax(int hourlyMax) { - this.hourlyMax = hourlyMax; - } - - public int getDailyMax() { - return dailyMax; - } - - public void setDailyMax(int dailyMax) { - this.dailyMax = dailyMax; - } - - public int getWeeklyMax() { - return weeklyMax; - } - - public void setWeeklyMax(int weeklyMax) { - this.weeklyMax = weeklyMax; - } - - public int getMonthlyMax() { - return monthlyMax; - } - - public void setMonthlyMax(int monthlyMax) { - this.monthlyMax = monthlyMax; - } -} diff --git a/server/src/com/cloud/async/executor/RemoveFromLoadBalancerExecutor.java b/server/src/com/cloud/async/executor/RemoveFromLoadBalancerExecutor.java deleted file mode 100644 index 45e876f2ebc..00000000000 --- a/server/src/com/cloud/async/executor/RemoveFromLoadBalancerExecutor.java +++ /dev/null @@ -1,68 +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.async.AsyncJobManager; -import com.cloud.async.AsyncJobVO; -import com.cloud.async.BaseAsyncJobExecutor; -import com.cloud.serializer.GsonHelper; -import com.google.gson.Gson; - -public class RemoveFromLoadBalancerExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(RemoveFromLoadBalancerExecutor.class.getName()); - - @Override - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - LoadBalancerParam param = gson.fromJson(job.getCmdInfo(), LoadBalancerParam.class); - - /* - if (getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job.getId(), "Router", param.getDomainRouterId()); - - // always true if it does not have sync-source - return true; - } else { - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - try { - boolean result = managementServer.removeFromLoadBalancer(param.getUserId().longValue(), param.getLoadBalancerId().longValue(), param.getInstanceIdList()); - if (result) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, Boolean.valueOf(result).toString()); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, Boolean.valueOf(result).toString()); - } - } catch(InvalidParameterValueException ex) { - if (s_logger.isInfoEnabled()) { - s_logger.info("Unable to remove from load balancer : " + ex.getMessage()); - } - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.PARAM_ERROR, ex.getMessage()); - } catch(Exception e) { - s_logger.warn("Unable to remove from load balancer : " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } - return true; - } - */ - return true; - } -} diff --git a/server/src/com/cloud/async/executor/RemoveSecurityGroupParam.java b/server/src/com/cloud/async/executor/RemoveSecurityGroupParam.java deleted file mode 100644 index 36c20956e09..00000000000 --- a/server/src/com/cloud/async/executor/RemoveSecurityGroupParam.java +++ /dev/null @@ -1,68 +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; - -public class RemoveSecurityGroupParam { - private Long userId; - private Long securityGroupId; - private String publicIp; - private Long vmId; - - public RemoveSecurityGroupParam() { - } - - public RemoveSecurityGroupParam(Long userId, Long securityGroupId, String publicIp, Long vmId) { - this.userId = userId; - this.securityGroupId = securityGroupId; - this.publicIp = publicIp; - this.vmId = vmId; - } - - public Long getUserId() { - return userId; - } - - public void setUserId(Long userId) { - this.userId = userId; - } - - public Long getSecurityGroupId() { - return securityGroupId; - } - - public void setSecurityGroupId(Long securityGroupId) { - this.securityGroupId = securityGroupId; - } - - public String getPublicIp() { - return publicIp; - } - - public void setPublicIp(String publicIp) { - this.publicIp = publicIp; - } - - public Long getVmId() { - return vmId; - } - - public void setVmId(Long vmId) { - this.vmId = vmId; - } -} diff --git a/server/src/com/cloud/async/executor/ResetVMPasswordExecutor.java b/server/src/com/cloud/async/executor/ResetVMPasswordExecutor.java deleted file mode 100644 index 3e4a10fa7a5..00000000000 --- a/server/src/com/cloud/async/executor/ResetVMPasswordExecutor.java +++ /dev/null @@ -1,72 +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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.vm.UserVmVO; -import com.google.gson.Gson; - -public class ResetVMPasswordExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(ResetVMPasswordExecutor.class.getName()); - - public boolean execute() { - AsyncJobManager asyncMgr = getAsyncJobMgr(); - Gson gson = GsonHelper.getBuilder().create(); - 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 managementServer = asyncMgr.getExecutorContext().getManagementServer(); - ResetVMPasswordParam param = gson.fromJson(job.getCmdInfo(), ResetVMPasswordParam.class); - - asyncMgr.updateAsyncJobAttachment(job.getId(), "vm_instance", param.getVmId()); - try { - boolean success = managementServer.resetVMPassword(param.getUserId(), param.getVmId(), param.getPassword()); - if(success) { - UserVmVO userVm = managementServer.findUserVMInstanceById(param.getVmId()); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - VMExecutorHelper.composeResultObject(managementServer, userVm, param.getPassword())); - } - else - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "Operation failed"); - } catch(Exception e) { - s_logger.warn("Unable to reset password for VM " + param.getVmId() + ": " + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - } - */ - return true; - } -} diff --git a/server/src/com/cloud/async/executor/ResetVMPasswordParam.java b/server/src/com/cloud/async/executor/ResetVMPasswordParam.java deleted file mode 100644 index 1d2b5f7632f..00000000000 --- a/server/src/com/cloud/async/executor/ResetVMPasswordParam.java +++ /dev/null @@ -1,58 +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; - -public class ResetVMPasswordParam { - private long userId; - private long vmId; - private String password; - - public ResetVMPasswordParam() { - } - - public ResetVMPasswordParam(long userId, long vmId, String password) { - this.userId = userId; - this.vmId = vmId; - this.password = password; - } - - public long getUserId() { - return userId; - } - - public void setUserId(long userId) { - this.userId = userId; - } - - public long getVmId() { - return vmId; - } - - public void setVmId(long vmId) { - this.vmId = vmId; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } -} diff --git a/server/src/com/cloud/async/executor/RevokeNetworkGroupIngressExecutor.java b/server/src/com/cloud/async/executor/RevokeNetworkGroupIngressExecutor.java deleted file mode 100644 index 59743002412..00000000000 --- a/server/src/com/cloud/async/executor/RevokeNetworkGroupIngressExecutor.java +++ /dev/null @@ -1,57 +0,0 @@ -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.network.security.SecurityGroupVO; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.user.AccountVO; -import com.google.gson.Gson; - -public class RevokeNetworkGroupIngressExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(RevokeNetworkGroupIngressExecutor.class.getName()); - - @Override - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - SecurityGroupIngressParam param = gson.fromJson(job.getCmdInfo(), SecurityGroupIngressParam.class); - AccountVO account = param.getAccount(); - - /* - if (getSyncSource() == null) { - SecurityGroupVO networkGroup = managementServer.findNetworkGroupByName(param.getAccount().getId(), param.getGroupName()); - if(networkGroup == null) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, - BaseCmd.PARAM_ERROR, "Unable to find network group " + param.getGroupName() + " for account " + account.getAccountName() + " (id: " + account.getId() + ")"); - } else { - asyncMgr.syncAsyncJobExecution(job.getId(), "SecurityGroup", networkGroup.getId()); - } - return true; - } else { - try { - boolean success = managementServer.revokeNetworkGroupIngress(account, param.getGroupName(), param.getProtocol(), param.getStartPort(), param.getEndPort(), param.getCidrList(), param.getAuthorizedGroups()); - if (success) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, "success"); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "Failed to revoke network group ingress from group: " + param.getGroupName() + " for account: " + account.getAccountName() + " (id: " + account.getId() + ")"); - } - } catch(Exception e) { - s_logger.warn("Failed to revoke network group ingress from group: " + param.getGroupName() + " for account: " + account.getAccountName() + " (id: " + account.getId() + ")", e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "Failed to revoke network group ingress from group: " + param.getGroupName() + " for account: " + account.getAccountName() + " (id: " + account.getId() + ")"); - } - } - */ - - return true; - } -} diff --git a/server/src/com/cloud/async/executor/RouterExecutorHelper.java b/server/src/com/cloud/async/executor/RouterExecutorHelper.java deleted file mode 100644 index c28cd88f65c..00000000000 --- a/server/src/com/cloud/async/executor/RouterExecutorHelper.java +++ /dev/null @@ -1,65 +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 com.cloud.network.router.VirtualRouter; -import com.cloud.server.ManagementServer; -import com.cloud.user.Account; - -public class RouterExecutorHelper { - public static RouterOperationResultObject composeResultObject(ManagementServer managementServer, VirtualRouter router) { - RouterOperationResultObject resultObject = new RouterOperationResultObject(); - resultObject.setId(router.getId()); - resultObject.setZoneId(router.getDataCenterId()); - resultObject.setZoneName(managementServer.findDataCenterById(router.getDataCenterId()).getName()); - resultObject.setDns1(router.getDns1()); - resultObject.setDns2(router.getDns2()); - resultObject.setNetworkDomain(router.getDomain()); - resultObject.setGateway(router.getGateway()); - resultObject.setName(router.getName()); - resultObject.setPodId(router.getPodId()); - resultObject.setPrivateIp(router.getPrivateIpAddress()); - resultObject.setPrivateMacAddress(router.getPrivateMacAddress()); - resultObject.setPrivateNetMask(router.getPrivateNetmask()); - resultObject.setPublicIp(router.getPublicIpAddress()); - resultObject.setPublicMacAddress(router.getPublicMacAddress()); - resultObject.setPublicNetMask(router.getPrivateNetmask()); - resultObject.setGuestIp(router.getGuestIpAddress()); - resultObject.setGuestMacAddress(router.getGuestMacAddress()); - resultObject.setTemplateId(router.getTemplateId()); - resultObject.setCreated(router.getCreated()); - resultObject.setGuestNetmask(router.getGuestNetmask()); - - if (router.getHostId() != null) { - resultObject.setHostname(managementServer.getHostBy(router.getHostId()).getName()); - resultObject.setHostId(router.getHostId()); - } - - Account acct = managementServer.findAccountById(Long.valueOf(router.getAccountId())); - if (acct != null) { - resultObject.setAccount(acct.getAccountName()); - resultObject.setDomainId(acct.getDomainId()); -// resultObject.setDomain(managementServer.findDomainIdById(acct.getDomainId()).getName()); - } - - if (router.getState() != null) - resultObject.setState(router.getState().toString()); - return resultObject; - } -} diff --git a/server/src/com/cloud/async/executor/RouterOperationResultObject.java b/server/src/com/cloud/async/executor/RouterOperationResultObject.java deleted file mode 100644 index 74a0fb7a067..00000000000 --- a/server/src/com/cloud/async/executor/RouterOperationResultObject.java +++ /dev/null @@ -1,311 +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 java.util.Date; - -import com.cloud.serializer.Param; - -public class RouterOperationResultObject { - @Param(name="id") - private long id; - - @Param(name="zoneid") - private long zoneId; - - @Param(name="zonename") - private String zoneName; - - @Param(name="dns1") - private String dns1; - - @Param(name="dns2") - private String dns2; - - @Param(name="networkdomain") - private String networkDomain; - - @Param(name="gateway") - private String gateway; - - @Param(name="name") - private String name; - - @Param(name="podid") - private long podId; - - @Param(name="privateip") - private String privateIp; - - @Param(name="privatemacaddress") - private String privateMacAddress; - - @Param(name="privatenetmask") - private String privateNetMask; - - @Param(name="publicip") - private String publicIp; - - @Param(name="publicmacaddress") - private String publicMacAddress; - - @Param(name="publicnetmask") - private String publicNetMask; - - @Param(name="guestipaddress") - private String guestIp; - - @Param(name="macaddress") - private String guestMacAddress; - - @Param(name="templateid") - private long templateId; - - @Param(name="created") - private Date created; - - @Param(name="account") - private String account; - - @Param(name="domainid") - private long domainId; - - @Param(name="domain") - private String domain; - - @Param(name="hostid") - private Long hostId; - - @Param(name="state") - private String state; - - @Param(name="hostname") - private String hostname; - - @Param(name="guestnetmask") - private String guestNetmask; - - public String getGuestNetmask(){ - return this.guestNetmask; - } - - public void setGuestNetmask(String guestNetmask){ - this.guestNetmask = guestNetmask; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - 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 String getDns1() { - return dns1; - } - - public void setDns1(String dns1) { - this.dns1 = dns1; - } - - public String getDns2() { - return dns2; - } - - public void setDns2(String dns2) { - this.dns2 = dns2; - } - - public String getNetworkDomain() { - return networkDomain; - } - - public void setNetworkDomain(String networkDomain) { - this.networkDomain = networkDomain; - } - - public String getGateway() { - return gateway; - } - - public void setGateway(String gateway) { - this.gateway = gateway; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public long getPodId() { - return podId; - } - - public void setPodId(long podId) { - this.podId = podId; - } - - public String getPrivateIp() { - return privateIp; - } - - public void setPrivateIp(String privateIp) { - this.privateIp = privateIp; - } - - public String getPrivateMacAddress() { - return privateMacAddress; - } - - public void setPrivateMacAddress(String privateMacAddress) { - this.privateMacAddress = privateMacAddress; - } - - public String getPrivateNetMask() { - return privateNetMask; - } - - public void setPrivateNetMask(String privateNetMask) { - this.privateNetMask = privateNetMask; - } - - public String getPublicIp() { - return publicIp; - } - - public void setPublicIp(String publicIp) { - this.publicIp = publicIp; - } - - public String getPublicMacAddress() { - return publicMacAddress; - } - - public void setPublicMacAddress(String publicMacAddress) { - this.publicMacAddress = publicMacAddress; - } - - public String getPublicNetMask() { - return publicNetMask; - } - - public void setPublicNetMask(String publicNetMask) { - this.publicNetMask = publicNetMask; - } - - public String getGuestIp() { - return guestIp; - } - - public void setGuestIp(String guestIp) { - this.guestIp = guestIp; - } - - public String getGuestMacAddress() { - return guestMacAddress; - } - - public void setGuestMacAddress(String guestMacAddress) { - this.guestMacAddress = guestMacAddress; - } - - public long getTemplateId() { - return templateId; - } - - public void setTemplateId(long templateId) { - this.templateId = templateId; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public Long getHostId() { - return hostId; - } - - public void setHostId(Long hostId) { - this.hostId = hostId; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public String getDomain() { - return domain; - } - - public void setDomain(String domain) { - this.domain = domain; - } - - public long getDomainId() { - return domainId; - } - - public void setDomainId(long domainId) { - this.domainId = domainId; - } - - public String getHostname() { - return hostname; - } - - public void setHostname(String hostname) { - this.hostname = hostname; - } -} diff --git a/server/src/com/cloud/async/executor/SecurityGroupIngressParam.java b/server/src/com/cloud/async/executor/SecurityGroupIngressParam.java deleted file mode 100644 index 477ea3c9576..00000000000 --- a/server/src/com/cloud/async/executor/SecurityGroupIngressParam.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.cloud.async.executor; - -import java.util.List; - -import com.cloud.network.security.SecurityGroupVO; -import com.cloud.user.AccountVO; - -public class SecurityGroupIngressParam { - private AccountVO account; - private String groupName; - private String protocol; - private int startPort; - private int endPort; - private String[] cidrList; - private List authorizedGroups; - - protected SecurityGroupIngressParam() { } - - public SecurityGroupIngressParam(AccountVO account, String groupName, String protocol, int startPort, int endPort, String[] cidrList, List authorizedGroups) { - this.account = account; - this.groupName = groupName; - this.protocol = protocol; - this.startPort = startPort; - this.endPort = endPort; - this.cidrList = cidrList; - this.authorizedGroups = authorizedGroups; - } - - public AccountVO getAccount() { - return account; - } - - public String getGroupName() { - return groupName; - } - - public String getProtocol() { - return protocol; - } - - public int getStartPort() { - return startPort; - } - - public int getEndPort() { - return endPort; - } - - public String[] getCidrList() { - return cidrList; - } - - public List getAuthorizedGroups() { - return authorizedGroups; - } -} diff --git a/server/src/com/cloud/async/executor/SnapshotOperationParam.java b/server/src/com/cloud/async/executor/SnapshotOperationParam.java deleted file mode 100644 index 6cffb2d2825..00000000000 --- a/server/src/com/cloud/async/executor/SnapshotOperationParam.java +++ /dev/null @@ -1,113 +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 java.util.List; - -public class SnapshotOperationParam { - public enum SnapshotOp {Create, Delete, CreateVolume}; - private long accountId; - private long userId; - private long snapshotId = 0; - private long policyId = 0; - private long volumeId; - private String name = null; - private long eventId; - - public SnapshotOperationParam() { - } - - // Used for delete snapshot - public SnapshotOperationParam(long userId, long accountId, long volumeId, long snapshotId, long policyId) { - setUserId(userId); - setAccountId(accountId); - setVolumeId(volumeId); - this.snapshotId = snapshotId; - this.policyId = policyId; - } - - // Used to create a snapshot - public SnapshotOperationParam(long userId, long accountId, long volumeId, long policyId) { - setUserId(userId); - setAccountId(accountId); - setVolumeId(volumeId); - this.policyId = policyId; - } - - // Used for CreateVolumeFromSnapshot - public SnapshotOperationParam(long userId, long accountId, long volumeId, long snapshotId, String volumeName) { - setUserId(userId); - setAccountId(accountId); - setVolumeId(volumeId); - this.snapshotId = snapshotId; - setName(volumeName); - } - - public long getUserId() { - return userId; - } - - public long getAccountId() { - return accountId; - } - - public long getVolumeId() { - return volumeId; - } - - public String getName() { - return name; - } - - public long getSnapshotId() { - return snapshotId; - } - - public void setSnapshotId(long snapshotId) { - this.snapshotId = snapshotId; - } - - public long getPolicyId() { - return policyId; - } - - private void setUserId(long userId) { - this.userId = userId; - } - - private void setAccountId(long accountId) { - this.accountId = accountId; - } - - private void setVolumeId(long volumeId) { - this.volumeId = volumeId; - } - - private void setName(String name) { - this.name = name; - } - - public void setEventId(long eventId) { - this.eventId = eventId; - } - - public long getEventId() { - return eventId; - } -} diff --git a/server/src/com/cloud/async/executor/StartConsoleProxyExecutor.java b/server/src/com/cloud/async/executor/StartConsoleProxyExecutor.java deleted file mode 100644 index 740f34ee6e6..00000000000 --- a/server/src/com/cloud/async/executor/StartConsoleProxyExecutor.java +++ /dev/null @@ -1,75 +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.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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.vm.ConsoleProxyVO; -import com.google.gson.Gson; - -public class StartConsoleProxyExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(StartConsoleProxyExecutor.class.getName()); - - @Override - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - if(getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job, "ConsoleProxy", param.getVmId()); - return true; - } else { - try { - ConsoleProxyVO proxy = managementServer.startConsoleProxy(param.getVmId()); - if(proxy != null) - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - ConsoleProxyExecutorHelper.composeResultObject(managementServer, proxy)); - else - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "operation failed"); - } catch(Exception e) { - s_logger.warn("Unable to start console proxy " + param.getVmId() + ":" + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - return true; - } - } - - @Override - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - } - - @Override - public void processDisconnect(VMOperationListener listener, long agentId) { - } - - @Override - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - } -} diff --git a/server/src/com/cloud/async/executor/StartConsoleProxyResult.java b/server/src/com/cloud/async/executor/StartConsoleProxyResult.java deleted file mode 100644 index 56e30992f4e..00000000000 --- a/server/src/com/cloud/async/executor/StartConsoleProxyResult.java +++ /dev/null @@ -1,260 +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 java.util.Date; - -import com.cloud.serializer.Param; - -public class StartConsoleProxyResult { - - @Param(name="id") - private long id; - - @Param(name="name") - private String name; - - @Param(name="zoneid") - private long zoneId; - - @Param(name="zonename") - private String zoneName; - - @Param(name="dns1") - private String dns1; - - @Param(name="dns2") - private String dns2; - - @Param(name="networkdomain") - private String networkDomain; - - @Param(name="gateway") - private String gateway; - - @Param(name="podid") - private long podId; - - @Param(name="hostid") - private Long hostId; - - @Param(name="hostname") - private String hostName; - - @Param(name="privateip") - private String privateIp; - - @Param(name="privatemacaddress") - private String privateMac; - - @Param(name="privatenetmask") - private String privateNetmask; - - @Param(name="publicip") - private String publicIp; - - @Param(name="publicmacaddress") - private String publicMac; - - @Param(name="publicnetmask") - private String publicNetmask; - - @Param(name="templateid") - private long templateId; - - @Param(name="created") - private Date created; - - @Param(name="activeviewersessions") - private int actionSessions; - - @Param(name="state") - private String state; - - public StartConsoleProxyResult() { - } - - 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 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 String getDns1() { - return dns1; - } - - public void setDns1(String dns1) { - this.dns1 = dns1; - } - - public String getDns2() { - return dns2; - } - - public void setDns2(String dns2) { - this.dns2 = dns2; - } - - public String getNetworkDomain() { - return networkDomain; - } - - public void setNetworkDomain(String networkDomain) { - this.networkDomain = networkDomain; - } - - public String getGateway() { - return gateway; - } - - public void setGateway(String gateway) { - this.gateway = gateway; - } - - public long getPodId() { - return podId; - } - - public void setPodId(long podId) { - this.podId = podId; - } - - public Long getHostId() { - return hostId; - } - - public void setHostId(Long hostId) { - this.hostId = hostId; - } - - public String getHostName() { - return hostName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - - public String getPrivateIp() { - return privateIp; - } - - public void setPrivateIp(String privateIp) { - this.privateIp = privateIp; - } - - public String getPrivateMac() { - return privateMac; - } - - public void setPrivateMac(String privateMac) { - this.privateMac = privateMac; - } - - public String getPrivateNetmask() { - return privateNetmask; - } - - public void setPrivateNetmask(String privateNetmask) { - this.privateNetmask = privateNetmask; - } - - public String getPublicIp() { - return publicIp; - } - - public void setPublicIp(String publicIp) { - this.publicIp = publicIp; - } - - public String getPublicMac() { - return publicMac; - } - - public void setPublicMac(String publicMac) { - this.publicMac = publicMac; - } - - public String getPublicNetmask() { - return publicNetmask; - } - - public void setPublicNetmask(String publicNetmask) { - this.publicNetmask = publicNetmask; - } - - public long getTemplateId() { - return templateId; - } - - public void setTemplateId(long templateId) { - this.templateId = templateId; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public int getActionSessions() { - return actionSessions; - } - - public void setActionSessions(int actionSessions) { - this.actionSessions = actionSessions; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } -} diff --git a/server/src/com/cloud/async/executor/StartRouterExecutor.java b/server/src/com/cloud/async/executor/StartRouterExecutor.java deleted file mode 100644 index e9191d0a08c..00000000000 --- a/server/src/com/cloud/async/executor/StartRouterExecutor.java +++ /dev/null @@ -1,91 +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.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.InternalErrorException; -import com.cloud.network.router.VirtualRouter; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.google.gson.Gson; - -public class StartRouterExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(StartRouterExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - - /* - if(getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job, "Router", param.getVmId()); - return true; - } else { - boolean success = false; - try { - DomainRouter router = managementServer.startRouter(param.getVmId(), param.getEventId()); - if(router != null){ - success = true; - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - RouterExecutorHelper.composeResultObject(managementServer, router)); - } - else - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "operation failed"); - } catch (InternalErrorException e) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } catch(Exception e) { - 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; - } - */ - return true; - } - - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - } - - public void processDisconnect(VMOperationListener listener, long agentId) { - } - - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - } -} diff --git a/server/src/com/cloud/async/executor/StartRouterResultObject.java b/server/src/com/cloud/async/executor/StartRouterResultObject.java deleted file mode 100644 index 18ca14491a7..00000000000 --- a/server/src/com/cloud/async/executor/StartRouterResultObject.java +++ /dev/null @@ -1,300 +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 java.util.Date; - -import com.cloud.serializer.Param; - -public class StartRouterResultObject { - @Param(name="id") - private long id; - - @Param(name="zoneid") - private long zoneId; - - @Param(name="zonename") - private String zoneName; - - @Param(name="dns1") - private String dns1; - - @Param(name="dns2") - private String dns2; - - @Param(name="networkdomain") - private String networkDomain; - - @Param(name="gateway") - private String gateway; - - @Param(name="name") - private String name; - - @Param(name="podid") - private long podId; - - @Param(name="privateip") - private String privateIp; - - @Param(name="privatemacaddress") - private String privateMacAddress; - - @Param(name="privatenetmask") - private String privateNetMask; - - @Param(name="publicip") - private String publicIp; - - @Param(name="publicmacaddress") - private String publicMacAddress; - - @Param(name="publicnetmask") - private String publicNetMask; - - @Param(name="ipaddress") - private String guestIp; - - @Param(name="macaddress") - private String guestMacAddress; - - @Param(name="templateid") - private long templateId; - - @Param(name="created") - private Date created; - - @Param(name="account") - private String account; - - @Param(name="domainid") - private long domainId; - - @Param(name="domain") - private String domain; - - @Param(name="hostid") - private Long hostId; - - @Param(name="state") - private String state; - - @Param(name="hostname") - private String hostname; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - 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 String getDns1() { - return dns1; - } - - public void setDns1(String dns1) { - this.dns1 = dns1; - } - - public String getDns2() { - return dns2; - } - - public void setDns2(String dns2) { - this.dns2 = dns2; - } - - public String getNetworkDomain() { - return networkDomain; - } - - public void setNetworkDomain(String networkDomain) { - this.networkDomain = networkDomain; - } - - public String getGateway() { - return gateway; - } - - public void setGateway(String gateway) { - this.gateway = gateway; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public long getPodId() { - return podId; - } - - public void setPodId(long podId) { - this.podId = podId; - } - - public String getPrivateIp() { - return privateIp; - } - - public void setPrivateIp(String privateIp) { - this.privateIp = privateIp; - } - - public String getPrivateMacAddress() { - return privateMacAddress; - } - - public void setPrivateMacAddress(String privateMacAddress) { - this.privateMacAddress = privateMacAddress; - } - - public String getPrivateNetMask() { - return privateNetMask; - } - - public void setPrivateNetMask(String privateNetMask) { - this.privateNetMask = privateNetMask; - } - - public String getPublicIp() { - return publicIp; - } - - public void setPublicIp(String publicIp) { - this.publicIp = publicIp; - } - - public String getPublicMacAddress() { - return publicMacAddress; - } - - public void setPublicMacAddress(String publicMacAddress) { - this.publicMacAddress = publicMacAddress; - } - - public String getPublicNetMask() { - return publicNetMask; - } - - public void setPublicNetMask(String publicNetMask) { - this.publicNetMask = publicNetMask; - } - - public String getGuestIp() { - return guestIp; - } - - public void setGuestIp(String guestIp) { - this.guestIp = guestIp; - } - - public String getGuestMacAddress() { - return guestMacAddress; - } - - public void setGuestMacAddress(String guestMacAddress) { - this.guestMacAddress = guestMacAddress; - } - - public long getTemplateId() { - return templateId; - } - - public void setTemplateId(long templateId) { - this.templateId = templateId; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public Long getHostId() { - return hostId; - } - - public void setHostId(Long hostId) { - this.hostId = hostId; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public String getDomain() { - return domain; - } - - public void setDomain(String domain) { - this.domain = domain; - } - - public long getDomainId() { - return domainId; - } - - public void setDomainId(long domainId) { - this.domainId = domainId; - } - - public String getHostname() { - return hostname; - } - - public void setHostname(String hostname) { - this.hostname = hostname; - } -} diff --git a/server/src/com/cloud/async/executor/StopConsoleProxyExecutor.java b/server/src/com/cloud/async/executor/StopConsoleProxyExecutor.java deleted file mode 100644 index e0a37614b54..00000000000 --- a/server/src/com/cloud/async/executor/StopConsoleProxyExecutor.java +++ /dev/null @@ -1,79 +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.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.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.vm.ConsoleProxyVO; -import com.google.gson.Gson; - -public class StopConsoleProxyExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(StopConsoleProxyExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - /* - if(getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job, "ConsoleProxy", param.getVmId()); - return true; - } else { - try { - boolean result = managementServer.stopConsoleProxy(param.getVmId(), param.getEventId()); - if(result) - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - composeResultObject(managementServer, param.getVmId())); - else - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "Operation failed"); - } catch(Exception e) { - s_logger.warn("Unable to stop console proxy " + param.getVmId() + ":" + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - return true; - } - */ - return true; - } - - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - } - - public void processDisconnect(VMOperationListener listener, long agentId) { - } - - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - } - - private ConsoleProxyOperationResultObject composeResultObject(ManagementServer managementServer, long proxyVmId) { - ConsoleProxyVO proxy = managementServer.findConsoleProxyById(proxyVmId); - return ConsoleProxyExecutorHelper.composeResultObject(managementServer, proxy); - } -} diff --git a/server/src/com/cloud/async/executor/StopRouterExecutor.java b/server/src/com/cloud/async/executor/StopRouterExecutor.java deleted file mode 100644 index ef3ff649235..00000000000 --- a/server/src/com/cloud/async/executor/StopRouterExecutor.java +++ /dev/null @@ -1,76 +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.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.network.router.VirtualRouter; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.google.gson.Gson; - -public class StopRouterExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(StopRouterExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - - /* - if(getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job, "Router", param.getVmId()); - return true; - } else { - try { - if(managementServer.stopRouter(param.getVmId(), param.getEventId())) { - DomainRouter router = managementServer.findDomainRouterById(param.getVmId()); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - RouterExecutorHelper.composeResultObject(managementServer, router)); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "failed"); - } - } catch(Exception e) { - s_logger.warn("Unable to stop router " + param.getVmId() + ":" + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - return true; - } - */ - return true; - } - - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - } - - public void processDisconnect(VMOperationListener listener, long agentId) { - } - - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - } -} diff --git a/server/src/com/cloud/async/executor/SystemVmCmdExecutor.java b/server/src/com/cloud/async/executor/SystemVmCmdExecutor.java deleted file mode 100644 index 31726ef450b..00000000000 --- a/server/src/com/cloud/async/executor/SystemVmCmdExecutor.java +++ /dev/null @@ -1,147 +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.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.async.executor.VMOperationParam.VmOp; -import com.cloud.exception.InternalErrorException; -import com.cloud.serializer.GsonHelper; -import com.cloud.server.ManagementServer; -import com.cloud.vm.SecondaryStorageVmVO; -import com.cloud.vm.VMInstanceVO; -import com.google.gson.Gson; - -public class SystemVmCmdExecutor extends VMOperationExecutor { - public static final Logger s_logger = Logger.getLogger(SystemVmCmdExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); - VMOperationParam param = gson.fromJson(job.getCmdInfo(), VMOperationParam.class); - VmOp oper = param.getOperation(); - VMInstanceVO vm; - /* - if(getSyncSource() == null) { - asyncMgr.syncAsyncJobExecution(job.getId(), "SystemVm", param.getVmId()); - return true; - } else { - try { - switch (oper){ - case Destroy: - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.UNSUPPORTED_ACTION_ERROR, - "operation not allowed"); - break; - case Noop: - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, "noop operation"); - break; - case Start: - vm = managementServer.startSystemVM(param.getVmId(), param.getEventId()); - if(vm != null) - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, - composeResultObject(managementServer, vm)); - else - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "operation failed"); - break; - case Stop: - boolean result = managementServer.stopSystemVM(param.getVmId(), param.getEventId()); - if(result) { - vm = managementServer.findSystemVMById(param.getVmId()); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, composeResultObject(managementServer, vm)); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "operation failed"); - } - break; - case Reboot: - result = managementServer.rebootSystemVM(param.getVmId(), param.getEventId()); - if(result) { - vm = managementServer.findSystemVMById(param.getVmId()); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, composeResultObject(managementServer, vm)); - } else { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - "operation failed"); - } - break; - default: - assert false :"Unknown vm operation"; - } - - } catch (InternalErrorException e) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } catch(Exception e) { - s_logger.warn("Unable to start console vm " + param.getVmId() + ":" + e.getMessage(), e); - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, - e.getMessage()); - } - return true; - } - */ - return true; - } - - private Object composeResultObject(ManagementServer managementServer, VMInstanceVO vm) { - SystemVmOperationResultObject result = new SystemVmOperationResultObject(); - if (vm instanceof SecondaryStorageVmVO) { - SecondaryStorageVmVO ssVm = (SecondaryStorageVmVO)vm; - result.setId(ssVm.getId()); - result.setName(vm.getName()); - result.setZoneId(ssVm.getDataCenterId()); - result.setZoneName(managementServer.findDataCenterById(ssVm.getDataCenterId()).getName()); - result.setDns1(ssVm.getDns1()); - result.setDns2(ssVm.getDns2()); - result.setNetworkDomain(ssVm.getDomain()); - result.setGateway(ssVm.getGateway()); - result.setPodId(ssVm.getPodId()); - result.setHostId(ssVm.getHostId()); - if(ssVm.getHostId() != null) - result.setHostName(managementServer.getHostBy(ssVm.getHostId()).getName()); - - result.setPrivateIp(ssVm.getPrivateIpAddress()); - result.setPrivateMac(ssVm.getPrivateMacAddress()); - result.setPrivateNetmask(ssVm.getPrivateNetmask()); - result.setPublicIp(ssVm.getPublicIpAddress()); - result.setPublicMac(ssVm.getPublicMacAddress()); - result.setPublicNetmask(ssVm.getPublicNetmask()); - result.setTemplateId(ssVm.getTemplateId()); - result.setCreated(ssVm.getCreated()); - result.setState(ssVm.getState().toString()); - //result.setNfsShare(ssVm.getNfsShare()); - } - return result; - } - - public void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer) { - } - - public void processDisconnect(VMOperationListener listener, long agentId) { - } - - public void processTimeout(VMOperationListener listener, long agentId, long seq) { - } -} diff --git a/server/src/com/cloud/async/executor/SystemVmOperationResultObject.java b/server/src/com/cloud/async/executor/SystemVmOperationResultObject.java deleted file mode 100644 index 9b5e591ae32..00000000000 --- a/server/src/com/cloud/async/executor/SystemVmOperationResultObject.java +++ /dev/null @@ -1,260 +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 java.util.Date; - -import com.cloud.serializer.Param; - -public class SystemVmOperationResultObject { - - @Param(name="id") - private long id; - - @Param(name="name") - private String name; - - @Param(name="zoneid") - private long zoneId; - - @Param(name="zonename") - private String zoneName; - - @Param(name="dns1") - private String dns1; - - @Param(name="dns2") - private String dns2; - - @Param(name="networkdomain") - private String networkDomain; - - @Param(name="gateway") - private String gateway; - - @Param(name="podid") - private long podId; - - @Param(name="hostid") - private Long hostId; - - @Param(name="hostname") - private String hostName; - - @Param(name="privateip") - private String privateIp; - - @Param(name="privatemacaddress") - private String privateMac; - - @Param(name="privatenetmask") - private String privateNetmask; - - @Param(name="publicip") - private String publicIp; - - @Param(name="publicmacaddress") - private String publicMac; - - @Param(name="publicnetmask") - private String publicNetmask; - - @Param(name="templateid") - private long templateId; - - @Param(name="created") - private Date created; - - @Param(name="activeviewersessions") - private int actionSessions; - - @Param(name="state") - private String state; - - public SystemVmOperationResultObject() { - } - - 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 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 String getDns1() { - return dns1; - } - - public void setDns1(String dns1) { - this.dns1 = dns1; - } - - public String getDns2() { - return dns2; - } - - public void setDns2(String dns2) { - this.dns2 = dns2; - } - - public String getNetworkDomain() { - return networkDomain; - } - - public void setNetworkDomain(String networkDomain) { - this.networkDomain = networkDomain; - } - - public String getGateway() { - return gateway; - } - - public void setGateway(String gateway) { - this.gateway = gateway; - } - - public long getPodId() { - return podId; - } - - public void setPodId(long podId) { - this.podId = podId; - } - - public Long getHostId() { - return hostId; - } - - public void setHostId(Long hostId) { - this.hostId = hostId; - } - - public String getHostName() { - return hostName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - - public String getPrivateIp() { - return privateIp; - } - - public void setPrivateIp(String privateIp) { - this.privateIp = privateIp; - } - - public String getPrivateMac() { - return privateMac; - } - - public void setPrivateMac(String privateMac) { - this.privateMac = privateMac; - } - - public String getPrivateNetmask() { - return privateNetmask; - } - - public void setPrivateNetmask(String privateNetmask) { - this.privateNetmask = privateNetmask; - } - - public String getPublicIp() { - return publicIp; - } - - public void setPublicIp(String publicIp) { - this.publicIp = publicIp; - } - - public String getPublicMac() { - return publicMac; - } - - public void setPublicMac(String publicMac) { - this.publicMac = publicMac; - } - - public String getPublicNetmask() { - return publicNetmask; - } - - public void setPublicNetmask(String publicNetmask) { - this.publicNetmask = publicNetmask; - } - - public long getTemplateId() { - return templateId; - } - - public void setTemplateId(long templateId) { - this.templateId = templateId; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public int getActionSessions() { - return actionSessions; - } - - public void setActionSessions(int actionSessions) { - this.actionSessions = actionSessions; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } -} diff --git a/server/src/com/cloud/async/executor/UpdateLoadBalancerParam.java b/server/src/com/cloud/async/executor/UpdateLoadBalancerParam.java deleted file mode 100644 index 2d79d86a670..00000000000 --- a/server/src/com/cloud/async/executor/UpdateLoadBalancerParam.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.cloud.async.executor; - -public class UpdateLoadBalancerParam { - private long userId; - private long loadBalancerId; - private String name; - private String description; - private String privatePort; - private String algorithm; - - public UpdateLoadBalancerParam() { } - - public UpdateLoadBalancerParam(long userId, long loadBalancerId, String name, String description, String privatePort, String algorithm) { - this.userId = userId; - this.loadBalancerId = loadBalancerId; - this.name = name; - this.description = description; - this.privatePort = privatePort; - this.algorithm = algorithm; - } - - public long getUserId() { - return userId; - } - - public long getLoadBalancerId() { - return loadBalancerId; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - public String getPrivatePort() { - return privatePort; - } - - public String getAlgorithm() { - return algorithm; - } -} diff --git a/server/src/com/cloud/async/executor/UpdateLoadBalancerRuleResultObject.java b/server/src/com/cloud/async/executor/UpdateLoadBalancerRuleResultObject.java deleted file mode 100644 index 6afa5ee93d0..00000000000 --- a/server/src/com/cloud/async/executor/UpdateLoadBalancerRuleResultObject.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.cloud.async.executor; - -import com.cloud.serializer.Param; - -public class UpdateLoadBalancerRuleResultObject { - @Param(name="id") - private long id; - - @Param(name="name") - private String name; - - @Param(name="description") - private String description; - - @Param(name="publicip") - private String publicIp; - - @Param(name="publicport") - private String publicPort; - - @Param(name="privateport") - private String privatePort; - - @Param(name="algorithm") - private String algorithm; - - @Param(name="account") - private String accountName; - - @Param(name="domainid") - private long domainId; - - @Param(name="domain") - private String domainName; - - 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 getDescription() { - return description; - } - public void setDescription(String description) { - this.description = description; - } - - public String getPublicIp() { - return publicIp; - } - public void setPublicIp(String publicIp) { - this.publicIp = publicIp; - } - - public String getPublicPort() { - return publicPort; - } - public void setPublicPort(String publicPort) { - this.publicPort = publicPort; - } - - public String getPrivatePort() { - return privatePort; - } - public void setPrivatePort(String privatePort) { - this.privatePort = privatePort; - } - - public String getAlgorithm() { - return algorithm; - } - public void setAlgorithm(String algorithm) { - this.algorithm = algorithm; - } - - public String getAccountName() { - return accountName; - } - public void setAccountName(String accountName) { - this.accountName = accountName; - } - - public long getDomainId() { - return domainId; - } - public void setDomainId(long domainId) { - this.domainId = domainId; - } - - public String getDomainName() { - return domainName; - } - public void setDomainName(String domainName) { - this.domainName = domainName; - } -} diff --git a/server/src/com/cloud/async/executor/UpdatePortForwardingRuleResultObject.java b/server/src/com/cloud/async/executor/UpdatePortForwardingRuleResultObject.java deleted file mode 100644 index a5e81001963..00000000000 --- a/server/src/com/cloud/async/executor/UpdatePortForwardingRuleResultObject.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.cloud.async.executor; - -import com.cloud.serializer.Param; - -public class UpdatePortForwardingRuleResultObject { - @Param(name="id") - private long id; - - @Param(name="publicip") - private String publicIp; - - @Param(name="privateip") - private String privateIp; - - @Param(name="publicport") - private String publicPort; - - @Param(name="privateport") - private String privatePort; - - @Param(name="protocol") - private String protocol; - - @Param(name="virtualmachineid") - private long virtualMachineId; - - @Param(name="vmname") - private String virtualMachineName; - - @Param(name="vmdisplayname") - private String virtualMachineDisplayName; - - public String getVirtualMachineDisplayName(){ - return this.virtualMachineDisplayName; - } - - public void setVirtualMachineDisplayName(String name){ - this.virtualMachineDisplayName = name; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getPublicIp() { - return publicIp; - } - - public void setPublicIp(String publicIp) { - this.publicIp = publicIp; - } - - public String getPrivateIp() { - return privateIp; - } - - public void setPrivateIp(String privateIp) { - this.privateIp = privateIp; - } - - public String getPublicPort() { - return publicPort; - } - - public void setPublicPort(String publicPort) { - this.publicPort = publicPort; - } - - public String getPrivatePort() { - return privatePort; - } - - public void setPrivatePort(String privatePort) { - this.privatePort = privatePort; - } - - public String getProtocol() { - return protocol; - } - - public void setProtocol(String protocol) { - this.protocol = protocol; - } - - public long getVirtualMachineId() { - return virtualMachineId; - } - - public void setVirtualMachineId(long virtualMachineId) { - this.virtualMachineId = virtualMachineId; - } - - public String getVirtualMachineName() { - return virtualMachineName; - } - - public void setVirtualMachineName(String virtualMachineName) { - this.virtualMachineName = virtualMachineName; - } -} diff --git a/server/src/com/cloud/async/executor/UpgradeVMExecutor.java b/server/src/com/cloud/async/executor/UpgradeVMExecutor.java deleted file mode 100644 index 496955dadad..00000000000 --- a/server/src/com/cloud/async/executor/UpgradeVMExecutor.java +++ /dev/null @@ -1,134 +0,0 @@ -//TODO -- This will be removed -///** -// * 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.serializer.GsonHelper; -//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.UserVmVO; -//import com.cloud.vm.VMInstanceVO; -//import com.cloud.vm.VmStats; -//import com.google.gson.Gson; -// -//public class UpgradeVMExecutor extends BaseAsyncJobExecutor { -// public static final Logger s_logger = Logger.getLogger(UpgradeVMExecutor.class.getName()); -// -// public boolean execute() { -// AsyncJobManager asyncMgr = getAsyncJobMgr(); -// AsyncJobVO job = getJob(); -// Gson gson = GsonHelper.getBuilder().create(); -// -// 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(); -// UpgradeVMParam param = gson.fromJson(job.getCmdInfo(), UpgradeVMParam.class); -// -// try { -// asyncMgr.updateAsyncJobAttachment(job.getId(), "vm_instance", param.getVmId()); -// boolean success = managementServer.upgradeVirtualMachine(param.getUserId(), -// param.getVmId(), param.getServiceOfferingId(), param.getEventId()); -// -// if (success) { -// //get the upgraded vm to compose the result object -// UserVmVO userVm = managementServer.findUserVMInstanceById(param.getVmId()); -// asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, -// composeResultObject(userVm, managementServer)); -// -// } else { -// asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, -// BaseCmd.VM_CHANGE_SERVICE_ERROR, -// composeResultObject(null, managementServer)); -// } -// } catch(Exception e) { -// s_logger.warn("Unable to upgrade VM " + param.getVmId() + ":" + e.getMessage(), e); -// asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, -// BaseCmd.INTERNAL_ERROR, -// e.getMessage()); -// } -// return true; -// } -// } -// -// private VmResultObject composeResultObject(UserVmVO vm, ManagementServer ms) -// { -// if(vm == null) -// return null; -// -// VmResultObject resultObj = new VmResultObject(); -// Account acct = ms.findAccountById(Long.valueOf(vm.getAccountId())); -// resultObj.setAccount(acct.getAccountName()); -// -// ServiceOfferingVO offering = ms.findServiceOfferingById(vm.getServiceOfferingId()); -// resultObj.setCpuSpeed(offering.getSpeed()); -// resultObj.setMemory(offering.getRamSize()); -// if(offering.getDisplayText()!=null) -// resultObj.setServiceOfferingName(offering.getDisplayText()); -// else -// resultObj.setServiceOfferingName(offering.getName()); -// resultObj.setServiceOfferingId(vm.getServiceOfferingId()); -// -// VmStats vmStats = ms.getVmStatistics(vm.getId()); -// if(vmStats != null) -// { -// resultObj.setCpuUsed((long) vmStats.getCPUUtilization()); -// resultObj.setNetworkKbsRead((long) vmStats.getNetworkReadKBs()); -// resultObj.setNetworkKbsWrite((long) vmStats.getNetworkWriteKBs()); -// } -// -// resultObj.setCreated(vm.getCreated()); -// resultObj.setDisplayName(vm.getDisplayName()); -// resultObj.setDomain(ms.findDomainIdById(acct.getDomainId()).getName()); -// resultObj.setDomainId(acct.getDomainId()); -// resultObj.setHaEnable(vm.isHaEnabled()); -// if(vm.getHostId() != null) -// { -// resultObj.setHostId(vm.getHostId()); -// resultObj.setHostName(ms.getHostBy(vm.getHostId()).getName()); -// } -// resultObj.setIpAddress(vm.getPrivateIpAddress()); -// resultObj.setName(vm.getName()); -// resultObj.setState(vm.getState().toString()); -// resultObj.setZoneId(vm.getDataCenterId()); -// resultObj.setZoneName(ms.findDataCenterById(vm.getDataCenterId()).getName()); -// -// VMTemplateVO template = ms.findTemplateById(vm.getTemplateId()); -// resultObj.setPasswordEnabled(template.getEnablePassword()); -// resultObj.setTemplateDisplayText(template.getDisplayText()); -// resultObj.setTemplateId(template.getId()); -// resultObj.setTemplateName(template.getName()); -// -// return resultObj; -// } -//} diff --git a/server/src/com/cloud/async/executor/UpgradeVMParam.java b/server/src/com/cloud/async/executor/UpgradeVMParam.java deleted file mode 100644 index 7da70472030..00000000000 --- a/server/src/com/cloud/async/executor/UpgradeVMParam.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.async.executor; - -public class UpgradeVMParam { - private long userId; - private long vmId; - private long serviceOfferingId; - private long eventId; - - public UpgradeVMParam() { - } - - public UpgradeVMParam(long userId, long vmId, long serviceOfferingId) { - this.userId = userId; - this.vmId = vmId; - this.serviceOfferingId = serviceOfferingId; - } - - public long getUserId() { - return userId; - } - - public void setUserId(long userId) { - this.userId = userId; - } - - public long getVmId() { - return vmId; - } - - public void setVmId(long vmId) { - this.vmId = vmId; - } - - public long getServiceOfferingId() { - return serviceOfferingId; - } - - public void setServiceOfferingId(long serviceOfferingId) { - this.serviceOfferingId = serviceOfferingId; - } - - public void setEventId(long eventId) { - this.eventId = eventId; - } - - public long getEventId() { - return eventId; - } -} diff --git a/server/src/com/cloud/async/executor/VMExecutorHelper.java b/server/src/com/cloud/async/executor/VMExecutorHelper.java deleted file mode 100644 index 6ec5d41339d..00000000000 --- a/server/src/com/cloud/async/executor/VMExecutorHelper.java +++ /dev/null @@ -1,117 +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 com.cloud.api.BaseCmd; -import com.cloud.server.ManagementServer; -import com.cloud.service.ServiceOfferingVO; -import com.cloud.storage.VMTemplateVO; -import com.cloud.user.Account; -import com.cloud.vm.UserVmVO; - -public class VMExecutorHelper { - public static VMOperationResultObject composeResultObject(ManagementServer managementServer, UserVmVO vm, String vmPassword) { - - VMOperationResultObject resultObject = new VMOperationResultObject(); - - resultObject.setId(vm.getId()); - resultObject.setName(vm.getName()); - resultObject.setCreated(vm.getCreated()); - resultObject.setZoneId(vm.getDataCenterId()); - resultObject.setZoneName(managementServer.findDataCenterById(vm.getDataCenterId()).getName()); - resultObject.setIpAddress(vm.getPrivateIpAddress()); - resultObject.setServiceOfferingId(vm.getServiceOfferingId()); - resultObject.setHaEnabled(vm.isHaEnabled()); - if (vm.getDisplayName() == null || vm.getDisplayName().length() == 0) { - resultObject.setDisplayName(vm.getName()); - } - else { - resultObject.setDisplayName(vm.getDisplayName()); - } - - if(vm.getState() != null) - resultObject.setState(vm.getState().toString()); - -// InstanceGroupVO group = managementServer.getGroupForVm(vm.getId()); -// if (group != null) { -// resultObject.setGroupId(group.getId()); -// resultObject.setGroup(group.getName()); -// } - - VMTemplateVO template = managementServer.findTemplateById(vm.getTemplateId()); - - Account acct = managementServer.findAccountById(Long.valueOf(vm.getAccountId())); - if (acct != null) { - resultObject.setAccount(acct.getAccountName()); - resultObject.setDomainId(acct.getDomainId()); -// resultObject.setDomain(managementServer.findDomainIdById(acct.getDomainId()).getName()); - } - - if ( BaseCmd.isAdmin(acct.getType()) && (vm.getHostId() != null)) { - resultObject.setHostname(managementServer.getHostBy(vm.getHostId()).getName()); - resultObject.setHostid(vm.getHostId()); - } - - String templateName = "ISO Boot"; - boolean templatePasswordEnabled = false; - String templateDisplayText = "ISO Boot"; - - if (template != null) { - templateName = template.getName(); - templatePasswordEnabled = template.getEnablePassword(); - templateDisplayText = template.getDisplayText(); - if (templateDisplayText == null) { - templateDisplayText = templateName; - } - } - - resultObject.setTemplateId(vm.getTemplateId()); - resultObject.setTemplateName(templateName); - resultObject.setTemplateDisplayText(templateDisplayText); - resultObject.setPasswordEnabled(templatePasswordEnabled); - if(templatePasswordEnabled) - resultObject.setPassword(vmPassword); -// else -// resultObject.setPassword(""); - - String isoName = null; - if (vm.getIsoId() != null) { - VMTemplateVO iso = managementServer.findTemplateById(vm.getIsoId().longValue()); - if (iso != null) { - isoName = iso.getName(); - } - } - - resultObject.setIsoId(vm.getIsoId()); - resultObject.setIsoName(isoName); - - - ServiceOfferingVO offering = managementServer.findServiceOfferingById(vm.getServiceOfferingId()); - resultObject.setServiceOfferingId(vm.getServiceOfferingId()); - resultObject.setServiceOfferingName(offering.getName()); - - resultObject.setCpuNumber(String.valueOf(offering.getCpu())); - resultObject.setCpuSpeed(String.valueOf(offering.getSpeed())); - resultObject.setMemory(String.valueOf(offering.getRamSize())); - - //Network groups -// resultObject.setNetworkGroupList(managementServer.getNetworkGroupsNamesForVm(vm.getId())); - - return resultObject; - } -} diff --git a/server/src/com/cloud/async/executor/VMOperationExecutor.java b/server/src/com/cloud/async/executor/VMOperationExecutor.java deleted file mode 100644 index 6a5932463a2..00000000000 --- a/server/src/com/cloud/async/executor/VMOperationExecutor.java +++ /dev/null @@ -1,28 +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 com.cloud.agent.api.Answer; -import com.cloud.async.BaseAsyncJobExecutor; - -public abstract class VMOperationExecutor extends BaseAsyncJobExecutor { - public abstract void processAnswer(VMOperationListener listener, long agentId, long seq, Answer answer); - public abstract void processDisconnect(VMOperationListener listener, long agentId); - public abstract void processTimeout(VMOperationListener listener, long agentId, long seq); -} diff --git a/server/src/com/cloud/async/executor/VMOperationListener.java b/server/src/com/cloud/async/executor/VMOperationListener.java deleted file mode 100644 index c15b901b030..00000000000 --- a/server/src/com/cloud/async/executor/VMOperationListener.java +++ /dev/null @@ -1,126 +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.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.host.HostVO; -import com.cloud.host.Status; -import com.cloud.vm.UserVmVO; - -public class VMOperationListener implements Listener { - private static final Logger s_logger = Logger.getLogger(VMOperationListener.class); - - private final VMOperationExecutor _executor; - private final VMOperationParam _param; - private final UserVmVO _vm; - private int _cookie; - - public VMOperationListener(VMOperationExecutor executor, VMOperationParam param, - UserVmVO vm, int cookie) { - - if(s_logger.isDebugEnabled()) - s_logger.debug("VM operation listener is created"); - - _executor = executor; - _param = param; - _vm = vm; - _cookie = cookie; - } - - @Override - public boolean processAnswers(long agentId, long seq, Answer[] answers) { - Answer answer = null; - if(answers != null) - answer = answers[0]; - - if(s_logger.isDebugEnabled()) - s_logger.debug("Process command answer for " + agentId + "-" + seq + " " + answer); - _executor.processAnswer(this, agentId, seq, answer); - return true; - } - - @Override - public boolean processCommands(long agentId, long seq, Command[] commands) { - return true; - } - - @Override - public AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd) { - return null; - } - - @Override - public void processConnect(HostVO agent, StartupCommand cmd) { -// return true; - } - - @Override - public boolean processDisconnect(long agentId, Status state) { - if(_vm.getHostId() == agentId) - _executor.processDisconnect(this, agentId); - return true; - } - - @Override - public boolean isRecurring() { - return false; - } - - @Override - public int getTimeout() { - // TODO : no time out support for now as underlying support does not work as expected - return -1; - } - - @Override - public boolean processTimeout(long agentId, long seq) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Process time out for " + agentId + "-" + seq); - - _executor.processTimeout(this, agentId, seq); - return true; - } - - public int getCookie() { - return _cookie; - } - - public void setCookie(int cookie) { - _cookie = cookie; - } - - public VMOperationExecutor getExecutor() { - return _executor; - } - - public VMOperationParam getParam() { - return _param; - } - - public UserVmVO getVm() { - return _vm; - } -} diff --git a/server/src/com/cloud/async/executor/VMOperationParam.java b/server/src/com/cloud/async/executor/VMOperationParam.java deleted file mode 100644 index 1c4e0e6465b..00000000000 --- a/server/src/com/cloud/async/executor/VMOperationParam.java +++ /dev/null @@ -1,101 +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; - -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 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; - } - - public void setUserId(long userId) { - this.userId = userId; - } - - public long getAccountId() { - return accountId; - } - - public void setAccountId(long accountId) { - this.accountId = accountId; - } - - public long getVmId() { - return vmId; - } - - public void setVmId(long vmId) { - this.vmId = vmId; - } - - public String getIsoPath() { - return isoPath; - } - - public void setIsoPath(String isoPath) { - this.isoPath = isoPath; - } - - public void setOperation(VmOp operation) { - this.operation = operation; - } - - public VmOp getOperation() { - return operation; - } - - 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/VMOperationResultObject.java b/server/src/com/cloud/async/executor/VMOperationResultObject.java deleted file mode 100644 index 0293e07c3da..00000000000 --- a/server/src/com/cloud/async/executor/VMOperationResultObject.java +++ /dev/null @@ -1,400 +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 java.util.Date; - -import com.cloud.serializer.Param; - -public class VMOperationResultObject { - - @Param(name="id") - private long id; - - @Param(name="name") - private String name; - - @Param(name="created") - private Date created; - - @Param(name="zoneid") - private Long zoneId; - - @Param(name="zonename") - private String zoneName; - - @Param(name="ipaddress") - private String ipAddress; - - @Param(name="serviceofferingid") - private Long serviceOfferingId; - - @Param(name="haenable") - private boolean haEnabled; - - @Param(name="state") - private String state; - - @Param(name="templateid") - private Long templateId; - - @Param(name="password") - private String password; - - @Param(name="templatename") - private String templateName; - - @Param(name="templatedisplaytext") - private String templateDisplayText; - - @Param(name="isoid") - private Long isoId; - - @Param(name="isoname") - private String isoName; - - @Param(name="passwordenabled") - private boolean passwordEnabled; - - @Param(name="serviceofferingname") - private String serviceOfferingName; - - @Param(name="diskofferingid") - private Long diskOfferingId; - - @Param(name="datadiskofferingname") - private String diskOfferingName; - - @Param(name="cpunumber") - private String cpuNumber; - - @Param(name="cpuspeed") - private String cpuSpeed; - - @Param(name="memory") - private String memory; - - @Param(name="storage") - private String storage; - - @Param(name="displayname") - private String displayName; - - @Param(name="group") - private String group; - - @Param(name="groupid") - private Long groupId; - - @Param(name="domainid") - private Long domainId; - - @Param(name="domain") - private String domain; - - @Param(name="account") - private String account; - - @Param(name="hostname") - private String hostname; - - @Param(name="hostid") - private Long hostid; - - @Param(name="securitygrouplist") - private String securityGroupList; - - @Param(name="rootdeviceid") - private Long rootDeviceId; - - @Param(name="rootdevicetype") - private String rootDeviceType; - - public Long getRootDeviceId(){ - return this.rootDeviceId; - } - - public void setRootDeviceId(Long rootDeviceId){ - this.rootDeviceId = rootDeviceId; - } - - public String getRootDeviceType(){ - return this.rootDeviceType; - } - - public void setRootDeviceType(String deviceType){ - this.rootDeviceType = deviceType; - } - - public String getSecurityGroupList(){ - return this.securityGroupList; - } - - public void setSecurityGroupList(String nGroups){ - this.securityGroupList = nGroups; - } - - 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 Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - 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 String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - public Long getServiceOfferingId() { - return serviceOfferingId; - } - - public void setServiceOfferingId(Long serviceOfferingId) { - this.serviceOfferingId = serviceOfferingId; - } - - public boolean isHaEnabled() { - return haEnabled; - } - - public void setHaEnabled(boolean haEnabled) { - this.haEnabled = haEnabled; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public Long getTemplateId() { - return templateId; - } - - public void setTemplateId(Long templateId) { - this.templateId = templateId; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getTemplateName() { - return templateName; - } - - public void setTemplateName(String templateName) { - this.templateName = templateName; - } - - public String getTemplateDisplayText() { - return templateDisplayText; - } - - public void setTemplateDisplayText(String templateDisplayText) { - this.templateDisplayText = templateDisplayText; - } - - public Long getIsoId() { - return isoId; - } - - public void setIsoId(Long isoId) { - this.isoId = isoId; - } - - public String getIsoName() { - return isoName; - } - - public void setIsoName(String isoName) { - this.isoName = isoName; - } - - public boolean isPasswordEnabled() { - return passwordEnabled; - } - - public void setPasswordEnabled(boolean passwordEnabled) { - this.passwordEnabled = passwordEnabled; - } - - public String getServiceOfferingName() { - return serviceOfferingName; - } - - public void setServiceOfferingName(String serviceOfferingName) { - this.serviceOfferingName = serviceOfferingName; - } - - public Long getDiskOfferingId() { - return diskOfferingId; - } - - public void setDiskOfferingId(Long diskOfferingId) { - this.diskOfferingId = diskOfferingId; - } - - public String getDiskOfferingName() { - return diskOfferingName; - } - - public void setDiskOfferingName(String diskOfferingName) { - this.diskOfferingName = diskOfferingName; - } - - public String getCpuNumber() { - return cpuNumber; - } - - public void setCpuNumber(String cpuNumber) { - this.cpuNumber = cpuNumber; - } - - public String getCpuSpeed() { - return cpuSpeed; - } - - public void setCpuSpeed(String cpuSpeed) { - this.cpuSpeed = cpuSpeed; - } - - public String getMemory() { - return memory; - } - - public void setMemory(String memory) { - this.memory = memory; - } - - public String getStorage() { - return storage; - } - - public void setStorage(String stroage) { - this.storage = stroage; - } - - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - public String getGroup() { - return group; - } - - public void setGroup(String group) { - this.group = group; - } - - public Long getGroupId() { - return groupId; - } - - public void setGroupId(Long groupId) { - this.groupId = groupId; - } - - public Long getDomainId() { - return domainId; - } - - public void setDomainId(Long domainId) { - this.domainId = domainId; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public String getHostname() { - return hostname; - } - - public void setHostname(String hostname) { - this.hostname = hostname; - } - - public Long getHostid() { - return hostid; - } - - public void setHostid(Long hostid) { - this.hostid = hostid; - } - - public String getDomain() { - return domain; - } - - public void setDomain(String domain) { - this.domain = domain; - } -} diff --git a/server/src/com/cloud/async/executor/VmResultObject.java b/server/src/com/cloud/async/executor/VmResultObject.java deleted file mode 100644 index eaa32520e65..00000000000 --- a/server/src/com/cloud/async/executor/VmResultObject.java +++ /dev/null @@ -1,286 +0,0 @@ -package com.cloud.async.executor; - -import java.util.Date; - -import com.cloud.serializer.Param; - -public class VmResultObject -{ - - @Param(name="id") - private Long id; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } - - public long getDomainId() { - return domainId; - } - - public void setDomainId(long domainId) { - this.domainId = domainId; - } - - public String getDomain() { - return domain; - } - - public void setDomain(String domain) { - this.domain = domain; - } - - public boolean isHaEnable() { - return haEnable; - } - - public void setHaEnable(boolean haEnable) { - this.haEnable = haEnable; - } - - public long getZoneId() { - return zoneId; - } - - public void setZoneId(long zoneId) { - this.zoneId = zoneId; - } - - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - public String getZoneName() { - return zoneName; - } - - public void setZoneName(String zoneName) { - this.zoneName = zoneName; - } - - public Long getHostId() { - return hostId; - } - - public void setHostId(Long hostId) { - this.hostId = hostId; - } - - public String getHostName() { - return hostName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - - public long getTemplateId() { - return templateId; - } - - public void setTemplateId(long templateId) { - this.templateId = templateId; - } - - public String getTemplateName() { - return templateName; - } - - public void setTemplateName(String templateName) { - this.templateName = templateName; - } - - public String getTemplateDisplayText() { - return templateDisplayText; - } - - public void setTemplateDisplayText(String templateDisplayText) { - this.templateDisplayText = templateDisplayText; - } - - public boolean isPasswordEnabled() { - return passwordEnabled; - } - - public void setPasswordEnabled(boolean passwordEnabled) { - this.passwordEnabled = passwordEnabled; - } - - public long getServiceOfferingId() { - return serviceOfferingId; - } - - public void setServiceOfferingId(long serviceOfferingId) { - this.serviceOfferingId = serviceOfferingId; - } - - public String getServiceOfferingName() { - return serviceOfferingName; - } - - public void setServiceOfferingName(String serviceOfferingName) { - this.serviceOfferingName = serviceOfferingName; - } - - public long getCpuSpeed() { - return cpuSpeed; - } - - public void setCpuSpeed(long cpuSpeed) { - this.cpuSpeed = cpuSpeed; - } - - public long getMemory() { - return memory; - } - - public void setMemory(long memory) { - this.memory = memory; - } - - public long getCpuUsed() { - return cpuUsed; - } - - public void setCpuUsed(long cpuUsed) { - this.cpuUsed = cpuUsed; - } - - public long getNetworkKbsRead() { - return networkKbsRead; - } - - public void setNetworkKbsRead(long networkKbsRead) { - this.networkKbsRead = networkKbsRead; - } - - public long getNetworkKbsWrite() { - return networkKbsWrite; - } - - public void setNetworkKbsWrite(long networkKbsWrite) { - this.networkKbsWrite = networkKbsWrite; - } - - public Long getId() - { - return id; - } - - public void setId(Long id){ - this.id = id; - } - - @Param(name="name") - private String name; - - @Param(name="created") - private Date created; - - @Param(name="ipaddress") - private String ipAddress; - - @Param(name="state") - private String state; - - @Param(name="account") - private String account; - - @Param(name="domainid") - private long domainId; - - @Param(name="domain") - private String domain; - - @Param(name="haenable") - private boolean haEnable; - - @Param(name="zoneid") - private long zoneId; - - @Param(name="displayname") - private String displayName; - - @Param(name="zonename") - private String zoneName; - - @Param(name="hostid") - private Long hostId; - - @Param(name="hostname") - private String hostName; - - @Param(name="templateid") - private long templateId; - - @Param(name="templatename") - private String templateName; - - @Param(name="templatedisplaytext") - private String templateDisplayText; - - @Param(name="passwordenabled") - private boolean passwordEnabled; - - @Param(name="serviceofferingid") - private long serviceOfferingId; - - @Param(name="serviceofferingname") - private String serviceOfferingName; - - @Param(name="cpunumber") - private long cpuSpeed; - - @Param(name="memory") - private long memory; - - @Param(name="cpuused") - private long cpuUsed; - - @Param(name="networkkbsread") - private long networkKbsRead; - - @Param(name="networkkbswrite") - private long networkKbsWrite; - -} diff --git a/server/src/com/cloud/async/executor/VolumeOperationExecutor.java b/server/src/com/cloud/async/executor/VolumeOperationExecutor.java deleted file mode 100644 index 25cb50212a1..00000000000 --- a/server/src/com/cloud/async/executor/VolumeOperationExecutor.java +++ /dev/null @@ -1,164 +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.agent.api.Answer; -import com.cloud.api.BaseCmd; -import com.cloud.async.AsyncInstanceCreateStatus; -import com.cloud.async.AsyncJobManager; -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.google.gson.Gson; - - -public class VolumeOperationExecutor extends BaseAsyncJobExecutor { - public static final Logger s_logger = Logger.getLogger(VolumeOperationExecutor.class.getName()); - - public boolean execute() { - Gson gson = GsonHelper.getBuilder().create(); - AsyncJobManager asyncMgr = getAsyncJobMgr(); - AsyncJobVO job = getJob(); - /* - if (getSyncSource() == null) { - VolumeOperationParam param = gson.fromJson(job.getCmdInfo(), VolumeOperationParam.class); - asyncMgr.syncAsyncJobExecution(job.getId(), "Volume", param.getVolumeId()); - - // always true if it does not have sync-source - return true; - } else { - VolumeOperationParam param = gson.fromJson(job.getCmdInfo(), VolumeOperationParam.class); - boolean success = false; - String eventType = null; - String failureDescription = ""; - try { - 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(), param.getSize()); - 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(),param.getDeviceId(),param.getVmId()); - 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."); - } - - } catch (InternalErrorException e) { - asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); - } 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; - } -*/ - return true; - } - - public void processAnswer(VolumeOperationListener listener, long agentId, long seq, Answer answer) { - } - - public void processDisconnect(VolumeOperationListener listener, long agentId) { - } - - public void processTimeout(VolumeOperationListener listener, long agentId, long seq) { - } - - protected VolumeOperationResultObject composeResultObject(VolumeVO volume, VolumeOperationParam param) { - VolumeOperationResultObject resultObject = new VolumeOperationResultObject(); - Long diskOfferingId = null; - - diskOfferingId = volume.getDiskOfferingId(); - - resultObject.setId(volume.getId()); - resultObject.setName(param.getName()); - resultObject.setVolumeType(volume.getVolumeType()); - resultObject.setVolumeSize(volume.getSize()); - resultObject.setCreatedDate(volume.getCreated()); - resultObject.setState(volume.getStatus()); - resultObject.setAccountName(getAsyncJobMgr().getExecutorContext().getManagementServer().findAccountById(param.getAccountId()).getAccountName()); - resultObject.setDomainId(volume.getDomainId()); - resultObject.setDiskOfferingId(volume.getDiskOfferingId()); - - if (diskOfferingId != null) { - resultObject.setDiskOfferingName(getAsyncJobMgr().getExecutorContext().getManagementServer().findDiskOfferingById(diskOfferingId).getName()); - resultObject.setDiskOfferingDisplayText(getAsyncJobMgr().getExecutorContext().getManagementServer().findDiskOfferingById(diskOfferingId).getDisplayText()); - } -// resultObject.setDomain(getAsyncJobMgr().getExecutorContext().getManagementServer().findDomainIdById(volume.getDomainId()).getName()); - resultObject.setStorageType("shared"); // NOTE: You can never create a local disk volume but if that changes, we need to change this - if (volume.getPoolId() != null) - resultObject.setStorage(getAsyncJobMgr().getExecutorContext().getManagementServer().findPoolById(volume.getPoolId()).getName()); - resultObject.setZoneId(volume.getDataCenterId()); -// resultObject.setZoneName(getAsyncJobMgr().getExecutorContext().getManagementServer().getDataCenterBy(volume.getDataCenterId()).getName()); - return resultObject; - } - - private AttachVolumeOperationResultObject composeAttachResultObject(UserVm instance, VolumeVO vol) { - AttachVolumeOperationResultObject resultObject = new AttachVolumeOperationResultObject(); - - resultObject.setVmName(instance.getName()); - resultObject.setVmDisplayName(instance.getDisplayName()); - resultObject.setVirtualMachineId(instance.getId()); - resultObject.setVmState(instance.getState().toString()); - resultObject.setStorageType("shared"); // NOTE: You can never attach a local disk volume but if that changes, we need to change this - resultObject.setVolumeId(vol.getId()); - resultObject.setVolumeName(vol.getName()); - - return resultObject; - } -} diff --git a/server/src/com/cloud/async/executor/VolumeOperationListener.java b/server/src/com/cloud/async/executor/VolumeOperationListener.java deleted file mode 100644 index 0ef17af29de..00000000000 --- a/server/src/com/cloud/async/executor/VolumeOperationListener.java +++ /dev/null @@ -1,128 +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.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.host.HostVO; -import com.cloud.host.Status; -import com.cloud.storage.VolumeVO; -import com.cloud.vm.UserVmVO; - -public class VolumeOperationListener implements Listener { - private static final Logger s_logger = Logger.getLogger(VolumeOperationListener.class); - - private final VolumeOperationExecutor _executor; - private final VolumeOperationParam _param; - private final UserVmVO _vm; - private final VolumeVO _volume; - private int _cookie; - - public VolumeOperationListener(VolumeOperationExecutor executor, VolumeOperationParam param, UserVmVO vm, VolumeVO volume, int cookie) { - - if(s_logger.isDebugEnabled()) - s_logger.debug("VM operation listener is created"); - - _executor = executor; - _param = param; - _vm = vm; - _volume = volume; - _cookie = cookie; - } - - @Override - public boolean processAnswers(long agentId, long seq, Answer[] answers) { - Answer answer = null; - if(answers != null) - answer = answers[0]; - - if(s_logger.isDebugEnabled()) - s_logger.debug("Process command answer for " + agentId + "-" + seq + " " + answer); - - _executor.processAnswer(this, agentId, seq, answer); - return true; - } - - @Override - public boolean processCommands(long agentId, long seq, Command[] commands) { - return true; - } - - @Override - public AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd) { - return null; - } - - @Override - public void processConnect(HostVO agent, StartupCommand cmd) { - } - - @Override - public boolean processDisconnect(long agentId, Status state) { - if(_vm.getHostId() == agentId) - _executor.processDisconnect(this, agentId); - return true; - } - - @Override - public boolean isRecurring() { - return false; - } - - @Override - public int getTimeout() { - // TODO : no time out support for now as underlying support does not work as expected - return -1; - } - - @Override - public boolean processTimeout(long agentId, long seq) { - if(s_logger.isDebugEnabled()) - s_logger.debug("Process time out for " + agentId + "-" + seq); - - _executor.processTimeout(this, agentId, seq); - return true; - } - - public int getCookie() { - return _cookie; - } - - public void setCookie(int cookie) { - _cookie = cookie; - } - - public VolumeOperationExecutor getExecutor() { - return _executor; - } - - public VolumeOperationParam getParam() { - return _param; - } - - public UserVmVO getVm() { - return _vm; - } -} diff --git a/server/src/com/cloud/async/executor/VolumeOperationParam.java b/server/src/com/cloud/async/executor/VolumeOperationParam.java deleted file mode 100644 index b59ddd51f2f..00000000000 --- a/server/src/com/cloud/async/executor/VolumeOperationParam.java +++ /dev/null @@ -1,135 +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; - -public class VolumeOperationParam { - - public enum VolumeOp { Create, Attach, Detach;} - - // Used for all VolumeOps - private VolumeOp op; - private long accountId; - private long userId; - - // Used for Create - private long zoneId; - private String name; - private long diskOfferingId; - private long size; - - // Used for Attach and Detach - private long vmId; - - - // Used for Attach, Detach, and Delete - private long volumeId; - private long eventId; - private Long deviceId; - - public VolumeOperationParam() { - } - - public VolumeOp getOp() { - return op; - } - - public void setOp(VolumeOp op) { - this.op = op; - } - - public long getAccountId() { - return accountId; - } - - public void setAccountId(long accountId) { - this.accountId = accountId; - } - - public long getUserId() { - return userId; - } - - public void setUserId(long userId) { - this.userId = userId; - } - - public long getZoneId() { - return zoneId; - } - - public void setZoneId(long zoneId) { - this.zoneId = zoneId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public long getDiskOfferingId() { - return diskOfferingId; - } - - public void setDiskOfferingId(long diskOfferingId) { - this.diskOfferingId = diskOfferingId; - } - - public long getVolumeId() { - return volumeId; - } - - public void setVolumeId(long volumeId) { - this.volumeId = volumeId; - } - - public long getVmId() { - return vmId; - } - - public void setVmId(long vmId) { - this.vmId = vmId; - } - - public void setEventId(long eventId) { - this.eventId = eventId; - } - - public long getEventId() { - return eventId; - } - - public void setDeviceId(Long deviceId) { - this.deviceId = deviceId; - } - - public Long getDeviceId() { - return deviceId; - } - - public long getSize(){ - return size; - } - - public void setSize(long size){ - this.size = size; - } -} diff --git a/server/src/com/cloud/async/executor/VolumeOperationResultObject.java b/server/src/com/cloud/async/executor/VolumeOperationResultObject.java deleted file mode 100644 index e19b7597f69..00000000000 --- a/server/src/com/cloud/async/executor/VolumeOperationResultObject.java +++ /dev/null @@ -1,344 +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 java.util.Date; - -import com.cloud.async.AsyncInstanceCreateStatus; -import com.cloud.serializer.Param; -import com.cloud.storage.Volume.VolumeType; - -public class VolumeOperationResultObject { - @Param(name="id") - private long id; - - @Param(name="name") - private String name; - - @Param(name="hostname") - private String hostName; - - // @Param(name="host_id") - // private Long hostId; - - // @Param(name="pool_id") - // private Long poolId; - - //@Param(name="accountid") - //long accountId; - - @Param(name="account") - private String accountName; - - @Param(name="domainid") - long domainId; - - @Param(name="domain") - String domain; - - @Param(name="iscsiname") - String iscsiName; - - // @Param(name="pod_id") - // Long podId; - - @Param(name="destroyed") - boolean destroyed; - - // @Param(name="created") - // Date created; - - // @Param(name="host_ip") - // String hostip; - - @Param(name="diskofferingid") - Long diskOfferingId; - - @Param(name="diskofferingname") - String diskOfferingName; - - @Param(name="diskofferingdisplaytext") - String diskOfferingDisplayText; - - // @Param(name="mirror_vol") - // Long mirrorVolume; - - // @Param(name="template_name") - // String templateName; - - // @Param(name="device_name") - // String deviceName; - - @Param(name="type") - VolumeType volumeType; - - @Param(name="size") - private long volumeSize; - - // @Param(name="removed") - // Date removed; - - @Param(name="vmstate") - private String instanceState; - - @Param(name="created") - private Date createdDate; - - @Param(name="state") - private AsyncInstanceCreateStatus state; - - @Param(name="storagetype") - String storageType; - - @Param(name="storage") - private String storage; - - @Param(name="zoneid") - private Long zoneId; - - 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; - } - - @Param(name="zonename") - private String zoneName; - - public String getStorage() { - return storage; - } - - public void setStorage(String storage) { - this.storage = storage; - } - - public void setId(long id) { - this.id = id; - } - - public long getId() { - return id; - } - - public void setName(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - - public String getHostName() { - return hostName; - } - - public void setAccountName(String accountName) { - this.accountName = accountName; - } - - public String getAccountName() { - return accountName; - } - - public void setDomainId(long domainId) { - this.domainId = domainId; - } - - public long getDomainId() { - return domainId; - } - - public void setDomain(String domain) { - this.domain = domain; - } - - public String getDomain() { - return domain; - } - - /* - public void setSize(long size) { - this.size = size; - } - */ - - /* - public void setFolder(String folder) { - this.folder = folder; - } - */ - - /* - public void setPath(String path) { - this.path = path; - } - */ - - public void setIscsiName(String iscsiName) { - this.iscsiName = iscsiName; - } - - public String getIscsiName() { - return iscsiName; - } - - /* - public void setPodId(Long podId) { - this.podId = podId; - } - */ - - public void setDestroyed(boolean destroyed) { - this.destroyed = destroyed; - } - - public boolean getDestroyed() { - return destroyed; - } - - /* - public void setCreated(Date created) { - this.created = created; - } - */ - - /* - public void setHostIp(String hostIp) { - this.hostip = hostIp; - } - */ - - public void setDiskOfferingId(Long diskOfferingId) { - this.diskOfferingId = diskOfferingId; - } - - public Long getDiskOfferingId() { - return diskOfferingId; - } - - public void setDiskOfferingName(String diskOfferingName) { - this.diskOfferingName = diskOfferingName; - } - - public String getDiskOfferingDisplayText() { - return diskOfferingDisplayText; - } - - public void setDiskOfferingDisplayText(String diskOfferingDisplayText) { - this.diskOfferingDisplayText = diskOfferingDisplayText; - } - - public String getDiskOfferingName() { - return diskOfferingName; - } - - - /* - public void setMirrorVolume(long mirrorVolume) { - this.mirrorVolume = mirrorVolume; - } - */ - - /* - public long getMirrorVolume() { - return mirrorVolume; - } - */ - - /* - public void setTemplateName(String templateName) { - this.templateName = templateName; - } - */ - - /* - public void setDeviceName(String deviceName) { - this.deviceName = deviceName; - } - */ - - public void setVolumeType(VolumeType volumeType) { - this.volumeType = volumeType; - } - - public VolumeType getVolumeType() { - return volumeType; - } - - public void setVolumeSize(long volumeSize) { - this.volumeSize = volumeSize; - } - - public long getVolumeSize() { - return volumeSize; - } - - /* - public void setRemoved(Date removed) { - this.removed = removed; - } - */ - - public void setCreatedDate(Date createdDate) { - this.createdDate = createdDate; - } - - public Date getCreatedDate() { - return createdDate; - } - - public void setState(AsyncInstanceCreateStatus status) { - this.state = status; - } - - public AsyncInstanceCreateStatus getState() { - return state; - } - - public void setStorageType (String storageType) { - this.storageType = storageType; - } - - public String getStorageType() { - return storageType; - } - - public void setInstanceState(String state) { - this.instanceState = state; - } - - public String getInstanceState() { - return instanceState; - } -} diff --git a/server/src/com/cloud/capacity/dao/CapacityDao.java b/server/src/com/cloud/capacity/dao/CapacityDao.java old mode 100644 new mode 100755 index 9d26287abce..7401ced3b7a --- a/server/src/com/cloud/capacity/dao/CapacityDao.java +++ b/server/src/com/cloud/capacity/dao/CapacityDao.java @@ -18,14 +18,16 @@ package com.cloud.capacity.dao; +import java.util.List; + import com.cloud.capacity.CapacityVO; import com.cloud.utils.db.GenericDao; -import com.cloud.vm.VMInstanceVO; public interface CapacityDao extends GenericDao { void clearNonStorageCapacities(); void clearStorageCapacities(); CapacityVO findByHostIdType(Long hostId, short capacityType); void clearNonStorageCapacities2(); + List findByHostorPoolId(Long hostorPoolId); } diff --git a/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java b/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java old mode 100644 new mode 100755 index 6a23621a2de..fda470afc5c --- a/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java +++ b/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java @@ -25,13 +25,10 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import com.cloud.capacity.CapacityVO; -import com.cloud.service.ServiceOfferingVO; -import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; -import com.cloud.vm.VMInstanceVO; @Local(value = { CapacityDao.class }) public class CapacityDaoImpl extends GenericDaoBase implements CapacityDao { @@ -43,12 +40,17 @@ public class CapacityDaoImpl extends GenericDaoBase implements private static final String CLEAR_NON_STORAGE_CAPACITIES = "DELETE FROM `cloud`.`op_host_capacity` WHERE capacity_type<>2 AND capacity_type<>3 AND capacity_type<>6"; //clear non-storage and non-secondary_storage capacities private static final String CLEAR_NON_STORAGE_CAPACITIES2 = "DELETE FROM `cloud`.`op_host_capacity` WHERE capacity_type<>2 AND capacity_type<>3 AND capacity_type<>6 AND capacity_type<>0 AND capacity_type<>1"; //clear non-storage and non-secondary_storage capacities private SearchBuilder _hostIdTypeSearch; + private SearchBuilder _hostOrPoolIdSearch; public CapacityDaoImpl() { _hostIdTypeSearch = createSearchBuilder(); _hostIdTypeSearch.and("hostId", _hostIdTypeSearch.entity().getHostOrPoolId(), SearchCriteria.Op.EQ); _hostIdTypeSearch.and("type", _hostIdTypeSearch.entity().getCapacityType(), SearchCriteria.Op.EQ); _hostIdTypeSearch.done(); + + _hostOrPoolIdSearch = createSearchBuilder(); + _hostOrPoolIdSearch.and("hostId", _hostOrPoolIdSearch.entity().getHostOrPoolId(), SearchCriteria.Op.EQ); + _hostOrPoolIdSearch.done(); } public void updateAllocated(Long hostId, long allocatedAmount, short capacityType, boolean add) { @@ -129,5 +131,12 @@ public class CapacityDaoImpl extends GenericDaoBase implements sc.setParameters("hostId", hostId); sc.setParameters("type", capacityType); return findOneBy(sc); + } + + @Override + public java.util.List findByHostorPoolId(Long hostorPoolId){ + SearchCriteria sc = _hostOrPoolIdSearch.create(); + sc.setParameters("hostId", hostorPoolId); + return listBy(sc); } } diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index dc32b45da9f..f0f275d2624 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -56,11 +56,12 @@ public enum Config { 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"), GuestVlanBits("Network", ManagementServer.class, Integer.class, "guest.vlan.bits", "12", "The number of bits to reserve for the VLAN identifier in the guest subnet.", null), - MulticastThrottlingRate("Network", ManagementServer.class, Integer.class, "multicast.throttling.rate", "10", "Default multicast rate in megabits per second allowed.", null), + //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), GuestDomainSuffix("Network", AgentManager.class, String.class, "guest.domain.suffix", "cloud.internal", "Default domain name for vms inside virtualized networks fronted by router", null), DirectNetworkNoDefaultRoute("Network", ManagementServer.class, Boolean.class, "direct.network.no.default.route", "false", "Direct Network Dhcp Server should not send a default route", "true/false"), - OvsNetwork("Network", ManagementServer.class, Boolean.class, "open.vswitch.network", "false", "enable/disable open vswitch network", null), + OvsNetwork("Network", ManagementServer.class, Boolean.class, "open.vswitch.vlan.network", "false", "enable/disable vlan remapping of open vswitch network", null), + OvsTunnelNetwork("Network", ManagementServer.class, Boolean.class, "open.vswitch.tunnel.network", "false", "enable/disable open vswitch tunnel network(no vlan)", null), //VPN RemoteAccessVpnPskLength("Network", AgentManager.class, Integer.class, "remote.access.vpn.psk.length", "24", "The length of the ipsec preshared key (minimum 8, maximum 256)", null), @@ -72,8 +73,6 @@ public enum Config { // Usage CapacityCheckPeriod("Usage", ManagementServer.class, Integer.class, "capacity.check.period", "300000", "The interval in milliseconds between capacity checks", null), - CapacitySkipCountingHours("Usage", ManagementServer.class, Integer.class, "capacity.skipcounting.hours", "24", "The interval in hours since VM has stopped to skip counting its allocated CPU/Memory capacity. Applies to vms in Stopped state", null), - CapacitySkipCountingDestroyedHours("Usage", ManagementServer.class, Integer.class, "capacity.skipcounting.destroyed.hours", "0", "The interval in hours since VM has stopped to skip counting its allocated CPU/Memory capacity. Applies to vms in Destroyed state", null), StorageAllocatedCapacityThreshold("Usage", ManagementServer.class, Float.class, "storage.allocated.capacity.threshold", "0.85", "Percentage (as a value between 0 and 1) of allocated storage utilization above which alerts will be sent about low storage available.", null), StorageCapacityThreshold("Usage", ManagementServer.class, Float.class, "storage.capacity.threshold", "0.85", "Percentage (as a value between 0 and 1) of storage utilization above which alerts will be sent about low storage available.", null), CPUCapacityThreshold("Usage", ManagementServer.class, Float.class, "cpu.capacity.threshold", "0.85", "Percentage (as a value between 0 and 1) of cpu utilization above which alerts will be sent about low cpu available.", null), @@ -161,7 +160,6 @@ public enum Config { DirectAttachNetworkEnabled("Advanced", ManagementServer.class, Boolean.class, "direct.attach.network.externalIpAllocator.enabled", "false", "Direct-attach VMs using external DHCP server", "true,false"), DirectAttachNetworkExternalAPIURL("Advanced", ManagementServer.class, String.class, "direct.attach.network.externalIpAllocator.url", null, "Direct-attach VMs using external DHCP server (API url)", null), CheckPodCIDRs("Advanced", ManagementServer.class, String.class, "check.pod.cidrs", "true", "If true, different pods must belong to different CIDR subnets.", "true,false"), - MD5Hashed("Advanced", ManagementServer.class, Boolean.class, "security.password.md5hashed", "true", "If set to false password is sent in clear text or else md5hashed", null), NetworkGcWait("Advanced", ManagementServer.class, Integer.class, "network.gc.wait", "600", "Seconds to wait before shutting down a network that's not in used", null), NetworkGcInterval("Advanced", ManagementServer.class, Integer.class, "network.gc.interval", "600", "Seconds to wait before checking for networks to shutdown", null), HostCapacityCheckerWait("Advanced", ManagementServer.class, Integer.class, "host.capacity.checker.wait", "3600", "Seconds to wait before starting host capacity background checker", null), diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java index a9163cbeb63..60c3d95cdcc 100644 --- a/server/src/com/cloud/configuration/ConfigurationManager.java +++ b/server/src/com/cloud/configuration/ConfigurationManager.java @@ -19,16 +19,17 @@ package com.cloud.configuration; import java.util.List; +import com.cloud.dc.ClusterVO; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.Vlan; import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Networks.TrafficType; import com.cloud.offering.DiskOffering; import com.cloud.offering.NetworkOffering.Availability; @@ -43,7 +44,7 @@ import com.cloud.utils.component.Manager; * ConfigurationManager handles adding pods/zones, changing IP ranges, enabling external firewalls, and editing configuration values * */ -public interface ConfigurationManager extends Manager { +public interface ConfigurationManager extends ConfigurationService, Manager { /** * Updates a configuration entry with a new value @@ -111,17 +112,6 @@ public interface ConfigurationManager extends Manager { * @throws */ DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1, String internalDns2, String vnetRange, String guestCidr, String domain, Long domainId, NetworkType zoneType); - - /** - * Associates an ip address list to an account. The list of ip addresses are all addresses associated with the given vlan id. - * @param userId - * @param accountId - * @param zoneId - * @param vlanId - * @throws InsufficientAddressCapacityException - * @throws - */ - public void associateIpAddressListToAccount(long userId, long accountId, long zoneId, Long vlanId) throws InsufficientAddressCapacityException, ConcurrentOperationException; /** * Deletes a VLAN from the database, along with all of its IP addresses. Will not delete VLANs that have allocated IP addresses. @@ -180,11 +170,15 @@ public interface ConfigurationManager extends Manager { */ NetworkOfferingVO createNetworkOffering(long userId, String name, String displayText, TrafficType trafficType, String tags, Integer maxConnections, boolean specifyVlan, Availability availability); - Vlan createVlanAndPublicIpRange(Long userId, Long zoneId, Long podId, String startIP, String endIP, String vlanGateway, String vlanNetmask, boolean forVirtualNetwork, String vlanId, Account account, Long networkId) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException; + Vlan createVlanAndPublicIpRange(Long userId, Long zoneId, Long podId, String startIP, String endIP, String vlanGateway, String vlanNetmask, boolean forVirtualNetwork, String vlanId, Account account, Long networkId) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException, ResourceUnavailableException; void createDefaultNetworks(long zoneId) throws ConcurrentOperationException; - Long saveConfigurationEvent(long userId, Long accountId, String type, String description, String... paramsList); - DataCenterVO getZone(long id); + + HostPodVO getPod(long id); + + ClusterVO getCluster(long id); + + boolean deleteAccountSpecificVirtualRanges(long accountId); } diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index b666a28da25..d65ede3d2d7 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -21,13 +21,11 @@ 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.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.Vector; import javax.ejb.Local; import javax.naming.ConfigurationException; @@ -60,6 +58,7 @@ import com.cloud.api.commands.UpdateZoneCmd; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.AccountVlanMapVO; +import com.cloud.dc.ClusterVO; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterIpAddressVO; @@ -71,6 +70,7 @@ import com.cloud.dc.Vlan; import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.VlanVO; import com.cloud.dc.dao.AccountVlanMapDao; +import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterIpAddressDao; import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDaoImpl; @@ -80,17 +80,13 @@ import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DataCenterDeployment; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; -import com.cloud.event.EventTypes; -import com.cloud.event.EventUtils; -import com.cloud.event.EventVO; import com.cloud.event.dao.EventDao; import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.network.IPAddressVO; import com.cloud.network.Network; import com.cloud.network.Network.GuestIpType; import com.cloud.network.NetworkManager; @@ -115,7 +111,6 @@ import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.UserContext; -import com.cloud.user.UserVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.utils.NumbersUtil; @@ -127,14 +122,8 @@ import com.cloud.utils.db.Filter; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.net.Ip; import com.cloud.utils.net.NetUtils; -import com.cloud.vm.ConsoleProxyVO; -import com.cloud.vm.DomainRouterVO; -import com.cloud.vm.SecondaryStorageVmVO; import com.cloud.vm.VMInstanceVO; -import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.SecondaryStorageVmDao; @@ -167,6 +156,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura @Inject SecondaryStorageVmDao _secStorageDao; @Inject AccountManager _accountMgr; @Inject NetworkManager _networkMgr; + @Inject ClusterDao _clusterDao; @Inject(adapter=SecurityChecker.class) Adapters _secChecker; @@ -242,7 +232,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new CloudRuntimeException("Failed to update configuration value. Please contact Cloud Support."); } - saveConfigurationEvent(userId, null, EventTypes.EVENT_CONFIGURATION_VALUE_EDIT, "Successfully edited configuration value.", "name=" + name, "value=" + value); } @Override @@ -496,11 +485,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura @DB public boolean deletePod(DeletePodCmd cmd) { Long podId = cmd.getId(); - Long userId = 1L; - - if (UserContext.current() != null) { - userId = UserContext.current().getCallerUserId(); - } // Make sure the pod exists if (!validPod(podId)) { @@ -510,7 +494,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura checkIfPodIsDeletable(podId); HostPodVO pod = _podDao.findById(podId); - DataCenterVO zone = _zoneDao.findById(pod.getDataCenterId()); //Delete private ip addresses for the pod if there are any List privateIps = _privateIpAddressDao.listByPodIdDcId(Long.valueOf(podId), pod.getDataCenterId()); @@ -538,7 +521,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new CloudRuntimeException("Failed to delete pod " + podId); } - saveConfigurationEvent(userId, null, EventTypes.EVENT_POD_DELETE, "Successfully deleted pod with name: " + pod.getName() + " in zone: " + zone.getName() + ".", "podId=" + podId, "dcId=" + zone.getId()); return true; } @@ -554,7 +536,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura String cidr = null; Long id = cmd.getId(); String name = cmd.getPodName(); - Long userId = UserContext.current().getCallerUserId(); //verify parameters HostPodVO pod = _podDao.findById(id);; @@ -658,8 +639,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new CloudRuntimeException("Failed to edit pod. Please contact Cloud Support."); } - saveConfigurationEvent(userId, null, EventTypes.EVENT_POD_EDIT, "Successfully edited pod. New pod name is: " + name + " and new zone name is: " + zone.getName() + ".", "podId=" + pod.getId(), "dcId=" + zone.getId(), "gateway=" + gateway, "cidr=" + cidr, "startIp=" + startIp, "endIp=" + endIp); - return pod; } @@ -742,9 +721,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new CloudRuntimeException("Failed to create new pod. Please contact Cloud Support."); } - DataCenterVO zone = _zoneDao.findById(zoneId); - saveConfigurationEvent(userId, null, EventTypes.EVENT_POD_CREATE, "Successfully created new pod with name: " + podName + " in zone: " + zone.getName() + ".", "podId=" + pod.getId(), "zoneId=" + zone.getId(), "gateway=" + gateway, "cidr=" + cidr, "startIp=" + startIp, "endIp=" + endIp); - return pod; } @@ -922,8 +898,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura checkIfZoneIsDeletable(zoneId); - DataCenterVO zone = _zoneDao.findById(zoneId); - boolean success = _zoneDao.expunge(zoneId); try { @@ -949,7 +923,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } if (success){ - saveConfigurationEvent(userId, null, EventTypes.EVENT_ZONE_DELETE, "Successfully deleted zone with name: " + zone.getName() + ".", "dcId=" + zoneId); return true; } else{ return false; @@ -1094,48 +1067,9 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } if(dnsUpdate){ - - //Update dns for domRs in zone - - List DomainRouters = _domrDao.listByDataCenter(zoneId); - - for(DomainRouterVO domR : DomainRouters) - { - domR.setDns1(dns1); - domR.setDns2(dns2); - _domrDao.update(domR.getId(), domR); - } - - //Update dns for console proxies in zone - List ConsoleProxies = _vmInstanceDao.listByZoneIdAndType(zoneId, VirtualMachine.Type.ConsoleProxy); - - for(VMInstanceVO consoleVm : ConsoleProxies) - { - ConsoleProxyVO proxy = _consoleDao.findById(consoleVm.getId()); - if( proxy!= null ){ - proxy.setDns1(dns1); - proxy.setDns2(dns2); - _consoleDao.update(proxy.getId(), proxy); - } - } - - //Update dns for secondary storage Vms in zone - List storageVms = _vmInstanceDao.listByZoneIdAndType(zoneId, VirtualMachine.Type.SecondaryStorageVm); - - for(VMInstanceVO storageVm : storageVms) - { - SecondaryStorageVmVO secStorageVm = _secStorageDao.findById(storageVm.getId()); - if( secStorageVm!= null ){ - secStorageVm.setDns1(dns1); - secStorageVm.setDns2(dns2); - _secStorageDao.update(secStorageVm.getId(), secStorageVm); - } - } - + // FIXME: Need to update dns in network rather than in the vms. } - saveConfigurationEvent(userId, null, EventTypes.EVENT_ZONE_EDIT, "Successfully edited zone with name: " + zone.getName() + ".", "dcId=" + zone.getId(), "dns1=" + dns1, "dns2=" + dns2, "internalDns1=" + internalDns1, "internalDns2=" + internalDns2, "vnetRange=" + vnetRange, "guestCidr=" + guestCidr); - return zone; } @@ -1185,12 +1119,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura //Create deafult networks createDefaultNetworks(zone.getId()); - if (vnetRange != null) { - saveConfigurationEvent(userId, null, EventTypes.EVENT_ZONE_CREATE, "Successfully created new zone with name: " + zoneName + ".", "dcId=" + zone.getId(), "dns1=" + dns1, "dns2=" + dns2, "internalDns1=" + internalDns1, "internalDns2=" + internalDns2, "vnetRange=" + vnetRange, "guestCidr=" + guestCidr); - } else { - saveConfigurationEvent(userId, null, EventTypes.EVENT_ZONE_CREATE, "Successfully created new zone with name: " + zoneName + ".", "dcId=" + zone.getId(), "dns1=" + dns1, "dns2=" + dns2, "internalDns1=" + internalDns1, "internalDns2=" + internalDns2, "guestCidr=" + guestCidr); - } - txn.commit(); return zone; } catch (Exception ex) { @@ -1368,8 +1296,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura ServiceOfferingVO offering = new ServiceOfferingVO(name, cpu, ramSize, speed, networkRate, multicastRate, offerHA, displayText, guestIpType, localStorageRequired, false, tags, false,domainId); if ((offering = _serviceOfferingDao.persist(offering)) != null) { - saveConfigurationEvent(userId, null, EventTypes.EVENT_SERVICE_OFFERING_CREATE, "Successfully created new service offering with name: " + name + ".", "soId=" + offering.getId(), "name=" + name, "numCPUs=" + cpu, "ram=" + ramSize, "cpuSpeed=" + speed, - "displayText=" + displayText, "guestIPType=" + guestIpType, "localStorageRequired=" + localStorageRequired, "offerHA=" + offerHA, "useVirtualNetwork=" + useVirtualNetwork, "tags=" + tags); return offering; } else { return null; @@ -1444,8 +1370,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (_serviceOfferingDao.update(id, offering)) { offering = _serviceOfferingDao.findById(id); - saveConfigurationEvent(userId, null, EventTypes.EVENT_SERVICE_OFFERING_EDIT, "Successfully updated service offering with name: " + offering.getName() + ".", "soId=" + offering.getId(), "name=" + offering.getName(), - "displayText=" + offering.getDisplayText(), "offerHA=" + offering.getOfferHA(), "useVirtualNetwork=" + (offering.getGuestIpType() == Network.GuestIpType.Virtual), "tags=" + offering.getTags(), "domainId=" + offering.getDomainId()); return offering; } else { return null; @@ -1548,8 +1472,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura // } if (_diskOfferingDao.update(diskOfferingId, diskOffering)) { - saveConfigurationEvent(UserContext.current().getCallerUserId(), null, EventTypes.EVENT_DISK_OFFERING_EDIT, "Successfully updated disk offering with name: " + diskOffering.getName() + ".", "doId=" + diskOffering.getId(), "name=" + diskOffering.getName(), - "displayText=" + diskOffering.getDisplayText(), "diskSize=" + diskOffering.getDiskSize(),"tags=" + diskOffering.getTags(),"domainId="+cmd.getDomainId()); return _diskOfferingDao.findById(diskOfferingId); } else { return null; @@ -1592,8 +1514,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } if (_serviceOfferingDao.remove(offeringId)) { - saveConfigurationEvent(userId, null, EventTypes.EVENT_SERVICE_OFFERING_EDIT, "Successfully deleted service offering with name: " + offering.getName(), "soId=" + offeringId, "name=" + offering.getName(), - "displayText=" + offering.getDisplayText(), "offerHA=" + offering.getOfferHA(), "useVirtualNetwork=" + (offering.getGuestIpType() == GuestIpType.Virtual)); return true; } else { return false; @@ -1620,7 +1540,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } @Override - public Vlan createVlanAndPublicIpRange(CreateVlanIpRangeCmd cmd) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException { + public Vlan createVlanAndPublicIpRange(CreateVlanIpRangeCmd cmd) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException, ResourceUnavailableException { Long zoneId = cmd.getZoneId(); Long podId = cmd.getPodId(); String startIP = cmd.getStartIp(); @@ -1724,7 +1644,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura @Override - public Vlan createVlanAndPublicIpRange(Long userId, Long zoneId, Long podId, String startIP, String endIP, String vlanGateway, String vlanNetmask, boolean forVirtualNetwork, String vlanId, Account account, Long networkId) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException{ + public Vlan createVlanAndPublicIpRange(Long userId, Long zoneId, Long podId, String startIP, String endIP, String vlanGateway, String vlanNetmask, boolean forVirtualNetwork, String vlanId, Account account, Long networkId) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException, ResourceUnavailableException{ // Check that the pod ID is valid if (podId != null && ((_podDao.findById(podId)) == null)) { @@ -1771,20 +1691,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new CloudRuntimeException("For adding an untagged IP range, please set up xen.public.network.device"); } } - } - //if we have an ip range for vlan id=x, vlantype=y; we should - //only allow adding another range with id=x for same type y - if (!vlanId.equals(Vlan.UNTAGGED)) { - VlanVO vlanHandle = _vlanDao.findByZoneAndVlanId(zoneId, vlanId); - - if (vlanHandle!=null && !vlanHandle.getVlanType().equals(vlanType)) { - throw new InvalidParameterValueException("This vlan id is already associated with the vlan type "+vlanHandle.getVlanType().toString() - +",whilst you are trying to associate it with vlan type "+vlanType.toString()); - } - } - //ACL check checkAccess(account, zone); @@ -1803,11 +1711,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura associateIpRangeToAccount = true; } } else if (vlanType.equals(VlanType.DirectAttached)) { -// if (!((account != null && podId == null) || -// (account == null && podId != null))) { -// throw new InvalidParameterValueException("Direct Attached IP ranges must either be pod-wide, or for one account."); -// } - if (account != null) { // VLANs for an account must be tagged if (vlanId.equals(Vlan.UNTAGGED)) { @@ -1827,7 +1730,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new InvalidParameterValueException("Direct Attached IP ranges for a pod must be untagged."); } - // Make sure there aren't any account VLANs in this zone List accountVlanMaps = _accountVlanMapDao.listAllIncludingRemoved(); for (AccountVlanMapVO accountVlanMap : accountVlanMaps) { @@ -1934,14 +1836,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura VlanVO vlan = new VlanVO(vlanType, vlanId, vlanGateway, vlanNetmask, zone.getId(), ipRange, networkId); vlan = _vlanDao.persist(vlan); - // Persist the IP range - if (account != null && vlanType.equals(VlanType.VirtualNetwork)){ - if(!savePublicIPRangeForAccount(startIP, endIP, zoneId, vlan.getId(), account.getId(), account.getDomainId())) { - deletePublicIPRange(vlan.getId()); - _vlanDao.expunge(vlan.getId()); - throw new CloudRuntimeException("Failed to save IP range. Please contact Cloud Support."); //It can be Direct IP or Public IP. - } - }else if (!savePublicIPRange(startIP, endIP, zoneId, vlan.getId())) { + if (!savePublicIPRange(startIP, endIP, zoneId, vlan.getId())) { deletePublicIPRange(vlan.getId()); _vlanDao.expunge(vlan.getId()); throw new CloudRuntimeException("Failed to save IP range. Please contact Cloud Support."); //It can be Direct IP or Public IP. @@ -1962,96 +1857,15 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura eventMsg += ", end IP = " + endIP; } eventMsg += "."; - Long accountId = ((account == null) ? Account.ACCOUNT_ID_SYSTEM : account.getId()); - saveConfigurationEvent(userId, accountId, EventTypes.EVENT_VLAN_IP_RANGE_CREATE, eventMsg, "vlanType=" + vlanType, "dcId=" + zoneId, - "accountId=" + accountId, "podId=" + podId, - "vlanId=" + vlanId, "vlanGateway=" + vlanGateway, - "vlanNetmask=" + vlanNetmask, "startIP=" + startIP, - "endIP=" + endIP); - if (associateIpRangeToAccount) { // if this is an account VLAN, now associate the IP Addresses to the account - associateIpAddressListToAccount(userId, account.getId(), zoneId, vlan.getId()); + long ipCount = _publicIpAddressDao.countIPs(zoneId, vlan.getId(), false); + _accountMgr.incrementResourceCount(account.getId(), ResourceType.public_ip, ipCount); + s_logger.trace("Updated " + ResourceType.public_ip + " resource count on " + ipCount + " for account " + account); + _networkMgr.associateIpAddressListToAccount(userId, account.getId(), zoneId, vlan.getId()); } return vlan; } - - @Override @DB - public void associateIpAddressListToAccount(long userId, long accountId, long zoneId, Long vlanId) throws InsufficientAddressCapacityException, - ConcurrentOperationException { - - Transaction txn = Transaction.currentTxn(); - AccountVO account = null; - - try { - //Acquire Lock - account = _accountDao.acquireInLockTable(accountId); - if (account == null) { - s_logger.warn("Unable to lock account: " + accountId); - throw new ConcurrentOperationException("Unable to acquire account lock"); - } - s_logger.debug("Associate IP address lock acquired"); - - //Get Router - DomainRouterVO router = _domrDao.findBy(accountId, zoneId); - if (router == null) { - s_logger.debug("No router found for account: " + account.getAccountName() + "."); - return; - } - - if (router.getState() == State.Running) { - //Get Vlans associated with the account - List vlansForAccount = new ArrayList(); - if (vlanId == null){ - vlansForAccount.addAll(_vlanDao.listVlansForAccountByType(zoneId, account.getId(), VlanType.VirtualNetwork)); - s_logger.debug("vlansForAccount "+ vlansForAccount); - }else{ - vlansForAccount.add(_vlanDao.findById(vlanId)); - } - - // Creating a list of all the ips that can be assigned to this account - txn.start(); - List ipAddrsList = new ArrayList(); - for (VlanVO vlan : vlansForAccount){ - ipAddrsList.addAll(_publicIpAddressDao.assignAcccountSpecificIps(accountId, account.getDomainId(), 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; - } - - // Associate the IP's to DomR - boolean success = _networkMgr.associateIP(router,ipAddrsList, true, 0); - String errorMsg = "Unable to assign public IP address pool"; - if (!success) { - s_logger.debug(errorMsg); - for(String ip : ipAddrsList){ - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_ERROR, EventTypes.EVENT_NET_IP_ASSIGN, "Unable to assign public IP " +ip); - } - throw new CloudRuntimeException(errorMsg); - } - txn.commit(); - for(String ip : ipAddrsList){ - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_INFO, EventTypes.EVENT_NET_IP_ASSIGN, "Successfully assigned account IP " +ip); - } - } - } catch (CloudRuntimeException iee) { - s_logger.error("Associate IP threw an CloudRuntimeException.", iee); - throw iee; - } catch (Throwable t) { - s_logger.error("Associate IP address threw an exception.", t); - throw new CloudRuntimeException("Associate IP address exception"); - } finally { - if (account != null) { - _accountDao.releaseFromLockTable(accountId); - s_logger.debug("Associate IP address lock released"); - } - } - - } @Override public boolean deleteVlanAndPublicIpRange(long userId, long vlanDbId) throws InvalidParameterValueException { @@ -2060,28 +1874,10 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura throw new InvalidParameterValueException("Please specify a valid IP range 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."); - } - - // 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."); - } - - Long accountId = null; - Long podId = null; - List accountVlanMaps = _accountVlanMapDao.listAccountVlanMapsByVlan(vlanDbId); - List podVlanMaps = _podVlanMapDao.listPodVlanMapsByVlan(vlanDbId); - - if (accountVlanMaps.size() > 0) { - accountId = accountVlanMaps.get(0).getAccountId(); - } - - if (podVlanMaps.size() > 0) { - podId = podVlanMaps.get(0).getPodId(); - } + // 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."); + } // Delete all public IPs in the VLAN if (!deletePublicIPRange(vlanDbId)) { @@ -2089,25 +1885,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } // Delete the VLAN - boolean success = _vlanDao.expunge(vlanDbId); - - if (success) { - 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.getVlanTag() + ", gateway = " + vlan.getVlanGateway() + ", netmask = " + vlan.getVlanNetmask() + ", start IP = " + startIP; - if (endIP != null) { - eventMsg += ", end IP = " + endIP; - } - eventMsg += "."; - saveConfigurationEvent(userId, null, EventTypes.EVENT_VLAN_IP_RANGE_DELETE, eventMsg, "vlanType=" + vlan.getVlanType(), "dcId=" + vlan.getDataCenterId(), - "accountId=" + accountId, "podId=" + podId, - "vlanId=" + vlan.getVlanTag(), "vlanGateway=" + vlan.getVlanGateway(), - "vlanNetmask=" + vlan.getVlanNetmask(), "startIP=" + startIP, - "endIP=" + endIP); - } - - return success; + return _vlanDao.expunge(vlanDbId); } @Override @@ -2241,33 +2019,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura return true; } - @DB - protected boolean savePublicIPRangeForAccount(String startIP, String endIP, long zoneId, long vlanDbId, long accountId, long domainId) { - IPRangeConfig config = new IPRangeConfig(); - Transaction txn = Transaction.currentTxn(); - txn.start(); - long startIPLong = NetUtils.ip2Long(startIP); - long endIPLong = NetUtils.ip2Long(endIP); - Vector ips = config.savePublicIPRange(txn, startIPLong, endIPLong, zoneId, vlanDbId); - List skip = new ArrayList(ips.size()); - for (String ip : ips) { - skip.add(NetUtils.ip2Long(ip)); - } - for (long ip = startIPLong; ip <= endIPLong; ip++) { - if (skip.contains(ip)) { - continue; - } - - IPAddressVO addr = _publicIpAddressDao.findById(new Ip(ip)); - addr.setAllocatedInDomainId(domainId); - addr.setAllocatedTime(new Date()); - addr.setAllocatedToAccountId(accountId); - _publicIpAddressDao.update(addr.getAddress(), addr); - } - txn.commit(); - return true; - } - @DB protected List savePrivateIPRange(String startIP, String endIP, long podId, long zoneId) { Transaction txn = Transaction.currentTxn(); @@ -2523,48 +2274,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } } - @Override - public Long saveConfigurationEvent(long userId, Long accountId, String type, String description, String... paramsList) { - UserVO user = _userDao.findById(userId); - long accountIdToUse = (accountId != null) ? accountId : user.getAccountId(); - - String eventParams = ""; - String logParams = ""; - for (int i = 0; i < paramsList.length; i++) { - String param = paramsList[i]; - boolean lastParam = (i == (paramsList.length - 1)); - - logParams += param; - if (!lastParam) { - logParams += ", "; - } - - String[] valList = param.split("\\="); - String val = (valList.length < 2) ? "null" : valList[1]; - if (val.equals("null")) { - continue; - } - - eventParams += param; - if (!lastParam) { - eventParams += "\n"; - } - } - - EventVO event = new EventVO(); - event.setUserId(userId); - event.setAccountId(accountIdToUse); - event.setType(type); - event.setDescription(description); - event.setLevel(EventVO.LEVEL_INFO); - event.setParameters(eventParams); - event = _eventDao.persist(event); - - s_logger.debug("User " + user.getUsername() + " performed configuration action: " + type + ", " + description + " | params: " + logParams); - - return event.getId(); - } - private String[] getLinkLocalIPRange() throws InvalidParameterValueException { String ipNums = _configDao.getValue("linkLocalIp.nums"); int nums = Integer.parseInt(ipNums); @@ -2614,10 +2323,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (vlan == null) { throw new InvalidParameterValueException("Please specify a valid IP range id."); } - -// if (vlan.getNetworkId() != null) { -// throw new InvalidParameterValueException("Fail to delete a vlan range as there are networks associated with it"); -// } return deleteVlanAndPublicIpRange(userId, vlanDbId); @@ -2725,8 +2430,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura NetworkOfferingVO offering = new NetworkOfferingVO(name, displayText, trafficType, false, specifyVlan, networkRate, multicastRate, maxConnections, false, availability, false, false, false, false, false, false, false); if ((offering = _networkOfferingDao.persist(offering)) != null) { - saveConfigurationEvent(userId, null, EventTypes.EVENT_NETWORK_OFFERING_CREATE, "Successfully created new network offering with name: " + name + ".", "noId=" + offering.getId(), "name=" + name, - "displayText=" + displayText, "tags=" + tags); return offering; } else { return null; @@ -2796,7 +2499,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura @Override public boolean deleteNetworkOffering(DeleteNetworkOfferingCmd cmd) throws InvalidParameterValueException{ Long offeringId = cmd.getId(); - Long userId = UserContext.current().getCallerUserId(); //Verify network offering id NetworkOfferingVO offering = _networkOfferingDao.findById(offeringId); @@ -2812,8 +2514,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } if (_networkOfferingDao.remove(offeringId)) { - saveConfigurationEvent(userId, null, EventTypes.EVENT_NETWORK_OFFERING_DELETE, "Successfully deleted network offering with name: " + offering.getName(), "noId=" + offeringId, "name=" + offering.getName(), - "displayText=" + offering.getDisplayText()); return true; } else { return false; @@ -2889,4 +2589,94 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura public DataCenterVO getZone(long id){ return _zoneDao.findById(id); } + + @Override + public NetworkOffering getNetworkOffering(long id) { + return _networkOfferingDao.findById(id); + } + + @Override + public Integer getNetworkRate(long networkOfferingId) { + NetworkOffering no = getNetworkOffering(networkOfferingId); + Integer networkRate = null; + if (no == null) { + throw new InvalidParameterValueException("Unable to find network offering by id=" + networkOfferingId); + } + if (no.getRateMbps() != null) { + networkRate = no.getRateMbps(); + } else { + networkRate = Integer.parseInt(_configDao.getValue(Config.NetworkThrottlingRate.key())); + } + + return networkRate; + } + + @Override + public Account getVlanAccount(long vlanId) { + Vlan vlan = _vlanDao.findById(vlanId); + Long accountId = null; + + //if vlan is Virtual Account specific, get vlan information from the accountVlanMap; otherwise get account information from the network + if (vlan.getVlanType() == VlanType.VirtualNetwork) { + List maps = _accountVlanMapDao.listAccountVlanMapsByVlan(vlanId); + if (maps != null && !maps.isEmpty()) { + return _accountMgr.getAccount(maps.get(0).getAccountId()); + } + } + + Long networkId = vlan.getNetworkId(); + if (networkId != null) { + Network network = _networkMgr.getNetwork(networkId); + if (network != null) { + accountId = network.getAccountId(); + } + } + + return _accountMgr.getAccount(accountId); + } + + @Override + public List listNetworkOfferings(TrafficType trafficType, boolean systemOnly) { + Filter searchFilter = new Filter(NetworkOfferingVO.class, "created", false, null, null); + SearchCriteria sc = _networkOfferingDao.createSearchCriteria(); + if (trafficType != null) { + sc.addAnd("trafficType", SearchCriteria.Op.EQ, trafficType); + } + sc.addAnd("systemOnly", SearchCriteria.Op.EQ, systemOnly); + + return _networkOfferingDao.search(sc, searchFilter); + } + + @Override @DB + public boolean deleteAccountSpecificVirtualRanges(long accountId) { + List maps = _accountVlanMapDao.listAccountVlanMapsByAccount(accountId); + boolean result = true; + if (maps != null && !maps.isEmpty()) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + for (AccountVlanMapVO map : maps) { + if (!deleteVlanAndPublicIpRange(_accountMgr.getSystemUser().getId(), map.getVlanDbId())) { + result = false; + } + } + if (result) { + txn.commit(); + } else { + s_logger.error("Failed to delete account specific virtual ip ranges for account id=" + accountId); + } + } else { + s_logger.trace("Account id=" + accountId + " has no account specific virtual ip ranges, nothing to delete"); + } + return result; + } + + @Override + public HostPodVO getPod(long id) { + return _podDao.findById(id); + } + + @Override + public ClusterVO getCluster(long id) { + return _clusterDao.findById(id); + } } diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index 6ba6c5edf5c..c373dbdaa87 100644 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -73,7 +73,11 @@ import com.cloud.network.dao.RemoteAccessVpnDaoImpl; import com.cloud.network.dao.VpnUserDaoImpl; import com.cloud.network.lb.LoadBalancingRulesManagerImpl; import com.cloud.network.ovs.OvsNetworkManagerImpl; +import com.cloud.network.ovs.OvsTunnelManagerImpl; import com.cloud.network.ovs.dao.GreTunnelDaoImpl; +import com.cloud.network.ovs.dao.OvsTunnelAccountDao; +import com.cloud.network.ovs.dao.OvsTunnelAccountDaoImpl; +import com.cloud.network.ovs.dao.OvsTunnelDaoImpl; import com.cloud.network.ovs.dao.OvsWorkDaoImpl; import com.cloud.network.ovs.dao.VlanMappingDaoImpl; import com.cloud.network.ovs.dao.VlanMappingDirtyDaoImpl; @@ -251,6 +255,8 @@ public class DefaultComponentLibrary implements ComponentLibrary { addDao("OvsWorkDao", OvsWorkDaoImpl.class); addDao("VmFlowLogDao", VmFlowLogDaoImpl.class); addDao("GreTunnelDao", GreTunnelDaoImpl.class); + addDao("OvsTunnelDao", OvsTunnelDaoImpl.class); + addDao("OvsTunnelAccountDao", OvsTunnelAccountDaoImpl.class); } Map> _managers = new HashMap>(); @@ -306,6 +312,7 @@ public class DefaultComponentLibrary implements ComponentLibrary { addManager("RulesManager", RulesManagerImpl.class); addManager("RemoteAccessVpnManager", RemoteAccessVpnManagerImpl.class); addManager("OvsNetworkManager", OvsNetworkManagerImpl.class); + addManager("OvsTunnelManager", OvsTunnelManagerImpl.class); } protected List> addAdapterChain(Class interphace, List>> adapters) { diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 1d8a0cb1013..2ca2e0de0f7 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -75,9 +75,6 @@ import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.HostPodDao; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; -import com.cloud.event.EventTypes; -import com.cloud.event.EventUtils; -import com.cloud.event.EventVO; import com.cloud.event.dao.EventDao; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; @@ -340,8 +337,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx try { if (proxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { try { - long accountId = proxy.getAccountId(); - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, accountId, EventTypes.EVENT_PROXY_START, "Starting proxy : " + proxy.getName()); proxy = startProxy(proxyVmId); if (proxy == null) { @@ -363,7 +358,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx if (s_logger.isInfoEnabled()) { s_logger.info("Unable to start console proxy, proxy vm Id : " + proxyVmId + " will recycle it and restart a new one"); } - EventUtils.saveEvent(User.UID_SYSTEM, accountId, EventVO.LEVEL_ERROR, EventTypes.EVENT_PROXY_START, "Failed to start console proxy", startEventId); destroyProxy(proxyVmId); return null; } else { @@ -371,7 +365,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx s_logger.trace("Console proxy " + proxy.getName() + " is started"); } - EventUtils.saveEvent(User.UID_SYSTEM, accountId, EventVO.LEVEL_INFO, EventTypes.EVENT_PROXY_START, "Started console proxy: "+proxy.getName(), startEventId); // if it is a new assignment or a changed assignment, // update the // record @@ -644,7 +637,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx s_logger.debug("Assign console proxy from a newly started instance for request from data center : " + dataCenterId); } - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_PROXY_CREATE, "Creating console proxy"); Map context = createProxyInstance(dataCenterId); long proxyVmId = (Long) context.get("proxyVmId"); @@ -652,14 +644,12 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx if (s_logger.isTraceEnabled()) { s_logger.trace("Creating proxy instance failed, data center id : " + dataCenterId); } - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_PROXY_CREATE, "console proxy creation failed", startEventId); return null; } ConsoleProxyVO proxy = _consoleProxyDao.findById(proxyVmId); // allocProxyStorage(dataCenterId, proxyVmId); if (proxy != null) { - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_INFO, EventTypes.EVENT_PROXY_CREATE, "Succesfully created console proxy", startEventId); SubscriptionMgr.getInstance().notifySubscribers(ConsoleProxyManager.ALERT_SUBJECT, this, new ConsoleProxyAlertEventArgs(ConsoleProxyAlertEventArgs.PROXY_CREATED, dataCenterId, proxy.getId(), proxy, null)); return proxy; @@ -673,7 +663,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx this, new ConsoleProxyAlertEventArgs(ConsoleProxyAlertEventArgs.PROXY_CREATE_FAILURE, dataCenterId, proxyVmId, null, "Unable to allocate storage")); - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_PROXY_CREATE, "console proxy creation failed", startEventId); } return null; } @@ -936,7 +925,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx return; } console.setPrivateIpAddress(cmd.getPrivateIpAddress()); - console.setPrivateNetmask(cmd.getPrivateNetmask()); console.setPublicIpAddress(cmd.getPublicIpAddress()); console.setPublicNetmask(cmd.getPublicNetmask()); _consoleProxyDao.persist(console); @@ -1171,8 +1159,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx if (proxy != null) { long proxyVmId = proxy.getId(); GlobalLock proxyLock = GlobalLock.getInternLock(getProxyLockName(proxyVmId)); - long accountId = proxy.getAccountId(); - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, accountId, EventTypes.EVENT_PROXY_START, "Starting proxy : " + proxy.getName()); try { if (proxyLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) { try { @@ -1195,7 +1181,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx s_logger.info("Unable to start console proxy for standby capacity, proxy vm Id : " + proxyVmId + ", will recycle it and start a new one"); } - EventUtils.saveEvent(User.UID_SYSTEM, accountId, EventVO.LEVEL_ERROR, EventTypes.EVENT_PROXY_START, "Failed to start console proxy", startEventId); if (proxyFromStoppedPool) { destroyProxy(proxyVmId); @@ -1204,8 +1189,6 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx if (s_logger.isInfoEnabled()) { s_logger.info("Console proxy " + proxy.getName() + " is started"); } - - EventUtils.saveEvent(User.UID_SYSTEM, accountId, EventVO.LEVEL_INFO, EventTypes.EVENT_PROXY_START, "Started console proxy: "+proxy.getName(), startEventId); } } } @@ -1682,13 +1665,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx proxy.setPublicIpAddress(nic.getIp4Address()); proxy.setPublicNetmask(nic.getNetmask()); proxy.setPublicMacAddress(nic.getMacAddress()); - } else if (network.getTrafficType() == TrafficType.Control) { - proxy.setGuestIpAddress(nic.getIp4Address()); - proxy.setGuestNetmask(nic.getNetmask()); - proxy.setGuestMacAddress(nic.getMacAddress()); } else if (network.getTrafficType() == TrafficType.Management) { proxy.setPrivateIpAddress(nic.getIp4Address()); - proxy.setPrivateNetmask(nic.getNetmask()); proxy.setPrivateMacAddress(nic.getMacAddress()); } } diff --git a/server/src/com/cloud/dc/dao/ClusterDao.java b/server/src/com/cloud/dc/dao/ClusterDao.java index 35a3f563836..da7e574911b 100644 --- a/server/src/com/cloud/dc/dao/ClusterDao.java +++ b/server/src/com/cloud/dc/dao/ClusterDao.java @@ -26,4 +26,5 @@ public interface ClusterDao extends GenericDao { List listByPodId(long podId); ClusterVO findBy(String name, long podId); List listByHyTypeWithoutGuid(String hyType); + List listByZoneId(long zoneId); } diff --git a/server/src/com/cloud/dc/dao/ClusterDaoImpl.java b/server/src/com/cloud/dc/dao/ClusterDaoImpl.java index d400df284af..a76e30186ae 100644 --- a/server/src/com/cloud/dc/dao/ClusterDaoImpl.java +++ b/server/src/com/cloud/dc/dao/ClusterDaoImpl.java @@ -31,6 +31,7 @@ public class ClusterDaoImpl extends GenericDaoBase implements C protected final SearchBuilder PodSearch; protected final SearchBuilder HyTypeWithoutGuidSearch; + protected final SearchBuilder ZoneSearch; protected ClusterDaoImpl() { super(); @@ -43,6 +44,17 @@ public class ClusterDaoImpl extends GenericDaoBase implements C PodSearch.and("pod", PodSearch.entity().getPodId(), SearchCriteria.Op.EQ); PodSearch.and("name", PodSearch.entity().getName(), SearchCriteria.Op.EQ); PodSearch.done(); + + ZoneSearch = createSearchBuilder(); + ZoneSearch.and("dataCenterId", ZoneSearch.entity().getPodId(), SearchCriteria.Op.EQ); + ZoneSearch.done(); + } + + @Override + public List listByZoneId(long zoneId) { + SearchCriteria sc = ZoneSearch.create(); + sc.setParameters("dataCenterId", zoneId); + return listBy(sc); } @Override diff --git a/server/src/com/cloud/event/ActionEventCallback.java b/server/src/com/cloud/event/ActionEventCallback.java index 65da7e6a8b0..c25ac2e7a1c 100644 --- a/server/src/com/cloud/event/ActionEventCallback.java +++ b/server/src/com/cloud/event/ActionEventCallback.java @@ -24,36 +24,14 @@ import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; -import com.cloud.user.Account; -import com.cloud.user.User; import com.cloud.user.UserContext; import com.cloud.utils.component.AnnotationInterceptor; public class ActionEventCallback implements MethodInterceptor, AnnotationInterceptor { - boolean create = false; - private String eventType = null; - private long accountId = Account.ACCOUNT_ID_SYSTEM; - private long userId = User.UID_SYSTEM; - private String description = null; - private long startEventId = 0; @Override public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { - ActionEvent actionEvent = method.getAnnotation(ActionEvent.class); - EventVO event = null; - if (actionEvent != null) { - create = actionEvent.create(); - UserContext ctx = UserContext.current(); - Long userID = ctx.getCallerUserId(); - userId = (userID == null) ? User.UID_SYSTEM : userID; - eventType = actionEvent.eventType(); - description = actionEvent.eventDescription(); - startEventId = ctx.getStartEventId(); - - if(!create){ - event = interceptStart(method); - } - } + EventVO event = interceptStart(method);; try { return methodProxy.invokeSuper(object, args); } finally { @@ -70,30 +48,25 @@ public class ActionEventCallback implements MethodInterceptor, AnnotationInterce Method method = (Method)element; ActionEvent actionEvent = method.getAnnotation(ActionEvent.class); if (actionEvent != null) { - create = actionEvent.create(); return true; } - Class clazz = method.getDeclaringClass(); - do { - actionEvent = clazz.getAnnotation(ActionEvent.class); - if (actionEvent != null) { - return true; - } - clazz = clazz.getSuperclass(); - } while (clazz != Object.class && clazz != null); - return false; } @Override public EventVO interceptStart(AnnotatedElement element) { EventVO event = null; - if(eventType != null){ - long eventId = EventUtils.saveStartedEvent(userId, accountId, eventType, description, startEventId); - if(startEventId == 0){ - // There was no scheduled event. so Started event Id - startEventId = eventId; + Method method = (Method)element; + ActionEvent actionEvent = method.getAnnotation(ActionEvent.class); + if (actionEvent != null) { + boolean async = actionEvent.async(); + if(async){ + UserContext ctx = UserContext.current(); + long userId = ctx.getCallerUserId(); + long accountId = ctx.getAccountId(); + long startEventId = ctx.getStartEventId(); + EventUtils.saveStartedEvent(userId, accountId, actionEvent.eventType(), actionEvent.eventDescription(), startEventId); } } return event; @@ -101,25 +74,37 @@ public class ActionEventCallback implements MethodInterceptor, AnnotationInterce @Override public void interceptComplete(AnnotatedElement element, EventVO event) { - if(eventType != null){ - if(create){ + Method method = (Method)element; + ActionEvent actionEvent = method.getAnnotation(ActionEvent.class); + if (actionEvent != null) { + UserContext ctx = UserContext.current(); + long userId = ctx.getCallerUserId(); + long accountId = ctx.getAccountId(); + long startEventId = ctx.getStartEventId(); + if(actionEvent.create()){ //This start event has to be used for subsequent events of this action - startEventId = EventUtils.saveCreatedEvent(userId, accountId, EventVO.LEVEL_INFO, eventType, "Successfully created entity for "+description); - UserContext ctx = UserContext.current(); + startEventId = EventUtils.saveCreatedEvent(userId, accountId, EventVO.LEVEL_INFO, actionEvent.eventType(), "Successfully created entity for "+actionEvent.eventDescription()); ctx.setStartEventId(startEventId); } else { - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_INFO, eventType, "Successfully completed "+description, startEventId); + EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_INFO, actionEvent.eventType(), "Successfully completed "+actionEvent.eventDescription(), startEventId); } } } @Override public void interceptException(AnnotatedElement element, EventVO event) { - if(eventType != null){ - if(create){ - EventUtils.saveCreatedEvent(userId, accountId, EventVO.LEVEL_ERROR, eventType, "Error while creating entity for "+description); + Method method = (Method)element; + ActionEvent actionEvent = method.getAnnotation(ActionEvent.class); + if (actionEvent != null) { + UserContext ctx = UserContext.current(); + long userId = ctx.getCallerUserId(); + long accountId = ctx.getAccountId(); + long startEventId = ctx.getStartEventId(); + if(actionEvent.create()){ + long eventId = EventUtils.saveCreatedEvent(userId, accountId, EventVO.LEVEL_ERROR, actionEvent.eventType(), "Error while creating entity for "+actionEvent.eventDescription()); + ctx.setStartEventId(eventId); } else { - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_ERROR, eventType, "Error while "+description, startEventId); + EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_ERROR, actionEvent.eventType(), "Error while "+actionEvent.eventDescription(), startEventId); } } } diff --git a/server/src/com/cloud/event/EventUtils.java b/server/src/com/cloud/event/EventUtils.java index 40fd1848843..cfe4104b426 100755 --- a/server/src/com/cloud/event/EventUtils.java +++ b/server/src/com/cloud/event/EventUtils.java @@ -20,11 +20,12 @@ public class EventUtils { /* * Save event after scheduling an async job */ - public static Long saveScheduledEvent(Long userId, Long accountId, String type, String description) { + public static Long saveScheduledEvent(Long userId, Long accountId, String type, String description, long startEventId) { EventVO event = new EventVO(); event.setUserId(userId); event.setAccountId(accountId); event.setType(type); + event.setStartId(startEventId); event.setState(Event.State.Scheduled); event.setDescription("Scheduled async job for "+description); event = _eventDao.persist(event); diff --git a/server/src/com/cloud/ha/InvestigatorImpl.java b/server/src/com/cloud/ha/InvestigatorImpl.java index 3d1e49c6237..eda08a88cf1 100644 --- a/server/src/com/cloud/ha/InvestigatorImpl.java +++ b/server/src/com/cloud/ha/InvestigatorImpl.java @@ -62,7 +62,7 @@ public class InvestigatorImpl implements Investigator { if (vm.getType() == VirtualMachine.Type.User) { // to verify that the VM is alive, we ask the domR (router) to ping the VM (private IP) UserVmVO userVm = _userVmDao.findById(vm.getId()); - Long routerId = userVm.getDomainRouterId(); + Long routerId = null; // FIXME: This doesn't work. Need to grab the domain router from the network. if (routerId == null) { /*TODO: checking vm status for external dhcp mode*/ s_logger.debug("It's external dhcp mode, how to checking the vm is alive?"); diff --git a/server/src/com/cloud/ha/StorageFence.java b/server/src/com/cloud/ha/StorageFence.java deleted file mode 100644 index a1cbddf9ed6..00000000000 --- a/server/src/com/cloud/ha/StorageFence.java +++ /dev/null @@ -1,81 +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.ha; - -import java.util.Map; - -import javax.ejb.Local; -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; - -import com.cloud.host.HostVO; -import com.cloud.storage.StorageManager; -import com.cloud.utils.component.ComponentLocator; -import com.cloud.vm.VMInstanceVO; - -@Local(value=FenceBuilder.class) -public class StorageFence implements FenceBuilder { - private final static Logger s_logger = Logger.getLogger(StorageFence.class); - - String _name; - - StorageManager _storageMgr; - - public StorageFence() { - } - - @Override - public Boolean fenceOff(VMInstanceVO vm, HostVO host) { - s_logger.debug("Asking storage server to unshare " + vm.toString()); - return _storageMgr.unshare(vm, host) != null; - } - - @Override - public boolean configure(String name, Map params) - throws ConfigurationException { - _name = name; - - ComponentLocator locator = ComponentLocator.getCurrentLocator(); - if (locator == null) { - throw new ConfigurationException("Unable to locate the locator!"); - } - - _storageMgr = locator.getManager(StorageManager.class); - if (_storageMgr == null) { - throw new ConfigurationException("Unable to get " + StorageManager.class); - } - - return true; - } - - @Override - public String getName() { - return _name; - } - - @Override - public boolean start() { - return true; - } - - @Override - public boolean stop() { - return true; - } -} diff --git a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java index d033e2e60a2..f7a85b5ed36 100644 --- a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java +++ b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java @@ -47,7 +47,7 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis to.setDefaultNic(profile.isDefaultNic()); to.setBroadcastUri(profile.getBroadCastUri()); to.setIsolationuri(profile.getIsolationUri()); - + to.setNetworkRateMbps(profile.getNetworkRate()); return to; } diff --git a/server/src/com/cloud/migration/Db20to21MigrationUtil.java b/server/src/com/cloud/migration/Db20to21MigrationUtil.java index 9d141fef251..0862efbd3a8 100644 --- a/server/src/com/cloud/migration/Db20to21MigrationUtil.java +++ b/server/src/com/cloud/migration/Db20to21MigrationUtil.java @@ -563,15 +563,12 @@ public class Db20to21MigrationUtil { 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.allocateLinkLocalIpAddress(proxy.getDataCenterId(), proxy.getPodId(), proxy.getId(), null); - 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); @@ -590,15 +587,12 @@ public class Db20to21MigrationUtil { 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.allocateLinkLocalIpAddress(secStorageVm.getDataCenterId(), secStorageVm.getPodId(), secStorageVm.getId(), null); - 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); diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index a6cb5ff5bef..9d2dfde0c0b 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -27,6 +27,8 @@ import com.cloud.deploy.DeploymentPlan; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Service; @@ -40,7 +42,6 @@ import com.cloud.user.Account; import com.cloud.user.AccountVO; import com.cloud.utils.Pair; import com.cloud.utils.net.Ip; -import com.cloud.vm.DomainRouterVO; import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; @@ -53,8 +54,6 @@ import com.cloud.vm.VirtualMachineProfile; * */ public interface NetworkManager extends NetworkService { - public static final boolean USE_POD_VLAN = false; - /** * Assigns a new public ip address. * @@ -89,16 +88,6 @@ public interface NetworkManager extends NetworkService { */ public boolean releasePublicIpAddress(Ip ipAddress, long ownerId, long userId); - /** - * Associates or disassociates a list of public IP address for a router. - * @param router router object to send the association to - * @param ipAddrList list of public IP addresses - * @param add true if associate, false if disassociate - * @param vmId - * @return - */ - boolean associateIP(DomainRouterVO router, List ipAddrList, boolean add, long vmId) throws ConcurrentOperationException; - /** * Lists IP addresses that belong to VirtualNetwork VLANs * @param accountId - account that the IP address should belong to @@ -120,6 +109,8 @@ public interface NetworkManager extends NetworkService { void cleanupNics(VirtualMachineProfile vm); + void expungeNics(VirtualMachineProfile vm); + List getNics(VirtualMachine vm); List getAccountsUsingNetwork(long configurationId); @@ -149,5 +140,22 @@ public interface NetworkManager extends NetworkService { void shutdownNetwork(long networkId); boolean destroyNetwork(long networkId, long callerUserId); + + Network createNetwork(long networkOfferingId, String name, String displayText, Boolean isShared, Boolean isDefault, Long zoneId, String gateway, String startIP, String endIP, String netmask, String vlanId, String networkDomain, Account owner) throws InvalidParameterValueException, PermissionDeniedException; + + /** + * Associates an ip address list to an account. The list of ip addresses are all addresses associated with the given vlan id. + * @param userId + * @param accountId + * @param zoneId + * @param vlanId + * @throws InsufficientAddressCapacityException + * @throws + */ + boolean associateIpAddressListToAccount(long userId, long accountId, long zoneId, Long vlanId) throws InsufficientAddressCapacityException, + ConcurrentOperationException, ResourceUnavailableException; + Nic getNicInNetwork(long vmId, long networkId); + + Nic getNicForTraffic(long vmId, TrafficType type); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 5388bcd85ee..8a990d4dc93 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -48,6 +48,7 @@ import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ResourceLimitDao; +import com.cloud.dc.AccountVlanMapVO; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterVO; @@ -65,8 +66,6 @@ import com.cloud.deploy.DeploymentPlan; import com.cloud.domain.Domain; import com.cloud.domain.dao.DomainDao; import com.cloud.event.EventTypes; -import com.cloud.event.EventUtils; -import com.cloud.event.EventVO; import com.cloud.event.UsageEventVO; import com.cloud.event.dao.EventDao; import com.cloud.event.dao.UsageEventDao; @@ -89,21 +88,18 @@ import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.element.NetworkElement; import com.cloud.network.guru.NetworkGuru; -import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.PortForwardingRule; import com.cloud.network.rules.RulesManager; import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Availability; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; -import com.cloud.resource.Resource; -import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; +import com.cloud.user.User; import com.cloud.user.UserContext; import com.cloud.user.UserStatisticsVO; import com.cloud.user.dao.AccountDao; @@ -125,11 +121,11 @@ import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.Ip; import com.cloud.utils.net.NetUtils; -import com.cloud.vm.DomainRouterVO; import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.ReservationContext; +import com.cloud.vm.ReservationContextImpl; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.Type; @@ -140,36 +136,58 @@ import com.cloud.vm.dao.UserVmDao; /** * NetworkManagerImpl implements NetworkManager. */ -@Local(value={NetworkManager.class, NetworkService.class}) +@Local(value = { NetworkManager.class, NetworkService.class }) public class NetworkManagerImpl implements NetworkManager, NetworkService, Manager { private static final Logger s_logger = Logger.getLogger(NetworkManagerImpl.class); String _name; - @Inject DataCenterDao _dcDao = null; - @Inject VlanDao _vlanDao = null; - @Inject IPAddressDao _ipAddressDao = null; - @Inject AccountDao _accountDao = null; - @Inject DomainDao _domainDao = null; - @Inject UserStatisticsDao _userStatsDao = null; - @Inject EventDao _eventDao = null; - @Inject ConfigurationDao _configDao; - @Inject UserVmDao _vmDao = null; - @Inject ResourceLimitDao _limitDao = null; - @Inject CapacityDao _capacityDao = null; - @Inject AlertManager _alertMgr; - @Inject AccountManager _accountMgr; - @Inject ConfigurationManager _configMgr; - @Inject AccountVlanMapDao _accountVlanMapDao; - @Inject NetworkOfferingDao _networkOfferingDao = null; - @Inject NetworkDao _networksDao = null; - @Inject NicDao _nicDao = null; - @Inject RulesManager _rulesMgr; - @Inject LoadBalancingRulesManager _lbMgr; - @Inject UsageEventDao _usageEventDao; - @Inject PodVlanMapDao _podVlanMapDao; - @Inject(adapter=NetworkGuru.class) + @Inject + DataCenterDao _dcDao = null; + @Inject + VlanDao _vlanDao = null; + @Inject + IPAddressDao _ipAddressDao = null; + @Inject + AccountDao _accountDao = null; + @Inject + DomainDao _domainDao = null; + @Inject + UserStatisticsDao _userStatsDao = null; + @Inject + EventDao _eventDao = null; + @Inject + ConfigurationDao _configDao; + @Inject + UserVmDao _vmDao = null; + @Inject + ResourceLimitDao _limitDao = null; + @Inject + CapacityDao _capacityDao = null; + @Inject + AlertManager _alertMgr; + @Inject + AccountManager _accountMgr; + @Inject + ConfigurationManager _configMgr; + @Inject + AccountVlanMapDao _accountVlanMapDao; + @Inject + NetworkOfferingDao _networkOfferingDao = null; + @Inject + NetworkDao _networksDao = null; + @Inject + NicDao _nicDao = null; + @Inject + RulesManager _rulesMgr; + @Inject + LoadBalancingRulesManager _lbMgr; + @Inject + UsageEventDao _usageEventDao; + @Inject + PodVlanMapDao _podVlanMapDao; + @Inject(adapter = NetworkGuru.class) Adapters _networkGurus; - @Inject(adapter=NetworkElement.class) + @Inject(adapter = NetworkElement.class) Adapters _networkElements; private HashMap _systemNetworks = new HashMap(5); @@ -180,22 +198,23 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag SearchBuilder AssignIpAddressSearch; SearchBuilder AssignIpAddressFromPodVlanSearch; SearchBuilder IpAddressSearch; - + SearchBuilder NicForTrafficTypeSearch; + int _networkGcWait; int _networkGcInterval; String _networkDomain; private Map _configs; - + HashMap _lastNetworkIdsToFree = new HashMap(); @Override public PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId) throws InsufficientAddressCapacityException { - return fetchNewPublicIp(dcId, podId, owner, type, networkId, false, true); + return fetchNewPublicIp(dcId, podId, null, owner, type, networkId, false, true); } - - @DB - public PublicIp fetchNewPublicIp(long dcId, Long podId, Account owner, VlanType vlanUse, Long networkId, boolean sourceNat, boolean assign) throws InsufficientAddressCapacityException { + + @DB + public PublicIp fetchNewPublicIp(long dcId, Long podId, Long vlanDbId, Account owner, VlanType vlanUse, Long networkId, boolean sourceNat, boolean assign) throws InsufficientAddressCapacityException { Transaction txn = Transaction.currentTxn(); txn.start(); SearchCriteria sc = null; @@ -206,66 +225,67 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag sc = AssignIpAddressSearch.create(); } + if (vlanDbId != null) { + sc.addAnd("vlanId", SearchCriteria.Op.EQ, vlanDbId); + } + sc.setParameters("dc", dcId); - - //for direct network take ip addresses only from the vlans belonging to the network + + // for direct network take ip addresses only from the vlans belonging to the network if (vlanUse == VlanType.DirectAttached) { sc.setJoinParameters("vlan", "networkId", networkId); } sc.setJoinParameters("vlan", "type", vlanUse); - + Filter filter = new Filter(IPAddressVO.class, "vlanId", true, 0l, 1l); - + List addrs = _ipAddressDao.lockRows(sc, filter, true); - + if (addrs.size() == 0) { throw new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId); } - + assert (addrs.size() == 1) : "Return size is incorrect: " + addrs.size(); - + IPAddressVO addr = addrs.get(0); - addr.setSourceNat(sourceNat); + addr.setSourceNat(sourceNat); addr.setAllocatedTime(new Date()); addr.setAllocatedInDomainId(owner.getDomainId()); addr.setAllocatedToAccountId(owner.getId()); + addr.setState(assign ? IpAddress.State.Allocated : IpAddress.State.Allocating); - + if (vlanUse == VlanType.DirectAttached) { addr.setState(IpAddress.State.Allocated); } else { addr.setAssociatedWithNetworkId(networkId); } - + if (!_ipAddressDao.update(addr.getAddress(), addr)) { throw new CloudRuntimeException("Found address to allocate but unable to update: " + addr); } - if(!sourceNat && (owner.getAccountId() != Account.ACCOUNT_ID_SYSTEM)){ - UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_ASSIGN, owner.getAccountId(), dcId, 0, addr.getAddress().toString()); + if(owner.getAccountId() != Account.ACCOUNT_ID_SYSTEM){ + long isSourceNat = (sourceNat) ? 1 : 0 ; + UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_ASSIGN, owner.getAccountId(), dcId, isSourceNat, addr.getAddress().toString()); _usageEventDao.persist(usageEvent); } - + txn.commit(); long macAddress = NetUtils.createSequenceBasedMacAddress(addr.getMacAddress()); return new PublicIp(addr, _vlanDao.findById(addr.getVlanId()), macAddress); } - + @Override @DB public PublicIp assignSourceNatIpAddress(Account owner, Network network, long callerId) throws ConcurrentOperationException, InsufficientAddressCapacityException { assert (network.getTrafficType() != null) : "You're asking for a source nat but your network can't participate in source nat. What do you have to say for yourself?"; - + long dcId = network.getDataCenterId(); long ownerId = owner.getId(); - final EventVO event = new EventVO(); - event.setUserId(callerId); // system user performed the action... - event.setAccountId(ownerId); - event.setType(EventTypes.EVENT_NET_IP_ASSIGN); - PublicIp ip = null; - + Transaction txn = Transaction.currentTxn(); try { txn.start(); @@ -279,40 +299,44 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } IPAddressVO sourceNat = null; - List addrs = listPublicIpAddressesInVirtualNetwork(ownerId, dcId, null); + List addrs = listPublicIpAddressesInVirtualNetwork(ownerId, dcId, null); if (addrs.size() == 0) { // Check that the maximum number of public IPs for the given accountId will not be exceeded if (_accountMgr.resourceLimitExceeded(owner, ResourceType.public_ip)) { throw new AccountLimitException("Maximum number of public IP addresses for account: " + owner.getAccountName() + " has been exceeded."); } - + if (s_logger.isDebugEnabled()) { s_logger.debug("assigning a new ip address in " + dcId + " to " + owner); - } + } + + //If account has Account specific ip ranges, try to allocate ip from there + Long vlanId = null; + List maps = _accountVlanMapDao.listAccountVlanMapsByAccount(ownerId); + if (maps != null && !maps.isEmpty()) { + vlanId = maps.get(0).getVlanDbId(); + } - ip = fetchNewPublicIp(dcId, null, owner, VlanType.VirtualNetwork, network.getId(), true, false); + ip = fetchNewPublicIp(dcId, null, vlanId, owner, VlanType.VirtualNetwork, network.getId(), true, false); sourceNat = ip.ip(); sourceNat.setState(IpAddress.State.Allocated); _ipAddressDao.update(sourceNat.getAddress(), sourceNat); // Increment the number of public IPs for this accountId in the database _accountMgr.incrementResourceCount(ownerId, ResourceType.public_ip); - event.setDescription("Acquired a public ip: " + ip.getAddress()); - _eventDao.persist(event); } else { // Account already has ip addresses - for (IPAddressVO addr : addrs) { if (addr.isSourceNat()) { sourceNat = addr; break; } } - - assert(sourceNat != null) : "How do we get a bunch of ip addresses but none of them are source nat? account=" + ownerId + "; dc=" + dcId; + + assert (sourceNat != null) : "How do we get a bunch of ip addresses but none of them are source nat? account=" + ownerId + "; dc=" + dcId; ip = new PublicIp(sourceNat, _vlanDao.findById(sourceNat.getVlanId()), NetUtils.createSequenceBasedMacAddress(sourceNat.getMacAddress())); } - + UserStatisticsVO stats = _userStatsDao.findBy(ownerId, dcId, null, null); if (stats == null) { if (s_logger.isDebugEnabled()) { @@ -325,7 +349,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return ip; } finally { if (owner != null) { - if(s_logger.isDebugEnabled()) { + if (s_logger.isDebugEnabled()) { s_logger.debug("Releasing lock account " + ownerId); } @@ -333,103 +357,25 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } if (ip == null) { txn.rollback(); - event.setLevel(EventVO.LEVEL_ERROR); - event.setDescription("Failed to acquire a public ip."); - _eventDao.persist(event); s_logger.error("Unable to get source nat ip address for account " + ownerId); } } } - - - @Override - public boolean associateIP(final DomainRouterVO router, final List ipAddrList, final boolean add, long vmId) { -// Commands cmds = new Commands(OnError.Continue); -// boolean sourceNat = false; -// Map> vlanIpMap = new HashMap>(); -// for (final String ipAddress: ipAddrList) { -// IPAddressVO ip = _ipAddressDao.findById(new Ip(ipAddress)); -// -// VlanVO vlan = _vlanDao.findById(ip.getVlanId()); -// ArrayList ipList = vlanIpMap.get(vlan.getId()); -// if (ipList == null) { -// ipList = new ArrayList(); -// } -// ipList.add(ip); -// vlanIpMap.put(vlan, ipList); -// } -// for (Map.Entry> vlanAndIp: vlanIpMap.entrySet()) { -// boolean firstIP = true; -// ArrayList ipList = vlanAndIp.getValue(); -// Collections.sort(ipList, new Comparator() { -// @Override -// public int compare(IPAddressVO o1, IPAddressVO o2) { -// return o1.getAddress().compareTo(o2.getAddress()); -// } }); -// -// for (final IPAddressVO ip: ipList) { -// sourceNat = ip.isSourceNat(); -// VlanVO vlan = vlanAndIp.getKey(); -// String vlanId = vlan.getVlanTag(); -// String vlanGateway = vlan.getVlanGateway(); -// String vlanNetmask = vlan.getVlanNetmask(); -// -// String vifMacAddress = null; -// if (firstIP && add) { -// String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(ip.getDataCenterId()); -// vifMacAddress = macAddresses[1]; -// } -// String vmGuestAddress = null; -// if(vmId!=0){ -// vmGuestAddress = _vmDao.findById(vmId).getGuestIpAddress(); -// } -// -// //cmds.addCommand(new IPAssocCommand(router.getInstanceName(), router.getPrivateIpAddress(), ip.getAddress(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, vmGuestAddress)); -// -// firstIP = false; -// } -// } -// -// Answer[] answers = null; -// try { -// answers = _agentMgr.send(router.getHostId(), cmds); -// } catch (final AgentUnavailableException e) { -// s_logger.warn("Agent unavailable", e); -// return false; -// } catch (final OperationTimedoutException e) { -// s_logger.warn("Timed Out", e); -// return false; -// } -// -// if (answers == null) { -// return false; -// } -// -// if (answers.length != ipAddrList.size()) { -// return false; -// } -// -// // FIXME: this used to be a loop for all answers, but then we always returned the -// // first one in the array, so what should really be done here? -// if (answers.length > 0) { -// Answer ans = answers[0]; -// return ans.getResult(); -// } - - return true; - } - - /** Returns the target account for an api command - * @param accountName - non-null if the account name was passed in in the command - * @param domainId - non-null if the domainId was passed in in the command. + /** + * Returns the target account for an api command + * + * @param accountName + * - non-null if the account name was passed in in the command + * @param domainId + * - non-null if the domainId was passed in in the command. * @return */ - protected Account getAccountForApiCommand(String accountName, Long domainId) throws InvalidParameterValueException, PermissionDeniedException{ + protected Account getAccountForApiCommand(String accountName, Long domainId) throws InvalidParameterValueException, PermissionDeniedException { Account account = UserContext.current().getCaller(); if (_accountMgr.isAdmin(account.getType())) { - //The admin is making the call, determine if it is for someone else or for himself + // The admin is making the call, determine if it is for someone else or for himself if (domainId != null) { if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId)) { throw new PermissionDeniedException("Invalid domain id (" + domainId + ") given, , permission denied"); @@ -445,13 +391,13 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } else { // the admin is calling the api on his own behalf return account; - } - } + } + } return account; } - + public boolean applyIpAssociations(Network network, boolean continueOnError) throws ResourceUnavailableException { - List userIps = _ipAddressDao.listByNetwork(network.getId()); + List userIps = _ipAddressDao.listByAssociatedNetwork(network.getId()); List publicIps = new ArrayList(); if (userIps != null && !userIps.isEmpty()) { for (IPAddressVO userIp : userIps) { @@ -459,7 +405,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag publicIps.add(publicIp); } } - + boolean success = true; for (NetworkElement element : _networkElements) { try { @@ -473,7 +419,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } } - + if (success) { for (IPAddressVO addr : userIps) { if (addr.getState() == IpAddress.State.Allocating) { @@ -485,22 +431,23 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } } - + return success; } - + @Override public List getVirtualNetworksOwnedByAccountInZone(String accountName, long domainId, long zoneId) { Account owner = _accountMgr.getActiveAccount(accountName, domainId); if (owner == null) { throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId + ", permission denied"); } - + return _networksDao.listBy(owner.getId(), zoneId, GuestIpType.Virtual); } - @Override @DB - public IpAddress associateIP(AssociateIPAddrCmd cmd) throws ResourceAllocationException, ResourceUnavailableException, InsufficientAddressCapacityException, ConcurrentOperationException { + @Override + @DB + public IpAddress associateIP(AssociateIPAddrCmd cmd) throws ResourceAllocationException, ResourceUnavailableException, InsufficientAddressCapacityException, ConcurrentOperationException { String accountName = cmd.getAccountName(); long domainId = cmd.getDomainId(); Long zoneId = cmd.getZoneId(); @@ -511,9 +458,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (owner == null) { throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId + ", permission denied"); } - + _accountMgr.checkAccess(caller, owner); - + long ownerId = owner.getId(); Long networkId = cmd.getNetworkId(); Network network = null; @@ -524,14 +471,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - EventVO event = new EventVO(); - event.setUserId(userId); - event.setAccountId(ownerId); - event.setType(EventTypes.EVENT_NET_IP_ASSIGN); - PublicIp ip = null; boolean success = false; - + Transaction txn = Transaction.currentTxn(); Account accountToLock = null; try { @@ -557,19 +499,16 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } txn.start(); - ip = fetchNewPublicIp(zoneId, null, owner, VlanType.VirtualNetwork, network.getId(), false, false); - + ip = fetchNewPublicIp(zoneId, null, null, owner, VlanType.VirtualNetwork, network.getId(), false, false); + if (ip == null) { throw new InsufficientAddressCapacityException("Unable to find available public IP addresses", DataCenter.class, zoneId); - } - + } + _accountMgr.incrementResourceCount(ownerId, ResourceType.public_ip); Ip ipAddress = ip.getAddress(); - event.setParameters("address=" + ipAddress + "\nsourceNat=" + false + "\ndcId=" + zoneId); - event.setDescription("Assigned a public IP address: " + ipAddress); - _eventDao.persist(event); - + s_logger.debug("Got " + ipAddress + " to assign for account " + owner.getId() + " in zone " + network.getDataCenterId()); txn.commit(); @@ -580,7 +519,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } else { s_logger.warn("Failed to associate ip address " + ip + " for account " + owner.getId() + " in zone " + network.getDataCenterId()); } - + return ip; } catch (ResourceUnavailableException e) { s_logger.error("Unable to associate ip address due to resource unavailable exception", e); @@ -590,7 +529,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag _accountDao.releaseFromLockTable(ownerId); s_logger.debug("Associate IP address lock released"); } - + if (!success) { if (ip != null) { try { @@ -604,9 +543,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag _ipAddressDao.unassignIpAddress(ip.getAddress()); _accountMgr.decrementResourceCount(ownerId, ResourceType.public_ip); - event.setLevel(EventVO.LEVEL_ERROR); - event.setDescription(""); - _eventDao.persist(event); txn.commit(); } } @@ -620,11 +556,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (ip == null) { return true; } - + if (s_logger.isDebugEnabled()) { s_logger.debug("Releasing ip " + addr + "; sourceNat = " + ip.isSourceNat()); } - + boolean success = true; try { if (!_rulesMgr.revokeAllRules(addr, userId)) { @@ -635,12 +571,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag s_logger.warn("Unable to revoke all the port forwarding rules for ip " + ip, e); success = false; } - + if (!_lbMgr.removeAllLoadBalanacers(addr)) { s_logger.warn("Unable to revoke all the load balancer rules for ip " + ip); success = false; } - + if (ip.getAssociatedWithNetworkId() != null) { Network network = _networksDao.findById(ip.getAssociatedWithNetworkId()); try { @@ -652,40 +588,29 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag throw new CloudRuntimeException("We should nver get to here because we used true when applyIpAssociations", e); } } - + if (success) { _ipAddressDao.unassignIpAddress(addr); s_logger.debug("released a public ip: " + addr); - if(!ip.isSourceNat() && (ownerId != Account.ACCOUNT_ID_SYSTEM)){ + if(ownerId != Account.ACCOUNT_ID_SYSTEM){ UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_RELEASE, ownerId, ip.getDataCenterId(), 0, addr.toString()); _usageEventDao.persist(usageEvent); } - } - - EventUtils.saveEvent(userId, ip.getAllocatedToAccountId(), EventTypes.EVENT_NET_IP_RELEASE, "released a public ip: " + addr); - + _accountMgr.decrementResourceCount(ownerId, ResourceType.public_ip); + } + return success; } - private Integer getIntegerConfigValue(String configKey, Integer dflt) { - String value = _configs.get(configKey); - if (value != null) { - return Integer.parseInt(value); - } - return dflt; - } - @Override public boolean configure(final String name, final Map params) throws ConfigurationException { _name = name; _configs = _configDao.getConfiguration("AgentManager", params); - Integer rateMbps = getIntegerConfigValue(Config.NetworkThrottlingRate.key(), null); - Integer multicastRateMbps = getIntegerConfigValue(Config.MulticastThrottlingRate.key(), null); _networkGcWait = NumbersUtil.parseInt(_configs.get(Config.NetworkGcWait.key()), 600); _networkGcInterval = NumbersUtil.parseInt(_configs.get(Config.NetworkGcInterval.key()), 600); - + _configs = _configDao.getConfiguration("Network", params); _networkDomain = _configs.get(Config.GuestDomainSuffix.key()); @@ -704,28 +629,31 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag NetworkOfferingVO guestNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SysteGuestNetwork, TrafficType.Guest); guestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(guestNetworkOffering); _systemNetworks.put(NetworkOfferingVO.SysteGuestNetwork, guestNetworkOffering); - - NetworkOfferingVO defaultGuestNetworkOffering = new NetworkOfferingVO(NetworkOffering.DefaultVirtualizedNetworkOffering, "Virtual Vlan", TrafficType.Guest, false, false, rateMbps, multicastRateMbps, null, true, Availability.Required, false, false, false, false, false, false, false); + + NetworkOfferingVO defaultGuestNetworkOffering = new NetworkOfferingVO(NetworkOffering.DefaultVirtualizedNetworkOffering, "Virtual Vlan", TrafficType.Guest, false, false, null, null, null, true, Availability.Required, false, false, false, false, + false, false, false); defaultGuestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultGuestNetworkOffering); - NetworkOfferingVO defaultGuestDirectNetworkOffering = new NetworkOfferingVO(NetworkOffering.DefaultDirectNetworkOffering, "Direct", TrafficType.Public, false, false, rateMbps, multicastRateMbps, null, true, Availability.Required, false, false, false, false, false, false, false); + NetworkOfferingVO defaultGuestDirectNetworkOffering = new NetworkOfferingVO(NetworkOffering.DefaultDirectNetworkOffering, "Direct", TrafficType.Public, false, false, null, null, null, true, Availability.Required, false, false, false, false, false, + false, false); defaultGuestDirectNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultGuestDirectNetworkOffering); - + AccountsUsingNetworkSearch = _accountDao.createSearchBuilder(); SearchBuilder networkAccountSearch = _networksDao.createSearchBuilderForAccount(); AccountsUsingNetworkSearch.join("nc", networkAccountSearch, AccountsUsingNetworkSearch.entity().getId(), networkAccountSearch.entity().getAccountId(), JoinType.INNER); networkAccountSearch.and("config", networkAccountSearch.entity().getNetworkId(), SearchCriteria.Op.EQ); networkAccountSearch.and("owner", networkAccountSearch.entity().isOwner(), SearchCriteria.Op.EQ); AccountsUsingNetworkSearch.done(); - + AssignIpAddressSearch = _ipAddressDao.createSearchBuilder(); AssignIpAddressSearch.and("dc", AssignIpAddressSearch.entity().getDataCenterId(), Op.EQ); AssignIpAddressSearch.and("allocated", AssignIpAddressSearch.entity().getAllocatedTime(), Op.NULL); + AssignIpAddressSearch.and("vlanId", AssignIpAddressSearch.entity().getVlanId(), Op.EQ); SearchBuilder vlanSearch = _vlanDao.createSearchBuilder(); vlanSearch.and("type", vlanSearch.entity().getVlanType(), Op.EQ); vlanSearch.and("networkId", vlanSearch.entity().getNetworkId(), Op.EQ); AssignIpAddressSearch.join("vlan", vlanSearch, vlanSearch.entity().getId(), AssignIpAddressSearch.entity().getVlanId(), JoinType.INNER); AssignIpAddressSearch.done(); - + AssignIpAddressFromPodVlanSearch = _ipAddressDao.createSearchBuilder(); AssignIpAddressFromPodVlanSearch.and("dc", AssignIpAddressFromPodVlanSearch.entity().getDataCenterId(), Op.EQ); AssignIpAddressFromPodVlanSearch.and("allocated", AssignIpAddressFromPodVlanSearch.entity().getAllocatedTime(), Op.NULL); @@ -734,10 +662,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag podVlanSearch.and("networkId", podVlanSearch.entity().getNetworkId(), Op.EQ); SearchBuilder podVlanMapSB = _podVlanMapDao.createSearchBuilder(); podVlanMapSB.and("podId", podVlanMapSB.entity().getPodId(), Op.EQ); - AssignIpAddressFromPodVlanSearch.join("podVlanMapSB", podVlanMapSB, podVlanMapSB.entity().getVlanDbId(), AssignIpAddressFromPodVlanSearch.entity().getVlanId(), JoinType.INNER); + AssignIpAddressFromPodVlanSearch.join("podVlanMapSB", podVlanMapSB, podVlanMapSB.entity().getVlanDbId(), AssignIpAddressFromPodVlanSearch.entity().getVlanId(), JoinType.INNER); AssignIpAddressFromPodVlanSearch.join("vlan", podVlanSearch, podVlanSearch.entity().getId(), AssignIpAddressFromPodVlanSearch.entity().getVlanId(), JoinType.INNER); AssignIpAddressFromPodVlanSearch.done(); - + IpAddressSearch = _ipAddressDao.createSearchBuilder(); IpAddressSearch.and("accountId", IpAddressSearch.entity().getAllocatedToAccountId(), Op.EQ); IpAddressSearch.and("dataCenterId", IpAddressSearch.entity().getDataCenterId(), Op.EQ); @@ -746,13 +674,20 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag IpAddressSearch.join("virtualNetworkVlanSB", virtualNetworkVlanSB, IpAddressSearch.entity().getVlanId(), virtualNetworkVlanSB.entity().getId(), JoinBuilder.JoinType.INNER); IpAddressSearch.done(); + NicForTrafficTypeSearch = _nicDao.createSearchBuilder(); + SearchBuilder networkSearch = _networksDao.createSearchBuilder(); + NicForTrafficTypeSearch.join("network", networkSearch, networkSearch.entity().getId(), NicForTrafficTypeSearch.entity().getNetworkId(), JoinType.INNER); + NicForTrafficTypeSearch.and("instance", NicForTrafficTypeSearch.entity().getInstanceId(), Op.EQ); + networkSearch.and("traffictype", networkSearch.entity().getTrafficType(), Op.EQ); + NicForTrafficTypeSearch.done(); + _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Network-Scavenger")); s_logger.info("Network Manager is configured."); return true; } - + @Override public String getName() { return _name; @@ -790,7 +725,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return setupNetwork(owner, offering, null, plan, name, displayText, isShared, isDefault); } - @Override @DB + @Override + @DB public List setupNetwork(Account owner, NetworkOfferingVO offering, Network predefined, DeploymentPlan plan, String name, String displayText, boolean isShared, boolean isDefault) throws ConcurrentOperationException { Transaction.currentTxn(); Account locked = _accountDao.acquireInLockTable(owner.getId()); @@ -798,7 +734,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag throw new ConcurrentOperationException("Unable to acquire lock on " + owner); } try { - + if (predefined == null || (predefined.getBroadcastUri() == null && predefined.getBroadcastDomainType() != BroadcastDomainType.Vlan)) { List configs = _networksDao.listBy(owner.getId(), offering.getId(), plan.getDataCenterId()); if (configs.size() > 0) { @@ -807,40 +743,40 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } return configs; } - } - + } + List configs = new ArrayList(); - + long related = -1; - + for (NetworkGuru guru : _networkGurus) { Network config = guru.design(offering, plan, predefined, owner); if (config == null) { continue; } - + if (config.getId() != -1) { if (config instanceof NetworkVO) { - configs.add((NetworkVO)config); + configs.add((NetworkVO) config); } else { configs.add(_networksDao.findById(config.getId())); } continue; } - + long id = _networksDao.getNextInSequence(Long.class, "id"); if (related == -1) { related = id; - } - + } + NetworkVO vo = new NetworkVO(id, config, offering.getId(), plan.getDataCenterId(), guru.getName(), owner.getDomainId(), owner.getId(), related, name, displayText, isShared, isDefault); configs.add(_networksDao.persist(vo, vo.getGuestType() != null)); } - + if (configs.size() < 1) { throw new CloudRuntimeException("Unable to convert network offering to network profile: " + offering.getId()); } - + return configs; } finally { s_logger.debug("Releasing lock for " + locked); @@ -861,7 +797,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return offerings; } - @Override @DB + @Override + @DB public void allocate(VirtualMachineProfile vm, List> networks) throws InsufficientCapacityException, ConcurrentOperationException { Transaction txn = Transaction.currentTxn(); txn.start(); @@ -882,11 +819,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag requested.setMode(config.getMode()); } NicProfile profile = concierge.allocate(config, requested, vm); - + if (vm != null && vm.getVirtualMachine().getType() == Type.User && config.isDefault()) { profile.setDefaultNic(true); } - + if (profile == null) { continue; } @@ -917,7 +854,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag deviceIds[devId] = true; nics.add(vo); - vm.addNic(new NicProfile(vo, network.first(), vo.getBroadcastUri(), vo.getIsolationUri())); + + NetworkOffering no = _configMgr.getNetworkOffering(config.getNetworkOfferingId()); + Integer networkRate = _configMgr.getNetworkRate(no.getId()); + vm.addNic(new NicProfile(vo, network.first(), vo.getBroadcastUri(), vo.getIsolationUri(), networkRate)); } if (nics.size() == 1) { @@ -930,10 +870,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag protected Integer applyProfileToNic(NicVO vo, NicProfile profile, Integer deviceId) { if (profile.getDeviceId() != null) { vo.setDeviceId(profile.getDeviceId()); - } else if (deviceId != null ) { + } else if (deviceId != null) { vo.setDeviceId(deviceId++); } - + vo.setReservationStrategy(profile.getReservationStrategy()); vo.setDefaultNic(profile.isDefaultNic()); @@ -990,6 +930,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag to.setDns2(profile.getDns2()); } + Integer networkRate = _configMgr.getNetworkRate(config.getNetworkOfferingId()); + to.setNetworkRateMbps(networkRate); + return to; } @@ -1019,7 +962,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId()); network.setReservationId(context.getReservationId()); network.setState(Network.State.Implementing); - + _networksDao.update(networkId, network); Network result = guru.implement(network, offering, dest, context); @@ -1037,7 +980,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } element.implement(network, offering, dest, context); } - + network.setState(Network.State.Implemented); _networksDao.update(network.getId(), network); implemented.set(guru, network); @@ -1052,7 +995,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag _networksDao.releaseFromLockTable(networkId); } } - + @DB protected void updateNic(NicVO nic, long networkId, int count) { Transaction txn = Transaction.currentTxn(); @@ -1069,9 +1012,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag Pair implemented = implementNetwork(nic.getNetworkId(), dest, context); NetworkGuru concierge = implemented.first(); NetworkVO network = implemented.second(); + NetworkOffering no = _configMgr.getNetworkOffering(network.getNetworkOfferingId()); + Integer networkRate = _configMgr.getNetworkRate(no.getId()); NicProfile profile = null; - if (nic.getReservationStrategy() == ReservationStrategy.Start) { - nic.setState(Resource.State.Reserving); + if (nic.getReservationStrategy() == Nic.ReservationStrategy.Start) { + nic.setState(Nic.State.Reserving); nic.setReservationId(context.getReservationId()); _nicDao.update(nic.getId(), nic); URI broadcastUri = nic.getBroadcastUri(); @@ -1081,7 +1026,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag URI isolationUri = nic.getIsolationUri(); - profile = new NicProfile(nic, network, broadcastUri, isolationUri); + profile = new NicProfile(nic, network, broadcastUri, isolationUri, networkRate); concierge.reserve(profile, network, vmProfile, dest, context); nic.setIp4Address(profile.getIp4Address()); nic.setIp6Address(profile.getIp6Address()); @@ -1089,17 +1034,17 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag nic.setIsolationUri(profile.getIsolationUri()); nic.setBroadcastUri(profile.getBroadCastUri()); nic.setReserver(concierge.getName()); - nic.setState(Resource.State.Reserved); + nic.setState(Nic.State.Reserved); nic.setNetmask(profile.getNetmask()); nic.setGateway(profile.getGateway()); nic.setAddressFormat(profile.getFormat()); updateNic(nic, network.getId(), 1); } else { - profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri()); + profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), networkRate); nic.setState(Nic.State.Reserved); updateNic(nic, network.getId(), 1); } - + for (NetworkElement element : _networkElements) { if (s_logger.isDebugEnabled()) { s_logger.debug("Asking " + element.getName() + " to prepare for " + nic); @@ -1110,19 +1055,20 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag vmProfile.addNic(profile); } } - + @Override public void prepareNicForMigration(VirtualMachineProfile vm, DeployDestination dest) { List nics = _nicDao.listBy(vm.getId()); for (NicVO nic : nics) { Network network = _networksDao.findById(nic.getNetworkId()); - - NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri()); - + NetworkOffering no = _configMgr.getNetworkOffering(network.getNetworkOfferingId()); + Integer networkRate = _configMgr.getNetworkRate(no.getId()); + + NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), networkRate); + vm.addNic(profile); } } - @Override public void release(VirtualMachineProfile vmProfile, boolean forced) { @@ -1131,13 +1077,13 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag NetworkVO network = _networksDao.findById(nic.getNetworkId()); if (nic.getState() == Nic.State.Reserved || nic.getState() == Nic.State.Reserving) { Nic.State originalState = nic.getState(); - if (nic.getReservationStrategy() == ReservationStrategy.Start) { + if (nic.getReservationStrategy() == Nic.ReservationStrategy.Start) { NetworkGuru concierge = _networkGurus.get(network.getGuruName()); - nic.setState(Resource.State.Releasing); + nic.setState(Nic.State.Releasing); _nicDao.update(nic.getId(), nic); - NicProfile profile = new NicProfile(nic, network, null, null); + NicProfile profile = new NicProfile(nic, network, null, null, null); if (concierge.release(profile, vmProfile, nic.getReservationId())) { - nic.setState(Resource.State.Allocated); + nic.setState(Nic.State.Allocated); if (originalState == Nic.State.Reserved) { updateNic(nic, network.getId(), -1); } else { @@ -1148,7 +1094,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag nic.setState(Nic.State.Allocated); updateNic(nic, network.getId(), -1); } - } + } } } @@ -1175,7 +1121,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag // Verify input parameters Account accountByIp = findAccountByIpAddress(ipAddress); - if(accountByIp == null) { + if (accountByIp == null) { throw new InvalidParameterValueException("Unable to find account owner for ip " + ipAddress); } @@ -1208,8 +1154,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag // FIXME: is the user visible in the admin account's domain???? if (!BaseCmd.isAdmin(account.getType())) { if (s_logger.isDebugEnabled()) { - s_logger.debug("permission denied disassociating IP address " + ipAddress + "; acct: " + accountId + "; ip (acct / dc / dom / alloc): " - + ipVO.getAllocatedToAccountId() + " / " + ipVO.getDataCenterId() + " / " + ipVO.getAllocatedInDomainId() + " / " + ipVO.getAllocatedTime()); + s_logger.debug("permission denied disassociating IP address " + ipAddress + "; acct: " + accountId + "; ip (acct / dc / dom / alloc): " + ipVO.getAllocatedToAccountId() + " / " + ipVO.getDataCenterId() + " / " + + ipVO.getAllocatedInDomainId() + " / " + ipVO.getAllocatedTime()); } throw new PermissionDeniedException("User/account does not own supplied address"); } @@ -1228,16 +1174,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag 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.getVlanId()) != null){ + // Check for account wide pool. It will have an entry for account_vlan_map. + if (_accountVlanMapDao.findAccountVlanMap(accountId, ipVO.getVlanId()) != null) { throw new PermissionDeniedException(ipAddress + " belongs to Account wide IP pool and cannot be disassociated"); } - boolean success = releasePublicIpAddress(ipAddress, accountId, userId); - if (success) { - _accountMgr.decrementResourceCount(accountId, ResourceType.public_ip); - } - return success; + return releasePublicIpAddress(ipAddress, accountId, userId); } catch (PermissionDeniedException pde) { throw pde; @@ -1249,7 +1191,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - @Override public List getAccountsUsingNetwork(long networkId) { SearchCriteria sc = AccountsUsingNetworkSearch.create(); @@ -1282,27 +1223,28 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (mac == null) { throw new InsufficientAddressCapacityException("Unable to create another mac address", Network.class, networkId); } - + return mac; } - @Override @DB + @Override + @DB public Network getNetwork(long id) { return _networksDao.findById(id); } - + @Override public List getRemoteAccessVpnElements() { List elements = new ArrayList(); for (NetworkElement element : _networkElements) { if (element instanceof RemoteAccessVpnElement) { - elements.add((RemoteAccessVpnElement)element); + elements.add((RemoteAccessVpnElement) element); } } - + return elements; } - + @Override public void cleanupNics(VirtualMachineProfile vm) { List nics = _nicDao.listBy(vm.getId()); @@ -1310,17 +1252,23 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag nic.setState(Nic.State.Deallocating); _nicDao.update(nic.getId(), nic); NetworkVO network = _networksDao.findById(nic.getNetworkId()); - NicProfile profile = new NicProfile(nic, network, null, null); + NicProfile profile = new NicProfile(nic, network, null, null, null); NetworkGuru guru = _networkGurus.get(network.getGuruName()); guru.deallocate(network, profile, vm); _nicDao.remove(nic.getId()); } } - - @Override @DB - public Network createNetwork(CreateNetworkCmd cmd) throws InvalidParameterValueException, PermissionDeniedException{ - Account ctxAccount = UserContext.current().getCaller(); - Long userId = UserContext.current().getCallerUserId(); + + @Override + public void expungeNics(VirtualMachineProfile vm) { + List nics = _nicDao.listIncludingRemovedBy(vm.getId()); + for (NicVO nic : nics) { + _nicDao.expunge(nic.getId()); + } + } + + @Override + public Network createNetwork(CreateNetworkCmd cmd) throws InvalidParameterValueException, PermissionDeniedException { Long networkOfferingId = cmd.getNetworkOfferingId(); Long zoneId = cmd.getZoneId(); String gateway = cmd.getGateway(); @@ -1328,30 +1276,43 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag String endIP = cmd.getEndIp(); String netmask = cmd.getNetmask(); String networkDomain = cmd.getNetworkDomain(); - String cidr = null; - Boolean isDefault = cmd.isDefault(); - if (gateway != null && netmask != null) { - cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask); - } - String accountName = cmd.getAccountName(); - Long domainId = cmd.getDomainId(); String vlanId = cmd.getVlan(); String name = cmd.getNetworkName(); String displayText = cmd.getDisplayText(); Boolean isShared = cmd.getIsShared(); + Boolean isDefault = cmd.isDefault(); - //if end ip is not specified, default it to startIp + //finalize owner for the network + Account ctxAccount = UserContext.current().getCaller(); + String accountName = cmd.getAccountName(); + Long domainId = cmd.getDomainId(); + + Account owner = _accountMgr.finalizeOwner(ctxAccount, accountName, domainId); + + return createNetwork(networkOfferingId, name, displayText, isShared, isDefault, zoneId, gateway, startIP, endIP, netmask, vlanId, networkDomain, owner); + } + + @Override @DB + public Network createNetwork(long networkOfferingId, String name, String displayText, Boolean isShared, Boolean isDefault, Long zoneId, String gateway, String startIP, String endIP, String netmask, String vlanId, String networkDomain, Account owner) throws InvalidParameterValueException, PermissionDeniedException { + Account ctxAccount = UserContext.current().getCaller(); + Long userId = UserContext.current().getCallerUserId(); + String cidr = null; + if (gateway != null && netmask != null) { + cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask); + } + + // if end ip is not specified, default it to startIp if (endIP == null && startIP != null) { endIP = startIP; } - - //Check if network offering exists + + // Check if network offering exists NetworkOfferingVO networkOffering = _networkOfferingDao.findById(networkOfferingId); if (networkOffering == null || networkOffering.isSystemOnly()) { throw new InvalidParameterValueException("Unable to find network offeirng by id " + networkOfferingId); } - - //allow isDefault to be set only for Virtual network + + // allow isDefault to be set only for Virtual network if (networkOffering.getTrafficType() == TrafficType.Guest) { if (isDefault != null) { throw new InvalidParameterValueException("Can specify isDefault parameter only for Public network. "); @@ -1363,128 +1324,111 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag isDefault = false; } } - - //If networkDomain is not specified, take it from the global configuration + + // If networkDomain is not specified, take it from the global configuration if (networkDomain == null) { networkDomain = _networkDomain; } - - //Check if zone exists + + // Check if zone exists if (zoneId == null || ((_dcDao.findById(zoneId)) == null)) { throw new InvalidParameterValueException("Please specify a valid zone."); - } - + } + DataCenter zone = _dcDao.findById(zoneId); if (zone.getNetworkType() == NetworkType.Basic) { throw new InvalidParameterValueException("Network creation is not allowed in zone with network type " + NetworkType.Basic); } - - Account owner = _accountMgr.finalizeOwner(ctxAccount, accountName, domainId); - - //Don't allow to create network with vlan that already exists in the system + + // Don't allow to create network with vlan that already exists in the system if (vlanId != null) { - String uri ="vlan://" + vlanId; + String uri = "vlan://" + vlanId; List networks = _networksDao.listBy(zoneId, uri); if ((networks != null && !networks.isEmpty())) { throw new InvalidParameterValueException("Network with vlan " + vlanId + " already exists in zone " + zoneId); } } - - //VlanId can be specified only when network offering supports it + + // VlanId can be specified only when network offering supports it if (ctxAccount.getType() == Account.ACCOUNT_TYPE_NORMAL && vlanId != null && !networkOffering.getSpecifyVlan()) { throw new InvalidParameterValueException("Can't specify vlan because network offering doesn't support it"); } - - Transaction txn = Transaction.currentTxn(); - txn.start(); - try { - //Create network - DataCenterDeployment plan = new DataCenterDeployment(zoneId, null, null, null); - NetworkVO userNetwork = new NetworkVO(); - userNetwork.setNetworkDomain(networkDomain); - - //cidr should be set only when the user is admin - if (ctxAccount.getType() == Account.ACCOUNT_TYPE_ADMIN) { - if (cidr != null && gateway != null) { - userNetwork.setCidr(cidr); - userNetwork.setGateway(gateway); - if (vlanId != null) { - userNetwork.setBroadcastUri(URI.create("vlan://" + vlanId)); - userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan); - if (!vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) { - userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan); - } else { - userNetwork.setBroadcastDomainType(BroadcastDomainType.Native); - } - } - } - } - - List networks = setupNetwork(owner, networkOffering, userNetwork, plan, name, displayText, isShared, isDefault); - Long networkId = null; - - Network network = null; - if (networks == null || networks.isEmpty()) { - txn.rollback(); - throw new CloudRuntimeException("Fail to create a network"); - } else { - network = networks.get(0); - networkId = networks.get(0).getId(); - if (network.getGuestType() == GuestIpType.Virtual) { - s_logger.debug("Creating a source natp ip for " + network); - PublicIp ip = assignSourceNatIpAddress(owner, network, userId); - if (ip == null) { - throw new InsufficientAddressCapacityException("Unable to assign source nat ip address to owner for this network", DataCenter.class, zoneId); - } - } - } - - Long ownerId = owner.getId(); - //Don't pass owner to create vlan when network offering is of type Direct - done to prevent accountVlanMap entry creation when vlan is mapped to network - if (network.getGuestType() == GuestIpType.Direct) { - owner = null; - } - - if (ctxAccount.getType() == Account.ACCOUNT_TYPE_ADMIN && network.getGuestType() == GuestIpType.Direct && startIP != null && endIP != null && gateway != null) { - //Create vlan ip range - Vlan vlan = _configMgr.createVlanAndPublicIpRange(userId, zoneId, null, startIP, endIP, gateway, netmask, false, vlanId, owner, networkId); - if (vlan == null) { - txn.rollback(); - throw new CloudRuntimeException("Failed to create a vlan"); - } - } - txn.commit(); - - String eventMsg = "Successfully created network " + name + " (networkOfferingId=" + networkOfferingId + ", isShared=" + isShared + ", ownerId=" + ownerId + ", netmask=" + netmask + ", startIP=" + startIP + ", endIP=" + endIP + ", gateway=" + gateway + ", vlan=" + vlanId + ")"; - if (networks != null && !networks.isEmpty()) { - _configMgr.saveConfigurationEvent(userId, ownerId, EventTypes.EVENT_NETWORK_CREATE, eventMsg, - "dcId=" + zoneId, - "networkOfferingId=" + networkOfferingId, - "name=" + name, - "isShared=" + isShared, - "ownerId=" + ownerId, - "networkGateway=" + gateway, - "networkNetmask=" + netmask, - "startIP=" + startIP, - "endIP=" + endIP, - "vlan=" + vlanId); - } - - return networks.get(0); - } catch (Exception ex) { - s_logger.warn("Unexpected exception while creating network ", ex); - txn.rollback(); - } finally { - txn.close(); - } - return null; + + Transaction txn = Transaction.currentTxn(); + txn.start(); + try { + // Create network + DataCenterDeployment plan = new DataCenterDeployment(zoneId, null, null, null); + NetworkVO userNetwork = new NetworkVO(); + userNetwork.setNetworkDomain(networkDomain); + + // cidr should be set only when the user is admin + if (ctxAccount.getType() == Account.ACCOUNT_TYPE_ADMIN) { + if (cidr != null && gateway != null) { + userNetwork.setCidr(cidr); + userNetwork.setGateway(gateway); + if (vlanId != null) { + userNetwork.setBroadcastUri(URI.create("vlan://" + vlanId)); + userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan); + if (!vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) { + userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan); + } else { + userNetwork.setBroadcastDomainType(BroadcastDomainType.Native); + } + } + } + } + + List networks = setupNetwork(owner, networkOffering, userNetwork, plan, name, displayText, isShared, isDefault); + Long networkId = null; + + Network network = null; + if (networks == null || networks.isEmpty()) { + txn.rollback(); + throw new CloudRuntimeException("Fail to create a network"); + } else { + network = networks.get(0); + networkId = networks.get(0).getId(); + if (network.getGuestType() == GuestIpType.Virtual) { + s_logger.debug("Creating a source natp ip for " + network); + PublicIp ip = assignSourceNatIpAddress(owner, network, userId); + if (ip == null) { + throw new InsufficientAddressCapacityException("Unable to assign source nat ip address to owner for this network", DataCenter.class, zoneId); + } + } + } + + // Don't pass owner to create vlan when network offering is of type Direct - done to prevent accountVlanMap entry + // creation when vlan is mapped to network + if (network.getGuestType() == GuestIpType.Direct) { + owner = null; + } + + if (ctxAccount.getType() == Account.ACCOUNT_TYPE_ADMIN && network.getGuestType() == GuestIpType.Direct && startIP != null && endIP != null && gateway != null) { + // Create vlan ip range + Vlan vlan = _configMgr.createVlanAndPublicIpRange(userId, zoneId, null, startIP, endIP, gateway, netmask, false, vlanId, owner, networkId); + if (vlan == null) { + txn.rollback(); + throw new CloudRuntimeException("Failed to create a vlan"); + } + } + txn.commit(); + + return networks.get(0); + } catch (Exception ex) { + s_logger.warn("Unexpected exception while creating network ", ex); + txn.rollback(); + } finally { + txn.close(); + } + return null; } - + @Override - public List searchForNetworks(ListNetworksCmd cmd) { - Object id = cmd.getId(); + public List searchForNetworks(ListNetworksCmd cmd) { + Object id = cmd.getId(); Object keyword = cmd.getKeyword(); - Long zoneId= cmd.getZoneId(); + Long zoneId = cmd.getZoneId(); Account account = UserContext.current().getCaller(); Long domainId = cmd.getDomainId(); String accountName = cmd.getAccountName(); @@ -1494,16 +1438,16 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag Boolean isShared = cmd.getIsShared(); Boolean isDefault = cmd.isDefault(); Long accountId = null; - + if (isSystem == null) { isSystem = false; } - - //Account/domainId parameters and isSystem are mutually exclusive + + // Account/domainId parameters and isSystem are mutually exclusive if (isSystem && (accountName != null || domainId != null)) { throw new InvalidParameterValueException("System network belongs to system, account and domainId parameters can't be specified"); } - + if (_accountMgr.isAdmin(account.getType())) { if (domainId != null) { if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId)) { @@ -1525,83 +1469,84 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag domainId = account.getDomainId(); accountId = account.getId(); } - + Filter searchFilter = new Filter(NetworkVO.class, "id", false, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _networksDao.createSearchBuilder(); - - //Don't display networks created of system network offerings - SearchBuilder networkOfferingSearch = _networkOfferingDao.createSearchBuilder(); + + // Don't display networks created of system network offerings + SearchBuilder networkOfferingSearch = _networkOfferingDao.createSearchBuilder(); networkOfferingSearch.and("systemOnly", networkOfferingSearch.entity().isSystemOnly(), SearchCriteria.Op.EQ); if (isSystem) { networkOfferingSearch.and("trafficType", networkOfferingSearch.entity().getTrafficType(), SearchCriteria.Op.EQ); - } - sb.join("networkOfferingSearch", networkOfferingSearch, sb.entity().getNetworkOfferingId(), networkOfferingSearch.entity().getId(), JoinBuilder.JoinType.INNER); - - SearchBuilder zoneSearch = _dcDao.createSearchBuilder(); + } + sb.join("networkOfferingSearch", networkOfferingSearch, sb.entity().getNetworkOfferingId(), networkOfferingSearch.entity().getId(), JoinBuilder.JoinType.INNER); + + SearchBuilder zoneSearch = _dcDao.createSearchBuilder(); zoneSearch.and("networkType", zoneSearch.entity().getNetworkType(), SearchCriteria.Op.EQ); sb.join("zoneSearch", zoneSearch, sb.entity().getDataCenterId(), zoneSearch.entity().getId(), JoinBuilder.JoinType.INNER); - + SearchCriteria sc = sb.create(); - + if (!isSystem) { sc.setJoinParameters("networkOfferingSearch", "systemOnly", false); } else { sc.setJoinParameters("networkOfferingSearch", "systemOnly", true); sc.setJoinParameters("zoneSearch", "networkType", NetworkType.Advanced.toString()); } - + if (keyword != null) { SearchCriteria ssc = _networksDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); sc.addAnd("name", SearchCriteria.Op.SC, ssc); - } + } if (id != null) { sc.addAnd("id", SearchCriteria.Op.EQ, id); } - + if (zoneId != null) { sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId); } - + if (type != null) { sc.addAnd("guestType", SearchCriteria.Op.EQ, type); } - + if (!isSystem && (isShared == null || !isShared) && accountName != null && domainId != null) { - sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); - sc.addAnd("isShared", SearchCriteria.Op.EQ, false); + sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); + sc.addAnd("isShared", SearchCriteria.Op.EQ, false); } - + if (isShared != null) { sc.addAnd("isShared", SearchCriteria.Op.EQ, isShared); } - + if (isDefault != null) { sc.addAnd("isDefault", SearchCriteria.Op.EQ, isDefault); } - + if (trafficType != null) { sc.addAnd("trafficType", SearchCriteria.Op.EQ, trafficType); } - - List networks = _networksDao.search(sc, searchFilter); - + + List networks = _networksDao.search(sc, searchFilter); + return networks; } - - @Override @DB - public boolean deleteNetwork(long networkId) throws InvalidParameterValueException, PermissionDeniedException{ + + @Override + @DB + public boolean deleteNetwork(long networkId) throws InvalidParameterValueException, PermissionDeniedException { Long userId = UserContext.current().getCallerUserId(); Account caller = UserContext.current().getCaller(); - //Verify network id + // Verify network id NetworkVO network = _networksDao.findById(networkId); if (network == null) { throw new InvalidParameterValueException("unable to find network " + networkId); - } - - //Perform permission check + } + + // Perform permission check if (!_accountMgr.isAdmin(caller.getType())) { if (network.getAccountId() != caller.getId()) { throw new PermissionDeniedException("Account " + caller.getAccountName() + " does not own network id=" + networkId + ", permission denied"); @@ -1610,11 +1555,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag Account owner = _accountMgr.getAccount(network.getAccountId()); _accountMgr.checkAccess(caller, owner); } - - return this.destroyNetwork(networkId, userId); + + return this.destroyNetwork(networkId, userId); } - - @Override @DB + + @Override + @DB public void shutdownNetwork(long networkId) { Transaction txn = Transaction.currentTxn(); txn.start(); @@ -1630,7 +1576,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag network.setState(Network.State.Shutdown); _networksDao.update(network.getId(), network); txn.commit(); - + boolean success = true; for (NetworkElement element : _networkElements) { try { @@ -1649,13 +1595,13 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag success = false; } } - + txn.start(); if (success) { if (s_logger.isDebugEnabled()) { s_logger.debug("Network id=" + networkId + " is shutdown successfully, cleaning up corresponding resources now."); } - NetworkGuru guru = _networkGurus.get(network.getGuruName()); + NetworkGuru guru = _networkGurus.get(network.getGuruName()); guru.destroy(network, _networkOfferingDao.findById(network.getNetworkOfferingId())); network.setBroadcastUri(null); network.setState(Network.State.Allocated); @@ -1667,20 +1613,20 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } txn.commit(); } - - - @DB @Override + + @DB + @Override public boolean destroyNetwork(long networkId, long callerUserId) { NetworkVO network = _networksDao.findById(networkId); if (network == null) { s_logger.debug("Unable to find network with id: " + networkId); return false; } - - //Shutdown network first + + // Shutdown network first shutdownNetwork(networkId); - - //get updated state for the network + + // get updated state for the network network = _networksDao.findById(networkId); if (network.getState() != Network.State.Allocated && network.getState() != Network.State.Setup) { s_logger.debug("Network is not not in the correct state to be destroyed: " + network.getState()); @@ -1688,6 +1634,22 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } boolean success = true; + + //release ip addresses associated with the network if there are any + List ipsToRelease = _ipAddressDao.listByAssociatedNetwork(networkId); + if (ipsToRelease != null && !ipsToRelease.isEmpty()) { + for (IPAddressVO ip : ipsToRelease) { + if (!releasePublicIpAddress(ip.getAddress(), ip.getAccountId(), callerUserId)) { + s_logger.warn("Failed to deallocate ip address as a part of network id=" + networkId + " destroy"); + success = false; + } + } + + if (success) { + s_logger.debug("Ip addresses are deallocated successfully as a part of network id=" + networkId + " destroy"); + } + } + for (NetworkElement element : _networkElements) { try { if (s_logger.isDebugEnabled()) { @@ -1705,35 +1667,33 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag success = false; } } - + if (success) { if (s_logger.isDebugEnabled()) { s_logger.debug("Network id=" + networkId + " is destroyed successfully, cleaning up corresponding resources now."); } - NetworkGuru guru = _networkGurus.get(network.getGuruName()); + NetworkGuru guru = _networkGurus.get(network.getGuruName()); Account owner = _accountMgr.getAccount(network.getAccountId()); - + Transaction txn = Transaction.currentTxn(); - txn.start(); + txn.start(); guru.trash(network, _networkOfferingDao.findById(network.getNetworkOfferingId()), owner); + if (!deleteVlansInNetwork(network.getId(), callerUserId)) { success = false; s_logger.warn("Failed to delete network " + network + "; was unable to cleanup corresponding ip ranges"); } else { - //commit transaction only when ips and vlans for the network are released successfully + // commit transaction only when ips and vlans for the network are released successfully network.setState(Network.State.Destroy); _networksDao.update(network.getId(), network); _networksDao.remove(network.getId()); txn.commit(); - String eventMsg = "Successfully deleted network " + network.getName() + " (id=" + networkId + ")"; - _configMgr.saveConfigurationEvent(callerUserId, network.getAccountId(), EventTypes.EVENT_NETWORK_DELETE, eventMsg, "id=" + networkId, "dcId=" + network.getDataCenterId(), "accountId=" + network.getAccountId()); } - } - + } + return success; } - - + private boolean deleteVlansInNetwork(long networkId, long userId) { List vlans = _vlanDao.listVlansByNetworkId(networkId); boolean result = true; @@ -1741,18 +1701,18 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (!_configMgr.deleteVlanAndPublicIpRange(_accountMgr.getSystemUser().getId(), vlan.getId())) { s_logger.warn("Failed to delete vlan " + vlan.getId() + ");"); result = false; - } + } } return result; } - + @Override public boolean applyRules(List rules, boolean continueOnError) throws ResourceUnavailableException { if (rules == null || rules.size() == 0) { s_logger.debug("There are no rules to forward to the network elements"); return true; } - + boolean success = true; Network network = _networksDao.findById(rules.get(0).getNetworkId()); for (NetworkElement ne : _networkElements) { @@ -1767,10 +1727,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag success = false; } } - + return success; } - + public class NetworkGarbageCollector implements Runnable { @Override @@ -1779,7 +1739,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag List shutdownList = new ArrayList(); long currentTime = System.currentTimeMillis() >> 10; HashMap stillFree = new HashMap(); - + List networkIds = _networksDao.findNetworksToGarbageCollect(); for (Long networkId : networkIds) { Long time = _lastNetworkIdsToFree.remove(networkId); @@ -1797,9 +1757,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag shutdownList.add(networkId); } } - + _lastNetworkIdsToFree = stillFree; - + for (Long networkId : shutdownList) { try { shutdownNetwork(networkId); @@ -1812,73 +1772,49 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } } - + @Override - public boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException { - //This method reapplies Ip addresses, LoadBalancer and PortForwarding rules - Account caller = UserContext.current().getCaller(); + public boolean restartNetwork(RestartNetworkCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { + // This method restarts all network elements belonging to the network Long networkId = cmd.getNetworkId(); - Network network = null; - if (networkId != null) { - network = _networksDao.findById(networkId); - if (network == null) { - throw new InvalidParameterValueException("Network id is invalid: " + networkId); - } - } + Network network = _networksDao.findById(networkId); + Account owner = _accountMgr.getAccount(network.getAccountId()); + User caller = _accountMgr.getActiveUser(UserContext.current().getCallerUserId()); + Account callerAccount = _accountMgr.getActiveAccount(caller.getAccountId()); - Account owner = _accountMgr.getActiveAccount(cmd.getEntityOwnerId()); - if (!_accountMgr.isAdmin(caller.getType())) { - _accountMgr.checkAccess(caller, network); - } else { - Domain domain = _domainDao.findById(owner.getDomainId()); - _accountMgr.checkAccess(caller, domain); - } + ReservationContext context = new ReservationContextImpl(null, null, caller, owner); + _accountMgr.checkAccess(callerAccount, network); + s_logger.debug("Restarting network " + networkId + "..."); - if (!applyIpAssociations(network, false)) { - s_logger.warn("Failed to apply ips as a part of network " + networkId + " restart"); - return false; - } else { - s_logger.debug("Ip addresses are reapplied successfully as a part of network " + networkId + " restart"); + boolean success = true; + for (NetworkElement element : _networkElements) { + success = element.restart(network, context); + if (!success) { + s_logger.warn("Failed to restart network element " + element + " as a part of network restart"); + return success; + } } - - List lbRules = _lbMgr.listByNetworkId(networkId); - - if (!applyRules(lbRules, true)) { - s_logger.warn("Failed to apply load balancing rules as a part of network " + network.getId() + " restart"); - return false; - } else { - s_logger.debug("Load balancing rules are reapplied successfully as a part of network " + networkId + " restart"); - } - - //Reapply pf rules - List pfRules = _rulesMgr.listByNetworkId(networkId); - if (!applyRules(pfRules, true)) { - s_logger.warn("Failed to apply port forwarding rules as a part of network " + network.getId() + " restart"); - return false; - } else { - s_logger.debug("Port forwarding rules are reapplied successfully as a part of network " + networkId + " restart"); - } - + s_logger.debug("Network " + networkId + " is restarted successfully."); return true; } - + @Override public int getActiveNicsInNetwork(long networkId) { return _networksDao.getActiveNicsIn(networkId); } - + @Override public Map> getZoneCapabilities(long zoneId) { DataCenterVO dc = _dcDao.findById(zoneId); if (dc == null) { throw new InvalidParameterValueException("Zone id=" + zoneId + " doesn't exist in the system."); } - - //Get all service providers from the datacenter - Map providers = new HashMap(); + + // Get all service providers from the datacenter + Map providers = new HashMap(); providers.put(Service.Firewall, dc.getFirewallProvider()); providers.put(Service.Lb, dc.getLoadBalancerProvider()); providers.put(Service.Vpn, dc.getVpnProvider()); @@ -1886,9 +1822,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag providers.put(Service.Gateway, dc.getGatewayProvider()); providers.put(Service.UserData, dc.getUserDataProvider()); providers.put(Service.Dhcp, dc.getDhcpProvider()); - + Map> networkCapabilities = new HashMap>(); - + for (NetworkElement element : _networkElements) { if (providers.isEmpty()) { break; @@ -1903,66 +1839,66 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (zoneProvider.equalsIgnoreCase(element.getProvider().getName())) { if (elementCapabilities.containsKey(service)) { Map capabilities = elementCapabilities.get(service); - //Verify if Service support capability + // Verify if Service support capability if (capabilities != null) { - for (Capability capability : capabilities.keySet()) { - assert(service.containsCapability(capability)) : "Capability " + capability.getName() + " is not supported by the service " + service.getName(); + for (Capability capability : capabilities.keySet()) { + assert (service.containsCapability(capability)) : "Capability " + capability.getName() + " is not supported by the service " + service.getName(); } } networkCapabilities.put(service, capabilities); it.remove(); } } - } + } } } } return networkCapabilities; } - + @Override public Network getSystemNetworkByZoneAndTrafficType(long zoneId, TrafficType trafficType) { - //find system public network offering + // find system public network offering Long networkOfferingId = null; List offerings = _networkOfferingDao.listSystemNetworkOfferings(); - for (NetworkOfferingVO offering: offerings) { + for (NetworkOfferingVO offering : offerings) { if (offering.getTrafficType() == trafficType) { networkOfferingId = offering.getId(); break; } } - + if (networkOfferingId == null) { throw new InvalidParameterValueException("Unable to find system network offering with traffic type " + trafficType); } - + List networks = _networksDao.listBy(Account.ACCOUNT_ID_SYSTEM, networkOfferingId, zoneId); if (networks == null) { throw new InvalidParameterValueException("Unable to find network with traffic type " + trafficType + " in zone " + zoneId); } return networks.get(0); } - + @Override public PublicIpAddress getPublicIpAddress(Ip ip) { IPAddressVO addr = _ipAddressDao.findById(ip); if (addr == null) { return null; } - + return new PublicIp(addr, _vlanDao.findById(addr.getVlanId()), NetUtils.createSequenceBasedMacAddress(addr.getMacAddress())); } - + @Override public List listPodVlans(long podId) { List vlans = _vlanDao.listVlansForPodByType(podId, VlanType.DirectAttached); return vlans; } - + @Override public List listNetworksUsedByVm(long vmId, boolean isSystem) { List networks = new ArrayList(); - + List nics = _nicDao.listBy(vmId); if (nics != null) { for (Nic nic : nics) { @@ -1971,10 +1907,76 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (no.isSystemOnly() == isSystem) { networks.add(network); } - } + } } - + return networks; } + + @Override + public Nic getNicInNetwork(long vmId, long networkId) { + return _nicDao.findByInstanceIdAndNetworkId(networkId, vmId); + } + @Override @DB + public boolean associateIpAddressListToAccount(long userId, long accountId, long zoneId, Long vlanId) throws InsufficientAddressCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + + Account account = _accountMgr.getActiveAccount(accountId); + if (account == null) { + s_logger.warn("Unable to find active account: " + accountId); + } + + Network network = null; + long allocatedIps = 0; + + //create new Virtual network for the user if it doesn't exist + List networks = getVirtualNetworksOwnedByAccountInZone(account.getAccountName(), account.getDomainId(), zoneId); + if (networks.size() == 0) { + List offerings = _configMgr.listNetworkOfferings(TrafficType.Guest, false); + network = createNetwork(offerings.get(0).getId(), account.getAccountName() + "-network", account.getAccountName() + "-network", false, null, zoneId, null, null, null, null, null, null, account); + + if (network == null){ + s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId); + return false; + } else { + //sourceNat ip is allocated as a part of networkCreate + allocatedIps++; + } + } else { + assert (networks.size() <= 1) : "Too many virtual networks. This logic should be obsolete"; + network = networks.get(0); + } + + //Associate ip addresses + long ipCount = _ipAddressDao.countIPs(zoneId, vlanId, false); + if (ipCount > 0) { + while (allocatedIps < ipCount) { + fetchNewPublicIp(zoneId, null, vlanId, account, VlanType.VirtualNetwork, network.getId(), false, true); + allocatedIps++; + } + + if (network.getState() == Network.State.Implemented) { + s_logger.debug("Applying ip associations for vlan id=" + vlanId + " in network " + network); + return applyIpAssociations(network, false); + } else { + s_logger.trace("Network id=" + network.getId() + " is not Implemented, no need to apply ipAssociations"); + return true; + } + } else { + s_logger.trace("Found 0 ips to assign in vlan id=" + vlanId); + return true; + } + } + + @Override + public Nic getNicForTraffic(long vmId, TrafficType type) { + SearchCriteria sc = NicForTrafficTypeSearch.create(); + sc.setParameters("instance", vmId); + sc.setJoinParameters("network", "traffictype", type); + + List vos = _nicDao.search(sc, null); + assert vos.size() <= 1 : "If we have multiple networks of the same type, then this method should no longer be used."; + return vos.size() == 1 ? vos.get(0) : null; + } } diff --git a/server/src/com/cloud/network/dao/IPAddressDao.java b/server/src/com/cloud/network/dao/IPAddressDao.java index f7a179ff1ec..43f4859e068 100644 --- a/server/src/com/cloud/network/dao/IPAddressDao.java +++ b/server/src/com/cloud/network/dao/IPAddressDao.java @@ -34,15 +34,13 @@ public interface IPAddressDao extends GenericDao { List listByDcIdIpAddress(long dcId, String ipAddress); - List listByNetwork(long networkId); + List listByAssociatedNetwork(long networkId); int countIPs(long dcId, long vlanDbId, boolean onlyCountAllocated); int countIPs(long dcId, Long accountId, String vlanId, String vlanGateway, String vlanNetmask); boolean mark(long dcId, Ip ip); - - List assignAcccountSpecificIps(long accountId, long longValue, Long vlanDbId, boolean sourceNat); int countIPsForDashboard(long dcId, boolean onlyCountAllocated); } diff --git a/server/src/com/cloud/network/dao/IPAddressDaoImpl.java b/server/src/com/cloud/network/dao/IPAddressDaoImpl.java index a587266504b..4a0579fd4be 100644 --- a/server/src/com/cloud/network/dao/IPAddressDaoImpl.java +++ b/server/src/com/cloud/network/dao/IPAddressDaoImpl.java @@ -109,35 +109,6 @@ public class IPAddressDaoImpl extends GenericDaoBase implements return update(vo, sc) >= 1; } - @Override - @DB - public List assignAcccountSpecificIps(long accountId, long domainId, Long vlanDbId, boolean sourceNat) { - Transaction txn = Transaction.currentTxn(); - txn.start(); - SearchCriteria sc = AllFieldsSearch.create(); - sc.setParameters("vlan", vlanDbId); - sc.setParameters("sourceNat", sourceNat); - - List ipList = lockRows(sc, null, true); - List ipStringList = new ArrayList(); - - for (IPAddressVO ip : ipList) { - - ip.setAllocatedToAccountId(accountId); - ip.setAllocatedTime(new Date()); - ip.setAllocatedInDomainId(domainId); - ip.setSourceNat(sourceNat); - ip.setState(State.Allocated); - - if (!update(ip.getAddress(), ip)) { - throw new CloudRuntimeException("Unable to update a locked ip address " + ip.getAddress()); - } - ipStringList.add(ip.getAddress().toString()); - } - txn.commit(); - return ipStringList; - } - /** * @deprecated This method is now deprecated because vlan has been * added. The actual method is now within NetworkManager. @@ -203,7 +174,7 @@ public class IPAddressDaoImpl extends GenericDaoBase implements } @Override - public List listByNetwork(long networkId) { + public List listByAssociatedNetwork(long networkId) { SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("network", networkId); diff --git a/server/src/com/cloud/network/element/DhcpElement.java b/server/src/com/cloud/network/element/DhcpElement.java index 3caafa07466..f287c122659 100644 --- a/server/src/com/cloud/network/element/DhcpElement.java +++ b/server/src/com/cloud/network/element/DhcpElement.java @@ -25,6 +25,7 @@ import javax.ejb.Local; import org.apache.log4j.Logger; +import com.cloud.configuration.ConfigurationManager; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.deploy.DeployDestination; @@ -41,6 +42,7 @@ import com.cloud.network.Networks.TrafficType; import com.cloud.network.PublicIpAddress; import com.cloud.network.dao.NetworkDao; import com.cloud.network.router.VirtualNetworkApplianceManager; +import com.cloud.network.router.VirtualRouter; import com.cloud.network.rules.FirewallRule; import com.cloud.offering.NetworkOffering; import com.cloud.uservm.UserVm; @@ -52,6 +54,7 @@ import com.cloud.vm.ReservationContext; import com.cloud.vm.UserVmManager; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; @@ -68,6 +71,7 @@ public class DhcpElement extends AdapterBase implements NetworkElement{ @Inject UserVmManager _userVmMgr; @Inject UserVmDao _userVmDao; @Inject DomainRouterDao _routerDao; + @Inject ConfigurationManager _configMgr; private boolean canHandle(GuestIpType ipType, DeployDestination dest, TrafficType trafficType) { DataCenter dc = dest.getDataCenter(); @@ -163,4 +167,34 @@ public class DhcpElement extends AdapterBase implements NetworkElement{ return capabilities; } + + @Override + public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ + DataCenter dc = _configMgr.getZone(network.getDataCenterId()); + NetworkOffering offering = _configMgr.getNetworkOffering(network.getNetworkOfferingId()); + DeployDestination dest = new DeployDestination(dc, null, null, null); + DomainRouterVO router = _routerDao.findByNetworkConfiguration(network.getId()); + if (router == null) { + s_logger.trace("Can't find dhcp element in network " + network.getId()); + return true; + } + + VirtualRouter result = null; + if (canHandle(network.getGuestType(), dest, offering.getTrafficType())) { + if (router.getState() == State.Stopped) { + result = _routerMgr.startRouter(router.getId()); + } else { + result = _routerMgr.rebootRouter(router.getId()); + } + if (result == null) { + s_logger.warn("Failed to restart dhcp element " + router + " as a part of netowrk " + network + " restart"); + return false; + } else { + return true; + } + } else { + s_logger.trace("Dhcp element doesn't handle network restart for the network " + network); + return true; + } + } } diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 765d291367c..da46251e315 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -26,32 +26,34 @@ import javax.ejb.Local; import org.apache.log4j.Logger; +import com.cloud.configuration.ConfigurationManager; import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.dao.DataCenterDao; import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.host.Host; import com.cloud.network.LoadBalancerVO; import com.cloud.network.Network; -import com.cloud.network.NetworkManager; -import com.cloud.network.PublicIpAddress; -import com.cloud.network.RemoteAccessVpn; -import com.cloud.network.VpnUser; import com.cloud.network.Network.Capability; import com.cloud.network.Network.GuestIpType; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; +import com.cloud.network.NetworkManager; +import com.cloud.network.PublicIpAddress; +import com.cloud.network.RemoteAccessVpn; +import com.cloud.network.VpnUser; import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.lb.LoadBalancingRule; -import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.router.VirtualNetworkApplianceManager; +import com.cloud.network.router.VirtualRouter; import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.PortForwardingRule; import com.cloud.network.rules.FirewallRule.Purpose; +import com.cloud.network.rules.PortForwardingRule; import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; @@ -65,8 +67,8 @@ import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.UserVmManager; import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.VirtualMachine.State; +import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.UserVmDao; @@ -82,16 +84,20 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, @Inject LoadBalancingRulesManager _lbMgr; @Inject NetworkOfferingDao _networkOfferingDao; @Inject VirtualNetworkApplianceManager _routerMgr; + @Inject ConfigurationManager _configMgr; @Inject UserVmManager _userVmMgr; @Inject UserVmDao _userVmDao; @Inject DomainRouterDao _routerDao; - @Inject DataCenterDao _dataCenterDao; @Inject LoadBalancerDao _lbDao; @Inject AccountManager _accountMgr; private boolean canHandle(GuestIpType ipType, DataCenter dc) { String provider = dc.getGatewayProvider(); - return (ipType == GuestIpType.Virtual && provider.equals(Provider.VirtualRouter.getName())); + boolean result = (ipType == GuestIpType.Virtual && provider.equals(Provider.VirtualRouter.getName())); + if (!result) { + s_logger.trace("Virtual router element only takes care of guest ip type " + GuestIpType.Virtual + " for provider " + Provider.VirtualRouter.getName()); + } + return result; } @Override @@ -115,30 +121,6 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, @SuppressWarnings("unchecked") VirtualMachineProfile uservm = (VirtualMachineProfile)vm; - DomainRouterVO router = _routerDao.findById(uservm.getVirtualMachine().getDomainRouterId()); - if(router != null) { - State state = router.getState(); - if ( state == State.Starting ) { - // wait 300 seconds - for ( int i = 0; i < 300; ) { - try { - Thread.sleep(2000); - } catch (Exception e) { - } - i += 2; - - state = router.getState(); - if ( state != State.Starting ) { - break; - } - } - } - - // TODO: need to find a better exception to throw! - if(state != State.Running) - throw new ResourceUnavailableException("Virtual router is not available", Host.class, router.getHostId()); - } - return _routerMgr.addVirtualMachineIntoNetwork(config, nic, uservm, dest, context, false) != null; } else { return false; @@ -175,7 +157,7 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, @Override public boolean applyRules(Network config, List rules) throws ResourceUnavailableException { - DataCenter dc = _dataCenterDao.findById(config.getDataCenterId()); + DataCenter dc = _configMgr.getZone(config.getDataCenterId()); if (canHandle(config.getGuestType(),dc)) { long networkId = config.getId(); @@ -219,7 +201,7 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, @Override public String[] applyVpnUsers(RemoteAccessVpn vpn, List users) throws ResourceUnavailableException{ Network network = _networkConfigDao.findById(vpn.getNetworkId()); - DataCenter dc = _dataCenterDao.findById(network.getDataCenterId()); + DataCenter dc = _configMgr.getZone(network.getDataCenterId()); if (canHandle(network.getGuestType(),dc)) { return _routerMgr.applyVpnUsers(network, users); } else { @@ -230,7 +212,7 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, @Override public boolean start(Network network, RemoteAccessVpn vpn) throws ResourceUnavailableException { - DataCenter dc = _dataCenterDao.findById(network.getDataCenterId()); + DataCenter dc = _configMgr.getZone(network.getDataCenterId()); if (canHandle(network.getGuestType(),dc)) { return _routerMgr.startRemoteAccessVpn(network, vpn); } else { @@ -241,7 +223,7 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, @Override public boolean stop(Network network, RemoteAccessVpn vpn) throws ResourceUnavailableException { - DataCenter dc = _dataCenterDao.findById(network.getDataCenterId()); + DataCenter dc = _configMgr.getZone(network.getDataCenterId()); if (canHandle(network.getGuestType(),dc)) { return _routerMgr.deleteRemoteAccessVpn(network, vpn); } else { @@ -253,7 +235,7 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, @Override public boolean applyIps(Network network, List ipAddress) throws ResourceUnavailableException { - DataCenter dc = _dataCenterDao.findById(network.getDataCenterId()); + DataCenter dc = _configMgr.getZone(network.getDataCenterId()); if (canHandle(network.getGuestType(),dc)) { return _routerMgr.associateIP(network, ipAddress); } else { @@ -306,4 +288,30 @@ public class VirtualRouterElement extends AdapterBase implements NetworkElement, return capabilities; } + @Override + public boolean restart(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{ + DataCenter dc = _configMgr.getZone(network.getDataCenterId()); + DomainRouterVO router = _routerDao.findByNetworkConfiguration(network.getId()); + if (router == null) { + s_logger.trace("Can't find domain router in network " + network.getId()); + return true; + } + + VirtualRouter result = null; + if (canHandle(network.getGuestType(), dc)) { + if (router.getState() == State.Stopped) { + result = _routerMgr.startRouter(router.getId()); + } else { + result = _routerMgr.rebootRouter(router.getId()); + } + if (result == null) { + s_logger.warn("Failed to restart domain router " + router + " as a part of netowrk " + network + " restart"); + return false; + } else { + return true; + } + } + return true; + } + } diff --git a/server/src/com/cloud/network/guru/ControlNetworkGuru.java b/server/src/com/cloud/network/guru/ControlNetworkGuru.java index 5cc92d4802a..3467d76e977 100644 --- a/server/src/com/cloud/network/guru/ControlNetworkGuru.java +++ b/server/src/com/cloud/network/guru/ControlNetworkGuru.java @@ -40,12 +40,12 @@ import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; -import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.user.Account; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; +import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; @@ -95,7 +95,7 @@ public class ControlNetworkGuru extends PodBasedNetworkGuru implements NetworkGu } if(vm.getHypervisorType() == HypervisorType.VmWare && vm.getType() != VirtualMachine.Type.DomainRouter) { - NicProfile nicProf = new NicProfile(ReservationStrategy.Create, null, null, null, null); + NicProfile nicProf = new NicProfile(Nic.ReservationStrategy.Create, null, null, null, null); String mac = _networkMgr.getNextAvailableMacAddressInNetwork(config.getId()); nicProf.setMacAddress(mac); return nicProf; @@ -105,7 +105,7 @@ public class ControlNetworkGuru extends PodBasedNetworkGuru implements NetworkGu throw new CloudRuntimeException("Does not support nic specification at this time: " + nic); } - return new NicProfile(ReservationStrategy.Start, null, null, null, null); + return new NicProfile(Nic.ReservationStrategy.Start, null, null, null, null); } @Override diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java index 54890e5320c..b31632ac481 100644 --- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java +++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java @@ -46,10 +46,10 @@ import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressDao; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; -import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.user.Account; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; +import com.cloud.vm.Nic.ReservationStrategy; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; diff --git a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java index a7f2bfd5801..dbde122f09c 100644 --- a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java +++ b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java @@ -26,9 +26,9 @@ import javax.ejb.Local; import org.apache.log4j.Logger; import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.Pod; import com.cloud.dc.Vlan; -import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.Vlan.VlanType; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.VlanDao; @@ -45,8 +45,8 @@ import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressDao; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; -import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.utils.component.Inject; +import com.cloud.vm.Nic.ReservationStrategy; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; @@ -63,6 +63,7 @@ private static final Logger s_logger = Logger.getLogger(DirectPodBasedNetworkGur @Inject NetworkOfferingDao _networkOfferingDao; + @Override protected boolean canHandle(NetworkOffering offering, DataCenter dc) { //this guru handles system Direct pod based network if (dc.getNetworkType() == NetworkType.Basic && offering.getTrafficType() == TrafficType.Guest && offering.isSystemOnly()) { diff --git a/server/src/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/com/cloud/network/guru/GuestNetworkGuru.java index a8acff3bce5..433777d926a 100644 --- a/server/src/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/com/cloud/network/guru/GuestNetworkGuru.java @@ -45,12 +45,12 @@ import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; import com.cloud.offering.NetworkOffering; -import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.user.Account; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; import com.cloud.utils.db.DB; import com.cloud.utils.net.NetUtils; +import com.cloud.vm.Nic.ReservationStrategy; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; @@ -206,7 +206,7 @@ public class GuestNetworkGuru extends AdapterBase implements NetworkGuru { @DB protected String acquireGuestIpAddress(Network network) { - List ips = _nicDao.listIpAddressInNetworkConfiguration(network.getId()); + List ips = _nicDao.listIpAddressInNetwork(network.getId()); String[] cidr = network.getCidr().split("/"); Set allPossibleIps = NetUtils.getAllIpsFromCidr(cidr[0], Integer.parseInt(cidr[1])); Set usedIps = new TreeSet (); diff --git a/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java b/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java index 94b0b9a1d3e..d6216985e82 100644 --- a/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java +++ b/server/src/com/cloud/network/guru/PodBasedNetworkGuru.java @@ -24,12 +24,12 @@ import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; import com.cloud.offering.NetworkOffering; -import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.user.Account; import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; import com.cloud.utils.net.NetUtils; +import com.cloud.vm.Nic.ReservationStrategy; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; diff --git a/server/src/com/cloud/network/guru/PublicNetworkGuru.java b/server/src/com/cloud/network/guru/PublicNetworkGuru.java index 7c45f8b066b..4838b762d0f 100644 --- a/server/src/com/cloud/network/guru/PublicNetworkGuru.java +++ b/server/src/com/cloud/network/guru/PublicNetworkGuru.java @@ -18,9 +18,9 @@ import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.network.Network; +import com.cloud.network.Network.State; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; -import com.cloud.network.Network.State; import com.cloud.network.Networks.AddressFormat; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.IsolationType; @@ -30,11 +30,11 @@ import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressDao; import com.cloud.offering.NetworkOffering; import com.cloud.offerings.dao.NetworkOfferingDao; -import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.user.Account; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; import com.cloud.utils.net.Ip; +import com.cloud.vm.Nic.ReservationStrategy; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; import com.cloud.vm.VirtualMachine; diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index dbf20d78fde..6ec8a81ffe5 100644 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -208,10 +208,15 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, _lb2VmMapDao.persist(map); s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId " + instanceId); } - - applyLoadBalancerConfig(loadBalancerId); - _lb2VmMapDao.remove(loadBalancerId, instanceIds, null); - s_logger.debug("Load balancer rule id " + loadBalancerId + " is removed for vms " + instanceIds); + + if (applyLoadBalancerConfig(loadBalancerId)) { + _lb2VmMapDao.remove(loadBalancerId, instanceIds, null); + s_logger.debug("Load balancer rule id " + loadBalancerId + " is removed for vms " + instanceIds); + } else { + s_logger.warn("Failed to remove load balancer rule id " + loadBalancerId + " for vms " + instanceIds); + throw new CloudRuntimeException("Failed to remove load balancer rule id " + loadBalancerId + " for vms " + instanceIds); + } + } catch (ResourceUnavailableException e) { s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); return false; @@ -346,14 +351,14 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, newRule = _lbDao.persist(newRule); - boolean success = false; try { _rulesMgr.detectRulesConflict(newRule, ipAddr); if (!_rulesDao.setStateToAdd(newRule)) { throw new CloudRuntimeException("Unable to update the state to add for " + newRule); } s_logger.debug("Load balancer " + newRule.getId() + " for Ip address " + srcIp + ", public port " + srcPortStart + ", private port " + defPortStart+ " is added successfully."); - success = true; + UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_LOAD_BALANCER_CREATE, ipAddr.getAllocatedToAccountId(), ipAddr.getDataCenterId(), newRule.getId(), null); + _usageEventDao.persist(usageEvent); return newRule; } catch (Exception e) { _lbDao.remove(newRule.getId()); @@ -361,26 +366,6 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, throw (NetworkRuleConflictException) e; } throw new CloudRuntimeException("Unable to add rule for " + newRule.getSourceIpAddress(), e); - } finally { - long userId = caller.getCallerUserId(); - - EventVO event = new EventVO(); - event.setUserId(userId); - event.setAccountId(ipAddr.getAllocatedToAccountId()); - event.setType(EventTypes.EVENT_LOAD_BALANCER_CREATE); - - if (!success) { - event.setDescription("Failed to create load balancer " + lb.getName() + " on ip address " + srcIp + "[" + srcPortStart + "->" - + defPortStart + "]"); - event.setLevel(EventVO.LEVEL_ERROR); - } else { - event.setDescription("Successfully created load balancer " + lb.getName() + " on ip address " + srcIp + "[" + srcPortStart + "->" - + defPortStart + "]"); - event.setLevel(EventVO.LEVEL_INFO); - UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_LOAD_BALANCER_CREATE, ipAddr.getAllocatedToAccountId(), ipAddr.getDataCenterId(), newRule.getId(), null); - _usageEventDao.persist(usageEvent); - } - _eventDao.persist(event); } } @@ -438,7 +423,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, String dstIp = null; for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) { UserVm vm = _vmDao.findById(lbVmMap.getInstanceId()); - Nic nic = _nicDao.findByInstanceIdAndNetworkId(lb.getNetworkId(), vm.getId()); + Nic nic = _nicDao.findByInstanceIdAndNetworkIdIncludingRemoved(lb.getNetworkId(), vm.getId()); dstIp = nic.getIp4Address(); LbDestination lbDst = new LbDestination(lb.getDefaultPortStart(), lb.getDefaultPortEnd(), dstIp, lbVmMap.isRevoke()); dstList.add(lbDst); diff --git a/server/src/com/cloud/network/ovs/OvsListener.java b/server/src/com/cloud/network/ovs/OvsListener.java index d66678e9dc7..6b89d1ac369 100644 --- a/server/src/com/cloud/network/ovs/OvsListener.java +++ b/server/src/com/cloud/network/ovs/OvsListener.java @@ -68,7 +68,7 @@ public class OvsListener implements Listener { // TODO: handle delete failure } } catch (Exception e) { - e.printStackTrace(); + s_logger.warn("process answer failed", e); } if (failedFlowVms.size() > 0) { _ovsNetworkMgr.scheduleFlowUpdateToHosts(failedFlowVms, false, new Long(10*1000l)); @@ -141,7 +141,7 @@ public class OvsListener implements Listener { } } } catch (Exception e) { - e.printStackTrace(); + s_logger.warn("process connect failed", e); } } diff --git a/server/src/com/cloud/network/ovs/OvsNetworkManager.java b/server/src/com/cloud/network/ovs/OvsNetworkManager.java index 6931886ca04..dfcf38cdc76 100644 --- a/server/src/com/cloud/network/ovs/OvsNetworkManager.java +++ b/server/src/com/cloud/network/ovs/OvsNetworkManager.java @@ -17,7 +17,7 @@ public interface OvsNetworkManager extends Manager { public boolean isOvsNetworkEnabled(); public void UserVmCheckAndCreateTunnel(Commands cmds, - VirtualMachineProfile profile, DeployDestination dest) throws GreTunnelException; + VirtualMachineProfile profile, DeployDestination dest); public void applyDefaultFlowToUserVm(Commands cmds, VirtualMachineProfile profile, DeployDestination dest); @@ -30,7 +30,7 @@ public interface OvsNetworkManager extends Manager { public void RouterCheckAndCreateTunnel(Commands cmds, VirtualMachineProfile profile, - DeployDestination dest) throws GreTunnelException; + DeployDestination dest); public void fullSync(List> states); diff --git a/server/src/com/cloud/network/ovs/OvsNetworkManagerImpl.java b/server/src/com/cloud/network/ovs/OvsNetworkManagerImpl.java index 070f14877da..23439e66a09 100644 --- a/server/src/com/cloud/network/ovs/OvsNetworkManagerImpl.java +++ b/server/src/com/cloud/network/ovs/OvsNetworkManagerImpl.java @@ -399,7 +399,7 @@ public class OvsNetworkManagerImpl implements OvsNetworkManager { handleCreateTunnelAnswer(answers); } } catch (Exception e) { - e.printStackTrace(); + s_logger.warn("Ovs vlan remap network creates tunnel failed", e); } } @@ -448,7 +448,7 @@ public class OvsNetworkManagerImpl implements OvsNetworkManager { tag, vlans, Long.toString(log.getLogsequence()), instance .getId())); } catch (OvsVlanExhaustedException e) { - e.printStackTrace(); + s_logger.warn("vlan exhaused on host " + instance.getHostId(), e); } } @@ -484,7 +484,7 @@ public class OvsNetworkManagerImpl implements OvsNetworkManager { router.getName(), tag, vlans, Long.toString(log.getLogsequence()), instance.getId())); _agentMgr.send(router.getHostId(), cmds, _ovsListener); } catch (Exception e) { - e.printStackTrace(); + s_logger.warn("apply flow to router failed", e); } } @@ -608,7 +608,7 @@ public class OvsNetworkManagerImpl implements OvsNetworkManager { Commands cmds = new Commands(new OvsDeleteFlowCommand(instance.getName())); _agentMgr.send(hostId, cmds, _ovsListener); } catch (Exception e) { - e.printStackTrace(); + s_logger.warn("remove flow failed", e); } } @@ -640,15 +640,23 @@ public class OvsNetworkManagerImpl implements OvsNetworkManager { @Override public void UserVmCheckAndCreateTunnel(Commands cmds, - VirtualMachineProfile profile, DeployDestination dest) throws GreTunnelException { - CheckAndCreateTunnel(profile.getVirtualMachine(), dest); + VirtualMachineProfile profile, DeployDestination dest) { + try { + CheckAndCreateTunnel(profile.getVirtualMachine(), dest); + } catch (Exception e) { + s_logger.warn("create gre tunnel failed", e); + } } @Override public void RouterCheckAndCreateTunnel(Commands cmds, VirtualMachineProfile profile, - DeployDestination dest) throws GreTunnelException { - CheckAndCreateTunnel(profile.getVirtualMachine(), dest); + DeployDestination dest) { + try { + CheckAndCreateTunnel(profile.getVirtualMachine(), dest); + } catch (Exception e) { + s_logger.warn("create gre tunnel failed", e); + } } @Override diff --git a/server/src/com/cloud/network/ovs/OvsTunnelListener.java b/server/src/com/cloud/network/ovs/OvsTunnelListener.java new file mode 100644 index 00000000000..693de7b2a00 --- /dev/null +++ b/server/src/com/cloud/network/ovs/OvsTunnelListener.java @@ -0,0 +1,116 @@ +package com.cloud.network.ovs; + +import java.util.List; + +import javax.persistence.EntityExistsException; + +import org.apache.log4j.Logger; + +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.exception.ConnectionException; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.Status; +import com.cloud.host.dao.HostDao; +import com.cloud.network.ovs.dao.GreTunnelVO; +import com.cloud.network.ovs.dao.OvsTunnelDao; +import com.cloud.network.ovs.dao.OvsTunnelVO; + +public class OvsTunnelListener implements Listener { + public static final Logger s_logger = Logger.getLogger(OvsListener.class.getName()); + HostDao _hostDao; + OvsTunnelDao _tunnelDao; + + public OvsTunnelListener(OvsTunnelDao tunnelDao, HostDao hostDao) { + this._hostDao = hostDao; + this._tunnelDao = tunnelDao; + } + + @Override + public boolean processAnswers(long agentId, long seq, Answer[] answers) { + + return true; + } + + @Override + public boolean processCommands(long agentId, long seq, Command[] commands) { + // TODO Auto-generated method stub + return true; + } + + @Override + public AgentControlAnswer processControlCommand(long agentId, + AgentControlCommand cmd) { + + return null; + } + + @Override + public void processConnect(HostVO host, StartupCommand cmd) + throws ConnectionException { + if (host.getType() != Host.Type.Routing) { + return; + } + + try { + List hosts = _hostDao.listByType(Host.Type.Routing); + for (HostVO h : hosts) { + if (h.getId() == host.getId()) { + continue; + } + + OvsTunnelVO t = _tunnelDao.getByFromAndTo(host.getId(), h.getId()); + if (t == null) { + t = new OvsTunnelVO(host.getId(), h.getId()); + try { + _tunnelDao.persist(t); + } catch (EntityExistsException e) { + s_logger.debug(String.format("Already has (from=%1$s, to=%2$s)", host.getId(), h.getId())); + } + } + + t = _tunnelDao.getByFromAndTo(h.getId(), host.getId()); + if (t == null) { + t = new OvsTunnelVO(h.getId(), host.getId()); + try { + _tunnelDao.persist(t); + } catch (EntityExistsException e) { + s_logger.debug(String.format("Already has (from=%1$s, to=%2$s)", h.getId(), host.getId())); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public boolean processDisconnect(long agentId, Status state) { + // TODO Auto-generated method stub + return true; + } + + @Override + public boolean isRecurring() { + // TODO Auto-generated method stub + return false; + } + + @Override + public int getTimeout() { + // TODO Auto-generated method stub + return -1; + } + + @Override + public boolean processTimeout(long agentId, long seq) { + // TODO Auto-generated method stub + return true; + } + +} diff --git a/server/src/com/cloud/network/ovs/OvsTunnelManager.java b/server/src/com/cloud/network/ovs/OvsTunnelManager.java new file mode 100644 index 00000000000..e42d015ed8b --- /dev/null +++ b/server/src/com/cloud/network/ovs/OvsTunnelManager.java @@ -0,0 +1,19 @@ +package com.cloud.network.ovs; + +import com.cloud.agent.manager.Commands; +import com.cloud.deploy.DeployDestination; +import com.cloud.utils.component.Manager; +import com.cloud.vm.DomainRouterVO; +import com.cloud.vm.UserVmVO; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachineProfile; + +public interface OvsTunnelManager extends Manager { + boolean isOvsTunnelEnabled(); + + public void UserVmCheckAndCreateTunnel(Commands cmds, VirtualMachineProfile profile, DeployDestination dest); + + public void RouterCheckAndCreateTunnel(Commands cmds, VirtualMachineProfile profile, DeployDestination dest); + + public void CheckAndDestroyTunnel(VMInstanceVO vm); +} diff --git a/server/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java b/server/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java new file mode 100644 index 00000000000..62fe0fac035 --- /dev/null +++ b/server/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java @@ -0,0 +1,297 @@ +package com.cloud.network.ovs; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; +import javax.persistence.EntityExistsException; + +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import com.cloud.agent.manager.Commands; +import com.cloud.configuration.Config; +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.deploy.DeployDestination; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.network.ovs.dao.OvsTunnelAccountDao; +import com.cloud.network.ovs.dao.OvsTunnelAccountVO; +import com.cloud.network.ovs.dao.OvsTunnelDao; +import com.cloud.utils.Pair; +import com.cloud.utils.component.Inject; +import com.cloud.utils.concurrency.NamedThreadFactory; +import com.cloud.utils.db.DB; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.DomainRouterVO; +import com.cloud.vm.UserVmVO; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.dao.DomainRouterDao; +import com.cloud.vm.dao.UserVmDao; + +@Local(value={OvsTunnelManager.class}) +public class OvsTunnelManagerImpl implements OvsTunnelManager { + public static final Logger s_logger = Logger.getLogger(OvsTunnelManagerImpl.class.getName()); + + String _name; + boolean _isEnabled; + ScheduledExecutorService _executorPool; + ScheduledExecutorService _cleanupExecutor; + OvsTunnelListener _listener; + + @Inject ConfigurationDao _configDao; + @Inject OvsTunnelDao _tunnelDao; + @Inject HostDao _hostDao; + @Inject UserVmDao _userVmDao; + @Inject DomainRouterDao _routerDao; + @Inject OvsTunnelAccountDao _tunnelAccountDao; + @Inject AgentManager _agentMgr; + + @Override + public boolean configure(String name, Map params) + throws ConfigurationException { + _name = name; + _isEnabled = Boolean.parseBoolean(_configDao.getValue(Config.OvsTunnelNetwork.key())); + + if (_isEnabled) { + _executorPool = Executors.newScheduledThreadPool(10, new NamedThreadFactory("OVS")); + _cleanupExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("OVS-Cleanup")); + _listener = new OvsTunnelListener(_tunnelDao, _hostDao); + _agentMgr.registerForHostEvents(_listener, true, true, true); + } + + return true; + } + + protected int getGreKey(long from, long to, long account) { + OvsTunnelAccountVO ta = null; + int key; + + try { + key = _tunnelDao.askKey(from, to); + ta = new OvsTunnelAccountVO(from, to, key, account); + OvsTunnelAccountVO lock = _tunnelAccountDao.acquireInLockTable(Long.valueOf(1)); + if (lock == null) { + s_logger.warn("Cannot lock table ovs_tunnel_account"); + return -1; + } + _tunnelAccountDao.persist(ta); + _tunnelAccountDao.releaseFromLockTable(lock.getId()); + } catch (EntityExistsException e) { + ta = _tunnelAccountDao.getByFromToAccount(from, to, account); + if (ta == null) { + key = -1; + } else { + key = ta.getKey(); + } + } + + return key; + } + + private void handleCreateTunnelAnswer(Answer[] answers){ + OvsCreateTunnelAnswer r = (OvsCreateTunnelAnswer) answers[0]; + String s = String.format( + "(hostIP:%1$s, remoteIP:%2$s, bridge:%3$s, greKey:%4$s, portName:%5$s)", + r.getFromIp(), r.getToIp(), r.getBridge(), r.getKey(), r.getInPortName()); + Long from = r.getFrom(); + Long to = r.getTo(); + long account = r.getAccount(); + OvsTunnelAccountVO ta = _tunnelAccountDao.getByFromToAccount(from, to, account); + if (ta == null) { + throw new CloudRuntimeException(String.format("Unable find tunnelAccount record(from=%1$s, to=%2$s, account=%3$s", from, to, account)); + } + + if (!r.getResult()) { + ta.setState("FAILED"); + s_logger.warn("Create GRE tunnel failed due to " + r.getDetails() + s); + } else { + ta.setState("SUCCESS"); + ta.setPortName(r.getInPortName()); + s_logger.warn("Create GRE tunnel " + r.getDetails() + s); + } + _tunnelAccountDao.update(ta.getId(), ta); + } + + @DB + protected void CheckAndCreateTunnel(VMInstanceVO instance, DeployDestination dest) { + if (!_isEnabled) { + return; + } + + if (instance.getType() != VirtualMachine.Type.User + && instance.getType() != VirtualMachine.Type.DomainRouter) { + return; + } + + long hostId = dest.getHost().getId(); + long accountId = instance.getAccountId(); + Listvms = _userVmDao.listByAccountId(accountId); + DomainRouterVO router = _routerDao.findBy(accountId, instance.getDataCenterId()); + Listins = new ArrayList(); + ins.addAll(vms); + ins.add(router); + List>toHosts = new ArrayList>(); + List>fromHosts = new ArrayList>(); + int key; + + for (VMInstanceVO v : ins) { + Long rh = v.getHostId(); + if (rh == null || rh.longValue() == hostId) { + continue; + } + + OvsTunnelAccountVO ta = _tunnelAccountDao.getByFromToAccount(hostId, rh.longValue(), accountId); + if (ta == null) { + key = getGreKey(hostId, rh.longValue(), accountId); + if (key == -1) { + s_logger.warn(String.format("Cannot get GRE key for from=%1$s to=%2$s accountId=%3$s, tunnel create failed", hostId, rh.longValue(), accountId)); + continue; + } + + Pair p = new Pair(rh, Integer.valueOf(key)); + if (!toHosts.contains(p)) { + toHosts.add(p); + } + } + + ta = _tunnelAccountDao.getByFromToAccount(rh.longValue(), hostId, accountId); + if (ta == null) { + key = getGreKey(rh.longValue(), hostId, accountId); + if (key == -1) { + s_logger.warn(String.format("Cannot get GRE key for from=%1$s to=%2$s accountId=%3$s, tunnel create failed", rh.longValue(), hostId, accountId)); + continue; + } + + Pair p = new Pair(rh, Integer.valueOf(key)); + if (!fromHosts.contains(p)) { + fromHosts.add(p); + } + } + } + + try { + String myIp = dest.getHost().getPrivateIpAddress(); + for (Pair i : toHosts) { + HostVO rHost = _hostDao.findById(i.first()); + Commands cmds = new Commands( + new OvsCreateTunnelCommand(rHost.getPrivateIpAddress(), i.second().toString(), Long.valueOf(hostId), i.first(), accountId, myIp)); + s_logger.debug("Ask host " + hostId + " to create gre tunnel to " + i.first()); + Answer[] answers = _agentMgr.send(hostId, cmds); + handleCreateTunnelAnswer(answers); + } + + for (Pair i : fromHosts) { + HostVO rHost = _hostDao.findById(i.first()); + Commands cmd2s = new Commands( + new OvsCreateTunnelCommand(myIp, i.second().toString(), i.first(), Long.valueOf(hostId), accountId, rHost.getPrivateIpAddress())); + s_logger.debug("Ask host " + i.first() + " to create gre tunnel to " + hostId); + Answer[] answers = _agentMgr.send(i.first(), cmd2s); + handleCreateTunnelAnswer(answers); + } + } catch (Exception e) { + s_logger.debug("Ovs Tunnel network created tunnel failed", e); + } + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public String getName() { + return _name; + } + + @Override + public boolean isOvsTunnelEnabled() { + return _isEnabled; + } + + @Override + public void UserVmCheckAndCreateTunnel(Commands cmds, VirtualMachineProfile profile, DeployDestination dest) { + CheckAndCreateTunnel(profile.getVirtualMachine(), dest); + } + + @Override + public void RouterCheckAndCreateTunnel(Commands cmds, VirtualMachineProfile profile, DeployDestination dest) { + CheckAndCreateTunnel(profile.getVirtualMachine(), dest); + } + + private void handleDestroyTunnelAnswer(Answer ans, long from, long to, long account) { + String toStr = (to == 0 ? "all peers" : Long.toString(to)); + + if (ans.getResult()) { + OvsTunnelAccountVO lock = _tunnelAccountDao.acquireInLockTable(Long.valueOf(1)); + if (lock == null) { + s_logger.warn(String.format("failed to lock ovs_tunnel_account, remove record of tunnel(from=%1$s, to=%2$s account=%3$s) failed", from, to, account)); + return; + } + + if (to == 0) { + _tunnelAccountDao.removeByFromAccount(from, account); + } else { + _tunnelAccountDao.removeByFromToAccount(from, to, account); + } + _tunnelAccountDao.releaseFromLockTable(lock.getId()); + + s_logger.debug(String.format("Destroy tunnel(account:%1$s, from:%2$s, to:%3$s) successful", account, from, toStr)); + } else { + s_logger.debug(String.format("Destroy tunnel(account:%1$s, from:%2$s, to:%3$s) failed", account, from, toStr)); + } + } + + @Override + public void CheckAndDestroyTunnel(VMInstanceVO vm) { + if (!_isEnabled) { + return; + } + + List userVms = _userVmDao.listByAccountIdAndHostId(vm.getAccountId(), vm.getHostId()); + if (vm.getType() == VirtualMachine.Type.User) { + if (userVms.size() > 1) { + return; + } + + DomainRouterVO router = _routerDao.findBy(vm.getAccountId(), vm.getDataCenterId()); + if (router.getHostId() == vm.getHostId()) { + return; + } + } else if (vm.getType() == VirtualMachine.Type.DomainRouter && userVms.size() != 0) { + return; + } + + try { + /* Now we are last one on host, destroy all tunnels of my account */ + Command cmd = new OvsDestroyTunnelCommand(vm.getAccountId(), "[]"); + Answer ans = _agentMgr.send(vm.getHostId(), cmd); + handleDestroyTunnelAnswer(ans, vm.getHostId(), 0, vm.getAccountId()); + + /* Then ask hosts have peer tunnel with me to destroy them */ + List peers = _tunnelAccountDao.listByToAccount(vm.getHostId(), vm.getAccountId()); + for (OvsTunnelAccountVO p : peers) { + cmd = new OvsDestroyTunnelCommand(p.getAccount(), p.getPortName()); + ans = _agentMgr.send(p.getFrom(), cmd); + handleDestroyTunnelAnswer(ans, p.getFrom(), p.getTo(), p.getAccount()); + } + } catch (Exception e) { + s_logger.warn(String.format("Destroy tunnel(account:%1$s, hostId:%2$s) failed", vm.getAccountId(), vm.getHostId()), e); + } + + } + +} diff --git a/server/src/com/cloud/network/ovs/dao/OvsTunnelAccountDao.java b/server/src/com/cloud/network/ovs/dao/OvsTunnelAccountDao.java new file mode 100644 index 00000000000..1de34693bcf --- /dev/null +++ b/server/src/com/cloud/network/ovs/dao/OvsTunnelAccountDao.java @@ -0,0 +1,13 @@ +package com.cloud.network.ovs.dao; + +import java.util.List; + +import com.cloud.utils.db.GenericDao; + +public interface OvsTunnelAccountDao extends + GenericDao { + OvsTunnelAccountVO getByFromToAccount(long from, long to, long account); + void removeByFromAccount(long from, long account); + void removeByFromToAccount(long from, long to, long account); + List listByToAccount(long to, long account); +} diff --git a/server/src/com/cloud/network/ovs/dao/OvsTunnelAccountDaoImpl.java b/server/src/com/cloud/network/ovs/dao/OvsTunnelAccountDaoImpl.java new file mode 100644 index 00000000000..0e3bd6a1b9d --- /dev/null +++ b/server/src/com/cloud/network/ovs/dao/OvsTunnelAccountDaoImpl.java @@ -0,0 +1,73 @@ +package com.cloud.network.ovs.dao; + +import java.util.List; + +import javax.ejb.Local; + +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Op; + +@Local(value = { OvsTunnelAccountDao.class }) +public class OvsTunnelAccountDaoImpl extends + GenericDaoBase implements OvsTunnelAccountDao { + + protected final SearchBuilder fromToAccountSearch; + protected final SearchBuilder fromAccountSearch; + protected final SearchBuilder toAccountSearch; + + public OvsTunnelAccountDaoImpl() { + fromToAccountSearch = createSearchBuilder(); + fromToAccountSearch.and("from", fromToAccountSearch.entity().getFrom(), Op.EQ); + fromToAccountSearch.and("to", fromToAccountSearch.entity().getTo(), Op.EQ); + fromToAccountSearch.and("account", fromToAccountSearch.entity().getAccount(), Op.EQ); + fromToAccountSearch.done(); + + fromAccountSearch = createSearchBuilder(); + fromAccountSearch.and("from", fromAccountSearch.entity().getFrom(), Op.EQ); + fromAccountSearch.and("account", fromAccountSearch.entity().getAccount(), Op.EQ); + fromAccountSearch.done(); + + toAccountSearch = createSearchBuilder(); + toAccountSearch.and("to", toAccountSearch.entity().getTo(), Op.EQ); + toAccountSearch.and("account", toAccountSearch.entity().getAccount(), Op.EQ); + toAccountSearch.done(); + } + + @Override + public OvsTunnelAccountVO getByFromToAccount(long from, long to, + long account) { + SearchCriteria sc = fromToAccountSearch.create(); + sc.setParameters("from", from); + sc.setParameters("to", to); + sc.setParameters("account", account); + return findOneBy(sc); + } + + @Override + public void removeByFromAccount(long from, long account) { + SearchCriteria sc = fromAccountSearch.create(); + sc.setParameters("from", from); + sc.setParameters("account", account); + remove(sc); + } + + @Override + public List listByToAccount(long to, long account) { + SearchCriteria sc = toAccountSearch.create(); + sc.setParameters("to", to); + sc.setParameters("account", account); + return listBy(sc); + } + + @Override + public void removeByFromToAccount(long from, long to, long account) { + SearchCriteria sc = fromToAccountSearch.create(); + sc.setParameters("from", from); + sc.setParameters("to", to); + sc.setParameters("account", account); + remove(sc); + } + +} diff --git a/server/src/com/cloud/network/ovs/dao/OvsTunnelAccountVO.java b/server/src/com/cloud/network/ovs/dao/OvsTunnelAccountVO.java new file mode 100644 index 00000000000..441863f6f68 --- /dev/null +++ b/server/src/com/cloud/network/ovs/dao/OvsTunnelAccountVO.java @@ -0,0 +1,88 @@ +package com.cloud.network.ovs.dao; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name=("ovs_tunnel_account")) +public class OvsTunnelAccountVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "from") + private long from; + + @Column(name = "to") + private long to; + + @Column(name = "key") + private int key; + + @Column(name = "account") + private long account; + + @Column(name = "port_name") + private String portName; + + @Column(name = "state") + private String state; + + public OvsTunnelAccountVO() { + + } + + public OvsTunnelAccountVO(long from, long to, int key, long account) { + this.from = from; + this.to = to; + this.key = key; + this.account = account; + this.portName = "[]"; + this.state = "FAILED"; + } + + public void setKey(int key) { + this.key = key; + } + + public long getFrom() { + return from; + } + + public long getTo() { + return to; + } + + public int getKey() { + return key; + } + + public long getId() { + return id; + } + + public long getAccount() { + return account; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public void setPortName(String name) { + this.portName = name; + } + + public String getPortName() { + return portName; + } +} diff --git a/server/src/com/cloud/network/ovs/dao/OvsTunnelDao.java b/server/src/com/cloud/network/ovs/dao/OvsTunnelDao.java new file mode 100644 index 00000000000..3dc4ad9aa4f --- /dev/null +++ b/server/src/com/cloud/network/ovs/dao/OvsTunnelDao.java @@ -0,0 +1,9 @@ +package com.cloud.network.ovs.dao; + +import com.cloud.utils.db.GenericDao; + +public interface OvsTunnelDao extends GenericDao { + OvsTunnelVO lockByFromAndTo(long from, long to); + OvsTunnelVO getByFromAndTo(long from, long to); + int askKey(long from, long to); +} diff --git a/server/src/com/cloud/network/ovs/dao/OvsTunnelDaoImpl.java b/server/src/com/cloud/network/ovs/dao/OvsTunnelDaoImpl.java new file mode 100644 index 00000000000..b0f0d3953e1 --- /dev/null +++ b/server/src/com/cloud/network/ovs/dao/OvsTunnelDaoImpl.java @@ -0,0 +1,59 @@ +package com.cloud.network.ovs.dao; + +import javax.ejb.Local; + +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.SearchCriteria.Op; + +@Local(value = { OvsTunnelDao.class }) +public class OvsTunnelDaoImpl extends GenericDaoBase + implements OvsTunnelDao { + + protected final SearchBuilder fromToSearch; + + public OvsTunnelDaoImpl() { + fromToSearch = createSearchBuilder(); + fromToSearch.and("from", fromToSearch.entity().getFrom(), Op.EQ); + fromToSearch.and("to", fromToSearch.entity().getTo(), Op.EQ); + fromToSearch.done(); + } + + @Override + public OvsTunnelVO lockByFromAndTo(long from, long to) { + SearchCriteria sc = fromToSearch.create(); + sc.setParameters("from", from); + sc.setParameters("to", to); + return lockOneRandomRow(sc, true); + } + + @Override + @DB + public int askKey(long from, long to) { + int key = -1; + + final Transaction txn = Transaction.currentTxn(); + txn.start(); + OvsTunnelVO t = lockByFromAndTo(from, to); + if (t != null) { + key = t.getKey(); + t.setKey(key+1); + update(t.getId(), t); + } + + txn.commit(); + return key; + } + + @Override + public OvsTunnelVO getByFromAndTo(long from, long to) { + SearchCriteria sc = fromToSearch.create(); + sc.setParameters("from", from); + sc.setParameters("to", to); + return findOneBy(sc); + } + +} diff --git a/server/src/com/cloud/network/ovs/dao/OvsTunnelVO.java b/server/src/com/cloud/network/ovs/dao/OvsTunnelVO.java new file mode 100644 index 00000000000..1f5924f05d1 --- /dev/null +++ b/server/src/com/cloud/network/ovs/dao/OvsTunnelVO.java @@ -0,0 +1,64 @@ +package com.cloud.network.ovs.dao; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name=("ovs_tunnel")) +public class OvsTunnelVO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "from") + private long from; + + @Column(name = "to") + private long to; + + @Column(name = "key") + private int key; + + + public OvsTunnelVO() { + + } + + public OvsTunnelVO(long from, long to) { + this.from = from; + this.to = to; + this.key = 0; + } + + public OvsTunnelVO(long id, long from, long to) { + this.from = from; + this.to = to; + this.key = 0; + this.id = id; + } + + public void setKey(int key) { + this.key = key; + } + + public long getFrom() { + return from; + } + + public long getTo() { + return to; + } + + public int getKey() { + return key; + } + + public long getId() { + return id; + } +} diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java index b296e0fc27f..ab4528df487 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java @@ -72,6 +72,7 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA boolean getRouterStatistics(long vmId, Map netStats, Map diskStats); + @Override VirtualRouter upgradeRouter(UpgradeRouterCmd cmd) throws InvalidParameterValueException, PermissionDeniedException; DomainRouterVO getRouter(long accountId, long zoneId); diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index f73cdd3c462..ab6dba20b9b 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -73,9 +73,6 @@ import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; import com.cloud.domain.dao.DomainDao; -import com.cloud.event.EventTypes; -import com.cloud.event.EventUtils; -import com.cloud.event.EventVO; import com.cloud.event.dao.EventDao; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; @@ -116,14 +113,15 @@ import com.cloud.network.dao.VpnUserDao; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.lb.LoadBalancingRulesManager; -import com.cloud.network.ovs.GreTunnelException; import com.cloud.network.ovs.OvsNetworkManager; +import com.cloud.network.ovs.OvsTunnelManager; import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.PortForwardingRule; import com.cloud.network.rules.PortForwardingRuleVO; import com.cloud.network.rules.RulesManager; import com.cloud.network.rules.dao.PortForwardingRulesDao; +import com.cloud.offering.NetworkOffering; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.service.ServiceOfferingVO; @@ -154,7 +152,6 @@ import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.net.Ip; import com.cloud.utils.net.NetUtils; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; @@ -284,6 +281,8 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian VMInstanceDao _instanceDao; @Inject OvsNetworkManager _ovsNetworkMgr; + @Inject + OvsTunnelManager _ovsTunnelMgr; long _routerTemplateId = -1; int _routerRamSize; @@ -644,7 +643,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian return new StopCommand(vm, vmName, VirtualMachineName.getVnet(vmName)); } else if (vm != null) { final DomainRouterVO vo = vm; - return new StopCommand(vo, vo.getVnet()); + return new StopCommand(vo, null); } else { throw new CloudRuntimeException("Shouldn't even be here!"); } @@ -891,7 +890,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian DomainRouterVO router = _routerDao.findByNetworkConfiguration(guestNetwork.getId()); if (router == null) { - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, owner.getId(), EventTypes.EVENT_ROUTER_CREATE, "Starting to create router for accountId : " +owner.getAccountId()); long id = _routerDao.getNextInSequence(Long.class, "id"); if (s_logger.isDebugEnabled()) { s_logger.debug("Creating the router " + id); @@ -933,22 +931,11 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian router = new DomainRouterVO(id, _offering.getId(), VirtualMachineName.getRouterName(id, _instance), _template.getId(), _template.getHypervisorType(), _template.getGuestOSId(), owner.getDomainId(), owner.getId(), guestNetwork.getId(), _offering.getOfferHA(), guestNetwork.getNetworkDomain()); router = _itMgr.allocate(router, _template, _offering, networks, plan, null, owner); - if(router != null){ - EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ROUTER_CREATE, "successfully create router : " + router.getName(), startEventId); - } else { - EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ROUTER_CREATE, "router creation failed", startEventId); - } } State state = router.getState(); if (state != State.Starting && state != State.Running) { - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, owner.getId(), EventTypes.EVENT_ROUTER_START, "Starting router : " +router.getName()); router = this.start(router, _accountService.getSystemUser(), _accountService.getSystemAccount()); - if(router != null){ - EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ROUTER_START, "successfully started router : " + router.getName(), startEventId); - } else { - EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ROUTER_START, "failed to start router", startEventId); - } } return router; @@ -978,7 +965,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } if (router == null) { - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, owner.getId(), EventTypes.EVENT_ROUTER_CREATE, "Starting to create router for accountId : " +owner.getAccountId()); long id = _routerDao.getNextInSequence(Long.class, "id"); if (s_logger.isDebugEnabled()) { s_logger.debug("Creating the router " + id); @@ -998,21 +984,10 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian _template.getHypervisorType(), _template.getGuestOSId(), owner.getDomainId(), owner.getId(), guestNetwork.getId(), _offering.getOfferHA(), guestNetwork.getNetworkDomain()); router.setRole(Role.DHCP_USERDATA); router = _itMgr.allocate(router, _template, _offering, networks, plan, null, owner); - if(router != null){ - EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ROUTER_CREATE, "successfully create router : " + router.getName(), startEventId); - } else { - EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ROUTER_CREATE, "router creation failed", startEventId); - } } State state = router.getState(); if (state != State.Starting && state != State.Running) { - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, owner.getId(), EventTypes.EVENT_ROUTER_START, "Starting router : " +router.getName()); router = this.start(router, _accountService.getSystemUser(), _accountService.getSystemAccount()); - if(router != null){ - EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ROUTER_START, "successfully started router : " + router.getName(), startEventId); - } else { - EventUtils.saveEvent(User.UID_SYSTEM, owner.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ROUTER_START, "failed to start router", startEventId); - } } return router; } @@ -1123,13 +1098,10 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian @Override public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException{ NicProfile controlNic = (NicProfile) profile.getParameter("control.nic"); - try { - _ovsNetworkMgr.RouterCheckAndCreateTunnel(cmds, profile, dest); - _ovsNetworkMgr.applyDefaultFlowToRouter(cmds, profile, dest); - } catch (GreTunnelException e) { - e.printStackTrace(); - } - + + _ovsNetworkMgr.RouterCheckAndCreateTunnel(cmds, profile, dest); + _ovsNetworkMgr.applyDefaultFlowToRouter(cmds, profile, dest); + _ovsTunnelMgr.RouterCheckAndCreateTunnel(cmds, profile, dest); cmds.addCommand("checkSsh", new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922, 5, 20)); @@ -1147,7 +1119,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian router.setGuestMacAddress(nic.getMacAddress()); } else if (network.getTrafficType() == TrafficType.Control) { router.setPrivateIpAddress(nic.getIp4Address()); - router.setPrivateNetmask(nic.getNetmask()); router.setPrivateMacAddress(nic.getMacAddress()); } } @@ -1225,6 +1196,8 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian //Resend user data s_logger.debug("Reapplying user data entries as a part of domR " + router + " start..."); createUserDataCommands(router, cmds); + // Network usage command to create iptables rules + cmds.addCommand("networkUsage", new NetworkUsageCommand(controlNic.getIp4Address(), router.getName(), "create")); return true; } @@ -1250,6 +1223,7 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian DomainRouterVO router = profile.getVirtualMachine(); _ovsNetworkMgr.handleVmStateTransition(router, State.Stopped); + _ovsTunnelMgr.CheckAndDestroyTunnel(router); } @Override @@ -1518,10 +1492,13 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian String vifMacAddress = ipAddr.getMacAddress(); String vmGuestAddress = null; - if(vmId!=0){ - vmGuestAddress = _vmDao.findById(vmId).getGuestIpAddress(); - } - IpAddressTO ip = new IpAddressTO(ipAddr.getAddress().addr(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, vmGuestAddress); + + //Get network rate - required for IpAssoc + Network network = _networkMgr.getNetwork(ipAddr.getNetworkId()); + NetworkOffering no = _configMgr.getNetworkOffering(network.getNetworkOfferingId()); + Integer networkRate = _configMgr.getNetworkRate(no.getId()); + + IpAddressTO ip = new IpAddressTO(ipAddr.getAddress().addr(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, vmGuestAddress, networkRate); ipsToSend[i++] = ip; firstIP = false; } diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index 26ad550267d..3005037d344 100644 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -27,6 +27,8 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import com.cloud.api.commands.ListPortForwardingRulesCmd; +import com.cloud.domain.Domain; +import com.cloud.domain.DomainVO; import com.cloud.event.EventVO; import com.cloud.event.dao.EventDao; import com.cloud.exception.InvalidParameterValueException; @@ -51,6 +53,10 @@ import com.cloud.utils.Pair; import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; import com.cloud.utils.db.DB; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.Ip; @@ -237,20 +243,6 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } throw new CloudRuntimeException("Unable to add rule for " + newRule.getSourceIpAddress(), e); - } finally { - // Save and create the event - String description; - String ruleName = "ip forwarding"; - String level = EventVO.LEVEL_INFO; - - if (success == true) { - description = "created new " + ruleName + " rule [" + newRule.getSourceIpAddress() + ":" + newRule.getSourcePortStart() + "]->[" - + newRule.getDestinationIpAddress() + ":" + newRule.getDestinationPortStart() + "]" + " " + newRule.getProtocol(); - } else { - level = EventVO.LEVEL_ERROR; - description = "failed to create new " + ruleName + " rule [" + newRule.getSourceIpAddress() + ":" + newRule.getSourcePortStart() + "]->[" - + newRule.getDestinationIpAddress() + ":" + newRule.getDestinationPortStart() + "]" + " " + newRule.getProtocol(); - } } } @@ -351,9 +343,12 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { @Override public List listPortForwardingRules(ListPortForwardingRulesCmd cmd) { - Account caller = UserContext.current().getCaller(); - - List rules = null; + Account caller = UserContext.current().getCaller(); + String ip = cmd.getIpAddress(); + + Pair accountDomainPair = _accountMgr.finalizeAccountDomainForList(caller, cmd.getAccountName(), cmd.getDomainId()); + String accountName = accountDomainPair.first(); + Long domainId = accountDomainPair.second(); if(cmd.getIpAddress() != null){ Ip ipAddress = new Ip(cmd.getIpAddress()); @@ -361,13 +356,30 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { if (ipAddressVO == null || !ipAddressVO.readyToUse()) { throw new InvalidParameterValueException("Ip address not ready for port forwarding rules yet: " + ipAddress); } - - rules = _forwardingDao.listByIp(ipAddress); - _accountMgr.checkAccess(caller, rules.toArray(new PortForwardingRuleVO[rules.size()])); - } else { - rules = _forwardingDao.listByAccount(caller.getAccountId()); + _accountMgr.checkAccess(caller, ipAddressVO); } - return rules; + + Filter filter = new Filter(PortForwardingRuleVO.class, "id", false, cmd.getStartIndex(), cmd.getPageSizeVal()); + SearchBuilder sb = _forwardingDao.createSearchBuilder(); + sb.and("ip", sb.entity().getSourceIpAddress(), Op.EQ); + sb.and("accountId", sb.entity().getAccountId(), Op.EQ); + sb.and("domainId", sb.entity().getDomainId(), Op.EQ); + + SearchCriteria sc = sb.create(); + + if (ip != null) { + sc.setParameters("ip", ip); + } + + if (domainId != null) { + sc.setParameters("domainId", domainId); + if (accountName != null) { + Account account = _accountMgr.getActiveAccount(accountName, domainId); + sc.setParameters("accountId", account.getId()); + } + } + + return _forwardingDao.search(sc, filter); } @Override diff --git a/server/src/com/cloud/network/security/SecurityGroupManager.java b/server/src/com/cloud/network/security/SecurityGroupManager.java index cfb409ad0ff..8fa2eb19d58 100644 --- a/server/src/com/cloud/network/security/SecurityGroupManager.java +++ b/server/src/com/cloud/network/security/SecurityGroupManager.java @@ -39,7 +39,7 @@ public interface SecurityGroupManager { public SecurityGroupVO createDefaultSecurityGroup( Long accountId); - public boolean addInstanceToGroups(Long userVmId, List groups); + public boolean addInstanceToGroups(Long userVmId, List groups); public void removeInstanceFromGroups(Long userVmId); diff --git a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java index a3d13946595..5e0e5dc8e74 100644 --- a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java +++ b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java @@ -434,7 +434,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG @Override @DB @SuppressWarnings("rawtypes") public List authorizeSecurityGroupIngress(AuthorizeSecurityGroupIngressCmd cmd) throws InvalidParameterValueException, PermissionDeniedException{ - String groupName = cmd.getSecurityGroupName(); + Long groupId = cmd.getSecurityGroupId(); String protocol = cmd.getProtocol(); Integer startPort = cmd.getStartPort(); Integer endPort = cmd.getEndPort(); @@ -510,9 +510,9 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG // if it's an admin account, do a quick permission check if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId)) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to find rules for security group id = " + groupName + ", permission denied."); + s_logger.debug("Unable to find rules for security group id = " + groupId + ", permission denied."); } - throw new PermissionDeniedException("Unable to find rules for security group id = " + groupName + ", permission denied."); + throw new PermissionDeniedException("Unable to find rules for security group id = " + groupId + ", permission denied."); } Account groupOwner = _accountDao.findActiveAccount(accountName, domainId); @@ -534,7 +534,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG } if (accountId == null) { - throw new InvalidParameterValueException("Unable to find account for security group " + groupName + "; failed to authorize ingress."); + throw new InvalidParameterValueException("Unable to find account for security group " + groupId + "; failed to authorize ingress."); } @@ -560,9 +560,9 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG Account authorizedAccount = _accountDao.findActiveAccount(authorizedAccountName, domainId); if (authorizedAccount == null) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Nonexistent account: " + authorizedAccountName + ", domainid: " + domainId + " when trying to authorize ingress for " + groupName + ":" + protocol + ":" + startPortOrType + ":" + endPortOrCode); + s_logger.debug("Nonexistent account: " + authorizedAccountName + ", domainid: " + domainId + " when trying to authorize ingress for " + groupId + ":" + protocol + ":" + startPortOrType + ":" + endPortOrCode); } - throw new InvalidParameterValueException("Nonexistent account: " + authorizedAccountName + " when trying to authorize ingress for " + groupName + ":" + protocol + ":" + startPortOrType + ":" + endPortOrCode); + throw new InvalidParameterValueException("Nonexistent account: " + authorizedAccountName + " when trying to authorize ingress for " + groupId + ":" + protocol + ":" + startPortOrType + ":" + endPortOrCode); } SecurityGroupVO groupVO = _securityGroupDao.findByAccountAndName(authorizedAccount.getId(), group); @@ -581,15 +581,15 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG authorizedGroups2.addAll(authorizedGroups); //Ensure we don't re-lock the same row txn.start(); - SecurityGroupVO securityGroup = _securityGroupDao.findByAccountAndName(accountId, groupName); + SecurityGroupVO securityGroup = _securityGroupDao.findById(groupId); if (securityGroup == null) { - s_logger.warn("Security group not found: name= " + groupName); + s_logger.warn("Security group not found: id= " + groupId); return null; } //Prevents other threads/management servers from creating duplicate ingress rules SecurityGroupVO securityGroupLock = _securityGroupDao.acquireInLockTable(securityGroup.getId()); if (securityGroupLock == null) { - s_logger.warn("Could not acquire lock on network security group: name= " + groupName); + s_logger.warn("Could not acquire lock on network security group: name= " + securityGroup.getName()); return null; } List newRules = new ArrayList(); @@ -597,7 +597,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG //Don't delete the group from under us. securityGroup = _securityGroupDao.lockRow(securityGroup.getId(), false); if (securityGroup == null) { - s_logger.warn("Could not acquire lock on network group " + groupName); + s_logger.warn("Could not acquire lock on network group " + securityGroup.getName()); return null; } @@ -632,7 +632,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG } } if (s_logger.isDebugEnabled()) { - s_logger.debug("Added " + newRules.size() + " rules to security group " + groupName); + s_logger.debug("Added " + newRules.size() + " rules to security group " + securityGroup.getName()); } txn.commit(); final Set affectedVms = new HashSet(); @@ -663,7 +663,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG Integer icmpType = cmd.getIcmpType(); Integer icmpCode = cmd.getIcmpCode(); String protocol = cmd.getProtocol(); - String securityGroup = cmd.getSecurityGroupName(); + Long securityGroupId = cmd.getSecurityGroupId(); String cidrList = cmd.getCidrList(); Map groupList = cmd.getUserSecurityGroupList(); String [] cidrs = null; @@ -724,9 +724,9 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG // if it's an admin account, do a quick permission check if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId)) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to find rules for network security group id = " + securityGroup + ", permission denied."); + s_logger.debug("Unable to find rules for security group id = " + securityGroupId + ", permission denied."); } - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to find rules for network security group id = " + securityGroup + ", permission denied."); + throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to find rules for security group id = " + securityGroupId + ", permission denied."); } Account groupOwner = _accountDao.findActiveAccount(accountName, domainId); if (groupOwner == null) { @@ -747,13 +747,13 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG } if (accountId == null) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find account for network security group " + securityGroup + "; failed to revoke ingress."); + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find account for security group " + securityGroupId + "; failed to revoke ingress."); } - SecurityGroupVO sg = _securityGroupDao.findByAccountAndName(accountId, securityGroup); + SecurityGroupVO sg = _securityGroupDao.findById(securityGroupId); if (sg == null) { - s_logger.debug("Unable to find network security group with id " + securityGroup); - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find network security group with id " + securityGroup); + s_logger.debug("Unable to find security group with id " + securityGroupId); + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find security group with id " + securityGroupId); } if (cidrList == null && groupList == null) { @@ -790,9 +790,9 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG Account authorizedAccount = _accountDao.findActiveAccount(authorizedAccountName, domainId); if (authorizedAccount == null) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Nonexistent account: " + authorizedAccountName + ", domainid: " + domainId + " when trying to revoke ingress for " + securityGroup + ":" + protocol + ":" + startPortOrType + ":" + endPortOrCode); + s_logger.debug("Nonexistent account: " + authorizedAccountName + ", domainid: " + domainId + " when trying to revoke ingress for " + securityGroupId + ":" + protocol + ":" + startPortOrType + ":" + endPortOrCode); } - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Nonexistent account: " + authorizedAccountName + " when trying to revoke ingress for " + securityGroup + ":" + protocol + ":" + startPortOrType + ":" + endPortOrCode); + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Nonexistent account: " + authorizedAccountName + " when trying to revoke ingress for " + securityGroupId + ":" + protocol + ":" + startPortOrType + ":" + endPortOrCode); } SecurityGroupVO groupVO = _securityGroupDao.findByAccountAndName(authorizedAccount.getId(), group); @@ -818,9 +818,9 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG final int numToDelete = cidrList.length() + authorizedGroups.size(); final Transaction txn = Transaction.currentTxn(); - SecurityGroupVO securityGroupHandle = _securityGroupDao.findByAccountAndName(accountId, securityGroup); + SecurityGroupVO securityGroupHandle = _securityGroupDao.findById(securityGroupId); if (securityGroupHandle == null) { - s_logger.warn("Network security group not found: name= " + securityGroup); + s_logger.warn("Security group not found: name= " + securityGroupId); return false; } try { @@ -828,7 +828,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG securityGroupHandle = _securityGroupDao.acquireInLockTable(securityGroupHandle.getId()); if (securityGroupHandle == null) { - s_logger.warn("Could not acquire lock on network security group: name= " + securityGroup); + s_logger.warn("Could not acquire lock on network security group: name= " + securityGroupId); return false; } for (final SecurityGroupVO ngVO: authorizedGroups) { @@ -837,7 +837,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG for (final String cidr: cidrs) { numDeleted += _ingressRuleDao.deleteByPortProtoAndCidr(securityGroupHandle.getId(), protocol, startPort, endPort, cidr); } - s_logger.debug("revokeSecurityGroupIngress for group: " + securityGroup + ", numToDelete=" + numToDelete + ", numDeleted=" + numDeleted); + s_logger.debug("revokeSecurityGroupIngress for group: " + securityGroupId + ", numToDelete=" + numToDelete + ", numDeleted=" + numDeleted); final Set affectedVms = new HashSet(); affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(securityGroupHandle.getId())); @@ -848,7 +848,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG s_logger.warn("Exception caught when deleting ingress rules ", e); throw new CloudRuntimeException("Exception caught when deleting ingress rules", e); } finally { - if (securityGroup != null) { + if (securityGroupId != null) { _securityGroupDao.releaseFromLockTable(securityGroupHandle.getId()); } txn.commit(); @@ -1044,7 +1044,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG agentId = vm.getHostId(); if (agentId != null ) { _rulesetLogDao.findByVmId(work.getInstanceId()); - SecurityIngressRulesCmd cmd = generateRulesetCmd(vm.getInstanceName(), vm.getGuestIpAddress(), vm.getGuestMacAddress(), vm.getId(), generateRulesetSignature(rules), seqnum, rules); + SecurityIngressRulesCmd cmd = generateRulesetCmd(vm.getInstanceName(), vm.getPrivateIpAddress(), vm.getPrivateMacAddress(), vm.getId(), generateRulesetSignature(rules), seqnum, rules); Commands cmds = new Commands(cmd); try { _agentMgr.send(agentId, cmds, _answerListener); @@ -1067,16 +1067,21 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG @Override @DB - public boolean addInstanceToGroups(final Long userVmId, final List groups) { + public boolean addInstanceToGroups(final Long userVmId, final List groups) { if (!_enabled) { return true; } - if (groups != null) { - final Set uniqueGroups = new TreeSet(new SecurityGroupVOComparator()); - uniqueGroups.addAll(groups); + if (groups != null && !groups.isEmpty()) { + final Transaction txn = Transaction.currentTxn(); txn.start(); UserVm userVm = _userVMDao.acquireInLockTable(userVmId); //ensures that duplicate entries are not created. + List sgs = new ArrayList(); + for (String sg : groups) { + sgs.add(_securityGroupDao.findByAccountAndName(userVm.getAccountId(), sg)); + } + final Set uniqueGroups = new TreeSet(new SecurityGroupVOComparator()); + uniqueGroups.addAll(sgs); if (userVm == null) { s_logger.warn("Failed to acquire lock on user vm id=" + userVmId); } @@ -1129,7 +1134,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG @DB @Override public boolean deleteSecurityGroup(DeleteSecurityGroupCmd cmd) throws ResourceInUseException, PermissionDeniedException, InvalidParameterValueException{ - String name = cmd.getSecurityGroupName(); + Long id = cmd.getId(); String accountName = cmd.getAccountName(); Long domainId = cmd.getDomainId(); Account account = UserContext.current().getCaller(); @@ -1145,9 +1150,9 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG // if it's an admin account, do a quick permission check if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId)) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to find rules network group " + name + ", permission denied."); + s_logger.debug("Unable to find rules network group: " + id + ", permission denied."); } - throw new PermissionDeniedException("Unable to network group " + name + ", permission denied."); + throw new PermissionDeniedException("Unable to network group: " + id + ", permission denied."); } Account groupOwner = _accountDao.findActiveAccount(accountName, domainId); @@ -1169,12 +1174,12 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG } if (accountId == null) { - throw new InvalidParameterValueException("Unable to find account for network group " + name + "; failed to delete group."); + throw new InvalidParameterValueException("Unable to find account for network group: " + id + "; failed to delete group."); } - SecurityGroupVO sg = _securityGroupDao.findByAccountAndName(accountId, name); + SecurityGroupVO sg = _securityGroupDao.findById(id); if (sg == null) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find network group " + name + "; failed to delete group."); + throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find network group: " + id + "; failed to delete group."); } Long groupId = sg.getId(); @@ -1216,7 +1221,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG String accountName = cmd.getAccountName(); Long accountId = null; Long instanceId = cmd.getVirtualMachineId(); - String networkGroup = cmd.getSecurityGroupName(); + String securityGroup = cmd.getSecurityGroupName(); Boolean recursive = Boolean.FALSE; Long id = cmd.getId(); @@ -1244,7 +1249,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG } } else if (account != null) { // either an admin is searching for their own group, or admin is listing all groups and the search needs to be restricted to domain admin's domain - if (networkGroup != null) { + if (securityGroup != null) { accountId = account.getId(); } else if (account.getType() != Account.ACCOUNT_TYPE_ADMIN) { domainId = account.getDomainId(); @@ -1297,8 +1302,8 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG SearchCriteria sc = sb.create(); if (accountId != null) { sc.setParameters("accountId", accountId); - if (networkGroup != null) { - sc.setParameters("name", networkGroup); + if (securityGroup != null) { + sc.setParameters("name", securityGroup); } else if (keyword != null) { SearchCriteria ssc = _securityGroupRulesDao.createSearchCriteria(); ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); diff --git a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java index 7e65b4a28d8..ace27d06a3e 100644 --- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java +++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java @@ -248,7 +248,6 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag @Override @DB public VpnUser addVpnUser(long vpnOwnerId, String username, String password) { - long callerId = UserContext.current().getCallerUserId(); Account caller = UserContext.current().getCaller(); if (!username.matches("^[a-zA-Z0-9][a-zA-Z0-9@._-]{2,63}$")) { @@ -272,15 +271,12 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag } VpnUser user = _vpnUsersDao.persist(new VpnUserVO(vpnOwnerId, owner.getDomainId(), username, password)); - EventUtils.saveEvent(callerId, owner.getId(), EventTypes.EVENT_VPN_USER_ADD, "Added a VPN user for account: " + owner.getAccountName() - + " username= " + username); txn.commit(); return user; } @Override public boolean removeVpnUser(long vpnOwnerId, String username) { - long callerId = UserContext.current().getCallerUserId(); Account caller = UserContext.current().getCaller(); VpnUserVO user = _vpnUsersDao.findByAccountAndUsername(vpnOwnerId, username); @@ -291,7 +287,6 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag user.setState(State.Revoke); _vpnUsersDao.update(user.getId(), user); - EventUtils.saveEvent(callerId, vpnOwnerId, EventTypes.EVENT_VPN_USER_REMOVE, "Removed a VPN user username= " + username); return true; } diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index ea8c55a716d..b69fbe45bc6 100644 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@ -694,8 +694,6 @@ public class ConfigurationServerImpl implements ConfigurationServer { } private void createDefaultNetworkOfferings() { - Integer rateMbps = getIntegerConfigValue(Config.NetworkThrottlingRate.key(), null); - Integer multicastRateMbps = getIntegerConfigValue(Config.MulticastThrottlingRate.key(), null); NetworkOfferingVO publicNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SystemPublicNetwork, TrafficType.Public); publicNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(publicNetworkOffering); @@ -708,9 +706,9 @@ public class ConfigurationServerImpl implements ConfigurationServer { NetworkOfferingVO guestNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SysteGuestNetwork, TrafficType.Guest); guestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(guestNetworkOffering); - NetworkOfferingVO defaultGuestNetworkOffering = new NetworkOfferingVO(NetworkOffering.DefaultVirtualizedNetworkOffering, "Virtual Vlan", TrafficType.Guest, false, false, rateMbps, multicastRateMbps, null, true, Availability.Required, false, false, false, false, false, false, false); + NetworkOfferingVO defaultGuestNetworkOffering = new NetworkOfferingVO(NetworkOffering.DefaultVirtualizedNetworkOffering, "Virtual Vlan", TrafficType.Guest, false, false, null, null, null, true, Availability.Required, false, false, false, false, false, false, false); defaultGuestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultGuestNetworkOffering); - NetworkOfferingVO defaultGuestDirectNetworkOffering = new NetworkOfferingVO(NetworkOffering.DefaultDirectNetworkOffering, "Direct", TrafficType.Public, false, false, rateMbps, multicastRateMbps, null, true, Availability.Required, false, false, false, false, false, false, false); + NetworkOfferingVO defaultGuestDirectNetworkOffering = new NetworkOfferingVO(NetworkOffering.DefaultDirectNetworkOffering, "Direct", TrafficType.Public, false, false, null, null, null, true, Availability.Required, false, false, false, false, false, false, false); defaultGuestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultGuestDirectNetworkOffering); } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 60c0fb54fed..0eaf6d3100c 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -163,7 +163,6 @@ import com.cloud.dc.dao.PodVlanMapDao; import com.cloud.dc.dao.VlanDao; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; -import com.cloud.event.ActionEvent; import com.cloud.event.Event; import com.cloud.event.EventTypes; import com.cloud.event.EventUtils; @@ -263,7 +262,6 @@ import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.InstanceGroupVO; import com.cloud.vm.SecondaryStorageVmVO; -import com.cloud.vm.UserVmDetailVO; import com.cloud.vm.UserVmManager; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; @@ -274,7 +272,6 @@ import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.InstanceGroupDao; import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.UserVmDao; -import com.cloud.vm.dao.UserVmDetailsDao; import com.cloud.vm.dao.VMInstanceDao; public class ManagementServerImpl implements ManagementServer { @@ -977,7 +974,7 @@ public class ManagementServerImpl implements ManagementServer { sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ); sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ); - sb.and("accountName", sb.entity().getAccountName(), SearchCriteria.Op.LIKE); + sb.and("accountName", sb.entity().getAccountName(), SearchCriteria.Op.EQ); sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); if ((accountName == null) && (domainId != null)) { @@ -1017,7 +1014,7 @@ public class ManagementServerImpl implements ManagementServer { } if (accountName != null) { - sc.setParameters("accountName", "%" + accountName + "%"); + sc.setParameters("accountName", accountName); if (domainId != null) { sc.setParameters("domainId", domainId); } @@ -1738,7 +1735,11 @@ public class ManagementServerImpl implements ManagementServer { Long domainId = cmd.getDomainId(); Long accountId = cmd.getId(); String accountName = null; - + Boolean isRecursive = cmd.isRecursive(); + + if(isRecursive == null) + isRecursive = false; + if(accountId != null && accountId == 1){ //system account should NOT be searchable List emptyList = new ArrayList(); @@ -1750,6 +1751,7 @@ public class ManagementServerImpl implements ManagementServer { if (domainId == null) { // default domainId to the admin's domain domainId = ((account == null) ? DomainVO.ROOT_DOMAIN : account.getDomainId()); + isRecursive = true; } else if (account != null) { if (!_domainDao.isChildDomain(account.getDomainId(), domainId)) { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid domain id (" + domainId + ") given, unable to list accounts"); @@ -1775,13 +1777,21 @@ public class ManagementServerImpl implements ManagementServer { sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ); sb.and("needsCleanup", sb.entity().getNeedsCleanup(), SearchCriteria.Op.EQ); - if ((accountId == null) && (domainId != null)) { - // if accountId isn't specified, we can do a domain match for the admin case + if ((accountId == null) && (domainId != null) && isRecursive) { + // if accountId isn't specified, we can do a domain LIKE match for the admin case if isRecursive is true SearchBuilder domainSearch = _domainDao.createSearchBuilder(); domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE); sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER); - } + } else if ((accountId == null) && (domainId != null) && !isRecursive) { + // if accountId isn't specified, we can do a domain EXACT match for the admin case if isRecursive is true + SearchBuilder domainSearch = _domainDao.createSearchBuilder(); + domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.EQ); + sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER); + } + + + SearchCriteria sc = sb.create(); if (keyword != null) { SearchCriteria ssc = _accountDao.createSearchCriteria(); @@ -1801,7 +1811,11 @@ public class ManagementServerImpl implements ManagementServer { DomainVO domain = _domainDao.findById(domainId); // I want to join on user_vm.domain_id = domain.id where domain.path like 'foo%' - sc.setJoinParameters("domainSearch", "path", domain.getPath() + "%"); + if(isRecursive) + sc.setJoinParameters("domainSearch", "path", domain.getPath() + "%"); + else + sc.setJoinParameters("domainSearch", "path", domain.getPath()); + sc.setParameters("nid", 1L); } else { sc.setParameters("nid", 1L); @@ -2276,6 +2290,11 @@ public class ManagementServerImpl implements ManagementServer { String accountName = cmd.getAccountName(); Long accountId = null; boolean isAdmin = false; + Boolean isRecursive = cmd.isRecursive(); + + if(isRecursive == null) + isRecursive = false; + if ((account == null) || isAdmin(account.getType())) { isAdmin = true; if (domainId != null) { @@ -2292,6 +2311,7 @@ public class ManagementServerImpl implements ManagementServer { } } else { domainId = ((account == null) ? DomainVO.ROOT_DOMAIN : account.getDomainId()); + isRecursive = true; } } else { accountId = account.getId(); @@ -2337,14 +2357,18 @@ public class ManagementServerImpl implements ManagementServer { sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ); // Only return volumes that are not destroyed - sb.and("destroyed", sb.entity().getDestroyed(), SearchCriteria.Op.EQ); + sb.and("state", sb.entity().getState(), SearchCriteria.Op.NEQ); - if ((accountId == null) && (domainId != null)) { - // if accountId isn't specified, we can do a domain match for the admin case + if (((accountId == null) && (domainId != null) && isRecursive)) { + // if accountId isn't specified, we can do a domain match for the admin case if isRecursive is true SearchBuilder domainSearch = _domainDao.createSearchBuilder(); domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE); sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER); - } + } else if((accountId == null) && (domainId != null) && !isRecursive) { + SearchBuilder domainSearch = _domainDao.createSearchBuilder(); + domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.EQ); + sb.join("domainSearch", domainSearch, sb.entity().getDomainId(), domainSearch.entity().getId(), JoinBuilder.JoinType.INNER); + } // now set the SC criteria... SearchCriteria sc = sb.create(); @@ -2368,7 +2392,10 @@ public class ManagementServerImpl implements ManagementServer { sc.setParameters("accountIdEQ", accountId); } else if (domainId != null) { DomainVO domain = _domainDao.findById(domainId); - sc.setJoinParameters("domainSearch", "path", domain.getPath() + "%"); + if(isRecursive) + sc.setJoinParameters("domainSearch", "path", domain.getPath() + "%"); + else + sc.setJoinParameters("domainSearch", "path", domain.getPath()); } if (type != null) { sc.setParameters("volumeType", "%" + type + "%"); @@ -2391,7 +2418,7 @@ public class ManagementServerImpl implements ManagementServer { */ // Only return volumes that are not destroyed - sc.setParameters("destroyed", false); + sc.setParameters("state", Volume.State.Destroy); List allVolumes = _volumeDao.search(sc, searchFilter); List returnableVolumes = new ArrayList(); //these are ones without domr and console proxy @@ -2405,7 +2432,22 @@ public class ManagementServerImpl implements ManagementServer { } else { - returnableVolumes.add(v); + //do not add to returnable list if vol belongs to a user vm that is destoyed and cmd called by user + if(v.getInstanceId() == null) { + returnableVolumes.add(v); + }else { + if (account.getType() == Account.ACCOUNT_TYPE_NORMAL){ + VMInstanceVO owningVm = _vmInstanceDao.findById(v.getInstanceId()); + if(owningVm != null && owningVm.getType().equals(VirtualMachine.Type.User) && owningVm.getState().equals(VirtualMachine.State.Destroyed)){ + // do not show volumes + // do nothing + }else { + returnableVolumes.add(v); + } + }else { + returnableVolumes.add(v); + } + } } } @@ -2415,7 +2457,7 @@ public class ManagementServerImpl implements ManagementServer { @Override public VolumeVO findVolumeByInstanceAndDeviceId(long instanceId, long deviceId) { VolumeVO volume = _volumeDao.findByInstanceAndDeviceId(instanceId, deviceId).get(0); - if (volume != null && !volume.getDestroyed() && volume.getRemoved() == null) { + if (volume != null && volume.getState() != Volume.State.Destroy && volume.getRemoved() == null) { return volume; } else { return null; @@ -2629,7 +2671,6 @@ public class ManagementServerImpl implements ManagementServer { if (s_logger.isDebugEnabled()) { s_logger.debug("User: " + username + " in domain " + domainId + " has successfully logged in"); } - EventUtils.saveEvent(user.getId(), user.getAccountId(), EventTypes.EVENT_USER_LOGIN, "user has logged in"); return user; } else { if (s_logger.isDebugEnabled()) { @@ -2901,19 +2942,12 @@ public class ManagementServerImpl implements ManagementServer { if ((domains == null) || domains.isEmpty()) { DomainVO domain = new DomainVO(name, ownerId, parentId); try { - DomainVO dbDomain = _domainDao.create(domain); - EventUtils.saveEvent(new Long(1), ownerId, EventVO.LEVEL_INFO, EventTypes.EVENT_DOMAIN_CREATE, "Domain, " + name + " created with owner id = " + ownerId - + " and parentId " + parentId); - return dbDomain; + return _domainDao.create(domain); } catch (IllegalArgumentException ex) { s_logger.warn("Failed to create domain ", ex); - EventUtils.saveEvent(new Long(1), ownerId, EventVO.LEVEL_ERROR, EventTypes.EVENT_DOMAIN_CREATE, "Domain, " + name + " was not created with owner id = " + ownerId - + " and parentId " + parentId); throw ex; } } else { - EventUtils.saveEvent(new Long(1), ownerId, EventVO.LEVEL_ERROR, EventTypes.EVENT_DOMAIN_CREATE, "Domain, " + name + " was not created with owner id = " + ownerId - + " and parentId " + parentId); throw new InvalidParameterValueException("Domain with name " + name + " already exists for the parent id=" + parentId); } } @@ -2976,23 +3010,11 @@ public class ManagementServerImpl implements ManagementServer { List accounts = _accountDao.search(sc, null); for (AccountVO account : accounts) { success = (success && _accountMgr.cleanupAccount(account, UserContext.current().getCallerUserId(), UserContext.current().getCaller())); - String description = "Account:" + account.getAccountId(); - if(success){ - EventUtils.saveEvent(User.UID_SYSTEM, account.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ACCOUNT_DELETE, "Successfully deleted " +description); - }else{ - EventUtils.saveEvent(User.UID_SYSTEM, account.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ACCOUNT_DELETE, "Error deleting " +description); - } - } } // delete the domain itself boolean deleteDomainSuccess = _domainDao.remove(domainId); - if (!deleteDomainSuccess) { - EventUtils.saveEvent(new Long(1), ownerId, EventVO.LEVEL_ERROR, EventTypes.EVENT_DOMAIN_DELETE, "Domain with id " + domainId + " was not deleted"); - } else { - EventUtils.saveEvent(new Long(1), ownerId, EventVO.LEVEL_INFO, EventTypes.EVENT_DOMAIN_DELETE, "Domain with id " + domainId + " was deleted"); - } return success && deleteDomainSuccess; } @@ -3030,11 +3052,9 @@ public class ManagementServerImpl implements ManagementServer { String updatedDomainPath = getUpdatedDomainPath(domain.getPath(),domainName); updateDomainChildren(domain,updatedDomainPath); _domainDao.update(domainId, domainName, updatedDomainPath); - EventUtils.saveEvent(new Long(1), domain.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_DOMAIN_UPDATE, "Domain, " + domainName + " was updated"); return _domainDao.findById(domainId); } else { domain = _domainDao.findById(domainId); - EventUtils.saveEvent(new Long(1), domain.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_DOMAIN_UPDATE, "Failed to update domain " + domain.getName() + " with name " + domainName + ", name in use."); s_logger.error("Domain with name " + domainName + " already exists in the system"); throw new CloudRuntimeException("Failed to update domain " + domainId); } @@ -4285,7 +4305,6 @@ public class ManagementServerImpl implements ManagementServer { List storageServers = _hostDao.listByTypeDataCenter(Host.Type.SecondaryStorage, zoneId); HostVO sserver = storageServers.get(0); - EventUtils.saveStartedEvent(userId, accountId, cmd.getEventType(), "Starting extraction of " +volume.getName()+ " mode:"+mode, cmd.getStartEventId()); List extractURLList = _uploadDao.listByTypeUploadStatus(volumeId, Upload.Type.VOLUME, UploadVO.Status.DOWNLOAD_URL_CREATED); if (extractMode == Upload.Mode.HTTP_DOWNLOAD && extractURLList.size() > 0){ @@ -4326,7 +4345,6 @@ public class ManagementServerImpl implements ManagementServer { uploadJob.setLastUpdated(new Date()); _uploadDao.update(uploadJob.getId(), uploadJob); - EventUtils.saveEvent(userId, accountId, EventTypes.EVENT_VOLUME_UPLOAD, errorString); throw new CloudRuntimeException(errorString); } @@ -4342,7 +4360,6 @@ public class ManagementServerImpl implements ManagementServer { return uploadJob.getId(); }else{ // Volume is copied now make it visible under apache and create a URL. _uploadMonitor.createVolumeDownloadURL(volumeId, volumeLocalPath, Upload.Type.VOLUME, zoneId, uploadJob.getId()); - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_INFO, cmd.getEventType(), "Completed extraction of "+volume.getName()+ " in mode:" +mode, null, cmd.getStartEventId() == null ? 0:cmd.getStartEventId()); return uploadJob.getId(); } } @@ -4576,7 +4593,6 @@ public class ManagementServerImpl implements ManagementServer { if(updateCertAns.getResult() == true) { //we have the cert copied over on cpvm - long eventId = saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_PROXY_REBOOT, "rebooting console proxy with Id: "+cp.getId()); _consoleProxyMgr.rebootProxy(cp.getId()); //when cp reboots, the context will be reinit with the new cert if(s_logger.isDebugEnabled()) { @@ -4646,11 +4662,25 @@ public class ManagementServerImpl implements ManagementServer { @Override public String[] getHypervisors(ListHypervisorsCmd cmd) { - String hypers = _configDao.getValue(Config.HypervisorList.key()); - if (hypers == "" || hypers == null) { - return null; - } - return hypers.split(","); + Long zoneId = cmd.getZoneId(); + if(zoneId == null) { + String hypers = _configDao.getValue(Config.HypervisorList.key()); + if (hypers == "" || hypers == null) { + return null; + } + return hypers.split(","); + } else { + String[] result = null; + List clustersForZone = _clusterDao.listByZoneId(zoneId); + if(clustersForZone != null && clustersForZone.size() > 0) { + result = new String[clustersForZone.size()]; + int i = 0; + for(ClusterVO cluster : clustersForZone) { + result[i++] = cluster.getHypervisorType().toString(); + } + } + return result; + } } @Override @@ -4667,8 +4697,9 @@ public class ManagementServerImpl implements ManagementServer { public SSHKeyPair createSSHKeyPair(CreateSSHKeyPairCmd cmd) { Account account = UserContext.current().getCaller(); SSHKeyPairVO s = _sshKeyPairDao.findByName(account.getAccountId(), account.getDomainId(), cmd.getName()); - if (s != null) - throw new InvalidParameterValueException("A key pair with name '" + cmd.getName() + "' already exists."); + if (s != null) { + throw new InvalidParameterValueException("A key pair with name '" + cmd.getName() + "' already exists."); + } SSHKeysHelper keys = new SSHKeysHelper(); @@ -4684,8 +4715,9 @@ public class ManagementServerImpl implements ManagementServer { public boolean deleteSSHKeyPair(DeleteSSHKeyPairCmd cmd) { Account account = UserContext.current().getCaller(); SSHKeyPairVO s = _sshKeyPairDao.findByName(account.getAccountId(), account.getDomainId(), cmd.getName()); - if (s == null) - throw new InvalidParameterValueException("A key pair with name '" + cmd.getName() + "' does not exist."); + if (s == null) { + throw new InvalidParameterValueException("A key pair with name '" + cmd.getName() + "' does not exist."); + } return _sshKeyPairDao.deleteByName(account.getAccountId(), account.getDomainId(), cmd.getName()); } @@ -4694,11 +4726,13 @@ public class ManagementServerImpl implements ManagementServer { public List listSSHKeyPairs(ListSSHKeyPairsCmd cmd) { Account account = UserContext.current().getCaller(); - if (cmd.getName() != null && cmd.getName().length() > 0) - return _sshKeyPairDao.listKeyPairsByName(account.getAccountId(), account.getDomainId(), cmd.getName()); + if (cmd.getName() != null && cmd.getName().length() > 0) { + return _sshKeyPairDao.listKeyPairsByName(account.getAccountId(), account.getDomainId(), cmd.getName()); + } - if (cmd.getFingerprint() != null && cmd.getFingerprint().length() > 0) - return _sshKeyPairDao.listKeyPairsByFingerprint(account.getAccountId(), account.getDomainId(), cmd.getFingerprint()); + if (cmd.getFingerprint() != null && cmd.getFingerprint().length() > 0) { + return _sshKeyPairDao.listKeyPairsByFingerprint(account.getAccountId(), account.getDomainId(), cmd.getFingerprint()); + } return _sshKeyPairDao.listKeyPairs(account.getAccountId(), account.getDomainId()); } @@ -4707,15 +4741,17 @@ public class ManagementServerImpl implements ManagementServer { public SSHKeyPair registerSSHKeyPair(RegisterSSHKeyPairCmd cmd) { Account account = UserContext.current().getCaller(); SSHKeyPairVO s = _sshKeyPairDao.findByName(account.getAccountId(), account.getDomainId(), cmd.getName()); - if (s != null) - throw new InvalidParameterValueException("A key pair with name '" + cmd.getName() + "' already exists."); + if (s != null) { + throw new InvalidParameterValueException("A key pair with name '" + cmd.getName() + "' already exists."); + } String name = cmd.getName(); String publicKey = SSHKeysHelper.getPublicKeyFromKeyMaterial(cmd.getPublicKey()); String fingerprint = SSHKeysHelper.getPublicKeyFingerprint(publicKey); - if (publicKey == null) - throw new InvalidParameterValueException("Public key is invalid"); + if (publicKey == null) { + throw new InvalidParameterValueException("Public key is invalid"); + } return createAndSaveSSHKeyPair(name, fingerprint, publicKey, null); } @@ -4740,13 +4776,15 @@ public class ManagementServerImpl implements ManagementServer { public String getVMPassword(GetVMPasswordCmd cmd) { Account account = UserContext.current().getCaller(); UserVmVO vm = _userVmDao.findById(cmd.getId()); - if (vm == null || vm.getAccountId() != account.getAccountId()) - throw new InvalidParameterValueException("No VM with id '" + cmd.getId() + "' found."); + if (vm == null || vm.getAccountId() != account.getAccountId()) { + throw new InvalidParameterValueException("No VM with id '" + cmd.getId() + "' found."); + } _userVmDao.loadDetails(vm); String password = vm.getDetail("Encrypted.Password"); - if (password == null || password.equals("")) - throw new InvalidParameterValueException("No password for VM with id '" + cmd.getId() + "' found."); + if (password == null || password.equals("")) { + throw new InvalidParameterValueException("No password for VM with id '" + cmd.getId() + "' found."); + } return password; } diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java index 25e4f145e6b..3c16644796e 100755 --- a/server/src/com/cloud/server/StatsCollector.java +++ b/server/src/com/cloud/server/StatsCollector.java @@ -157,22 +157,15 @@ public class StatsCollector { List hosts = _hostDao.search(sc, null); for (HostVO host : hosts) { - if (host.getId() != null) - { - HostStatsEntry stats = (HostStatsEntry) _agentMgr.getHostStatistics(host.getId()); - if (stats != null) - { - hostStats.put(host.getId(), stats); - } - else - { - s_logger.warn("Received invalid host stats for host: " + host.getId()); - } - } - else - { - s_logger.warn("Host: " + host.getId() + " does not exist, skipping host statistics"); - } + HostStatsEntry stats = (HostStatsEntry) _agentMgr.getHostStatistics(host.getId()); + if (stats != null) + { + hostStats.put(host.getId(), stats); + } + else + { + s_logger.warn("Received invalid host stats for host: " + host.getId()); + } } _hostStats = hostStats; } diff --git a/server/src/com/cloud/storage/StorageManager.java b/server/src/com/cloud/storage/StorageManager.java index bfc975c8dd7..179ff911f41 100755 --- a/server/src/com/cloud/storage/StorageManager.java +++ b/server/src/com/cloud/storage/StorageManager.java @@ -36,75 +36,12 @@ import com.cloud.storage.Volume.VolumeType; import com.cloud.user.Account; import com.cloud.utils.Pair; import com.cloud.utils.component.Manager; -import com.cloud.utils.exception.ExecutionException; import com.cloud.vm.DiskProfile; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; public interface StorageManager extends Manager { - - - VolumeVO allocateIsoInstalledVm(VMInstanceVO vm, VMTemplateVO template, DiskOfferingVO rootOffering, Long size, DataCenterVO dc, Account account); - - /** - * Calls the storage agent and makes the volumes sharable with this host. - * - * @param vm vm that owns the volumes - * @param vols volumes to share - * @param host host to share the volumes to. - * @param cancelPrevious cancel the previous shares? - * @return true if works. - * - * @throws StorageUnavailableException if the storage server is unavailable. - */ - boolean share(VMInstanceVO vm, List vols, HostVO host, boolean cancelPrevious) throws StorageUnavailableException; - - List prepare(VMInstanceVO vm, HostVO host); - - /** - * Calls the storage server to unshare volumes to the host. - * - * @param vm vm that owns the volumes. - * @param vols volumes to remove from share. - * @param host host to unshare the volumes to. - * @return true if it worked; false if not. - */ - boolean unshare(VMInstanceVO vm, List vols, HostVO host); - - /** - * unshares the storage volumes of a certain vm to the host. - * - * @param vm vm to unshare. - * @param host host. - * @return List if succeeded. null if not. - */ - List unshare(VMInstanceVO vm, HostVO host); - - /** - * Creates volumes for a particular VM. - * @param account account to create volumes for. - * @param vm vm to create the volumes for. - * @param template template the root volume is based on. - * @param dc datacenter to put this. - * @param pod pod to put this. - * @param offering service offering of the vm. - * @param diskOffering disk offering of the vm. - * @param avoids storage pools to avoid. - * @param size : size of the volume if defined - * @return List of VolumeVO - */ - List create(Account account, VMInstanceVO vm, VMTemplateVO template, DataCenterVO dc, HostPodVO pod, ServiceOfferingVO offering, DiskOfferingVO diskOffering, long size) throws StorageUnavailableException, ExecutionException; - - /** - * Get the storage ip address to connect to. - * @param vm vm to run. - * @param host host to run it on. - * @param storage storage that contains the vm. - * @return ip address if it can be determined. null if not. - */ - String chooseStorageIp(VMInstanceVO vm, Host host, Host storage); - boolean canVmRestartOnAnotherServer(long vmId); /** Returns the absolute path of the specified ISO @@ -135,16 +72,6 @@ public interface StorageManager extends Manager { */ public HostVO getSecondaryStorageHost(long zoneId); - /** - * Create the volumes for a user VM based on service offering in a particular data center - * - * @return true if successful - */ - public long createUserVM(Account account, VMInstanceVO vm, - VMTemplateVO template, DataCenterVO dc, HostPodVO pod, - ServiceOfferingVO offering, DiskOfferingVO diskOffering, - List avoids, long size); - /** * This method sends the given command on all the hosts in the primary storage pool given until is succeeds on any one. * If the command doesn't succeed on any, it return null. All exceptions are swallowed. Any errors are expected be be in @@ -240,14 +167,6 @@ public interface StorageManager extends Manager { */ void cleanupStorage(boolean recurring); - /** - * Find all of the storage pools needed for this vm. - * - * @param vmId id of the vm. - * @return List of StoragePoolVO - */ - StoragePoolVO getStoragePoolForVm(long vmId); - String getPrimaryStorageNameLabel(VolumeVO volume); /** @@ -270,7 +189,6 @@ public interface StorageManager extends Manager { void prepare(VirtualMachineProfile vm, DeployDestination dest) throws StorageUnavailableException, InsufficientStorageCapacityException, ConcurrentOperationException; - //void release(VirtualMachineProfile vm); void release(VirtualMachineProfile profile); diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 9392e449d0b..a9d82f3464a 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -89,10 +89,8 @@ import com.cloud.dc.dao.HostPodDao; import com.cloud.deploy.DeployDestination; import com.cloud.domain.Domain; import com.cloud.domain.dao.DomainDao; -import com.cloud.event.Event; +import com.cloud.event.ActionEvent; import com.cloud.event.EventTypes; -import com.cloud.event.EventUtils; -import com.cloud.event.EventVO; import com.cloud.event.UsageEventVO; import com.cloud.event.dao.EventDao; import com.cloud.event.dao.UsageEventDao; @@ -122,7 +120,6 @@ import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StorageResourceType; -import com.cloud.storage.Volume.MirrorState; import com.cloud.storage.Volume.SourceType; import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.allocator.StoragePoolAllocator; @@ -162,7 +159,6 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.ExecutionException; import com.cloud.vm.DiskProfile; import com.cloud.vm.UserVmManager; -import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.State; @@ -240,7 +236,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag private int _pauseInterval; private final boolean _shouldBeSnapshotCapable = true; - @Override public boolean share(VMInstanceVO vm, List vols, HostVO host, boolean cancelPreviousShare) throws StorageUnavailableException { //if pool is in maintenance and it is the ONLY pool available; reject @@ -297,16 +292,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag return vols; } - @Override - public VolumeVO allocateIsoInstalledVm(VMInstanceVO vm, VMTemplateVO template, DiskOfferingVO rootOffering, Long size, DataCenterVO dc, Account account) { - assert (template.getFormat() == ImageFormat.ISO) : "The template has to be ISO"; - - long rootId = _volsDao.getNextInSequence(Long.class, "volume_seq"); - DiskProfile rootDisk = new DiskProfile(rootId, VolumeType.ROOT, "ROOT-" + vm.getId() + "-" + rootId, rootOffering.getId(), size != null ? size : rootOffering.getDiskSizeInBytes(), rootOffering.getTagsArray(), rootOffering.getUseLocalStorage(), rootOffering.isRecreatable(), null); - List vols = allocate(rootDisk, null, vm, dc, account); - return vols.get(0); - } - VolumeVO allocateDuplicateVolume(VolumeVO oldVol) { VolumeVO newVol = new VolumeVO(oldVol.getVolumeType(), oldVol.getName(), oldVol.getDataCenterId(), oldVol.getDomainId(), oldVol.getAccountId(), oldVol.getDiskOfferingId(), oldVol.getSize()); newVol.setTemplateId(oldVol.getTemplateId()); @@ -327,89 +312,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } } - @Override - public List prepare(VMInstanceVO vm, HostVO host) { - List vols = _volsDao.findCreatedByInstance(vm.getId()); - List recreateVols = new ArrayList(vols.size()); - for (VolumeVO vol : vols) { - if (!vol.isRecreatable()) { - return vols; - } - - //if pool is in maintenance and it is the ONLY pool available; reject - List rootVolForGivenVm = _volsDao.findByInstanceAndType(vm.getId(), VolumeType.ROOT); - if(rootVolForGivenVm != null && rootVolForGivenVm.size() > 0){ - boolean isPoolAvailable = isPoolAvailable(rootVolForGivenVm.get(0).getPoolId()); - - if(!isPoolAvailable){ - return new ArrayList(); - } - } - - //if we have a system vm - //get the storage pool - //if pool is in prepareformaintenance - //add to recreate vols, and continue - if(vm.getType().equals(VirtualMachine.Type.ConsoleProxy) || vm.getType().equals(VirtualMachine.Type.DomainRouter) || vm.getType().equals(VirtualMachine.Type.SecondaryStorageVm)) - { - StoragePoolVO sp = _storagePoolDao.findById(vol.getPoolId()); - - if(sp!=null && sp.getStatus().equals(Status.PrepareForMaintenance)) - { - recreateVols.add(vol); - continue; - } - } - - StoragePoolHostVO ph = _storagePoolHostDao.findByPoolHost(vol.getPoolId(), host.getId()); - if (ph == null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Must recreate " + vol + " since " + vol.getPoolId() + " has is not hooked up with host " + host.getId()); - } - recreateVols.add(vol); - } - } - - if (recreateVols.size() == 0) { - s_logger.debug("No need to recreate the volumes"); - return vols; - } - - List createds = new ArrayList(); - for (VolumeVO vol : recreateVols) { - VolumeVO create = new VolumeVO(vol.getVolumeType(), vol.getInstanceId(), vol.getTemplateId(), vol.getName(), vol.getDataCenterId(), host.getPodId(), vol.getAccountId(), vol.getDomainId(), vol.isRecreatable()); - create.setDiskOfferingId(vol.getDiskOfferingId()); - create.setDeviceId(vol.getDeviceId()); - create = _volsDao.persist(create); - VMTemplateVO template = _templateDao.findById(create.getTemplateId()); - DataCenterVO dc = _dcDao.findById(create.getDataCenterId()); - HostPodVO pod = _podDao.findById(host.getPodId()); - DiskOfferingVO diskOffering = null; - diskOffering = _diskOfferingDao.findById(vol.getDiskOfferingId()); - ServiceOfferingVO offering; - if (vm instanceof UserVmVO) { - offering = _offeringDao.findById(((UserVmVO)vm).getServiceOfferingId()); - } else { - offering = _offeringDao.findById(vol.getDiskOfferingId()); - } - VolumeVO created = createVolume(create, vm, template, dc, pod, host.getClusterId(), offering, diskOffering, new ArrayList(),0, template.getHypervisorType()); - if (created == null) { - break; - } - createds.add(created); - } - - if (createds.size() != recreateVols.size()) { - return null; - } - - for (VolumeVO vol : recreateVols) { - _volsDao.remove(vol.getId()); - } - - return createds; - } - @Override public List> isStoredOn(VMInstanceVO vm) { List> lst = new ArrayList>(); @@ -451,16 +353,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag return false; } - @Override - public List unshare(VMInstanceVO vm, HostVO host) { - final List vols = _volsDao.findCreatedByInstance(vm.getId()); - if (vols.size() == 0) { - return vols; - } - - return unshare(vm, vols, host) ? vols : null; - } - protected StoragePoolVO findStoragePool(DiskProfile dskCh, final DataCenterVO dc, HostPodVO pod, Long clusterId, final ServiceOffering offering, final VMInstanceVO vm, final VMTemplateVO template, final Set avoid) { Enumeration en = _storagePoolAllocators.enumeration(); while (en.hasMoreElements()) { @@ -638,7 +530,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag createdVolume.setState(Volume.State.Ready); } else { createdVolume.setStatus(AsyncInstanceCreateStatus.Corrupted); - createdVolume.setDestroyed(true); + createdVolume.setState(Volume.State.Destroy); } _volsDao.update(volumeId, createdVolume); @@ -654,10 +546,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag SnapshotVO snapshot = _snapshotDao.findById(snapshotId); // Precondition: snapshot is not null and not removed. Long origVolumeId = snapshot.getVolumeId(); VolumeVO originalVolume = _volsDao.findById(origVolumeId); // NOTE: Original volume could be destroyed and removed. - VMTemplateVO template = null; - if (originalVolume != null) { - template = _templateDao.findById(originalVolume.getTemplateId()); - } Pair volumeDetails = createVolumeFromSnapshot(volume, snapshot, originalVolume.getSize()); createdVolume = volumeDetails.first(); @@ -793,7 +681,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag s_logger.debug("Unable to create a volume for " + volume); } volume.setStatus(AsyncInstanceCreateStatus.Failed); - volume.setDestroyed(true); + volume.setState(Volume.State.Destroy); _volsDao.persist(volume); _volsDao.remove(volume.getId()); volume = null; @@ -816,12 +704,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag return volume; } - @Override - public List create(Account account, VMInstanceVO vm, VMTemplateVO template, DataCenterVO dc, HostPodVO pod, ServiceOfferingVO offering, DiskOfferingVO diskOffering, long size) throws StorageUnavailableException, ExecutionException { - List avoids = new ArrayList(); - return create(account, vm, template, dc, pod, offering, diskOffering, avoids, size); - } - @DB protected List create(Account account, VMInstanceVO vm, VMTemplateVO template, DataCenterVO dc, HostPodVO pod, ServiceOfferingVO offering, DiskOfferingVO diskOffering, List avoids, long size) { @@ -892,30 +774,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } } - @Override - public long createUserVM(Account account, VMInstanceVO vm, VMTemplateVO template, DataCenterVO dc, HostPodVO pod, ServiceOfferingVO offering, DiskOfferingVO diskOffering, - List avoids, long size) { - List volumes = create(account, vm, template, dc, pod, offering, diskOffering, avoids, size); - if( volumes == null || volumes.size() == 0) { - throw new CloudRuntimeException("Unable to create volume for " + vm.getName()); - } - - for (VolumeVO v : volumes) { - - //when the user vm is created, the volume is attached upon creation - //set the attached datetime - try{ - v.setAttached(new Date()); - _volsDao.update(v.getId(), v); - }catch(Exception e) - { - s_logger.warn("Error updating the attached value for volume "+v.getId()+":"+e); - } - } - - return volumes.get(0).getPoolId(); - } - public Long chooseHostForStoragePool(StoragePoolVO poolVO, List avoidHosts, boolean sendToVmResidesOn, Long vmId) { if (sendToVmResidesOn) { if (vmId != null) { @@ -941,30 +799,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag return null; } - @Override - public String chooseStorageIp(VMInstanceVO vm, Host host, Host storage) { - Enumeration en = _storagePoolAllocators.enumeration(); - while (en.hasMoreElements()) { - StoragePoolAllocator allocator = en.nextElement(); - String ip = allocator.chooseStorageIp(vm, host, storage); - if (ip != null) { - return ip; - } - } - - assert false : "Hmm....fell thru the loop"; - return null; - } - - @Override - public boolean unshare(VMInstanceVO vm, List vols, HostVO host) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Asking for volumes of " + vm.toString() + " to be unshared to " + (host != null ? host.toString() : "all")); - } - - return true; - } - @Override public boolean configure(String name, Map params) throws ConfigurationException { _name = name; @@ -1223,15 +1057,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } } - List hosts = null; - if (clusterId != null) { - hosts = _hostDao.listByCluster(clusterId); - } else if (podId != null) { - hosts = _hostDao.listByHostPod(podId); - } else { - hosts = _hostDao.listByDataCenter(zoneId); - } - String scheme = uri.getScheme(); String storageHost = uri.getHost(); String hostPath = uri.getPath(); @@ -1413,6 +1238,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag sPool.setUuid(null); _storagePoolDao.update(id, sPool); _storagePoolDao.remove(id); + deleteHostorPoolStats(id); return true; } else { // 1. Check if the pool has associated volumes in the volumes table @@ -1462,6 +1288,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag sPool.setStatus(Status.Removed); _storagePoolDao.update(id, sPool); _storagePoolDao.remove(id); + deleteHostorPoolStats(id); return true; } } @@ -1470,6 +1297,20 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } + @DB + private boolean deleteHostorPoolStats(Long hostorPoolId){ + + List capacities = _capacityDao.findByHostorPoolId(hostorPoolId); + Transaction txn = Transaction.currentTxn(); + txn.start(); + for (CapacityVO capacity : capacities){ + _capacityDao.remove(capacity.getId()); + } + txn.commit(); + return true; + + } + @Override public boolean addPoolToHost(long hostId, StoragePoolVO pool) { s_logger.debug("Adding pool " + pool.getName() + " to host " + hostId); @@ -1580,7 +1421,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag /*Just allocate a volume in the database, don't send the createvolume cmd to hypervisor. The volume will be finally created only when it's attached to a VM.*/ - @Override + @Override @ActionEvent (eventType=EventTypes.EVENT_VOLUME_CREATE, eventDescription="creating volume", create=true) public VolumeVO allocVolume(CreateVolumeCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, ResourceAllocationException { // FIXME: some of the scheduled event stuff might be missing here... Account account = UserContext.current().getCaller(); @@ -1724,7 +1565,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag volume.setPodId(null); volume.setAccountId(targetAccount.getId()); volume.setDomainId(((account == null) ? Domain.ROOT_DOMAIN : account.getDomainId())); - volume.setMirrorState(MirrorState.NOT_MIRRORED); volume.setDiskOfferingId(diskOfferingId); volume.setSize(size); volume.setStorageResourceType(StorageResourceType.STORAGE_POOL); @@ -1738,7 +1578,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag return volume; } - @Override @DB + @Override @DB @ActionEvent (eventType=EventTypes.EVENT_VOLUME_CREATE, eventDescription="creating volume", async=true) public VolumeVO createVolume(CreateVolumeCmd cmd) { VolumeVO volume = _volsDao.findById(cmd.getEntityId()); // VolumeVO createdVolume = null; @@ -2040,27 +1880,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag } } - @Override - public StoragePoolVO getStoragePoolForVm(long vmId) { - SearchCriteria sc = PoolsUsedByVmSearch.create(); - sc.setJoinParameters("volumes", "vm", vmId); - sc.setJoinParameters("volumes", "status", AsyncInstanceCreateStatus.Created.toString()); - List sps= _storagePoolDao.search(sc, null); - if( sps.size() == 0 ) { - throw new RuntimeException("Volume is not created for VM " + vmId); - } - StoragePoolVO sp = sps.get(0); - for (StoragePoolVO tsp: sps ) { - // use the local storage pool to choose host, - // shared storage pool should be in the same cluster as local storage pool - if( tsp.isLocal()) { - sp = tsp; - break; - } - } - return sp; - } - @Override public String getPrimaryStorageNameLabel(VolumeVO volume) { Long poolId = volume.getPoolId(); @@ -2246,18 +2065,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag _storagePoolDao.persist(primaryStorage); } - 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(Event.State.Scheduled); - event.setDescription("Scheduled async job for "+description); - event = _eventDao.persist(event); - return event.getId(); - } - @Override @DB public synchronized StoragePoolVO cancelPrimaryStorageForMaintenance(CancelPrimaryStorageMaintenanceCmd cmd) throws ServerApiException{ @@ -2289,7 +2096,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag //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)) + if((volume.getState() != Volume.State.Destroy) && (volume.getRemoved() == null)) { VMInstanceVO vmInstance = _vmInstanceDao.findById(volume.getInstanceId()); @@ -2389,7 +2196,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag private boolean sendToVmResidesOn(StoragePoolVO storagePool, Command cmd) { ClusterVO cluster = _clusterDao.findById(storagePool.getClusterId()); - if ((cluster.getHypervisorType() == HypervisorType.KVM) && + if ((cluster.getHypervisorType() == HypervisorType.KVM || cluster.getHypervisorType() == HypervisorType.VmWare) && ((cmd instanceof ManageSnapshotCommand) || (cmd instanceof BackupSnapshotCommand))) { return true; @@ -2502,7 +2309,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag if(vm instanceof UserVm){ long sizeMB = size / (1024 * 1024); - EventUtils.saveEvent(userId, vol.getAccountId(), EventTypes.EVENT_VOLUME_CREATE, "Created volume: "+ vol.getName() +" with size: " + sizeMB + " MB"); UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, vol.getAccountId(), vol.getDataCenterId(), vol.getId(), vol.getName(), offering.getId(), null , sizeMB); _usageEventDao.persist(usageEvent); @@ -2535,8 +2341,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag if(type.equals(VolumeType.ROOT)) { vol.setDeviceId(0l); - if(!vm.getType().equals(Type.User)) - vol.setRecreatable(true); + if(!vm.getType().equals(Type.User)) { + vol.setRecreatable(true); + } } else { vol.setDeviceId(1l); } @@ -2547,8 +2354,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag if(vm instanceof UserVm){ long sizeMB = vol.getSize() / (1024 * 1024); - EventUtils.saveEvent(userId, vol.getAccountId(), EventTypes.EVENT_VOLUME_CREATE, "Created volume: "+ vol.getName() +" with size: " + sizeMB + " MB"); - Long offeringId = null; if(offering.getType() == DiskOfferingVO.Type.Disk){ @@ -2572,7 +2377,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag return createDiskCharacteristics(volume, offering); } - protected StoragePool findStorage(DiskProfile dskCh, DeployDestination dest, VirtualMachineProfile vm, List alreadyAllocated, Set avoid) { + protected StoragePool findStorage(DiskProfile dskCh, DeployDestination dest, VirtualMachineProfile vm, List alreadyAllocated, Set avoid) { for (StoragePoolAllocator allocator : _storagePoolAllocators) { StoragePool pool = allocator.allocateTo(dskCh, vm, dest, alreadyAllocated, avoid); if (pool != null) { @@ -2604,7 +2409,6 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag List recreateVols = new ArrayList(vols.size()); - int i = 0; for (VolumeVO vol : vols) { Volume.State state = vol.getState(); if (state == Volume.State.Ready) { @@ -2643,9 +2447,11 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag for (VolumeVO vol : recreateVols) { VolumeVO newVol; if (vol.getState() == Volume.State.Allocated) { + vol.setRecreatable(true); newVol = vol; } else { newVol = switchVolume(vol); + newVol.setRecreatable(true); if (s_logger.isDebugEnabled()) { s_logger.debug("Created new volume " + newVol + " for old volume " + vol); } diff --git a/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java index 2e8d3f3fa1c..c613e84afea 100644 --- a/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java @@ -78,7 +78,7 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator { protected GenericSearchBuilder VmsOnPoolSearch; - private int _hoursToSkipStoppedVMs = 24; + private int _secondsToSkipStoppedVMs = 86400; private int _secStorageVmRamSize = 1024; private int _proxyRamSize = 256; private int _routerRamSize = 128; @@ -227,7 +227,7 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator { // for stopped/Destroyed VMs, we will skip counting it if it hasn't been used for a while long millisecondsSinceLastUpdate = DateUtil.currentGMTTime().getTime() - vm.getUpdateTime().getTime(); - if(millisecondsSinceLastUpdate > _hoursToSkipStoppedVMs*3600000L) { + if(millisecondsSinceLastUpdate > _secondsToSkipStoppedVMs*1000L) { if(s_logger.isDebugEnabled()) { s_logger.debug("Skip counting vm " + vm.getInstanceName() + " in capacity allocation as it has been stopped for " + millisecondsSinceLastUpdate/60000 + " minutes"); } @@ -284,8 +284,8 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator { _extraBytesPerVolume = NumbersUtil.parseLong((String) params.get("extra.bytes.per.volume"), 50 * 1024L * 1024L); Map configs = _configDao.getConfiguration("management-server", params); - String value = configs.get("capacity.skipcounting.hours"); - _hoursToSkipStoppedVMs = NumbersUtil.parseInt(value, 24); + String value = configs.get("vm.resource.release.interval"); + _secondsToSkipStoppedVMs = NumbersUtil.parseInt(value, 86400); // TODO this is not good, there should be one place to get these values _secStorageVmRamSize = NumbersUtil.parseInt(configs.get("secstorage.vm.ram.size"), 256); diff --git a/server/src/com/cloud/storage/dao/SnapshotDao.java b/server/src/com/cloud/storage/dao/SnapshotDao.java index fcd6d6dd064..061d3adbd30 100644 --- a/server/src/com/cloud/storage/dao/SnapshotDao.java +++ b/server/src/com/cloud/storage/dao/SnapshotDao.java @@ -32,5 +32,6 @@ public interface SnapshotDao extends GenericDao { long getLastSnapshot(long volumeId, long snapId); List listByVolumeIdType(long volumeId, String type); List listByVolumeIdIncludingRemoved(long volumeId); + List listByBackupUuid(long volumeId, String backupUuid); } diff --git a/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java b/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java index fe7f44dc68b..49b00ad9566 100644 --- a/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java +++ b/server/src/com/cloud/storage/dao/SnapshotDaoImpl.java @@ -41,6 +41,8 @@ public class SnapshotDaoImpl extends GenericDaoBase implements private final SearchBuilder VolumeIdSearch; private final SearchBuilder VolumeIdTypeSearch; private final SearchBuilder ParentIdSearch; + private final SearchBuilder backupUuidSearch; + @Override public SnapshotVO findNextSnapshot(long snapshotId) { @@ -49,6 +51,13 @@ public class SnapshotDaoImpl extends GenericDaoBase implements return findOneIncludingRemovedBy(sc); } + @Override + public List listByBackupUuid(long volumeId, String backupUuid) { + SearchCriteria sc = backupUuidSearch.create(); + sc.setParameters("backupUuid", backupUuid); + return listBy(sc, null); + } + @Override public List listByVolumeIdType(long volumeId, String type ) { return listByVolumeIdType(null, volumeId, type); @@ -93,6 +102,10 @@ public class SnapshotDaoImpl extends GenericDaoBase implements ParentIdSearch = createSearchBuilder(); ParentIdSearch.and("prevSnapshotId", ParentIdSearch.entity().getPrevSnapshotId(), SearchCriteria.Op.EQ); ParentIdSearch.done(); + + backupUuidSearch = createSearchBuilder(); + backupUuidSearch.and("backupUuid", backupUuidSearch.entity().getBackupSnapshotId(), SearchCriteria.Op.EQ); + backupUuidSearch.done(); } diff --git a/server/src/com/cloud/storage/dao/VolumeDao.java b/server/src/com/cloud/storage/dao/VolumeDao.java index e35b5e041ff..111db187bcf 100755 --- a/server/src/com/cloud/storage/dao/VolumeDao.java +++ b/server/src/com/cloud/storage/dao/VolumeDao.java @@ -33,7 +33,6 @@ public interface VolumeDao extends GenericDao { List findByInstance(long id); List findByInstanceAndType(long id, Volume.VolumeType vType); List findByInstanceIdDestroyed(long vmId); - List findByDetachedDestroyed(); List findByAccountAndPod(long accountId, long podId); List findByTemplateAndZone(long templateId, long zoneId); List findVmsStoredOnHost(long hostId); @@ -41,7 +40,6 @@ public interface VolumeDao extends GenericDao { void attachVolume(long volumeId, long vmId, long deviceId); void detachVolume(long volumeId); boolean isAnyVolumeActivelyUsingTemplateOnPool(long templateId, long poolId); - List listRemovedButNotDestroyed(); List findCreatedByInstance(long id); List findByPoolId(long poolId); List findByInstanceAndDeviceId(long instanceId, long deviceId); diff --git a/server/src/com/cloud/storage/dao/VolumeDaoImpl.java b/server/src/com/cloud/storage/dao/VolumeDaoImpl.java index ecdb37b9bb0..8a7df128c5c 100755 --- a/server/src/com/cloud/storage/dao/VolumeDaoImpl.java +++ b/server/src/com/cloud/storage/dao/VolumeDaoImpl.java @@ -53,9 +53,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol protected final SearchBuilder DetachedAccountIdSearch; protected final SearchBuilder TemplateZoneSearch; protected final GenericSearchBuilder TotalSizeByPoolSearch; - protected final SearchBuilder DetachedDestroyedSearch; protected final GenericSearchBuilder ActiveTemplateSearch; - protected final SearchBuilder RemovedButNotDestroyedSearch; protected final SearchBuilder InstanceStatesSearch; protected final SearchBuilder AllFieldsSearch; @@ -66,14 +64,6 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol protected static final String SELECT_VM_ID_SQL = "SELECT DISTINCT instance_id from volumes v where v.host_id = ?"; protected static final String SELECT_HYPERTYPE_FROM_VOLUME = "SELECT c.hypervisor_type from volumes v, storage_pool s, cluster c where v.pool_id = s.id and s.cluster_id = c.id and v.id = ?"; - @Override - public List listRemovedButNotDestroyed() { - SearchCriteria sc = RemovedButNotDestroyedSearch.create(); - sc.setParameters("destroyed", false); - - return searchIncludingRemoved(sc, null, null, false); - } - @Override @DB public List findVmsStoredOnHost(long hostId) { Transaction txn = Transaction.currentTxn(); @@ -100,7 +90,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol public List findDetachedByAccount(long accountId) { SearchCriteria sc = DetachedAccountIdSearch.create(); sc.setParameters("accountId", accountId); - sc.setParameters("destroyed", false); + sc.setParameters("destroyed", Volume.State.Destroy); return listBy(sc); } @@ -131,6 +121,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol public List findByPoolId(long poolId) { SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("poolId", poolId); + sc.setParameters("destroyed", false); return listBy(sc); } @@ -168,13 +159,6 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol return listIncludingRemovedBy(sc); } - @Override - public List findByDetachedDestroyed() { - SearchCriteria sc = DetachedDestroyedSearch.create(); - sc.setParameters("destroyed", true); - return listBy(sc); - } - @Override public List findByAccountAndPod(long accountId, long podId) { SearchCriteria sc = AllFieldsSearch.create(); @@ -282,7 +266,6 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol protected VolumeDaoImpl() { AllFieldsSearch = createSearchBuilder(); AllFieldsSearch.and("state", AllFieldsSearch.entity().getState(), Op.EQ); - AllFieldsSearch.and("destroyed", AllFieldsSearch.entity().getDestroyed(), Op.EQ); AllFieldsSearch.and("accountId", AllFieldsSearch.entity().getAccountId(), Op.EQ); AllFieldsSearch.and("pod", AllFieldsSearch.entity().getPodId(), Op.EQ); AllFieldsSearch.and("status", AllFieldsSearch.entity().getStatus(), Op.EQ); @@ -295,7 +278,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol DetachedAccountIdSearch = createSearchBuilder(); DetachedAccountIdSearch.and("accountId", DetachedAccountIdSearch.entity().getAccountId(), Op.EQ); - DetachedAccountIdSearch.and("destroyed", DetachedAccountIdSearch.entity().getDestroyed(), Op.EQ); + DetachedAccountIdSearch.and("destroyed", DetachedAccountIdSearch.entity().getState(), Op.NEQ); DetachedAccountIdSearch.and("instanceId", DetachedAccountIdSearch.entity().getInstanceId(), Op.NULL); DetachedAccountIdSearch.done(); @@ -311,11 +294,6 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol TotalSizeByPoolSearch.and("removed", TotalSizeByPoolSearch.entity().getRemoved(), Op.NULL); TotalSizeByPoolSearch.done(); - DetachedDestroyedSearch = createSearchBuilder(); - DetachedDestroyedSearch.and("instanceId", DetachedDestroyedSearch.entity().getInstanceId(), Op.NULL); - DetachedDestroyedSearch.and("destroyed", DetachedDestroyedSearch.entity().getDestroyed(), Op.EQ); - DetachedDestroyedSearch.done(); - ActiveTemplateSearch = createSearchBuilder(Long.class); ActiveTemplateSearch.and("pool", ActiveTemplateSearch.entity().getPoolId(), Op.EQ); ActiveTemplateSearch.and("template", ActiveTemplateSearch.entity().getTemplateId(), Op.EQ); @@ -323,11 +301,6 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol ActiveTemplateSearch.select(null, Func.COUNT, null); ActiveTemplateSearch.done(); - RemovedButNotDestroyedSearch = createSearchBuilder(); - RemovedButNotDestroyedSearch.and("destroyed", RemovedButNotDestroyedSearch.entity().getDestroyed(), Op.EQ); - RemovedButNotDestroyedSearch.and("removed", RemovedButNotDestroyedSearch.entity().getRemoved(), Op.NNULL); - RemovedButNotDestroyedSearch.done(); - InstanceStatesSearch = createSearchBuilder(); InstanceStatesSearch.and("instance", InstanceStatesSearch.entity().getInstanceId(), Op.EQ); InstanceStatesSearch.and("states", InstanceStatesSearch.entity().getState(), Op.IN); diff --git a/server/src/com/cloud/storage/download/DownloadListener.java b/server/src/com/cloud/storage/download/DownloadListener.java index 531381e569f..61a117ac9f1 100644 --- a/server/src/com/cloud/storage/download/DownloadListener.java +++ b/server/src/com/cloud/storage/download/DownloadListener.java @@ -175,7 +175,6 @@ public class DownloadListener implements Listener { public void logDisconnect() { s_logger.warn("Unable to monitor download progress of " + template.getName() + " at host " + sserver.getName()); - downloadMonitor.logEvent(template.getAccountId(), EventTypes.EVENT_TEMPLATE_DOWNLOAD_FAILED, "Storage server " + sserver.getName() + " disconnected during download of template " + template.getName(), EventVO.LEVEL_WARN); } public synchronized void updateDatabase(Status state, String errorString) { @@ -368,7 +367,6 @@ public class DownloadListener implements Listener { } public void logDownloadStart() { - downloadMonitor.logEvent(template.getAccountId(), EventTypes.EVENT_TEMPLATE_DOWNLOAD_START, "Storage server " + sserver.getName() + " started download of template " + template.getName(), EventVO.LEVEL_INFO); } @Override diff --git a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java index 32f0b23ed13..b6efd9e0e2f 100755 --- a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java +++ b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java @@ -42,7 +42,6 @@ import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.event.EventTypes; -import com.cloud.event.EventVO; import com.cloud.event.UsageEventVO; import com.cloud.event.dao.EventDao; import com.cloud.event.dao.UsageEventDao; @@ -99,8 +98,6 @@ public class DownloadMonitorImpl implements DownloadMonitor { private final DataCenterDao _dcDao = null; @Inject VMTemplateDao _templateDao = null; - @Inject - private final EventDao _eventDao = null; @Inject private AgentManager _agentMgr; @Inject @@ -124,17 +121,6 @@ public class DownloadMonitorImpl implements DownloadMonitor { return _agentMgr.gatherStats(hostId, cmd, listener); } - public void logEvent(long accountId, String evtType, String description, String level) { - EventVO event = new EventVO(); - event.setUserId(1); - event.setAccountId(accountId); - event.setType(evtType); - event.setDescription(description); - event.setLevel(level); - _eventDao.persist(event); - - } - @Override public boolean configure(String name, Map params) { _name = name; @@ -344,15 +330,6 @@ public class DownloadMonitorImpl implements DownloadMonitor { _listenerMap.remove(vmTemplateHost); } } - if (dnldStatus == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { - logEvent(template.getAccountId(), EventTypes.EVENT_TEMPLATE_DOWNLOAD_SUCCESS, template.getName() + " successfully downloaded to storage server " + host.getName(), EventVO.LEVEL_INFO); - } - if (dnldStatus == Status.DOWNLOAD_ERROR) { - logEvent(template.getAccountId(), EventTypes.EVENT_TEMPLATE_DOWNLOAD_FAILED, template.getName() + " failed to download to storage server " + host.getName(), EventVO.LEVEL_ERROR); - } - if (dnldStatus == Status.ABANDONED) { - logEvent(template.getAccountId(), EventTypes.EVENT_TEMPLATE_DOWNLOAD_FAILED, template.getName() + " :aborted download to storage server " + host.getName(), EventVO.LEVEL_WARN); - } VMTemplateHostVO vmTemplateHost = _vmTemplateHostDao.findByHostTemplate(host.getId(), template.getId()); @@ -364,22 +341,11 @@ public class DownloadMonitorImpl implements DownloadMonitor { else{ s_logger.warn("Failed to get size for template" + template.getName()); } - String eventParams = "id=" + template.getId() + "\ndcId="+host.getDataCenterId()+"\nsize="+size; - EventVO event = new EventVO(); - event.setUserId(1L); - event.setAccountId(template.getAccountId()); + String eventType = EventTypes.EVENT_TEMPLATE_CREATE; if((template.getFormat()).equals(ImageFormat.ISO)){ - event.setType(EventTypes.EVENT_ISO_CREATE); - event.setDescription("Successfully created ISO " + template.getName()); + eventType = EventTypes.EVENT_ISO_CREATE; } - else{ - event.setType(EventTypes.EVENT_TEMPLATE_CREATE); - event.setDescription("Successfully created template " + template.getName()); - } - event.setParameters(eventParams); - event.setLevel(EventVO.LEVEL_INFO); - _eventDao.persist(event); - UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_TEMPLATE_CREATE, template.getAccountId(), host.getDataCenterId(), template.getId(), template.getName(), null, null , size); + UsageEventVO usageEvent = new UsageEventVO(eventType, template.getAccountId(), host.getDataCenterId(), template.getId(), template.getName(), null, null , size); _usageEventDao.persist(usageEvent); } @@ -517,12 +483,10 @@ public class DownloadMonitorImpl implements DownloadMonitor { long result = send(sserverId, dtCommand, null); if (result == -1 ){ String description = "Failed to delete " + tInfo.getTemplateName() + " on secondary storage " + sserverId + " which isn't in the database"; - logEvent(1L, EventTypes.EVENT_TEMPLATE_CLEANUP, description , EventVO.LEVEL_ERROR); s_logger.error(description); return; } String description = "Deleted template " + tInfo.getTemplateName() + " on secondary storage " + sserverId + " since it isn't in the database, result=" + result; - logEvent(1L, EventTypes.EVENT_TEMPLATE_CLEANUP, description, EventVO.LEVEL_INFO); s_logger.info(description); } diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 0de7fc0d15a..acca6f5604a 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -57,9 +57,6 @@ import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; -import com.cloud.event.EventTypes; -import com.cloud.event.EventUtils; -import com.cloud.event.EventVO; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; @@ -103,6 +100,7 @@ import com.cloud.utils.events.SubscriptionMgr; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.cloud.utils.net.NfsUtils; +import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.ReservationContext; @@ -216,12 +214,8 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V @Override public SecondaryStorageVmVO startSecStorageVm(long secStorageVmId) { - boolean started = false; - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_START, - "Starting secondary storage Vm with Id: " + secStorageVmId); try { SecondaryStorageVmVO ssvm = start(secStorageVmId); - started = true; return ssvm; } catch (StorageUnavailableException e) { s_logger.warn("Exception while trying to start secondary storage vm", e); @@ -239,15 +233,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V s_logger.warn("Exception while trying to start secondary storage vm", e); return null; } - finally { - if (started) { - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_INFO, EventTypes.EVENT_SSVM_START, - "Started secondary storage Vm with Id: " + secStorageVmId, startEventId); - } else { - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_SSVM_START, - "Failed to start secondary storage Vm with Id: " + secStorageVmId, startEventId); - } - } } @Override @@ -299,7 +284,8 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V allowedCidrs.add(cidr); } } - String privateCidr = NetUtils.ipAndNetMaskToCidr(secStorageVm.getPrivateIpAddress(), secStorageVm.getPrivateNetmask()); + Nic privateNic = _networkMgr.getNicForTraffic(secStorageVm.getId(), TrafficType.Management); + String privateCidr = NetUtils.ipAndNetMaskToCidr(privateNic.getIp4Address(), privateNic.getNetmask()); String publicCidr = NetUtils.ipAndNetMaskToCidr(secStorageVm.getPublicIpAddress(), secStorageVm.getPublicNetmask()); if (NetUtils.isNetworkAWithinNetworkB(privateCidr, publicCidr) || NetUtils.isNetworkAWithinNetworkB(publicCidr, privateCidr)) { allowedCidrs.add("0.0.0.0/0"); @@ -375,8 +361,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V s_logger.debug("Assign secondary storage vm from a newly started instance for request from data center : " + dataCenterId); } - long startEventId = EventUtils.saveStartedEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventTypes.EVENT_SSVM_CREATE, - "Creating secondary storage Vm in zone : " + dataCenterId); Map context = createSecStorageVmInstance(dataCenterId); long secStorageVmId = (Long) context.get("secStorageVmId"); @@ -385,8 +369,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V s_logger.trace("Creating secondary storage vm instance failed, data center id : " + dataCenterId); } - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_SSVM_CREATE, - "Failed to create secondary storage Vm in zone : " + dataCenterId, startEventId); return null; } @@ -396,8 +378,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V if (secStorageVm != null) { SubscriptionMgr.getInstance().notifySubscribers(ALERT_SUBJECT, this, new SecStorageVmAlertEventArgs(SecStorageVmAlertEventArgs.SSVM_CREATED, dataCenterId, secStorageVmId, secStorageVm, null)); - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_INFO, EventTypes.EVENT_SSVM_CREATE, - "Successfully created secondary storage Vm " + secStorageVm.getName() + " in zone : " + dataCenterId, startEventId); return secStorageVm; } else { if (s_logger.isDebugEnabled()) { @@ -410,8 +390,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V this, new SecStorageVmAlertEventArgs(SecStorageVmAlertEventArgs.SSVM_CREATE_FAILURE, dataCenterId, secStorageVmId, null, "Unable to allocate storage")); - EventUtils.saveEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM, EventVO.LEVEL_ERROR, EventTypes.EVENT_SSVM_CREATE, - "Failed to create secondary storage Vm in zone : " + dataCenterId, startEventId); } return null; } @@ -1013,7 +991,6 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V * secondary * storage */ - secStorageVm.setPrivateNetmask(cmd.getStorageNetmask()); secStorageVm.setPublicIpAddress(cmd.getPublicIpAddress()); secStorageVm.setPublicNetmask(cmd.getPublicNetmask()); _secStorageVmDao.persist(secStorageVm); @@ -1160,13 +1137,8 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V secVm.setPublicIpAddress(nic.getIp4Address()); secVm.setPublicNetmask(nic.getNetmask()); secVm.setPublicMacAddress(nic.getMacAddress()); - } else if (network.getTrafficType() == TrafficType.Control) { - secVm.setGuestIpAddress(nic.getIp4Address()); - secVm.setGuestNetmask(nic.getNetmask()); - secVm.setGuestMacAddress(nic.getMacAddress()); } else if (network.getTrafficType() == TrafficType.Management) { secVm.setPrivateIpAddress(nic.getIp4Address()); - secVm.setPrivateNetmask(nic.getNetmask()); secVm.setPrivateMacAddress(nic.getMacAddress()); } } diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index 044bd672065..132f1653db1 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -57,8 +57,6 @@ import com.cloud.dc.dao.DataCenterDao; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.event.EventTypes; -import com.cloud.event.EventUtils; -import com.cloud.event.EventVO; import com.cloud.event.UsageEventVO; import com.cloud.event.dao.EventDao; import com.cloud.event.dao.UsageEventDao; @@ -79,6 +77,7 @@ import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.DiskOfferingDao; import com.cloud.storage.dao.SnapshotDao; @@ -180,7 +179,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma } } } - if (volume.getDestroyed() || volume.getRemoved() != null) { + if (volume.getState() == Volume.State.Destroy || volume.getRemoved() != null) { s_logger.debug("Volume: " + volumeId + " is destroyed/removed. Not taking snapshot"); runSnap = false; } @@ -211,9 +210,6 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma if (storagePoolVO == null) { throw new InvalidParameterValueException("VolumeId: " + volumeId + " does not have a valid storage pool. Is it destroyed?"); } - if (!isVolumeDirty(volumeId, policyId)) { - throw new CloudRuntimeException("There is no change for volume " + volumeId + " since last snapshot, please use the last snapshot instead."); - } Long id = null; @@ -244,11 +240,10 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma long preId = _snapshotDao.getLastSnapshot(volumeId, id); String preSnapshotPath = null; - SnapshotVO preSnapshotVO = null; if( preId != 0) { preSnapshotVO = _snapshotDao.findByIdIncludingRemoved(preId); - if (preSnapshotVO != null) { + if (preSnapshotVO != null && preSnapshotVO.getBackupSnapshotId() != null ) { preSnapshotPath = preSnapshotVO.getPath(); } } @@ -264,10 +259,11 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma //empty snapshot s_logger.debug("CreateSnapshot: this is empty snapshot, remove it "); createdSnapshot = _snapshotDao.findByIdIncludingRemoved(id); - // delete from the snapshots table - _snapshotDao.expunge(id); - throw new CloudRuntimeException("There is no change for volume " + volumeId + " since last snapshot, please use last snapshot instead."); - + createdSnapshot.setPath(preSnapshotPath); + createdSnapshot.setBackupSnapshotId(preSnapshotVO.getBackupSnapshotId()); + createdSnapshot.setStatus(Snapshot.Status.BackedUp); + createdSnapshot.setPrevSnapshotId(preId); + _snapshotDao.update(id, createdSnapshot); } else { long preSnapshotId = 0; if( preSnapshotVO != null && preSnapshotVO.getBackupSnapshotId() != null) { @@ -294,16 +290,17 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma } } createdSnapshot = updateDBOnCreate(id, answer.getSnapshotPath(), preSnapshotId); - // Get the snapshot_schedule table entry for this snapshot and - // policy id. - // Set the snapshotId to retrieve it back later. - if( policyId != Snapshot.MANUAL_POLICY_ID) { - SnapshotScheduleVO snapshotSchedule = _snapshotScheduleDao.getCurrentSchedule(volumeId, policyId, true); - assert snapshotSchedule != null; - snapshotSchedule.setSnapshotId(id); - _snapshotScheduleDao.update(snapshotSchedule.getId(), snapshotSchedule); - } } + // Get the snapshot_schedule table entry for this snapshot and + // policy id. + // Set the snapshotId to retrieve it back later. + if (policyId != Snapshot.MANUAL_POLICY_ID) { + SnapshotScheduleVO snapshotSchedule = _snapshotScheduleDao.getCurrentSchedule(volumeId, policyId, true); + assert snapshotSchedule != null; + snapshotSchedule.setSnapshotId(id); + _snapshotScheduleDao.update(snapshotSchedule.getId(), snapshotSchedule); + } + } else { if (answer != null) { s_logger.error(answer.getDetails()); @@ -356,8 +353,9 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma List hosts = _hostDao.listByCluster(cluster.getId()); if (hosts != null && !hosts.isEmpty()) { HostVO host = hosts.get(0); - if (!hostSupportSnapsthot(host)) - throw new CloudRuntimeException("KVM Snapshot is not supported on cluster: " + host.getId()); + if (!hostSupportSnapsthot(host)) { + throw new CloudRuntimeException("KVM Snapshot is not supported on cluster: " + host.getId()); + } } } @@ -432,7 +430,6 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma @Override @DB public boolean backupSnapshotToSecondaryStorage(SnapshotVO ss) { - Long userId = getSnapshotUserId(); long snapshotId = ss.getId(); SnapshotVO snapshot = _snapshotDao.acquireInLockTable(snapshotId); if( snapshot == null) { @@ -462,8 +459,10 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma long prevSnapshotId = snapshot.getPrevSnapshotId(); if (prevSnapshotId > 0) { prevSnapshot = _snapshotDao.findByIdIncludingRemoved(prevSnapshotId); - prevSnapshotUuid = prevSnapshot.getPath(); prevBackupUuid = prevSnapshot.getBackupSnapshotId(); + if( prevBackupUuid != null ) { + prevSnapshotUuid = prevSnapshot.getPath(); + } } boolean isVolumeInactive = _storageMgr.volumeInactive(volume); @@ -507,6 +506,9 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma if (backedUp) { snapshot.setBackupSnapshotId(backedUpSnapshotUuid); + if( answer.isFull()) { + snapshot.setPrevSnapshotId(0); + } snapshot.setStatus(Snapshot.Status.BackedUp); _snapshotDao.update(snapshotId, snapshot); UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_SNAPSHOT_CREATE, snapshot.getAccountId(), volume.getDataCenterId(), snapshotId, snapshot.getName(), null, null, volume.getSize()); @@ -580,12 +582,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma // Excess snapshot. delete it asynchronously //destroySnapshotAsync(userId, volumeId, oldSnapId, policyId); // create the event - long startEventId = EventUtils.saveStartedEvent(userId, oldestSnapshot.getAccountId(), EventTypes.EVENT_SNAPSHOT_DELETE, "Deleting snapshot with Id:"+oldSnapId); - if(deleteSnapshotInternal(oldSnapId, policyId)){ - EventUtils.saveEvent(userId, oldestSnapshot.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_SNAPSHOT_DELETE, "Deleted snapshot with Id:"+oldSnapId, startEventId); - } else { - EventUtils.saveEvent(userId, oldestSnapshot.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_SNAPSHOT_DELETE, "Failed to delete snapshot with Id:"+oldSnapId, startEventId); - } + deleteSnapshotInternal(oldSnapId, policyId); snaps.remove(oldestSnapshot); } @@ -682,11 +679,17 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma while (lastSnapshot.getRemoved() != null) { String BackupSnapshotId = lastSnapshot.getBackupSnapshotId(); if (BackupSnapshotId != null) { - if (destroySnapshotBackUp(lastId, policyId)) { - + List snaps = _snapshotDao.listByBackupUuid(lastSnapshot.getVolumeId(), BackupSnapshotId); + if ( snaps.size() > 1 ) { + lastSnapshot.setBackupSnapshotId(null); + _snapshotDao.update(lastSnapshot.getId(), lastSnapshot); } else { - s_logger.debug("Destroying snapshot backup failed " + lastSnapshot); - break; + if (destroySnapshotBackUp(lastId, policyId)) { + + } else { + s_logger.debug("Destroying snapshot backup failed " + lastSnapshot); + break; + } } } postDeleteSnapshot(lastId, policyId); @@ -722,17 +725,20 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma Long volumeId = volume.getId(); String backupOfSnapshot = snapshot.getBackupSnapshotId(); - + if ( backupOfSnapshot == null ) { + return true; + } DeleteSnapshotBackupCommand cmd = new DeleteSnapshotBackupCommand(primaryStoragePoolNameLabel, secondaryStoragePoolUrl, dcId, accountId, volumeId, backupOfSnapshot, snapshot.getName()); + snapshot.setBackupSnapshotId(null); + _snapshotDao.update(snapshotId, snapshot); details = "Failed to destroy snapshot id:" + snapshotId + " for volume: " + volume.getId(); Answer answer = _storageMgr.sendToHostsOnStoragePool(volume.getPoolId(), cmd, details, _totalRetries, _pauseInterval, _shouldBeSnapshotCapable, volume.getInstanceId()); if ((answer != null) && answer.getResult()) { - snapshot.setBackupSnapshotId(null); - _snapshotDao.update(snapshotId, snapshot); + // This is not the last snapshot. success = true; details = "Successfully deleted snapshot " + snapshotId + " for volumeId: " + volumeId + " and policyId " @@ -750,7 +756,6 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma _usageEventDao.persist(usageEvent); } - return success; } @@ -774,7 +779,8 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma @Override public List listSnapshots(ListSnapshotsCmd cmd) throws InvalidParameterValueException, PermissionDeniedException { Long volumeId = cmd.getVolumeId(); - + Boolean isRecursive = cmd.isRecursive(); + // Verify parameters if(volumeId != null){ VolumeVO volume = _volsDao.findById(volumeId); @@ -795,7 +801,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma } } else if ((account != null) && (account.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN)) { domainId = account.getDomainId(); - } + } if (domainId != null && accountName != null) { Account userAccount = _accountDao.findActiveAccount(accountName, domainId); @@ -807,6 +813,9 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma accountId = account.getId(); } + if(isRecursive == null) + isRecursive = false; + Object name = cmd.getSnapshotName(); Object id = cmd.getId(); Object keyword = cmd.getKeyword(); @@ -828,7 +837,10 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma sb.join("accountSearch", accountSearch, sb.entity().getAccountId(), accountSearch.entity().getId(), JoinType.INNER); SearchBuilder domainSearch = _domainDao.createSearchBuilder(); - domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE); + if(isRecursive) + domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE); + else + domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.EQ); accountSearch.join("domainSearch", domainSearch, accountSearch.entity().getDomainId(), domainSearch.entity().getId(), JoinType.INNER); } @@ -860,7 +872,10 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma } else if (domainId != null) { DomainVO domain = _domainDao.findById(domainId); SearchCriteria joinSearch = sc.getJoin("accountSearch"); - joinSearch.setJoinParameters("domainSearch", "path", domain.getPath() + "%"); + if(isRecursive) + joinSearch.setJoinParameters("domainSearch", "path", domain.getPath() + "%"); + else + joinSearch.setJoinParameters("domainSearch", "path", domain.getPath()); } if (snapshotTypeStr != null) { @@ -928,7 +943,6 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma _accountMgr.decrementResourceCount(accountId, ResourceType.snapshot); //Log event after successful deletion - EventUtils.saveEvent(User.UID_SYSTEM, snapshot.getAccountId(), EventTypes.EVENT_SNAPSHOT_DELETE, "Successfully deleted snapshot " + snapshot.getId() + " for volumeId: " + snapshot.getVolumeId()); UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_SNAPSHOT_DELETE, snapshot.getAccountId(), volume.getDataCenterId(), snapshot.getId(), snapshot.getName(), null, null, volume.getSize()); _usageEventDao.persist(usageEvent); } @@ -994,11 +1008,8 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma SnapshotPolicyVO policy = new SnapshotPolicyVO(volumeId, cmd.getSchedule(), timezoneId, (short)type.ordinal(), cmd.getMaxSnaps()); // Create an event - EventVO event = new EventVO(); try{ policy = _snapshotPolicyDao.persist(policy); - event.setType(EventTypes.EVENT_SNAPSHOT_POLICY_CREATE); - event.setDescription("Successfully created snapshot policy with Id: "+ policy.getId()); } catch (EntityExistsException e ) { policy = _snapshotPolicyDao.findOneByVolume(volumeId); try { @@ -1014,13 +1025,7 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma _snapshotPolicyDao.releaseFromLockTable(policy.getId()); } } - event.setType(EventTypes.EVENT_SNAPSHOT_POLICY_UPDATE); - event.setDescription("Successfully updated snapshot policy with Id: "+ policy.getId()); } - event.setAccountId(accountId); - event.setUserId(userId); - event.setLevel(EventVO.LEVEL_INFO); - _eventDao.persist(event); _snapSchedMgr.scheduleNextSnapshotJob(policy); return policy; } @@ -1028,22 +1033,8 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma @Override public boolean deletePolicy(long userId, Long policyId) { SnapshotPolicyVO snapshotPolicy = _snapshotPolicyDao.findById(policyId); - VolumeVO volume = _volsDao.findById(snapshotPolicy.getVolumeId()); _snapSchedMgr.removeSchedule(snapshotPolicy.getVolumeId(), snapshotPolicy.getId()); - EventVO event = new EventVO(); - event.setAccountId(volume.getAccountId()); - event.setUserId(userId); - event.setType(EventTypes.EVENT_SNAPSHOT_POLICY_DELETE); - boolean success = _snapshotPolicyDao.remove(policyId); - if(success){ - event.setLevel(EventVO.LEVEL_INFO); - event.setDescription("Successfully deleted snapshot policy with Id: "+policyId); - } else { - event.setLevel(EventVO.LEVEL_ERROR); - event.setDescription("Failed to delete snapshot policy with Id: "+policyId); - } - _eventDao.persist(event); - return success; + return _snapshotPolicyDao.remove(policyId); } @Override diff --git a/server/src/com/cloud/storage/upload/UploadListener.java b/server/src/com/cloud/storage/upload/UploadListener.java index 2debf24c84a..dda607b8631 100755 --- a/server/src/com/cloud/storage/upload/UploadListener.java +++ b/server/src/com/cloud/storage/upload/UploadListener.java @@ -250,7 +250,6 @@ public class UploadListener implements Listener { } public void logUploadStart() { - String event = uploadMonitor.getEvent(type); //uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " started upload of " +type.toString() + " " + typeName, EventVO.LEVEL_INFO, eventId); } @@ -418,9 +417,6 @@ public class UploadListener implements Listener { public void logDisconnect() { s_logger.warn("Unable to monitor upload progress of " + typeName + " at host " + sserver.getName()); - String event; - event = uploadMonitor.getEvent(type); - uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " disconnected during upload of " + typeName, EventVO.LEVEL_WARN, eventId); } public void scheduleImmediateStatusCheck(RequestType request) { diff --git a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java index 2258d0ba6b8..b02aec8bf33 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java +++ b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java @@ -27,9 +27,6 @@ import com.cloud.agent.api.storage.UploadProgressCommand.RequestType; import com.cloud.api.ApiDBUtils; import com.cloud.async.AsyncJobManager; import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.event.EventTypes; -import com.cloud.event.EventVO; -import com.cloud.event.dao.EventDao; import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; @@ -75,8 +72,6 @@ public class UploadMonitorImpl implements UploadMonitor { HostDao _serverDao = null; @Inject VMTemplateDao _templateDao = null; - @Inject - private final EventDao _eventDao = null; @Inject private AgentManager _agentMgr; @Inject @@ -159,7 +154,7 @@ public class UploadMonitorImpl implements UploadMonitor { if(vmTemplateHost != null) { start(); - UploadCommand ucmd = new UploadCommand(template, url, vmTemplateHost); + UploadCommand ucmd = new UploadCommand(template, url, vmTemplateHost.getInstallPath(), vmTemplateHost.getSize()); UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadTemplateObj, this, ucmd, template.getAccountId(), template.getName(), type, eventId, asyncJobId, asyncMgr); _listenerMap.put(uploadTemplateObj, ul); @@ -363,20 +358,6 @@ public class UploadMonitorImpl implements UploadMonitor { return true; } - public String getEvent(Type type){ - - if(type == Type.TEMPLATE) { - return EventTypes.EVENT_TEMPLATE_EXTRACT; - } - if(type == Type.ISO) { - return EventTypes.EVENT_ISO_EXTRACT; - } - if(type == Type.VOLUME) { - return EventTypes.EVENT_VOLUME_EXTRACT; - } - - return null; - } public void handleUploadEvent(HostVO host, Long accountId, String typeName, Type type, Long uploadId, com.cloud.storage.Upload.Status reason, long eventId) { if ((reason == Upload.Status.UPLOADED) || (reason==Upload.Status.ABANDONED)){ @@ -386,30 +367,9 @@ public class UploadMonitorImpl implements UploadMonitor { _listenerMap.remove(uploadObj); } } - if (reason == Upload.Status.UPLOADED) { - logEvent(accountId, getEvent(type), typeName + " successfully uploaded from storage server " + host.getName(), EventVO.LEVEL_INFO, eventId); - } - if (reason == Upload.Status.UPLOAD_ERROR) { - logEvent(accountId, getEvent(type), typeName + " failed to upload from storage server " + host.getName(), EventVO.LEVEL_ERROR, eventId); - } - if (reason == Upload.Status.ABANDONED) { - logEvent(accountId, getEvent(type), typeName + " :aborted upload from storage server " + host.getName(), EventVO.LEVEL_WARN, eventId); - } } - public void logEvent(long accountId, String evtType, String description, String level, long eventId) { - EventVO event = new EventVO(); - event.setUserId(1); - event.setAccountId(accountId); - event.setType(evtType); - event.setDescription(description); - event.setLevel(level); - event.setStartId(eventId); - _eventDao.persist(event); - - } - @Override public void handleUploadSync(long sserverId) { diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 654d35c281a..a49f951ac9b 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -549,9 +549,6 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe extractMode = mode.equals(Upload.Mode.FTP_UPLOAD.toString()) ? Upload.Mode.FTP_UPLOAD : Upload.Mode.HTTP_DOWNLOAD; } - long userId = UserContext.current().getCallerUserId(); - long accountId = template.getAccountId(); - String event = isISO ? EventTypes.EVENT_ISO_EXTRACT : EventTypes.EVENT_TEMPLATE_EXTRACT; if (extractMode == Upload.Mode.FTP_UPLOAD){ URI uri = null; try { @@ -580,23 +577,13 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe throw new IllegalArgumentException(template.getName() + " upload is in progress. Please wait for some time to schedule another upload for the same"); } - //long eventId = EventUtils.saveScheduledEvent(userId, accountId, event, "Extraction job"); - - // FIXME: scheduled event should've already been saved, we should be saving this started event here... - // String event = template.getFormat() == ImageFormat.ISO ? EventTypes.EVENT_ISO_UPLOAD : EventTypes.EVENT_TEMPLATE_UPLOAD; - // EventUtils.saveStartedEvent(template.getAccountId(), template.getAccountId(), event, "Starting upload of " +template.getName()+ " to " +url, cmd.getStartEventId()); - - EventUtils.saveStartedEvent(userId, accountId, event, "Starting extraction of " +template.getName()+ " mode:" +extractMode.toString(), eventId); return _uploadMonitor.extractTemplate(template, url, tmpltHostRef, zoneId, eventId, job.getId(), mgr); } - EventUtils.saveStartedEvent(userId, accountId, event, "Starting extraction of " +template.getName()+ " in mode:" +extractMode.toString(), eventId); UploadVO vo = _uploadMonitor.createEntityDownloadURL(template, tmpltHostRef, zoneId, eventId); if (vo!=null){ - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_INFO, event, "Completed extraction of "+template.getName()+ " in mode:" +mode, null, eventId); return vo.getId(); }else{ - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_ERROR, event, "Failed extraction of "+template.getName()+ " in mode:" +mode, null, eventId); return null; } } @@ -755,25 +742,17 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe } // Event details - String params = "id=" + templateId + "\ndcId="+destZoneId+"\nsize="+srcTmpltHost.getSize(); Account account = _accountDao.findById(vmTemplate.getAccountId()); String copyEventType; - String copyEventDescription; String createEventType; - String createEventDescription; - String templateType; if (vmTemplate.getFormat().equals(ImageFormat.ISO)){ copyEventType = EventTypes.EVENT_ISO_COPY; createEventType = EventTypes.EVENT_ISO_CREATE; - templateType = "ISO "; } else { copyEventType = EventTypes.EVENT_TEMPLATE_COPY; createEventType = EventTypes.EVENT_TEMPLATE_CREATE; - templateType = "Template "; } - copyEventDescription = templateType + vmTemplate.getName() + " started copying to zone: " + destZone.getName() + "."; - createEventDescription = templateType + vmTemplate.getName() + " succesfully created in zone: " + destZone.getName() + "."; Transaction txn = Transaction.currentTxn(); txn.start(); @@ -790,8 +769,6 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe dstTmpltHost.setDestroyed(false); _tmpltHostDao.update(dstTmpltHost.getId(), dstTmpltHost); - saveEvent(userId, account.getId(), account.getDomainId(), copyEventType, copyEventDescription, EventVO.LEVEL_INFO, params); - saveEvent(userId, account.getId(), account.getDomainId(), createEventType, createEventDescription, EventVO.LEVEL_INFO, params); return true; } } else if (dstTmpltHost != null && dstTmpltHost.getDownloadState() == Status.DOWNLOAD_ERROR){ @@ -815,7 +792,6 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe UsageEventVO usageEvent = new UsageEventVO(copyEventType, account.getId(), destZoneId, templateId, null, null, null, srcTmpltHost.getSize()); _usageEventDao.persist(usageEvent); - saveEvent(userId, account.getId(), account.getDomainId(), copyEventType, copyEventDescription, EventVO.LEVEL_INFO, params); return true; } @@ -921,17 +897,13 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe } } - String params = "id=" + template.getId(); Account account = _accountDao.findById(template.getAccountId()); String eventType = ""; - String description = ""; if (template.getFormat().equals(ImageFormat.ISO)){ eventType = EventTypes.EVENT_ISO_DELETE; - description = "ISO "; } else { eventType = EventTypes.EVENT_TEMPLATE_DELETE; - description = "Template "; } // Iterate through all necessary secondary storage hosts and mark the template on each host as destroyed @@ -957,8 +929,6 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe _tmpltZoneDao.remove(templateZone.getId()); } - String zoneParams = params + "\ndcId=" + sZoneId; - saveEvent(userId, account.getId(), account.getDomainId(), eventType, description + template.getName() + " succesfully deleted.", EventVO.LEVEL_INFO, zoneParams, 0); UsageEventVO usageEvent = new UsageEventVO(eventType, account.getId(), sZoneId, templateId, null, null, null, null); _usageEventDao.persist(usageEvent); } finally { @@ -1052,33 +1022,6 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe } } - private Long saveEvent(long userId, Long accountId, Long domainId, String type, String description, String level, String params, long startEventId) { - EventVO event = new EventVO(); - event.setUserId(userId); - event.setAccountId(accountId); - event.setType(type); - event.setDescription(description); - event.setStartId(startEventId); - - if (domainId != null) { - event.setDomainId(domainId); - } - - if (level != null) { - event.setLevel(level); - } - - if (params != null) { - event.setParameters(params); - } - - return _eventDao.persist(event).getId(); - } - - private Long saveEvent(long userId, Long accountId, Long domainId, String type, String description, String level, String params) { - return saveEvent(userId, accountId, domainId, type, description, level, params,0); - } - @Override public String getName() { return _name; @@ -1139,8 +1082,6 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe Long templateId = _tmpltDao.addTemplateToZone(template, zoneId); UserAccount userAccount = _userAccountDao.findById(userId); - saveEvent(userId, userAccount.getAccountId(), userAccount.getDomainId(), EventTypes.EVENT_TEMPLATE_DOWNLOAD_START, - "Started download of template: " + template.getName(), null, null); _downloadMonitor.downloadTemplateToStorage(id, zoneId); @@ -1250,12 +1191,6 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe private boolean attachISOToVM(long vmId, long userId, long isoId, boolean attach) { UserVmVO vm = _userVmDao.findById(vmId); VMTemplateVO iso = _tmpltDao.findById(isoId); - long startEventId = 0; - if(attach){ - startEventId = EventUtils.saveStartedEvent(userId, vm.getAccountId(), EventTypes.EVENT_ISO_ATTACH, "Attaching ISO: "+isoId+" to Vm: "+vmId, startEventId); - } else { - startEventId = EventUtils.saveStartedEvent(userId, vm.getAccountId(), EventTypes.EVENT_ISO_DETACH, "Detaching ISO: "+isoId+" from Vm: "+vmId, startEventId); - } boolean success = _vmMgr.attachISOToVM(vmId, isoId, attach); @@ -1266,21 +1201,6 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe } _userVmDao.update(vmId, vm); - if (success) { - if (attach) { - EventUtils.saveEvent(userId, vm.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ISO_ATTACH, "Successfully attached ISO: " + iso.getName() + " to VM with ID: " + vmId, - null, startEventId); - } else { - EventUtils.saveEvent(userId, vm.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ISO_DETACH, "Successfully detached ISO from VM with ID: " + vmId, null, startEventId); - } - } else { - if (attach) { - EventUtils.saveEvent(userId, vm.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ISO_ATTACH, "Failed to attach ISO: " + iso.getName() + " to VM with ID: " + vmId, null, startEventId); - } else { - EventUtils.saveEvent(userId, vm.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_ISO_DETACH, "Failed to detach ISO from VM with ID: " + vmId, null, startEventId); - } - } - return success; } diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index 6278f1e1572..d7f1f9fbc1f 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -49,6 +49,7 @@ import com.cloud.api.commands.UpdateAccountCmd; import com.cloud.api.commands.UpdateResourceLimitCmd; import com.cloud.api.commands.UpdateUserCmd; import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.ResourceLimitVO; import com.cloud.configuration.dao.ConfigurationDao; @@ -131,6 +132,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag @Inject private StorageManager _storageMgr; @Inject private TemplateManager _tmpltMgr; @Inject private VirtualNetworkApplianceManager _routerMgr; + @Inject private ConfigurationManager _configMgr; private final ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("AccountChecker")); @@ -840,13 +842,9 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag } for (UserVmVO vm : vms) { - long startEventId = EventUtils.saveStartedEvent(callerUserId, vm.getAccountId(), EventTypes.EVENT_VM_DESTROY, "Destroyed VM instance : " + vm.getName()); if (!_vmMgr.expunge(vm, callerUserId, caller)) { s_logger.error("Unable to destroy vm: " + vm.getId()); accountCleanupNeeded = true; - EventUtils.saveEvent(callerUserId, vm.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_DESTROY, "Unable to destroy vm: " + vm.getId(), startEventId); - } else { - EventUtils.saveEvent(callerUserId, vm.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_DESTROY, "Successfully destroyed VM instance : " + vm.getName(), startEventId); } } @@ -861,21 +859,32 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag s_logger.info("deleteAccount: Deleted " + numRemoved + " network groups for account " + accountId); //Delete all the networks + boolean networksDeleted = true; s_logger.debug("Deleting networks for account " + account.getId()); List networks = _networkDao.listByOwner(accountId); if (networks != null) { for (NetworkVO network : networks) { if (!_networkMgr.deleteNetwork(network.getId())) { - s_logger.warn("Unable to destroy network " + network + " as a part of account cleanup"); + s_logger.warn("Unable to destroy network " + network + " as a part of account id=" + accountId +" cleanup."); accountCleanupNeeded = true; - } - s_logger.debug("Network " + network.getId() + " successfully deleted."); + networksDeleted = false; + } else { + s_logger.debug("Network " + network.getId() + " successfully deleted as a part of account id=" + accountId + " cleanup."); + } + } + } + + //delete account specific vlans - only when networks are cleaned up successfully + if (networksDeleted) { + if (!_configMgr.deleteAccountSpecificVirtualRanges(accountId)){ + accountCleanupNeeded = true; + } else { + s_logger.debug("Account specific Virtual IP ranges " + " are successfully deleted as a part of account id=" + accountId + " cleanup."); } } return true; } finally { s_logger.info("Cleanup for account " + account.getId() + (accountCleanupNeeded ? " is needed." : " is not needed.")); - if (accountCleanupNeeded) { _accountDao.markForCleanup(accountId); } @@ -1010,12 +1019,8 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag throw new CloudRuntimeException("The user " + username + " being creating is using a password that is different than what's in the db"); } - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_INFO, EventTypes.EVENT_USER_CREATE, "User, " + username + " for accountId = " + accountId - + " and domainId = " + domainId + " was created."); return _userAccountDao.findById(dbUser.getId()); } catch (Exception e) { - EventUtils.saveEvent(new Long(1), new Long(1), EventVO.LEVEL_ERROR, EventTypes.EVENT_USER_CREATE, "Error creating user, " + username + " for accountId = " + accountId - + " and domainId = " + domainId); if (e instanceof CloudRuntimeException) { s_logger.info("unable to create user: " + e); } else { @@ -1069,8 +1074,6 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag throw new CloudRuntimeException("The user " + userName + " being creating is using a password that is different than what's in the db"); } - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_INFO, EventTypes.EVENT_USER_CREATE, "User, " + userName + " for accountId = " + accountId - + " and domainId = " + domainId + " was created."); return dbUser; } @@ -1152,12 +1155,8 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag } _userDao.update(id, userName, password, firstName, lastName, email, accountId, timeZone, apiKey, secretKey); - EventUtils.saveEvent(new Long(1), Long.valueOf(1), EventVO.LEVEL_INFO, EventTypes.EVENT_USER_UPDATE, "User, " + userName + " for accountId = " - + accountId + " domainId = " + userAccount.getDomainId() + " and timezone = "+timeZone + " was updated."); } catch (Throwable th) { s_logger.error("error updating user", th); - EventUtils.saveEvent(Long.valueOf(1), Long.valueOf(1), EventVO.LEVEL_ERROR, EventTypes.EVENT_USER_UPDATE, "Error updating user, " + userName - + " for accountId = " + accountId + " and domainId = " + userAccount.getDomainId()); throw new CloudRuntimeException("Unable to update user " + id); } return _userAccountDao.findById(id); @@ -1454,15 +1453,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag throw new InvalidParameterValueException("Account id : " + user.getAccountId() + " is a system account, delete for user associated with this account is not allowed"); } - long accountId = user.getAccountId(); - long userId = UserContext.current().getCallerUserId(); - boolean success = _userDao.remove(id); - if(success){ - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_INFO, EventTypes.EVENT_USER_DELETE, "Deleted User, " + user.getUsername() + " for accountId = " + user.getAccountId()); - } else { - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_ERROR, EventTypes.EVENT_USER_DELETE, "Failed to delete User, " + user.getUsername() + " for accountId = " + user.getAccountId()); - } - return success; + return _userDao.remove(id); } protected class AccountCleanupTask implements Runnable { @@ -1510,28 +1501,30 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag } public Account finalizeOwner(Account caller, String accountName, Long domainId) { - if (isAdmin(caller.getType())) { - if (domainId != null) { - DomainVO domain = _domainDao.findById(domainId); - if (domain == null) { - throw new InvalidParameterValueException("Unable to find the domain by id=" + domainId); - } + if (isAdmin(caller.getType()) && accountName != null && domainId != null) { + DomainVO domain = _domainDao.findById(domainId); + if (domain == null) { + throw new InvalidParameterValueException("Unable to find the domain by id=" + domainId); + } - if (accountName != null) { - Account owner = _accountDao.findActiveAccount(accountName, domainId); - if (owner == null) { - throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId); - } - checkAccess(caller, domain); - return owner; - } else { - throw new InvalidParameterValueException("Account have to be specified along with domainId"); - } + Account owner = _accountDao.findActiveAccount(accountName, domainId); + if (owner == null) { + throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId); + } + checkAccess(caller, domain); + + return owner; + } else if (!isAdmin(caller.getType()) && accountName != null && domainId != null) { + if (!accountName.equals(caller.getAccountName()) || domainId.longValue() != caller.getDomainId()) { + throw new PermissionDeniedException("Can't create/list resources for account " + accountName + " in domain " + domainId + ", permission denied"); } else { return caller; } } else { - //regular user can't create resources for other people + if ((accountName == null && domainId != null) || (accountName != null && domainId == null)) { + throw new InvalidParameterValueException("AccountName and domainId must be specified together"); + } + //regular user can't create/list resources for other people return caller; } } @@ -1568,4 +1561,41 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag public User getActiveUser(long userId) { return _userDao.findById(userId); } + + @Override + public Domain getDomain(long domainId) { + return _domainDao.findById(domainId); + } + + @Override + public Pair finalizeAccountDomainForList(Account caller, String accountName, Long domainId) { + if (isAdmin(caller.getType())) { + if (domainId == null && accountName != null) { + throw new InvalidParameterValueException("accountName and domainId might be specified together"); + } else if (domainId != null){ + Domain domain = getDomain(domainId); + if (domain == null) { + throw new InvalidParameterValueException("Unable to find the domain by id=" + domainId); + } + + checkAccess(caller, domain); + + if (accountName != null) { + Account owner = getActiveAccount(accountName, domainId); + if (owner == null) { + throw new InvalidParameterValueException("Unable to find account with name " + accountName + " in domain id=" + domainId); + } + } + } + } else if (accountName != null && domainId != null) { + if (!accountName.equals(caller.getAccountName()) || domainId.longValue() != caller.getDomainId()) { + throw new PermissionDeniedException("Can't list port forwarding rules for account " + accountName + " in domain " + domainId + ", permission denied"); + } + } else { + accountName = caller.getAccountName(); + domainId = caller.getDomainId(); + } + + return new Pair(accountName, domainId); + } } diff --git a/server/src/com/cloud/vm/NicVO.java b/server/src/com/cloud/vm/NicVO.java index ebc5392e5b3..0ce46ddabfe 100644 --- a/server/src/com/cloud/vm/NicVO.java +++ b/server/src/com/cloud/vm/NicVO.java @@ -180,6 +180,7 @@ public class NicVO implements Nic { this.netmask = netmask; } + @Override public URI getIsolationUri() { return isolationUri; } @@ -188,6 +189,7 @@ public class NicVO implements Nic { this.isolationUri = isolationUri; } + @Override public URI getBroadcastUri() { return broadcastUri; } @@ -200,8 +202,8 @@ public class NicVO implements Nic { this.instanceId = instanceId; } - public void setNetworkId(long networkConfigurationId) { - this.networkId = networkConfigurationId; + public void setNetworkId(long networkId) { + this.networkId = networkId; } public void setUpdateTime(Date updateTime) { @@ -273,16 +275,6 @@ public class NicVO implements Nic { return strategy; } - @Override - public int getExpectedReservationInterval() { - return -1; - } - - @Override - public int getExpectedReleaseInterval() { - return -1; - } - @Override public Date getUpdateTime() { return updateTime; diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index d8aeb0c79ea..b298a1136c2 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -19,7 +19,6 @@ package com.cloud.vm; import java.util.ArrayList; import java.util.Date; -import java.util.Enumeration; import java.util.Formatter; import java.util.HashMap; import java.util.List; @@ -44,8 +43,6 @@ import com.cloud.agent.api.CreatePrivateTemplateFromSnapshotCommand; import com.cloud.agent.api.CreatePrivateTemplateFromVolumeCommand; import com.cloud.agent.api.GetVmStatsAnswer; import com.cloud.agent.api.GetVmStatsCommand; -import com.cloud.agent.api.RebootAnswer; -import com.cloud.agent.api.RebootCommand; import com.cloud.agent.api.SnapshotCommand; import com.cloud.agent.api.StopAnswer; import com.cloud.agent.api.StopCommand; @@ -85,6 +82,7 @@ import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.AccountVlanMapDao; +import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.HostPodDao; import com.cloud.dc.dao.VlanDao; @@ -92,9 +90,8 @@ import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; +import com.cloud.event.ActionEvent; import com.cloud.event.EventTypes; -import com.cloud.event.EventUtils; -import com.cloud.event.EventVO; import com.cloud.event.UsageEventVO; import com.cloud.event.dao.EventDao; import com.cloud.event.dao.UsageEventDao; @@ -111,7 +108,6 @@ import com.cloud.host.HostVO; import com.cloud.host.dao.DetailsDao; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.network.IpAddrAllocator; import com.cloud.network.Network; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; @@ -122,8 +118,8 @@ import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.LoadBalancerVMMapDao; import com.cloud.network.dao.NetworkDao; import com.cloud.network.lb.LoadBalancingRulesManager; -import com.cloud.network.ovs.GreTunnelException; import com.cloud.network.ovs.OvsNetworkManager; +import com.cloud.network.ovs.OvsTunnelManager; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.rules.RulesManager; import com.cloud.network.security.SecurityGroupManager; @@ -174,7 +170,6 @@ import com.cloud.uservm.UserVm; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.PasswordGenerator; -import com.cloud.utils.component.Adapters; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; import com.cloud.utils.component.Manager; @@ -238,6 +233,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager @Inject AccountService _accountService; @Inject AsyncJobManager _asyncMgr; @Inject VlanDao _vlanDao; + @Inject ClusterDao _clusterDao; @Inject AccountVlanMapDao _accountVlanMapDao; @Inject StoragePoolDao _storagePoolDao; @Inject VMTemplateHostDao _vmTemplateHostDao; @@ -257,8 +253,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager @Inject SSHKeyPairDao _sshKeyPairDao; @Inject UserVmDetailsDao _vmDetailsDao; @Inject OvsNetworkManager _ovsNetworkMgr; + @Inject OvsTunnelManager _ovsTunnelMgr; - private IpAddrAllocator _IpAllocator; ScheduledExecutorService _executor = null; int _expungeInterval; int _expungeDelay; @@ -281,7 +277,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } @Override - public UserVm resetVMPassword(ResetVMPasswordCmd cmd, String password){ + public UserVm resetVMPassword(ResetVMPasswordCmd cmd, String password) throws ResourceUnavailableException, InsufficientCapacityException{ Account account = UserContext.current().getCaller(); Long userId = UserContext.current().getCallerUserId(); Long vmId = cmd.getId(); @@ -297,6 +293,11 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager throw new InvalidParameterValueException("Fail to reset password for the virtual machine, the template is not password enabled"); } + if (userVm.getState() == State.Error || userVm.getState() == State.Expunging) { + s_logger.error("vm is not in the right state: " + vmId); + throw new InvalidParameterValueException("Vm with id " + vmId + " is not in the right state"); + } + userId = accountAndUserValidation(vmId, account, userId, userVm); boolean result = resetVMPasswordInternal(cmd, password); @@ -308,43 +309,42 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager return userVm; } - private boolean resetVMPasswordInternal(ResetVMPasswordCmd cmd, String password) { - Long vmId = cmd.getId(); - Long userId = UserContext.current().getCallerUserId(); - UserVmVO vmInstance = _vmDao.findById(vmId); - - if (password == null || password.equals("")) { - return false; - } - - VMTemplateVO template = _templateDao.findById(vmInstance.getTemplateId()); - if (template.getEnablePassword()) { - if (vmInstance.getDomainRouterId() == null) { - /*TODO: add it for external dhcp mode*/ - return true; - } - if (_routerMgr.savePasswordToRouter(vmInstance.getDomainRouterId(), vmInstance.getPrivateIpAddress(), password)) { - // Need to reboot the virtual machine so that the password gets redownloaded from the DomR, and reset on the VM - long startId = EventUtils.saveStartedEvent(userId, vmInstance.getAccountId(), EventTypes.EVENT_VM_REBOOT, "Reboot vm with id:"+vmId); - if (!rebootVirtualMachine(userId, vmId)) { - EventUtils.saveEvent(userId, vmInstance.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_REBOOT, "Failed to reboot vm with id:"+vmId, startId); - if (vmInstance.getState() == State.Stopped) { - return true; - } - return false; - } else { - EventUtils.saveEvent(userId, vmInstance.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_REBOOT, "Successfully rebooted vm with id:"+vmId, startId); - return true; - } - } else { - return false; - } - } else { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Reset password called for a vm that is not using a password enabled template"); - } - return false; - } + private boolean resetVMPasswordInternal(ResetVMPasswordCmd cmd, String password) throws ResourceUnavailableException, InsufficientCapacityException{ + + return true; +// Long vmId = cmd.getId(); +// Long userId = UserContext.current().getCallerUserId(); +// UserVmVO vmInstance = _vmDao.findById(vmId); +// +// if (password == null || password.equals("")) { +// return false; +// } +// +// VMTemplateVO template = _templateDao.findById(vmInstance.getTemplateId()); +// if (template.getEnablePassword()) { +// if (vmInstance.getDomainRouterId() == null) { +// /*TODO: add it for external dhcp mode*/ +// return true; +// } +// if (_routerMgr.savePasswordToRouter(vmInstance.getDomainRouterId(), vmInstance.getPrivateIpAddress(), password)) { +// // Need to reboot the virtual machine so that the password gets redownloaded from the DomR, and reset on the VM +// if (rebootVirtualMachine(userId, vmId) == null) { +// if (vmInstance.getState() == State.Stopped) { +// return true; +// } +// return false; +// } else { +// return true; +// } +// } else { +// return false; +// } +// } else { +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("Reset password called for a vm that is not using a password enabled template"); +// } +// return false; +// } } @Override @@ -361,7 +361,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager return true; } - long startEventId = EventUtils.saveStartedEvent(userId, vm.getAccountId(), EventTypes.EVENT_VM_STOP, "stopping Vm with Id: "+vmId); User user = _userDao.findById(userId); Account account = _accountDao.findById(user.getAccountId()); @@ -373,11 +372,9 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } if(status){ - EventUtils.saveEvent(userId, vm.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_VM_STOP, "Successfully stopped VM instance : " + vmId, startEventId); return status; } else { - EventUtils.saveEvent(userId, vm.getAccountId(), EventVO.LEVEL_ERROR, EventTypes.EVENT_VM_STOP, "Error stopping VM instance : " + vmId, startEventId); return status; } } @@ -413,7 +410,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } // Check that the volume is not destroyed - if (volume.getDestroyed()) { + if (volume.getState() == Volume.State.Destroy) { throw new InvalidParameterValueException("Please specify a volume that is not destroyed."); } @@ -785,27 +782,24 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } - private boolean rebootVirtualMachine(long userId, long vmId) { + private UserVm rebootVirtualMachine(long userId, long vmId) throws InsufficientCapacityException, ResourceUnavailableException{ UserVmVO vm = _vmDao.findById(vmId); + User caller = _accountMgr.getActiveUser(userId); + Account owner = _accountMgr.getAccount(vm.getAccountId()); if (vm == null || vm.getState() == State.Destroyed || vm.getState() == State.Expunging || vm.getRemoved() != null) { - return false; + s_logger.warn("Vm id=" + vmId + " doesn't exist"); + return null; } if (vm.getState() == State.Running && vm.getHostId() != null) { - RebootCommand cmd = new RebootCommand(vm.getInstanceName()); - RebootAnswer answer = (RebootAnswer)_agentMgr.easySend(vm.getHostId(), cmd); - - if (answer != null) { - return true; - } else { - return false; - } + return _itMgr.reboot(vm, null, caller, owner); } else { s_logger.error("Vm id=" + vmId + " is not in Running state, failed to reboot"); - return false; + return null; } } + @Override /* * TODO: cleanup eventually - Refactored API call @@ -1014,7 +1008,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager Long templateId = volume.getTemplateId(); Long diskOfferingId = volume.getDiskOfferingId(); long sizeMB = volume.getSize()/(1024*1024); - StoragePoolVO pool = _storagePoolDao.findById(volume.getPoolId()); Long offeringId = null; if(diskOfferingId != null){ DiskOfferingVO offering = _diskOfferingDao.findById(diskOfferingId); @@ -1076,12 +1069,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager s_logger.info("User VM Manager is configured."); - Adapters ipAllocators = locator.getAdapters(IpAddrAllocator.class); - if (ipAllocators != null && ipAllocators.isSet()) { - Enumeration it = ipAllocators.enumeration(); - _IpAllocator = it.nextElement(); - } - return true; } @@ -1110,7 +1097,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (vmName != null) { return new StopCommand(vm, vmName, VirtualMachineName.getVnet(vmName)); } else if (vm != null) { - return new StopCommand(vm, vm.getVnet()); + return new StopCommand(vm, null); } else { throw new CloudRuntimeException("Shouldn't even be here!"); } @@ -1142,9 +1129,17 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager public boolean expunge(UserVmVO vm, long callerUserId, Account caller) { try { - //Cleanup LB/PF rules before expunging the vm - long vmId = vm.getId(); - //cleanup port forwarding rules + if (!_itMgr.advanceExpunge(vm, _accountMgr.getSystemUser(), caller)) { + s_logger.info("Did not expunge " + vm); + return false; + } + + _networkGroupMgr.removeInstanceFromGroups(vm.getId()); + removeInstanceFromGroup(vm.getId()); + + //Cleanup LB/PF rules before expunging the vm + long vmId = vm.getId(); + //cleanup port forwarding rules if (_rulesMgr.revokePortForwardingRule(vmId)) { s_logger.debug("Port forwarding rules are removed successfully as a part of vm id=" + vmId + " expunge"); } else { @@ -1157,16 +1152,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } else { s_logger.warn("Fail to remove lb rules as a part of vm id=" + vmId + " expunge"); } - - - if (!_itMgr.advanceExpunge(vm, _accountMgr.getSystemUser(), caller)) { - s_logger.info("Did not expunge " + vm); - return false; - } - - _networkGroupMgr.removeInstanceFromGroups(vm.getId()); - removeInstanceFromGroup(vm.getId()); - + _itMgr.remove(vm, _accountMgr.getSystemUser(), caller); return true; } catch (ResourceUnavailableException e) { @@ -1570,11 +1556,15 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager ha = vmInstance.isHaEnabled(); } - long accountId = vmInstance.getAccountId(); UserVmVO vm = _vmDao.findById(id); if (vm == null) { throw new CloudRuntimeException("Unable to find virual machine with id " + id); } + + if (vm.getState() == State.Error || vm.getState() == State.Expunging) { + s_logger.error("vm is not in the right state: " + id); + throw new InvalidParameterValueException("Vm with id " + id + " is not in the right state"); + } String description = ""; @@ -1603,8 +1593,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager _vmDao.updateVM(id, displayName, ha, osTypeId); - // create a event for the change in HA Enabled flag - EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_INFO, EventTypes.EVENT_VM_UPDATE, "Successfully updated virtual machine: "+vm.getName()+". "+description); return _vmDao.findById(id); } @@ -1619,7 +1607,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } @Override - public UserVm rebootVirtualMachine(RebootVMCmd cmd) { + public UserVm rebootVirtualMachine(RebootVMCmd cmd) throws InsufficientCapacityException, ResourceUnavailableException{ Account account = UserContext.current().getCaller(); Long userId = UserContext.current().getCallerUserId(); Long vmId = cmd.getId(); @@ -1632,14 +1620,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager userId = accountAndUserValidation(vmId, account, userId, vmInstance); - boolean status = rebootVirtualMachine(userId, vmId); - - if (status) { - return _vmDao.findById(vmId); - } else { - s_logger.warn("Failed to reboot vm with id: " + vmId); - return null; - } + return rebootVirtualMachine(userId, vmId); } @Override @@ -1852,7 +1833,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager return true; } - @Override @DB + @Override @DB @ActionEvent (eventType=EventTypes.EVENT_VM_CREATE, eventDescription="creating Vm", create=true) public UserVm createVirtualMachine(DeployVMCmd cmd) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException, StorageUnavailableException { Account caller = UserContext.current().getCaller(); @@ -2070,6 +2051,10 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (sshPublicKey != null) { vm.setDetail("SSH.PublicKey", sshPublicKey); } + + if (isIso) { + vm.setIsoId(template.getId()); + } if (_itMgr.allocate(vm, template, offering, rootDiskOffering, dataDiskOfferings, networks, null, plan, cmd.getHypervisor(), owner) == null) { return null; @@ -2100,7 +2085,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager return vm; } - @Override + @Override @ActionEvent (eventType=EventTypes.EVENT_VM_CREATE, eventDescription="starting Vm", async=true) public UserVm startVirtualMachine(DeployVMCmd cmd) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException { long vmId = cmd.getEntityId(); UserVmVO vm = _vmDao.findById(vmId); @@ -2141,7 +2126,9 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } finally { updateVmStateForFailedVmCreation(vm.getId()); } - vm.setPassword(password); + + _networkGroupMgr.addInstanceToGroups(vm.getId(), cmd.getSecurityGroupList()); + return vm; } @@ -2152,7 +2139,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (vo.getIsoId() != null) { template = _templateDao.findById(vo.getIsoId()); } - if (template != null && template.getFormat() == ImageFormat.ISO && template.isBootable()) { + if (template != null && template.getFormat() == ImageFormat.ISO && vo.getIsoId() != null) { String isoPath = null; Pair isoPathPair = _storageMgr.getAbsoluteIsoPath(template.getId(), vo.getDataCenterId()); if (isoPathPair == null) { @@ -2161,14 +2148,19 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } else { isoPath = isoPathPair.first(); } - profile.setBootLoaderType(BootloaderType.CD); + if (template.isBootable()) { + profile.setBootLoaderType(BootloaderType.CD); + } GuestOSVO guestOS = _guestOSDao.findById(template.getGuestOSId()); + String displayName = null; + if (guestOS != null) { + displayName = guestOS.getDisplayName(); + } VolumeTO iso = new VolumeTO(profile.getId(), Volume.VolumeType.ISO, StorageResourceType.STORAGE_POOL, StoragePoolType.ISO, null, template.getName(), null, isoPath, - 0, null, guestOS.getDisplayName()); + 0, null, displayName); iso.setDeviceId(3); profile.addDisk(iso); - vo.setIsoId(template.getId()); } else { /*create a iso placeholder*/ VolumeTO iso = new VolumeTO(profile.getId(), Volume.VolumeType.ISO, StorageResourceType.STORAGE_POOL, StoragePoolType.ISO, null, template.getName(), null, null, @@ -2188,19 +2180,17 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager NetworkVO network = _networkDao.findById(nic.getNetworkId()); if (network.getTrafficType() == TrafficType.Guest) { userVm.setPrivateIpAddress(nic.getIp4Address()); - userVm.setPrivateNetmask(nic.getNetmask()); userVm.setPrivateMacAddress(nic.getMacAddress()); } } _vmDao.update(userVm.getId(), userVm); - try { - _ovsNetworkMgr.UserVmCheckAndCreateTunnel(cmds, profile, dest); - _ovsNetworkMgr.applyDefaultFlowToUserVm(cmds, profile, dest); - } catch (GreTunnelException e) { - e.printStackTrace(); - } + + _ovsNetworkMgr.UserVmCheckAndCreateTunnel(cmds, profile, dest); + _ovsNetworkMgr.applyDefaultFlowToUserVm(cmds, profile, dest); + _ovsTunnelMgr.UserVmCheckAndCreateTunnel(cmds, profile, dest); + return true; } @@ -2268,6 +2258,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager UserVmVO vm = profile.getVirtualMachine(); _networkGroupMgr.handleVmStateTransition(vm, State.Stopped); _ovsNetworkMgr.handleVmStateTransition(vm, State.Stopped); + _ovsTunnelMgr.CheckAndDestroyTunnel(vm); } public String generateRandomPassword() { @@ -2333,6 +2324,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager Long domainId = cmd.getDomainId(); String accountName = cmd.getAccountName(); Long accountId = null; + Boolean isRecursive = cmd.isRecursive(); + List domainsToSearchForVms = new ArrayList(); boolean isAdmin = false; String path = null; if ((account == null) || isAdmin(account.getType())) { @@ -2360,6 +2353,24 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager accountId = account.getId(); } + if(isRecursive == null) { + isRecursive = false; + } + + if(isRecursive && domainId != null) { + DomainVO parentDomain = _domainDao.findById(domainId); + if(parentDomain.getName().equals("ROOT")) { + domainsToSearchForVms.addAll(_domainDao.listAll()); + return recursivelySearchForVms(cmd, path, isAdmin, domainsToSearchForVms, accountId); + }else { + domainsToSearchForVms.add(parentDomain); + domainsToSearchForVms.addAll(_domainDao.findAllChildren(parentDomain.getPath(), parentDomain.getId())); + return recursivelySearchForVms(cmd, path, isAdmin, domainsToSearchForVms, accountId); + } + } else if(isRecursive && domainId == null){ + throw new ServerApiException(BaseCmd.MALFORMED_PARAMETER_ERROR, "Please enter a parent domain id for listing vms recursively"); + } + Criteria c = new Criteria("id", Boolean.TRUE, cmd.getStartIndex(), cmd.getPageSizeVal()); c.addCriteria(Criteria.KEYWORD, cmd.getKeyword()); c.addCriteria(Criteria.ID, cmd.getId()); @@ -2389,6 +2400,42 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager return searchForUserVMs(c); } + private List recursivelySearchForVms(ListVMsCmd cmd, String path, boolean isAdmin, List domainToSearchWithin, Long accountId) { + + List result = new ArrayList(); + for(DomainVO domain : domainToSearchWithin) { + + Criteria c = new Criteria("id", Boolean.TRUE, cmd.getStartIndex(), cmd.getPageSizeVal()); + c.addCriteria(Criteria.KEYWORD, cmd.getKeyword()); + c.addCriteria(Criteria.ID, cmd.getId()); + c.addCriteria(Criteria.NAME, cmd.getInstanceName()); + c.addCriteria(Criteria.STATE, cmd.getState()); + c.addCriteria(Criteria.DATACENTERID, cmd.getZoneId()); + c.addCriteria(Criteria.GROUPID, cmd.getGroupId()); + c.addCriteria(Criteria.FOR_VIRTUAL_NETWORK, cmd.getForVirtualNetwork()); + c.addCriteria(Criteria.NETWORKID, cmd.getNetworkId()); + + if (path != null) { + c.addCriteria(Criteria.PATH, path); + } + + // ignore these search requests if it's not an admin + if (isAdmin == true) { + c.addCriteria(Criteria.DOMAINID, domain.getId()); + c.addCriteria(Criteria.PODID, cmd.getPodId()); + c.addCriteria(Criteria.HOSTID, cmd.getHostId()); + } + + if (accountId != null) { + c.addCriteria(Criteria.ACCOUNTID, new Object[] {accountId}); + } + c.addCriteria(Criteria.ISADMIN, isAdmin); + + result.addAll(searchForUserVMs(c)); + } + return result; + } + @Override public List searchForUserVMs(Criteria c) { Filter searchFilter = new Filter(UserVmVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); @@ -2410,7 +2457,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager Object hostName = c.getCriteria(Criteria.HOSTNAME); Object keyword = c.getCriteria(Criteria.KEYWORD); Object isAdmin = c.getCriteria(Criteria.ISADMIN); - Object ipAddress = c.getCriteria(Criteria.IPADDRESS); + assert c.getCriteria(Criteria.IPADDRESS) == null : "We don't support search by ip address on VM any more. If you see this assert, it means we have to find a different way to search by the nic table."; Object groupId = c.getCriteria(Criteria.GROUPID); Object useVirtualNetwork = c.getCriteria(Criteria.FOR_VIRTUAL_NETWORK); Object path = c.getCriteria(Criteria.PATH); @@ -2428,7 +2475,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); sb.and("hostIdEQ", sb.entity().getHostId(), SearchCriteria.Op.EQ); sb.and("hostIdIN", sb.entity().getHostId(), SearchCriteria.Op.IN); - sb.and("guestIP", sb.entity().getGuestIpAddress(), SearchCriteria.Op.EQ); if (domainId != null || path != null) { // if accountId isn't specified, we can do a domain match for the admin case @@ -2567,10 +2613,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } } - if (ipAddress != null) { - sc.setParameters("guestIP", ipAddress); - } - return _vmDao.search(sc, searchFilter); } } diff --git a/server/src/com/cloud/vm/VirtualMachineManager.java b/server/src/com/cloud/vm/VirtualMachineManager.java index 172e61c58ed..43f9c1b8ce2 100644 --- a/server/src/com/cloud/vm/VirtualMachineManager.java +++ b/server/src/com/cloud/vm/VirtualMachineManager.java @@ -95,4 +95,8 @@ public interface VirtualMachineManager extends Manager { boolean migrateAway(VirtualMachine.Type type, long vmid, long hostId) throws InsufficientServerCapacityException; T migrate(T vm, long srcHostId, DeployDestination dest) throws ResourceUnavailableException; + + T reboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException; + + T advanceReboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException; } diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 923414dbb76..ad4c380ec32 100644 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -39,8 +39,11 @@ import com.cloud.agent.api.CheckVirtualMachineCommand; import com.cloud.agent.api.Command; import com.cloud.agent.api.MigrateAnswer; import com.cloud.agent.api.MigrateCommand; +import com.cloud.agent.api.NetworkRulesSystemVmCommand; import com.cloud.agent.api.PrepareForMigrationAnswer; import com.cloud.agent.api.PrepareForMigrationCommand; +import com.cloud.agent.api.RebootAnswer; +import com.cloud.agent.api.RebootCommand; import com.cloud.agent.api.StartAnswer; import com.cloud.agent.api.StartCommand; import com.cloud.agent.api.StopAnswer; @@ -50,9 +53,11 @@ import com.cloud.agent.manager.Commands; import com.cloud.alert.AlertManager; import com.cloud.cluster.ClusterManager; import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.consoleproxy.ConsoleProxyManager; import com.cloud.dc.DataCenter; +import com.cloud.dc.HostPodVO; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; @@ -74,6 +79,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.HypervisorGuru; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; +import com.cloud.org.Cluster; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; @@ -143,6 +149,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager { @Inject protected GuestOSDao _guestOsDao; @Inject protected VolumeDao _volsDao; @Inject protected ConsoleProxyManager _consoleProxyMgr; + @Inject protected ConfigurationManager _configMgr; @Inject(adapter=DeploymentPlanner.class) protected Adapters _planners; @@ -235,6 +242,8 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager { return vm; } + + protected void reserveNics(VirtualMachineProfile vmProfile, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { // List nics = _nicsDao.listBy(vmProfile.getId()); // for (NicVO nic : nics) { @@ -909,6 +918,10 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager { @Override public boolean remove(T vm, User user, Account caller) { + //expunge the corresponding nics + VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); + _networkMgr.expungeNics(profile); + s_logger.trace("Nics of the vm " + vm + " are expunged successfully"); return _vmDao.remove(vm.getId()); } @@ -997,9 +1010,17 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager { if (!ma.getResult()) { return null; } - + Commands cmds = new Commands(OnError.Revert); CheckVirtualMachineCommand cvm = new CheckVirtualMachineCommand(vm.getInstanceName()); - CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer)_agentMgr.send(dstHostId, cvm); + cmds.addCommand(cvm); + + if (vm.getType() != VirtualMachine.Type.User) { + NetworkRulesSystemVmCommand nrc = new NetworkRulesSystemVmCommand(vm.getInstanceName(), vm.getType()); + cmds.addCommand(nrc); + } + + _agentMgr.send(dstHostId, cmds); + CheckVirtualMachineAnswer answer = cmds.getAnswer(CheckVirtualMachineAnswer.class); if (!answer.getResult()) { s_logger.debug("Unable to complete migration for " + vm.toString()); stateTransitTo(vm, VirtualMachine.Event.AgentReportStopped, null); @@ -1093,7 +1114,6 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager { } protected class CleanupTask implements Runnable { - @Override public void run() { s_logger.trace("VM Operation Thread Running"); @@ -1104,4 +1124,51 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager { } } } + + @Override + public T reboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException { + try { + return advanceReboot(vm, params, caller, account); + } catch (ConcurrentOperationException e) { + throw new CloudRuntimeException("Unable to reboot a VM due to concurrent operation", e); + } + } + + @Override + + public T advanceReboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { + T rebootedVm = null; + + DataCenter dc = _configMgr.getZone(vm.getDataCenterId()); + HostPodVO pod = _configMgr.getPod(vm.getPodId()); + Host host = _hostDao.findById(vm.getHostId()); + Cluster cluster = null; + if (host != null) { + cluster = _configMgr.getCluster(host.getClusterId()); + } + DeployDestination dest = new DeployDestination(dc, pod, cluster, host); + ReservationContext ctx = new ReservationContextImpl(null, null, caller, account); + VirtualMachineProfile vmProfile = new VirtualMachineProfileImpl(vm); + + try { + //prepare all network elements (start domR/dhcp if needed) + _networkMgr.prepare(vmProfile, dest, ctx); + Commands cmds = new Commands(OnError.Revert); + cmds.addCommand(new RebootCommand(vm.getName())); + _agentMgr.send(host.getId(), cmds); + + Answer rebootAnswer = cmds.getAnswer(RebootAnswer.class); + if (rebootAnswer != null && rebootAnswer.getResult()) { + rebootedVm = vm; + return rebootedVm; + } + s_logger.info("Unable to reboot VM " + vm + " on " + dest.getHost() + " due to " + (rebootAnswer == null ? " no reboot answer" : rebootAnswer.getDetails())); + } catch (OperationTimedoutException e) { + s_logger.warn("Unable to send the reboot command to host " + dest.getHost() + " for the vm " + vm + " due to operation timeout", e); + throw new CloudRuntimeException("Failed to reboot the vm on host " + dest.getHost()); + } + + return rebootedVm; + } + } diff --git a/server/src/com/cloud/vm/dao/DomainRouterDao.java b/server/src/com/cloud/vm/dao/DomainRouterDao.java index 0c4e68c1416..12d4dd59006 100755 --- a/server/src/com/cloud/vm/dao/DomainRouterDao.java +++ b/server/src/com/cloud/vm/dao/DomainRouterDao.java @@ -32,9 +32,6 @@ import com.cloud.vm.VirtualMachine.State; * DomainRouterDao implements */ public interface DomainRouterDao extends GenericDao, StateDao { - //@Deprecated - //public boolean updateIf(DomainRouterVO router, State state, State... ifStates); - /** * gets the DomainRouterVO by user id and data center * @Param dcId data center Id. @@ -106,13 +103,6 @@ public interface DomainRouterDao extends GenericDao, State * @return */ public List listByDomain(Long id); - - /** - * Find the list of domain routers on a vlan - * @param id the id of the vlan record in the vlan table - * @return - */ - public List listByVlanDbId(Long vlanId); DomainRouterVO findBy(long accountId, long dcId, Role role); diff --git a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java index 5811186c8f3..ac85af276a5 100755 --- a/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java +++ b/server/src/com/cloud/vm/dao/DomainRouterDaoImpl.java @@ -59,7 +59,6 @@ public class DomainRouterDaoImpl extends GenericDaoBase im protected final SearchBuilder LastHostSearch; protected final SearchBuilder HostUpSearch; protected final SearchBuilder DomainIdSearch; - protected final SearchBuilder VlanDbIdSearch; protected final SearchBuilder StateChangeSearch; protected final SearchBuilder NetworkConfigSearch; protected final Attribute _updateTimeAttr; @@ -111,10 +110,6 @@ public class DomainRouterDaoImpl extends GenericDaoBase im DomainIdSearch.and("domainId", DomainIdSearch.entity().getDomainId(), SearchCriteria.Op.EQ); DomainIdSearch.done(); - VlanDbIdSearch = createSearchBuilder(); - VlanDbIdSearch.and("vlanDbId", VlanDbIdSearch.entity().getVlanDbId(), SearchCriteria.Op.EQ); - VlanDbIdSearch.done(); - StateChangeSearch = createSearchBuilder(); StateChangeSearch.and("id", StateChangeSearch.entity().getId(), SearchCriteria.Op.EQ); StateChangeSearch.and("states", StateChangeSearch.entity().getState(), SearchCriteria.Op.EQ); @@ -284,13 +279,6 @@ public class DomainRouterDaoImpl extends GenericDaoBase im return listBy(sc); } - @Override - public List listByVlanDbId(Long vlanDbId) { - SearchCriteria sc = VlanDbIdSearch.create(); - sc.setParameters("vlanDbId", vlanDbId); - return listBy(sc); - } - @Override public DomainRouterVO findByNetworkConfiguration(long networkConfigurationId) { SearchCriteria sc = NetworkConfigSearch.create(); diff --git a/server/src/com/cloud/vm/dao/NicDao.java b/server/src/com/cloud/vm/dao/NicDao.java index f60f9bc8747..4a3f2480ce5 100644 --- a/server/src/com/cloud/vm/dao/NicDao.java +++ b/server/src/com/cloud/vm/dao/NicDao.java @@ -11,12 +11,14 @@ import com.cloud.vm.NicVO; public interface NicDao extends GenericDao { List listBy(long instanceId); - List listIpAddressInNetworkConfiguration(long networkConfigId); + List listIpAddressInNetwork(long networkConfigId); + List listIncludingRemovedBy(long instanceId); List listByNetworkId(long networkId); - List listNetworksWithNoActiveNics(); NicVO findByInstanceIdAndNetworkId(long networkId, long instanceId); + + NicVO findByInstanceIdAndNetworkIdIncludingRemoved(long networkId, long instanceId); void removeNicsForInstance(long instanceId); } diff --git a/server/src/com/cloud/vm/dao/NicDaoImpl.java b/server/src/com/cloud/vm/dao/NicDaoImpl.java index bcdc0cbb3f2..85e4f553785 100644 --- a/server/src/com/cloud/vm/dao/NicDaoImpl.java +++ b/server/src/com/cloud/vm/dao/NicDaoImpl.java @@ -17,75 +17,73 @@ import com.cloud.vm.NicVO; @Local(value=NicDao.class) public class NicDaoImpl extends GenericDaoBase implements NicDao { - private final SearchBuilder InstanceSearch; + private final SearchBuilder AllFieldsSearch; private final GenericSearchBuilder IpSearch; - private final SearchBuilder NetworkSearch; - private final GenericSearchBuilder GarbageCollectSearch; protected NicDaoImpl() { super(); - InstanceSearch = createSearchBuilder(); - InstanceSearch.and("instance", InstanceSearch.entity().getInstanceId(), Op.EQ); - InstanceSearch.done(); + AllFieldsSearch = createSearchBuilder(); + AllFieldsSearch.and("instance", AllFieldsSearch.entity().getInstanceId(), Op.EQ); + AllFieldsSearch.and("network", AllFieldsSearch.entity().getNetworkId(), Op.EQ); + AllFieldsSearch.done(); IpSearch = createSearchBuilder(String.class); IpSearch.select(null, Func.DISTINCT, IpSearch.entity().getIp4Address()); - IpSearch.and("nc", IpSearch.entity().getNetworkId(), Op.EQ); + IpSearch.and("network", IpSearch.entity().getNetworkId(), Op.EQ); IpSearch.and("address", IpSearch.entity().getIp4Address(), Op.NNULL); IpSearch.done(); - - NetworkSearch = createSearchBuilder(); - NetworkSearch.and("networkId", NetworkSearch.entity().getNetworkId(), Op.EQ); - NetworkSearch.done(); - - GarbageCollectSearch = createSearchBuilder(Long.class); - GarbageCollectSearch.select(null, Func.DISTINCT, GarbageCollectSearch.entity().getNetworkId()); - GarbageCollectSearch.and("reservation", GarbageCollectSearch.entity().getReservationId(), Op.NULL); - GarbageCollectSearch.groupBy(GarbageCollectSearch.entity().getNetworkId()).having(Func.COUNT, GarbageCollectSearch.entity().getId(), Op.EQ, null); - GarbageCollectSearch.done(); } @Override public void removeNicsForInstance(long instanceId) { - SearchCriteria sc = InstanceSearch.create(); + SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("instance", instanceId); remove(sc); } @Override public List listBy(long instanceId) { - SearchCriteria sc = InstanceSearch.create(); + SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("instance", instanceId); return listBy(sc); } + @Override - public List listIpAddressInNetworkConfiguration(long networkConfigId) { + public List listIncludingRemovedBy(long instanceId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("instance", instanceId); + return listIncludingRemovedBy(sc); + } + + @Override + public List listIpAddressInNetwork(long networkId) { SearchCriteria sc = IpSearch.create(); - sc.setParameters("nc", networkConfigId); + sc.setParameters("network", networkId); return customSearch(sc, null); } @Override public List listByNetworkId(long networkId) { - SearchCriteria sc = NetworkSearch.create(); - sc.setParameters("networkId", networkId); + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("network", networkId); return listBy(sc); } @Override - public List listNetworksWithNoActiveNics() { - SearchCriteria sc = GarbageCollectSearch.create(); - - return customSearch(sc, null); + public NicVO findByInstanceIdAndNetworkId(long networkId, long instanceId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("network", networkId); + sc.setParameters("instance", instanceId); + return findOneBy(sc); } @Override - public NicVO findByInstanceIdAndNetworkId(long networkId, long instanceId) { + public NicVO findByInstanceIdAndNetworkIdIncludingRemoved(long networkId, long instanceId) { SearchCriteria sc = createSearchCriteria(); sc.addAnd("networkId", SearchCriteria.Op.EQ, networkId); sc.addAnd("instanceId", SearchCriteria.Op.EQ, instanceId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } } diff --git a/server/src/com/cloud/vm/dao/UserVmDao.java b/server/src/com/cloud/vm/dao/UserVmDao.java index 52943cc772b..2a6e2f6332a 100755 --- a/server/src/com/cloud/vm/dao/UserVmDao.java +++ b/server/src/com/cloud/vm/dao/UserVmDao.java @@ -23,7 +23,6 @@ import java.util.List; import com.cloud.uservm.UserVm; import com.cloud.utils.db.GenericDao; import com.cloud.vm.UserVmVO; -import com.cloud.vm.VirtualMachine.State; public interface UserVmDao extends GenericDao { List listByAccountId(long id); @@ -34,14 +33,6 @@ public interface UserVmDao extends GenericDao { List listByLastHostId(Long hostId); List listUpByHostId(Long hostId); - /** - * Find vms under the same router in the state. - * @param routerId id of the router. - * @param state state that it's in. - * @return list of userVmVO - */ - List listBy(long routerId, State... state); - UserVmVO findByName(String name); /** @@ -53,13 +44,6 @@ public interface UserVmDao extends GenericDao { List findDestroyedVms(Date date); - /** - * Find all vms that use a domain router - * @param routerId - * @return - */ - List listByRouterId(long routerId); - /** * List running VMs on the specified host * @param id @@ -77,10 +61,6 @@ public interface UserVmDao extends GenericDao { List listByNetworkId(long networkId); - List listVmsUsingGuestIpAddress(long dcId, String ipAddress); - - UserVm findByZoneAndAcctAndGuestIpAddress(long zoneId, long accountId, String ipAddress); - UserVm findVmByZoneIdAndName(long zoneId, String name); List listByAccountIdAndHostId(long accountId, long hostId); diff --git a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java index 8cfb798f972..4202f81de75 100755 --- a/server/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/server/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -40,8 +40,6 @@ import com.cloud.vm.VirtualMachine.State; public class UserVmDaoImpl extends GenericDaoBase implements UserVmDao { public static final Logger s_logger = Logger.getLogger(UserVmDaoImpl.class); - protected final SearchBuilder RouterStateSearch; - protected final SearchBuilder RouterIdSearch; protected final SearchBuilder AccountPodSearch; protected final SearchBuilder AccountDataCenterSearch; protected final SearchBuilder AccountSearch; @@ -51,8 +49,6 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use protected final SearchBuilder HostRunningSearch; protected final SearchBuilder NameSearch; protected final SearchBuilder StateChangeSearch; - protected final SearchBuilder GuestIpSearch; - protected final SearchBuilder ZoneAccountGuestIpSearch; protected final SearchBuilder ZoneNameSearch; protected final SearchBuilder AccountHostSearch; @@ -91,14 +87,6 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use NameSearch.and("name", NameSearch.entity().getName(), SearchCriteria.Op.EQ); NameSearch.done(); - RouterStateSearch = createSearchBuilder(); - RouterStateSearch.and("router", RouterStateSearch.entity().getDomainRouterId(), SearchCriteria.Op.EQ); - RouterStateSearch.done(); - - RouterIdSearch = createSearchBuilder(); - RouterIdSearch.and("router", RouterIdSearch.entity().getDomainRouterId(), SearchCriteria.Op.EQ); - RouterIdSearch.done(); - AccountPodSearch = createSearchBuilder(); AccountPodSearch.and("account", AccountPodSearch.entity().getAccountId(), SearchCriteria.Op.EQ); AccountPodSearch.and("pod", AccountPodSearch.entity().getPodId(), SearchCriteria.Op.EQ); @@ -116,23 +104,11 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use StateChangeSearch.and("update", StateChangeSearch.entity().getUpdated(), SearchCriteria.Op.EQ); StateChangeSearch.done(); - GuestIpSearch = createSearchBuilder(); - GuestIpSearch.and("dc", GuestIpSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); - GuestIpSearch.and("ip", GuestIpSearch.entity().getGuestIpAddress(), SearchCriteria.Op.EQ); - GuestIpSearch.and("states", GuestIpSearch.entity().getState(), SearchCriteria.Op.NIN); - GuestIpSearch.done(); - DestroySearch = createSearchBuilder(); DestroySearch.and("state", DestroySearch.entity().getState(), SearchCriteria.Op.IN); DestroySearch.and("updateTime", DestroySearch.entity().getUpdateTime(), SearchCriteria.Op.LT); DestroySearch.done(); - ZoneAccountGuestIpSearch = createSearchBuilder(); - ZoneAccountGuestIpSearch.and("dataCenterId", ZoneAccountGuestIpSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); - ZoneAccountGuestIpSearch.and("accountId", ZoneAccountGuestIpSearch.entity().getAccountId(), SearchCriteria.Op.EQ); - ZoneAccountGuestIpSearch.and("guestIpAddress", ZoneAccountGuestIpSearch.entity().getGuestIpAddress(), SearchCriteria.Op.EQ); - ZoneAccountGuestIpSearch.done(); - ZoneNameSearch = createSearchBuilder(); ZoneNameSearch.and("dataCenterId", ZoneNameSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); ZoneNameSearch.and("name", ZoneNameSearch.entity().getName(), SearchCriteria.Op.EQ); @@ -165,19 +141,6 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use return listIncludingRemovedBy(sc); } - @Override - public List listBy(long routerId, State... states) { - SearchCriteria sc = RouterStateSearch.create(); - SearchCriteria ssc = createSearchCriteria(); - - sc.setParameters("router", routerId); - for (State state: states) { - ssc.addOr("state", SearchCriteria.Op.EQ, state.toString()); - } - sc.addAnd("state", SearchCriteria.Op.SC, ssc); - return listIncludingRemovedBy(sc); - } - @Override public void updateVM(long id, String displayName, boolean enable, Long osTypeId) { UserVmVO vo = createForUpdate(); @@ -187,15 +150,6 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use update(id, vo); } - @Override - public List listByRouterId(long routerId) { - SearchCriteria sc = RouterIdSearch.create(); - - sc.setParameters("router", routerId); - - return listIncludingRemovedBy(sc); - } - @Override public List findDestroyedVms(Date date) { SearchCriteria sc = DestroySearch.create(); @@ -286,26 +240,6 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use return listBy(sc); } - @Override - public List listVmsUsingGuestIpAddress(long dcId, String ipAddress) { - SearchCriteria sc = GuestIpSearch.create(); - sc.setParameters("dc", dcId); - sc.setParameters("ip", ipAddress); - sc.setParameters("states", new Object[] {State.Destroyed, State.Expunging}); - - return listBy(sc); - } - - @Override - public UserVm findByZoneAndAcctAndGuestIpAddress(long zoneId, long accountId, String ipAddress) { - SearchCriteria sc = ZoneAccountGuestIpSearch.create(); - sc.setParameters("dataCenterId", zoneId); - sc.setParameters("accountId", accountId); - sc.setParameters("guestIpAddress", ipAddress); - - return findOneBy(sc); - } - @Override public List listByLastHostId(Long hostId) { SearchCriteria sc = LastHostSearch.create(); diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 5f864d160d1..dfc6181278f 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -1376,6 +1376,27 @@ CREATE TABLE `cloud`.`ovs_tunnel_alloc`( PRIMARY KEY(`from`, `to`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `cloud`.`ovs_tunnel`( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `from` bigint unsigned COMMENT 'from host id', + `to` bigint unsigned COMMENT 'to host id', + `key` int unsigned default '0' COMMENT 'current gre key can be used', + PRIMARY KEY(`from`, `to`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`ovs_tunnel_account`( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `from` bigint unsigned COMMENT 'from host id', + `to` bigint unsigned COMMENT 'to host id', + `account` bigint unsigned COMMENT 'account', + `key` int unsigned COMMENT 'gre key', + `port_name` varchar(32) COMMENT 'in port on open vswitch', + `state` varchar(16) default 'FAILED' COMMENT 'result of tunnel creatation', + PRIMARY KEY(`from`, `to`, `account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `cloud`.`ovs_tunnel_account` (`from`, `to`, `account`, `key`, `port_name`, `state`) VALUES (0, 0, 0, 0, 'lock', 'SUCCESS'); + CREATE TABLE `cloud`.`ovs_vlan_mapping_dirty`( `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, `account_id` bigint unsigned COMMENT 'account id', diff --git a/setup/db/templates.sql b/setup/db/templates.sql old mode 100644 new mode 100755 index 85c30039da6..0c818b3bab1 --- a/setup/db/templates.sql +++ b/setup/db/templates.sql @@ -1,19 +1,19 @@ INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (1, 'routing-1', 'SystemVM Template', 0, now(), 'system', 0, 64, 1, 'http://download.cloud.com/releases/2.2.0/systemvm.vhd.bz2', '85806ccc181a7e83174f0adeeb3d2fb7', 0, 'SystemVM Template', 'VHD', 15, 0, 1, 'Xenserver'); + VALUES (1, 'routing-1', 'SystemVM Template (XenServer)', 0, now(), 'system', 0, 64, 1, 'http://download.cloud.com/releases/2.2.0/systemvm.vhd.bz2', '85806ccc181a7e83174f0adeeb3d2fb7', 0, 'SystemVM Template (XenServer)', 'VHD', 15, 0, 1, 'Xenserver'); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (2, 'centos53-x86_64', 'CentOS 5.3(x86_64) no GUI', 1, now(), 'builtin', 0, 64, 1, 'http://download.cloud.com/templates/builtin/f59f18fb-ae94-4f97-afd2-f84755767aca.vhd.bz2', 'b63d854a9560c013142567bbae8d98cf', 0, 'CentOS 5.3(x86_64) no GUI', 'VHD', 11, 1, 1, 'Xenserver'); + VALUES (2, 'centos53-x86_64', 'CentOS 5.3(64-bit) no GUI (XenServer)', 1, now(), 'builtin', 0, 64, 1, 'http://download.cloud.com/templates/builtin/f59f18fb-ae94-4f97-afd2-f84755767aca.vhd.bz2', 'b63d854a9560c013142567bbae8d98cf', 0, 'CentOS 5.3(64-bit) no GUI (XenServer)', 'VHD', 11, 1, 1, 'Xenserver'); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (3, 'routing-3', 'SystemVM Template (KVM)', 0, now(), 'system', 0, 64, 1, 'http://download.cloud.com/releases/2.2.0/systemvm.qcow2.bz2', 'fe80a229e3bf38a702e836236ed07f57', 0, 'SystemVM Template KVM', 'QCOW2', 15, 0, 1, 'KVM'); + VALUES (3, 'routing-3', 'SystemVM Template (KVM)', 0, now(), 'system', 0, 64, 1, 'http://download.cloud.com/releases/2.2.0/systemvm.qcow2.bz2', 'fe80a229e3bf38a702e836236ed07f57', 0, 'SystemVM Template (KVM)', 'QCOW2', 15, 0, 1, 'KVM'); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, display_text, enable_password, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (4, 'centos55-x86_64', 'CentOS 5.5(x86_64) no GUI', 1, now(), 'builtin', 0, 64, 1, 'http://download.cloud.com/templates/builtin/eec2209b-9875-3c8d-92be-c001bd8a0faf.qcow2.bz2', '1da20ae69b54f761f3f733dce97adcc0', 'CentOS 5.5(x86_64) no GUI', 0, 'QCOW2', 112, 1, 1, 'KVM'); + VALUES (4, 'centos55-x86_64', 'CentOS 5.5(64-bit) no GUI (KVM)', 1, now(), 'builtin', 0, 64, 1, 'http://download.cloud.com/templates/builtin/eec2209b-9875-3c8d-92be-c001bd8a0faf.qcow2.bz2', '1da20ae69b54f761f3f733dce97adcc0', 'CentOS 5.5(64-bit) no GUI (KVM)', 0, 'QCOW2', 112, 1, 1, 'KVM'); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (7, 'centos53-x64', 'centos53-x64', 1, now(), 'builtin', 0, 64, 1, 'http://download.cloud.com/releases/2.2.0/CentOS5.3-x86_64.ova', 'f6f881b7f2292948d8494db837fe0f47', 0, 'centos53-x64', 'OVA', 12, 1, 1, 'VMware'); + VALUES (7, 'centos53-x64', 'CentOS 5.3(64-bit) no GUI (vSphere)', 1, now(), 'builtin', 0, 64, 1, 'http://download.cloud.com/releases/2.2.0/CentOS5.3-x86_64.ova', 'f6f881b7f2292948d8494db837fe0f47', 0, 'CentOS 5.3(64-bit) no GUI (vSphere)', 'OVA', 12, 1, 1, 'VMware'); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (8, 'routing-8', 'SystemVM Template (VMWare)', 0, now(), 'system', 0, 32, 1, 'http://download.cloud.com/releases/2.2.0/systemvm.ova', 'ee3dc55e94e23a0490310bb78cf8cc76', 0, 'SystemVM Template VMWare', 'OVA', 15, 0, 1, 'VMware'); + VALUES (8, 'routing-8', 'SystemVM Template (vSphere)', 0, now(), 'system', 0, 32, 1, 'http://download.cloud.com/releases/2.2.0/systemvm.ova', 'ee3dc55e94e23a0490310bb78cf8cc76', 0, 'SystemVM Template (vSphere)', 'OVA', 15, 0, 1, 'VMware'); INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (1, 'CentOS'); INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (2, 'Debian'); diff --git a/ui/2.1/css/cloud_custom.css b/ui/2.1/css/cloud_custom.css deleted file mode 100644 index 920358b3403..00000000000 --- a/ui/2.1/css/cloud_custom.css +++ /dev/null @@ -1,540 +0,0 @@ -@charset "UTF-8"; -/* CSS Document */ - -#header{ - min-width:1000px; - width:100%; - float:left; - height:129px; - background:url(../images/v1header_bg.gif) repeat-x top left; - margin:0; - padding:0; -} - -a.logo { - width:201px; - height:77px; - float:left; - margin-left:10px; - background:url(../images/cloud_logo.gif) no-repeat top left; - display:inline; - padding:0; - text-decoration:none; -} - -.logout_logo { - width:167px; - height:70px; - float:right; - background:url(../images/logout_cloudlogo.gif) no-repeat top left; - margin:43px 99px 0 0; - display:inline; - padding:0; -} - -a:hover.logo { - text-decoration:none; -} - -.vmpopup_left { - width:33px; - height:588px; - float:left; - background: url(../images/v1_vmopoup_left.png) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.vmpopup_mid { - width:863px; - height:588px; - float:left; - background: url(../images/v1_vmopoup_mid.png) repeat-x top left; - margin:0; - padding:0; -} - -.vmpopup_right { - width:33px; - height:588px; - float:left; - background: url(../images/v1_vmopoup_right.png) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.allsteps_container { - width:848px; - height:130px; - background:url(../images/v1stepcontainer_bg.gif) repeat-x top left; - border:1px solid #e9e9e9; - float:left; - margin:0; - padding:0; -} - -.steps_box_selected { - width:212px; - height:130px; - float:left; - background:#748c03 url(../images/v1stepbox_slected.gif) repeat-x top left; - margin:0; - padding:0; -} - -.stepbox_right h3 { - width:150px; - height:auto; - color:#FFF; - float:left; - text-align:left; - font-size:15px; - font-weight:bold; - margin:28px 0 0 8px; - display:inline; -} - - -.stepbox_right p { - width:150px; - height:auto; - color:#FFF; - float:left; - text-align:justify; - font-size:11px; - font-weight:normal; - margin:8px 0 0 8px; - display:inline; -} - -.usernav_containerleft{ - width:11px; - float:left; - height:26px; - background:url(../images/userlinks_bgleft.gif) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.usernav_containermid{ - width:auto; - height:26px; - background: url(../images/userlinks_bgmid.gif) repeat-x top left; - margin:0; - padding:0; - -} - -/* hide from mac \*/ -* html .usernav_containerleft {margin-right: -3px;} -* html .usernav_containermid {margin-left: 0;} -/* end hide */ - - -.usernav_containerright{ - width:11px; - float:left; - height:26px; - background: url(../images/userlinks_bgright.gif) no-repeat top left; - margin:0 0 0 -11px; - padding:0; -} - -.usernav { - white-space:nowrap; - margin:0 0 0 0; - width:auto; - padding-right:25px; - padding-top:5px; - padding-left:25px; - height:auto; - font-size:11px; - color:#FFF; - text-align:left; -} - - -.menutab_off { - cursor:pointer; - cursor:hand; - width:156px; - height:26px; - float:left; - background:url(../images/v1menutab_off.gif) no-repeat top left; - margin-right:1px; - padding-top:11px; - color:#252525; - font-size:14px; - font-weight:100; - text-decoration:none; - text-align:center; -} - -.menutab_off:hover { - background:url(../images/v1menutab_off_hover.gif) no-repeat top left; - color:#FFF; - -} - -.menutab_on{ - width:156px; - height:26px; - float:left; - background:url(../images/v1menutab_on.gif) no-repeat top left; - margin-right:1px; - padding-top:11px; - color:#000; - font-size:14px; - font-weight:100; - text-decoration:none; - text-align:center; -} - - -.admin_menutab_off { - cursor:pointer; - cursor:hand; - width:94px; - height:24px; - float:left; - background:url(../images/v1admin_menutab_off.gif) no-repeat top left; - margin-right:1px; - margin-top:2px; - padding-top:11px; - color:#252525; - font-size:12px; - font-weight:100; - text-decoration:none; - text-align:center; -} - -.admin_menutab_off:hover { - background:url(../images/v1admin_menutab_off_hover.gif) no-repeat top left; - color:#FFF; -} - -.admin_menutab_on{ - width:94px; - height:24px; - float:left; - background:url(../images/v1admin_menutab_on.gif) no-repeat top left; - margin-right:1px; - margin-top:2px; - padding-top:11px; - color:#000; - font-size:12px; - font-weight:100; - text-decoration:none; - text-align:center; -} - -.grid_header { - width:100%; - height:24px; - float:left; - margin:0; - padding:0; - background:url(../images/v1gridheader_bg.gif) repeat-x top left; -} - -a.add_newvmbutton { - width:103px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/v1addnewvm_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_newvmbutton { - background:url(../images/v1addnewvm_button_hover.gif) no-repeat top left; -} - - -a.add_hostbutton { - width:63px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/v1addhost_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_hostbutton { - background:url(../images/v1addhost_button_hover.gif) no-repeat top left; -} - -a.add_storagepoolbutton { - width:115px; - height:28px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/v1addpstorage_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_storagepoolbutton { - background:url(../images/v1addpstorage_button_hover.gif) no-repeat top left; -} - -a.add_secondary_storagebutton { - width:129px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/v1addsstorage_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_secondary_storagebutton { - background:url(../images/v1addsstorage_button_hover.gif) no-repeat top left; -} - -a.add_volumebutton { - width:74px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/v1addvolume_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_volumebutton { - background:url(../images/v1addvolume_button_hover.gif) no-repeat top left; -} - -a.add_publicipbutton { - width:89px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/v1aquireip_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_publicipbutton { - background:url(../images/v1aquireip_button_hover.gif) no-repeat top left; -} - -a.add_sgroupbutton { - width:173px; - height:28px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/v1addsggroup_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_sgroupbutton { - background:url(../images/v1addsggroup_button_hover.gif) no-repeat top left; -} - -a.add_loadbalancerbutton { - width:167px; - height:28px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/v1addloadbalncer_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_loadbalancerbutton { - background:url(../images/v1addloadbalncer_button_hover.gif) no-repeat top left; -} - -a.add_newtemplatebutton { - width:92px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/v1addtemplate_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_newtemplatebutton { - background:url(../images/v1addtemplate_button_hover.gif) no-repeat top left; -} - -a.add_newisobutton { - width:70px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/v1addiso_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_newisobutton { - background:url(../images/v1addiso_button_hover.gif) no-repeat top left; -} - -a.add_serviceoffbutton { - width:116px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/v1addserviceoff_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_serviceoffbutton { - background:url(../images/v1addserviceoff_button_hover.gif) no-repeat top left; -} - -a.add_diskoffbutton { - width:102px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/v1adddiskoff_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_diskoffbutton { - background:url(../images/v1adddiskoff_button_hover.gif) no-repeat top left; -} - -.gridheader_morebutton { - width:58px; - height:24px; - float:right; - background:url(../images/v1grid_morebutton.gif) no-repeat top left; - margin-right:10px; - padding:0; - text-decoration:none; - cursor:pointer; - cursor:hand; -} - -.gridheader_morebutton:hover { - background:url(../images/v1grid_morebutton_hover.gif) no-repeat top left; -} - -/* Customized jquery css -----------------------------------*/ - - -.ui-widget-header { - border: 1px solid #c0bfbf; - background: #41546d url(../images/v1_popupheaderbg.gif) 50% 50% repeat-x; - color: #FFF; - font-weight: bold; -} - -.ui-state-default, .ui-widget-content .ui-state-default { height:25px; border: 1px solid #c0bfbf; background: #809617 url(../images/v1_popupbuttonbg.gif) 50% 50% repeat-x; font-weight: normal; color: #FFF; outline: none; padding-top:-0.2em; } - -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #c0bfbf; background: #809617 url(../images/v1_popupbuttonbg_hover.gif) 50% 50% repeat-x; font-weight: normal; color: #FFF; outline: none; padding-top:-0.2em;} - - -.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: -0.2em 1em .5em .4em; } -.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: -0.2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } - - -/* Form in dialog -----------------------------------*/ -.dialog_formcontent{ width:auto; height:auto; float:left; margin-top:10px; padding:0; color:#FFF; font-size:11px; margin-left:0; display:inline;} -.dialog_formcontent ol { width:auto; height:auto; color:#333; float:left; font-family:Arial, Helvetica, sans-serif; font-size:11px; list-style:none; margin:0; padding:0;} -.dialog_formcontent li { width:auto; height:auto; float:left; padding-bottom: 2px; color:#FFF; font-size:12px; font-weight:normal; text-align:left; margin:0 0 0 0;} -.dialog_formcontent label { width:100px; float:left; text-align:left; font-weight:bold; margin:0px 5px 5px 5px; color:#333; font-size:11px; font-weight:normal;} -.dialog_formcontent p{ width:auto; float:left; text-align:left; font-weight:bold; margin:0; color:#333; font-size:11px; font-weight:normal;} -.dialog_formcontent .radio { width:15px; height:15px; float:left; margin:0 10px 0 0; padding:0;} -.dialog_formcontent .checkbox { width:12px; height:12px; float:left; margin:0 10px 0 0; padding:0;} -.dialog_formcontent .text { background-color: #f4f2f2; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: 16px; width: 150px; margin:0 5px 3px 0; padding:0; color:#666;} -.dialog_formcontent .text2 { background-color: #f4f2f2; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: 14px; width: auto; margin:0 0 0 0; padding:0; color:#666;} -.dialog_formcontent .smalltext { background-color: #f4f2f2; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: 14px; width: 67px; margin:0 5px 3px 0 padding:0; color:#666;} -.dialog_formcontent .error_smalltext { background-color: #fbabb3; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: 14px; width: 67px; margin:0 5px 3px 0; padding:0; color:#666;} -.dialog_formcontent_errormsg {font: normal 10px Arial, Helvetica, sans-serif; float:left; height: auto; width: 160px; margin:0 10px 2px 110px; padding:0; color:#F00; display:inline;} -.dialog_formcontent_errormsg_long {font: normal 10px Arial, Helvetica, sans-serif; float:left; height: auto; width: 250px; margin:2px 10px 2px 0; padding:0; color:#F00; display:inline;} -.dialog_formcontent .select { background-color: #f4f2f2; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: auto; min-width: 153px; padding:0; color:#666; margin:0 10px 3px 0;} -.dialog_formcontent .snapselect { background-color: #f4f2f2; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: auto; width: 70px; padding:0; color:#666; margin:0 0 0 0;} -.dialog_formcontent .error_text { background-color: #fbabb3; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: 14px; width: 150px; margin:0 10px 0 0; padding:0; color:#666;} -.dialog_formcontent .error_text2 { background-color: #fbabb3; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: 14px; width: auto; margin:0 0 0 0; padding:0; color:#666;} -.dialog_formcontent .error_icon { width:15px; height:12px; float:left; background:url(images/alert_icon.png) no-repeat top left; margin:2px 0 0 3px; padding:0;} -.dialog_formcontent span {font-family:Arial, Helvetica, sans-serif; font-size:11px; text-align:left; color:#333; font-weight:normal; float:left; margin:0 5px 0 0; padding:0;} -.dialog_formcontent a { color:#2c8bbc; font-size:11px; font-weight:normal; text-align:left; text-decoration:underline; float:left; margin:0; padding:0;} -.dialog_formcontent a:link .dialog_formcontent a:visited { text-decoration:underline;} -dialog_formcontent a:hover { text-decoration:none;} - -/* Snapshots in dialog -----------------------------------*/ -.dialog_snapshotbox {width:auto; height:auto; float:left; display:block; margin:0; padding:0;} -.dialog_snapshotcontainer {width:auto height:auto; display:block; float:left; margin:0; padding:0;} -.dialog_snapshotleft {width:500px; height:135px; float:left;display:block; margin:0; padding:0;} -.dialog_snapshotleft_list {width:705px; height:auto; float:left; margin:0 0 10px 0; padding:0; color:#333; font-size:11px;} -.dialog_snapshotleft_info {width:470px; height:auto; float:left; margin:0 0 10px 0; padding:0; color:#333; font-size:11px;} -.dialog_snapshotleft_info p {width:auto; height:auto; float:left; color:#333; font-size:11px; font-weight:normal; margin:0; padding:0;} -.dialog_snapshotleft_info span {width:auto; height:auto; float:left; color:#333; font-size:11px; font-weight:bold; margin:0 2px 0 2px; padding:0;} -.dialog_snapshotleft_label {width:60px; height:auto; float:left; color:#457700; font-size:11px; font-weight:bold; margin:0; padding:0;} -.dialog_snapshotleft_max {width:75px; height:auto; float:left; margin:0 5px 0 0; padding:0; color:#333; font-size:11px;} -.dialog_snapshotleft_max p {width:auto; height:auto; float:left; margin:0 5px 0 0; padding:0; color:#666; font-weight:bold; font-size:11px;} -.dialog_snapshotleft_max span {width:auto; height:auto; float:left; color:#333; font-size:11px; font-weight:bold; margin:0; padding:0;} -.dialog_snapshotleft_actions {width:80px; height:auto; float:left; margin:0 5px 0 0; padding:0; color:#333; font-size:11px;} -.dialog_snapshotleft_actions a:link {width:auto; height:auto; margin:0 5px 0 0; padding:0; color:#2c8bbc; text-decoration:none; font-size:11px;} -.dialog_snapshotleft_actions a:visited {width:auto; height:auto; margin:0 5px 0 0; padding:0; color:#2c8bbc; text-decoration:none; font-size:11px;} -.dialog_snapshotleft_actions a:hover {width:auto; height:auto; margin:0 5px 0 0; padding:0; color:#2c8bbc; text-decoration:underline; font-size:11px;} -.dialog_snapshotright {width:705px; height:0px; float:left; display:none; margin:0; padding:15px 0 0 0; border-top:1px solid #666;} -.dialog_snapshotright_infotext{width:360px; height:160px; float:left; display:none; margin:0; padding:0; font-size:15px; font-family:Arial, Helvetica, sans-serif; font-size:normal; text-align:left; margin:10px; color:#333;} -.dialog_snapshots_editcontent {width:350px; height:auto; float:left; margin:0; padding:0;} -.dialog_snapshots_editcontent_title {width:280px; height:auto; float:left; margin:0; padding:0;} -.dialog_snapshots_editcontent_title p {width:auto; height:auto; float:left; margin:0; padding:0; font-size:14px; font-weight:normal;} -.dialog_snapshots_editcontent_title span{width:auto; height:auto; float:left; margin:0 0 0 5px; display:inline; padding:0; font-size:14px; font-weight:bold;} - - -/* Snapshots -----------------------------------*/ -.dialog_snapshotformcontent{ width:370px; height:auto; float:left; margin-top:10px; padding:0; color:#FFF; font-size:11px; margin-left:0; display:inline;} -.dialog_snapshotformcontent h2{ width:auto; height:auto; float:left; margin-left:10px; padding:0; font-size:15px; color:#77c4df; font-weight:normal;} -.dialog_snapshotformcontent ol { width:auto; height:auto; color:#333; float:left; font-family:Arial, Helvetica, sans-serif; font-size:11px; list-style:none; margin:0; padding:0;} -.dialog_snapshotformcontent li { width:auto; float:left; padding-bottom: 5px; color:#FFF; font-size:12px; font-weight:normal; text-align:left; margin-top:5px;} -.dialog_snapshotformcontent label { width:auto; float:left; text-align:left; font-weight:bold; margin:0 5px 0 5px; color:#333; font-size:11px; font-weight:normal;} -.dialog_snapshotformcontent span { width:auto; float:left; text-align:left; font-weight:normal; margin: 0 0 0 5px; color:#333; font-size:11px; font-weight:normal;} -.dialog_snapshotformcontent .radio { width:15px; height:15px; float:left; margin:0; padding:0;} -.dialog_snapshotformcontent .checkbox { width:15px; height:15px; float:left; margin:0; padding:0;} -.dialog_snapshotformcontent .text { background-color: #f4f2f2; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: 14px; width: 200px; margin:0; padding:0; color:#666;} -.dialog_snapshotformcontent .error_text { background-color: #fbabb3; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: 14px; width: 200px; margin:0; padding:0; color:#666;} -.dialog_snapshotformcontent a[title] { background-color: #FFF; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: 14px; width: 200px; margin:0; padding:0; color:#666;} -.dialog_snapshotformcontent .select { background-color: #f4f2f2; font: normal 11px Arial, Helvetica, sans-serif; float:left; border: 1px solid #999; height: auto; min-width: 150px; margin-left:5px; padding:0; color:#666;} -.frequency_left {width:150px; height:30px; float:left; margin:0; padding:0;} -.frequency_left h2 {width:auto; height:auto; float:left; margin-left:3px; padding:0; font-size:15px; color:#77c4df; font-weight:normal; } -.retention_right {width:200px; height:30px; float:left; margin:0; padding:0;} -.retention_right h2 {width:auto; height:auto; float:left; margin-left:3px; padding:0; font-size:15px; color:#77c4df; font-weight:normal; } - - -/* Selectable -----------------------------------*/ -.selectable .ui-selecting { background: #cbe4eb; } -.selectable .ui-selected { background: #cbe4eb; color: #333; } -.selectable {width:220px; height:190px; margin:20px 0 0 10px; float:left; list-style-type: none; padding: 0; overflow-x:hidden;overflow-y:auto; display:inline;} -.selectable li { width: 183px; height:15px; margin: 3px; padding: 0.4em; font-size: 11px; background:#FFF repeat top left; border:1px solid #e2e2e2; font-family:Arial, Helvetica, sans-serif; } -.sortable_grouppanel { width:525px; height:auto; float:left; margin:5px; padding:0;} -.sortable_grouppanel h2 { width:200px; height:auto; float:left; font-size:15px; color:#77c4df; font-weight:normal; text-align:left; margin:0; padding:0;} -.sortable_group_left { width:236px; height:250px; float:left; margin:0; padding:0;} -.sortable_group_mid { width:50px; height:250px; float:left; margin:0; padding:0;} -.sortable_direction_box {width:41px; height:55px; float:left; margin:70px 0 0 7px; display:inline; padding:0;} -.rightarrow_button {width:41px; height:23px; float:left; text-decoration: none; margin:0; padding:0; background:url(images/sortable_rightarrow.gif) no-repeat top left; cursor:pointer; cursor:hand;} -.rightarrow_button:hover {background:url(images/sortable_rightarrow_hover.gif) no-repeat top left;} -.leftarrow_button {width:41px; height:23px; float:left; text-decoration: none; margin-top:9px; padding:0; background:url(images/sortable_leftarrow.gif) no-repeat top left; cursor:pointer; cursor:hand;} -.leftarrow_button:hover {background:url(images/sortable_leftarrow_hover.gif) no-repeat top left;} -.sortable_group_right { width:236px; height:250px; float:left; margin:0; padding:0;} -.sortable_groupbox{ width:233px; height:220px; float:left; margin-top:5px; padding:0; background:url(images/sortable_groupbox.gif);} -.selectable_errorbox { width:492px; height:auto; float:left; background:#fcf3f2 repeat top left; border:1px solid #f2a89f;color:#d23c2b; font-family:Arial, Helvetica, sans-serif; font-size:11px; margin: 5px 0 0 10px;; display:inline;} -.selectable_errorbox p { width:auto; height:auto; float:left; margin: 5px; display:inline;} -.selectable_commentbox { width:492px; height:auto; float:left; background:#fff5d4 repeat top left; border:1px solid #ddbb45; color:#333; font-family:Arial, Helvetica, sans-serif; font-size:11px; margin: 5px 0 0 10px; display:inline;} -.selectable_commentbox p { width:auto; height:auto; float:left; margin: 5px; display:inline;} -.selectable_loader { width:16px; height:16px; background:url(images/comment_loader.gif) no-repeat top left; float:left; margin:5px;} - diff --git a/ui/2.1/css/images/._ui-bg_flat_0_aaaaaa_40x100.png b/ui/2.1/css/images/._ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index 4dd1de65b27..00000000000 Binary files a/ui/2.1/css/images/._ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ diff --git a/ui/2.1/css/images/._ui-bg_flat_75_ffffff_40x100.png b/ui/2.1/css/images/._ui-bg_flat_75_ffffff_40x100.png deleted file mode 100644 index 9adaaf8faf2..00000000000 Binary files a/ui/2.1/css/images/._ui-bg_flat_75_ffffff_40x100.png and /dev/null differ diff --git a/ui/2.1/css/images/._ui-bg_glass_30_393939_1x400.png b/ui/2.1/css/images/._ui-bg_glass_30_393939_1x400.png deleted file mode 100644 index 95cb227bcae..00000000000 Binary files a/ui/2.1/css/images/._ui-bg_glass_30_393939_1x400.png and /dev/null differ diff --git a/ui/2.1/css/images/._ui-bg_glass_30_ffffff_1x400.png b/ui/2.1/css/images/._ui-bg_glass_30_ffffff_1x400.png deleted file mode 100644 index c0e8f6cd348..00000000000 Binary files a/ui/2.1/css/images/._ui-bg_glass_30_ffffff_1x400.png and /dev/null differ diff --git a/ui/2.1/css/images/._ui-bg_glass_55_fbf9ee_1x400.png b/ui/2.1/css/images/._ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100644 index e6d2de5875e..00000000000 Binary files a/ui/2.1/css/images/._ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ diff --git a/ui/2.1/css/images/._ui-bg_inset-soft_95_fef1ec_1x100.png b/ui/2.1/css/images/._ui-bg_inset-soft_95_fef1ec_1x100.png deleted file mode 100644 index 5a92cde4ed1..00000000000 Binary files a/ui/2.1/css/images/._ui-bg_inset-soft_95_fef1ec_1x100.png and /dev/null differ diff --git a/ui/2.1/css/images/._ui-icons_222222_256x240.png b/ui/2.1/css/images/._ui-icons_222222_256x240.png deleted file mode 100644 index b9b085f47cd..00000000000 Binary files a/ui/2.1/css/images/._ui-icons_222222_256x240.png and /dev/null differ diff --git a/ui/2.1/css/images/._ui-icons_2e83ff_256x240.png b/ui/2.1/css/images/._ui-icons_2e83ff_256x240.png deleted file mode 100644 index 06a873b5def..00000000000 Binary files a/ui/2.1/css/images/._ui-icons_2e83ff_256x240.png and /dev/null differ diff --git a/ui/2.1/css/images/._ui-icons_FFF_256x240.png b/ui/2.1/css/images/._ui-icons_FFF_256x240.png deleted file mode 100644 index 34b2e6daf00..00000000000 Binary files a/ui/2.1/css/images/._ui-icons_FFF_256x240.png and /dev/null differ diff --git a/ui/2.1/css/images/._ui-icons_cd0a0a_256x240.png b/ui/2.1/css/images/._ui-icons_cd0a0a_256x240.png deleted file mode 100644 index 8e798954198..00000000000 Binary files a/ui/2.1/css/images/._ui-icons_cd0a0a_256x240.png and /dev/null differ diff --git a/ui/2.1/css/images/._ui-icons_ffffff_256x240.png b/ui/2.1/css/images/._ui-icons_ffffff_256x240.png deleted file mode 100644 index 8eb4ea07b0e..00000000000 Binary files a/ui/2.1/css/images/._ui-icons_ffffff_256x240.png and /dev/null differ diff --git a/ui/2.1/css/images/alert_icon.png b/ui/2.1/css/images/alert_icon.png deleted file mode 100644 index 9e5b604712a..00000000000 Binary files a/ui/2.1/css/images/alert_icon.png and /dev/null differ diff --git a/ui/2.1/css/images/clr_button.gif b/ui/2.1/css/images/clr_button.gif deleted file mode 100644 index f5c385829da..00000000000 Binary files a/ui/2.1/css/images/clr_button.gif and /dev/null differ diff --git a/ui/2.1/css/images/clr_button_hover.gif b/ui/2.1/css/images/clr_button_hover.gif deleted file mode 100644 index f882fa0baef..00000000000 Binary files a/ui/2.1/css/images/clr_button_hover.gif and /dev/null differ diff --git a/ui/2.1/css/images/comment_loader.gif b/ui/2.1/css/images/comment_loader.gif deleted file mode 100644 index 50c771799c5..00000000000 Binary files a/ui/2.1/css/images/comment_loader.gif and /dev/null differ diff --git a/ui/2.1/css/images/grid_headerbg.gif b/ui/2.1/css/images/grid_headerbg.gif deleted file mode 100644 index 5a0f72b82fb..00000000000 Binary files a/ui/2.1/css/images/grid_headerbg.gif and /dev/null differ diff --git a/ui/2.1/css/images/groupbox_top.gif b/ui/2.1/css/images/groupbox_top.gif deleted file mode 100644 index 4bb84721935..00000000000 Binary files a/ui/2.1/css/images/groupbox_top.gif and /dev/null differ diff --git a/ui/2.1/css/images/minimize_button.gif b/ui/2.1/css/images/minimize_button.gif deleted file mode 100644 index a4e2e267c7e..00000000000 Binary files a/ui/2.1/css/images/minimize_button.gif and /dev/null differ diff --git a/ui/2.1/css/images/minimize_button_hover.gif b/ui/2.1/css/images/minimize_button_hover.gif deleted file mode 100644 index 7837ed00baf..00000000000 Binary files a/ui/2.1/css/images/minimize_button_hover.gif and /dev/null differ diff --git a/ui/2.1/css/images/play_button.gif b/ui/2.1/css/images/play_button.gif deleted file mode 100644 index 6f483082ecb..00000000000 Binary files a/ui/2.1/css/images/play_button.gif and /dev/null differ diff --git a/ui/2.1/css/images/play_button_hover.gif b/ui/2.1/css/images/play_button_hover.gif deleted file mode 100644 index 6689e3eec81..00000000000 Binary files a/ui/2.1/css/images/play_button_hover.gif and /dev/null differ diff --git a/ui/2.1/css/images/shrink_button.gif b/ui/2.1/css/images/shrink_button.gif deleted file mode 100644 index 834625a2732..00000000000 Binary files a/ui/2.1/css/images/shrink_button.gif and /dev/null differ diff --git a/ui/2.1/css/images/shrink_button_hover.gif b/ui/2.1/css/images/shrink_button_hover.gif deleted file mode 100644 index eed9cec54b7..00000000000 Binary files a/ui/2.1/css/images/shrink_button_hover.gif and /dev/null differ diff --git a/ui/2.1/css/images/sortable_groupbox.gif b/ui/2.1/css/images/sortable_groupbox.gif deleted file mode 100644 index 98d71e0ccf3..00000000000 Binary files a/ui/2.1/css/images/sortable_groupbox.gif and /dev/null differ diff --git a/ui/2.1/css/images/sortable_leftarrow.gif b/ui/2.1/css/images/sortable_leftarrow.gif deleted file mode 100644 index 88ff3b53a07..00000000000 Binary files a/ui/2.1/css/images/sortable_leftarrow.gif and /dev/null differ diff --git a/ui/2.1/css/images/sortable_leftarrow_hover.gif b/ui/2.1/css/images/sortable_leftarrow_hover.gif deleted file mode 100644 index 8e05f3c4cb1..00000000000 Binary files a/ui/2.1/css/images/sortable_leftarrow_hover.gif and /dev/null differ diff --git a/ui/2.1/css/images/sortable_rightarrow.gif b/ui/2.1/css/images/sortable_rightarrow.gif deleted file mode 100644 index a9e8d6b4b8f..00000000000 Binary files a/ui/2.1/css/images/sortable_rightarrow.gif and /dev/null differ diff --git a/ui/2.1/css/images/sortable_rightarrow_hover.gif b/ui/2.1/css/images/sortable_rightarrow_hover.gif deleted file mode 100644 index 62c12ad9ad7..00000000000 Binary files a/ui/2.1/css/images/sortable_rightarrow_hover.gif and /dev/null differ diff --git a/ui/2.1/css/images/stop_button.gif b/ui/2.1/css/images/stop_button.gif deleted file mode 100644 index bfec9c64a89..00000000000 Binary files a/ui/2.1/css/images/stop_button.gif and /dev/null differ diff --git a/ui/2.1/css/images/stop_button_hover.gif b/ui/2.1/css/images/stop_button_hover.gif deleted file mode 100644 index c7c578fc83f..00000000000 Binary files a/ui/2.1/css/images/stop_button_hover.gif and /dev/null differ diff --git a/ui/2.1/css/images/ui-bg_errorglass_30_ffffff_1x400.png b/ui/2.1/css/images/ui-bg_errorglass_30_ffffff_1x400.png deleted file mode 100644 index f3af8e767bd..00000000000 Binary files a/ui/2.1/css/images/ui-bg_errorglass_30_ffffff_1x400.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-bg_flat_0_aaaaaa_40x100.png b/ui/2.1/css/images/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index 5b5dab2ab7b..00000000000 Binary files a/ui/2.1/css/images/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-bg_flat_75_ffffff_40x100.png b/ui/2.1/css/images/ui-bg_flat_75_ffffff_40x100.png deleted file mode 100644 index ac8b229af95..00000000000 Binary files a/ui/2.1/css/images/ui-bg_flat_75_ffffff_40x100.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-bg_glass_30_393939_1x400.png b/ui/2.1/css/images/ui-bg_glass_30_393939_1x400.png deleted file mode 100644 index af4655f7556..00000000000 Binary files a/ui/2.1/css/images/ui-bg_glass_30_393939_1x400.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-bg_glass_30_ffffff_1x400.png b/ui/2.1/css/images/ui-bg_glass_30_ffffff_1x400.png deleted file mode 100644 index 61b85ec69ec..00000000000 Binary files a/ui/2.1/css/images/ui-bg_glass_30_ffffff_1x400.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-bg_glass_55_fbf9ee_1x400.png b/ui/2.1/css/images/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100644 index ad3d6346e00..00000000000 Binary files a/ui/2.1/css/images/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-bg_glass_65_ffffff_1x400.png b/ui/2.1/css/images/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100644 index 42ccba269b6..00000000000 Binary files a/ui/2.1/css/images/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-bg_glass_75_000000_1x400.png b/ui/2.1/css/images/ui-bg_glass_75_000000_1x400.png deleted file mode 100644 index 2b919f2aa30..00000000000 Binary files a/ui/2.1/css/images/ui-bg_glass_75_000000_1x400.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-bg_glass_75_212121_1x400.png b/ui/2.1/css/images/ui-bg_glass_75_212121_1x400.png deleted file mode 100644 index 0f31b9180c5..00000000000 Binary files a/ui/2.1/css/images/ui-bg_glass_75_212121_1x400.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png b/ui/2.1/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png deleted file mode 100644 index 0e05810fffe..00000000000 Binary files a/ui/2.1/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-icons_222222_256x240.png b/ui/2.1/css/images/ui-icons_222222_256x240.png deleted file mode 100644 index ee039dc096a..00000000000 Binary files a/ui/2.1/css/images/ui-icons_222222_256x240.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-icons_2e83ff_256x240.png b/ui/2.1/css/images/ui-icons_2e83ff_256x240.png deleted file mode 100644 index 45e8928e528..00000000000 Binary files a/ui/2.1/css/images/ui-icons_2e83ff_256x240.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-icons_454545_256x240.png b/ui/2.1/css/images/ui-icons_454545_256x240.png deleted file mode 100644 index 7ec70d11bfb..00000000000 Binary files a/ui/2.1/css/images/ui-icons_454545_256x240.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-icons_FFF_256x240.png b/ui/2.1/css/images/ui-icons_FFF_256x240.png deleted file mode 100644 index ad9a84a8b23..00000000000 Binary files a/ui/2.1/css/images/ui-icons_FFF_256x240.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-icons_cd0a0a_256x240.png b/ui/2.1/css/images/ui-icons_cd0a0a_256x240.png deleted file mode 100644 index 7930a558099..00000000000 Binary files a/ui/2.1/css/images/ui-icons_cd0a0a_256x240.png and /dev/null differ diff --git a/ui/2.1/css/images/ui-icons_ffffff_256x240.png b/ui/2.1/css/images/ui-icons_ffffff_256x240.png deleted file mode 100644 index bef5178a905..00000000000 Binary files a/ui/2.1/css/images/ui-icons_ffffff_256x240.png and /dev/null differ diff --git a/ui/2.1/css/jquery-ui-1.7.2.custom.css b/ui/2.1/css/jquery-ui-1.7.2.custom.css deleted file mode 100644 index a3d4c5c6d36..00000000000 --- a/ui/2.1/css/jquery-ui-1.7.2.custom.css +++ /dev/null @@ -1,420 +0,0 @@ -/* -* jQuery UI CSS Framework -* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) -* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. -*/ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { display: none; } -.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } -.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } -.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } -.ui-helper-clearfix { display: inline-block; } -/* required comment for clearfix to work in Opera \*/ -* html .ui-helper-clearfix { height:1%; } -.ui-helper-clearfix { display:block; } -/* end clearfix */ -.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { cursor: default !important; } - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } - - - -/* -* jQuery UI CSS Framework -* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) -* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial,%20Helvetica,%20sans-serif&fwDefault=normal&fsDefault=11px&cornerRadius=4px&bgColorHeader=393939&bgTextureHeader=02_glass.png&bgImgOpacityHeader=30&borderColorHeader=c0bfbf&fcHeader=FFF&iconColorHeader=FFF&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=525252&iconColorContent=222222&bgColorDefault=393939&bgTextureDefault=02_glass.png&bgImgOpacityDefault=30&borderColorDefault=c0bfbf&fcDefault=FFF&iconColorDefault=ffffff&bgColorHover=393939&bgTextureHover=02_glass.png&bgImgOpacityHover=30&borderColorHover=c0bfbf&fcHover=77c4df&iconColorHover=ffffff&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=30&borderColorActive=c0bfbf&fcActive=212121&iconColorActive=ffffff&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=05_inset_soft.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px -*/ - - -/* Component containers -----------------------------------*/ -.ui-widget { font-family: Arial, Helvetica, sans-serif; font-size: 11px; } -.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Arial, Helvetica, sans-serif; font-size: 1em; } -.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #525252; } -.ui-widget-errorcontent { border: 1px solid #aaaaaa; background: #ffebeb 50% 50% repeat-x; color: #7f0000; } -.ui-widget-content a { color: #525252; } -.ui-widget-header { border: 1px solid #c0bfbf; background: #393939 url(images/ui-bg_glass_30_393939_1x400.png) 50% 50% repeat-x; color: #FFF; font-weight: bold; } -.ui-widget-errorheader { border: 1px solid #c0bfbf; background: #393939 url(images/ui-bg_errorglass_30_ffffff_1x400.png) 50% 50% repeat-x; color: #FFF; font-weight: bold; } -.ui-widget-header a { color: #FFF; } - -/* Interaction states -----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #c0bfbf; background: #393939 url(images/ui-bg_glass_30_393939_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #FFF; outline: none; } -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #FFF; text-decoration: none; outline: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #c0bfbf; background: #393939 url(images/ui-bg_glass_30_393939_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #77c4df; outline: none; } -.ui-state-hover a, .ui-state-hover a:hover { color: #77c4df; text-decoration: none; outline: none; } -.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #c0bfbf; background: #ffffff url(images/ui-bg_glass_30_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; outline: none; } -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; outline: none; text-decoration: none; } - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #363636; } -.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_inset-soft_95_fef1ec_1x100.png) 50% bottom repeat-x; color: #cd0a0a; } -.ui-state-error a, .ui-widget-content .ui-state-error a { color: #cd0a0a; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #cd0a0a; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } -.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } -.ui-widget-header .ui-icon {background-image: url(images/ui-icons_FFF_256x240.png); } -.ui-state-default .ui-icon { background-image: url(images/ui-icons_ffffff_256x240.png); } -.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } -.ui-state-active .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } -.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } -.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } - -/* positioning */ -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-off { background-position: -96px -144px; } -.ui-icon-radio-on { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; } -.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } -.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } -.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } -.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } -.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } -.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } -.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } -.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; } - -/* Overlays */ -.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } -.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; }/* Accordion -----------------------------------*/ -.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } -.ui-accordion .ui-accordion-li-fix { display: inline; } -.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } -.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; } -.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } -.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; } -.ui-accordion .ui-accordion-content-active { display: block; } - -/* Datepicker----------------------------------*/ -#ui-datepicker-div { z-index: 1005;} /* because => .adv_searchpopup {z-index:1004;} */ - -.ui-datepicker { width: 17em; padding: .2em .2em 0; } -.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } -.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } -.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } -.ui-datepicker .ui-datepicker-prev { left:2px; } -.ui-datepicker .ui-datepicker-next { right:2px; } -.ui-datepicker .ui-datepicker-prev-hover { left:1px; } -.ui-datepicker .ui-datepicker-next-hover { right:1px; } -.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } -.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } -.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; } -.ui-datepicker select.ui-datepicker-month-year {width: 100%;} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { width: 49%;} -.ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; } -.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } -.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } -.ui-datepicker td { border: 0; padding: 1px; } -.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } -.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } -.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { width:auto; } -.ui-datepicker-multi .ui-datepicker-group { float:left; } -.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } -.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } -.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } -.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } -.ui-datepicker-row-break { clear:both; width:100%; } - - - -/* RTL support */ -.ui-datepicker-rtl { direction: rtl; } -.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } -.ui-datepicker-rtl .ui-datepicker-group { float:right; } -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } - -/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ -.ui-datepicker-cover { - display: none; /*sorry for IE5*/ - display/**/: block; /*sorry for IE5*/ - position: absolute; /*must have*/ - z-index: -1; /*must have*/ - filter: mask(); /*must have*/ - top: -4px; /*must have*/ - left: -4px; /*must have*/ - width: 200px; /*must have*/ - height: 200px; /*must have*/ -} -/* Dialog -----------------------------------*/ -.ui-dialog { position: relative; padding: .2em; width: 300px; } -.ui-dialog .ui-dialog-titlebar { padding: .2em .3em .2em 1em; position: relative; font-size:11px; font-weight:normal; } -.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; font-size:11px;} -.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } -.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } -.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } -.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } -.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } -.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } -.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } -.ui-draggable .ui-dialog-titlebar { cursor: move; } - - - -/* Progressbar -----------------------------------*/ -.ui-progressbar { height:2em; text-align: left; } -.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable -----------------------------------*/ -.ui-resizable { position: relative;} -.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} -.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } -.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; } -.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; } -.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; } -.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; } -.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } -.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } -.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } -.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider -----------------------------------*/ -.ui-slider { position: relative; text-align: left; } -.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } -.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; } - -.ui-slider-horizontal { height: .8em; } -.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } -.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } -.ui-slider-horizontal .ui-slider-range-min { left: 0; } -.ui-slider-horizontal .ui-slider-range-max { right: 0; } - -.ui-slider-vertical { width: .8em; height: 100px; } -.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } -.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } -.ui-slider-vertical .ui-slider-range-min { bottom: 0; } -.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs -----------------------------------*/ -.ui-tabs { padding: .2em; zoom: 1; } -.ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; } -.ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; } -.ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } -.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; } -.ui-tabs .ui-tabs-hide { display: none !important; } - - - diff --git a/ui/2.1/css/jquery-ui-1.8.2.custom.css b/ui/2.1/css/jquery-ui-1.8.2.custom.css deleted file mode 100644 index 9e5fd42efc0..00000000000 --- a/ui/2.1/css/jquery-ui-1.8.2.custom.css +++ /dev/null @@ -1,499 +0,0 @@ -/* -* jQuery UI CSS Framework -* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) -* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. -*/ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { display: none; } -.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } -.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } -.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } -.ui-helper-clearfix { display: inline-block; } -/* required comment for clearfix to work in Opera \*/ -* html .ui-helper-clearfix { height:1%; } -.ui-helper-clearfix { display:block; } -/* end clearfix */ -.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { cursor: default !important; } - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } - - -/* -* jQuery UI CSS Framework -* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) -* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px -*/ - - -/* Component containers -----------------------------------*/ -.ui-widget { font-family: Arial, Helvetica, sans-serif; font-size: 11px; } -.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Arial, Helvetica, sans-serif; font-size: 1em; } -.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #525252; } -.ui-widget-errorcontent { border: 1px solid #aaaaaa; background: #ffebeb 50% 50% repeat-x; color: #7f0000; } -.ui-widget-content a { color: #2c8bbc; } -.ui-widget-header { border: 1px solid #c0bfbf; background: #393939 url(images/ui-bg_glass_30_393939_1x400.png) 50% 50% repeat-x; color: #FFF; font-weight: bold; } -.ui-widget-errorheader { border: 1px solid #c0bfbf; background: #393939 url(images/ui-bg_errorglass_30_ffffff_1x400.png) 50% 50% repeat-x; color: #FFF; font-weight: bold; } -.ui-widget-header a { color: #ffffff; } - -/* Interaction states -----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; } -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { height:22px; border: 1px solid #fbcb09; background: #c7f9ff repeat-x; font-weight: bold; color: #c77405; } -.ui-state-hover a, .ui-state-hover a:hover { color: #333; text-decoration: none; } -.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; } -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; } -.ui-widget :active { outline: none; } - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } -.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; } -.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } - -/* Icons -----------------------------------*/ - -/* states and images */ -/* When mouse is over a resizable element, a small black triangle show => which we don't want. So, comment out the following line.*/ -/* -.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } -*/ -.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } -.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } -.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); } -.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } -.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } -.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); } -.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); } - -/* positioning */ -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-off { background-position: -96px -144px; } -.ui-icon-radio-on { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } -.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } -.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } -.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } -.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } -.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } -.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } -.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } -.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } - -/* Overlays */ -.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); } -.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/* Resizable -----------------------------------*/ -.ui-resizable { position: relative;} -.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} -.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } -.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } -.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } -.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } -.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } -.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } -.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } -.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } -.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Selectable -----------------------------------*/ -.ui-selectable-helper { border:1px dotted black } -/* Accordion -----------------------------------*/ -.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } -.ui-accordion .ui-accordion-li-fix { display: inline; } -.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } -.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } -/* IE7-/Win - Fix extra vertical space in lists */ -.ui-accordion a { zoom: 1; } -.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } -.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } -.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } -.ui-accordion .ui-accordion-content-active { display: block; }/* Autocomplete -----------------------------------*/ -.ui-autocomplete { position: absolute; cursor: default; } -.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; } - -/* workarounds */ -* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ - -/* Menu -----------------------------------*/ -.ui-menu { - list-style:none; - padding: 2px; - margin: 0; - display:block; -} -.ui-menu .ui-menu { - margin-top: -3px; -} -.ui-menu .ui-menu-item { - margin:0; - padding: 0; - zoom: 1; - float: left; - clear: left; - width: 100%; -} -.ui-menu .ui-menu-item a { - text-decoration:none; - display:block; - padding:.2em .4em; - line-height:1.5; - zoom:1; -} -.ui-menu .ui-menu-item a.ui-state-hover, -.ui-menu .ui-menu-item a.ui-state-active { - font-weight: normal; - margin: -1px; - background:#c7f9ff repeat top left; - color:#004351; - border:0; - height:18px; -} -/* Button -----------------------------------*/ - -.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ -.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ -button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ -.ui-button-icons-only { width: 3.4em; } -button.ui-button-icons-only { width: 3.7em; } - -/*button text element */ -.ui-button .ui-button-text { display: block; line-height: 1.4; } -.ui-button-text-only .ui-button-text { padding: .4em 1em; } -.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } -.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } -.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } -/* no icon support for input elements, provide padding by default */ -input.ui-button { padding: .4em 1em; } - -/*button icon element(s) */ -.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } -.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } -.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } -.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } - -/*button sets*/ -.ui-buttonset { margin-right: 7px; } -.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } - -/* workarounds */ -button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ - - - - - -/* Dialog -----------------------------------*/ -.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } -.ui-dialog .ui-dialog-titlebar { padding: .2em .3em .2em 1em; position: relative; font-size:11px; font-weight:normal; } -.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; font-size:11px;} -.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } -.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } -.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; height:18px; color:#FFF; } -.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } -.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: -0.2em 1em .5em .4em; } -.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: -0.2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } -.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } -.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; font-size:11px;} -/* Slider -----------------------------------*/ -.ui-slider { position: relative; text-align: left; } -.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } -.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } - -.ui-slider-horizontal { height: .8em; } -.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } -.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } -.ui-slider-horizontal .ui-slider-range-min { left: 0; } -.ui-slider-horizontal .ui-slider-range-max { right: 0; } - -.ui-slider-vertical { width: .8em; height: 100px; } -.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } -.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } -.ui-slider-vertical .ui-slider-range-min { bottom: 0; } -.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs -----------------------------------*/ -.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ -.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } -.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } -.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } -.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } -.ui-tabs .ui-tabs-hide { display: none !important; } -/* Datepicker -----------------------------------*/ -.ui-datepicker { width: 17em; padding: .2em .2em 0; } -.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } -.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } -.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } -.ui-datepicker .ui-datepicker-prev { left:2px; } -.ui-datepicker .ui-datepicker-next { right:2px; } -.ui-datepicker .ui-datepicker-prev-hover { left:1px; } -.ui-datepicker .ui-datepicker-next-hover { right:1px; } -.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } -.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } -.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } -.ui-datepicker select.ui-datepicker-month-year {width: 100%;} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { width: 49%;} -.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } -.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } -.ui-datepicker td { border: 0; padding: 1px; } -.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } -.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } -.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { width:auto; } -.ui-datepicker-multi .ui-datepicker-group { float:left; } -.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } -.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } -.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } -.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } -.ui-datepicker-row-break { clear:both; width:100%; } - -/* RTL support */ -.ui-datepicker-rtl { direction: rtl; } -.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } -.ui-datepicker-rtl .ui-datepicker-group { float:right; } -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } - -/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ -.ui-datepicker-cover { - display: none; /*sorry for IE5*/ - display/**/: block; /*sorry for IE5*/ - position: absolute; /*must have*/ - z-index: -1; /*must have*/ - filter: mask(); /*must have*/ - top: -4px; /*must have*/ - left: -4px; /*must have*/ - width: 200px; /*must have*/ - height: 200px; /*must have*/ -}/* Progressbar -----------------------------------*/ -.ui-progressbar { height:2em; text-align: left; } -.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } - - diff --git a/ui/2.1/css/logger.css b/ui/2.1/css/logger.css deleted file mode 100644 index 43c73ef4295..00000000000 --- a/ui/2.1/css/logger.css +++ /dev/null @@ -1,119 +0,0 @@ -@charset "UTF-8"; -.logwin { - position: absolute; - - z-index:2147483648; - width: 800px; - border: 1px solid gray; - background: white; -} - -.logwin_title{ - width:auto; - height: 23px; - background:url(images/grid_headerbg.gif) repeat-x top left; - border: 1px sold #737373; -} - -.logwin_title_actionbox{ - width:175px; - height:16px; - float:left; - margin:4px 0 0 7px; - display:inline; -} - - -.logwin_title_actionbox .select { - background: #424242; - font: normal 10px Arial, Helvetica, sans-serif; - float:left; - border: 1px solid #6e6e6e; - height: 16px; - width: 100px; - margin-left:3px; - padding:0 0 0 3px; - color:#CCC; -} - -.logwin_title_rgtactionbox{ - width:49px; - height:15px; - float:right; - margin:4px 0 0 7px; - display:inline; -} - - -a.logwin_playbutton { - width:18px; - height:15px; - float:left; - background:url(images/play_button.gif) no-repeat top left; - margin-right:2px; - padding:0; -} - -a:hover.logwin_playbutton { - background:url(images/play_button_hover.gif) no-repeat top left; -} - -a.logwin_stopbutton { - width:18px; - height:15px; - float:left; - background:url(images/stop_button.gif) no-repeat top left; - margin-right:2px; - padding:0; -} - -a:hover.logwin_stopbutton { - background:url(images/stop_button_hover.gif) no-repeat top left; -} - -a.logwin_clrbutton { - width:28px; - height:15px; - float:left; - background:url(images/clr_button.gif) no-repeat top left; - margin:0; - padding:0; -} - -a:hover.logwin_clrbutton { - background:url(images/clr_button_hover.gif) no-repeat top left; -} - -a.logwin_shrinkbutton { - width:18px; - height:15px; - float:right; - background:url(images/shrink_button.gif) no-repeat top left; - margin-right:7px; - margin-top:4px; - padding:0; -} - -a:hover.logwin_shrinkbutton { - background:url(images/shrink_button_hover.gif) no-repeat top left; -} - -a.logwin_minimizebutton { - width:18px; - height:15px; - float:left; - background:url(images/minimize_button.gif) no-repeat top left; - margin-right:2px; - padding:0; -} - -a:hover.logwin_minimizebutton { - background:url(images/minimize_button_hover.gif) no-repeat top left; -} - -.logwin_content { - overflow:scroll; - height: 477px; - background: white; -} - diff --git a/ui/2.1/css/main.css b/ui/2.1/css/main.css deleted file mode 100644 index 8cdf5260ad1..00000000000 --- a/ui/2.1/css/main.css +++ /dev/null @@ -1,7906 +0,0 @@ -@charset "UTF-8"; -/* CSS Document */ - -*{ - margin:0; - padding:0; -} - -body{ - font-family:Arial, Helvetica, sans-serif; - font-size:11px; - color:#717171; - font-weight:normal; - background:#FFF repeat top left; - margin:0; - padding:0; -} - - -#logoutpage { - width:100%; - background:#4e4e4e url(../images/logout_bg.gif) repeat-x top left; - margin:0; - padding:0; - font-family:Arial, Helvetica, sans-serif; - color:#717171; -} - - -#registerpage { - width:100%; - background:url(../images/logout_bg.gif) #4e4e4e repeat-x top left; - margin:0; - padding:0; - font-family:Arial, Helvetica, sans-serif; - color:#717171; -} - -#logoutpage_mainmaster { - width:848px; - height:auto; - margin-left:auto; - margin-right:auto; - padding:0; -} - -#logoutpage_mainbox { - width:848px; - height:auto; - float:left; - margin-top:100px; - padding:0; -} - -.logoutpage_mainbox_top { - width:848px; - height:149px; - float:left; - background:url(../images/logout_top.gif) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.logout_logocontainer { - width:848px; - height:109px; - float:left; - margin:0; - padding:0; -} - -.logout_titlecontainer { - width:848px; - height:40px; - float:left; - margin:0; - padding:0; -} - -.logout_titlecontainer h1 { - width:750px; - height:auto; - float:left; - color:#006899; - font-family:Arial, Helvetica, sans-serif; - font-size:28px; - font-weight:normal; - margin-left:70px; - display:inline; - padding:0; -} - -.logout_logo { - width:167px; - height:56px; - float:right; - background:url(../images/logout_logo.gif) no-repeat top left; - margin:43px 99px 0 0; - display:inline; - padding:0; -} - -.logoutpage_mainbox_mid{ - width:848px; - height:auto; - float:left; - background:url(../images/logout_mid.gif) repeat-y top left; - margin:0; - padding:0; -} - -.logoutpage_formcontent{ - width:780px; - height:auto; - float:left; - margin-left:70px; - margin-top:15px; - display:inline; - padding:0; -} - -.logoutpage_formcontent ol { - width: 750px; - color:#333; - float:left; - font-family:Arial, Helvetica, sans-serif; - font-size:12px; - list-style:none; -} - -.logoutpage_formcontent li { - width:700px; - float:left; - padding-bottom: 20px; - font-family:Verdana, Geneva, sans-serif; - color:#333; - font-size:12px; - font-weight:normal; -} - -.logoutpage_formcontent label { - width:120px; - float:left; - text-align:left; - font-weight:normal; - color:#575757; - font-size:16px; - margin-top:2px; - font-family:Arial, Helvetica, sans-serif; -} - -.logoutpage_formcontent .text { - background-color: #fff9d9; - font: normal 16px Arial, Helvetica, sans-serif; - padding:3px 0 0 3px; - float:left; - border: 1px solid #bcbcbc; - height: 22px; - width: 285px; - margin:0; - color:#666; -} -.loginbutton_box { - width:750px; - height:44px; - float:left; - margin-top:2px; - margin-bottom:10px; - padding:0; -} - -.loginbutton_box p{ - width:300px; - height:auto; - float:left; - margin-top:10px; - margin-left:5px; - color:#F00; - text-align:left; - font-size:14px; - padding:0; -} - - -a.loginbutton { - width:95px; - height:44px; - float:left; - background:url(../images/sprite1.gif) no-repeat -153px -174px; - margin:0; - padding:0; - text-decoration:none; -} - -a:hover.loginbutton { - background:url(../images/sprite1.gif) no-repeat -249px -174px; -} - - -a.registerbutton { - width:106px; - height:44px; - float:left; - background:url(../images/sprite1.gif) no-repeat -346px -174px; - margin:0; - padding:0; - text-decoration:none; -} - -a:hover.registerbutton { - background:url(../images/sprite1.gif) no-repeat -5px -219px; -} - -.logoutpage_mainbox_bot { - width:848px; - height:113px; - float:left; - background:url(../images/logout_bot.gif) no-repeat top left; - margin:0; - padding:0; -} - -.logout_registerbox { - width:654px; - height:35px; - float:left; - background:url(../images/register_box.gif) no-repeat top left; - margin-top:6px; - margin-left:70px; - display:inline; - padding:16px 0 0 20px; - font-size:14px; - font-family:Arial, Helvetica, sans-serif; - color:#666; -} - - -.logout_registerbox a:link { - color:#2c8bbc; - text-decoration:underline; - font-size:14px; - font-family:Arial, Helvetica, sans-serif; -} - -.logout_registerbox a:visited { - color:#2c8bbc; - text-decoration:underline; - font-size:14px; - font-family:Arial, Helvetica, sans-serif; -} - -.logout_registerbox a:hover{ - color:#333; - text-decoration:none; - font-size:14px; - font-family:Arial, Helvetica, sans-serif; -} - - -#mainmaster{ - min-width:1000px; - width:100%; - height:auto; - float:left; - margin:0; - padding:0; - overflow:visible; -} - -#header{ - min-width:1000px; - width:100%; - float:left; - height:129px; - background:url(../images/header_bg.gif) repeat-x top left; - margin:0; - padding:0; -} - -.header_top { - min-width:1000px; - width:100%; - float:left; - height:92px; - margin:0; - padding:0; -} - -.header_topleft { - width:280px; - float:left; - height:92px; - margin:0; - padding:0; -} - -a.logo { - width:201px; - height:77px; - float:left; - margin-left:10px; - background:url(../images/logo.gif) no-repeat top left; - display:inline; - padding:0; - text-decoration:none; -} - -a:hover.logo { - text-decoration:none; -} - - -.header_topright{ - width:auto; - float:right; - height:92px; - margin:0; - padding:0; -} - -.usernav_container{ - width:auto; - float:left; - height:26px; - margin:0; - padding:0; -} - -.usernav_containerleft{ - width:11px; - float:left; - height:26px; - background:url(../images/sprite1.gif) no-repeat -3px -3px; - margin:0; - padding:0; - overflow:hidden; -} - -.usernav_containermid{ - width:auto; - height:26px; - background: url(../images/userlogin_mid.gif) repeat-x top left; - margin:0; - padding:0; - -} - -/* hide from mac \*/ -* html .usernav_containerleft {margin-right: -3px;} -* html .usernav_containermid {margin-left: 0;} -/* end hide */ - - - -.usernav { - white-space:nowrap; - margin:0 0 0 0; - width:auto; - padding-right:25px; - padding-left:25px; - height:auto; - font-size:11px; - color:#8a8a8a; - text-align:left; - -} - -.usernav a:link { - font-size:11px; - color:#00a1e3; - text-align:left; - text-decoration:none; -} - -.usernav a:visited { - font-size:11px; - color:#00a1e3; - text-align:left; - text-decoration:none; -} - -.usernav a:hover { - font-size:11px; - color:#00a1e3; - text-align:left; - text-decoration:underline; -} - - -.usernav_containerright{ - width:11px; - float:left; - height:26px; - background: url(../images/sprite1.gif)no-repeat -17px -3px; - margin:0 0 0 -11px; - padding:0; -} - -.header_bot { - min-width:1000px; - width:100%; - float:left; - height:37px; - margin:0; - padding:0; -} - -#globalnav_container { - width:auto; - height:37px; - float:left; - margin-left:15px; - display:inline; - padding:0; - -} - - -.menutab_off { - cursor:pointer; - cursor:hand; - width:156px; - height:26px; - float:left; - background:url(../images/sprite1.gif) no-repeat -5px -45px; - margin-right:1px; - padding-top:11px; - color:#c5c5c5; - font-size:14px; - font-weight:100; - text-decoration:none; - text-align:center; -} - -.menutab_off:hover { - background:url(../images/sprite1.gif) no-repeat -165px -45px; - -} - -.menutab_on{ - width:156px; - height:26px; - float:left; - background:url(../images/sprite1.gif) no-repeat -329px -45px; - margin-right:1px; - padding-top:11px; - color:#000; - font-size:14px; - font-weight:100; - text-decoration:none; - text-align:center; -} - - -.admin_menutab_off { - cursor:pointer; - cursor:hand; - width:94px; - height:24px; - float:left; - background:url(../images/sprite1.gif) no-repeat -531px -45px; - margin-right:1px; - margin-top:2px; - padding-top:11px; - color:#c5c5c5; - font-size:12px; - font-weight:100; - text-decoration:none; - text-align:center; -} - -.admin_menutab_off:hover { - background:url(../images/sprite1.gif) no-repeat -531px -94px; - -} - -.admin_menutab_on{ - width:94px; - height:24px; - float:left; - background:url(../images/sprite1.gif) no-repeat -531px -142px; - margin-right:1px; - margin-top:2px; - padding-top:11px; - color:#000; - font-size:12px; - font-weight:100; - text-decoration:none; - text-align:center; -} - - -.submenu_tab { - min-width:1000px; - width:100%; - height:30px; - float:left; - background:url(../images/submenu_bg.gif) repeat-x top left; - margin:0; - padding:0; -} - -.submenu_links { - width:80%; - height:auto; - float:left; - margin:-25px 0 0 10px; - padding:0; -} - -.submenu_links_off{ - width:150px; - height:18px; - float:left; - color:#2c8bbc; - text-decoration:none; - font-weight:normal; - font-size:12px; - margin-left:4px; - text-align:center; - padding:4px 0 0 0; - cursor:pointer; - cursor:hand; - border-right: 1px solid #c7c7c7; -} - -.submenu_links_off:hover { - text-decoration:underline; -} - -.submenu_links_on{ - width:150px; - height:20px; - float:left; - color:#FFF; - background:url(../images/submenu_linkbg.gif) no-repeat top left; - font-weight:normal; - font-size:12px; - margin-left:4px; - text-align:center; - padding:2px 0 0 0; - border-right: 1px solid #c7c7c7; -} - - -#search_panel{ - min-width:1000px; - width:100%; - float:left; - height:67px; - background:url(../images/searchpanel_bg.gif) repeat-x top left; - margin:0; - padding:0; -} - - - -#search_panelleft{ - width:180px; - float:left; - height:67px; - margin:0; - padding:0; -} - -a.vm_create_open { - width:144px; - height:41px; - float:left; - background:url(../images/sprite1.gif) no-repeat -192px -2px; - margin:15px 0 0 15px; - display:inline; - padding:0; -} - - -a:hover.vm_create_open { - background:url(../images/sprite1.gif) no-repeat -339px -2px; -} - -#overlay_black{ - display: none; - position: absolute; - top: 0%; - left: 0%; - width: 100%; - min-height: 805px; - height: 100%; - background-color: black; - z-index:1001; - -moz-opacity: 0.8; - opacity:.60; - filter: alpha(opacity=60); - overflow:hidden; -} - -#overlay_white{ - position: absolute; - width:99%; - height:800px; - float:left; - background-color: #FFF; - z-index:1001; - -moz-opacity: 0.8; - opacity:.60; - filter: alpha(opacity=60); - overflow:hidden; -} - -.vmpopup_container { - display:none; - width:929px; - height:588px; - position:absolute; - z-index:1005; - top:215px; - left:130px; -} - -.vmpopup_left { - width:33px; - height:588px; - float:left; - background: url(../images/vmopoup_left.png) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.vmpopup_mid { - width:863px; - height:588px; - float:left; - background: url(../images/vmopoup_mid.png) repeat-x top left; - margin:0; - padding:0; -} - -.vmpopup_maincontent { - width:858px; - height:519px; - float:left; - margin-top:28px; - padding:0; -} - -.wizard_controlbox { - width:858px; - height:38px; - float:left; - margin-top:12px; - padding:0; -} - -a.wizardnext_button { - width:82px; - height:38px; - float:left; - background:url(../images/sprite1.gif) no-repeat -346px -94px; - margin:0; - padding:0; -} - -a:hover.wizardnext_button { - background:url(../images/sprite1.gif) no-repeat -153px -132px; -} - -a.wizardprev_button { - width:82px; - height:38px; - float:left; - background:url(../images/sprite1.gif) no-repeat -239px -132px; - margin-right:15px; - padding:0; -} - -a:hover.wizardprev_button { - background:url(../images/sprite1.gif) no-repeat -324px -132px; -} - -.wizard_step1 { - width:858px; - height:467px; - float:left; - margin:0; - padding:0; -} - -.wizard_step2 { - width:858px; - height:467px; - float:left; - margin:0; - padding:0; -} - -#wizard_service_offering, #wizard_data_disk_offering { - width: 860px; - height:150px; - float:left; - border:1px solid #999; - margin:7px 10px 0 0; - padding:0; - overflow-y:scroll; - overflow-y:auto; -} - -#wizard_service_offering li, #wizard_data_disk_offering li { - width:820px; - height:auto; - float:left; - border:1px solid #CCC; - margin:2px 0 0 10px; - display:inline; - padding:4px; -} - - - -.wizard_step3 { - width:858px; - height:467px; - float:left; - margin:0; - padding:0; -} - -.wizard_step4 { - width:858px; - height:467px; - float:left; - margin:0; - padding:0; -} -.allsteps_container { - width:848px; - height:130px; - background:#f6f6f6 repeat-x top left; - border:1px solid #e9e9e9; - float:left; - margin:0; - padding:0; -} - -.steps_box { - width:212px; - height:130px; - float:left; - margin:0; - padding:0; -} - -.steps_box_selected { - width:212px; - height:130px; - float:left; - background:#dfdfdf url(../images/stepbox_slected.gif) repeat-x top left; - margin:0; - padding:0; -} - -.stepbox_left { - width:44px; - height:130px; - float:left; - margin:0; - padding:0; -} - -.stepsno_icons { - width:35px; - height:45px; - float:left; - margin:16px 0 0 8px; - display:inline; - padding:0; -} - -.stepbox_right { - width:168px; - height:130px; - float:left; - margin:0; - padding:0; -} - -.stepbox_right h3 { - width:150px; - height:auto; - color:#444444; - float:left; - text-align:left; - font-size:15px; - font-weight:bold; - margin:28px 0 0 8px; - display:inline; -} - - -.stepbox_right p { - width:150px; - height:auto; - color:#444444; - float:left; - text-align:justify; - font-size:11px; - font-weight:normal; - margin:8px 0 0 8px; - display:inline; -} - -.wizcontent_panel { - width:848px; - height:317px; - background:#f6f6f6 url(../images/wizard_contentbg.gif) repeat-x top left; - border:1px solid #FFF; - float:left; - margin-top:15px; - padding:0; - overflow-x:hidden; - overflow-y:scroll; - overflow-y:auto; -} - -.wizard_stepscontent{ - width:795px; - height:295px; - float:left; - margin:10px 10px; - padding:0; -} - - -.wizard_stepscontent h2{ - width:700px; - height:auto; - float:left; - color:#77c4df; - font-weight:200; - letter-spacing:1px; - font-size:25px; - margin-top:10px; - text-align:left; - padding:0; -} - -.wizard_stepscontent span{ - width:650px; - height:auto; - float:left; - color:#e7e7e7; - font-weight:normal; - font-size:11px; - margin-left:33px; - display:inline; - text-align:left; - padding:0; -} - -.wizard_formcontent{ - width:785px; - height:225px; - float:left; - margin-top:10px; - padding:0; - color:#FFF; - font-size:12px; - margin-left:8px; - display:inline; -} - -.wizard_formcontent_title { - width:700px; - height:auto; - float:left; - color:#77c4df; - font-size:12px; - font-weight:bold; - margin-top:5px; - padding:0; -} - -.wizard_formcontent ol { - width:780px; - height:auto; - color:#333; - float:left; - font-family:Arial, Helvetica, sans-serif; - font-size:12px; - list-style:none; -} - -.wizard_formcontent li { - width:750px; - float:left; - padding-bottom: 10px; - color:#FFF; - font-size:12px; - font-weight:normal; - text-align:left; - margin-top:5px; -} - -.wizard_formcontent label { - width:auto; - float:left; - text-align:left; - font-weight:bold; - margin-top:2px; - margin-left:10px; - color:#FFF; -} - -.wizard_formcontent .radio { - width:15px; - height:15px; - float:left; - margin:0; - padding:0; -} - -.wizard_formcontent .checkbox { - width:15px; - height:15px; - float:left; - margin:0; - padding:0; -} - -.wizard_formcontent .text { - background-color: #FFF; - font: normal 20px Arial, Helvetica, sans-serif; - float:left; - border: 1px solid #999; - height: 16px; - width: 250px; - margin:0; - padding:0; - color:#666; -} - -.wizard_formcontent select { - background-color: #FFF; - font: normal 12px Arial, Helvetica, sans-serif; - float:left; - border: 1px solid #999; - height: 18px; - width: 200px; - margin-left:10px; - padding:0; - color:#666; -} - -.wizard_formcontent p{ - width:680px; - height:auto; - float:left; - text-align:left; - font-weight:normal; - margin:2px 0 5px 10px; - color:#FFF; -} - - - -.wizard_formcontent a:link{ - width:auto; - height:auto; - color: #a9e2ff; - text-align:left; - font-size:11px; - font-weight:bold; - display:inline; - text-decoration:underline; -} - -.wizard_formcontent a:visited{ - width:auto; - height:auto; - color: #a9e2ff; - text-align:left; - font-size:11px; - font-weight:bold; - display:inline; - text-decoration:underline; -} - -.wizard_formcontent a:hover{ - width:auto; - height:auto; - color: #FFF; - text-align:left; - font-size:11px; - font-weight:bold; - display:inline; - text-decoration:underline; -} - - -.wizard_formcontent3{ - width:785px; - height:225px; - float:left; - margin-top:10px; - padding:0; - color:#FFF; - font-size:12px; - margin-left:8px; - display:inline; -} - - - -.wizard_formcontent3 ol { - width:780px; - height:auto; - color:#333; - float:left; - font-family:Arial, Helvetica, sans-serif; - font-size:12px; - list-style:none; -} - -.wizard_formcontent3 li { - width:750px; - float:left; - padding-bottom: 10px; - color:#FFF; - font-size:12px; - font-weight:normal; - text-align:left; - margin-top:5px; -} - -.wizard_formcontent3 label { - width:100px; - float:left; - text-align:left; - font-weight:bold; - margin-top:2px; - margin-left:10px; - color:#FFF; -} - -.wizard_formcontent3 .text { - background-color: #CCC; - font: normal 12px Arial, Helvetica, sans-serif; - font-weight:normal; - float:left; - border: 1px solid #666; - padding:2px 2px 0 2px; - height: 16px; - width: 196px; - margin:0; - padding:0; - color:#333; -} - -.vmpopup_right { - width:33px; - height:588px; - float:left; - background: url(../images/vmopoup_right.png) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -a.vm_create_close { - width:26px; - height:26px; - float:left; - margin-top:5px; - padding:0; - text-decoration:none; - background:url(../images/close_button.png) no-repeat top left; -} - - -a:hover.vm_create_close { - background:url(../images/close_button_hover.png) no-repeat top left; -} - - -#search_panelright{ - width:372px; - float:right; - height:67px; - background:url(../images/searchpanel_bg.gif) repeat-x top left; - margin:0; - padding:0; -} - -.filter_actionbox { - width:100%; - height:20px; - float:left; - margin:0; - padding:0; -} - -.pagination_panel { - width:100%; - height:26px; - float:left; - background:url(../images/pagination_bg.gif) repeat-x top left; - border:1px solid #cccccc; - margin:10px 0 0 0; - padding:0; -} - -.pagination_panel p{ - width:auto; - height:auto; - float:left; - color:#666; - margin:7px 0 0 10px; - display:inline; - text-align:left; - font-weight:normal; - font-size:11px; - padding:0; -} - -.pagination_actionbox { - width:auto; - height:22px; - float:right; - margin:1px 5px 0 0; - padding:0; -} - -.pagination_actionicon { - width:21px; - height:22px; - float:left; - margin:0 4px 0 5px; - padding:0; -} -.pagination_actions { - width: 80px; - height:22px; - float:left; - border-right:1px solid #CCC; - margin:0; - padding:0; -} -.pagination_actions a:link { - width:auto; - height:auto; - color:#2c8bbc; - text-align:left; - float:left; - margin:4px 0 0 5px; - text-decoration:none; -} - -.pagination_actions a:visited { - width:auto; - height:auto; - color: #2c8bbc; - text-align:left; - float:left; - margin:4px 0 0 5px; - text-decoration:none; -} - -.pagination_actions a:hover{ - width:auto; - height:auto; - color: #333; - text-align:left; - float:left; - margin:4px 0 0 5px; - text-decoration:underline; -} - -.selection_formarea { - width:250px; - height:20px; - float:left; - margin:0 0 0 0; - padding:0; -} - -.selection_formarea label{ - width:auto; - height:auto; - float:left; - text-align:left; - font-size:11px; - color:#999; - margin:3px 10px 0 0; - padding:0; -} - -.selection_formarea .select { - background-color: #f4f2f2; - font: normal 11px Arial, Helvetica, sans-serif; - float:left; - border: 1px solid #e5e5e5; - height: 18px; - min-width: 200px; - margin:0; - padding:1px 0 0 3px; - color:#666; -} - -.search_formarea { - width:370px; - height:auto; - margin-top:5px; - position:relative; - padding:0; - float:right; -} - -.advsearch_link { - width:auto; - height:auto; - float:left; - text-align:left; - text-decoration:none; - font-size:11px; - font-weight:normal; - color: #2c8bbc; - margin: 7px 0 0 5px; - padding:0; - cursor:pointer; - cursor:hand; -} - -.advsearch_link:hover{ - width:auto; - height:auto; - float:left; - text-align:left; - text-decoration:underline; - font-size:11px; - font-weight:normal; - color: #2c8bbc; - margin: 7px 0 0 5px; - padding:0; - cursor:pointer; - cursor:hand; -} - - -.search_formarea ol { - width: auto; - color:#333; - float:left; - font-family:Arial, Helvetica, sans-serif; - font-size:11px; - list-style:none; - margin:0; - padding:0; -} - -.search_formarea li { - width:266px; - float:left; - font-family:Arial, Helvetica, sans-serif; - color:#333; - font-weight:normal; - margin:0; - padding:0; -} - - -.search_formarea .text { - background-color: #f2f2f2; - font: normal 15px Arial, Helvetica, sans-serif; - border: 1px solid #e5e5e5; - height: 20px; - width: 266px; - color:#666; - padding-top:3px; - font-weight:normal; - margin:0; - float:left; -} - -.adv_searchpopup { - width:299px; - height:auto; - position:absolute; - background:#edf0f2 repeat top left; - border-top:1px solid #CCC; - border-left:1px solid #CCC; - border-right:2px solid #bebebe; - border-bottom:2px solid #b1b1b1; - margin:0; - padding:0; - z-index:1004; -} - -.adv_searchformbox { - width:280px; - height:auto; - float:left; - margin:0px 5px 10px 10px; - padding:0; -} - -.adv_search_actionbox { - width:280px; - height:20px; - float:left; - margin:10px 0 0 0; - padding:0; -} -.adv_searchpopup_button { - width:49px; - height:16px; - float:right; - background:url(../images/adv_searchbutton.gif) no-repeat top left; - margin:0 10px 0 0; - display:inline; - padding:0; - cursor:pointer; - cursor:hand; -} - -.adv_searchpopup_button:hover { - background:url(../images/adv_searchbutton_hover.gif) no-repeat top left; -} -.adv_searchbutton { - width:60px; - height:17px; - float:left; - background:url(../images/adv_searchbutton.jpg) no-repeat top left; - cursor:pointer; - cursor:hand; -} - -.adv_searchbutton:hover { - width:60px; - height:17px; - float:left; - background:url(../images/adv_searchbutton_hover.jpg) no-repeat top left; - cursor:pointer; - cursor:hand; -} - -.adv_searchformbox a:link { - width:auto; - height:auto; - float:right; - text-align:left; - text-decoration:underline; - font-size:10px; - font-weight:normal; - color: #2c8bbc; - margin: 7px 5px 0 0; - padding:0; -} - -.adv_searchformbox a:visited { - width:auto; - height:auto; - float:right; - text-align:left; - text-decoration:underline; - font-size:10px; - font-weight:normal; - color: #2c8bbc; - margin: 7px 5px 0 0; - padding:0; -} -.adv_searchformbox a:hover { - width:auto; - height:auto; - float:right; - text-align:left; - text-decoration:none; - font-size:10px; - font-weight:normal; - color: #2c8bbc; - margin: 7px 5px 0 0; - padding:0; -} - -.adv_searchformbox h3 { - width:auto; - height:auto; - color:#2d6487; - font-size:12px; - font-weight:bold; - float:left; - margin:8px 0 7px 0; - padding:0; -} - -.adv_searchformbox ol { - width: auto; - color:#333; - float:left; - font-family:Arial, Helvetica, sans-serif; - font-size:11px; - list-style:none; -} - -.adv_searchformbox li { - width:250px; - float:left; - clear:left; - font-family:Arial, Helvetica, sans-serif; - color:#333; - font-weight:normal; - margin:0 0 7px 0; -} - -.adv_searchformbox label { - width:70px; - float:left; - clear:left; - font-family:Arial, Helvetica, sans-serif; - color:#333; - font-size:11px; - font-weight:normal; -} - -.adv_searchformbox .text { - background-color: #FFF; - font: normal 11px Arial, Helvetica, sans-serif; - float:left; - border: 1px solid #CCC; - height: 14px; - width: 160px; - color:#666; - padding:1px 0 0 2px; - font-weight:normal; -} - -.adv_searchformbox .select { - background-color: #FFF; - font: normal 11px Arial, Helvetica, sans-serif; - float:left; - border: 1px solid #CCC; - height: 18px; - width: 163px; - margin:0; - padding:1px 0 0 2px; - color:#666; -} - - -a.search_button { - width:26px; - height:25px; - float:left; - margin-left:10px; - display:inline; - text-decoration:none; - background:url(../images/searchicon_button.jpg) no-repeat top left; - padding:0; -} - - - -a:hover.search_button { - background:url(../images/searchicon_button_hover.jpg) no-repeat top left; -} - -#maincontentarea { - min-width:1000px; - width:100%; - float:left; - height:auto; - background: #FFF url(../images/mcontent_bg.gif) repeat-x top left; - margin:0; - padding:0; -} - -.maincontent { - min-width:1000px; - width:98%; - float:left; - height:auto; - margin:0px 10px 10px 10px; - padding:0; -} - -#maincontent_title { - width:100%; - float:left; - height:40px; - margin-top:16px; - padding:0; -} - -.title_testlinks { - width:auto; - height:16px; - float:right; - margin:8px 15px 0 0; - padding:0; - text-align:left; - font-size:11px; - color: #2c8bbc; - text-decoration:underline; - font-weight:normal; - background:url(../images/test_icon.gif) no-repeat top left; - cursor:pointer; - cursor:hand; - padding:0 0 0 20px; -} - -.title_testlinks:hover { - width:auto; - height:16px; - float:right; - margin:8px 15px 0 0; - padding:0; - text-align:left; - font-size:11px; - color: #333; - text-decoration:underline; - background:url(../images/test_icon.gif) no-repeat top left; - font-weight:normal; - cursor:pointer; - cursor:hand; - padding:0 0 0 20px; -} - -.maintitle_icon { - width:34px; - height:30px; - float:left; - margin:0 5px 0 0; - padding:0; -} - -.fix_wrapper { - width:100%; - height:auto; - float:left; - margin:0; - padding:0; -} -.net_gridwrapper { - width:100%; - float:left; -} - - - -.net_gridleft{ - margin-right:456px; - padding:0; - height:auto; -} - -.db_admingrid_rightpanel{ - margin-left:580px; - width:auto; -} - -.db_admingrid_leftcontainer{ - float:left; - width:578px; -} - -.db_admingrid_capacitypanel{ - width:562px; - height:auto; - float:left; - margin:0; - padding:0; -} - -.db_capacitypanel_top{ - width:562px; - height:60px; - background:url(../images/capacitypanel_top.gif) no-repeat top left; - float:left; - margin:0; - padding:0; - overflow:hidden; -} - -.db_domain_top{ - width:562px; - height:32px; - background:url(../images/db_domain_top.gif) no-repeat top left; - float:left; - margin:0; - padding:0; - overflow:hidden; -} - -.db_capacitypanel_titlebox { - width:522px; - height:35px; - float:left; - margin:20px 0 0 19px; - padding:0; -} - -.db_capacitypanel_titlebox h2 { - width:200px; - height:auto; - float:left; - margin-left:8px; - color:#e26000; - font-size:16px; - font-weight:normal; - padding:0; -} - -.db_capacitypanel_graphtitleicon { - width:19px; - height:19px; - float:left; - background:url(../images/graph_titleicon.gif) no-repeat top left; - margin:0; - padding:0; -} - -.dbadmin_selectionformarea { - width:275px; - height:27px; - float:right; - margin:0; - padding:0; -} - -.dbadmin_selectionformarea .select { - background-color: #b6b6b6; - font: normal 11px Arial, Helvetica, sans-serif; - float:left; - border: 1px solid #8b8b8b; - height: 18px; - width:126px; - margin-left:10px; - padding:1px 0 0 3px; - color:#FFF; -} - -.db_capacitypanel_mid{ - width:562px; - height:auto; - background:url(../images/capacitypanel_mid.gif) repeat-y top left; - float:left; - margin:0; - padding:0; -} - -.db_capacitypanel_bardgpanel { - width:522px; - height:auto; - float:left; - margin:0 0 0 19px; - padding:0; -} - -.db_capacitypanel_bardg_bg { - width:522px; - height:81px; - float:left; - background:url(../images/db_bardg_bg.gif) no-repeat top left; - margin-top:10px; - padding:0; -} - -.db_capacitypanel_bardg_bgtop{ - width:522px; - height:20px; - float:left; - margin:0; - padding:0; -} - -.db_capacitypanel_bardg_titlebg{ - width:184px; - height:16px; - background:url(../images/db_bardg_titlebg.gif) no-repeat top left; - float:left; - margin:0; - padding:4px 0 0 12px; - color:#3a3a3a; - font-size:12px; - text-align:left; - font-weight:normal; -} - -.db_capacitypanel_bardg_bgbot{ - width:522px; - height:61px; - float:left; - margin:0; - padding:0; -} - -.db_bargraph_panel { - width:460px; - height:50px; - float:left; - margin:5px 0 0 25px; - display:inline; -} - -.db_bargraph_barbox { - width:354px; - height:50px; - float:left; - margin-top:5px; - display:inline; -} - -.db_bargraph_barbox_top { - width:354px; - height:13px; - float:left; - margin:0; - display:inline; -} - -.db_bargraph_barbox_bot { - width:354px; - height:37px; - float:left; - margin:0; - display:inline; -} - -.db_bargraph_barbox_bar { - width:354px; - height:18px; - background:#FFF repeat top left; - border:1px solid #7f7f7f; - float:left; - margin:0; - display:inline; -} - -.db_bargraph_bar_safetext { - width:auto; - height:auto; - float:left; - text-align:right; - color:#1288b9; - font-size:11px; - font-weight:normal; - margin:0; - padding:0; - display:inline; -} - -.db_bargraph_bar_safesmalltext { - width:30%; - height:auto; - float:left; - text-align:left; - color:#1288b9; - font-size:11px; - font-weight:normal; - margin:0; - padding:0; - display:inline; -} - -.db_bargraph_bar_unsafetext { - width:auto; - height:auto; - float:left; - text-align:right; - color:#ff0000; - font-size:11px; - font-weight:normal; - margin:0; - padding:0; - display:inline; -} - -.db_bargraph_bar_totaltext { - width:auto; - height:auto; - float:left; - text-align:left; - color:#516b00; - font-size:11px; - font-weight:bold; - margin:18px 0 0 7px; - display:inline; -} - - -.db_bargraph_barbox_safezone { - width:0; - height:18px; - background:url(../images/safebar_bg.gif) #53a1d6 repeat-x top left; - float:left; - margin:0; - display:inline; - text-align:right; - color:white; - font-size:11px; - font-weight:normal; -} - -.db_bargraph_barbox_unsafezone { - width:0; - height:18px; - background:url(../images/unsafebar_bg.gif) #c60000 repeat-x top left; - float:left; - margin:0; - display:inline; -} -.db_capacitypanel_bot{ - width:562px; - height:43px; - background:url(../images/capacitypanel_bot.gif) no-repeat top left; - float:left; - margin:0; - padding:0; -} - -.netgrid_container { - width:99%; - height:auto; - float:left; - margin-top:5px; - padding:0; - border:1px solid #c0bfbf; - position:relative; -} - -.netgridheader_cell1 { - width:30%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - - -.netgridheader_cell2 { - width:62%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} -.netgridheader_cell3 { - width:7%; - height:24px; - float:left; - margin:0; - padding:0; - overflow:hidden; -} -.netgridheader_cell4 { - width:31%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} - -.loadgridheader_cell1 { - width:32%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - overflow:hidden; - padding:0; -} -.loadgridheader_cell2 { - width:15%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} -.loadgridheader_cell3 { - width:7%; - height:24px; - float:left; - margin:0; - padding:0; - overflow:hidden; -} -.loadgridheader_cell4 { - width:17%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.snapgridheader_cell1 { - width:47%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.snapgridheader_cell2 { - width:22%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.snapgridheader_cell3 { - width:30%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.snap_row_cell1 { - width:47%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} -.snap_row_cell2 { - width:22%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.snap_row_cell3 { - width:30%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.snap_scheduleicon { - width:15px; - height:16px; - float:left; - background:url(../images/calendar_icon.gif) no-repeat top left; - margin-left:5px; - margin-top:-2px; - padding:0; -} - -.net_row_cell1 { - width:30%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} -.net_row_cell2 { - width:62%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.net_row_cell3 { - width:7%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} -.net_row_cell4 { - width:31%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} -.load_row_cell1 { - width:32%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} -.load_row_cell2 { - width:15%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.load_row_cell3 { - width:7%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} -.load_row_cell4 { - width:17%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.netgrid_celltitles { - color: #333; - text-align:left; - font-size:11px; - font-weight:normal; - margin:6px 0 6px 8px; - float:left; - display:inline; -} - -.netgrid_celltitles .text{ - height:16px; - float:left; - background:#FFF repeat top left; - color:#333; - font-size:10px; - text-align:left; - border:1px solid #999; - margin:0; - padding:0; -} - -.netgrid_celltitles .errortext{ - height:16px; - float:left; - background: #fbabb3 repeat top left; - color:#333; - font-size:10px; - text-align:left; - border:1px solid #999; - margin:0; - padding:0; -} - -.netgrid_celltitles .errormsg{ - height:auto; - float:left; - color:#F00; - font-size:10px; - text-align:left; - font-weight:normal; - margin:2px 0 0 0; - padding:0; -} -.netgrid_celltitles .select{ - height:18px; - float:left; - background:#FFF repeat top left; - color:#333; - font-size:10px; - text-align:left; - border:1px solid #999; - margin:0; - padding:0; -} - -.netgrid_celltitles a:link { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - display:inline; - text-decoration:none; - margin:0 5px 0 0; - padding:0; -} - -.netgrid_celltitles a:visited { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - display:inline; - text-decoration:none; - margin:0 5px 0 0; - padding:0; -} - -.netgrid_celltitles a:hover { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - display:inline; - text-decoration:underline; - margin:0 5px 0 0; - padding:0; -} - -.net_gridright { - width:456px; - height:465px; - float:left; - margin-left:-456px; - padding:0; - -} - -.db_gridright { - margin-right:472px; - padding:0; - border:1px solid #900; - height:auto; - -} - -.net_displaybox { - width:456px; - height:460px; - float:left; - margin:5px 0 10px 0; - padding:0; - background-attachment: scroll; - position: fixed; -} - -.net_displaybox_top { - width:456px; - height:76px; - float:left; - background:url(../images/display_boxtop.gif) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.net_displaytitlebox { - width:386px; - height:25px; - float:left; - margin:35px 0 0 42px; - display:inline; -} - -.net_displaytitlebox h2 { - width:300px; - height:auto; - float:left; - color:#FFF; - text-align:left; - font-size:12px; - font-weight:normal; - display:inline; -} - -.ip_gridheader_cell1 { - width:10%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.ip_gridheader_cell2 { - width:39%; - height:24px; - float:left; - margin:0; - padding:0; - overflow:hidden; -} - -.ip_gridheader_cell3 { - width:13%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.ip_gridrow_cell1 { - width:10%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.ip_gridrow_cell2 { - width:39%; - height:24px; - float:left; - margin:0; - padding:0; - overflow:hidden; -} - -.ip_gridrow_cell3 { - width:13%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.ip_gridheader_cell2 a:link { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - float:left; - display:inline; - text-decoration:none; -} - -.ip_gridheader_cell2 a:visited { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - float:left; - display:inline; - text-decoration:none; -} - -.ip_gridheader_cell2 a:hover { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - float:left; - display:inline; - text-decoration:underline; -} -a.add_rules { - width:54px; - height:25px; - float:right; - background:url(../images/sprite1.gif) no-repeat -313px -227px; - margin:0; - padding:0; -} - -a:hover.add_rules { - background:url(../images/sprite1.gif) no-repeat -374px -227px; -} - -.display_content { - width:388px; - height:336px; - float:left; - margin:10px 0 0 42px; - display:inline; - overflow-x:hidden; - overflow-y:auto; -} - -.display_gridbox { - width:362px; - height:auto; - float:left; - border:1px solid #bababa; - margin:0; - padding:0; -} -.load_graphicalbox { - width:362px; - height:auto; - float:left; - margin:0; - padding:0; -} - -.load_graphical_left { - width:85px; - height:auto; - float:left; - margin:0; - padding:0; -} - -.load_router { - width:59px; - height:59px; - float:left; - background:url(../images/load_routericon.gif) no-repeat top left; - margin:0; - padding:0; -} - - -.load_graphical_left p { - width:auto; - height:auto; - float:left; - margin-top:5px; - color:#FFF; - font-size:11px; - text-align:center; - font-weight:normal; - padding:0; -} - -.load_graphical_mid { - width:74px; - height:auto; - float:left; - margin:0; - padding:0; -} - -.load_joint { - width:74px; - height:7px; - float:left; - background:url(../images/load_joint.gif) no-repeat top left; - margin-top:25px; - padding:0; -} - - -.load_graphical_right { - width:203px; - height:auto; - float:left; - margin:0; - padding:0; -} - -.load_vmlist { - width:203px; - height:auto; - float:left; - margin-top:25px; - padding:0; -} - -.load_closebutton { - cursor:pointer; - cursor:hand; - width:12px; - height:12px; - float:right; - background:url(../images/loadgr_closebutton.png) no-repeat top left; - margin:6px 0 0 10px; - display:inline; - padding:0; -} - -.load_closebutton:hover { - background:url(../images/loadgr_closebutton_hover.png) no-repeat top left; -} - -.load_workingvm { - width:197px; - height:73px; - float:left; - background:url(../images/load_workingvm.gif) no-repeat top left; - margin:0; - padding:0; -} - -.load_newaddvm { - width:197px; - height:73px; - float:left; - background:url(../images/loading_addbg.gif) no-repeat top left; - cursor:pointer; - cursor:hand; - margin:0; - padding:0; -} - - -.load_graphicalvm_top { - width:197px; - height:25px; - float:left; - margin:0; - padding:0; -} - -.load_graphicalvm_bot { - width:197px; - height:48px; - float:left; - margin:0; - padding:0; -} - -.load_loadingvm { - width:197px; - height:73px; - float:left; - background: url(../images/loading_load.gif) no-repeat top left; - margin:0; - padding:0; -} - -.loadadding_animation { - width:16px; - height:16px; - margin:35px 0 0 45px; - float:left; - display:inline; - background: url(../images/load_aniloader.gif) no-repeat top left; -} - -.loadadd_icon{ - width:13px; - height:14px; - margin:35px 0 0 45px; - float:left; - display:inline; - background: url(../images/load_addicon.gif) no-repeat top left; -} - -.load_adding_text { - width:auto; - height:auto; - float:left; - margin:35px 0 0 5px; - display:inline; - color:#FFF; - font-size:11px; - font-weight:bold; -} - -.load_newadd_text { - width:auto; - height:auto; - float:left; - margin:35px 0 0 5px; - display:inline; - color:#FFF; - font-size:11px; - font-weight:bold; -} - - -.load_stoppedvm { - width:197px; - height:73px; - float:left; - background:url(../images/load_stoppedvm.gif) no-repeat top left; - margin:0; - padding:0; -} - -.loadingvmtext { - width:100px; - height:40px; - float:right; - margin:0 3px 0 0; - display:inline; - padding:0; -} - -.loadingvmtext p { - width:auto; - height:40px; - float:left; - color:#FFF; - font-size:11px; - text-align:left; - font-weight:normal; - margin:0; - padding:0; -} - - - -.display_gridheader { - width:362px; - height:24px; - float:left; - background:url(../images/display_headerbg.gif) repeat-x top left; - margin:0; - padding:0; -} - -.display_headercell1{ - width:105px; - height:24px; - float:left; - border-right:1px solid #bababa; - margin:0; - padding:0; - overflow:hidden; -} -.display_headercell2{ - width:47x; - height:24px; - float:left; - border-right:1px solid #bababa; - margin:0; - padding:0; - overflow:hidden; -} - -.display_snapheadercell1{ - width:71px; - height:24px; - float:left; - border-right:1px solid #bababa; - margin:0; - padding:0; - overflow:hidden; -} -.display_snapheadercell2{ - width:120px; - height:24px; - float:left; - border-right:1px solid #bababa; - margin:0; - padding:0; - overflow:hidden; -} - -.display_snapheadercell3{ - width:47px; - height:24px; - float:left; - border-right:1px solid #bababa; - margin:0; - padding:0; - overflow:hidden; -} -.display_headercell2{ - width:47x; - height:24px; - float:left; - border-right:1px solid #bababa; - margin:0; - overflow:hidden; - padding:0; -} -.display_snaprowcell1{ - width:71px; - height:20px; - float:left; - border-right:1px solid #bababa; - margin:0; - padding:0; - overflow:hidden; -} - -.display_snaprowcell2{ - width:120px; - height:20px; - float:left; - border-right:1px solid #bababa; - margin:0; - padding:0; - overflow:hidden; -} - -.display_snaprowcell3{ - width:47px; - height:20px; - float:left; - border-right:1px solid #bababa; - margin:0; - padding:0; - overflow:hidden; -} - -.display_headercell_title{ - width:auto; - height:auto; - float:left; - text-align:left; - color:#494949; - font-size:12px; - margin-top:5px; - margin-left:5px; - display:inline; - padding:0; - overflow:hidden; -} - -.display_rowodd { - width:362px; - height:20px; - float:left; - background:#6f6f6f repeat top left; - border-bottom:1px solid #bababa; - margin:0; - padding:0; -} - -.display_rowloading { - width:362px; - height:20px; - float:left; - background:#121212 repeat top left; - border-bottom:1px solid #bababa; - margin:0; - padding:0; -} - -.display_rowloading p { - width:auto; - height:auto; - float:left; - color:#FFF; - text-align:left; - text-decoration:none; - font-size:11px; - font-weight:bold; - margin:3px 0 0 10px; - display:inline; - padding:0; -} - -.display_rowloader_animation { - width:16px; - height:16px; - float:left; - background:url(../images/displaygrid_loader.gif) no-repeat top left; - margin:2px 0 0 10px; - display:inline; - padding:0; -} - -.display_rowodd:hover { - background: #000 repeat-x top left; -} - -.display_roweven { - width:362px; - height:20px; - float:left; - background:#464646 repeat top left; - border-bottom:1px solid #bababa; - margin:0; - padding:0; -} - -.display_roweven:hover { - background: #000 repeat-x top left; -} - -.display_rowcell1{ - width:105px; - height:20px; - float:left; - border-right:1px solid #bababa; - margin:0; - padding:0; - overflow:hidden; -} -.display_rowcell2{ - width:47x; - height:20px; - float:left; - margin:0; - padding:0; - overflow:hidden; -} -.display_rowcell_title{ - width:auto; - height:auto; - float:left; - text-align:left; - color:#FFF; - font-size:11px; - margin-top:5px; - margin-left:5px; - display:inline; - padding:0; - overflow:hidden; -} - -a.display_editbutton { - width:19px; - height:15px; - float:left; - text-decoration:none; - margin:2px 0 0 3px; - padding:0; - background:url(../images/display_editicon.png) no-repeat top left; -} - -a:hover.display_editbutton { - background:url(../images/display_editicon_hover.png) no-repeat top left; -} - -a.display_rollbackbutton { - width:19px; - height:15px; - float:left; - text-decoration:none; - margin:2px 0 0 3px; - padding:0; - background:url(../images/display_rollbackicon.png) no-repeat top left; -} - -a:hover.display_rollbackbutton { - background:url(../images/display_rollbackicon_hover.png) no-repeat top left; -} - -a.display_deletebutton { - width:11px; - height:14px; - float:left; - text-decoration:none; - margin:2px 0 0 4px; - padding:0; - background:url(../images/display_deleteicon.png) no-repeat top left; -} - -a:hover.display_deletebutton { - background:url(../images/display_deleteicon_hover.png) no-repeat top left; -} - -.net_displaybox_mid { - width:456px; - height:335px; - float:left; - background:url(../images/display_boxmid.gif) repeat-y top left; - margin:0; - padding:0; -} - -.net_displaybox_bot { - width:456px; - height:49px; - float:left; - background:url(../images/display_boxbot.gif) no-repeat top left; - margin:0; - padding:0; -} - -.small_gridconatiner_left { - width:49%; - float:left; - height:auto; - margin:20px 0 20px 0; - border:1px solid #c0bfbf; - padding:0; -} - -.small_gridconatiner_right{ - width:49%; - float:right; - height:auto; - margin:20px 0 20px 0; - border:1px solid #c0bfbf; - padding:0; -} - -.adding_loading { - width:100%; - float:left; - margin:0; - padding:0; - background: #e7f7fc repeat-x top left; - border-bottom:1px solid #e8e8e8; -} - -.adding_animation { - width:16px; - height:16px; - margin:3px 0 0 10px; - float:left; - display:inline; - background:url(../images/ajax-loader.gif) no-repeat top left; -} - -.adding_text { - width:auto; - height:auto; - float:left; - margin:8px 0 0 10px; - display:inline; - color:#333; - font-size:11px; - font-weight:bold; -} - -.result_loading { - width:100%; - float:left; - margin:0; - padding:0; - background: #fffee2 repeat-x top left; - border-bottom:1px solid #e8e8e8; -} - - -.result_loading p { - width:auto; - height:auto; - float:left; - margin:8px 0 0 10px; - display:inline; - color:#333; - font-size:11px; - font-weight:bold; -} - -.result_closebutton { - width:40px; - height:13px; - float:left; - text-decoration:none; - cursor:pointer; - cursor:hand; - margin:7px 0 0 60px; - display:inline; - background:url(../images/gridresult_closebutton.gif) no-repeat top left; - padding:0; -} - -.result_closebutton:hover { - background:url(../images/gridresult_closebutton_hover.gif) no-repeat top left; -} - - -.smallrow_odd { - width:100%; - float:left; - margin:0; - padding:0; - background: #FFF repeat-x top left; - border-bottom:1px solid #e8e8e8; -} - -.smallrow_odd:hover { - background: #cbe4eb repeat-x top left; -} - -.dbsmallrow_odd { - width:100%; - float:left; - margin:0; - padding:0; - background: #FFF repeat-x top left; - border-bottom:1px solid #e8e8e8; -} - -.smallrow_even { - width:100%; - float:left; - margin:0; - padding:0; - background: #f4f2f2 repeat-x top left; - border-bottom:1px solid #e8e8e8; -} - -.smallrow_even:hover { - background: #cbe4eb repeat-x top left; -} - -.dbsmallrow_even { - width:100%; - float:left; - margin:0; - padding:0; - background: #f4f2f2 repeat-x top left; - border-bottom:1px solid #e8e8e8; -} - -.smallgrid_cell1 { - width:80%; - height:33px; - float:left; - margin:0; - padding:0; - overflow:hidden; -} - -.smallgrid_cell2 { - width:20%; - height:33px; - float:left; - margin:0; - padding:0; - overflow:hidden; -} - -.bytes_icon { - width:19px; - height:15px; - float:left; - margin:10px 5px 0 0; - padding:0; -} - -h1 { - width:auto; - height:auto; - float:left; - font-size:25px; - color:#77c4df; - text-align:left; - font-weight:normal; - font-family:Arial, Helvetica, sans-serif; - margin:0 0 0 0; - padding:0; -} - -a.add_sgroupbutton { - width:146px; - height:36px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -161px -227px; - padding:0; -} - -a:hover.add_sgroupbutton { - background:url(../images/sprite1.gif) no-repeat -161px -266px; -} - -a.add_newisobutton { - width:101px; - height:36px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -370px -421px; - padding:0; -} - -a:hover.add_newisobutton { - background:url(../images/sprite1.gif) no-repeat -472px -421px; -} - -a.add_loadbalancerbutton { - width:182px; - height:37px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -308px -266px; - padding:0; -} - -a:hover.add_loadbalancerbutton { - background:url(../images/sprite1.gif) no-repeat -161px -304px; -} - -a.add_newvmbutton { - width:123px; - height:37px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -194px -2px; - padding:0; -} - -a:hover.add_newvmbutton { - background:url(../images/sprite1.gif) no-repeat -318px -2px; -} - -a.add_hostbutton { - width:87px; - height:36px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -493px -267px; - padding:0; -} - -a:hover.add_hostbutton { - background:url(../images/sprite1.gif) no-repeat -583px -267px; -} - -a.add_publicipbutton { - width:106px; - height:28px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/add_ipbutton.gif) no-repeat top left; - padding:0; -} - -a:hover.a.add_publicipbutton { - background:url(../images/add_ipbutton_hover.gif) no-repeat top left; -} - -a.add_storagepoolbutton { - width:146px; - height:36px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -308px -345px; - padding:0; -} - -a:hover.add_storagepoolbutton { - background:url(../images/sprite1.gif) no-repeat -455px -345px; -} - -a.add_secondary_storagebutton { - width:162px; - height:36px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -5px -421px; - padding:0; -} - -a:hover.add_secondary_storagebutton { - background:url(../images/sprite1.gif) no-repeat -522px -383px; -} - -a.add_volumebutton { - width:101px; - height:37px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -166px -421px; - padding:0; -} - -a:hover.add_volumebutton { - background:url(../images/sprite1.gif) no-repeat -267px -421px; -} - -a.add_newaccbutton { - width:103px; - height:36px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -531px -191px; - padding:0; -} - -a:hover.add_newaccbutton { - background:url(../images/sprite1.gif) no-repeat -531px -231px; -} - -a.add_serviceoffbutton { - width:146px; - height:36px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -5px -345px; - padding:0; -} - -a:hover.add_serviceoffbutton { - background:url(../images/sprite1.gif) no-repeat -161px -345px; -} - -a.add_diskoffbutton { - width:130px; - height:36px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -251px -383px; - padding:0; -} - -a:hover.add_diskoffbutton { - background:url(../images/sprite1.gif) no-repeat -383px -383px; -} - - -a.add_publicipbutton { - width:123px; - height:37px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -348px -304px; - padding:0; -} - -a:hover.add_publicipbutton { - background:url(../images/sprite1.gif) no-repeat -475px -304px; -} - -.grid_container { - width:100%; - height:auto; - float:left; - margin-top:7px; - padding:0; - border:1px solid #c0bfbf; - position:relative; -} - -#grid_content { - height:auto; - float:left; - width:100%; - background:#FFF; -} - -.dbadmin_grid_container { - width:100%; - height:auto; - float:left; - margin-bottom:25px; - padding:0; - border:1px solid #c0bfbf; -} - - - -.grid_header { - width:100%; - height:24px; - float:left; - margin:0; - padding:0; - background: url(../images/grid_headerbg.gif) repeat-x top left; -} - -.gridheader_morebutton { - width:58px; - height:24px; - float:right; - background:url(../images/grid_morebutton.gif) no-repeat top left; - margin-right:10px; - padding:0; - text-decoration:none; - cursor:pointer; - cursor:hand; -} - -.gridheader_morebutton:hover { - background:url(../images/grid_morebutton_hover.gif) no-repeat top left; -} - -.db_vmcontainer { - width:31%; - height:119px; - float:left; - margin:10px 0 10px 10px; - display:inline; - padding:0; -} - - - -.db_vmcontainerleft { - width:15px; - height:119px; - float:left; - background:url(../images/sprite1.gif) no-repeat -452px -132px; - margin:0; - overflow:hidden; - padding:0; -} - - - -.db_vmcontainermid { - width:auto; - height:119px; - background:url(../images/db_vmmid.gif) repeat-x top left; - margin:0 0 0 15px; - padding:0; -} - - -/* hide from mac \*/ -* html .db_vmcontainerleft {margin-right: -3px;} -* html .db_vmcontainermid {margin-left: 0;} -/* end hide */ - - -.db_vmyellowcontainerleft { - width:15px; - height:119px; - float:left; - background:url(../images/sprite1.gif) no-repeat -121px -221px; - margin:0; - overflow:hidden; - padding:0; -} - -.db_vmyellowcontainermid { - width:auto; - height:119px; - background:url(../images/db_vmyellowmid.gif) repeat-x top left; - margin:0 0 0 15px; - padding:0; -} - -/* hide from mac \*/ -* html .db_vmyellowcontainerleft {margin-right: -3px;} -* html .db_vmyellowcontainermid {margin-left: 0;} -/* end hide */ - -.db_vmcontainermidleft { - width:110px; - height:119px; - float:left; - margin:0; - padding:0; -} - -.grid_statusicons { - width:68px; - height:20px; - float:left; - margin:10px 0 0 20px; - display:inline; - padding:0; -} - -.db_vmicons { - width:93px; - height:41px; - float:left; - margin:22px 0 0 7px; - display:inline; - padding:0; -} - -.db_vmcontainermidright { - width:auto; - height:119px; - float:left; - margin:0; - padding:0; -} - - -.db_vmcontainermidright p{ - width:auto; - height:auto; - float:left; - margin:30px 0 0 10px; - display:inline; - padding:0; - font-size:11px; - font-weight:normal; - text-align:left; -} - -.db_vmcontainermidright span{ - width:auto; - height:auto; - margin:0; - padding:0; - font-size:11px; - font-weight:bold; - color:#6f900a; - text-align:left; -} - -.grid_runningtitles { - color: #3b5107; - text-align:left; - font-size:11px; - font-weight:bold; - margin:13px 0 0 8px; - float:left; - display:inline; -} - -.grid_stoppedtitles { - color: #a00000; - text-align:left; - font-size:11px; - font-weight:bold; - margin:13px 0 0 8px; - float:left; - display:inline; -} - -.db_vmcontainerright { - width:15px; - height:119px; - float:left; - background:url(../images/sprite1.gif) no-repeat -475px -132px; - margin:10px 0 0 -15px; - padding:0; -} - -.db_vmyellowcontainerright { - width:15px; - height:119px; - float:left; - background:url(../images/sprite1.gif) no-repeat -142px -221px; - margin:10px 0 0 -15px; - padding:0; -} - -.db_blank { - width:1%; - height:119px; - float:left; - margin:0; - padding:0; -} - -.row_odd { - position:relative; - width:100%; - height:58px; - float:left; - margin:0; - padding:0; - background: #FFF repeat-x top left; - border-bottom:1px solid #e8e8e8; -} - -.row_running { - position:relative; - width:100%; - height:57px; - float:left; - margin:0; - padding:0; - background: # F00 url(../images/running_bar.gif) no-repeat top left; -} - -.row_even { - position:relative; - width:100%; - height:58px; - float:left; - margin:0; - padding:0; - background: #f4f2f2 repeat-x top left; - border-bottom:1px solid #e8e8e8; - -} - - - -.vmrow_loading { - width:100%; - height:68px; - margin:0; - padding:0; - position:absolute; - top:0; - left:0; - background: url(../images/alpha_vmrowbg.png) repeat-x top left; - z-index:999; - text-align:center; -} - -.row_loading { - width:100%; - height:38px; - margin:0; - padding:0; - position:absolute; - top:0; - left:0; - background: url(../images/alpha_rowbg.png) repeat-x top left; - z-index:999; - text-align:center; -} - -.loading_animationcontainer { - width:auto; - height:24px; - margin:0 auto; - padding:0; - z-index:1000; - float:left; - position:absolute; - top:20px; - left:38%; -} - -.loading_animationtext { - width:100px; - height:19px; - float:left; - background:url(../images/loadind_textbg.gif) #000 repeat-x top left; - margin:0; - display:block; - padding:5px 5px 0; - color:#FFF; - font-size:11px; - font-weight:normal; -} - -.loading_animation { - width:192px; - height:24px; - float:left; - background:url(../images/loading.gif) no-repeat top left; - margin:0; - padding:0; -} - -.loadingmessage_container { - width:30%; - height:56px; - margin:0 auto; - padding:0; - z-index:1000; - float:left; - position:absolute; - background:url(../images/loading_messagebg.gif) #d3d3d3 repeat-x top left; - border:1px solid #CCC; - top:0; - left:38%; - display:inline; -} - - -.loadingmessage_top { - width:99%; - height:29px; - float:left; - margin:0; - padding:2px 5px 0 5px; - overflow:hidden; -} - -.loadingmessage_top p { - width:auto; - height:25px; - margin:0; - padding:0; - color:#333; - text-align:left; - font-weight:normal; - font-size:11px; - display:inline; -} - -.loadingmessage_bottom { - width:100%; - height:20px; - float:left; - margin:0; - padding:0; -} - -a.continue_button { - width:60px; - height:17px; - float:right; - margin-right:5px; - padding:0; - background:url(../images/vm_continuebutton.png) no-repeat top left; - text-decoration:none; - border -} - -a:hover.continue_button { - background:url(../images/vm_continuebutton_hover.png) no-repeat top left; -} - -.grid_header_cell0 { - width:6%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} -.grid_header_cell1 { - width:11%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.grid_header_cell2 { - width:9%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; - -} - -.grid_header_cell3 { - width:24%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; - -} - -.grid_header_cell4 { - width:5%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} - -.grid_headertitles { - color:#FFF; - text-align:left; - font-size:12px; - font-weight:normal; - margin:5px 0 0 8px; - float:left; - display:inline; -} - -.gridsorting_arrow { - width:10px; - height:5px; - float:right; - margin:9px 7px 0 0 ; - - padding:0; -} - -.gridsorting_arrow.up { - background:url(../images/gridsorting_uparrow.gif) no-repeat top right; -} - -.gridsorting_arrow.down { - background:url(../images/gridsorting_downarrow.gif) no-repeat top right; -} - -.red_statusbar { - width:1%; - height:58px; - float:left; - margin:0; - padding:0; - background:url(../images/red_statusbar.gif) repeat top left; -} - -.grey_statusbar { - width:1%; - height:58px; - float:left; - margin:0; - padding:0; - background:url(../images/grey_statusbar.gif) repeat top left; -} - -.green_statusbar { - width:1%; - height:58px; - float:left; - margin:0; - padding:0; - background:url(../images/green_statusbar.gif) repeat top left; -} - -.yellow_statusbar { - width:1%; - height:58px; - float:left; - margin:0; - padding:0; - background:url(../images/yellow_statusbar.gif) repeat top left; -} - - - -.grid_row_cell1 { - width:11%; - height:38px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.grid_row_cell2 { - width:9%; - height:38px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; - -} - -.grid_row_cell3 { - width:24%; - height:38px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; - -} - -.grid_row_cell4 { - width:5%; - height:38px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - - - -.grid_celltitles { - color: #333; - text-align:left; - font-size:11px; - font-weight:normal; - margin:13px 0 6px 8px; - float:left; - display:inline; - overflow:hidden; -} - -.grid_celltitles a:link { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - display:inline; - text-decoration:none; - margin-left:5px; - padding:0; -} - -.grid_celltitles a:visited { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - display:inline; - text-decoration:none; - margin-left:5px; - padding:0; -} - -.grid_celltitles a:hover { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - display:inline; - text-decoration:underline; - margin-left:5px; - padding:0; -} - -.grid_runningtitles { - color: #3b5107; - text-align:left; - font-size:11px; - font-weight:bold; - margin:13px 0 0 8px; - float:left; - display:inline; -} - -.grid_stoppedtitles { - color: #a00000; - text-align:left; - font-size:11px; - font-weight:bold; - margin:13px 0 0 8px; - float:left; - display:inline; -} - -.grid_haicons { - width:38px; - height:15px; - float:left; - margin:10px 0 0 5px; - display:inline; - padding:0; -} - -a.windows_consoleicons { - width:34px; - height:27px; - float:left; - margin:10px 0 0 8px; - display:inline; - padding:0; - text-decoration:none; - background:url(../images/windowsconsole_icon.gif) no-repeat top left; -} - -a:hover.windows_consoleicons { - width:34px; - height:27px; - float:left; - margin:13px 0 0 8px; - display:inline; - padding:0; - text-decoration:none; - background:url(../images/windowsconsole_iconhover.gif) no-repeat top left; -} - - -.grid_groupdivider { - width:100%; - height:21px; - background:#fefcdf repeat-x top left; - border-bottom:1px solid #e8e8e8; - float:left; - margin:0; - padding:0; -} - -.grouptitle_container { - width:auto; - height:17px; - background:#505050 repeat top left; - float:left; - color:#cbf0fd; - font-weight:bold; - font-size:11px; - padding:4px 13px 0 13px; -} - -.group_endbox { - width:24px; - height:21px; - float:left; - background:url(../images/sprite1.gif) no-repeat -153px -94px; - margin:0; - padding:0; -} - -.grid_links { - width:auto; - height:16px; - float:left; - margin:0; - padding:0; -} - -.grid_links a:link { - color:#2c8bbc; - text-decoration:none; - text-align:left; - font-weight:normal; - font-size:11px; - margin:0 8px; - display:inline; - -} - -.grid_links a:visited { - color:#2c8bbc; - text-decoration:none; - text-align:left; - font-weight:normal; - font-size:11px; - margin:0 8px; - display:inline; -} - -.grid_links a:hover { - color:#333; - text-decoration:underline; - text-align:left; - font-weight:normal; - font-size:11px; - margin:0 8px; - display:inline; -} - -.gridmore_links { - width:183px; - height:16px; - float:left; - margin:0; - padding:0; - -} - -.gridmore_links a:link { - color:#2c8bbc; - text-decoration:none; - text-align:left; - font-weight:normal; - font-size:11px; - margin:0 8px; - display:inline; -} - -.gridmore_links a:visited { - color:#2c8bbc; - text-decoration:none; - text-align:left; - font-weight:normal; - font-size:11px; - margin:0 8px; - display:inline; -} - -.gridmore_links a:hover { - color:#333; - text-decoration:underline; - text-align:left; - font-weight:normal; - font-size:11px; - margin:0 8px; - display:inline; -} - - -.dropdown_more { - width:183px; - height:auto; - float:left; - margin:0; - padding:0; - position:absolute; - left:295px; - z-index:1003; - display: none; -} - -.dropdown_moretop { - width:183px; - height:40px; - float:left; - background:url(../images/overlay_moretop.png) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.dropdown_moremid { - width:183px; - height:auto; - float:left; - background:url(../images/overlay_moremid.png) repeat-y top left; - margin:0; - padding:0; -} - -.dropdown_morelist{ - width:170px; - height:auto; - float:left; - margin:0; - padding:0; - list-style:none; -} - -.dropdown_morelist li{ - padding:4px 0 7px 9px; - background:url(../images/box_bullet.gif) no-repeat top left; - background-position: 2px 5px; - text-align: left; - margin-left: 10px; - font-size: 12px; - border-bottom:1px dashed #e1e1e1; -} - -.dropdown_morelist a:link { - color:#2c8bbc; - text-decoration:none; - text-align:left; - font-weight:normal; - font-size:11px; - margin:0 8px; - display:inline; -} - -.dropdown_morelist a:visited { - color:#2c8bbc; - text-decoration:none; - text-align:left; - font-weight:normal; - font-size:11px; - margin:0 8px; - display:inline; -} - -.dropdown_morelist a:hover { - color:#333; - text-decoration:underline; - text-align:left; - font-weight:normal; - font-size:11px; - margin:0 8px; - display:inline; -} - -.dropdown_morebot { - width:183px; - height:32px; - float:left; - background:url(../images/overlay_morebot.png) no-repeat top left; - margin:0; - padding:0; -} - - -.overlay_smallpopup { - width:408px; - height:200px; - float:left; - margin:0; - padding:0; - position:absolute; - z-index:1005; - background:url(../images/console_bg.png) no-repeat top left; - right:130px; - display:none; -} - - - -.overlay_spopup_top { - width:408px; - height:37px; - float:left; - background: url(../images/small_pptop.png) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - - -.overlay_spopup_mid { - width:408px; - height:auto; - float:left; - background: url(../images/small_ppmid.png) repeat-y top left; - margin:0; - padding:0; -} - - -.overlay_spopup_midleft { - width:180px; - height:auto; - float:left; - margin:0; - padding:0; -} - -.console_box0 { - width:144px; - height:110px; - float:left; - margin-top: 30px; - margin-left:31px; - padding:0; - display:inline; -} - -.console_box1 { - width:144px; - height:110px; - float:left; - margin-top: 30px; - margin-left:31px; - padding:0; - display:inline; -} - -.overlay_spopup_midright { - width:228px; - height:auto; - float:left; - margin:0; - padding:0; -} - - -.overlay_spopup_midright p { - width:200px; - height:auto; - float:left; - margin-left:10px; - display:inline; - font-size:11px; - font-weight:normal; - text-align:left; - padding:0; -} - -.overlay_spopup_midright span { - width:200px; - height:auto; - float:left; - margin-left:10px; - margin-bottom:8px; - display:inline; - font-size:11px; - font-weight:bold; - color:#77c4df; - text-align:left; - padding:0; -} - - - -.overlay_spopup_bot { - width:408px; - height:42px; - float:left; - background: url(../images/small_ppbot.png) no-repeat top left; - margin::0; - padding::0; - overflow:hidden; -} - -.alert_box { - width:97%; - height:55px; - float:left; - margin:8px 0 0 10px; - display:inline; -} - -.alert_box_left { - width:3%; - height:55px; - float:left; - margin:0; - padding:0; -} - -.alert_icon { - width:15px; - height:12px; - background:url(../images/alert_icon.png) no-repeat top left; - float:left; - margin:0; - padding:0; -} - -.alert_box_mid { - width:75%; - height:55px; - float:left; - margin:0; - padding:0; -} - -.alert_box_mid p{ - width:auto; - height:auto; - float:left; - text-align:left; - font-size:11px; - margin-left:10px; - padding:0; -} - -.alert_box_mid span{ - width:100%; - height:auto; - float:left; - text-align:left; - font-size:11px; - color:#ad0000; - font-weight:bold; - margin:0; - padding:0; -} - - -.alert_box_right { - width:22%; - height:55px; - float:left; - margin:0; - padding:0; -} - -.alert_box_right p{ - width:auto; - height:auto; - float:right; - text-align:left; - font-size:11px; - margin:0; - padding:0; -} - - -.account_box { - width:96%; - height:173px; - float:left; - margin:15px 15px 0 15px; - background:url(../images/account_bg.gif) repeat-x top left; - border:1px solid #a7a7a7; - display:inline; - padding:0; -} - -.account_boxshadow { - width:125px; - height:13px; - float:right; - margin-right:20px; - margin-bottom:9px; - display:inline; - background:url(../images/account_shadow.gif) no-repeat top left; - padding:0; -} - -.account_info { - width:90%; - height:155px; - float:left; - margin:10px 0 0 5px; - text-align:left; - font-weight:bold; - display:inline; - padding:0; -} - -.account_info p { - text-align:left; - font-weight:bold; - margin-bottom:2px; - padding:0; -} - -.account_info span { - text-align:left; - font-weight:normal; - color:#333; - padding:0; -} - -.pin_icon { - width:12px; - height:23px; - float:left; - margin:0; - padding:0; - background:url(../images/pin_icon.gif) no-repeat top left; -} - -.eventgridheader_cell1 { - width:20%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.eventgridheader_cell2 { - width:39%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} - -.eventrow_cell1 { - width:20%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.eventrow_cell2 { - width:39%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.admin_eventgridheader_cell1 { - width:13%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.admin_eventgridheader_cell2 { - width:34%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} - -.admin_eventrow_cell1 { - width:13%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.admin_eventrow_cell2 { - width:34%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.admin_alertgridheader_cell1 { - width:25%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.admin_alertgridheader_cell2 { - width:49%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} - -.admin_alertrow_cell1 { - width:25%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.admin_alertrow_cell2 { - width:49%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.admin_accountgridheader_cell1 { - width:20%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} - -.admin_accountgridheader_cell2 { - width:10%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} -.admin_accountgridheader_cell3 { - width:8%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} - - -.admin_accountgridrow_cell1 { - width:20%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.admin_accountgridrow_cell2 { - width:10%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} -.admin_accountgridrow_cell3 { - width:8%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - - -.temp_gridheader_cell1 { - width:5%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.temp_gridheader_cell2 { - width:15%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.temp_gridheader_cell3 { - width:20%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - overflow:hidden; - padding:0; - overflow:hidden; -} - -.temp_gridheader_cell4 { - width:4%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - - - -.tempgrid_row_cell1 { - width:5%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - white-space:nowrap; - overflow:hidden; -} - -.tempgrid_row_cell2 { - width:15%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.tempgrid_row_cell3 { - width:20%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.tempgrid_row_cell4 { - width:4%; - height:25px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - white-space:nowrap; - overflow:hidden; -} - - -.tempbiticons { - width:auto; - height:17px; - float:left; - margin:-2px 1px 0 0; - padding:0; -} - -.temptypeicons { - width:16px; - height:16px; - float:left; - margin:-2px 0 0 0; - padding:0; -} - -a.temp_editbutton{ - width:20px; - height:15px; - float:left; - background:url(../images/temp_editicon.gif) no-repeat top left; - text-decoration:none; - margin:0 0 0 0; - padding:0; -} - -a:hover.temp_editbutton{ - background:url(../images/temp_editicon_hover.gif) no-repeat top left; -} - -a.temp_deletebutton{ - width:11px; - height:14px; - float:left; - background:url(../images/temp_deleteicon.gif) no-repeat top left; - text-decoration:none; - margin:0 0 0 0; - padding:0; -} - -a:hover.temp_deletebutton{ - background:url(../images/temp_deleteicon_hover.gif) no-repeat top left; -} - - -.gridadmin_hostheader_cell0 { - width:16%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - - -.gridadmin_hostheader_cell1 { - width:10%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.gridadmin_hostheader_cell2 { - width:12%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.gridadmin_hostheader_cell3 { - width:23%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.gridadmin_hostheader_cell_s { - width:5%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.gridadmin_hostrow_cell1 { - width:10%; - height:38px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.gridadmin_hostrow_cell2 { - width:12%; - height:38px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.gridadmin_hostrow_cell3 { - width:23%; - height:38px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.gridadmin_hostrow_cell4 { - width:15%; - height:38px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.gridadmin_hostrow_cell_s { - width:5%; - height:38px; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.gridadmin_storageheader_cell3 { - width:21%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} -.gridadmin_storageheader_cell4 { - width:22%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.gridadmin_storagerow_cell3 { - width:21%; - height:38px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.gridadmin_storagerow_cell4 { - width:22%; - height:38px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.gridadmin_globalheader_cell1 { - width:50%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.gridadmin_globalheader_cell2 { - width:30%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.gridadmin_globalheader_cell3 { - width:15%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.gridadmin_globalheader_cell4 { - width:4%; - height:24px; - float:left; - margin:0; - padding:0; - overflow:hidden; -} - -.gridadmin_globalrow_cell1 { - width:50%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.gridadmin_globalrow_cell2 { - width:30%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.gridadmin_globalrow_cell3 { - width:15%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.gridadmin_globalrow_cell4 { - width:4%; - height:24px; - float:left; - margin:0; - padding:0; - overflow:hidden; -} - -.gridadmin_offeringsheader_cell1 { - width:5%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.gridadmin_offeringsheader_cell2 { - width:10%; - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} - -.gridadmin_offeringsheader_cell3 { - width:15%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} -.gridadmin_offeringsheader_cell4 { - width:44%; - height:24px; - float:left; - margin:0; - border-right:1px solid #c2c2c2; - padding:0; - overflow:hidden; -} - -.gridadmin_offeringsrow_cell1 { - width:5%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} -.gridadmin_offeringsrow_cell2 { - width:10%; - height:24px; - float:left; - border-right:1px solid #f9f9f9; - margin:0; - padding:0; - overflow:hidden; -} -.gridadmin_offeringsrow_cell3 { - width:15%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.gridadmin_offeringsrow_cell4 { - width:44%; - height:24px; - float:left; - margin:0; - border-right:1px solid #f9f9f9; - padding:0; - overflow:hidden; -} - -.details_arrow { - width:9px; - height:6px; - float:left; - margin:2px 5px 0 5px; - display:inline; - padding:0; -} - -.hostadmin_showdetails_panel { - width:98%; - height:auto; - border-left:1px solid #cacaca; - border-right:1px solid #cacaca; - border-bottom:1px solid #cacaca; - float:left; - margin:0 10px 0 10px; - padding:0; -} - -.hostadmin_showdetails_grid { - width:100%; - height:auto; - max-height:200px; - background:#FFF repeat top left; - float:left; - margin:0; - padding:0; - overflow-x:hidden; - overflow-y:auto; -} - -.hostadmin_showdetails_columneven { - width:25%; - height:100px; - background:#dbdfe1 repeat top left; - float:left; - margin:0; - padding:0; -} - -.hostadmin_showdetails_columnodd { - width:25%; - height:100px; - background:#FFF repeat top left; - float:left; - margin:0; - padding:0; -} - -.host_statisticspanel { - width:100%; - height:auto; - background:#fffadf repeat top left; - float:left; - margin:0; - padding:0; -} - -.host_statisticslist { - width:95%; - height:auto; - float:left; - margin:10px 0 5px 10px; - display:inline; - padding:0; -} - -.host_statisticspanel p { - width:auto; - height:auto; - margin-left:5px; - float:left; - color:#333; - text-align:left; - font-weight:normal; -} - -.host_statisticspanel_green { - width:auto; - height:auto; - color:#3b5107; - text-align:left; - font-weight:normal; - margin:0; - padding:0; -} - -.host_statisticspanel_red { - width:auto; - height:auto; - color:#ea0000; - text-align:left; - font-weight:normal; - margin:0; - padding:0; -} - -.hostcpu_icon { - width:24px; - height:11px; - float:left; - background:url(../images/cpu_icon.gif) no-repeat top left; - margin:0; - display:inline; - padding:0; -} - -.hostnetwork_icon { - width:24px; - height:14px; - float:left; - background:url(../images/hostnetwork_icon.gif) no-repeat top left; - margin:0; - display:inline; - padding:0; -} - -.hostdisk_icon { - width:10px; - height:16px; - float:left; - background:url(../images/disk_icon.gif) no-repeat top left; - margin:0; - display:inline; - padding:0; -} - - -.hostmemory_icon { - width:24px; - height:14px; - float:left; - background:url(../images/memory_icon.gif) no-repeat top left; - margin:0; - display:inline; - padding:0; -} - -.hostadmin_showdetailsheader { - width:100%; - height:23px; - background:url(../images/hostdetails_headerbg.jpg) repeat-x top left; - float:left; - margin:0; - padding:0; -} - -.hostadmin_showdetailsheader_cell { - height:23px; - float:left; - margin:0; - border-right:1px solid #d6dbdd; - padding:0; - overflow:hidden; -} - -.hostadmin_showdetails_row_odd { - width:100%; - height:23px; - float:left; - margin:0; - padding:0; - background: #FFF repeat-x top left; - border-bottom:1px solid #e8e8e8; -} - -.hostadmin_showdetails_row_even{ - width:100%; - height:23px; - float:left; - margin:0; - padding:0; - background: #dbdfe1 repeat-x top left; - border-bottom:1px solid #f0f0f0; -} - -.hostadmin_showdetailsrow_cell { - height:22px; - float:left; - margin:0; - border-right:1px solid #e6eaec; - padding:0; - overflow:hidden; -} - -.grid_vmrouterheader_cell { - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} - -.grid_genrow_cell { - height:auto; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - -.grid_smallgenrow_cell { - height:auto; - float:left; - margin:0; - padding:0; - border-right:1px solid #f9f9f9; - overflow:hidden; -} - - -.grid_genheader_cell { - height:24px; - float:left; - margin:0; - padding:0; - border-right:1px solid #c2c2c2; - overflow:hidden; -} - -a.add_newtemplatebutton { - width:120px; - height:36px; - float:left; - margin-left:10px; - display:inline; - background:url(../images/sprite1.gif) no-repeat -5px -383px; - padding:0; -} - -a:hover.add_newtemplatebutton { - background:url(../images/sprite1.gif) no-repeat -128px -383px; -} - -.loading_gridtable { - width:auto; - height:50px; - background:#FFF repeat top left; - position:absolute; - border:1px solid #CCC; - top:300px; - left:40%; - margin-bottom:10px; - opacity:none; -} - -.loading_gridtable p { - width:auto; - height:auto; - float:left; - text-align:left; - color:#666; - font-weight:normal; - font-size:25px; - margin:10px 15px 0 30px; - display:inline; -} - -.loading_gridanimation { - width:30px; - height:30px; - background:url(../images/bigrotation2.gif) no-repeat top left; - float:left; - margin:10px 0 0 10px; - padding:0; -} - -.vm_rows { - position:relative; - width:100%; - height:91px; - float:left; - margin:0; - padding:0; - background: #FFF repeat-x top left; - border-bottom:1px solid #e8e8e8; - display:block; -} - -.vm_rows_top { - width:100%; - height:68px; - float:left; - margin:0; - padding:0; -} - -.vm_genrows_cell { - height:68px; - float:left; - margin:0; - padding:0; - overflow:hidden; -} - - -.vm_rows_bot { - width:100%; - height:23px; - float:left; - background:url(../images/vm_actionbg.gif) repeat-x top left; - margin:0; - padding:0; -} - -.vm_bot_actions { - width:60%; - height:auto; - float:left; - margin:5px 0 0 10px; - padding:0; -} - -.vm_rowbot_loading { - width:60%; - height:auto; - float:left; - margin:5px 0 0 10px; - padding:0; -} - -.vm_rowbot_loading p { - width:auto; - height:auto; - float:left; - margin:2px 0 0 0; - color:#333; - text-align:left; - font-weight:bold; - font-size:11px; - padding:0; -} - - -.vm_rowbot_loadinganimation { - width:16px; - height:16px; - float:left; - background:url(../images/vmbot_loader.gif) no-repeat top left; - margin:0 10px 0 0; - padding:0; -} - -.vm_botactionslinks { - width:auto; - height:auto; - float:left; - margin:0 10px 0 0; - padding:0 15px 0 0; - color:#2c8bbc; - text-decoration:none; - text-align:left; - font-size:11px; - cursor:pointer; - cursor:hand; -} - -.vm_botactionslinks:hover{ - width:auto; - height:auto; - float:left; - margin:0 10px 0 0; - padding:0 15px 0 0; - color:#333; - text-decoration:underline; - text-align:left; - font-size:11px; - cursor:pointer; - cursor:hand; -} - -.vm_botactionslinks_down { - width:auto; - height:auto; - float:left; - margin:0 10px 0 0; - padding:0 15px 0 0; - color:#2c8bbc; - text-decoration:none; - text-align:left; - font-size:11px; - background:url(../images/details_downarrow.jpg) no-repeat center right; - cursor:pointer; - cursor:hand; -} - - -.vm_botactionslinks_down:hover{ - width:auto; - height:auto; - float:left; - margin:0 10px 0 0; - padding:0 15px 0 0; - color:#333; - text-decoration:underline; - text-align:left; - font-size:11px; - background:url(../images/details_downarrow.jpg) no-repeat center right; - cursor:pointer; - cursor:hand; -} - -.vm_botactionslinks_up { - width:auto; - height:auto; - float:left; - margin:0 10px 0 0; - padding:0 15px 0 0; - color:#2c8bbc; - text-decoration:none; - text-align:left; - font-size:11px; - background:url(../images/details_uparrow.jpg) no-repeat center right; - cursor:pointer; - cursor:hand; -} - - -.vm_botactionslinks_up:hover{ - width:auto; - height:auto; - float:left; - margin:0 10px 0 0; - padding:0 15px 0 0; - color:#333; - text-decoration:underline; - text-align:left; - font-size:11px; - background:url(../images/details_uparrow.jpg) no-repeat center right; - cursor:pointer; - cursor:hand; -} - - -.vm_bot_rightinfo { - width:auto; - height:auto; - float:right; - margin:2px 0 0 0; - padding:0; -} - -.vm_bot_groups { - width:auto; - height:17px; - float:left; - margin:0; - text-align:left; - background:url(../images/group_icon.gif) no-repeat top left; - padding:0; -} - - - -.vm_bot_groups p { - color:#ec6400; - font-size:11px; - font-weight:normal; - text-align:left; - margin:3px 10px 0 20px; - display:inline; - width:auto; - padding:auto; - float:left; -} - -.vm_bot_iso { - width:auto; - height:17px; - float:left; - margin:0 20px 0 0; - text-align:right; - padding:0; -} - -.vmiso_on { - width:20px; - height:18px; - float:left; - margin:0 0 0 0; - padding:0; - background:url(../images/ISO_ON.gif) no-repeat top left; -} - -.vmiso_off { - width:20px; - height:18px; - float:left; - margin:0 0 0 0; - padding:0; - background:url(../images/ISO_OFF.gif) no-repeat top left; -} - - -.vm_bot_iso p { - color:#333; - font-size:11px; - font-weight:normal; - text-align:left; - margin:3px 0 0 5px; - display:inline; - width:auto; - padding:auto; - float:left; -} - -.admin_vmcontainer { - width:100%; - height:57px; - float:left; - margin-top:5px; - overflow:hidden; - padding:0; -} - -.admin_vmcontainerleft { - width:7px; - height:57px; - float:left; - margin:0; - overflow:hidden; - padding:0; -} - - - -.admin_vmcontainermid { - width:auto; - height:57px; - margin:0 0 0 7px; - padding:0; -} - - -/* hide from mac \*/ -* html .admin_vmcontainerleft {margin-right: -3px;} -* html .admin_vmcontainermid {margin-left: 0;} -/* end hide */ - -.admin_vmcontainermid_list { - width:95%; - height:51px; - float:left; - list-style:none; - margin:0; - padding:0; -} - -.admin_vmcontainermid_list li { - width:94%; - height:12px; - float:left; - text-align:left; - font-size:11px; - font-weight:normal; - margin:5px 0 0 5px; - display:inline; - overflow:hidden; -} - -.admin_vmcontainerright { - width:7px; - height:57px; - float:left; - margin:5px 0 0 -7px; - padding:0; -} - -.admin_vmstatus { - width:100%; - height:25px; - float:left; - margin:0; - padding:0; -} - -.admin_vmgreen_arrow { - width:7px; - height:14px; - float:left; - margin-top:3px; - padding:0; - background:url(../images/vm_greenarrow.gif) no-repeat top left; -} - -.admin_vmgrey_arrow { - width:7px; - height:14px; - float:left; - margin-top:3px; - padding:0; - background:url(../images/vm_greyarrow.gif) no-repeat top left; -} - -.admin_vmred_arrow { - width:7px; - height:14px; - float:left; - margin-top:3px; - padding:0; - background:url(../images/vm_redarrow.gif) no-repeat top left; -} - -.admin_vmconsole { - width:34px; - height:27px; - float:left; - margin:0 0 0 10px; - display:inline; - padding:0; - background:url(../images/admin_vmconsole.gif) no-repeat top left; - cursor:pointer; - cursor:hand; -} -.vmactions_dropdownbox { - width:auto; - height:auto; - margin:0; - padding:0; - position:absolute; - top:69px; - left:10px; - background: #FFF repeat top left; - border:1px solid #CCC; - z-index:1005; -} - -.vmactions_dropdownbox_closebutton { - width:10px; - height:10px; - float:right; - margin:0; - padding:0; - background:url(../images/vmdropdown_closebutt.gif) no-repeat top left; - cursor:pointer; - cursor:hand; -} - -.vmactions_dropdownbox_closebutton_hover { - background:url(../images/vmdropdown_closebutt_hover.gif) no-repeat top left; - -} - - - -.vmaction_listbox { - width:auto; - height:auto; - float:left; - margin:5px 5px 10px 10px; - padding:0; - z-index:1002; -} - -.vmaction_list { - width:150px; - height:auto; - float:left; - margin:5px 10px 0 5px; - display:inline; -} - -.vmaction_list li{ - width:95px; - height:auto; - float:left; - margin:0 0 5px 0; - color:#333; - font-size:11px; - text-align:left; - font-weight:bold; - display:inline; -} - -.vmaction_links_on { - color:#2c8bbc; - text-align:left; - font-size:11px; - text-decoration:none; - font-weight:normal; - float:left; - width:auto; - height:auto; - margin:0; - padding:0; - cursor:pointer; - cursor:hand; -} - -.vmaction_links_on:hover { - color:#333; - text-align:left; - font-size:11px; - text-decoration:underline; - font-weight:normal; - float:left; - width:auto; - height:auto; - margin:0; - padding:0; - cursor:pointer; - cursor:hand; -} - -.vmaction_links_off { - color:#CCC; - text-align:left; - font-size:11px; - text-decoration:none; - font-weight:normal; - float:left; - width:auto; - height:auto; - margin:0; - padding:0; -} - - -.zonetree_box { - width:567px; - height:618px; - float:left; - margin:0; - padding:0; -} - -.zonetree_boxleft { - width: 16px; - height:618px; - float:left; - background:url(../images/zonetree_left.gif) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.zonetree_boxmid { - width: 535px; - height:618px; - float:left; - background:url(../images/zonetree_mid.gif) repeat-x top left; - margin:0; - padding:0; -} - -.zonetree_contentbox { - width:530px; - height:590px; - float:left; - margin:15px 0 0 0; - overflow-x:hidden; - overflow-y:scroll; - overflow-y:auto; -} - -.zonetree_contentbox p { - width:auto; - height:auto; - float:left; - text-align:left; - margin:5px 0 0 10px; - padding:0; - font-size:12px; - font-weight:bold; -} - -.zonetree_addbox { - width:510px; - height:25px; - float:left; - margin:0 0 5px 0; - padding:0; -} - - - -.zonetree_addicon { - width:16px; - height:16px; - float:left; - background:url(../images/zone_addicon.png) no-repeat top left; - margin:5px 0 0 5px; - padding:0; -} - -.tree_minusicon { - width:18px; - height:16px; - float:left; - background:url(../images/tree_minusopen_icon.png) no-repeat top left; - margin:5px 5px 0 0; - padding:0; -} - - -.zonetree_firstlevel { - width:510px; - height:25px; - float:left; - margin:0 0 5px 0; - padding:0; -} - -.zonetree_firstlevel_selected { - width:510px; - height:25px; - float:left; - margin:0 0 5px 0; - background:#eaf3f5 repeat top left; - padding:0; -} - -.zonetree_secondlevel { - width:455px; - height:25px; - float:left; - margin:0 0 5px 55px; - display:inline; - padding:0; -} - -.zonetree_secondlevel_selected { - width:475px; - height:25px; - float:left; - margin:0 0 5px 55px; - background:#eaf3f5 repeat top left; - padding:0; -} - -.zonetree_thirdlevel { - width:400px; - height:25px; - float:left; - margin:0 0 5px 110px; - display:inline; - padding:0; -} - -.zonetree_thirdlevel_selected { - width:400px; - height:25px; - float:left; - margin:0 0 5px 110px; - background:#eaf3f5 repeat top left; - padding:0; -} - -.zonetree_closedarrows { - width:12px; - height:14px; - background:url(../images/zone_sidearrow.png) no-repeat top left; - float:left; - margin:5px 5px 0 8px; - display:inline; - padding:0; - cursor:pointer; - cursor:hand; -} - -.zonetree_openarrows { - width:12px; - height:14px; - background:url(../images/zone_openarrow.png) no-repeat top left; - float:left; - margin:10px 5px 0 8px; - display:inline; - padding:0; - cursor:pointer; - cursor:hand; -} - -.zonetree_zoneicon { - width:18px; - height:18px; - float:left; - background:url(../images/zone_zoneicon.png) no-repeat top left; - font-weight:bold; - margin:3px 0 0 5px; - padding:0; -} - -.zonetree_podicon { - width:22px; - height:18px; - float:left; - background:url(../images/zone_podicon.png) no-repeat top left; - font-weight:bold; - margin:3px 0 0 5px; - padding:0; -} - -.zonetree_ipicon { - width:22px; - height:16px; - float:left; - background:url(../images/zone_ipicon.png) no-repeat top left; - font-weight:bold; - margin:3px 0 0 5px; - padding:0; -} -.zonetree_directipicon { - width:22px; - height:16px; - float:left; - background:url(../images/zone_directipicon.png) no-repeat top left; - font-weight:bold; - margin:3px 0 0 5px; - padding:0; -} -.zonetree_links { - width:auto; - height:auto; - float:left; - color:#2c8bbc; - text-decoration:none; - font-size:12px; - text-align:left; - margin:5px 0 0 10px; - display:inline; - padding:0; - cursor:pointer; - cursor:hand; -} -.zonetree_links:hover { - width:auto; - height:auto; - float:left; - color:#333; - text-decoration:underline; - font-size:12px; - text-align:left; - margin:5px 0 0 10px; - padding:0; - cursor:pointer; - cursor:hand; -} - - - -.zonetree_boxright { - width: 16px; - height:618px; - float:left; - background:url(../images/zonetree_right.gif) no-repeat top left; - margin:0; - padding:0; -} - -.zone_detailsbox { - width:406px; - height:414px; - float:left; - margin:0; - padding:0; -} - -.zone_detailsbox_left { - width:30px; - height:414px; - float:left; - background:url(../images/zone_detailsboxleft.gif) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.zone_detailsbox_mid { - width:359px; - height:414px; - float:left; - background:url(../images/zone_detailsboxmid.gif) repeat-x top left; - margin:0; - padding:0; - overflow:hidden; -} - -.zone_detailsbox_contentpanel { - width:350px; - height:390px; - float:left; - margin:10px 0 0 0; - padding:0; -} - -.zone_detailsbox_contentpanel h2 { - width:300px; - height:auto; - float:left; - color:#77c4df; - font-size:16px; - font-weight:normal; - text-align:left; - margin:5px 0 0 10px; - display:inline; - padding:0; -} - -.zone_detailsbox_content { - width:330px; - height:330px; - float:left; - margin:10px 0 0 10px; - padding:0; - display:inline; -} - -.zone_detailsbox_content p { - width:320px; - height:auto; - float:left; - margin:0 0 10px 0; - padding:0; - display:inline; - font-size:12px; - text-align:left; - font-weight:normal; -} - -.zone_detailsbox_content span { - width:100px; - height:auto; - float:left; - margin:0 0 5px 0; - padding:0; - display:inline; - font-size:12px; - text-align:left; - font-weight:bold; -} - - -.zone_detailsbox_right { - width:17px; - height:414px; - float:left; - background:url(../images/zone_detailsboxright.gif) no-repeat top left; - margin:0; - padding:0; -} - -.zone_detailsbox_actionpanel { - width:421px; - height:26px; - float:left; - margin:5px 0 0 0; - padding:0; -} - -.zone_detailsbox_actions { - width:auto; - height:26px; - float:left; - margin:0 0 0 0; - padding:0; -} - -.zonedetails_editzonebutton { - width:71px; - height:26px; - float:left; - background:url(../images/zone_editzonebutton.gif) no-repeat top left; - margin:0 5px 0 0; - padding:0; - cursor:pointer; - cursor:hand; - text-decoration:none; -} - -.zonedetails_editzonebutton:hover { - background:url(../images/zone_editzonebutton_hover.gif) no-repeat top left; -} - - -.zonedetails_addpublicipbutton { - width:131px; - height:26px; - float:left; - background:url(../images/zone_addpubIP.gif) no-repeat top left; - margin:0 5px 0 0; - padding:0; - cursor:pointer; - cursor:hand; - text-decoration:none; -} - -.zonedetails_addpublicipbutton:hover { - background:url(../images/zone_addpubIP_hover.gif) no-repeat top left; -} - -.zonedetails_addpodbutton { - width:71px; - height:26px; - float:left; - background:url(../images/zone_addpodbutton.gif) no-repeat top left; - margin:0 5px 0 0; - padding:0; - cursor:pointer; - cursor:hand; - text-decoration:none; -} - -.zonedetails_addpodbutton:hover { - background:url(../images/zone_addpodbutton_hover.gif) no-repeat top left; -} - -.zonedetails_editpodbutton { - width:71px; - height:26px; - float:left; - background:url(../images/zone_editpodbutton.gif) no-repeat top left; - margin:0 5px 0 0; - pediting:0; - cursor:pointer; - cursor:hand; - text-decoration:none; -} - -.zonedetails_editpodbutton:hover { - background:url(../images/zone_editpodbutton_hover.gif) no-repeat top left; -} - -.zonedetails_addvlanipbutton { - width:134px; - height:26px; - float:left; - background:url(../images/zone_addipbutton.gif) no-repeat top left; - margin:0 5px 0 0; - padding:0; - cursor:pointer; - cursor:hand; - text-decoration:none; -} - -.zonedetails_addvlanipbutton:hover { - background:url(../images/zone_addipbutton_hover.gif) no-repeat top left; - -} - -.zonedetails_directipbutton { - width:128px; - height:26px; - float:left; - background:url(../images/zone_directipbutton.gif) no-repeat top left; - margin:0 5px 0 0; - padding:0; - cursor:pointer; - cursor:hand; - text-decoration:none; -} - -.zonedetails_directipbutton:hover { - background:url(../images/zone_directipbutton_hover.gif) no-repeat top left; - -} - -.zonedetails_adddeletebutton { - width:60px; - height:26px; - float:left; - background:url(../images/zone_deletebutton.gif) no-repeat top left; - margin:0 5px 0 0; - padding:0; - cursor:pointer; - cursor:hand; - text-decoration:none; -} - -.zonedetails_adddeletebutton:hover { - background:url(../images/zone_deletebutton_hover.gif) no-repeat top left; - -} - - - -.tree_box { - width:400px; - height:618px; - float:left; - margin:0; - padding:0; -} - - -.tree_boxleft { - width: 16px; - height:618px; - float:left; - background:url(../images/zonetree_left.gif) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.tree_boxmid { - width: 368px; - height:618px; - float:left; - background:url(../images/zonetree_mid.gif) repeat-x top left; - margin:0; - padding:0; -} - -.tree_boxright { - width: 16px; - height:618px; - float:left; - background:url(../images/tree_boxright.gif) no-repeat top left; - margin:0; - padding:0; -} - - -.tree_contentbox { - width:360px; - height:590px; - float:left; - margin:15px 0 0 0; - overflow-x:scroll; - overflow-x:auto; - overflow-y:scroll; - overflow-y:auto; -} - - -.tree_firstlevel { - width:360px; - height:25px; - float:left; - margin:0 0 0 0; - padding:0; -} - - -.tree_levelspanel { - width:360px; - height:auto; - float:left; - margin:0 0 0 0; - padding:0; -} - -.tree_levelsbox{ - width:auto; - height:auto; - float:left; - margin:0 0 0 0; - padding:0; - display:inline; -} - -.tree_levels{ - width:auto; - height:auto; - float:left; - margin:0 0 0 0; - padding:0; -} - - - -.tree_eventlevels { - width:auto; - height:auto; - float:left; - margin:3px 0 0 39px; - padding:0; -} - - -.tree_eventlinks { - width:250px; - float:left; - padding:0 0 5px 20px; - font-family:Verdana, Geneva, sans-serif; - color:#2c8bbc; - font-size:12px; - font-weight:normal; - background:url(../images/tree_eventicon.gif) no-repeat top left; - margin:3px 0 0 0; - cursor:pointer; - cursor:hand; - text-decoration:none; -} - -.tree_eventlinks:hover { - text-decoration:underline; -} - -.tree_eventicon { - width:12px; - height:16px; - background:url(../images/tree_eventicon.gif) no-repeat top left; - float:left; - margin:0 5px 10px 8px; - padding:0; -} - - -.tree_links { - width:auto; - height:auto; - float:left; - color:#2c8bbc; - text-decoration:none; - font-size:12px; - text-align:left; - margin:5px 0 0 2px; - display:inline; - padding:0; - cursor:pointer; - cursor:hand; -} -.tree_links:hover { - text-decoration:underline; -} - -.domain_detailsbox { - width:auto; - height:618px; - float:left; - margin:0; - padding:0; -} - -.domain_detailsbox_left { - width:30px; - height:618px; - float:left; - background:url(../images/domdetailsbox_left.gif) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.domain_detailsbox_mid { - width:368px; - height:618px; - float:left; - background:url(../images/domdetailsbox_mid.gif) repeat-x top left; - margin:0; - padding:0; -} - -.domain_detailsbox_right { - width:14px; - height:618px; - float:left; - background:url(../images/domdetailsbox_right.gif) no-repeat top left; - margin:0; - padding:0; -} - -.domain_detailsbox_content { - width:350px; - height:550px; - float:left; - margin:10px 0 0 10px; - padding:0; - display:inline; - overflow-x:hidden; - overflow-y:scroll; - overflow-y:auto; -} - -.domain_detailsgridcontainer { - width:320px; - height:auto; - float:left; - background:#FFF repeat top left; - margin:10px 0 0 0; - border:1px solid #CCC; -} - - -.domain_searchbox_opened { - width:auto; - height:598px; - float:left; - margin:9px 0 0 0; - padding:0; -} - -.domain_searchbox_left { - width:16px; - height:598px; - float:left; - margin:0; - padding:0; - background:url(../images/domain_serachboxleft.gif) no-repeat top left; - overflow:hidden; -} - -.domain_searchbox_mid { - width:200px; - height:598px; - float:left; - margin:0; - padding:0; - background:url(../images/domain_serachboxmid.gif) repeat-x top left; -} - -.domain_search_contentpanel { - width:186px; - height:570px; - float:left; - margin:10px 0 10px 2px; - padding:0; -} - - - -.domain_searchtitle { - width:auto; - height:22px; - float:left; - padding:0; - color: #999; - font-size:16px; - font-weight:normal; - margin:0 0 0 0; - padding:0; -} - -.domain_searchicon { - width:25px; - height:22px; - float:left; - margin:0 0 0 10px; - padding:0; - background:url(../images/search_resulticon.gif) no-repeat top left; - display:inline; -} -.domain_search_contentbox { - width:185px; - height:520px; - float:left; - margin:10px 0 0 0; - padding:0; - overflow-x:hidden; - overflow-y:scroll; - overflow-y:auto; -} - -.domain_search_contentlinksbox { - width:185px; - height:auto; - float:left; - margin:0 0 10px 5px; - padding:0; - display:inline; - -} -.arrow_bullet { - width:6px; - height:5px; - float:left; - background:url(../images/arrow_bullet.gif) no-repeat top left; - margin:3px 8px 0 0; - padding:0; -} - -.breadcrumb_contentlinks{ - width:auto; - height:auto; - float:left; - margin-right:5px; - padding:0; - color:#2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - cursor:pointer; - cursor:hand; - text-decoration:none; -} - -.domain_search_contentlinks{ - width:150px; - height:auto; - float:left; - margin:0; - padding:0; - color:#2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - cursor:pointer; - cursor:hand; - text-decoration:none; -} - -.domain_search_contentlinks:hover{ - text-decoration:underline; -} - - -.domain_searchbox_right { - width:13px; - height:598px; - float:left; - margin:0; - padding:0; - background:url(../images/domain_serachboxright.gif) no-repeat top left; -} - -.search_closearrow { - width:8px; - height:16px; - float:left; - margin:280px 0 0 0; - padding:0; - cursor:pointer; - cursor:hand; - background:url(../images/search_closearrow.gif) no-repeat top left; - display:inline; -} - - - - -a.add_userbutton { - width:77px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/add_userbutton.gif) no-repeat top left; - padding:0; -} - -a.add_userbutton:hover { - background:url(../images/add_userbutton_hover.gif) no-repeat top left; -} - -a.add_domainbutton { - width:77px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background:url(../images/add_domainbutton.gif) no-repeat top left; - padding:0; -} - -a.add_domainbutton:hover { - background:url(../images/add_domainbutton_hover.gif) no-repeat top left; - -} - - - -.domain_detailsbox_contentpanel { - width:350px; - height:590px; - float:left; - margin:10px 0 0 0; - padding:0; -} - -.domain_detailsbox_contentpanel h2 { - width:300px; - height:auto; - float:left; - color:#77c4df; - font-size:16px; - font-weight:normal; - text-align:left; - margin:5px 0 0 10px; - display:inline; - padding:0; -} - -.domain_detailsbox_content { - width:330px; - height:540px; - float:left; - margin:10px 0 0 10px; - padding:0; - display:inline; - overflow-x:hidden; - overflow-y:scroll; - overflow-y:auto; -} - -.domain_detailsbox_content p { - width:280px; - height:auto; - float:left; - margin:0 0 5px 0; - padding:0; - display:inline; - font-size:12px; - text-align:left; - font-weight:normal; -} - -.domain_detailsbox_content span { - width:180px; - height:auto; - float:left; - margin:0 0 10px 0; - padding:0; - display:inline; - font-size:12px; - text-align:left; - font-weight:normal; -} - -.domain_detailsbox_label { - width:70px; - height:auto; - float:left; - margin:0 0 5px 0; - padding:0; - display:inline; - font-size:12px; - text-align:left; - font-weight:bold; -} - -.breadcrumb_box { - width:100%; - height:auto; - float:left; - margin:2px 0 5px 3px; - padding:0; -} - - -.breadcrumb_box span { - width:auto; - height:auto; - color:#999; - font-size:11px; - font-weight:normal; - margin:0 5px 0 5px; -} - - -.breadcrumb_box a:link { - width:auto; - height:auto; - color:#2c8bbc; - font-size:11px; - font-weight:normal; - text-decoration:none; - margin:0 5px 0 5px; -} - -.breadcrumb_box a:visited { - width:auto; - height:auto; - color:#2c8bbc; - font-size:11px; - font-weight:normal; - text-decoration:none; - margin:0 5px 0 5px; -} - -.breadcrumb_box a:hover { - width:auto; - height:auto; - color:#2c8bbc; - font-size:11px; - font-weight:normal; - text-decoration:underline; - margin:0 5px 0 5px; -} - -.rev_wiztop { - width:929px; - height:111px; - float:left; - background:url(../images/rev_wiztop.jpg) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} -.rev_wizardbox { - width:888px; - height:44px; - float:left; - margin:19px 0 0 20px; - padding:0; -} - -.rev_wizardsteps{ - width:222px; - height:44px; - float:left; - margin:0; - padding:0; -} - -.rev_wizardsteps h3{ - width:auto; - height:auto; - float:left; - font-size:19px; - text-align:left; - font-weight:normal; - color:#FFF; - margin:10px 0 0 10px; - padding:0; -} - - -.revwiz_selectednumber { - width:30px; - height:33px; - float:left; - background:url(../images/revwiz_selectednumber.gif) no-repeat top left; - color:#FFF; - font-size:24px; - text-align:left; - font-weight:bold; - margin:0; - padding:9px 0 0 12px; -} - -.revwiz_nonselectednumber { - width:30px; - height:33px; - float:left; - background:url(../images/revwiz_nonselectednumber.gif) no-repeat top left; - color:#FFF; - font-size:24px; - text-align:left; - font-weight:bold; - margin:0; - padding:9px 0 0 12px; -} - -.rev_wizmid { - width:929px; - height:458px; - float:left; - background:url(../images/rev_wizmid.gif) repeat-y top left; - margin:0; - padding:0; -} - -.rev_wizmid_maincontent { - width:902px; - height:430px; - float:left; - margin:0 0 0 15px; - padding:0; - display:inline; -} - -.rev_wizmid_maincontent p{ - width:100%; - height:auto; - float:left; - color:#333; - text-align:left; - font-size:11px; - font-weight:normal; - -} - -.rev_wizmid_maincontent a:link{ - width:auto; - height:auto; - text-align:left; - font-size:11px; - font-weight:normal; - color:#2c8bbc; - text-decoration:underline; -} - -.rev_wizmid_maincontent a:visited{ - width:auto; - height:auto; - text-align:left; - font-size:11px; - font-weight:normal; - color:#2c8bbc; - text-decoration:underline; -} - -.rev_wizmid_maincontent a:hover{ - width:auto; - height:auto; - text-align:left; - font-size:11px; - font-weight:normal; - color:#2c8bbc; - text-decoration:underline; -} - -.rev_wizmid_titlebox { - width:902px; - height:auto; - float:left; - margin:0; - padding:0; -} - -.rev_wizmid_titlebox h2{ - width:902px; - height:auto; - text-align:left; - color:#214152; - font-size:24px; - font-weight:normal; - float:left; - margin:0; - padding:0; -} - -.rev_wizmid_contentbox { - width:902px; - height:325px; - float:left; - margin:10px 0 0 0; - padding:0; - display:inline; - -} - -.rev_wizmid_tempbox { - width:893px; - height:284px; - float:left; - margin:0; - padding:0; - border:1px solid #666; -} - -.rev_wizmid_tempbox_left { - width:182px; - height:284px; - float:left; - margin:0; - padding:0; -} - -.rev_wizmid_tempbox_right { - width:709px; - height:284px; - float:left; - margin:0; - padding:0; -} - -.rev_wiztemplistpanel { - width:709px; - height:254px; - float:left; - margin:0; - padding:0; - background:#FFF repeat top left; - cursor:pointer; - cursor:hand; -} - -.rev_wiztemplistactions { - width:709px; - height:28px; - float:left; - margin:0; - padding:0; - background:#f2f2f2 repeat top left; -} - -.rev_wiztemplist_actionsbox { - width:auto; - height:auto; - float:right; - margin:8px 10px 0 0; - padding:0; -} - -.rev_wiztemplist_actionsbox a:link { - width:auto; - height:auto; - float:left; - color:#2c8bbc; - font-size:12px; - text-align:left; - font-weight:normal; - text-decoration:none; - margin:0 15px 0 0; - padding:0; -} - -.rev_wiztemplist_actionsbox a:visted { - width:auto; - height:auto; - float:left; - color:#2c8bbc; - font-size:12px; - text-align:left; - font-weight:normal; - text-decoration:none; - margin:0 15px 0 0; - padding:0; -} -.rev_wiz_reviewbox { - width:870px; - height:295px; - float:left; - margin:0; - padding:0; - overflow-y:scroll; - overflow-y:auto; - -} - -.rev_wiz_reviewlist { - width:830px; - height:auto; - float:left; - background:url(../images/tick_arrow.gif) no-repeat top left; - background-position: 5px 0; - margin:10px 0 5px 10px; - border:1px solid #CCC; - padding:5px; - display:inline; -} - -.rev_wiz_reviewlabel { - width:150px; - height:auto; - float:left; - color:#214152; - font-size:12px; - text-align:left; - font-weight:bold; - margin:0 0 0 30px; - padding:0; -} - -.rev_wiz_reviewanswers { - width:650px; - height:auto; - float:left; - color:#333; - font-size:12px; - text-align:left; - font-weight:normal; - margin:0; - padding:0; -} - -.rev_wiztemplist_actionsbox a:hover { - width:auto; - height:auto; - float:left; - color:#2c8bbc; - font-size:12px; - text-align:left; - font-weight:normal; - text-decoration:underline; - margin:0 15px 0 0; - padding:0; -} - - -.rev_wiztemplistbox { - width:709px; - height:auto; - float:left; - border-bottom:1px solid #666; - margin:0; - padding:0; - background:#FFF repeat top left; - cursor:pointer; - cursor:hand; -} -.rev_wiztemp_listtext { - width:520px; - height:auto; - float:left; - color:#021a28; - font-size:11px; - font-weight:normal; - text-align:left; - margin:5px 0 5px 0; - padding:0; -} - -.rev_wiztemp_ownertext { - width:80px; - height:auto; - float:left; - color:#021a28; - font-size:11px; - font-weight:bold; - text-align:left; - margin:5px 0 5px 0; - padding:0; -} - - -.rev_wiztemp_text { - width:520px; - height:auto; - float:left; - color:#021a28; - font-size:11px; - font-weight:normal; - text-align:left; - margin:5px 0 5px 0; - padding:0; -} - -.rev_wiztemplistbox:hover { - background:#e4e4e4 repeat top left; -} - -.rev_wiztemplistbox_selected { - width:709px; - height:auto; - float:left; - border-bottom:1px solid #666; - margin:0; - padding:0; - background:#8fe0f4 repeat top left; - cursor:pointer; - cursor:hand; -} - -.rev_wiztemo_centosicons { - width:17px; - height:16px; - float:left; - margin:2px 10px 0 5px; - background:url(../images/temp_centosicon.gif) no-repeat top left; - padding:0; -} - -.rev_wiztemo_windowsicons { - width:17px; - height:16px; - float:left; - margin:2px 10px 0 5px; - background:url(../images/temp_windowsicon.gif) no-repeat top left; - padding:0; -} - -.rev_wiztemo_linuxicons { - width:17px; - height:16px; - float:left; - margin:2px 10px 0 5px; - background:url(../images/temp_linuxicon.gif) no-repeat top left; - padding:0; -} - - -.rev_wizmid_selectedtempbut { - width:167px; - height:43px; - float:left; - margin:0; - background:url(../images/revwiz_selcted_tempbut.gif) no-repeat top left; - color:#FFF; - text-align:left; - font-size:14px; - font-weight:normal; - padding:28px 0 0 15px; -} - -.rev_wizmid_nonselectedtempbut { - width:167px; - height:43px; - float:left; - margin:0; - background:url(../images/revwiz_nonselcted_tempbut.gif) no-repeat top left; - color:#333; - text-align:left; - font-size:14px; - font-weight:normal; - padding:28px 0 0 15px; - cursor:pointer; - cursor:hand; -} - -.rev_wizmid_nonselectedtempbut:hover { - background:url(../images/revwiz_nonselcted_tempbut_hover.gif) no-repeat top left; - color:#FFF; -} - -.rev_tempsearchpanel { - width:902px; - height:21px; - float:left; - margin:0 0 10px 0; - padding:0; -} - -.rev_tempsearchpanel .select { - width:160px; - height:19px; - background:#eaeaea repeat top left; - border:1px solid #999; - font-size:12px; - color:#333; - margin:0 0 0 5px; - display:inline; - padding:0; -} - -.rev_tempsearchbox { - width:215px; - height:21px; - float:right; - margin:0; - padding:0; -} - - - - -.rev_tempsearchbox ol { - width:168px; - height:21px; - float:left; - margin:0; - padding:0; - list-style:none; -} - -.rev_tempsearchbox li { - width:168px; - height:21px; - float:left; - margin:0; - padding:0; -} - -.rev_tempsearchbox .text { - width:160px; - height:19px; - float:left; - background:#eaeaea repeat top left; - border:1px solid #999; - font-size:12px; - color:#333; - margin:0; - padding:0; -} - -.rev_searchbutton { - width:auto; - padding:auto; - float:left; - text-decoration:none; - font-size:11px; - color:#0074bb; - text-align:left; - margin:5px 0 0 5px; - padding:0; - cursor:pointer; - cursor:hand; -} - -.rev_searchbutton:hover { - - text-decoration:underline; - -} -.rev_wizformarea { - width:902px; - height:auto; - float:left; - margin:0; - padding:0; -} - - -.rev_wizformarea ol { - width:780px; - height:auto; - color:#333; - float:left; - font-family:Arial, Helvetica, sans-serif; - font-size:12px; - list-style:none; -} - -.rev_wizformarea li { - width:750px; - float:left; - padding-bottom: 10px; - color:#FFF; - font-size:12px; - font-weight:normal; - text-align:left; - margin-top:5px; -} - -.rev_wizformarea label { - width:150px; - float:left; - text-align:left; - font-weight:bold; - margin-top:2px; - color:#333; - font-size:13px; -} - -.rev_wizformarea .radio { - width:15px; - height:15px; - float:left; - margin:0 5px 0 0; - padding:0; -} - -.rev_wizformarea .checkbox { - width:15px; - height:15px; - float:left; - margin:0; - padding:0; -} -.revwiz_formcontent_title { - width:800px; - height:auto; - float:left; - color:#04263a; - font-size:12px; - font-weight:bold; - margin-top:0; - padding:0; -} - -.rev_wizformarea .text { - background-color: #e9f6ff; - font: normal 12px Arial, Helvetica, sans-serif; - font-weight:normal; - float:left; - border: 1px solid #61869b; - padding:2px 2px 0 2px; - height: 16px; - width: 196px; - margin:0; - padding:0; - color:#333; -} - -.rev_wizformarea .multiple { - background-color: #e9f6ff; - font: normal 12px Arial, Helvetica, sans-serif; - font-weight:normal; - float:left; - border: 1px solid #61869b; - padding:2px 2px 0 2px; - height: 80px; - width: 300px; - margin:0; - padding:0; - color:#333; -} - -.rev_wizformarea .select { - background-color: #e9f6ff; - font: normal 12px Arial, Helvetica, sans-serif; - font-weight:normal; - float:left; - border: 1px solid #61869b; - padding:2px 2px 0 2px; - height: 16px; - width: 196px; - margin:0; - padding:0; - color:#333; -} - -.rev_wizbot{ - width:929px; - height:19px; - float:left; - background:url(../images/rev_wizbot.gif) no-repeat top left; - margin:0; - padding:0; -} - -.rev_wizmid_actionbox { - width:902px; - height:35px; - float:left; - margin:10px 0 0 0; - padding:0; -} - -.rev_wizmid_actionnext { - width:103px; - height:26px; - float:right; - background:url(../images/revwiz_nextbutton.gif) no-repeat top left; - font-size:14px; - color:#FFF; - text-align:center; - text-decoration:none; - font-weight:normal; - margin:0 10px 0 0; - padding:10px 0 0 0; - cursor:pointer; - cursor:hand; -} - -.rev_wizmid_actionnext:hover { - color:#37a6db; -} - -.rev_wizmid_actionback { - width:103px; - height:26px; - float:left; - background:url(../images/revwiz_backbutton.gif) no-repeat top left; - font-size:14px; - color:#FFF; - text-align:center; - text-decoration:none; - font-weight:normal; - margin:0 0 0 10px; - padding:10px 0 0 0; - cursor:pointer; - cursor:hand; -} - -.rev_wizmid_actionback:hover { - color:#37a6db; -} - -.db_domainbg { - width:529px; - height:80px; - float:left; - background:url(../images/db_domainbg.gif) no-repeat top left; - margin:0 0 15px 10px; - padding:0; -} - -.db_domainbg_left { - width:183px; - height:80px; - float:left; - margin:0; - padding:0; -} - -.db_domainbg_right { - width:340px; - height:80px; - float:left; - margin:0; - padding:0; -} - -.db_domainbg_right p { - width:300px; - height:40px; - float:left; - text-align:left; - font-size:14px; - font-weight:bold; - margin:30px 0 0 0; - padding:0; -} - -.db_domainbg_right span { - width:auto; - height:auto; - text-align:left; - font-size:14px; - font-weight:bold; - color:#003b53; - margin:0; - padding:0; -} - -.db_domainicons { - width:111px; - height:49px; - float:left; - margin:10px 0 0 20px; - display:inline; - padding:0; -} - - -.revwiz_loadingbox { - width:180px; - height:50px; - position:absolute; - background:#FFF repeat top left; - border:1px solid #999; - z-index:1100; - top:47%; - left:45%; -} - -.revwiz_loadingbox p{ - width:auto; - height:auto; - float:left; - text-align:left; - color:#666; - font-weight:normal; - font-size:25px; - margin:10px 0 0 20px; - display:inline; -} - - -.revwiz_message_container { - width:300px; - height:auto; - position:absolute; - background:url(../images/loading_messagebg.gif) #d3d3d3 repeat-x top left; - border:1px solid #CCC; - z-index:1100; - top:47%; - left:45%; - display:inline; - margin:0; - padding:0; -} - - -.revwiz_message_top { - width:99%; - height:auto; - float:left; - margin:0; - padding:2px 5px 0 5px; - overflow:hidden; -} - -.revwiz_message_top p { - width:auto; - height:25px; - margin:0; - padding:0; - color:#333; - text-align:left; - font-weight:normal; - font-size:11px; - display:inline; -} - -.revwiz_message_bottom { - width:100%; - height:20px; - float:left; - margin:0; - padding:0; - -} - - -.revwizcontinue_button { - width:60px; - height:17px; - float:right; - margin-right:5px; - padding:0; - background:url(../images/vm_continuebutton.gif) no-repeat top left; - text-decoration:none; -} - -.revwizcontinue_button:hover { - background:url(../images/vm_continuebutton_hover.gif) no-repeat top left; -} - - -.revwiz_closebutton { - width:24px; - height:25px; - position:absolute; - background:url(../images/revwiz_closebutton.gif) no-repeat top left; - margin:0; - padding:0; - cursor:pointer; - cursor:hand; - z-index:1005; - right:5px; - top:4px; -} - -.revwiz_closebutton:hover { - background:url(../images/revwiz_closebutton_hover.gif) no-repeat top left; -} - -a.add_networkgroupbutton { - width:109px; - height:22px; - float:left; - margin:3px 0 0 10px; - display:inline; - background: url(../images/addnetgroup_button.gif) no-repeat top left; - padding:0; -} - -a:hover.add_networkgroupbutton { - background: url(../images/addnetgroup_button_hover.gif) no-repeat top left; -} - - -.publicip_panel { - width: 970px; - height:auto; - float:left; - margin:0; - padding:0; -} - -.ip_descriptionbox { - width:964px; - min-height:250px; - height:auto; - float:left; - position:relative; - margin:0; - padding:0; -} - -.ip_searchbutton { - width:22px; - height:21px; - float:left; - background:url(../images/ip_searchbutton.gif) no-repeat top left; - cursor:pointer; - cursor:hand; - margin:6px 0 0 5px; - display:inline; - padding:0; -} - -.ip_descriptionbox_top { - width:964px; - height:24px; - float:left; - background:url(../images/ipdescr_boxtop.gif) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.ip_descriptionbox_top a { - width:auto; - height:auto; - float:right; - color:#2c8bbc; - font-size:11px; - text-decoration:underline; - font-weight:normal; - margin:6px 15px 0 0; - padding:0; -} - -.ip_descriptionbox_top a:link,ip_descriptionbox_top a:visited { - text-decoration:underline; -} - -.ip_descriptionbox_top a:hover { - text-decoration:none; -} - -.ip_descriptionbox_mid { - width:964px; - height:auto; - float:left; - background:url(../images/ipdescr_boxmid.gif) repeat-y top left; - margin:0; - padding:0; -} - -.ip_descriptionbox_bot { - width:964px; - height:33px; - float:left; - background:url(../images/ipdescr_boxbot.gif) no-repeat top left; - margin:0; - padding:0; -} - -.ip_description_contentbox { - width:941px; - height:auto; - float:left; - margin:0 0 10px 10px; - left:0; - top:0; - padding:0; -} - -.ip_description_contentbox_top { - width:941px; - height:33px; - float:left; - background:url(../images/ipdescr_conttop.gif) no-repeat top left; - margin:0; - padding:0; - overflow:hidden; -} - -.ip_description_contentbox_mid { - width:941px; - height:auto; - float:left; - background:url(../images/ipdescr_contmid.gif) repeat-y top left; - margin:0; - padding:0; -} - -.ip_description_contentbox_mid p { - width:auto; - height:auto; - float:left; - margin:0 0 0 15px; - display:inline; - font-size:12px; - font-weight:bold; - color:#333; - padding:0; -} - - -.ip_description_contentbox_bot { - width:941px; - height:14px; - float:left; - background:url(../images/ipdescr_contbot.gif) no-repeat top left; - margin:0; - padding:0; -} - -.ip_description_topdetailspanel { - width:941px; - height:54px; - background:url(../images/ip_detailtopbox.gif) no-repeat top left; - float:left; - margin:0 0 10px 10px; - left:0; - padding:0; -} - -.ip_description_topdetailspanel a { - width:auto; - height:auto; - color:#2c8bbc; - font-size:11px; - text-decoration:underline; - margin:-2px 0 0 5px; - display:inline; - padding:0; -} - -.ip_description_topdetailspanel a:link, .ip_description_topdetailspanel a:visited { - text-decoration:underline; -} - -.ip_description_topdetailspanel a:hover { - text-decoration:none; -} - -.ip_description_detailbox { - width:231px; - height:23px; - float:left; - margin:2px 0 0 2px; - padding:0; -} - -.ip_description_detailbox p { - float:left; - color:#333; - font-size:11px; - font-weight:normal; - margin:8px 0 0 10px; - padding:0; -} - -.ip_description_detailbox span { - color:#333; - font-size:11px; - font-weight:bold; - margin:0; - padding:0; -} - -.ip_description_titlearea { - width:468px; - height:auto; - float:left; - margin:5px 0 0 0; - display:inline; - padding:0; -} - -.ip_description_titlearea h3{ - width:350px; - height:auto; - float:left; - color:#333; - font-size:14px; - font-weight:normal; - margin:4px 0 0 0; - display:inline; - padding:0; -} - -.ip_description_titleicon { - width:20px; - height:10px; - float:left; - margin:0 10px 0 10px; - display:inline; - padding:0; -} - - -.ip_description_contentarea { - width:468px; - height:auto; - float:left; - margin:0 0 0 2px; - display:inline; - padding:0; -} - -.ip_description_gridarea { - width:440px; - height:auto; - float:left; - background:#FFF; - margin:5px 0 0 10px; - padding:0; -} - - -.ip_description_managearea { - width:439px; - height:auto; - float:left; - background:#FFF; - margin:3px 0 0 0; - padding:0; -} - -.ip_description_managelist { - width:395px; - height:23px; - float:left; - background:#fff9d7 url(../images/ip_managebox_bg.gif) repeat-x top left; - border:1px solid #d6d6d6; - margin:3px 0 3px 20px; - display:inline; - padding:0; -} - -.ip_description_manageloading { - width:350px; - height:23px; - float:left; - margin:0; - padding:0; -} - -.ip_description_manageloading p{ - width:auto; - height:auto; - float:left; - color:#333; - font-size:11px; - font-weight:bold; - margin:5px 0 0 0; - padding:0; -} - -.ip_description_manageloader { - width:16px; - height:16px; - float:left; - background:url(../images/loadvm_loader.gif) no-repeat top left; - margin:3px 10px 0 10px; - padding:0; -} - -.ip_description_managelist_cell { - height:15px; - float:left; - color:#333; - font-size:11px; - text-align:left; - font-weight:normal; - margin:0; - padding:6px 0 0 5px; -} - -.ip_description_managelist_cell .select { - height:16px; - float:left; - background:#FFF; - border:1px solid #CCC; - color:#333; - font-size:11px; - text-align:left; - font-weight:normal; - margin:-2px 0 0 0; - padding:0; -} - -.ip_description_managelist_cell a:link { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - display:inline; - text-decoration:none; - margin:0 5px 0 0; - padding:0; -} - -.ip_description_managelist_cell a:visited { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - display:inline; - text-decoration:none; - margin:0 5px 0 0; - padding:0; -} - -.ip_description_managelist_cell a:hover { - color: #2c8bbc; - text-align:left; - font-size:11px; - font-weight:normal; - display:inline; - text-decoration:underline; - margin:0 5px 0 0; - padding:0; -} - -.ip_description_managelist_icon { - width:21px; - height:18px; - float:left; - background:url(../images/ip_managebox_icon.gif) no-repeat top left; - margin:2px 15px 0 5px; - display:inline; - padding:0; -} - -#cidr_container { - width:120px; - height:auto; - float:left; - margin:0; - padding:0; -} - - - -#account_networkgroup_container { - width:200px; - height:auto; - float:left; - margin:0; - padding:0; - -} - -.select_directipbg_user { - width:423px; - height:44px; - float:left; - background:url(../images/select_ipbg.gif) no-repeat top left; - margin:0; - padding:0; -} - -.select_directipbg_user ol { - width:395px; - height:auto; - float:left; - list-style:none; - margin:3px 0 0 12px; - display:inline; - padding:0; -} - -.select_directipbg_user li { - width:390px; - height:auto; - float:left; - margin:0 0 0 5px; - display:inline; - padding:0; -} - -.select_directipbg_user label { - width:auto; - height:auto; - float:left; - color:#FFF; - font-size:11px; - font-weight:bold; - text-align:left; - margin:7px 15px 0 0; - padding:0; -} - -.select_directipbg_user .select { - width: 259px; - height:18px; - float:left; - background:#FFF repeat top left; - border:1px solid #CCC; - font-size:11px; - font-weight:normal; - color:#333; - padding:1px 0 0 2px; - margin:4px 0 0 0; -} - -.select_directipbg_admin { - width:770px; - height:44px; - float:left; - background:url(../images/select_ipbg_admin.gif) no-repeat top left; - margin:0; - padding:0; -} - -.select_directipbg_admin ol { - width:auto; - height:auto; - float:left; - list-style:none; - margin:3px 0 0 12px; - display:inline; - padding:0; -} - -.select_directipbg_admin li { - width:auto; - height:auto; - float:left; - margin:0 0 0 5px; - display:inline; - padding:0; -} - -.select_directipbg_admin label { - width:auto; - height:auto; - float:left; - color:#FFF; - font-size:11px; - font-weight:bold; - text-align:left; - margin:7px 15px 0 0; - padding:0; -} - -.select_directipbg_admin .select { - width: 170px; - height:19px; - float:left; - background:#FFF repeat top left; - border:1px solid #CCC; - font-size:11px; - font-weight:normal; - color:#333; - padding:1px 0 0 2px; - margin:4px 0 0 10px; -} - -.select_directipbg_admin .text { - width: 174px; - height:16px; - float:left; - background:#FFF repeat top left; - border:1px solid #CCC; - font-size:11px; - font-weight:normal; - color:#333; - padding:1px 0 0 2px; - margin:4px 0 0 10px; -} - - -.select_directipbg_admin .ipwatermark_text { - color:#999; - text-align:left; - font-size:11px; - font-weight:normal; - padding:1px 0 0 2px; - position:relative; -} - - -.ip_oricon { - width:20px; - height:18px; - float:left; - background:url(../images/ip_ORicon.gif) no-repeat top left; - margin:4px 15px 0 0; - padding:0; -} - -.select_directip_actions { - width:auto; - height:auto; - float:left; - margin:0 0 0 10px; - padding:0; -} - -.select_directip_actions a { - color:#2c8bbc; - font-size:11px; - font-weight:normal; - float:left; - margin:10px 0 0 0; - padding:0; - text-decoration:underline; -} - -.select_directip_actions a:link, select_directip_actions a:visited { - text-decoration:underline; -} - -.select_directip_actions a:hover { - text-decoration:none; -} - -.select_directipbg ol { - width:395px; - height:auto; - float:left; - list-style:none; - margin:3px 0 0 12px; - display:inline; - padding:0; -} - -.select_directipbg li { - width:390px; - height:auto; - float:left; - margin:0 0 0 5px; - display:inline; - padding:0; -} - -.select_directipbg label { - width:auto; - height:auto; - float:left; - color:#FFF; - font-size:11px; - font-weight:bold; - text-align:left; - margin:7px 15px 0 0; - padding:0; -} - -.select_directipbg .select { - width: 259px; - height:18px; - float:left; - background:#FFF repeat top left; - border:1px solid #CCC; - font-size:11px; - font-weight:normal; - color:#333; - padding:1px 0 0 2px; - margin:4px 0 0 0; -} - -/* Instances tab - VM template - "Network Groups" action link - Network Groups dialog (begin) */ -ul.network_groups_list_first_level -{ - list-style-type:square; - padding-left: 10px; -} - -ul.network_groups_list_second_level -{ - list-style-type:circle; - padding-left: 30px; -} -/* Instances tab - VM template - "Network Groups" action link - Network Groups dialog (end) */ \ No newline at end of file diff --git a/ui/2.1/favicon.ico b/ui/2.1/favicon.ico deleted file mode 100644 index 392f395539e..00000000000 Binary files a/ui/2.1/favicon.ico and /dev/null differ diff --git a/ui/2.1/images/32bit_icon.gif b/ui/2.1/images/32bit_icon.gif deleted file mode 100644 index 9cefdc20571..00000000000 Binary files a/ui/2.1/images/32bit_icon.gif and /dev/null differ diff --git a/ui/2.1/images/64bit_icon.gif b/ui/2.1/images/64bit_icon.gif deleted file mode 100644 index db8c2e9ecf9..00000000000 Binary files a/ui/2.1/images/64bit_icon.gif and /dev/null differ diff --git a/ui/2.1/images/ISO_OFF.gif b/ui/2.1/images/ISO_OFF.gif deleted file mode 100644 index 43936445e26..00000000000 Binary files a/ui/2.1/images/ISO_OFF.gif and /dev/null differ diff --git a/ui/2.1/images/ISO_ON.gif b/ui/2.1/images/ISO_ON.gif deleted file mode 100644 index 78ffdbab768..00000000000 Binary files a/ui/2.1/images/ISO_ON.gif and /dev/null differ diff --git a/ui/2.1/images/KVM_icon.gif b/ui/2.1/images/KVM_icon.gif deleted file mode 100644 index fe3c6f291bd..00000000000 Binary files a/ui/2.1/images/KVM_icon.gif and /dev/null differ diff --git a/ui/2.1/images/XEN_icon.gif b/ui/2.1/images/XEN_icon.gif deleted file mode 100644 index 37e68fbdd24..00000000000 Binary files a/ui/2.1/images/XEN_icon.gif and /dev/null differ diff --git a/ui/2.1/images/account_bg.gif b/ui/2.1/images/account_bg.gif deleted file mode 100644 index fca7c3575b9..00000000000 Binary files a/ui/2.1/images/account_bg.gif and /dev/null differ diff --git a/ui/2.1/images/account_shadow.gif b/ui/2.1/images/account_shadow.gif deleted file mode 100644 index 7bb2b19f3c5..00000000000 Binary files a/ui/2.1/images/account_shadow.gif and /dev/null differ diff --git a/ui/2.1/images/accountstitle_icons.gif b/ui/2.1/images/accountstitle_icons.gif deleted file mode 100644 index dc91765d046..00000000000 Binary files a/ui/2.1/images/accountstitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/add_domainbutton.gif b/ui/2.1/images/add_domainbutton.gif deleted file mode 100644 index 66e8a9dff64..00000000000 Binary files a/ui/2.1/images/add_domainbutton.gif and /dev/null differ diff --git a/ui/2.1/images/add_domainbutton_hover.gif b/ui/2.1/images/add_domainbutton_hover.gif deleted file mode 100644 index b3e267b0168..00000000000 Binary files a/ui/2.1/images/add_domainbutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/add_ipbutton.gif b/ui/2.1/images/add_ipbutton.gif deleted file mode 100644 index 3edf0e74b9a..00000000000 Binary files a/ui/2.1/images/add_ipbutton.gif and /dev/null differ diff --git a/ui/2.1/images/add_ipbutton_hover.gif b/ui/2.1/images/add_ipbutton_hover.gif deleted file mode 100644 index c1bdbce9fdf..00000000000 Binary files a/ui/2.1/images/add_ipbutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/add_userbutton.gif b/ui/2.1/images/add_userbutton.gif deleted file mode 100644 index 68d72f60501..00000000000 Binary files a/ui/2.1/images/add_userbutton.gif and /dev/null differ diff --git a/ui/2.1/images/add_userbutton_hover.gif b/ui/2.1/images/add_userbutton_hover.gif deleted file mode 100644 index 12272d07306..00000000000 Binary files a/ui/2.1/images/add_userbutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/addnetgroup_button.gif b/ui/2.1/images/addnetgroup_button.gif deleted file mode 100644 index 7a61d5e5064..00000000000 Binary files a/ui/2.1/images/addnetgroup_button.gif and /dev/null differ diff --git a/ui/2.1/images/addnetgroup_button_hover.gif b/ui/2.1/images/addnetgroup_button_hover.gif deleted file mode 100644 index 0daa81e0f7c..00000000000 Binary files a/ui/2.1/images/addnetgroup_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/admin_vmblue_left.gif b/ui/2.1/images/admin_vmblue_left.gif deleted file mode 100644 index 44d32bca3d2..00000000000 Binary files a/ui/2.1/images/admin_vmblue_left.gif and /dev/null differ diff --git a/ui/2.1/images/admin_vmblue_mid.gif b/ui/2.1/images/admin_vmblue_mid.gif deleted file mode 100644 index 8ff77634d44..00000000000 Binary files a/ui/2.1/images/admin_vmblue_mid.gif and /dev/null differ diff --git a/ui/2.1/images/admin_vmblue_right.gif b/ui/2.1/images/admin_vmblue_right.gif deleted file mode 100644 index 1302115b840..00000000000 Binary files a/ui/2.1/images/admin_vmblue_right.gif and /dev/null differ diff --git a/ui/2.1/images/admin_vmconsole.gif b/ui/2.1/images/admin_vmconsole.gif deleted file mode 100644 index 07298ca4b8d..00000000000 Binary files a/ui/2.1/images/admin_vmconsole.gif and /dev/null differ diff --git a/ui/2.1/images/admin_vmconsole_hover.gif b/ui/2.1/images/admin_vmconsole_hover.gif deleted file mode 100644 index 67e98b90b7d..00000000000 Binary files a/ui/2.1/images/admin_vmconsole_hover.gif and /dev/null differ diff --git a/ui/2.1/images/admin_vmgrey_left.gif b/ui/2.1/images/admin_vmgrey_left.gif deleted file mode 100644 index c4fc5b00df4..00000000000 Binary files a/ui/2.1/images/admin_vmgrey_left.gif and /dev/null differ diff --git a/ui/2.1/images/admin_vmgrey_mid.gif b/ui/2.1/images/admin_vmgrey_mid.gif deleted file mode 100644 index 0b897a6d93c..00000000000 Binary files a/ui/2.1/images/admin_vmgrey_mid.gif and /dev/null differ diff --git a/ui/2.1/images/admin_vmgrey_right.gif b/ui/2.1/images/admin_vmgrey_right.gif deleted file mode 100644 index 148ed6a3a9b..00000000000 Binary files a/ui/2.1/images/admin_vmgrey_right.gif and /dev/null differ diff --git a/ui/2.1/images/admin_vmyellow_left.gif b/ui/2.1/images/admin_vmyellow_left.gif deleted file mode 100644 index 2cc75b85001..00000000000 Binary files a/ui/2.1/images/admin_vmyellow_left.gif and /dev/null differ diff --git a/ui/2.1/images/admin_vmyellow_mid.gif b/ui/2.1/images/admin_vmyellow_mid.gif deleted file mode 100644 index 953503f3e34..00000000000 Binary files a/ui/2.1/images/admin_vmyellow_mid.gif and /dev/null differ diff --git a/ui/2.1/images/admin_vmyellow_right.gif b/ui/2.1/images/admin_vmyellow_right.gif deleted file mode 100644 index 03a83340055..00000000000 Binary files a/ui/2.1/images/admin_vmyellow_right.gif and /dev/null differ diff --git a/ui/2.1/images/adv_searchbutton.gif b/ui/2.1/images/adv_searchbutton.gif deleted file mode 100644 index a7b424d7535..00000000000 Binary files a/ui/2.1/images/adv_searchbutton.gif and /dev/null differ diff --git a/ui/2.1/images/adv_searchbutton_hover.gif b/ui/2.1/images/adv_searchbutton_hover.gif deleted file mode 100644 index 74f8b508059..00000000000 Binary files a/ui/2.1/images/adv_searchbutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/ajax-loader.gif b/ui/2.1/images/ajax-loader.gif deleted file mode 100644 index 5b33f7e54f4..00000000000 Binary files a/ui/2.1/images/ajax-loader.gif and /dev/null differ diff --git a/ui/2.1/images/alert_icon.png b/ui/2.1/images/alert_icon.png deleted file mode 100644 index 9e5b604712a..00000000000 Binary files a/ui/2.1/images/alert_icon.png and /dev/null differ diff --git a/ui/2.1/images/alerttitle_icons.gif b/ui/2.1/images/alerttitle_icons.gif deleted file mode 100644 index 6b1f7368d65..00000000000 Binary files a/ui/2.1/images/alerttitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/alpha_rowbg.png b/ui/2.1/images/alpha_rowbg.png deleted file mode 100644 index d42023457db..00000000000 Binary files a/ui/2.1/images/alpha_rowbg.png and /dev/null differ diff --git a/ui/2.1/images/alpha_vmrowbg.png b/ui/2.1/images/alpha_vmrowbg.png deleted file mode 100644 index 77c36ab8024..00000000000 Binary files a/ui/2.1/images/alpha_vmrowbg.png and /dev/null differ diff --git a/ui/2.1/images/arrow_bullet.gif b/ui/2.1/images/arrow_bullet.gif deleted file mode 100644 index b6f51955af9..00000000000 Binary files a/ui/2.1/images/arrow_bullet.gif and /dev/null differ diff --git a/ui/2.1/images/bigrotation2.gif b/ui/2.1/images/bigrotation2.gif deleted file mode 100644 index 5bb90fd6a49..00000000000 Binary files a/ui/2.1/images/bigrotation2.gif and /dev/null differ diff --git a/ui/2.1/images/bootable_nonselectedicon.gif b/ui/2.1/images/bootable_nonselectedicon.gif deleted file mode 100644 index 74223151f75..00000000000 Binary files a/ui/2.1/images/bootable_nonselectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/bootable_selectedicon.gif b/ui/2.1/images/bootable_selectedicon.gif deleted file mode 100644 index 17db72a5771..00000000000 Binary files a/ui/2.1/images/bootable_selectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/box_bullet.gif b/ui/2.1/images/box_bullet.gif deleted file mode 100644 index b0201d38ed2..00000000000 Binary files a/ui/2.1/images/box_bullet.gif and /dev/null differ diff --git a/ui/2.1/images/bytes_in.gif b/ui/2.1/images/bytes_in.gif deleted file mode 100644 index 7eaf0ffc392..00000000000 Binary files a/ui/2.1/images/bytes_in.gif and /dev/null differ diff --git a/ui/2.1/images/bytes_out.gif b/ui/2.1/images/bytes_out.gif deleted file mode 100644 index 609df13a279..00000000000 Binary files a/ui/2.1/images/bytes_out.gif and /dev/null differ diff --git a/ui/2.1/images/calendar_icon.gif b/ui/2.1/images/calendar_icon.gif deleted file mode 100644 index bd41d84712e..00000000000 Binary files a/ui/2.1/images/calendar_icon.gif and /dev/null differ diff --git a/ui/2.1/images/capacitypanel_bot.gif b/ui/2.1/images/capacitypanel_bot.gif deleted file mode 100644 index 9232bbab25d..00000000000 Binary files a/ui/2.1/images/capacitypanel_bot.gif and /dev/null differ diff --git a/ui/2.1/images/capacitypanel_mid.gif b/ui/2.1/images/capacitypanel_mid.gif deleted file mode 100644 index c3a34937cc6..00000000000 Binary files a/ui/2.1/images/capacitypanel_mid.gif and /dev/null differ diff --git a/ui/2.1/images/capacitypanel_top.gif b/ui/2.1/images/capacitypanel_top.gif deleted file mode 100644 index a71cb9d01c4..00000000000 Binary files a/ui/2.1/images/capacitypanel_top.gif and /dev/null differ diff --git a/ui/2.1/images/close_button.png b/ui/2.1/images/close_button.png deleted file mode 100644 index c597f61b999..00000000000 Binary files a/ui/2.1/images/close_button.png and /dev/null differ diff --git a/ui/2.1/images/close_button_hover.png b/ui/2.1/images/close_button_hover.png deleted file mode 100644 index 2e1272329d8..00000000000 Binary files a/ui/2.1/images/close_button_hover.png and /dev/null differ diff --git a/ui/2.1/images/cloud_logo.gif b/ui/2.1/images/cloud_logo.gif deleted file mode 100644 index 48638d3f6ba..00000000000 Binary files a/ui/2.1/images/cloud_logo.gif and /dev/null differ diff --git a/ui/2.1/images/console_bg.png b/ui/2.1/images/console_bg.png deleted file mode 100644 index f4560e40e5d..00000000000 Binary files a/ui/2.1/images/console_bg.png and /dev/null differ diff --git a/ui/2.1/images/cproxytitle_icons.gif b/ui/2.1/images/cproxytitle_icons.gif deleted file mode 100644 index 6fb269f6c55..00000000000 Binary files a/ui/2.1/images/cproxytitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/cpu_icon.gif b/ui/2.1/images/cpu_icon.gif deleted file mode 100644 index 4ff03b35e00..00000000000 Binary files a/ui/2.1/images/cpu_icon.gif and /dev/null differ diff --git a/ui/2.1/images/crosszone_nonselectedicon.gif b/ui/2.1/images/crosszone_nonselectedicon.gif deleted file mode 100644 index a68298decc2..00000000000 Binary files a/ui/2.1/images/crosszone_nonselectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/crosszone_selectedicon.gif b/ui/2.1/images/crosszone_selectedicon.gif deleted file mode 100644 index 58a80be4535..00000000000 Binary files a/ui/2.1/images/crosszone_selectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/dashboardtitle_icons.gif b/ui/2.1/images/dashboardtitle_icons.gif deleted file mode 100644 index 1fb5e3b3484..00000000000 Binary files a/ui/2.1/images/dashboardtitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/db_bardg_bg.gif b/ui/2.1/images/db_bardg_bg.gif deleted file mode 100644 index 3217008628b..00000000000 Binary files a/ui/2.1/images/db_bardg_bg.gif and /dev/null differ diff --git a/ui/2.1/images/db_bardg_titlebg.gif b/ui/2.1/images/db_bardg_titlebg.gif deleted file mode 100644 index 0e84163775b..00000000000 Binary files a/ui/2.1/images/db_bardg_titlebg.gif and /dev/null differ diff --git a/ui/2.1/images/db_domain_top.gif b/ui/2.1/images/db_domain_top.gif deleted file mode 100644 index 0c7d9c51ece..00000000000 Binary files a/ui/2.1/images/db_domain_top.gif and /dev/null differ diff --git a/ui/2.1/images/db_domainbg.gif b/ui/2.1/images/db_domainbg.gif deleted file mode 100644 index f2729b56156..00000000000 Binary files a/ui/2.1/images/db_domainbg.gif and /dev/null differ diff --git a/ui/2.1/images/db_vmmid.gif b/ui/2.1/images/db_vmmid.gif deleted file mode 100644 index 5fe26b2f462..00000000000 Binary files a/ui/2.1/images/db_vmmid.gif and /dev/null differ diff --git a/ui/2.1/images/db_vmyellowmid.gif b/ui/2.1/images/db_vmyellowmid.gif deleted file mode 100644 index 9c8c8a1d264..00000000000 Binary files a/ui/2.1/images/db_vmyellowmid.gif and /dev/null differ diff --git a/ui/2.1/images/details_downarrow.jpg b/ui/2.1/images/details_downarrow.jpg deleted file mode 100644 index a366b80fa15..00000000000 Binary files a/ui/2.1/images/details_downarrow.jpg and /dev/null differ diff --git a/ui/2.1/images/details_uparrow.jpg b/ui/2.1/images/details_uparrow.jpg deleted file mode 100644 index 42365664df8..00000000000 Binary files a/ui/2.1/images/details_uparrow.jpg and /dev/null differ diff --git a/ui/2.1/images/disk_icon.gif b/ui/2.1/images/disk_icon.gif deleted file mode 100644 index c642f533efa..00000000000 Binary files a/ui/2.1/images/disk_icon.gif and /dev/null differ diff --git a/ui/2.1/images/diskofftitle_icons.gif b/ui/2.1/images/diskofftitle_icons.gif deleted file mode 100644 index 52734fe87b1..00000000000 Binary files a/ui/2.1/images/diskofftitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/display_boxbot.gif b/ui/2.1/images/display_boxbot.gif deleted file mode 100644 index 67ef2c78e7b..00000000000 Binary files a/ui/2.1/images/display_boxbot.gif and /dev/null differ diff --git a/ui/2.1/images/display_boxmid.gif b/ui/2.1/images/display_boxmid.gif deleted file mode 100644 index 383613107a7..00000000000 Binary files a/ui/2.1/images/display_boxmid.gif and /dev/null differ diff --git a/ui/2.1/images/display_boxtop.gif b/ui/2.1/images/display_boxtop.gif deleted file mode 100644 index 851a9a28daf..00000000000 Binary files a/ui/2.1/images/display_boxtop.gif and /dev/null differ diff --git a/ui/2.1/images/display_deleteicon.png b/ui/2.1/images/display_deleteicon.png deleted file mode 100644 index f103dcd7743..00000000000 Binary files a/ui/2.1/images/display_deleteicon.png and /dev/null differ diff --git a/ui/2.1/images/display_deleteicon_hover.png b/ui/2.1/images/display_deleteicon_hover.png deleted file mode 100644 index a68e51c5df4..00000000000 Binary files a/ui/2.1/images/display_deleteicon_hover.png and /dev/null differ diff --git a/ui/2.1/images/display_editicon.png b/ui/2.1/images/display_editicon.png deleted file mode 100644 index 1bd5c0e9adb..00000000000 Binary files a/ui/2.1/images/display_editicon.png and /dev/null differ diff --git a/ui/2.1/images/display_editicon_hover.png b/ui/2.1/images/display_editicon_hover.png deleted file mode 100644 index ca098b79ba2..00000000000 Binary files a/ui/2.1/images/display_editicon_hover.png and /dev/null differ diff --git a/ui/2.1/images/display_headerbg.gif b/ui/2.1/images/display_headerbg.gif deleted file mode 100644 index 53a5b9b52de..00000000000 Binary files a/ui/2.1/images/display_headerbg.gif and /dev/null differ diff --git a/ui/2.1/images/display_rollbackicon.png b/ui/2.1/images/display_rollbackicon.png deleted file mode 100644 index 5eff45d7b39..00000000000 Binary files a/ui/2.1/images/display_rollbackicon.png and /dev/null differ diff --git a/ui/2.1/images/display_rollbackicon_hover.png b/ui/2.1/images/display_rollbackicon_hover.png deleted file mode 100644 index 839bfb185a7..00000000000 Binary files a/ui/2.1/images/display_rollbackicon_hover.png and /dev/null differ diff --git a/ui/2.1/images/displaygrid_loader.gif b/ui/2.1/images/displaygrid_loader.gif deleted file mode 100644 index 1dfa2aac1c2..00000000000 Binary files a/ui/2.1/images/displaygrid_loader.gif and /dev/null differ diff --git a/ui/2.1/images/domain_dbaccount.gif b/ui/2.1/images/domain_dbaccount.gif deleted file mode 100644 index 31a9fd2f973..00000000000 Binary files a/ui/2.1/images/domain_dbaccount.gif and /dev/null differ diff --git a/ui/2.1/images/domain_dbdiskoff.gif b/ui/2.1/images/domain_dbdiskoff.gif deleted file mode 100644 index a04507c4274..00000000000 Binary files a/ui/2.1/images/domain_dbdiskoff.gif and /dev/null differ diff --git a/ui/2.1/images/domain_dbinstance.gif b/ui/2.1/images/domain_dbinstance.gif deleted file mode 100644 index 67da02cda81..00000000000 Binary files a/ui/2.1/images/domain_dbinstance.gif and /dev/null differ diff --git a/ui/2.1/images/domain_dbsnapshots.gif b/ui/2.1/images/domain_dbsnapshots.gif deleted file mode 100644 index ff2fb28cbde..00000000000 Binary files a/ui/2.1/images/domain_dbsnapshots.gif and /dev/null differ diff --git a/ui/2.1/images/domain_serachboxleft.gif b/ui/2.1/images/domain_serachboxleft.gif deleted file mode 100644 index 44214b8c1f9..00000000000 Binary files a/ui/2.1/images/domain_serachboxleft.gif and /dev/null differ diff --git a/ui/2.1/images/domain_serachboxmid.gif b/ui/2.1/images/domain_serachboxmid.gif deleted file mode 100644 index 9ebac9785c0..00000000000 Binary files a/ui/2.1/images/domain_serachboxmid.gif and /dev/null differ diff --git a/ui/2.1/images/domain_serachboxright.gif b/ui/2.1/images/domain_serachboxright.gif deleted file mode 100644 index f4dafb1495c..00000000000 Binary files a/ui/2.1/images/domain_serachboxright.gif and /dev/null differ diff --git a/ui/2.1/images/domaintitle_icons.gif b/ui/2.1/images/domaintitle_icons.gif deleted file mode 100644 index 55473065b26..00000000000 Binary files a/ui/2.1/images/domaintitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/domdetailsbox_left.gif b/ui/2.1/images/domdetailsbox_left.gif deleted file mode 100644 index 569e198e9ca..00000000000 Binary files a/ui/2.1/images/domdetailsbox_left.gif and /dev/null differ diff --git a/ui/2.1/images/domdetailsbox_mid.gif b/ui/2.1/images/domdetailsbox_mid.gif deleted file mode 100644 index 4b021de636d..00000000000 Binary files a/ui/2.1/images/domdetailsbox_mid.gif and /dev/null differ diff --git a/ui/2.1/images/domdetailsbox_right.gif b/ui/2.1/images/domdetailsbox_right.gif deleted file mode 100644 index 889eef4cb1b..00000000000 Binary files a/ui/2.1/images/domdetailsbox_right.gif and /dev/null differ diff --git a/ui/2.1/images/eventstitle_icons.gif b/ui/2.1/images/eventstitle_icons.gif deleted file mode 100644 index 0a91b5200dc..00000000000 Binary files a/ui/2.1/images/eventstitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/featured_nonselectedicon.gif b/ui/2.1/images/featured_nonselectedicon.gif deleted file mode 100644 index 1a2b4be36d4..00000000000 Binary files a/ui/2.1/images/featured_nonselectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/featured_selectedicon.gif b/ui/2.1/images/featured_selectedicon.gif deleted file mode 100644 index 898b8bc9f1b..00000000000 Binary files a/ui/2.1/images/featured_selectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/graph_titleicon.gif b/ui/2.1/images/graph_titleicon.gif deleted file mode 100644 index 8715ad59a36..00000000000 Binary files a/ui/2.1/images/graph_titleicon.gif and /dev/null differ diff --git a/ui/2.1/images/green_statusbar.gif b/ui/2.1/images/green_statusbar.gif deleted file mode 100644 index 8c771f47d9d..00000000000 Binary files a/ui/2.1/images/green_statusbar.gif and /dev/null differ diff --git a/ui/2.1/images/grey_statusbar.gif b/ui/2.1/images/grey_statusbar.gif deleted file mode 100644 index 6b76f1e9102..00000000000 Binary files a/ui/2.1/images/grey_statusbar.gif and /dev/null differ diff --git a/ui/2.1/images/grid_headerbg b/ui/2.1/images/grid_headerbg deleted file mode 100644 index df23f1218be..00000000000 Binary files a/ui/2.1/images/grid_headerbg and /dev/null differ diff --git a/ui/2.1/images/grid_headerbg.gif b/ui/2.1/images/grid_headerbg.gif deleted file mode 100644 index 67319cf656d..00000000000 Binary files a/ui/2.1/images/grid_headerbg.gif and /dev/null differ diff --git a/ui/2.1/images/grid_loader.gif b/ui/2.1/images/grid_loader.gif deleted file mode 100644 index d42f72c7236..00000000000 Binary files a/ui/2.1/images/grid_loader.gif and /dev/null differ diff --git a/ui/2.1/images/grid_morebutton.gif b/ui/2.1/images/grid_morebutton.gif deleted file mode 100644 index c4e62a8524c..00000000000 Binary files a/ui/2.1/images/grid_morebutton.gif and /dev/null differ diff --git a/ui/2.1/images/grid_morebutton_hover.gif b/ui/2.1/images/grid_morebutton_hover.gif deleted file mode 100644 index 17bbec34f84..00000000000 Binary files a/ui/2.1/images/grid_morebutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/gridresult_closebutton.gif b/ui/2.1/images/gridresult_closebutton.gif deleted file mode 100644 index 236dd13d7c2..00000000000 Binary files a/ui/2.1/images/gridresult_closebutton.gif and /dev/null differ diff --git a/ui/2.1/images/gridresult_closebutton_hover.gif b/ui/2.1/images/gridresult_closebutton_hover.gif deleted file mode 100644 index ee1be5b74a0..00000000000 Binary files a/ui/2.1/images/gridresult_closebutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/gridsorting_downarrow.gif b/ui/2.1/images/gridsorting_downarrow.gif deleted file mode 100644 index f8d5b09f97d..00000000000 Binary files a/ui/2.1/images/gridsorting_downarrow.gif and /dev/null differ diff --git a/ui/2.1/images/gridsorting_uparrow.gif b/ui/2.1/images/gridsorting_uparrow.gif deleted file mode 100644 index ab077dc3cc8..00000000000 Binary files a/ui/2.1/images/gridsorting_uparrow.gif and /dev/null differ diff --git a/ui/2.1/images/group_icon.gif b/ui/2.1/images/group_icon.gif deleted file mode 100644 index 416fd92a4e2..00000000000 Binary files a/ui/2.1/images/group_icon.gif and /dev/null differ diff --git a/ui/2.1/images/gsettingstitle_icons.gif b/ui/2.1/images/gsettingstitle_icons.gif deleted file mode 100644 index ac6a71e6146..00000000000 Binary files a/ui/2.1/images/gsettingstitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/ha_disable.gif b/ui/2.1/images/ha_disable.gif deleted file mode 100644 index f2b66d700d2..00000000000 Binary files a/ui/2.1/images/ha_disable.gif and /dev/null differ diff --git a/ui/2.1/images/ha_enable.gif b/ui/2.1/images/ha_enable.gif deleted file mode 100644 index 3fca589ad98..00000000000 Binary files a/ui/2.1/images/ha_enable.gif and /dev/null differ diff --git a/ui/2.1/images/header_bg b/ui/2.1/images/header_bg deleted file mode 100644 index f68af30c099..00000000000 Binary files a/ui/2.1/images/header_bg and /dev/null differ diff --git a/ui/2.1/images/header_bg.gif b/ui/2.1/images/header_bg.gif deleted file mode 100644 index 170b9f0bdf5..00000000000 Binary files a/ui/2.1/images/header_bg.gif and /dev/null differ diff --git a/ui/2.1/images/help_actionicon.png b/ui/2.1/images/help_actionicon.png deleted file mode 100644 index 77f87eff354..00000000000 Binary files a/ui/2.1/images/help_actionicon.png and /dev/null differ diff --git a/ui/2.1/images/hostdetails_headerbg.jpg b/ui/2.1/images/hostdetails_headerbg.jpg deleted file mode 100644 index 826cebae9f3..00000000000 Binary files a/ui/2.1/images/hostdetails_headerbg.jpg and /dev/null differ diff --git a/ui/2.1/images/hostnetwork_icon.gif b/ui/2.1/images/hostnetwork_icon.gif deleted file mode 100644 index 771f21b8adf..00000000000 Binary files a/ui/2.1/images/hostnetwork_icon.gif and /dev/null differ diff --git a/ui/2.1/images/hosttitle_icons.gif b/ui/2.1/images/hosttitle_icons.gif deleted file mode 100644 index bffcfafa3d0..00000000000 Binary files a/ui/2.1/images/hosttitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/hvm_nonselectedicon.gif b/ui/2.1/images/hvm_nonselectedicon.gif deleted file mode 100644 index d061ac4c69e..00000000000 Binary files a/ui/2.1/images/hvm_nonselectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/hvm_selectedicon.gif b/ui/2.1/images/hvm_selectedicon.gif deleted file mode 100644 index 22d20b8d470..00000000000 Binary files a/ui/2.1/images/hvm_selectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/instancetitle_icons.gif b/ui/2.1/images/instancetitle_icons.gif deleted file mode 100644 index 2e44ffca52b..00000000000 Binary files a/ui/2.1/images/instancetitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/ip_ORicon.gif b/ui/2.1/images/ip_ORicon.gif deleted file mode 100644 index ff163d808ad..00000000000 Binary files a/ui/2.1/images/ip_ORicon.gif and /dev/null differ diff --git a/ui/2.1/images/ip_detailtopbox.gif b/ui/2.1/images/ip_detailtopbox.gif deleted file mode 100644 index ac59e75978f..00000000000 Binary files a/ui/2.1/images/ip_detailtopbox.gif and /dev/null differ diff --git a/ui/2.1/images/ip_managebox_bg.gif b/ui/2.1/images/ip_managebox_bg.gif deleted file mode 100644 index 5fdf341790e..00000000000 Binary files a/ui/2.1/images/ip_managebox_bg.gif and /dev/null differ diff --git a/ui/2.1/images/ip_managebox_icon.gif b/ui/2.1/images/ip_managebox_icon.gif deleted file mode 100644 index afb6768096c..00000000000 Binary files a/ui/2.1/images/ip_managebox_icon.gif and /dev/null differ diff --git a/ui/2.1/images/ip_searchbutton.gif b/ui/2.1/images/ip_searchbutton.gif deleted file mode 100644 index 9dcf987e12e..00000000000 Binary files a/ui/2.1/images/ip_searchbutton.gif and /dev/null differ diff --git a/ui/2.1/images/ipbox_nonselected.gif b/ui/2.1/images/ipbox_nonselected.gif deleted file mode 100644 index fbe462c4ccf..00000000000 Binary files a/ui/2.1/images/ipbox_nonselected.gif and /dev/null differ diff --git a/ui/2.1/images/ipbox_selected.gif b/ui/2.1/images/ipbox_selected.gif deleted file mode 100644 index 0d8acb0f7ee..00000000000 Binary files a/ui/2.1/images/ipbox_selected.gif and /dev/null differ diff --git a/ui/2.1/images/ipdescr_boxbot.gif b/ui/2.1/images/ipdescr_boxbot.gif deleted file mode 100644 index 84bf47ec73b..00000000000 Binary files a/ui/2.1/images/ipdescr_boxbot.gif and /dev/null differ diff --git a/ui/2.1/images/ipdescr_boxmid.gif b/ui/2.1/images/ipdescr_boxmid.gif deleted file mode 100644 index adf1ac23c50..00000000000 Binary files a/ui/2.1/images/ipdescr_boxmid.gif and /dev/null differ diff --git a/ui/2.1/images/ipdescr_boxtop.gif b/ui/2.1/images/ipdescr_boxtop.gif deleted file mode 100644 index 7b95712b16b..00000000000 Binary files a/ui/2.1/images/ipdescr_boxtop.gif and /dev/null differ diff --git a/ui/2.1/images/ipdescr_contbot.gif b/ui/2.1/images/ipdescr_contbot.gif deleted file mode 100644 index 810fdb82370..00000000000 Binary files a/ui/2.1/images/ipdescr_contbot.gif and /dev/null differ diff --git a/ui/2.1/images/ipdescr_contbot_blank.gif b/ui/2.1/images/ipdescr_contbot_blank.gif deleted file mode 100644 index 66b65e81bc2..00000000000 Binary files a/ui/2.1/images/ipdescr_contbot_blank.gif and /dev/null differ diff --git a/ui/2.1/images/ipdescr_contmid.gif b/ui/2.1/images/ipdescr_contmid.gif deleted file mode 100644 index 5820b8227cf..00000000000 Binary files a/ui/2.1/images/ipdescr_contmid.gif and /dev/null differ diff --git a/ui/2.1/images/ipdescr_contmid_blank.gif b/ui/2.1/images/ipdescr_contmid_blank.gif deleted file mode 100644 index d12ff0c4800..00000000000 Binary files a/ui/2.1/images/ipdescr_contmid_blank.gif and /dev/null differ diff --git a/ui/2.1/images/ipdescr_conttop.gif b/ui/2.1/images/ipdescr_conttop.gif deleted file mode 100644 index c6d3cb4274f..00000000000 Binary files a/ui/2.1/images/ipdescr_conttop.gif and /dev/null differ diff --git a/ui/2.1/images/ipdescr_conttop_blank.gif b/ui/2.1/images/ipdescr_conttop_blank.gif deleted file mode 100644 index d95f11e237f..00000000000 Binary files a/ui/2.1/images/ipdescr_conttop_blank.gif and /dev/null differ diff --git a/ui/2.1/images/iptitle_icons.gif b/ui/2.1/images/iptitle_icons.gif deleted file mode 100644 index 224c2d8dbe8..00000000000 Binary files a/ui/2.1/images/iptitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/isotitle_icons.gif b/ui/2.1/images/isotitle_icons.gif deleted file mode 100644 index 8fed65bf823..00000000000 Binary files a/ui/2.1/images/isotitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/laoding.gif b/ui/2.1/images/laoding.gif deleted file mode 100644 index a73dc3b8f56..00000000000 Binary files a/ui/2.1/images/laoding.gif and /dev/null differ diff --git a/ui/2.1/images/load_add.gif b/ui/2.1/images/load_add.gif deleted file mode 100644 index 88e96844056..00000000000 Binary files a/ui/2.1/images/load_add.gif and /dev/null differ diff --git a/ui/2.1/images/load_addicon.gif b/ui/2.1/images/load_addicon.gif deleted file mode 100644 index b37be30ecea..00000000000 Binary files a/ui/2.1/images/load_addicon.gif and /dev/null differ diff --git a/ui/2.1/images/load_aniloader.gif b/ui/2.1/images/load_aniloader.gif deleted file mode 100644 index 5fcdbf00ffb..00000000000 Binary files a/ui/2.1/images/load_aniloader.gif and /dev/null differ diff --git a/ui/2.1/images/load_joint.gif b/ui/2.1/images/load_joint.gif deleted file mode 100644 index 1ad4d83fa9a..00000000000 Binary files a/ui/2.1/images/load_joint.gif and /dev/null differ diff --git a/ui/2.1/images/load_routericon.gif b/ui/2.1/images/load_routericon.gif deleted file mode 100644 index e81f3e2080a..00000000000 Binary files a/ui/2.1/images/load_routericon.gif and /dev/null differ diff --git a/ui/2.1/images/load_stoppedvm.gif b/ui/2.1/images/load_stoppedvm.gif deleted file mode 100644 index 848ef017efd..00000000000 Binary files a/ui/2.1/images/load_stoppedvm.gif and /dev/null differ diff --git a/ui/2.1/images/load_workingvm.gif b/ui/2.1/images/load_workingvm.gif deleted file mode 100644 index 3b39fbefa9a..00000000000 Binary files a/ui/2.1/images/load_workingvm.gif and /dev/null differ diff --git a/ui/2.1/images/loadgr_closebutton.png b/ui/2.1/images/loadgr_closebutton.png deleted file mode 100644 index 1f6570168b7..00000000000 Binary files a/ui/2.1/images/loadgr_closebutton.png and /dev/null differ diff --git a/ui/2.1/images/loadgr_closebutton_hover.png b/ui/2.1/images/loadgr_closebutton_hover.png deleted file mode 100644 index 976074323f1..00000000000 Binary files a/ui/2.1/images/loadgr_closebutton_hover.png and /dev/null differ diff --git a/ui/2.1/images/loadind_textbg.gif b/ui/2.1/images/loadind_textbg.gif deleted file mode 100644 index 783a5e8f711..00000000000 Binary files a/ui/2.1/images/loadind_textbg.gif and /dev/null differ diff --git a/ui/2.1/images/loading.gif b/ui/2.1/images/loading.gif deleted file mode 100644 index 50d3799608e..00000000000 Binary files a/ui/2.1/images/loading.gif and /dev/null differ diff --git a/ui/2.1/images/loading_1.gif b/ui/2.1/images/loading_1.gif deleted file mode 100644 index e548b4c2159..00000000000 Binary files a/ui/2.1/images/loading_1.gif and /dev/null differ diff --git a/ui/2.1/images/loading_addbg.gif b/ui/2.1/images/loading_addbg.gif deleted file mode 100644 index 076c7623830..00000000000 Binary files a/ui/2.1/images/loading_addbg.gif and /dev/null differ diff --git a/ui/2.1/images/loading_load.gif b/ui/2.1/images/loading_load.gif deleted file mode 100644 index 88e96844056..00000000000 Binary files a/ui/2.1/images/loading_load.gif and /dev/null differ diff --git a/ui/2.1/images/loading_messagebg.gif b/ui/2.1/images/loading_messagebg.gif deleted file mode 100644 index bd374437b5c..00000000000 Binary files a/ui/2.1/images/loading_messagebg.gif and /dev/null differ diff --git a/ui/2.1/images/loadingmsg_left.gif b/ui/2.1/images/loadingmsg_left.gif deleted file mode 100644 index a5854d7d438..00000000000 Binary files a/ui/2.1/images/loadingmsg_left.gif and /dev/null differ diff --git a/ui/2.1/images/loadingmsg_mid.gif b/ui/2.1/images/loadingmsg_mid.gif deleted file mode 100644 index 284853d7354..00000000000 Binary files a/ui/2.1/images/loadingmsg_mid.gif and /dev/null differ diff --git a/ui/2.1/images/loadingmsg_right.gif b/ui/2.1/images/loadingmsg_right.gif deleted file mode 100644 index 9b3f4d6070b..00000000000 Binary files a/ui/2.1/images/loadingmsg_right.gif and /dev/null differ diff --git a/ui/2.1/images/loadnetwork_titleicon.gif b/ui/2.1/images/loadnetwork_titleicon.gif deleted file mode 100644 index 2862191c3f4..00000000000 Binary files a/ui/2.1/images/loadnetwork_titleicon.gif and /dev/null differ diff --git a/ui/2.1/images/loadtitle_icons.gif b/ui/2.1/images/loadtitle_icons.gif deleted file mode 100644 index f0744f2709d..00000000000 Binary files a/ui/2.1/images/loadtitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/loadvm_loader.gif b/ui/2.1/images/loadvm_loader.gif deleted file mode 100644 index 570adba522e..00000000000 Binary files a/ui/2.1/images/loadvm_loader.gif and /dev/null differ diff --git a/ui/2.1/images/logo.gif b/ui/2.1/images/logo.gif deleted file mode 100644 index f248ecf68c2..00000000000 Binary files a/ui/2.1/images/logo.gif and /dev/null differ diff --git a/ui/2.1/images/logout_bg.gif b/ui/2.1/images/logout_bg.gif deleted file mode 100644 index ebf049e0bec..00000000000 Binary files a/ui/2.1/images/logout_bg.gif and /dev/null differ diff --git a/ui/2.1/images/logout_bot.gif b/ui/2.1/images/logout_bot.gif deleted file mode 100644 index a49608f9bce..00000000000 Binary files a/ui/2.1/images/logout_bot.gif and /dev/null differ diff --git a/ui/2.1/images/logout_cloudlogo.gif b/ui/2.1/images/logout_cloudlogo.gif deleted file mode 100644 index 2ae9b21beac..00000000000 Binary files a/ui/2.1/images/logout_cloudlogo.gif and /dev/null differ diff --git a/ui/2.1/images/logout_logo.gif b/ui/2.1/images/logout_logo.gif deleted file mode 100644 index f9e927a6d84..00000000000 Binary files a/ui/2.1/images/logout_logo.gif and /dev/null differ diff --git a/ui/2.1/images/logout_mid.gif b/ui/2.1/images/logout_mid.gif deleted file mode 100644 index 363e36a8bcb..00000000000 Binary files a/ui/2.1/images/logout_mid.gif and /dev/null differ diff --git a/ui/2.1/images/logout_top.gif b/ui/2.1/images/logout_top.gif deleted file mode 100644 index 70797cd3c43..00000000000 Binary files a/ui/2.1/images/logout_top.gif and /dev/null differ diff --git a/ui/2.1/images/mcontent_bg.gif b/ui/2.1/images/mcontent_bg.gif deleted file mode 100644 index 3a275b44708..00000000000 Binary files a/ui/2.1/images/mcontent_bg.gif and /dev/null differ diff --git a/ui/2.1/images/memory_icon.gif b/ui/2.1/images/memory_icon.gif deleted file mode 100644 index 1d026174768..00000000000 Binary files a/ui/2.1/images/memory_icon.gif and /dev/null differ diff --git a/ui/2.1/images/overlay_morebot.png b/ui/2.1/images/overlay_morebot.png deleted file mode 100644 index f2f5f7eaac0..00000000000 Binary files a/ui/2.1/images/overlay_morebot.png and /dev/null differ diff --git a/ui/2.1/images/overlay_moremid.png b/ui/2.1/images/overlay_moremid.png deleted file mode 100644 index 6c62fc9b469..00000000000 Binary files a/ui/2.1/images/overlay_moremid.png and /dev/null differ diff --git a/ui/2.1/images/overlay_moretop.png b/ui/2.1/images/overlay_moretop.png deleted file mode 100644 index e5865389f40..00000000000 Binary files a/ui/2.1/images/overlay_moretop.png and /dev/null differ diff --git a/ui/2.1/images/pagination_bg.gif b/ui/2.1/images/pagination_bg.gif deleted file mode 100644 index 9405e827930..00000000000 Binary files a/ui/2.1/images/pagination_bg.gif and /dev/null differ diff --git a/ui/2.1/images/pagination_firsticon.gif b/ui/2.1/images/pagination_firsticon.gif deleted file mode 100644 index 194c9a9cba4..00000000000 Binary files a/ui/2.1/images/pagination_firsticon.gif and /dev/null differ diff --git a/ui/2.1/images/pagination_lasticon.gif b/ui/2.1/images/pagination_lasticon.gif deleted file mode 100644 index 41c48de8c36..00000000000 Binary files a/ui/2.1/images/pagination_lasticon.gif and /dev/null differ diff --git a/ui/2.1/images/pagination_nexticon.gif b/ui/2.1/images/pagination_nexticon.gif deleted file mode 100644 index d214b30e7ef..00000000000 Binary files a/ui/2.1/images/pagination_nexticon.gif and /dev/null differ diff --git a/ui/2.1/images/pagination_previcon.gif b/ui/2.1/images/pagination_previcon.gif deleted file mode 100644 index 01de674a883..00000000000 Binary files a/ui/2.1/images/pagination_previcon.gif and /dev/null differ diff --git a/ui/2.1/images/pagination_refresh.gif b/ui/2.1/images/pagination_refresh.gif deleted file mode 100644 index 3d95bc0472b..00000000000 Binary files a/ui/2.1/images/pagination_refresh.gif and /dev/null differ diff --git a/ui/2.1/images/password_nonselectedicon.gif b/ui/2.1/images/password_nonselectedicon.gif deleted file mode 100644 index d051c44a22b..00000000000 Binary files a/ui/2.1/images/password_nonselectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/password_selectedicon.gif b/ui/2.1/images/password_selectedicon.gif deleted file mode 100644 index 84eaf6ba896..00000000000 Binary files a/ui/2.1/images/password_selectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/pin_icon.gif b/ui/2.1/images/pin_icon.gif deleted file mode 100644 index 868aeff83ff..00000000000 Binary files a/ui/2.1/images/pin_icon.gif and /dev/null differ diff --git a/ui/2.1/images/portnetwork_titleicon.gif b/ui/2.1/images/portnetwork_titleicon.gif deleted file mode 100644 index 370ca0621c5..00000000000 Binary files a/ui/2.1/images/portnetwork_titleicon.gif and /dev/null differ diff --git a/ui/2.1/images/primestoragetitle_icons.gif b/ui/2.1/images/primestoragetitle_icons.gif deleted file mode 100644 index 342771d672b..00000000000 Binary files a/ui/2.1/images/primestoragetitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/public_nonselectedicon.gif b/ui/2.1/images/public_nonselectedicon.gif deleted file mode 100644 index 17c95c9bfa5..00000000000 Binary files a/ui/2.1/images/public_nonselectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/public_selectedicon.gif b/ui/2.1/images/public_selectedicon.gif deleted file mode 100644 index 156b79339fd..00000000000 Binary files a/ui/2.1/images/public_selectedicon.gif and /dev/null differ diff --git a/ui/2.1/images/red_statusbar.gif b/ui/2.1/images/red_statusbar.gif deleted file mode 100644 index 7d2a73d265b..00000000000 Binary files a/ui/2.1/images/red_statusbar.gif and /dev/null differ diff --git a/ui/2.1/images/register_box.gif b/ui/2.1/images/register_box.gif deleted file mode 100644 index b03f541bc22..00000000000 Binary files a/ui/2.1/images/register_box.gif and /dev/null differ diff --git a/ui/2.1/images/rev_wizbot.gif b/ui/2.1/images/rev_wizbot.gif deleted file mode 100644 index 8a5e4bcc2d1..00000000000 Binary files a/ui/2.1/images/rev_wizbot.gif and /dev/null differ diff --git a/ui/2.1/images/rev_wizmid.gif b/ui/2.1/images/rev_wizmid.gif deleted file mode 100644 index ee96e49222a..00000000000 Binary files a/ui/2.1/images/rev_wizmid.gif and /dev/null differ diff --git a/ui/2.1/images/rev_wiztop.jpg b/ui/2.1/images/rev_wiztop.jpg deleted file mode 100644 index bbba6d0e5cc..00000000000 Binary files a/ui/2.1/images/rev_wiztop.jpg and /dev/null differ diff --git a/ui/2.1/images/revwiz_backbutton.gif b/ui/2.1/images/revwiz_backbutton.gif deleted file mode 100644 index 3b262902138..00000000000 Binary files a/ui/2.1/images/revwiz_backbutton.gif and /dev/null differ diff --git a/ui/2.1/images/revwiz_closebutton.gif b/ui/2.1/images/revwiz_closebutton.gif deleted file mode 100644 index 99b127343a1..00000000000 Binary files a/ui/2.1/images/revwiz_closebutton.gif and /dev/null differ diff --git a/ui/2.1/images/revwiz_closebutton_hover.gif b/ui/2.1/images/revwiz_closebutton_hover.gif deleted file mode 100644 index 7e528887e00..00000000000 Binary files a/ui/2.1/images/revwiz_closebutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/revwiz_nextbutton.gif b/ui/2.1/images/revwiz_nextbutton.gif deleted file mode 100644 index d5f63570d08..00000000000 Binary files a/ui/2.1/images/revwiz_nextbutton.gif and /dev/null differ diff --git a/ui/2.1/images/revwiz_nonselcted_tempbut.gif b/ui/2.1/images/revwiz_nonselcted_tempbut.gif deleted file mode 100644 index 7ee254cee97..00000000000 Binary files a/ui/2.1/images/revwiz_nonselcted_tempbut.gif and /dev/null differ diff --git a/ui/2.1/images/revwiz_nonselcted_tempbut_hover.gif b/ui/2.1/images/revwiz_nonselcted_tempbut_hover.gif deleted file mode 100644 index a7947295453..00000000000 Binary files a/ui/2.1/images/revwiz_nonselcted_tempbut_hover.gif and /dev/null differ diff --git a/ui/2.1/images/revwiz_nonselectednumber.gif b/ui/2.1/images/revwiz_nonselectednumber.gif deleted file mode 100644 index 623a8f102e7..00000000000 Binary files a/ui/2.1/images/revwiz_nonselectednumber.gif and /dev/null differ diff --git a/ui/2.1/images/revwiz_selcted_tempbut.gif b/ui/2.1/images/revwiz_selcted_tempbut.gif deleted file mode 100644 index a44ab580220..00000000000 Binary files a/ui/2.1/images/revwiz_selcted_tempbut.gif and /dev/null differ diff --git a/ui/2.1/images/revwiz_selectednumber.gif b/ui/2.1/images/revwiz_selectednumber.gif deleted file mode 100644 index 6918aa9122e..00000000000 Binary files a/ui/2.1/images/revwiz_selectednumber.gif and /dev/null differ diff --git a/ui/2.1/images/routerstitle_icons.gif b/ui/2.1/images/routerstitle_icons.gif deleted file mode 100644 index 77bf1b4de36..00000000000 Binary files a/ui/2.1/images/routerstitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/running_icon.gif b/ui/2.1/images/running_icon.gif deleted file mode 100644 index 8a1da1cddc5..00000000000 Binary files a/ui/2.1/images/running_icon.gif and /dev/null differ diff --git a/ui/2.1/images/safebar_bg.gif b/ui/2.1/images/safebar_bg.gif deleted file mode 100644 index 89f0e860c00..00000000000 Binary files a/ui/2.1/images/safebar_bg.gif and /dev/null differ diff --git a/ui/2.1/images/search_closearrow.gif b/ui/2.1/images/search_closearrow.gif deleted file mode 100644 index cf7b1ac78da..00000000000 Binary files a/ui/2.1/images/search_closearrow.gif and /dev/null differ diff --git a/ui/2.1/images/search_closeicon.gif b/ui/2.1/images/search_closeicon.gif deleted file mode 100644 index c6148ab69d0..00000000000 Binary files a/ui/2.1/images/search_closeicon.gif and /dev/null differ diff --git a/ui/2.1/images/search_closeicon_hover.gif b/ui/2.1/images/search_closeicon_hover.gif deleted file mode 100644 index f011186d669..00000000000 Binary files a/ui/2.1/images/search_closeicon_hover.gif and /dev/null differ diff --git a/ui/2.1/images/search_resulticon.gif b/ui/2.1/images/search_resulticon.gif deleted file mode 100644 index 1f987399115..00000000000 Binary files a/ui/2.1/images/search_resulticon.gif and /dev/null differ diff --git a/ui/2.1/images/searchicon_button.jpg b/ui/2.1/images/searchicon_button.jpg deleted file mode 100644 index 2a7bae22b15..00000000000 Binary files a/ui/2.1/images/searchicon_button.jpg and /dev/null differ diff --git a/ui/2.1/images/searchicon_button_hover.jpg b/ui/2.1/images/searchicon_button_hover.jpg deleted file mode 100644 index d68d3a0af64..00000000000 Binary files a/ui/2.1/images/searchicon_button_hover.jpg and /dev/null differ diff --git a/ui/2.1/images/searchpanel_bg.gif b/ui/2.1/images/searchpanel_bg.gif deleted file mode 100644 index b04597e88b6..00000000000 Binary files a/ui/2.1/images/searchpanel_bg.gif and /dev/null differ diff --git a/ui/2.1/images/secondstoragetitle_icons.gif b/ui/2.1/images/secondstoragetitle_icons.gif deleted file mode 100644 index a81097d3859..00000000000 Binary files a/ui/2.1/images/secondstoragetitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/select_ipbg.gif b/ui/2.1/images/select_ipbg.gif deleted file mode 100644 index ee63b746a3c..00000000000 Binary files a/ui/2.1/images/select_ipbg.gif and /dev/null differ diff --git a/ui/2.1/images/select_ipbg_admin.gif b/ui/2.1/images/select_ipbg_admin.gif deleted file mode 100644 index c6d9ce15629..00000000000 Binary files a/ui/2.1/images/select_ipbg_admin.gif and /dev/null differ diff --git a/ui/2.1/images/serviceofftitle_icons.gif b/ui/2.1/images/serviceofftitle_icons.gif deleted file mode 100644 index 7c4d2ca8a8a..00000000000 Binary files a/ui/2.1/images/serviceofftitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/sgtitle_icons.gif b/ui/2.1/images/sgtitle_icons.gif deleted file mode 100644 index a3e9d9e6b0f..00000000000 Binary files a/ui/2.1/images/sgtitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/small_ppbot.png b/ui/2.1/images/small_ppbot.png deleted file mode 100644 index b87ca543930..00000000000 Binary files a/ui/2.1/images/small_ppbot.png and /dev/null differ diff --git a/ui/2.1/images/small_ppmid.png b/ui/2.1/images/small_ppmid.png deleted file mode 100644 index d0425860dec..00000000000 Binary files a/ui/2.1/images/small_ppmid.png and /dev/null differ diff --git a/ui/2.1/images/small_pptop.png b/ui/2.1/images/small_pptop.png deleted file mode 100644 index 75126a1edec..00000000000 Binary files a/ui/2.1/images/small_pptop.png and /dev/null differ diff --git a/ui/2.1/images/smenu_selectedbg.gif b/ui/2.1/images/smenu_selectedbg.gif deleted file mode 100644 index 849c8dc1797..00000000000 Binary files a/ui/2.1/images/smenu_selectedbg.gif and /dev/null differ diff --git a/ui/2.1/images/sprint.gif b/ui/2.1/images/sprint.gif deleted file mode 100644 index ede66282fb1..00000000000 Binary files a/ui/2.1/images/sprint.gif and /dev/null differ diff --git a/ui/2.1/images/sprite1.gif b/ui/2.1/images/sprite1.gif deleted file mode 100644 index b18c9836db2..00000000000 Binary files a/ui/2.1/images/sprite1.gif and /dev/null differ diff --git a/ui/2.1/images/srow_loading.png b/ui/2.1/images/srow_loading.png deleted file mode 100644 index 316ae7b0223..00000000000 Binary files a/ui/2.1/images/srow_loading.png and /dev/null differ diff --git a/ui/2.1/images/step1.png b/ui/2.1/images/step1.png deleted file mode 100644 index 723a4164e25..00000000000 Binary files a/ui/2.1/images/step1.png and /dev/null differ diff --git a/ui/2.1/images/step2.png b/ui/2.1/images/step2.png deleted file mode 100644 index 748be16e098..00000000000 Binary files a/ui/2.1/images/step2.png and /dev/null differ diff --git a/ui/2.1/images/step3.png b/ui/2.1/images/step3.png deleted file mode 100644 index f7b14579176..00000000000 Binary files a/ui/2.1/images/step3.png and /dev/null differ diff --git a/ui/2.1/images/step4.png b/ui/2.1/images/step4.png deleted file mode 100644 index da0f54ac53c..00000000000 Binary files a/ui/2.1/images/step4.png and /dev/null differ diff --git a/ui/2.1/images/stepbox_slected.gif b/ui/2.1/images/stepbox_slected.gif deleted file mode 100644 index cc9fd88f436..00000000000 Binary files a/ui/2.1/images/stepbox_slected.gif and /dev/null differ diff --git a/ui/2.1/images/stopped_icon.gif b/ui/2.1/images/stopped_icon.gif deleted file mode 100644 index a40bc75cbcd..00000000000 Binary files a/ui/2.1/images/stopped_icon.gif and /dev/null differ diff --git a/ui/2.1/images/stopped_vm.gif b/ui/2.1/images/stopped_vm.gif deleted file mode 100644 index 0dce0b1e830..00000000000 Binary files a/ui/2.1/images/stopped_vm.gif and /dev/null differ diff --git a/ui/2.1/images/storagetitle_icons.gif b/ui/2.1/images/storagetitle_icons.gif deleted file mode 100644 index a55e557d7e3..00000000000 Binary files a/ui/2.1/images/storagetitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/submenu_bg.gif b/ui/2.1/images/submenu_bg.gif deleted file mode 100644 index dabe86bbbf5..00000000000 Binary files a/ui/2.1/images/submenu_bg.gif and /dev/null differ diff --git a/ui/2.1/images/submenu_linkbg.gif b/ui/2.1/images/submenu_linkbg.gif deleted file mode 100644 index f37b9eb73f9..00000000000 Binary files a/ui/2.1/images/submenu_linkbg.gif and /dev/null differ diff --git a/ui/2.1/images/temp_centosicon.gif b/ui/2.1/images/temp_centosicon.gif deleted file mode 100644 index 48805d3e4d8..00000000000 Binary files a/ui/2.1/images/temp_centosicon.gif and /dev/null differ diff --git a/ui/2.1/images/temp_deleteicon.gif b/ui/2.1/images/temp_deleteicon.gif deleted file mode 100644 index c6329b71f24..00000000000 Binary files a/ui/2.1/images/temp_deleteicon.gif and /dev/null differ diff --git a/ui/2.1/images/temp_deleteicon_hover.gif b/ui/2.1/images/temp_deleteicon_hover.gif deleted file mode 100644 index 676b2227d94..00000000000 Binary files a/ui/2.1/images/temp_deleteicon_hover.gif and /dev/null differ diff --git a/ui/2.1/images/temp_editicon.gif b/ui/2.1/images/temp_editicon.gif deleted file mode 100644 index 10e6a71991c..00000000000 Binary files a/ui/2.1/images/temp_editicon.gif and /dev/null differ diff --git a/ui/2.1/images/temp_editicon_hover.gif b/ui/2.1/images/temp_editicon_hover.gif deleted file mode 100644 index c5b95ca416a..00000000000 Binary files a/ui/2.1/images/temp_editicon_hover.gif and /dev/null differ diff --git a/ui/2.1/images/temp_linuxicon.gif b/ui/2.1/images/temp_linuxicon.gif deleted file mode 100644 index 6308da3f8a0..00000000000 Binary files a/ui/2.1/images/temp_linuxicon.gif and /dev/null differ diff --git a/ui/2.1/images/temp_windowsicon.gif b/ui/2.1/images/temp_windowsicon.gif deleted file mode 100644 index a5e29ee3510..00000000000 Binary files a/ui/2.1/images/temp_windowsicon.gif and /dev/null differ diff --git a/ui/2.1/images/templatestitle_icons.gif b/ui/2.1/images/templatestitle_icons.gif deleted file mode 100644 index db8b1239683..00000000000 Binary files a/ui/2.1/images/templatestitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/test_icon.gif b/ui/2.1/images/test_icon.gif deleted file mode 100644 index 43d77f9b28e..00000000000 Binary files a/ui/2.1/images/test_icon.gif and /dev/null differ diff --git a/ui/2.1/images/tick_arrow.gif b/ui/2.1/images/tick_arrow.gif deleted file mode 100644 index e4f751b3feb..00000000000 Binary files a/ui/2.1/images/tick_arrow.gif and /dev/null differ diff --git a/ui/2.1/images/total_vm.gif b/ui/2.1/images/total_vm.gif deleted file mode 100644 index 170348e3814..00000000000 Binary files a/ui/2.1/images/total_vm.gif and /dev/null differ diff --git a/ui/2.1/images/tree_boxright.gif b/ui/2.1/images/tree_boxright.gif deleted file mode 100644 index 7b6e1c7c87e..00000000000 Binary files a/ui/2.1/images/tree_boxright.gif and /dev/null differ diff --git a/ui/2.1/images/tree_eventicon.gif b/ui/2.1/images/tree_eventicon.gif deleted file mode 100644 index 7dcbb0c636d..00000000000 Binary files a/ui/2.1/images/tree_eventicon.gif and /dev/null differ diff --git a/ui/2.1/images/tree_minusopen_icon.png b/ui/2.1/images/tree_minusopen_icon.png deleted file mode 100644 index e5103e46f59..00000000000 Binary files a/ui/2.1/images/tree_minusopen_icon.png and /dev/null differ diff --git a/ui/2.1/images/trusted_icon.gif b/ui/2.1/images/trusted_icon.gif deleted file mode 100644 index 93923ea404b..00000000000 Binary files a/ui/2.1/images/trusted_icon.gif and /dev/null differ diff --git a/ui/2.1/images/unknown_icon.gif b/ui/2.1/images/unknown_icon.gif deleted file mode 100644 index c08f3c0df2e..00000000000 Binary files a/ui/2.1/images/unknown_icon.gif and /dev/null differ diff --git a/ui/2.1/images/unsafebar_bg.gif b/ui/2.1/images/unsafebar_bg.gif deleted file mode 100644 index 2cea63a528d..00000000000 Binary files a/ui/2.1/images/unsafebar_bg.gif and /dev/null differ diff --git a/ui/2.1/images/untrusted_icon.gif b/ui/2.1/images/untrusted_icon.gif deleted file mode 100644 index de285df6370..00000000000 Binary files a/ui/2.1/images/untrusted_icon.gif and /dev/null differ diff --git a/ui/2.1/images/userlinks_bgleft.gif b/ui/2.1/images/userlinks_bgleft.gif deleted file mode 100644 index c77f366ed37..00000000000 Binary files a/ui/2.1/images/userlinks_bgleft.gif and /dev/null differ diff --git a/ui/2.1/images/userlinks_bgmid.gif b/ui/2.1/images/userlinks_bgmid.gif deleted file mode 100644 index 0b85c36ab18..00000000000 Binary files a/ui/2.1/images/userlinks_bgmid.gif and /dev/null differ diff --git a/ui/2.1/images/userlinks_bgright.gif b/ui/2.1/images/userlinks_bgright.gif deleted file mode 100644 index 766001b63af..00000000000 Binary files a/ui/2.1/images/userlinks_bgright.gif and /dev/null differ diff --git a/ui/2.1/images/userlogin_mid.gif b/ui/2.1/images/userlogin_mid.gif deleted file mode 100644 index 880f6f807b1..00000000000 Binary files a/ui/2.1/images/userlogin_mid.gif and /dev/null differ diff --git a/ui/2.1/images/v1_logo.gif b/ui/2.1/images/v1_logo.gif deleted file mode 100644 index 81fada98ed1..00000000000 Binary files a/ui/2.1/images/v1_logo.gif and /dev/null differ diff --git a/ui/2.1/images/v1_popupbuttonbg.gif b/ui/2.1/images/v1_popupbuttonbg.gif deleted file mode 100644 index 3e6a8a72fcd..00000000000 Binary files a/ui/2.1/images/v1_popupbuttonbg.gif and /dev/null differ diff --git a/ui/2.1/images/v1_popupbuttonbg_hover.gif b/ui/2.1/images/v1_popupbuttonbg_hover.gif deleted file mode 100644 index 3430a2ac560..00000000000 Binary files a/ui/2.1/images/v1_popupbuttonbg_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1_popupheaderbg.gif b/ui/2.1/images/v1_popupheaderbg.gif deleted file mode 100644 index 92d02281d22..00000000000 Binary files a/ui/2.1/images/v1_popupheaderbg.gif and /dev/null differ diff --git a/ui/2.1/images/v1_vmopoup_left.png b/ui/2.1/images/v1_vmopoup_left.png deleted file mode 100644 index 1c616826370..00000000000 Binary files a/ui/2.1/images/v1_vmopoup_left.png and /dev/null differ diff --git a/ui/2.1/images/v1_vmopoup_mid.png b/ui/2.1/images/v1_vmopoup_mid.png deleted file mode 100644 index 43ddfcb9402..00000000000 Binary files a/ui/2.1/images/v1_vmopoup_mid.png and /dev/null differ diff --git a/ui/2.1/images/v1_vmopoup_right.png b/ui/2.1/images/v1_vmopoup_right.png deleted file mode 100644 index 3b067b184db..00000000000 Binary files a/ui/2.1/images/v1_vmopoup_right.png and /dev/null differ diff --git a/ui/2.1/images/v1adddiskoff_button.gif b/ui/2.1/images/v1adddiskoff_button.gif deleted file mode 100644 index 4d5506665f8..00000000000 Binary files a/ui/2.1/images/v1adddiskoff_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1adddiskoff_button_hover.gif b/ui/2.1/images/v1adddiskoff_button_hover.gif deleted file mode 100644 index 24267e6b55b..00000000000 Binary files a/ui/2.1/images/v1adddiskoff_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1addhost_button.gif b/ui/2.1/images/v1addhost_button.gif deleted file mode 100644 index c9566d7ddd5..00000000000 Binary files a/ui/2.1/images/v1addhost_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1addhost_button_hover.gif b/ui/2.1/images/v1addhost_button_hover.gif deleted file mode 100644 index 87082da6abf..00000000000 Binary files a/ui/2.1/images/v1addhost_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1addiso_button.gif b/ui/2.1/images/v1addiso_button.gif deleted file mode 100644 index 93cee78fbe6..00000000000 Binary files a/ui/2.1/images/v1addiso_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1addiso_button_hover.gif b/ui/2.1/images/v1addiso_button_hover.gif deleted file mode 100644 index f3476b17e17..00000000000 Binary files a/ui/2.1/images/v1addiso_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1addloadbalncer_button.gif b/ui/2.1/images/v1addloadbalncer_button.gif deleted file mode 100644 index fbd857fbbe4..00000000000 Binary files a/ui/2.1/images/v1addloadbalncer_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1addloadbalncer_button_hover.gif b/ui/2.1/images/v1addloadbalncer_button_hover.gif deleted file mode 100644 index 647f92531ff..00000000000 Binary files a/ui/2.1/images/v1addloadbalncer_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1addnewvm_button.gif b/ui/2.1/images/v1addnewvm_button.gif deleted file mode 100644 index 3a32a1d917b..00000000000 Binary files a/ui/2.1/images/v1addnewvm_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1addnewvm_button_hover.gif b/ui/2.1/images/v1addnewvm_button_hover.gif deleted file mode 100644 index f8b4af87412..00000000000 Binary files a/ui/2.1/images/v1addnewvm_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1addpstorage_button.gif b/ui/2.1/images/v1addpstorage_button.gif deleted file mode 100644 index c3c101a73e6..00000000000 Binary files a/ui/2.1/images/v1addpstorage_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1addpstorage_button_hover.gif b/ui/2.1/images/v1addpstorage_button_hover.gif deleted file mode 100644 index 6d12fa1ac91..00000000000 Binary files a/ui/2.1/images/v1addpstorage_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1addserviceoff_button.gif b/ui/2.1/images/v1addserviceoff_button.gif deleted file mode 100644 index 2b3b130348f..00000000000 Binary files a/ui/2.1/images/v1addserviceoff_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1addserviceoff_button_hover.gif b/ui/2.1/images/v1addserviceoff_button_hover.gif deleted file mode 100644 index bffa4a4ac41..00000000000 Binary files a/ui/2.1/images/v1addserviceoff_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1addsggroup_button.gif b/ui/2.1/images/v1addsggroup_button.gif deleted file mode 100644 index ecc33ba69b6..00000000000 Binary files a/ui/2.1/images/v1addsggroup_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1addsggroup_button_hover.gif b/ui/2.1/images/v1addsggroup_button_hover.gif deleted file mode 100644 index 44387df6d58..00000000000 Binary files a/ui/2.1/images/v1addsggroup_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1addsstorage_button.gif b/ui/2.1/images/v1addsstorage_button.gif deleted file mode 100644 index b71a663fe79..00000000000 Binary files a/ui/2.1/images/v1addsstorage_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1addsstorage_button_hover.gif b/ui/2.1/images/v1addsstorage_button_hover.gif deleted file mode 100644 index 9209f1adadf..00000000000 Binary files a/ui/2.1/images/v1addsstorage_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1addtemplate_button.gif b/ui/2.1/images/v1addtemplate_button.gif deleted file mode 100644 index 287192b615d..00000000000 Binary files a/ui/2.1/images/v1addtemplate_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1addtemplate_button_hover.gif b/ui/2.1/images/v1addtemplate_button_hover.gif deleted file mode 100644 index a320ee12d48..00000000000 Binary files a/ui/2.1/images/v1addtemplate_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1addvolume_button.gif b/ui/2.1/images/v1addvolume_button.gif deleted file mode 100644 index ae4f0ceb09c..00000000000 Binary files a/ui/2.1/images/v1addvolume_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1addvolume_button_hover.gif b/ui/2.1/images/v1addvolume_button_hover.gif deleted file mode 100644 index 460a83c98ca..00000000000 Binary files a/ui/2.1/images/v1addvolume_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1admin_menutab_off.gif b/ui/2.1/images/v1admin_menutab_off.gif deleted file mode 100644 index 2b757c1c531..00000000000 Binary files a/ui/2.1/images/v1admin_menutab_off.gif and /dev/null differ diff --git a/ui/2.1/images/v1admin_menutab_off_hover.gif b/ui/2.1/images/v1admin_menutab_off_hover.gif deleted file mode 100644 index f0b9f6aa366..00000000000 Binary files a/ui/2.1/images/v1admin_menutab_off_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1admin_menutab_on.gif b/ui/2.1/images/v1admin_menutab_on.gif deleted file mode 100644 index c56118ce4aa..00000000000 Binary files a/ui/2.1/images/v1admin_menutab_on.gif and /dev/null differ diff --git a/ui/2.1/images/v1aquireip_button.gif b/ui/2.1/images/v1aquireip_button.gif deleted file mode 100644 index 4fdc845006b..00000000000 Binary files a/ui/2.1/images/v1aquireip_button.gif and /dev/null differ diff --git a/ui/2.1/images/v1aquireip_button_hover.gif b/ui/2.1/images/v1aquireip_button_hover.gif deleted file mode 100644 index 3dd879a574f..00000000000 Binary files a/ui/2.1/images/v1aquireip_button_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1grid_morebutton.gif b/ui/2.1/images/v1grid_morebutton.gif deleted file mode 100644 index 3d899794256..00000000000 Binary files a/ui/2.1/images/v1grid_morebutton.gif and /dev/null differ diff --git a/ui/2.1/images/v1grid_morebutton_hover.gif b/ui/2.1/images/v1grid_morebutton_hover.gif deleted file mode 100644 index 65ebfad406a..00000000000 Binary files a/ui/2.1/images/v1grid_morebutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1gridheader_bg.gif b/ui/2.1/images/v1gridheader_bg.gif deleted file mode 100644 index b15522f007d..00000000000 Binary files a/ui/2.1/images/v1gridheader_bg.gif and /dev/null differ diff --git a/ui/2.1/images/v1header_bg.gif b/ui/2.1/images/v1header_bg.gif deleted file mode 100644 index e48c586fdf0..00000000000 Binary files a/ui/2.1/images/v1header_bg.gif and /dev/null differ diff --git a/ui/2.1/images/v1menutab_off.gif b/ui/2.1/images/v1menutab_off.gif deleted file mode 100644 index c8dbd9a1453..00000000000 Binary files a/ui/2.1/images/v1menutab_off.gif and /dev/null differ diff --git a/ui/2.1/images/v1menutab_off_hover.gif b/ui/2.1/images/v1menutab_off_hover.gif deleted file mode 100644 index 3ea17eeaad5..00000000000 Binary files a/ui/2.1/images/v1menutab_off_hover.gif and /dev/null differ diff --git a/ui/2.1/images/v1menutab_on.gif b/ui/2.1/images/v1menutab_on.gif deleted file mode 100644 index c82b1de6ee2..00000000000 Binary files a/ui/2.1/images/v1menutab_on.gif and /dev/null differ diff --git a/ui/2.1/images/v1stepbox_slected.gif b/ui/2.1/images/v1stepbox_slected.gif deleted file mode 100644 index 2617ff7be1a..00000000000 Binary files a/ui/2.1/images/v1stepbox_slected.gif and /dev/null differ diff --git a/ui/2.1/images/v1stepcontainer_bg.gif b/ui/2.1/images/v1stepcontainer_bg.gif deleted file mode 100644 index 3ef5214786d..00000000000 Binary files a/ui/2.1/images/v1stepcontainer_bg.gif and /dev/null differ diff --git a/ui/2.1/images/vm_actionbg.gif b/ui/2.1/images/vm_actionbg.gif deleted file mode 100644 index b94e3e1b019..00000000000 Binary files a/ui/2.1/images/vm_actionbg.gif and /dev/null differ diff --git a/ui/2.1/images/vm_continuebutton.gif b/ui/2.1/images/vm_continuebutton.gif deleted file mode 100644 index 2f9585ae718..00000000000 Binary files a/ui/2.1/images/vm_continuebutton.gif and /dev/null differ diff --git a/ui/2.1/images/vm_continuebutton.png b/ui/2.1/images/vm_continuebutton.png deleted file mode 100644 index 3968a9fce69..00000000000 Binary files a/ui/2.1/images/vm_continuebutton.png and /dev/null differ diff --git a/ui/2.1/images/vm_continuebutton_hover.gif b/ui/2.1/images/vm_continuebutton_hover.gif deleted file mode 100644 index 48aea0b94ea..00000000000 Binary files a/ui/2.1/images/vm_continuebutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/vm_continuebutton_hover.png b/ui/2.1/images/vm_continuebutton_hover.png deleted file mode 100644 index 5d80cdef77a..00000000000 Binary files a/ui/2.1/images/vm_continuebutton_hover.png and /dev/null differ diff --git a/ui/2.1/images/vm_greenarrow.gif b/ui/2.1/images/vm_greenarrow.gif deleted file mode 100644 index 51d78e16ca2..00000000000 Binary files a/ui/2.1/images/vm_greenarrow.gif and /dev/null differ diff --git a/ui/2.1/images/vm_greyarrow.gif b/ui/2.1/images/vm_greyarrow.gif deleted file mode 100644 index f7c73f6bcf9..00000000000 Binary files a/ui/2.1/images/vm_greyarrow.gif and /dev/null differ diff --git a/ui/2.1/images/vm_redarrow.gif b/ui/2.1/images/vm_redarrow.gif deleted file mode 100644 index dd4dd90df24..00000000000 Binary files a/ui/2.1/images/vm_redarrow.gif and /dev/null differ diff --git a/ui/2.1/images/vmbot_loader.gif b/ui/2.1/images/vmbot_loader.gif deleted file mode 100644 index 5b33f7e54f4..00000000000 Binary files a/ui/2.1/images/vmbot_loader.gif and /dev/null differ diff --git a/ui/2.1/images/vmdropdown_closebutt.gif b/ui/2.1/images/vmdropdown_closebutt.gif deleted file mode 100644 index cadd5eb5837..00000000000 Binary files a/ui/2.1/images/vmdropdown_closebutt.gif and /dev/null differ diff --git a/ui/2.1/images/vmdropdown_closebutt_hover.gif b/ui/2.1/images/vmdropdown_closebutt_hover.gif deleted file mode 100644 index ab5fc7aefcc..00000000000 Binary files a/ui/2.1/images/vmdropdown_closebutt_hover.gif and /dev/null differ diff --git a/ui/2.1/images/vmopoup_left.png b/ui/2.1/images/vmopoup_left.png deleted file mode 100644 index e98a49d33ff..00000000000 Binary files a/ui/2.1/images/vmopoup_left.png and /dev/null differ diff --git a/ui/2.1/images/vmopoup_mid.png b/ui/2.1/images/vmopoup_mid.png deleted file mode 100644 index 6e4aeb4abc9..00000000000 Binary files a/ui/2.1/images/vmopoup_mid.png and /dev/null differ diff --git a/ui/2.1/images/vmopoup_right.png b/ui/2.1/images/vmopoup_right.png deleted file mode 100644 index 91d9f8dcc81..00000000000 Binary files a/ui/2.1/images/vmopoup_right.png and /dev/null differ diff --git a/ui/2.1/images/windowsconsole_icon.gif b/ui/2.1/images/windowsconsole_icon.gif deleted file mode 100644 index df33ac35d57..00000000000 Binary files a/ui/2.1/images/windowsconsole_icon.gif and /dev/null differ diff --git a/ui/2.1/images/windowsconsole_iconhover.gif b/ui/2.1/images/windowsconsole_iconhover.gif deleted file mode 100644 index 983ec3588db..00000000000 Binary files a/ui/2.1/images/windowsconsole_iconhover.gif and /dev/null differ diff --git a/ui/2.1/images/wizard_contentbg.gif b/ui/2.1/images/wizard_contentbg.gif deleted file mode 100644 index 0d402d79b3d..00000000000 Binary files a/ui/2.1/images/wizard_contentbg.gif and /dev/null differ diff --git a/ui/2.1/images/working_vm.gif b/ui/2.1/images/working_vm.gif deleted file mode 100644 index 8a2913b8230..00000000000 Binary files a/ui/2.1/images/working_vm.gif and /dev/null differ diff --git a/ui/2.1/images/yellow_statusbar.gif b/ui/2.1/images/yellow_statusbar.gif deleted file mode 100644 index 9a78eb5d256..00000000000 Binary files a/ui/2.1/images/yellow_statusbar.gif and /dev/null differ diff --git a/ui/2.1/images/zone_addicon.png b/ui/2.1/images/zone_addicon.png deleted file mode 100644 index da0dadb7f4b..00000000000 Binary files a/ui/2.1/images/zone_addicon.png and /dev/null differ diff --git a/ui/2.1/images/zone_addipbutton.gif b/ui/2.1/images/zone_addipbutton.gif deleted file mode 100644 index 0635e76fd08..00000000000 Binary files a/ui/2.1/images/zone_addipbutton.gif and /dev/null differ diff --git a/ui/2.1/images/zone_addipbutton_hover.gif b/ui/2.1/images/zone_addipbutton_hover.gif deleted file mode 100644 index 1b217051c4f..00000000000 Binary files a/ui/2.1/images/zone_addipbutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/zone_addpodbutton.gif b/ui/2.1/images/zone_addpodbutton.gif deleted file mode 100644 index c36db66f5b4..00000000000 Binary files a/ui/2.1/images/zone_addpodbutton.gif and /dev/null differ diff --git a/ui/2.1/images/zone_addpodbutton_hover.gif b/ui/2.1/images/zone_addpodbutton_hover.gif deleted file mode 100644 index ba6ba9c09b5..00000000000 Binary files a/ui/2.1/images/zone_addpodbutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/zone_addpubIP.gif b/ui/2.1/images/zone_addpubIP.gif deleted file mode 100644 index ccae60e4695..00000000000 Binary files a/ui/2.1/images/zone_addpubIP.gif and /dev/null differ diff --git a/ui/2.1/images/zone_addpubIP_hover.gif b/ui/2.1/images/zone_addpubIP_hover.gif deleted file mode 100644 index 879ff71040a..00000000000 Binary files a/ui/2.1/images/zone_addpubIP_hover.gif and /dev/null differ diff --git a/ui/2.1/images/zone_changeipbutton.gif b/ui/2.1/images/zone_changeipbutton.gif deleted file mode 100644 index 976274184dd..00000000000 Binary files a/ui/2.1/images/zone_changeipbutton.gif and /dev/null differ diff --git a/ui/2.1/images/zone_changeipbutton_hover.gif b/ui/2.1/images/zone_changeipbutton_hover.gif deleted file mode 100644 index e6f764f18f0..00000000000 Binary files a/ui/2.1/images/zone_changeipbutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/zone_deletebutton.gif b/ui/2.1/images/zone_deletebutton.gif deleted file mode 100644 index 596550b79b4..00000000000 Binary files a/ui/2.1/images/zone_deletebutton.gif and /dev/null differ diff --git a/ui/2.1/images/zone_deletebutton_hover.gif b/ui/2.1/images/zone_deletebutton_hover.gif deleted file mode 100644 index 3c97cc04531..00000000000 Binary files a/ui/2.1/images/zone_deletebutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/zone_detailsboxleft.gif b/ui/2.1/images/zone_detailsboxleft.gif deleted file mode 100644 index 2ce6fe5a896..00000000000 Binary files a/ui/2.1/images/zone_detailsboxleft.gif and /dev/null differ diff --git a/ui/2.1/images/zone_detailsboxmid.gif b/ui/2.1/images/zone_detailsboxmid.gif deleted file mode 100644 index ee2c1cc7216..00000000000 Binary files a/ui/2.1/images/zone_detailsboxmid.gif and /dev/null differ diff --git a/ui/2.1/images/zone_detailsboxright.gif b/ui/2.1/images/zone_detailsboxright.gif deleted file mode 100644 index f1387fbca91..00000000000 Binary files a/ui/2.1/images/zone_detailsboxright.gif and /dev/null differ diff --git a/ui/2.1/images/zone_directipbutton.gif b/ui/2.1/images/zone_directipbutton.gif deleted file mode 100644 index 33b6921677a..00000000000 Binary files a/ui/2.1/images/zone_directipbutton.gif and /dev/null differ diff --git a/ui/2.1/images/zone_directipbutton_hover.gif b/ui/2.1/images/zone_directipbutton_hover.gif deleted file mode 100644 index 89ae721c238..00000000000 Binary files a/ui/2.1/images/zone_directipbutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/zone_directipicon.png b/ui/2.1/images/zone_directipicon.png deleted file mode 100644 index 384b7fc9cf2..00000000000 Binary files a/ui/2.1/images/zone_directipicon.png and /dev/null differ diff --git a/ui/2.1/images/zone_editpodbutton.gif b/ui/2.1/images/zone_editpodbutton.gif deleted file mode 100644 index 0485cc0c72e..00000000000 Binary files a/ui/2.1/images/zone_editpodbutton.gif and /dev/null differ diff --git a/ui/2.1/images/zone_editpodbutton_hover.gif b/ui/2.1/images/zone_editpodbutton_hover.gif deleted file mode 100644 index 7908f92efef..00000000000 Binary files a/ui/2.1/images/zone_editpodbutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/zone_editzonebutton.gif b/ui/2.1/images/zone_editzonebutton.gif deleted file mode 100644 index 8ceef082705..00000000000 Binary files a/ui/2.1/images/zone_editzonebutton.gif and /dev/null differ diff --git a/ui/2.1/images/zone_editzonebutton_hover.gif b/ui/2.1/images/zone_editzonebutton_hover.gif deleted file mode 100644 index 4d5e314218e..00000000000 Binary files a/ui/2.1/images/zone_editzonebutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/zone_enablefirewallbutton.gif b/ui/2.1/images/zone_enablefirewallbutton.gif deleted file mode 100644 index f84482a97b3..00000000000 Binary files a/ui/2.1/images/zone_enablefirewallbutton.gif and /dev/null differ diff --git a/ui/2.1/images/zone_enablefirewallbutton_hover.gif b/ui/2.1/images/zone_enablefirewallbutton_hover.gif deleted file mode 100644 index 2f513f8a4bc..00000000000 Binary files a/ui/2.1/images/zone_enablefirewallbutton_hover.gif and /dev/null differ diff --git a/ui/2.1/images/zone_ipicon.png b/ui/2.1/images/zone_ipicon.png deleted file mode 100644 index cb54d2e05ff..00000000000 Binary files a/ui/2.1/images/zone_ipicon.png and /dev/null differ diff --git a/ui/2.1/images/zone_openarrow.png b/ui/2.1/images/zone_openarrow.png deleted file mode 100644 index 90b59cea46b..00000000000 Binary files a/ui/2.1/images/zone_openarrow.png and /dev/null differ diff --git a/ui/2.1/images/zone_podicon.png b/ui/2.1/images/zone_podicon.png deleted file mode 100644 index 5f881f42095..00000000000 Binary files a/ui/2.1/images/zone_podicon.png and /dev/null differ diff --git a/ui/2.1/images/zone_sidearrow.png b/ui/2.1/images/zone_sidearrow.png deleted file mode 100644 index cc699f5f9ba..00000000000 Binary files a/ui/2.1/images/zone_sidearrow.png and /dev/null differ diff --git a/ui/2.1/images/zone_zoneicon.png b/ui/2.1/images/zone_zoneicon.png deleted file mode 100644 index 176dbe73217..00000000000 Binary files a/ui/2.1/images/zone_zoneicon.png and /dev/null differ diff --git a/ui/2.1/images/zonedetails_left.gif b/ui/2.1/images/zonedetails_left.gif deleted file mode 100644 index 9468241941c..00000000000 Binary files a/ui/2.1/images/zonedetails_left.gif and /dev/null differ diff --git a/ui/2.1/images/zonedetails_mid.gif b/ui/2.1/images/zonedetails_mid.gif deleted file mode 100644 index ba91d7f2a75..00000000000 Binary files a/ui/2.1/images/zonedetails_mid.gif and /dev/null differ diff --git a/ui/2.1/images/zonedetails_right.gif b/ui/2.1/images/zonedetails_right.gif deleted file mode 100644 index c2ffdae5ab0..00000000000 Binary files a/ui/2.1/images/zonedetails_right.gif and /dev/null differ diff --git a/ui/2.1/images/zonestitle_icons.gif b/ui/2.1/images/zonestitle_icons.gif deleted file mode 100644 index 2ba29142a7d..00000000000 Binary files a/ui/2.1/images/zonestitle_icons.gif and /dev/null differ diff --git a/ui/2.1/images/zonetree_addbutton.jpg b/ui/2.1/images/zonetree_addbutton.jpg deleted file mode 100644 index 3077137c8e2..00000000000 Binary files a/ui/2.1/images/zonetree_addbutton.jpg and /dev/null differ diff --git a/ui/2.1/images/zonetree_blankbutton.jpg b/ui/2.1/images/zonetree_blankbutton.jpg deleted file mode 100644 index 027ece40675..00000000000 Binary files a/ui/2.1/images/zonetree_blankbutton.jpg and /dev/null differ diff --git a/ui/2.1/images/zonetree_left.gif b/ui/2.1/images/zonetree_left.gif deleted file mode 100644 index 45e920ec124..00000000000 Binary files a/ui/2.1/images/zonetree_left.gif and /dev/null differ diff --git a/ui/2.1/images/zonetree_mid.gif b/ui/2.1/images/zonetree_mid.gif deleted file mode 100644 index 958dde53abb..00000000000 Binary files a/ui/2.1/images/zonetree_mid.gif and /dev/null differ diff --git a/ui/2.1/images/zonetree_nonselectedbutton.jpg b/ui/2.1/images/zonetree_nonselectedbutton.jpg deleted file mode 100644 index cc4a8aba03f..00000000000 Binary files a/ui/2.1/images/zonetree_nonselectedbutton.jpg and /dev/null differ diff --git a/ui/2.1/images/zonetree_right.gif b/ui/2.1/images/zonetree_right.gif deleted file mode 100644 index f115a3cd3f5..00000000000 Binary files a/ui/2.1/images/zonetree_right.gif and /dev/null differ diff --git a/ui/2.1/images/zonetree_selectedbutton.jpg b/ui/2.1/images/zonetree_selectedbutton.jpg deleted file mode 100644 index a3a0c5c2992..00000000000 Binary files a/ui/2.1/images/zonetree_selectedbutton.jpg and /dev/null differ diff --git a/ui/2.1/index.jsp b/ui/2.1/index.jsp deleted file mode 100755 index dc68a470ba8..00000000000 --- a/ui/2.1/index.jsp +++ /dev/null @@ -1,182 +0,0 @@ -<%@ page import="java.util.Date" %> - -<% -long milliseconds = new Date().getTime(); -%> - - - - - - - - - - - cloud.com - User Console - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cloud.com CloudStack - - - - -
-
- - - - - - - - - -
- - - - - - - - - -
- - diff --git a/ui/2.1/jsp/tab_accounts.jsp b/ui/2.1/jsp/tab_accounts.jsp deleted file mode 100755 index 8bd1bb882b8..00000000000 --- a/ui/2.1/jsp/tab_accounts.jsp +++ /dev/null @@ -1,214 +0,0 @@ -<%@ page import="java.util.Date" %> -<% -long milliseconds = new Date().getTime(); -%> - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/2.1/jsp/tab_configuration.jsp b/ui/2.1/jsp/tab_configuration.jsp deleted file mode 100755 index c9f574702fc..00000000000 --- a/ui/2.1/jsp/tab_configuration.jsp +++ /dev/null @@ -1,973 +0,0 @@ -<%@ page import="java.util.Date" %> -<% -long milliseconds = new Date().getTime(); -%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/2.1/jsp/tab_dashboard.jsp b/ui/2.1/jsp/tab_dashboard.jsp deleted file mode 100755 index a4c5531a75e..00000000000 --- a/ui/2.1/jsp/tab_dashboard.jsp +++ /dev/null @@ -1,535 +0,0 @@ - -
-
-
-

- Loading...

-
- - - - - - - - diff --git a/ui/2.1/jsp/tab_domains.jsp b/ui/2.1/jsp/tab_domains.jsp deleted file mode 100755 index 5a9ceb6bfa3..00000000000 --- a/ui/2.1/jsp/tab_domains.jsp +++ /dev/null @@ -1,146 +0,0 @@ -<%@ page import="java.util.Date" %> -<% -long milliseconds = new Date().getTime(); -%> - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/2.1/jsp/tab_events.jsp b/ui/2.1/jsp/tab_events.jsp deleted file mode 100755 index e83a0bed7ac..00000000000 --- a/ui/2.1/jsp/tab_events.jsp +++ /dev/null @@ -1,379 +0,0 @@ -<%@ page import="java.util.Date" %> -<% -long milliseconds = new Date().getTime(); -%> - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/2.1/jsp/tab_hosts.jsp b/ui/2.1/jsp/tab_hosts.jsp deleted file mode 100755 index 3e0eb71ae30..00000000000 --- a/ui/2.1/jsp/tab_hosts.jsp +++ /dev/null @@ -1,319 +0,0 @@ -<%@ page import="java.util.Date" %> -<% -long milliseconds = new Date().getTime(); -%> - - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/2.1/jsp/tab_instances.jsp b/ui/2.1/jsp/tab_instances.jsp deleted file mode 100755 index 08ab3d572eb..00000000000 --- a/ui/2.1/jsp/tab_instances.jsp +++ /dev/null @@ -1,1725 +0,0 @@ -<%@ page import="java.util.Date" %> -<% -long milliseconds = new Date().getTime(); -%> - - - - - - - - - - - - - - - - - -
-
-
-
- -
-
- - - - - - - - -
-
    -
-
-
    -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/2.1/jsp/tab_networking.jsp b/ui/2.1/jsp/tab_networking.jsp deleted file mode 100755 index 714e60c30c9..00000000000 --- a/ui/2.1/jsp/tab_networking.jsp +++ /dev/null @@ -1,890 +0,0 @@ -<%@ page import="java.util.Date" %> -<% -long milliseconds = new Date().getTime(); -%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/2.1/jsp/tab_storage.jsp b/ui/2.1/jsp/tab_storage.jsp deleted file mode 100755 index f84a9405cde..00000000000 --- a/ui/2.1/jsp/tab_storage.jsp +++ /dev/null @@ -1,1534 +0,0 @@ -<%@ page import="java.util.Date" %> -<% -long milliseconds = new Date().getTime(); -%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/2.1/jsp/tab_templates.jsp b/ui/2.1/jsp/tab_templates.jsp deleted file mode 100755 index 6582623dc18..00000000000 --- a/ui/2.1/jsp/tab_templates.jsp +++ /dev/null @@ -1,694 +0,0 @@ -<%@ page import="java.util.Date" %> -<% -long milliseconds = new Date().getTime(); -%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/2.1/scripts/cloud.core.accounts.js b/ui/2.1/scripts/cloud.core.accounts.js deleted file mode 100644 index 7fb78fc5a43..00000000000 --- a/ui/2.1/scripts/cloud.core.accounts.js +++ /dev/null @@ -1,322 +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 . - * - */ - -// Version: @VERSION@ - -function showAccountsTab(domainId) { - var systemAccountId = 1; - var adminAccountId = 2; - - activateDialog($("#dialog_resource_limits").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_disable_account").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - function updateResourceLimit(domainId, account, type, max) { - $.ajax({ - data: createURL("command=updateResourceLimit&domainid="+domainId+"&account="+account+"&resourceType="+type+"&max="+max+"&response=json"), - dataType: "json", - success: function(json) { - } - }); - } - - $("#account_template #account_enable").bind("click", function(event) { - var accountId = $(this).data("accountId"); - var template = $("#account"+accountId); - var accountName = template.data("accountName"); - var domainId = template.data("domainId"); - - $("#dialog_confirmation") - .html("

Please confirm you want to enable account: " + accountName + "

") - .dialog('option', 'buttons', { - "Yes": function() { - $(this).dialog("close"); - $.ajax({ - data: createURL("command=enableAccount&account="+accountName+"&domainId="+domainId+"&response=json"), - dataType: "json", - success: function(json) { - template.find("#account_state").text("enabled"); - template.find("#account_enable_container").hide(); - template.find("#account_disable_container").show(); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - - return false; //event.preventDefault() + event.stopPropagation() - }); - - $("#account_template #account_disable").bind("click", function(event) { - var accountId = $(this).data("accountId"); - var template = $("#account"+accountId); - var accountName = template.data("accountName"); - var domainId = template.data("domainId"); - - var dialogDisableAccount = $("#dialog_disable_account"); - dialogDisableAccount.find("#change_state_type").val("disable"); - - dialogDisableAccount - .dialog('option', 'buttons', { - "Save": function() { - dialogDisableAccount.dialog("close"); - if(dialogDisableAccount.find("#change_state_type").val()=="disable") { //disable the account - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#account_body"); - loadingImg.find(".adding_text").text("Disabling...."); - loadingImg.show(); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=disableAccount&account="+accountName+"&domainId="+domainId+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.disableaccountresponse.jobid; - var timerKey = "disableAccountJob"+jobId; - - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.disableaccountresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - template.find("#account_state").text("disabled"); - template.find("#account_disable_container").hide(); - template.find("#account_enable_container").show(); - loadingImg.hide(); - rowContainer.show(); - } else if (result.jobstatus == 2) { - $("#dialog_alert").html("

" + fromdb(result.jobresult) + "

").dialog("open"); - loadingImg.hide(); - rowContainer.show(); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - } - else { //lock the account - if(template.find("#account_state").text() == "locked") //if the state is locked already, do nothing. - return; - $.ajax({ - data: createURL("command=lockAccount&account="+accountName+"&domainId="+domainId+"&response=json"), - dataType: "json", - success: function(json) { - template.find("#account_state").text("locked"); - template.find("#account_enable_container").show(); - } - }); - } - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - - return false; //event.preventDefault() + event.stopPropagation() - }); - - function accountJSONToTemplate(json, template) { - (index++ % 2 == 0)? template.addClass("smallrow_even"): template.addClass("smallrow_odd"); - var accountId = json.id; - var accountName = json.name; - var domainId = json.domainid; - template.attr("id", "account"+accountId).data("accountId", accountId).data("accountName", fromdb(accountName)).data("domainId", fromdb(domainId)); - - template.find("#account_role").text(toRole(json.accounttype)); - template.find("#account_accountid").text(json.id); - template.find("#account_accountname").text(accountName); - template.find("#account_domain").text(json.domain); - template.find("#account_vms_link").text(json.vmtotal); - template.find("#account_ips_link").text(json.iptotal); - template.find("#account_received").text(convertBytes(json.receivedbytes)); - template.find("#account_sent").text(convertBytes(json.sentbytes)); - template.find("#account_state").text(json.state); - - template.find("#account_vms_link").bind("click", function(event) { - $("#menutab_vm").data("domainId", domainId).data("account", accountName).click(); - return false; //event.preventDefault() + event.stopPropagation() - }); - - template.find("#account_ips_link").bind("click", function(event) { - $("#menutab_networking").data("domainId", domainId).data("account", accountName).click(); - return false; //event.preventDefault() + event.stopPropagation() - }); - - if(accountId == systemAccountId || accountId == adminAccountId) - template.find("#action_links").hide(); - - if(json.state == "enabled") - template.find("#account_enable_container").hide(); - else if(json.state == "disabled") - template.find("#account_disable_container").hide(); - - template.find("#account_enable, #account_disable").data("accountId", accountId); - - if (json.accounttype == roleTypeUser || json.accounttype == roleTypeDomainAdmin) { - template.find("#account_resource_limits_container").show(); - var that = template; - template.find("#account_resource_limits").bind("click", function() { - var domainId = that.data("domainId"); - var account = that.data("accountName"); - $.ajax({ - cache: false, - data: createURL("command=listResourceLimits&domainid="+domainId+"&account="+account+"&response=json"), - dataType: "json", - success: function(json) { - var limits = json.listresourcelimitsresponse.resourcelimit; - var preInstanceLimit, preIpLimit, preDiskLimit, preSnapshotLimit, preTemplateLimit = -1; - if (limits != null) { - for (var i = 0; i < limits.length; i++) { - var limit = limits[i]; - switch (limit.resourcetype) { - case "0": - preInstanceLimit = limit.max; - $("#dialog_resource_limits #limits_vm").val(limit.max); - break; - case "1": - preIpLimit = limit.max; - $("#dialog_resource_limits #limits_ip").val(limit.max); - break; - case "2": - preDiskLimit = limit.max; - $("#dialog_resource_limits #limits_volume").val(limit.max); - break; - case "3": - preSnapshotLimit = limit.max; - $("#dialog_resource_limits #limits_snapshot").val(limit.max); - break; - case "4": - preTemplateLimit = limit.max; - $("#dialog_resource_limits #limits_template").val(limit.max); - break; - } - } - } - $("#dialog_resource_limits") - .dialog('option', 'buttons', { - "Save": function() { - // validate values - var isValid = true; - isValid &= validateNumber("Instance Limit", $("#dialog_resource_limits #limits_vm"), $("#dialog_resource_limits #limits_vm_errormsg"), -1, 32000, false); - isValid &= validateNumber("Public IP Limit", $("#dialog_resource_limits #limits_ip"), $("#dialog_resource_limits #limits_ip_errormsg"), -1, 32000, false); - isValid &= validateNumber("Disk Volume Limit", $("#dialog_resource_limits #limits_volume"), $("#dialog_resource_limits #limits_volume_errormsg"), -1, 32000, false); - isValid &= validateNumber("Snapshot Limit", $("#dialog_resource_limits #limits_snapshot"), $("#dialog_resource_limits #limits_snapshot_errormsg"), -1, 32000, false); - isValid &= validateNumber("Template Limit", $("#dialog_resource_limits #limits_template"), $("#dialog_resource_limits #limits_template_errormsg"), -1, 32000, false); - if (!isValid) return; - - var instanceLimit = trim($("#dialog_resource_limits #limits_vm").val()); - var ipLimit = trim($("#dialog_resource_limits #limits_ip").val()); - var diskLimit = trim($("#dialog_resource_limits #limits_volume").val()); - var snapshotLimit = trim($("#dialog_resource_limits #limits_snapshot").val()); - var templateLimit = trim($("#dialog_resource_limits #limits_template").val()); - - $(this).dialog("close"); - if (instanceLimit != preInstanceLimit) { - updateResourceLimit(domainId, account, 0, instanceLimit); - } - if (ipLimit != preIpLimit) { - updateResourceLimit(domainId, account, 1, ipLimit); - } - if (diskLimit != preDiskLimit) { - updateResourceLimit(domainId, account, 2, diskLimit); - } - if (snapshotLimit != preSnapshotLimit) { - updateResourceLimit(domainId, account, 3, snapshotLimit); - } - if (templateLimit != preTemplateLimit) { - updateResourceLimit(domainId, account, 4, templateLimit); - } - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - } - }); - return false; - }); - } else { - template.find("#account_resource_limits_container").hide(); - } - } - - function listAccounts() { - var submenuContent = $("#submenu_content_account"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var role = submenuContent.find("#advanced_search #adv_search_role").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(name)); - if (trim(role).length > 0) - moreCriteria.push("&accounttype="+role); - commandString = "command=listAccounts&page="+currentPage+moreCriteria.join("")+"&response=json"; - } else { - var moreCriteria = []; - if(domainId!=null) - moreCriteria.push("&domainid="+domainId); - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listAccounts&page="+currentPage+moreCriteria.join("")+"&keyword="+searchInput+"&response=json" - else - commandString = "command=listAccounts&page="+currentPage+moreCriteria.join("")+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listaccountsresponse", "account", $("#account_template"), accountJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_account"), listAccounts); - - var index; - currentPage = 1; - listAccounts(); -} diff --git a/ui/2.1/scripts/cloud.core.callbacks.js b/ui/2.1/scripts/cloud.core.callbacks.js deleted file mode 100644 index a97bf969d48..00000000000 --- a/ui/2.1/scripts/cloud.core.callbacks.js +++ /dev/null @@ -1,91 +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 . - * - */ - -// Version: @VERSION@ - -/* -This file is meant to help with implementing single signon integration. If you are using the -cloud.com default UI, there is no need to touch this file. -*/ - -/* -This callback function is called when either the session has timed out for the user, -the session ID has been changed (i.e. another user logging into the UI via a different tab), -or it's the first time the user has come to this page. -*/ -function onLogoutCallback() { - // Returning true means the LOGIN page will be show. If you wish to redirect the user - // to different login page, this is where you would do that. - return true; -} - -/* -For single signon purposes, you should set the following cookies so that the UI does not force a logout. - -JSESSIONID : jsessionid generated by the mgmt server -username : username -role : 0 = User, 1 = ROOT Admin, 2 = Domain Admin -domainid: domainid - -All values can be retrieved by making a successful AJAX login call to the mgmt server. - -If you cannot set these cookies before redirecting to this mgmt UI. You can uncomment the code -below and as long as you can retrieve the username, password, and domain in another manner (i.e. through -a querystring), you can execute the login command below. -*/ - -/* -$(document).ready(function() { - //var username = encodeURIComponent($("#account_username").val()); - //var password = encodeURIComponent($("#account_password").val()); - //var domain = encodeURIComponent($("#account_domain").val()); - //var url = "/client/api?command=login&username="+username+"&password="+password+"&domain="+domain+"&response=json"; - - // Test URL - var url = "/client/api?command=login&username=admin&password=password&domain=ROOT&response=json"; - $.ajax({ - url: url, - dataType: "json", - async: false, - success: function(json) { - $.cookie('username', json.loginresponse.username); - $.cookie('role', json.loginresponse.type); - $.cookie('networktype', json.loginresponse.networktype); - $.cookie('hypervisortype', json.loginresponse.hypervisortype); - $.cookie('domainid', '1'); //e.g. domainid of ROOT domain is 1 - $.cookie('account', json.loginresponse.account); - $.cookie('directattachnetworkgroupsenabled', json.loginresponse.directattachnetworkgroupsenabled); - $.cookie('directattacheduntaggedenabled', json.loginresponse.directattacheduntaggedenabled); - - $.cookie('timezoneoffset', null); //comment this line and uncomment the next line if you want to set a specific timezone offset. Otherwise, default timezone from browser will be used. - //$.cookie('timezoneoffset', '5.75'); //e.g. Timezone "Kathmandu" is 'UTC+05:45'. Thus, its timezoneoffset is '5.75' - - $.cookie('timezone', null); //comment this line and uncomment the next line if you want to set a specific timezone. This value is used for any default timezone dropdown - //$.cookie('timezone', 'America/Los_Angeles'); - }, - error: function() { - // This means the login failed. You should redirect to your login page. - }, - beforeSend: function(XMLHttpRequest) { - return true; - } - }); -}); -*/ - - diff --git a/ui/2.1/scripts/cloud.core.configuration.js b/ui/2.1/scripts/cloud.core.configuration.js deleted file mode 100644 index 8ce89c430a2..00000000000 --- a/ui/2.1/scripts/cloud.core.configuration.js +++ /dev/null @@ -1,1734 +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 . - * - */ - -// Version: @VERSION@ - -function showConfigurationTab() { - var forceLogout = true; // We force a logout only if the user has first added a POD for the very first time - var currentSubMenu = $("#submenu_global"); - - activateDialog($("#dialog_edit_global").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - $("#global_template").bind("click", function(event) { - var template = $(this); - var link = $(event.target); - var linkAction = link.attr("id"); - var name = template.data("name"); - switch (linkAction) { - case "global_action_edit" : - $("#edit_global_name").text(name); - $("#edit_global_value").val(template.find("#global_value").text()); - - $("#dialog_edit_global") - .dialog('option', 'buttons', { - "Confirm": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Value", thisDialog.find("#edit_global_value"), thisDialog.find("#edit_global_value_errormsg"), true); - if (!isValid) return; - - var value = trim(thisDialog.find("#edit_global_value").val()); - - thisDialog.dialog("close"); - $.ajax({ - data: createURL("command=updateConfiguration&name="+todb(name)+"&value="+todb(value)+"&response=json"), - dataType: "json", - success: function(json) { - template.find("#global_value").text(value); - $("#dialog_alert").html("

PLEASE RESTART YOUR MGMT SERVER!!
PLEASE RESTART YOUR MGMT SERVER!!

You have successfully change a global configuration value. Please RESTART your management server for your new settings to take effect. Refer to the install guide for instructions on how to restart the mgmt server.

").dialog("open"); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - } - return false; - }); - - function globalJSONToTemplate(json, template) { - template.data("name", fromdb(json.name)).attr("id", "global_"+fromdb(json.name)); - (index++ % 2 == 0)? template.addClass("smallrow_even"): template.addClass("smallrow_odd"); - template.find("#global_name").text(fromdb(json.name)); - template.find("#global_value").text(fromdb(json.value)); - template.find("#global_desc").text(fromdb(json.description)); - } - - $("#submenu_content_global .grid_container .grid_header .grid_genheader_cell").bind("click", function(event) { - var headerColumn = $(this); - var sortingIcon = headerColumn.find(".gridsorting_arrow"); - - if (sortingIcon.hasClass("up") == false) { //If it's not in ascending order, sort it ascending. - $("#submenu_content_global .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first - sortingIcon.addClass("up"); //add up arrow to this specific header column - sortingOrder = "asc"; - } - else if (sortingIcon.hasClass("up") == true) { //If it's in ascending order, sort it descending. - $("#submenu_content_global .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first - sortingIcon.addClass("down"); //add down arrow to this specific header column - sortingOrder = "desc"; - } - - switch(headerColumn[0].id) { - case "name_header": - sortBy = "name"; - items.sort(sortArrayAlphabetically); - break; - case "value_header": - sortBy = "value"; - items.sort(sortArrayAlphabetically); - break; - case "description_header": - sortBy = "description"; - items.sort(sortArrayAlphabetically); - break; - } - - drawGrid(items, $("#submenu_content_global"), $("#global_template"), globalJSONToTemplate); - return false; - }); - - function listConfigurations() { - var submenuContent = $("#submenu_content_global"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(name)); - commandString = "command=listConfigurations&page="+currentPage+moreCriteria.join("")+"&response=json"; - } else { - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listConfigurations&page="+currentPage+"&keyword="+searchInput+"&response=json"; - else - commandString = "command=listConfigurations&page="+currentPage+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listconfigurationsresponse", "configuration", $("#global_template"), globalJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_global"), listConfigurations); - - $("#submenu_global").bind("click", function(event) { - event.preventDefault(); - - $(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off"); - currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on"); - currentSubMenu = $(this); - var submenuContent = $("#submenu_content_global").show(); - $("#submenu_content_zones, #submenu_content_service, #submenu_content_disk").hide(); - - currentPage = 1; - listConfigurations(); - }); - - - //zone - var rightPanel = $("#submenu_content_zones #right_panel_detail_title"); - var rightContent = $("#submenu_content_zones #right_panel_detail_content"); - - function clearRightPanel() { - rightPanel.empty(); - rightContent.empty(); - $("#submenu_content_zones").find("#action_edit_zone, #action_add_pod, #action_edit_pod, #action_add_publicip_vlan, #action_add_directip_vlan, #action_delete").hide(); - } - - function zoneObjectToRightPanel(obj) { - rightPanel.html("Zone: "+fromdb(obj.name)); - var rightContentHtml = - "

ZONE: "+fromdb(obj.name)+"

" - + "

DNS 1: "+obj.dns1+"

" - + "

DNS 2: "+((obj.dns2 == null) ? "" : obj.dns2) +"

" - + "

Internal DNS 1: "+obj.internaldns1+"

" - + "

Internal DNS 2: "+((obj.internaldns2 == null) ? "" : obj.internaldns2) +"

"; - if (getNetworkType() != "vnet") - rightContentHtml += "

VLAN: "+((obj.vlan == null) ? "" : obj.vlan) +"

"; - rightContentHtml += "

Guest CIDR: "+obj.guestcidraddress+"

"; - - rightContent.data("id", obj.id).html(rightContentHtml); - - $("#submenu_content_zones").find("#action_edit_pod, #action_add_directip_vlan").hide(); - - var buttons = $("#submenu_content_zones #action_delete, #submenu_content_zones #action_edit_zone, #submenu_content_zones #action_add_pod, #submenu_content_zones #action_add_publicip_vlan").data("type", "zone").show(); - buttons.data("id", obj.id); - buttons.data("name", obj.name); - buttons.data("dns1", obj.dns1); - buttons.data("dns2", obj.dns2); - buttons.data("internaldns1", obj.internaldns1); - buttons.data("internaldns2", obj.internaldns2); - buttons.data("vlan", obj.vlan); - buttons.data("guestcidraddress", obj.guestcidraddress); - } - - function podObjectToRightPanel(obj) { - rightPanel.html("Pod: " + fromdb(obj.name)); - - var rightContentHtml = - "

POD: "+fromdb(obj.name)+"

" - + "

Private CIDR: "+obj.cidr+"

" - + "

Private IP Range: "+obj.ipRange+"

" - + "

Gateway: "+obj.gateway+"

"; - - rightContent.data("id", obj.id).html(rightContentHtml); - - $("#submenu_content_zones").find("#action_edit_zone, #action_add_pod, #action_add_publicip_vlan").hide(); - var buttons = $("#submenu_content_zones").find("#action_delete, #action_edit_pod").data("type", "pod").show(); - buttons.data("id", obj.id); - buttons.data("zoneid", obj.zoneid); - buttons.data("name", obj.name); - buttons.data("cidr", obj.cidr); - buttons.data("startip", obj.startip); - buttons.data("endip", obj.endip); - buttons.data("ipRange", obj.ipRange); - buttons.data("gateway", obj.gateway); - if (getDirectAttachUntaggedEnabled() == "true") { - $("#submenu_content_zones #action_add_directip_vlan").data("type", "pod").data("id", obj.id).data("name", obj.name).data("zoneid", obj.zoneid).show(); - } - } - - $("#submenu_content_zones #action_delete").bind("click", function(event) { - var deleteButton = $(this); - - var confirmMessage = null; - var id = deleteButton.data("id"); - var type = deleteButton.data("type"); - var command = null; - if (type == "zone") { - confirmMessage = "Please confirm you want to delete the zone : " + deleteButton.data("name") +""; - command = "deleteZone"; - } else if (type == "pod") { - confirmMessage = "Please confirm you want to delete the pod : " + deleteButton.data("name") + ""; - command = "deletePod" - } else { - confirmMessage = "Please confirm you want to delete the public vlan IP range : " + deleteButton.data("name") + ""; - command = "deleteVlanIpRange"; - } - - $("#dialog_confirmation") - .html(confirmMessage) - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - - $.ajax({ - data: createURL("command="+command+"&id="+id+"&response=json"), - dataType: "json", - success: function(json) { - var target = null; - if (type == "zone") { - target = $("#submenu_content_zones #zone_" + id); - } else if (type == "pod") { - target = $("#submenu_content_zones #pod_" + id); - } else { - target = $("#submenu_content_zones #publicip_range_" + id); - } - target.fadeOut("slow", function() { - $(this).remove(); - }); - rightPanel.empty(); - rightContent.empty(); - $("#submenu_content_zones #action_delete").hide(); - } - }); - - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - }); - - $("#submenu_content_zones #action_edit_zone").bind("click", function(event) { - var id = $(this).data("id"); - - var dialogEditZone = $("#dialog_edit_zone"); - dialogEditZone.find("#edit_zone_name").val($(this).data("name")); - dialogEditZone.find("#edit_zone_dns1").val($(this).data("dns1")); - dialogEditZone.find("#edit_zone_dns2").val($(this).data("dns2")); - dialogEditZone.find("#edit_zone_internaldns1").val($(this).data("internaldns1")); - dialogEditZone.find("#edit_zone_internaldns2").val($(this).data("internaldns2")); - dialogEditZone.find("#edit_zone_guestcidraddress").val($(this).data("guestcidraddress")); - var guestcidraddress = $(this).data("guestcidraddress"); - - // If the network type is vnet, don't show any vlan stuff. - if (getNetworkType() != "vnet") { - dialogEditZone.find("#edit_zone_startvlan").val(""); - dialogEditZone.find("#edit_zone_endvlan").val(""); - var vlan = $(this).data("vlan"); - if(vlan != null) { - if(vlan.indexOf("-")!==-1) { - var startVlan = vlan.substring(0, vlan.indexOf("-")); - var endVlan = vlan.substring((vlan.indexOf("-")+1)); - dialogEditZone.find("#edit_zone_startvlan").val(startVlan); - dialogEditZone.find("#edit_zone_endvlan").val(endVlan); - } - else { - dialogEditZone.find("#edit_zone_startvlan").val(vlan); - } - } - } - - dialogEditZone - .dialog('option', 'buttons', { - "Change": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#edit_zone_name"), thisDialog.find("#edit_zone_name_errormsg")); - isValid &= validateIp("DNS 1", thisDialog.find("#edit_zone_dns1"), thisDialog.find("#edit_zone_dns1_errormsg"), false); //required - isValid &= validateIp("DNS 2", thisDialog.find("#edit_zone_dns2"), thisDialog.find("#edit_zone_dns2_errormsg"), true); //optional - isValid &= validateIp("Internal DNS 1", thisDialog.find("#edit_zone_internaldns1"), thisDialog.find("#edit_zone_internaldns1_errormsg"), false); //required - isValid &= validateIp("Internal DNS 2", thisDialog.find("#edit_zone_internaldns2"), thisDialog.find("#edit_zone_internaldns2_errormsg"), true); //optional - if (getNetworkType() != "vnet") { - isValid &= validateString("Zone - Start VLAN Range", thisDialog.find("#edit_zone_startvlan"), thisDialog.find("#edit_zone_startvlan_errormsg"), false); //required - isValid &= validateString("Zone - End VLAN Range", thisDialog.find("#edit_zone_endvlan"), thisDialog.find("#edit_zone_endvlan_errormsg"), true); //optional - } - isValid &= validateCIDR("Guest CIDR", thisDialog.find("#edit_zone_guestcidraddress"), thisDialog.find("#edit_zone_guestcidraddress_errormsg"), false); //required - if (!isValid) return; - - var moreCriteria = []; - - var name = trim(thisDialog.find("#edit_zone_name").val()); - moreCriteria.push("&name="+todb(name)); - - var dns1 = trim(thisDialog.find("#edit_zone_dns1").val()); - moreCriteria.push("&dns1="+encodeURIComponent(dns1)); - - var dns2 = trim(thisDialog.find("#edit_zone_dns2").val()); - if (dns2 != null & dns2.length > 0) - moreCriteria.push("&dns2="+encodeURIComponent(dns2)); - - var internaldns1 = trim(thisDialog.find("#edit_zone_internaldns1").val()); - moreCriteria.push("&internaldns1="+encodeURIComponent(internaldns1)); - - var internaldns2 = trim(thisDialog.find("#edit_zone_internaldns2").val()); - if (internaldns2 != null & internaldns2.length > 0) - moreCriteria.push("&internaldns2="+encodeURIComponent(internaldns2)); - - var vlan; - if (getNetworkType() != "vnet") { - var vlanStart = trim(thisDialog.find("#edit_zone_startvlan").val()); - var vlanEnd = trim(thisDialog.find("#edit_zone_endvlan").val()); - if (vlanEnd != null && vlanEnd.length > 0) - vlan = vlanStart + "-" + vlanEnd; - else - vlan = vlanStart; - moreCriteria.push("&vlan=" + encodeURIComponent(vlan)); - } - - var guestcidraddress = trim(thisDialog.find("#edit_zone_guestcidraddress").val()); - moreCriteria.push("&guestcidraddress="+encodeURIComponent(guestcidraddress)); - - thisDialog.dialog("close"); - - var template = $("#zone_"+id); - var loadingImg = template.find(".adding_loading").find(".adding_text").text("Updating zone...."); - var row_container = template.find("#row_container"); - loadingImg.show(); - row_container.hide(); - - $.ajax({ - data: createURL("command=updateZone&id="+id+moreCriteria.join("")+"&response=json"), - dataType: "json", - success: function(json) { - var obj = {"id": id, "name": name, "dns1": dns1, "dns2": dns2, "internaldns1": internaldns1, "internaldns2": internaldns2, "vlan": vlan, "guestcidraddress": guestcidraddress }; - zoneObjectToRightPanel(obj); - var zoneName = $("#zone_"+id).find("#zone_name").text(name); - zoneName.data("id", id).data("name", fromdb(name)).data("dns1", dns1).data("internaldns1", internaldns1).data("guestcidraddress", guestcidraddress); - if (dns2 != "") - zoneName.data("dns2", dns2); - if (internaldns2 != "") - zoneName.data("internaldns2", internaldns2); - if (vlan != "") - zoneName.data("vlan", vlan); - - loadingImg.hide(); - row_container.show(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - row_container.show(); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - - }); - - $("#submenu_content_zones #action_add_pod").bind("click", function(event) { - var id = $(this).data("id"); - - $("#dialog_add_pod").find("#add_pod_zone_name").text($(this).data("name")); - $("#dialog_add_pod #add_pod_name, #dialog_add_pod #add_pod_cidr, #dialog_add_pod #add_pod_startip, #dialog_add_pod #add_pod_endip, #add_pod_gateway").val(""); - - $("#dialog_add_pod") - .dialog('option', 'buttons', { - "Add": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#add_pod_name"), thisDialog.find("#add_pod_name_errormsg")); - isValid &= validateCIDR("CIDR", thisDialog.find("#add_pod_cidr"), thisDialog.find("#add_pod_cidr_errormsg")); - isValid &= validateIp("Start IP Range", thisDialog.find("#add_pod_startip"), thisDialog.find("#add_pod_startip_errormsg")); //required - isValid &= validateIp("End IP Range", thisDialog.find("#add_pod_endip"), thisDialog.find("#add_pod_endip_errormsg"), true); //optional - isValid &= validateIp("Gateway", thisDialog.find("#add_pod_gateway"), thisDialog.find("#add_pod_gateway_errormsg")); //required when creating - if (!isValid) return; - - var name = trim(thisDialog.find("#add_pod_name").val()); - var cidr = trim(thisDialog.find("#add_pod_cidr").val()); - var startip = trim(thisDialog.find("#add_pod_startip").val()); - var endip = trim(thisDialog.find("#add_pod_endip").val()); //optional - var gateway = trim(thisDialog.find("#add_pod_gateway").val()); - - var array1 = []; - array1.push("&zoneId="+id); - array1.push("&name="+todb(name)); - array1.push("&cidr="+encodeURIComponent(cidr)); - array1.push("&startIp="+encodeURIComponent(startip)); - if (endip != null && endip.length > 0) - array1.push("&endIp="+encodeURIComponent(endip)); - array1.push("&gateway="+encodeURIComponent(gateway)); - - thisDialog.dialog("close"); - - var template = $("#pod_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var row_container = template.find("#row_container"); - - $("#zone_"+id+" #zone_content").show(); - $("#zone_" + id + " #pods_container").prepend(template.show()); - $("#zone_" + id + " #zone_expand").removeClass().addClass("zonetree_openarrows"); - loadingImg.show(); - row_container.hide(); - template.fadeIn("slow"); - - $.ajax({ - data: createURL("command=createPod&response=json"+array1.join("")), - dataType: "json", - success: function(json) { - var pod = json.createpodresponse; - template.attr("id", "pod_"+pod.id); - podJSONToTemplate(pod, template); - loadingImg.hide(); - row_container.show(); - if (forceLogout) { - $("#dialog_confirmation") - .html("

You have successfully added your first Zone and Pod. After clicking 'OK', this UI will automatically refresh to give you access to the rest of cloud features.

") - .dialog('option', 'buttons', { - "OK": function() { - $(this).dialog("close"); - window.location.reload(); - } - }).dialog("open"); - } - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function() { - $(this).remove(); - }); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - }); - - $("#submenu_content_zones #action_add_directip_vlan").bind("click", function(event) { - var thisLink = $(this); - var podid = thisLink.data("id"); - var podname = thisLink.data("name"); - var zoneid = thisLink.data("zoneid"); - - $("#dialog_add_vlan_for_pod").find("#pod_name_label").text(podname); - - $("#dialog_add_vlan_for_pod") - .dialog('option', 'buttons', { - "Add": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateIp("Gateway", thisDialog.find("#gateway"), thisDialog.find("#gateway_errormsg")); - isValid &= validateIp("Netmask", thisDialog.find("#netmask"), thisDialog.find("#netmask_errormsg")); - isValid &= validateIp("Start IP Range", thisDialog.find("#startip"), thisDialog.find("#startip_errormsg")); //required - isValid &= validateIp("End IP Range", thisDialog.find("#endip"), thisDialog.find("#endip_errormsg"), true); //optional - if (!isValid) return; - - var gateway = trim(thisDialog.find("#gateway").val()); - var netmask = trim(thisDialog.find("#netmask").val()); - var startip = trim(thisDialog.find("#startip").val()); - var endip = trim(thisDialog.find("#endip").val()); - - var array1 = []; - array1.push("&vlan=untagged"); - array1.push("&zoneid=" + zoneid); - array1.push("&podId=" + podid); - array1.push("&forVirtualNetwork=false"); //direct VLAN - array1.push("&gateway="+encodeURIComponent(gateway)); - array1.push("&netmask="+encodeURIComponent(netmask)); - array1.push("&startip="+encodeURIComponent(startip)); - if(endip != null && endip.length > 0) - array1.push("&endip="+encodeURIComponent(endip)); - - thisDialog.dialog("close"); - - var template = $("#vlan_ip_range_template").clone(true); - //direct untagged VLAN is under pod(2nd level). So, make direct untagged VLAN 3rd level. - template.find("#row_container .zonetree_secondlevel").removeClass().addClass("zonetree_thirdlevel"); - - var loadingImg = template.find(".adding_loading"); - loadingImg.find(".adding_text").text("Adding a direct IP range...."); - var row_container = template.find("#row_container"); - - $("#zone_" + zoneid).find("#pod_" + podid).find("#directip_ranges_container").prepend(template.show()); - - loadingImg.show(); - row_container.hide(); - template.fadeIn("slow"); - - $.ajax({ - data: createURL("command=createVlanIpRange&response=json" + array1.join("")), - dataType: "json", - success: function(json) { - var vlan = json.createvlaniprangeresponse; - template.attr("id", "publicip_range_"+vlan.id); - vlanIpRangeJSONToTemplate(vlan, template); - loadingImg.hide(); - row_container.show(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function() { - $(this).remove(); - }); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - - return false; - }); - - $("#submenu_content_zones #action_edit_pod").bind("click", function(event) { - var id = $(this).data("id"); - var zoneid = $(this).data("zoneid"); - var dialogEditPod = $("#dialog_edit_pod"); - - var oldName = $(this).data("name"); - dialogEditPod.find("#edit_pod_name").val(oldName); - - var oldCidr = $(this).data("cidr"); - dialogEditPod.find("#edit_pod_cidr").val(oldCidr); - - var oldStartip = $(this).data("startip"); - dialogEditPod.find("#edit_pod_startip").val(oldStartip); - - var oldEndip = $(this).data("endip"); - dialogEditPod.find("#edit_pod_endip").val(oldEndip); - - var oldGateway = $(this).data("gateway"); - dialogEditPod.find("#edit_pod_gateway").val(oldGateway); - - dialogEditPod - .dialog('option', 'buttons', { - "Change": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#edit_pod_name"), thisDialog.find("#edit_pod_name_errormsg")); - isValid &= validateCIDR("CIDR", thisDialog.find("#edit_pod_cidr"), thisDialog.find("#edit_pod_cidr_errormsg")); - isValid &= validateIp("Start IP Range", thisDialog.find("#edit_pod_startip"), dialogEditPod.find("#edit_pod_startip_errormsg")); //required - isValid &= validateIp("End IP Range", dialogEditPod.find("#edit_pod_endip"), thisDialog.find("#edit_pod_endip_errormsg"), true); //optional - isValid &= validateIp("Gateway", thisDialog.find("#edit_pod_gateway"), thisDialog.find("#edit_pod_gateway_errormsg"), true); //optional when editing - if (!isValid) return; - - var newName = trim(thisDialog.find("#edit_pod_name").val()); - var newCidr = trim(thisDialog.find("#edit_pod_cidr").val()); - var newStartip = trim(thisDialog.find("#edit_pod_startip").val()); - var newEndip = trim(thisDialog.find("#edit_pod_endip").val()); - var newIpRange = getIpRange(newStartip, newEndip); - var newGateway = trim(thisDialog.find("#edit_pod_gateway").val()); - - var array1 = []; - array1.push("&id="+id); - if(newName != oldName) - array1.push("&name="+todb(newName)); - if(newCidr != oldCidr) - array1.push("&cidr="+encodeURIComponent(newCidr)); - if(newStartip != oldStartip) - array1.push("&startIp="+encodeURIComponent(newStartip)); - if(newEndip != oldEndip && newEndip != null && newEndip.length > 0) { - if(newStartip == oldStartip) { - array1.push("&startIp="+encodeURIComponent(newStartip)); //startIp needs to be passed to updatePod API when endIp is passed to updatePod API. - } - array1.push("&endIp="+encodeURIComponent(newEndip)); - } - if(newGateway != oldGateway && newGateway != null && newGateway.length > 0) - array1.push("&gateway="+encodeURIComponent(newGateway)); - - $(this).dialog("close"); - - var template = $("#pod_"+id); - var loadingImg = template.find(".adding_loading"); - loadingImg.find(".adding_text").text("Updating a pod...."); - var row_container = template.find("#row_container"); - - loadingImg.show(); - row_container.hide(); - template.fadeIn("slow"); - - $.ajax({ - data: createURL("command=updatePod&response=json"+array1.join("")), - dataType: "json", - success: function(json) { - var newIpRange = getIpRange(newStartip, newEndip); - var obj = {"id": id, "zoneid": zoneid, "name": newName, "cidr": newCidr, "startip": newStartip, "endip": newEndip, "ipRange": newIpRange, "gateway": newGateway}; - podObjectToRightPanel(obj); - var podName = $("#pod_"+id).find("#pod_name").text(newName); - podName.data("id", id).data("name", fromdb(newName)).data("cidr", newCidr).data("startip", newStartip).data("endip", newEndip).data("ipRange", newIpRange).data("gateway", newGateway); - loadingImg.hide(); - row_container.show(); - }, - error: function(XMLHttpResponse) { - loadingImg.hide(); - row_container.show(); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - }); - - $("#submenu_content_zones #action_add_publicip_vlan").bind("click", function(event) { - var id = $(this).data("id"); - - // reset dialog - dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container, #add_publicip_vlan_domain_container, #add_publicip_vlan_account_container").hide(); - dialogAddVlanForZone.find("#add_publicip_vlan_tagged, #add_publicip_vlan_vlan, #add_publicip_vlan_gateway, #add_publicip_vlan_netmask, #add_publicip_vlan_startip, #add_publicip_vlan_endip, #add_publicip_vlan_account").val(""); - dialogAddVlanForZone.find("#add_publicip_vlan_zone_name").text($(this).data("name")); - - if (getNetworkType() == 'vnet') { - $("#add_publicip_vlan_type_container").hide(); - } else { - dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").show(); - dialogAddVlanForZone.find("#add_publicip_vlan_type").change(); - $("#add_publicip_vlan_type_container").show(); - var podSelect = dialogAddVlanForZone.find("#add_publicip_vlan_pod").empty(); - $.ajax({ - data: createURL("command=listPods&zoneId="+id+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - var pods = json.listpodsresponse.pod; - if (pods != null && pods.length > 0) { - for (var i = 0; i < pods.length; i++) { - podSelect.append(""); - } - } else { - podSelect.append(""); - } - } - }); - - var domainSelect = dialogAddVlanForZone.find("#add_publicip_vlan_domain").empty(); - $.ajax({ - data: createURL("command=listDomains&response=json"), - dataType: "json", - async: false, - success: function(json) { - var domains = json.listdomainsresponse.domain; - if (domains != null && domains.length > 0) { - for (var i = 0; i < domains.length; i++) { - domainSelect.append(""); - } - } - } - }); - } - - dialogAddVlanForZone - .dialog('option', 'buttons', { - "Add": function() { - var thisDialog = $(this); - // validate values - var isValid = true; - var isTagged = false; - var isDirect = false; - if (getNetworkType() == "vlan") { - isDirect = thisDialog.find("#add_publicip_vlan_type").val() == "false"; - isTagged = thisDialog.find("#add_publicip_vlan_tagged").val() == "tagged"; - } - - isValid &= validateString("Account", thisDialog.find("#add_publicip_vlan_account"), thisDialog.find("#add_publicip_vlan_account_errormsg"), true); //optional - - if (isTagged) { - isValid &= validateNumber("VLAN", thisDialog.find("#add_publicip_vlan_vlan"), thisDialog.find("#add_publicip_vlan_vlan_errormsg"), 2, 4095); - } - isValid &= validateIp("Gateway", thisDialog.find("#add_publicip_vlan_gateway"), thisDialog.find("#add_publicip_vlan_gateway_errormsg")); - isValid &= validateIp("Netmask", thisDialog.find("#add_publicip_vlan_netmask"), thisDialog.find("#add_publicip_vlan_netmask_errormsg")); - isValid &= validateIp("Start IP Range", thisDialog.find("#add_publicip_vlan_startip"), thisDialog.find("#add_publicip_vlan_startip_errormsg")); //required - isValid &= validateIp("End IP Range", thisDialog.find("#add_publicip_vlan_endip"), thisDialog.find("#add_publicip_vlan_endip_errormsg"), true); //optional - if (!isValid) return; - - var vlan = trim(thisDialog.find("#add_publicip_vlan_vlan").val()); - if (isTagged) { - vlan = "&vlan="+vlan; - } else { - vlan = "&vlan=untagged"; - } - - var scopeParams = ""; - if(dialogAddVlanForZone.find("#add_publicip_vlan_scope").val()=="account-specific") - scopeParams = "&domainId="+trim(thisDialog.find("#add_publicip_vlan_domain").val())+"&account="+trim(thisDialog.find("#add_publicip_vlan_account").val()); - - var type = "true"; - if (getNetworkType() == "vlan") type = trim(thisDialog.find("#add_publicip_vlan_type").val()); - var gateway = trim(thisDialog.find("#add_publicip_vlan_gateway").val()); - var netmask = trim(thisDialog.find("#add_publicip_vlan_netmask").val()); - var startip = trim(thisDialog.find("#add_publicip_vlan_startip").val()); - var endip = trim(thisDialog.find("#add_publicip_vlan_endip").val()); - - thisDialog.dialog("close"); - - var template = $("#vlan_ip_range_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var row_container = template.find("#row_container"); - - $("#zone_" + id + " #zone_content").show(); - $("#zone_" + id + " #publicip_ranges_container").prepend(template.show()); - $("#zone_" + id + " #zone_expand").removeClass().addClass("zonetree_openarrows"); - loadingImg.show(); - row_container.hide(); - template.fadeIn("slow"); - - $.ajax({ - data: createURL("command=createVlanIpRange&forVirtualNetwork="+type+"&zoneId="+id+vlan+scopeParams+"&gateway="+encodeURIComponent(gateway)+"&netmask="+encodeURIComponent(netmask)+"&startip="+encodeURIComponent(startip)+"&endip="+encodeURIComponent(endip)+"&response=json"), - dataType: "json", - success: function(json) { - var vlan = json.createvlaniprangeresponse; - template.attr("id", "publicip_range_"+vlan.id); - vlanIpRangeJSONToTemplate(vlan, template); - loadingImg.hide(); - row_container.show(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function() { - $(this).remove(); - }); - } - }); - - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - }); - - $("#zone_template").bind("click", function(event) { - var template = $(this); - var target = $(event.target); - var action = target.attr("id"); - var id = template.data("id"); - var name = template.data("name"); - - switch (action) { - case "zone_expand" : - if (target.hasClass("zonetree_closedarrows")) { - $("#zone_"+id+" #zone_content").show(); - target.removeClass().addClass("zonetree_openarrows"); - } else { - $("#zone_"+id+" #zone_content").hide(); - target.removeClass().addClass("zonetree_closedarrows"); - } - break; - case "zone_name" : - $("#submenu_content_zones .zonetree_firstlevel_selected").removeClass().addClass("zonetree_firstlevel"); - $("#submenu_content_zones .zonetree_secondlevel_selected").removeClass().addClass("zonetree_secondlevel"); - template.find(".zonetree_firstlevel").removeClass().addClass("zonetree_firstlevel_selected"); - - var obj = {"id": target.data("id"), "name": target.data("name"), "dns1": target.data("dns1"), "dns2": target.data("dns2"), "internaldns1": target.data("internaldns1"), "internaldns2": target.data("internaldns2"), "vlan": target.data("vlan"), "guestcidraddress": target.data("guestcidraddress")}; - zoneObjectToRightPanel(obj); - - break; - case "pod_name" : - $("#submenu_content_zones .zonetree_firstlevel_selected").removeClass().addClass("zonetree_firstlevel"); - $("#submenu_content_zones .zonetree_secondlevel_selected").removeClass().addClass("zonetree_secondlevel"); - target.parent(".zonetree_secondlevel").removeClass().addClass("zonetree_secondlevel_selected"); - - var obj = {"id": target.data("id"), "zoneid": target.data("zoneid"), "name": target.data("name"), "cidr": target.data("cidr"), "startip": target.data("startip"), "endip": target.data("endip"), "ipRange": target.data("ipRange"), "gateway": target.data("gateway")}; - podObjectToRightPanel(obj); - - break; - case "vlan_ip_range_name" : - $("#submenu_content_zones .zonetree_firstlevel_selected").removeClass().addClass("zonetree_firstlevel"); - $("#submenu_content_zones .zonetree_secondlevel_selected").removeClass().addClass("zonetree_secondlevel"); - target.parent(".zonetree_secondlevel").removeClass().addClass("zonetree_secondlevel_selected"); - - var title = "Public VLAN IP Range"; - var isDirect = target.data("forVirtualNetwork") == "false"; - var isTagged = target.data("vlan") != "untagged"; - if (isDirect) { - title = "Direct VLAN IP Range"; - } - rightPanel.html(title); - - var rightContentHtml = - "

VLAN ID: "+target.data("vlan")+"

" - + "

Gateway: "+target.data("gateway")+"

" - + "

Netmask: "+target.data("netmask")+"

" - + "

IP Range: "+target.data("name")+"

"; - if(target.data("domainId")!=null) - rightContentHtml += "

Domain ID: "+target.data("domainId")+"

"; - if(target.data("domain")!=null) - rightContentHtml += "

Domain: "+target.data("domain")+"

"; - if(target.data("account")!=null) - rightContentHtml += "

Account: "+target.data("account")+"

"; - if(target.data("podname")!=null) - rightContentHtml += "

Pod: "+target.data("podname")+"

"; - rightContent.data("id", target.data("id")).html(rightContentHtml); - - $("#submenu_content_zones").find("#action_edit_zone, #action_add_pod, #action_edit_pod, #action_add_publicip_vlan, #action_add_directip_vlan").hide(); - $("#submenu_content_zones #action_delete").data("id", target.data("id")).data("name", target.data("name")).data("type", "publicip_range").show(); - - break; - default: - break; - } - return false; - }); - - function vlanIpRangeJSONToTemplate(json, template) { - template.data("id", json.id); - var vlanName = json.id; - var vlanDisplayName = vlanName; - if (json.description != undefined) { - if (json.description.indexOf("-") == -1) { - vlanName = json.description; - vlanDisplayName = vlanName; - } else { - var ranges = json.description.split("-"); - vlanName = ranges[0] + " -" + ranges[1]; - vlanDisplayName = ranges[0] + " - " + ranges[1]; - } - } - var isDirect = json.forvirtualnetwork == "false"; - var isTagged = json.vlan != "untagged"; - if (isDirect) { - template.find(".zonetree_ipicon").removeClass().addClass("zonetree_directipicon"); - template.find("#vlan_ip_range_type").text("Direct IP Range:"); - } - else { - template.find("#vlan_ip_range_type").text("Public IP Range:"); - } - template.find("#vlan_ip_range_name") - .html(vlanName) - .data("id", json.id) - .data("name", vlanDisplayName) - .data("vlan", json.vlan) - .data("forVirtualNetwork", json.forvirtualnetwork) - .data("gateway", json.gateway) - .data("netmask", json.netmask); - - - template.find("#vlan_ip_range_name").data("domainId", json.domainid); //json.domainid might be null. - template.find("#vlan_ip_range_name").data("domain", json.domain); //json.domain might be null. - template.find("#vlan_ip_range_name").data("account", json.account); //json.account might be null. - template.find("#vlan_ip_range_name").data("podname", json.podname); //json.podname might be null. - } - - function getIpRange(startip, endip) { - var ipRange = ""; - if (startip != null && startip.length > 0) { - ipRange = startip; - } - if (endip != null && endip.length > 0) { - ipRange = ipRange + "-" + endip; - } - return ipRange; - } - - function podJSONToTemplate(json, template) { - var ipRange = getIpRange(json.startip, json.endip); - template.data("id", json.id).data("name", json.name); - - var podName = template.find("#pod_name").text(json.name); - podName.data("id", json.id); - podName.data("zoneid", json.zoneid); - podName.data("name", json.name); - podName.data("cidr", json.cidr); - podName.data("startip", json.startip); - podName.data("endip", json.endip); - podName.data("ipRange", ipRange); - podName.data("gateway", json.gateway); - - $.ajax({ - data: createURL("command=listVlanIpRanges&zoneid="+json.zoneid+"&podid="+json.id+"&response=json"), - dataType: "json", - success: function(json) { - var ranges = json.listvlaniprangesresponse.vlaniprange; - var grid = template.find("#directip_ranges_container").empty(); - if (ranges != null && ranges.length > 0) { - for (var i = 0; i < ranges.length; i++) { - if(ranges[i].forvirtualnetwork == "false" && ranges[i].vlan == "untagged") { //direct untagged VLAN should be under pod, instead of under zone. - var rangeTemplate = $("#vlan_ip_range_template").clone(true).attr("id", "publicip_range_"+ranges[i].id); - vlanIpRangeJSONToTemplate(ranges[i], rangeTemplate); - grid.append(rangeTemplate.show()); - - //direct untagged VLAN is under pod(2nd level). So, make direct untagged VLAN 3rd level. - rangeTemplate.find("#row_container .zonetree_secondlevel").removeClass().addClass("zonetree_thirdlevel"); - } - } - } - } - }); - } - - function zoneJSONToTemplate(json, template) { - var zoneid = json.id; - template.data("id", zoneid).data("name", fromdb(json.name)); - template.find("#zone_name") - .text(fromdb(json.name)) - .data("id", zoneid) - .data("name", fromdb(json.name)) - .data("dns1", json.dns1) - .data("internaldns1", json.internaldns1) - .data("guestcidraddress", json.guestcidraddress); - - if (json.dns2 != undefined) { - template.find("#zone_name").data("dns2", json.dns2); - } - if (json.internaldns2 != undefined) { - template.find("#zone_name").data("internaldns2", json.internaldns2); - } - if (json.vlan != undefined) { - template.find("#zone_name").data("vlan", json.vlan); - } - - $.ajax({ - data: createURL("command=listPods&zoneid="+zoneid+"&response=json"), - dataType: "json", - success: function(json) { - var pods = json.listpodsresponse.pod; - var grid = template.find("#pods_container").empty(); - if (pods != null && pods.length > 0) { - for (var i = 0; i < pods.length; i++) { - var podTemplate = $("#pod_template").clone(true).attr("id", "pod_"+pods[i].id); - podJSONToTemplate(pods[i], podTemplate); - grid.append(podTemplate.show()); - forceLogout = false; - } - } - } - }); - - $.ajax({ - data: createURL("command=listVlanIpRanges&zoneId="+zoneid+"&response=json"), - dataType: "json", - success: function(json) { - var ranges = json.listvlaniprangesresponse.vlaniprange; - var grid = template.find("#publicip_ranges_container").empty(); - if (ranges != null && ranges.length > 0) { - for (var i = 0; i < ranges.length; i++) { - if(ranges[i].forvirtualnetwork == "false" && ranges[i].vlan == "untagged") //direct untagged VLAN should be under pod, instead of under zone. - continue; - var rangeTemplate = $("#vlan_ip_range_template").clone(true).attr("id", "publicip_range_"+ranges[i].id); - vlanIpRangeJSONToTemplate(ranges[i], rangeTemplate); - grid.append(rangeTemplate.show()); - } - } - } - }); - - } - // If the network type is vnet, don't show any vlan stuff. - if (getNetworkType() == "vnet") { - $("#action_add_publicip_vlan").removeClass().addClass("zonedetails_addpublicipbutton"); - $("#dialog_add_vlan_for_zone").attr("title", "Add Public IP Range"); - $("#dialog_edit_zone #edit_zone_container, #dialog_add_zone #add_zone_container").hide(); - } - activateDialog($("#dialog_add_zone").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_edit_zone").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_add_pod").dialog({ - autoOpen: false, - modal: true, - width:320, - zIndex: 2000 - })); - - activateDialog($("#dialog_edit_pod").dialog({ - autoOpen: false, - width: 320, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_add_vlan_for_zone").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_add_vlan_for_pod").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - //direct VLAN shows only "tagged" option while public VLAN shows both "tagged" and "untagged" option. - var dialogAddVlanForZone = $("#dialog_add_vlan_for_zone"); - - dialogAddVlanForZone.find("#add_publicip_vlan_type").change(function(event) { - var addPublicipVlanTagged = dialogAddVlanForZone.find("#add_publicip_vlan_tagged").empty(); - - // default value of "#add_publicip_vlan_scope" is "zone-wide". Calling change() will hide "#add_publicip_vlan_domain_container", "#add_publicip_vlan_account_container". - dialogAddVlanForZone.find("#add_publicip_vlan_scope").change(); - - if ($(this).val() == "false") { //direct VLAN (only tagged option) - addPublicipVlanTagged.append(''); - - dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").show(); - dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide(); - - } else { //public VLAN - addPublicipVlanTagged.append('').append(''); - - if (dialogAddVlanForZone.find("#add_publicip_vlan_tagged") == "tagged") { - dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").show(); - dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide(); - } else { - dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").hide(); - dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide(); - } - } - return false; - }); - - if (getNetworkType() != "vnet") { - dialogAddVlanForZone.find("#add_publicip_vlan_tagged").change(function(event) { - // default value of "#add_publicip_vlan_scope" is "zone-wide". Calling change() will hide "#add_publicip_vlan_domain_container", "#add_publicip_vlan_account_container". - dialogAddVlanForZone.find("#add_publicip_vlan_scope").change(); - - if (dialogAddVlanForZone.find("#add_publicip_vlan_type").val() == "false") { //direct VLAN (only tagged option) - dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").show(); - dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide(); - } else { //public VLAN - if ($(this).val() == "tagged") { - dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").show(); - dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide(); - } else { - dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").hide(); - dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide(); - } - } - return false; - }); - } else { - dialogAddVlanForZone.find("#add_publicip_vlan_container").hide(); - } - - dialogAddVlanForZone.find("#add_publicip_vlan_scope").change(function(event) { - if($(this).val() == "zone-wide") { - dialogAddVlanForZone.find("#add_publicip_vlan_domain_container").hide(); - dialogAddVlanForZone.find("#add_publicip_vlan_account_container").hide(); - } else { // account-specific - dialogAddVlanForZone.find("#add_publicip_vlan_domain_container").show(); - dialogAddVlanForZone.find("#add_publicip_vlan_account_container").show(); - } - return false; - }); - - $("#action_add_zone").bind("click", function(event) { - var thisDialog = $(this); - thisDialog.find("#add_zone_name, #add_zone_dns1, #add_zone_dns2, #add_zone_internaldns1, #add_zone_internaldns2, #add_zone_startvlan, #add_zone_endvlan, #add_zone_guestcidraddress").val(""); - - $("#dialog_add_zone") - .dialog('option', 'buttons', { - "Add": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#add_zone_name"), thisDialog.find("#add_zone_name_errormsg")); - isValid &= validateIp("DNS 1", thisDialog.find("#add_zone_dns1"), thisDialog.find("#add_zone_dns1_errormsg"), false); //required - isValid &= validateIp("DNS 2", thisDialog.find("#add_zone_dns2"), thisDialog.find("#add_zone_dns2_errormsg"), true); //optional - isValid &= validateIp("Internal DNS 1", thisDialog.find("#add_zone_internaldns1"), thisDialog.find("#add_zone_internaldns1_errormsg"), false); //required - isValid &= validateIp("Internal DNS 2", thisDialog.find("#add_zone_internaldns2"), thisDialog.find("#add_zone_internaldns2_errormsg"), true); //optional - if (getNetworkType() != "vnet") { - isValid &= validateString("Zone - Start VLAN Range", thisDialog.find("#add_zone_startvlan"), thisDialog.find("#add_zone_startvlan_errormsg"), false); //required - isValid &= validateString("Zone - End VLAN Range", thisDialog.find("#add_zone_endvlan"), thisDialog.find("#add_zone_endvlan_errormsg"), true); //optional - } - isValid &= validateCIDR("Guest CIDR", thisDialog.find("#add_zone_guestcidraddress"), thisDialog.find("#add_zone_guestcidraddress_errormsg"), false); //required - if (!isValid) return; - - var moreCriteria = []; - - var name = trim(thisDialog.find("#add_zone_name").val()); - moreCriteria.push("&name="+todb(name)); - - var dns1 = trim(thisDialog.find("#add_zone_dns1").val()); - moreCriteria.push("&dns1="+encodeURIComponent(dns1)); - - var dns2 = trim(thisDialog.find("#add_zone_dns2").val()); - if (dns2 != null && dns2.length > 0) - moreCriteria.push("&dns2="+encodeURIComponent(dns2)); - - var internaldns1 = trim(thisDialog.find("#add_zone_internaldns1").val()); - moreCriteria.push("&internaldns1="+encodeURIComponent(internaldns1)); - - var internaldns2 = trim(thisDialog.find("#add_zone_internaldns2").val()); - if (internaldns2 != null && internaldns2.length > 0) - moreCriteria.push("&internaldns2="+encodeURIComponent(internaldns2)); - - if (getNetworkType() != "vnet") { - var vlanStart = trim(thisDialog.find("#add_zone_startvlan").val()); - var vlanEnd = trim(thisDialog.find("#add_zone_endvlan").val()); - if (vlanEnd != null && vlanEnd.length > 0) - moreCriteria.push("&vlan=" + encodeURIComponent(vlanStart + "-" + vlanEnd)); - else - moreCriteria.push("&vlan=" + encodeURIComponent(vlanStart)); - } - - var guestcidraddress = trim(thisDialog.find("#add_zone_guestcidraddress").val()); - moreCriteria.push("&guestcidraddress="+encodeURIComponent(guestcidraddress)); - - thisDialog.dialog("close"); - - var template = $("#zone_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var row_container = template.find("#row_container"); - - $("#submenu_content_zones #zones_container").prepend(template.show()); - loadingImg.show(); - row_container.hide(); - template.fadeIn("slow"); - - $.ajax({ - data: createURL("command=createZone"+moreCriteria.join("")+"&response=json"), - dataType: "json", - success: function(json) { - var zone = json.createzoneresponse; - template.attr("id", "zone_"+zone.id); - zoneJSONToTemplate(zone, template); - loadingImg.hide(); - row_container.show(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function() { - thisDialog.remove(); - }); - } - }); - }, - "Cancel": function() { - var thisDialog = $(this); - thisDialog.dialog("close"); - cleanErrMsg(thisDialog.find("#add_zone_name"), thisDialog.find("#add_zone_name_errormsg")); - cleanErrMsg(thisDialog.find("#add_zone_dns1"), thisDialog.find("#add_zone_dns1_errormsg")); - cleanErrMsg(thisDialog.find("#add_zone_dns2"), thisDialog.find("#add_zone_dns2_errormsg")); - cleanErrMsg(thisDialog.find("#add_zone_internaldns1"), thisDialog.find("#add_zone_internaldns1_errormsg")); - cleanErrMsg(thisDialog.find("#add_zone_internaldns2"), thisDialog.find("#add_zone_internaldns2_errormsg")); - cleanErrMsg(thisDialog.find("#add_zone_startvlan"), thisDialog.find("#add_zone_startvlan_errormsg")); - cleanErrMsg(thisDialog.find("#add_zone_guestcidraddress"), thisDialog.find("#add_zone_guestcidraddress_errormsg")); - } - }).dialog("open"); - }); - - $("#submenu_zones").bind("click", function(event) { - event.preventDefault(); - $(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off"); - currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on"); - currentSubMenu = $(this); - var container = $("#submenu_content_zones").show(); - $("#submenu_content_global, #submenu_content_service, #submenu_content_disk").hide(); - clearRightPanel(); - $.ajax({ - data: createURL("command=listZones&available=true&response=json"), - dataType: "json", - success: function(json) { - var zones = json.listzonesresponse.zone; - var grid = $("#submenu_content_zones #zones_container").empty(); - if (zones != null && zones.length > 0) { - for (var i = 0; i < zones.length; i++) { - var template = $("#zone_template").clone(true).attr("id", "zone_"+zones[i].id); - zoneJSONToTemplate(zones[i], template); - grid.append(template.show()); - } - } - } - }); - }); - - $("#service_template").bind("click", function(event) { - var template = $(this); - var link = $(event.target); - var linkAction = link.attr("id"); - var svcId = template.data("svcId"); - var svcName = template.data("svcName"); - var submenuContent = $("#submenu_content_service"); - switch (linkAction) { - case "service_action_edit" : - var dialogEditService = $("#dialog_edit_service"); - - dialogEditService.find("#service_name").text(svcName); - dialogEditService.find("#edit_service_name").val(svcName); - dialogEditService.find("#edit_service_display").val(template.find("#service_displaytext").text()); - dialogEditService.find("#edit_service_offerha").val(toBooleanValue(template.find("#service_offerha").text())); - - dialogEditService - .dialog('option', 'buttons', { - "Confirm": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#edit_service_name"), thisDialog.find("#edit_service_name_errormsg")); - isValid &= validateString("Display Text", thisDialog.find("#edit_service_display"), thisDialog.find("#edit_service_display_errormsg")); - if (!isValid) return; - - var moreCriteria = []; - var name = trim(thisDialog.find("#edit_service_name").val()); - moreCriteria.push("&name="+todb(name)); - var displaytext = trim(thisDialog.find("#edit_service_display").val()); - moreCriteria.push("&displayText="+todb(displaytext)); - var offerha = trim(thisDialog.find("#edit_service_offerha").val()); - moreCriteria.push("&offerha="+offerha); - - thisDialog.dialog("close"); - - $.ajax({ - data: createURL("command=updateServiceOffering&id="+svcId+moreCriteria.join("")+"&response=json"), - dataType: "json", - success: function(json) { - template.find("#service_displaytext").text(displaytext); - template.find("#service_name").text(name); - template.find("#service_offerha").text(toBooleanText(offerha)); - template.data("svcName", name); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "service_action_delete" : - $("#dialog_confirmation") - .html("

Please confirm you want to remove the service offering: "+svcName+" from the management server.

") - .dialog('option', 'buttons', { - "Confirm": function() { - var dialogBox = $(this); - $.ajax({ - data: createURL("command=deleteServiceOffering&id="+svcId+"&response=json"), - dataType: "json", - success: function(json) { - dialogBox.dialog("close"); - template.slideUp("slow", function() { - $(this).remove(); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), -1); - }); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - default : - break; - } - return false; - }); - - function serviceJSONToTemplate(json, template) { - template.attr("id", "service_"+json.id); - (index++ % 2 == 0)? template.addClass("smallrow_even"): template.addClass("smallrow_odd"); - template.data("svcId", json.id).data("svcName", fromdb(json.name)); - - template.find("#service_id").text(json.id); - template.find("#service_name").text(fromdb(json.name)); - template.find("#service_displaytext").text(fromdb(json.displaytext)); - template.find("#service_storagetype").text(json.storagetype); - template.find("#service_cpu").text(json.cpunumber + " x " + convertHz(json.cpuspeed)); - template.find("#service_memory").text(convertBytes(parseInt(json.memory)*1024*1024)); - template.find("#service_offerha").text(toBooleanText(json.offerha)); - template.find("#service_networktype").text(toNetworkType(json.usevirtualnetwork)); - template.find("#service_tags").text(fromdb(json.tags)); - - setDateField(json.created, template.find("#service_created")); - } - - $("#submenu_content_service .grid_container .grid_header .grid_genheader_cell").bind("click", function(event) { - var headerColumn = $(this); - var sortingIcon = headerColumn.find(".gridsorting_arrow"); - - if (sortingIcon.hasClass("up") == false) { //If it's not in ascending order, sort it ascending. - $("#submenu_content_service .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first - sortingIcon.addClass("up"); //add up arrow to this specific header column - sortingOrder = "asc"; - } - else if (sortingIcon.hasClass("up") == true) { //If it's in ascending order, sort it descending. - $("#submenu_content_service .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first - sortingIcon.addClass("down"); //add down arrow to this specific header column - sortingOrder = "desc"; - } - - switch(headerColumn[0].id) { - case "id_header": - sortBy = "id"; - items.sort(sortArrayNumerically); - break; - case "name_header": - sortBy = "name"; - items.sort(sortArrayAlphabetically); - break; - case "displaytext_header": - sortBy = "displaytext"; - items.sort(sortArrayAlphabetically); - break; - case "storagetype_header": - sortBy = "storagetype"; - items.sort(sortArrayAlphabetically); - break; - case "cpu_header": - //sortBy = "???"; - //items.sort(sortArray???); - break; - case "memory_header": - sortBy = "memory"; - parseFunction = parseInt; - items.sort(sortArrayNumericallyParse); - break; - case "offerha_header": - sortBy = "offerha"; - parseFunction = toBooleanText; - items.sort(sortArrayAlphabetically); - break; - case "networktype_header": - sortBy = "usevirtualnetwork"; - parseFunction = toNetworkType; - items.sort(sortArrayAlphabeticallyParse); - break; - case "tags_header": - sortBy = "tags"; - items.sort(sortArrayAlphabetically); - break; - case "created_header": - sortBy = "created"; - items.sort(sortArrayByDate); - break; - } - - drawGrid(items, $("#submenu_content_service"), $("#service_template"), serviceJSONToTemplate); - return false; - }); - - activateDialog($("#dialog_add_service").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_edit_service").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_edit_disk").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - $("#service_add_service").bind("click", function(event) { - var dialogAddService = $("#dialog_add_service"); - - dialogAddService.find("#add_service_name").val(""); - dialogAddService.find("#add_service_display").val(""); - dialogAddService.find("#add_service_cpucore").val(""); - dialogAddService.find("#add_service_cpu").val(""); - dialogAddService.find("#add_service_memory").val(""); - dialogAddService.find("#add_service_offerha").val("false"); - - (g_hypervisorType == "kvm")? dialogAddService.find("#add_service_offerha_container").hide():dialogAddService.find("#add_service_offerha_container").show(); - - var submenuContent = $("#submenu_content_service"); - - dialogAddService - .dialog('option', 'buttons', { - "Add": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#add_service_name"), thisDialog.find("#add_service_name_errormsg")); - isValid &= validateString("Display Text", thisDialog.find("#add_service_display"), thisDialog.find("#add_service_display_errormsg")); - isValid &= validateNumber("# of CPU Core", thisDialog.find("#add_service_cpucore"), thisDialog.find("#add_service_cpucore_errormsg"), 1, 1000); - isValid &= validateNumber("CPU", thisDialog.find("#add_service_cpu"), thisDialog.find("#add_service_cpu_errormsg"), 100, 100000); - isValid &= validateNumber("Memory", thisDialog.find("#add_service_memory"), thisDialog.find("#add_service_memory_errormsg"), 64, 1000000); - isValid &= validateString("Tags", thisDialog.find("#add_service_tags"), thisDialog.find("#add_service_tags_errormsg"), true); //optional - if (!isValid) return; - - var submenuContent = $("#submenu_content_service"); - var template = $("#service_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - submenuContent.find("#grid_content").prepend(template.fadeIn("slow")); - - var array1 = []; - var name = trim(thisDialog.find("#add_service_name").val()); - array1.push("&name="+todb(name)); - - var display = trim(thisDialog.find("#add_service_display").val()); - array1.push("&displayText="+todb(display)); - - var storagetype = trim(thisDialog.find("#add_service_storagetype").val()); - array1.push("&storageType="+storagetype); - - var core = trim(thisDialog.find("#add_service_cpucore").val()); - array1.push("&cpuNumber="+core); - - var cpu = trim(thisDialog.find("#add_service_cpu").val()); - array1.push("&cpuSpeed="+cpu); - - var memory = trim(thisDialog.find("#add_service_memory").val()); - array1.push("&memory="+memory); - - var offerha = thisDialog.find("#add_service_offerha").val(); - array1.push("&offerha="+offerha); - - var networkType = thisDialog.find("#add_service_networktype").val(); - var useVirtualNetwork = (networkType=="direct")? false:true; - array1.push("&usevirtualnetwork="+useVirtualNetwork); - - var tags = trim(thisDialog.find("#add_service_tags").val()); - if(tags != null && tags.length > 0) - array1.push("&tags="+todb(tags)); - - thisDialog.dialog("close"); - $.ajax({ - data: createURL("command=createServiceOffering"+array1.join("")+"&response=json"), - dataType: "json", - success: function(json) { - var offering = json.createserviceofferingresponse; - serviceJSONToTemplate(offering, template); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1); - loadingImg.hide(); - rowContainer.show(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function(){ $(this).remove(); } ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - return false; - }); - - //add a new disk offering - activateDialog($("#dialog_add_disk").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - $("#disk_add_disk").bind("click", function(event) { - var dialogAddDisk = $("#dialog_add_disk"); - dialogAddDisk.find("#disk_name").val(""); - dialogAddDisk.find("#disk_description").val(""); - dialogAddDisk.find("#disk_disksize").val(""); - var submenuContent = $("#submenu_content_disk"); - - dialogAddDisk - .dialog('option', 'buttons', { - "Add": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#add_disk_name"), thisDialog.find("#add_disk_name_errormsg")); - isValid &= validateString("Description", thisDialog.find("#add_disk_description"), thisDialog.find("#add_disk_description_errormsg")); - isValid &= validateNumber("Disk size", thisDialog.find("#add_disk_disksize"), thisDialog.find("#add_disk_disksize_errormsg"), 0, null); - isValid &= validateString("Tags", thisDialog.find("#add_disk_tags"), thisDialog.find("#add_disk_tags_errormsg"), true); //optional - if (!isValid) return; - - var submenuContent = $("#submenu_content_disk"); - var template = $("#disk_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - submenuContent.find("#grid_content").prepend(template.fadeIn("slow")); - - var array1 = []; - var name = trim(thisDialog.find("#add_disk_name").val()); - array1.push("&name="+todb(name)); - - var description = trim(thisDialog.find("#add_disk_description").val()); - array1.push("&displaytext="+todb(description)); - - var disksize = trim(thisDialog.find("#add_disk_disksize").val()); - array1.push("&disksize="+disksize); - - var tags = trim(thisDialog.find("#add_disk_tags").val()); - if(tags != null && tags.length > 0) - array1.push("&tags="+todb(tags)); - - thisDialog.dialog("close"); - $.ajax({ - data: createURL("command=createDiskOffering&isMirrored=false&response=json" + array1.join("")), - dataType: "json", - success: function(json) { - var offering = json.creatediskofferingresponse; - diskJSONToTemplate(offering, template); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1); - loadingImg.hide(); - rowContainer.show(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function(){ $(this).remove(); } ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - return false; - }); - - function listServiceOfferings() { - var submenuContent = $("#submenu_content_service"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(name)); - commandString = "command=listServiceOfferings&page="+currentPage+moreCriteria.join("")+"&response=json"; - } else { - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listServiceOfferings&page="+currentPage +"&keyword="+searchInput+"&response=json"; - else - commandString = "command=listServiceOfferings&page="+currentPage+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listserviceofferingsresponse", "serviceoffering", $("#service_template"), serviceJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_service"), listServiceOfferings); - - $("#submenu_service").bind("click", function(event) { - event.preventDefault(); - - $(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off"); - currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on"); - currentSubMenu = $(this); - - var submenuContent = $("#submenu_content_service").show(); - $("#submenu_content_zones, #submenu_content_global, #submenu_content_disk").hide(); - - currentPage = 1; - listServiceOfferings(); - }); - - //Disk Offering - $("#disk_template").bind("click", function(event) { - var template = $(this); - var link = $(event.target); - var linkAction = link.attr("id"); - var diskId = template.data("diskId"); - var diskName = template.data("diskName"); - var submenuContent = $("#submenu_content_disk"); - - switch (linkAction) { - case "disk_action_edit" : - var dialogEditDisk = $("#dialog_edit_disk"); - dialogEditDisk.find("#edit_disk_name").val(template.find("#disk_name").text()); - dialogEditDisk.find("#edit_disk_display").val(template.find("#disk_description").text()); - - dialogEditDisk - .dialog('option', 'buttons', { - "Confirm": function() { - // validate values - var isValid = true; - isValid &= validateString("Name", dialogEditDisk.find("#edit_disk_name"), dialogEditDisk.find("#edit_disk_name_errormsg")); - isValid &= validateString("Display Text", dialogEditDisk.find("#edit_disk_display"), dialogEditDisk.find("#edit_disk_display_errormsg")); - if (!isValid) return; - - var name = trim(dialogEditDisk.find("#edit_disk_name").val()); - var display = trim(dialogEditDisk.find("#edit_disk_display").val()); - - var dialogBox = $(this); - dialogBox.dialog("close"); - $.ajax({ - data: createURL("command=updateDiskOffering&name="+todb(name)+"&displayText="+todb(display)+"&id="+diskId+"&response=json"), - dataType: "json", - success: function(json) { - template.find("#disk_description").text(display); - template.find("#disk_name").text(name); - template.data("diskName", name); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "disk_action_delete" : - $("#dialog_confirmation") - .html("

Please confirm you want to remove the disk offering: "+diskName+" from the management server.

") - .dialog('option', 'buttons', { - "Confirm": function() { - var dialogBox = $(this); - $.ajax({ - data: createURL("command=deleteDiskOffering&id="+diskId+"&response=json"), - dataType: "json", - success: function(json) { - dialogBox.dialog("close"); - template.slideUp("slow", function() { - $(this).remove(); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), -1); - }); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - default : - break; - } - return false; - }); - - function diskJSONToTemplate(json, template) { - template.attr("id", "disk_"+json.id); - if (index++ % 2 == 0) { - template.addClass("smallrow_even"); - } else { - template.addClass("smallrow_odd"); - } - template.data("diskId", json.id).data("diskName", fromdb(json.name)); - - template.find("#disk_id").text(json.id); - template.find("#disk_name").text(fromdb(json.name)); - template.find("#disk_description").text(fromdb(json.displaytext)); - template.find("#disk_disksize").text(convertBytes(json.disksize)); - template.find("#disk_tags").text(fromdb(json.tags)); - template.find("#disk_domain").text(fromdb(json.domain)); - } - - function listDiskOfferings() { - var submenuContent = $("#submenu_content_disk"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(name)); - commandString = "command=listDiskOfferings&page="+currentPage+moreCriteria.join("")+"&response=json"; //moreCriteria.join("") - } else { - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listDiskOfferings&page="+currentPage+"&keyword="+searchInput+"&response=json"; - else - commandString = "command=listDiskOfferings&page="+currentPage+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listdiskofferingsresponse", "diskoffering", $("#disk_template"), diskJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_disk"), listDiskOfferings); - - $("#submenu_disk").bind("click", function(event) { - event.preventDefault(); - - $(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off"); - currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on"); - currentSubMenu = $(this); - - var submenuContent = $("#submenu_content_disk").show(); - $("#submenu_content_zones, #submenu_content_service, #submenu_content_global").hide(); - - currentPage=1; - listDiskOfferings(); - }); - - $("#submenu_global").click(); -} diff --git a/ui/2.1/scripts/cloud.core.domains.js b/ui/2.1/scripts/cloud.core.domains.js deleted file mode 100644 index 49cdf3b3685..00000000000 --- a/ui/2.1/scripts/cloud.core.domains.js +++ /dev/null @@ -1,399 +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 . - * - */ - -// Version: @VERSION@ - -function showDomainsTab() { - var defaultRootDomainId = g_domainid; - var defaultRootLevel = 0; - var index = 1; - var treeContentBox = $("#tree_contentbox"); - var treenodeTemplate = $("#treenode_template"); - var grid = $("#right_panel_grid"); - var gridRowTemplate = $("#grid_row_template"); - var gridContent = grid.find("#grid_content"); - var gridHeader = grid.find("#grid_header"); - var rightPanelDetailContent = $("#right_panel_detail_content"); - var rightPanelSearchResult = $("#right_panel_search_result"); - var rightPanelGrid = rightPanelDetailContent.find("#right_panel_grid"); - var domainDetail = rightPanelDetailContent.find("#domain_detail"); - var submenuContent = $("#submenu_content_domains"); - var searchButton = submenuContent.find("#search_button"); - var searchInput = submenuContent.find("#search_input"); - var searchResultsContainer = submenuContent.find("#search_results_container"); - var searchResultTemplate = $("#search_result_template"); - var breadcrumbBox = submenuContent.find("#breadcrumb_box"); - var breadcrumbPieceTemplate = $("#breadcrumb_piece_template"); - var childParentMap = {}; //map childDomainId to parentDomainId - var domainIdNameMap = {}; //map domainId to domainName - - activateDialog($("#dialog_resource_limits").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - function drawNode(json, level, container) { - if("parentdomainid" in json) - childParentMap[json.id] = json.parentdomainid; //map childDomainId to parentDomainId - domainIdNameMap[json.id] = json.name; //map domainId to domainName - - var template = treenodeTemplate.clone(true); - template.attr("id", "domain_"+json.id); - template.data("domainId", json.id).data("domainName", fromdb(json.name)).data("domainLevel", level); - template.find("#domain_title_container").attr("id", "domain_title_container_"+json.id); - template.find("#domain_expand_icon").attr("id", "domain_expand_icon_"+json.id); - template.find("#domain_name").attr("id", "domain_name_"+json.id).text(json.name); - template.find("#domain_children_container").attr("id", "domain_children_container_"+json.id); - container.append(template.show()); - return template; - } - - function drawTree(id, level, container) { - $.ajax({ - data: createURL("command=listDomainChildren&id="+id+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - var domains = json.listdomainchildrenresponse.domain; - if (domains != null && domains.length > 0) { - for (var i = 0; i < domains.length; i++) { - drawNode(domains[i], level, container); - if(domains[i].haschild==true) - drawTree(domains[i].id, (level+1), $("#domain_children_container_"+domains[i].id)); - } - } - } - }); - } - - function clickExpandIcon(domainId) { - var template = $("#domain_"+domainId); - var expandIcon = template.find("#domain_expand_icon_"+domainId); - if (expandIcon.hasClass("zonetree_closedarrows")) { - template.find("#domain_children_container_"+domainId).show(); - expandIcon.removeClass().addClass("zonetree_openarrows"); - } else { - template.find("#domain_children_container_"+domainId).hide(); - expandIcon.removeClass().addClass("zonetree_closedarrows"); - } - } - - function accountJSONToTemplate(json, template) { - if (index++ % 2 == 0) { - template.addClass("smallrow_odd"); - } else { - template.addClass("smallrow_even"); - } - template.find("#grid_row_cell1").text(json.domain); - template.find("#grid_row_cell2").text(json.name); - } - - function updateResourceLimit(domainId, type, max) { - $.ajax({ - data: createURL("command=updateResourceLimit&domainid="+domainId+"&resourceType="+type+"&max="+max+"&response=json"), - dataType: "json", - success: function(json) { - } - }); - } - - function listAdminAccounts(domainId) { - gridContent.empty(); - index = 0; - rightPanelDetailContent.find("#loading_gridtable").show(); - var accountType = (domainId==1)? 1: 2; - $.ajax({ - cache: false, - data: createURL("command=listAccounts&domainid="+domainId+"&accounttype="+accountType+"&response=json"), - dataType: "json", - success: function(json) { - var accounts = json.listaccountsresponse.account; - if (accounts != null && accounts.length > 0) { - for (var i = 0; i < accounts.length; i++) { - var template = gridRowTemplate.clone(true).attr("id","account"+accounts[i].id); - accountJSONToTemplate(accounts[i], template); - gridContent.append(template.show()); - } - } - rightPanelDetailContent.find("#loading_gridtable").hide(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - rightPanelDetailContent.find("#loading_gridtable").hide(); - } - }); - } - - treenodeTemplate.bind("click", function(event) { - var template = $(this); - var target = $(event.target); - var action = target.attr("id"); - var id = template.attr("id"); - var domainId = template.data("domainId"); - var domainName = template.data("domainName"); - if (action.indexOf("domain_expand_icon")!=-1) { - clickExpandIcon(domainId); - } - else if(action.indexOf("domain_name")!=-1) { - domainDetail.find("#domain_name").text(domainName); - domainDetail.find("#domain_id").text(domainId); - $.ajax({ - cache: false, - data: createURL("command=listAccounts&domainid="+domainId+"&response=json"), - dataType: "json", - success: function(json) { - var accounts = json.listaccountsresponse.account; - if (accounts != null) { - domainDetail.find("#redirect_to_account_page").text(accounts.length); - domainDetail.find("#redirect_to_account_page").bind("click", function() { - $("#menutab_role_root #menutab_accounts").data("domainId", domainId).click(); - }); - } - else { - domainDetail.find("#redirect_to_account_page").text(""); - domainDetail.find("#redirect_to_account_page").unbind("click"); - } - } - }); - - $.ajax({ - cache: false, - data: createURL("command=listVirtualMachines&domainid="+domainId+"&response=json"), - dataType: "json", - success: function(json) { - var instances = json.listvirtualmachinesresponse.virtualmachine; - if (instances != null) { - domainDetail.find("#redirect_to_instance_page").text(instances.length); - domainDetail.find("#redirect_to_instance_page").bind("click", function() { - $("#menutab_role_root #menutab_vm").data("domainId", domainId).click(); - }); - } - else { - domainDetail.find("#redirect_to_instance_page").text(""); - domainDetail.find("#redirect_to_instance_page").unbind("click"); - } - } - }); - - $.ajax({ - cache: false, - data: createURL("command=listVolumes&domainid="+domainId+"&response=json"), - dataType: "json", - success: function(json) { - var volumes = json.listvolumesresponse.volume; - if (volumes != null) { - domainDetail.find("#redirect_to_volume_page").text(volumes.length); - domainDetail.find("#redirect_to_volume_page").bind("click", function() { - $("#menutab_role_root #menutab_storage").data("domainId", domainId).data("targetTab", "submenu_volume").click(); - }); - } - else { - domainDetail.find("#redirect_to_volume_page").text(""); - domainDetail.find("#redirect_to_volume_page").unbind("click"); - } - } - }); - - if (isAdmin() || (isDomainAdmin() && (g_domainid != domainId))) { - $("#limits_container").show(); - $("#account_resource_limits").data("domainId", domainId).unbind("click").bind("click", function() { - var domainId = $(this).data("domainId"); - $.ajax({ - cache: false, - data: createURL("command=listResourceLimits&domainid="+domainId+"&response=json"), - dataType: "json", - success: function(json) { - var limits = json.listresourcelimitsresponse.resourcelimit; - var preInstanceLimit, preIpLimit, preDiskLimit, preSnapshotLimit, preTemplateLimit = -1; - if (limits != null) { - for (var i = 0; i < limits.length; i++) { - var limit = limits[i]; - switch (limit.resourcetype) { - case "0": - preInstanceLimit = limit.max; - $("#dialog_resource_limits #limits_vm").val(limit.max); - break; - case "1": - preIpLimit = limit.max; - $("#dialog_resource_limits #limits_ip").val(limit.max); - break; - case "2": - preDiskLimit = limit.max; - $("#dialog_resource_limits #limits_volume").val(limit.max); - break; - case "3": - preSnapshotLimit = limit.max; - $("#dialog_resource_limits #limits_snapshot").val(limit.max); - break; - case "4": - preTemplateLimit = limit.max; - $("#dialog_resource_limits #limits_template").val(limit.max); - break; - } - } - } - $("#dialog_resource_limits") - .dialog('option', 'buttons', { - "Save": function() { - // validate values - var isValid = true; - isValid &= validateNumber("Instance Limit", $("#dialog_resource_limits #limits_vm"), $("#dialog_resource_limits #limits_vm_errormsg"), -1, 32000, false); - isValid &= validateNumber("Public IP Limit", $("#dialog_resource_limits #limits_ip"), $("#dialog_resource_limits #limits_ip_errormsg"), -1, 32000, false); - isValid &= validateNumber("Disk Volume Limit", $("#dialog_resource_limits #limits_volume"), $("#dialog_resource_limits #limits_volume_errormsg"), -1, 32000, false); - isValid &= validateNumber("Snapshot Limit", $("#dialog_resource_limits #limits_snapshot"), $("#dialog_resource_limits #limits_snapshot_errormsg"), -1, 32000, false); - isValid &= validateNumber("Template Limit", $("#dialog_resource_limits #limits_template"), $("#dialog_resource_limits #limits_template_errormsg"), -1, 32000, false); - if (!isValid) return; - - var instanceLimit = trim($("#dialog_resource_limits #limits_vm").val()); - var ipLimit = trim($("#dialog_resource_limits #limits_ip").val()); - var diskLimit = trim($("#dialog_resource_limits #limits_volume").val()); - var snapshotLimit = trim($("#dialog_resource_limits #limits_snapshot").val()); - var templateLimit = trim($("#dialog_resource_limits #limits_template").val()); - - $(this).dialog("close"); - if (instanceLimit != preInstanceLimit) { - updateResourceLimit(domainId, 0, instanceLimit); - } - if (ipLimit != preIpLimit) { - updateResourceLimit(domainId, 1, ipLimit); - } - if (diskLimit != preDiskLimit) { - updateResourceLimit(domainId, 2, diskLimit); - } - if (snapshotLimit != preSnapshotLimit) { - updateResourceLimit(domainId, 3, snapshotLimit); - } - if (templateLimit != preTemplateLimit) { - updateResourceLimit(domainId, 4, templateLimit); - } - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - } - }); - return false; - }); - } else { - $("#limits_container").hide(); - } - - rightPanelDetailContent.show(); - rightPanelSearchResult.hide(); - - listAdminAccounts(domainId); - rightPanelGrid.show(); - } - - return false; - }); - - searchResultTemplate.bind("click", function(event) { - var template = $(this); - var target = $(event.target); - var action = target.attr("id"); - var id = template.attr("id"); - var domainId = template.data("domainId"); - if(action=="domain_name") - refreshWholeTree(domainId, defaultRootLevel); - }); - - searchButton.bind("click", function(event) { - searchResultsContainer.empty(); - rightPanelDetailContent.hide(); - rightPanelSearchResult.show(); - var keyword = searchInput.val(); - $.ajax({ - data: createURL("command=listDomains&keyword="+keyword+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - var domains = json.listdomainsresponse.domain; - if (domains != null && domains.length > 0) { - for(var i=0; i 0) { - var node = drawNode(domains[0], defaultRootLevel, treeContentBox); - - var treeLevelsbox = node.find(".tree_levelsbox"); //root node shouldn't have margin-left:20px - if(treeLevelsbox!=null && treeLevelsbox.length >0) - treeLevelsbox[0].style.marginLeft="0px"; //set root node's margin-left to 0px. - } - } - }); - } - - breadcrumbPieceTemplate.bind("click", function(event) { - var domainId = $(this).data("domainId"); - refreshWholeTree(domainId); - }); - - //draw breadcrumb all the way up - function drawBreadcrumb(domainId) { - var domainName = domainIdNameMap[domainId]; - if(domainName == null) - return; - - var onePiece = breadcrumbPieceTemplate.clone(true).attr("id", "breadcrumb_"+domainId).data("domainId", domainId).text(" > "+domainName); - breadcrumbBox.prepend(onePiece.show()); - - var parentDomainId = childParentMap[domainId]; - if(parentDomainId!=null) - drawBreadcrumb(parentDomainId); - } - - function refreshWholeTree(rootDomainId, rootLevel) { - drawRootNode(rootDomainId); - drawTree(rootDomainId, (rootLevel+1), $("#domain_children_container_"+rootDomainId)); //draw the whole tree (under root node) - $("#domain_"+rootDomainId).show(); //show root node - clickExpandIcon(rootDomainId); //expand root node - - breadcrumbBox.empty(); - drawBreadcrumb(rootDomainId); - } - - refreshWholeTree(defaultRootDomainId, defaultRootLevel); -} diff --git a/ui/2.1/scripts/cloud.core.events.js b/ui/2.1/scripts/cloud.core.events.js deleted file mode 100644 index 89cd475e4f2..00000000000 --- a/ui/2.1/scripts/cloud.core.events.js +++ /dev/null @@ -1,284 +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 . - * - */ - -// Version: @VERSION@ - -function showEventsTab(showEvents) { - var currentSubMenu = $("#submenu_events"); - - var initializeEventTab = function(isAdmin) { - initResizable("event_initiated_by_header", "event_initiated_by_row"); - initResizable("event_account_header", "event_account_row"); - initResizable("event_type_header", "event_type_row"); - initResizable("event_level_header", "event_level_row"); - initResizable("event_description_header", "event_description_row"); - initResizable("event_state_header", "event_state_row"); - initResizable("event_date_header", "event_date_row"); - - var eIndex = 0; - function eventJSONToTemplate(json, template) { - if (eIndex++ % 2 == 0) { - template.addClass("smallrow_odd"); - } else { - template.addClass("smallrow_even"); - } - template.find("#event_username").text(json.username); - template.find("#event_account").text(json.account); - template.find("#event_type").text(json.type); - template.find("#event_level").text(json.level); - template.find("#event_desc").text(json.description); - template.find("#event_state").text(json.state); - - setDateField(json.created, template.find("#event_date")); - } - - $("#submenu_content_events .grid_container .grid_header .grid_genheader_cell").bind("click", function(event) { - var headerColumn = $(this); - var sortingIcon = headerColumn.find(".gridsorting_arrow"); - - if (sortingIcon.hasClass("up") == false) { //If it's not in ascending order, sort it ascending. - $("#submenu_content_events .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first - sortingIcon.addClass("up"); //add up arrow to this specific header column - sortingOrder = "asc"; - } - else if (sortingIcon.hasClass("up") == true) { //If it's in ascending order, sort it descending. - $("#submenu_content_events .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first - sortingIcon.addClass("down"); //add down arrow to this specific header column - sortingOrder = "desc"; - } - - switch(headerColumn[0].id) { - case "event_initiated_by_header": - sortBy = "username"; - items.sort(sortArrayAlphabetically); - break; - case "event_account_header": - sortBy = "account"; - items.sort(sortArrayAlphabetically); - break; - case "event_type_header": - sortBy = "type"; - items.sort(sortArrayAlphabetically); - break; - case "event_level_header": - sortBy = "level"; - items.sort(sortArrayAlphabetically); - break; - case "event_description_header": - sortBy = "description"; - items.sort(sortArrayAlphabetically); - break; - case "event_state_header": - sortBy = "state"; - items.sort(sortArrayAlphabetically); - break; - case "event_date_header": - sortBy = "created"; - items.sort(sortArrayByDate); - break; - } - - drawGrid(items, $("#submenu_content_events"), $("#event_template"), eventJSONToTemplate); - return false; - }); - - function listEvents() { - var submenuContent = $("#submenu_content_events"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var type = submenuContent.find("#advanced_search #adv_search_type").val(); - var level = submenuContent.find("#advanced_search #adv_search_level").val(); - var domainId = submenuContent.find("#advanced_search #adv_search_domain").val(); - var account = submenuContent.find("#advanced_search #adv_search_account").val(); - var startdate = submenuContent.find("#advanced_search #adv_search_startdate").val(); - var enddate = submenuContent.find("#advanced_search #adv_search_enddate").val(); - var moreCriteria = []; - if (type!=null && trim(type).length > 0) - moreCriteria.push("&type="+type); - if (level!=null && level.length > 0) - moreCriteria.push("&level="+level); - if (domainId!=null && domainId.length > 0) - moreCriteria.push("&domainid="+domainId); - if (account!=null && account.length > 0) - moreCriteria.push("&account="+todb(account)); - if (startdate!=null && startdate.length > 0) - moreCriteria.push("&startdate="+todb(startdate)); - if (enddate!=null && enddate.length > 0) - moreCriteria.push("&enddate="+todb(enddate)); - commandString = "command=listEvents&page="+currentPage+moreCriteria.join("")+"&response=json"; - } else { - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listEvents&page="+currentPage+"&keyword="+searchInput+"&response=json" - else - commandString = "command=listEvents&page="+currentPage+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listeventsresponse", "event", $("#event_template"), eventJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_events"), listEvents); - - if(isAdmin) { - $("#submenu_events").bind("click", function(event) { - event.preventDefault(); - - $(this).removeClass().addClass("submenu_links_on"); - currentSubMenu.removeClass().toggleClass("submenu_links_off"); - currentSubMenu = $(this); - - var submenuContent = $("#submenu_content_events").show(); - $("#submenu_content_alerts").hide(); - - submenuContent.find("#adv_search_domain_li, #adv_search_account_li").show(); - - currentPage = 1; - listEvents(); - }); - - $(".submenu_links, #submenu_content_alerts, #alert_template").show(); - $("#event_account_header, #event_account_container").show(); - - if (showEvents == null || showEvents) { - currentSubMenu = $("#submenu_alerts"); - $("#submenu_events").click(); //Default tab is Events when login as admin - } else { - currentSubMenu = $("#submenu_events"); - $("#submenu_alerts").click(); - } - } - else { - $(".submenu_links, #submenu_content_alerts, #alert_template").hide(); - $("#event_account_header, #event_account_container").hide(); - $("#submenu_content_events").show(); - listEvents(); - } - } - - - // Manage Events - var advancedSearch = $("#advanced_search"); - advancedSearch.find("#adv_search_startdate, #adv_search_enddate").datepicker({dateFormat: 'yy-mm-dd'}); - - if (isAdmin()) { - // *** Alerts (begin) *** - var alertIndex = 0; - function alertJSONToTemplate(json, template) { - if (alertIndex++ % 2 == 0) { - template.addClass("smallrow_odd"); - } else { - template.addClass("smallrow_even"); - } - - template.find("#alert_type").text((toAlertType(json.type))); - template.find("#alert_desc").text(json.description); - - setDateField(json.sent, template.find("#alert_sent")); - } - - $("#submenu_content_alerts .grid_container .grid_header .grid_genheader_cell").bind("click", function(event) { - var headerColumn = $(this); - var sortingIcon = headerColumn.find(".gridsorting_arrow"); - - if (sortingIcon.hasClass("up") == false) { //If it's not in ascending order, sort it ascending. - $("#submenu_content_alerts .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first - sortingIcon.addClass("up"); //add up arrow to this specific header column - sortingOrder = "asc"; - } - else if (sortingIcon.hasClass("up") == true) { //If it's in ascending order, sort it descending. - $("#submenu_content_alerts .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first - sortingIcon.addClass("down"); //add down arrow to this specific header column - sortingOrder = "desc"; - } - - switch(headerColumn[0].id) { - case "alert_type_header": - sortBy = "type"; - parseFunction = toAlertType; - items.sort(sortArrayAlphabeticallyParse); - break; - case "alert_description_header": - sortBy = "description"; - items.sort(sortArrayAlphabetically); - break; - case "alert_date_header": - sortBy = "sent"; - items.sort(sortArrayAlphabetically); - break; - } - - drawGrid(items, $("#submenu_content_alerts"), $("#alert_template"), alertJSONToTemplate); - return false; - }); - - function listAlerts() { - var submenuContent = $("#submenu_content_alerts"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var type = submenuContent.find("#advanced_search #adv_search_type").val(); - var moreCriteria = []; - if (type!=null && trim(type).length > 0) - moreCriteria.push("&type="+type); - commandString = "command=listAlerts&page="+currentPage+moreCriteria.join("")+"&response=json"; - } else { - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listAlerts&page="+currentPage+"&keyword="+searchInput+"&response=json" - else - commandString = "command=listAlerts&page="+currentPage+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listalertsresponse", "alert", $("#alert_template"), alertJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_alerts"), listAlerts); - - $("#submenu_alerts").bind("click", function(event) { - event.preventDefault(); - - $(this).removeClass().addClass("submenu_links_on"); - currentSubMenu.removeClass().toggleClass("submenu_links_off"); - currentSubMenu = $(this); - - var submenuContent = $("#submenu_content_alerts").show(); - $("#submenu_content_events").hide(); - - currentPage = 1; - listAlerts(); - }); - // *** Alerts (end) *** - - // *** Events (begin) *** - initializeEventTab(true); - // *** Events (end) *** - - - } else { - - // *** Events (begin) *** - initializeEventTab(false); - // *** Events (end) *** - - } -} \ No newline at end of file diff --git a/ui/2.1/scripts/cloud.core.hosts.js b/ui/2.1/scripts/cloud.core.hosts.js deleted file mode 100644 index 985618eb9b8..00000000000 --- a/ui/2.1/scripts/cloud.core.hosts.js +++ /dev/null @@ -1,709 +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 . - * - */ - -// Version: @VERSION@ - -function showHostsTab() { - var rIndex = 0; - var sIndex = 0; - var pIndex = 0; - - // Dialog Setup - $("#host_action_new_routing").show(); - activateDialog($("#dialog_add_routing").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - var dialogAddRouting = $("#dialog_add_routing"); - - $.ajax({ - data: createURL("command=listZones&available=true&response=json"), - dataType: "json", - success: function(json) { - var zones = json.listzonesresponse.zone; - var zoneSelect = dialogAddRouting.find("#host_zone").empty(); - if (zones != null && zones.length > 0) { - for (var i = 0; i < zones.length; i++) - zoneSelect.append(""); - } - //dialogAddRouting.find("#host_zone").change(); - } - }); - - dialogAddRouting.find("#host_zone").bind("change", function(event) { - var zoneId = $(this).val(); - $.ajax({ - data: createURL("command=listPods&zoneId="+zoneId+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - var pods = json.listpodsresponse.pod; - var podSelect = dialogAddRouting.find("#host_pod").empty(); - if (pods != null && pods.length > 0) { - for (var i = 0; i < pods.length; i++) { - podSelect.append(""); - } - } - dialogAddRouting.find("#host_pod").change(); - } - }); - }); - - dialogAddRouting.find("#host_pod").bind("change", function(event) { - var podId = $(this).val(); - if(podId == null || podId.length == 0) - return; - var clusterSelect = dialogAddRouting.find("#cluster_select").empty(); - $.ajax({ - data: createURL("command=listClusters&response=json&podid=" + podId), - dataType: "json", - success: function(json) { - var items = json.listclustersresponse.cluster; - if(items != null && items.length > 0) { - for(var i=0; i" + fromdb(items[i].name) + ""); - dialogAddRouting.find("input[value=existing_cluster_radio]").attr("checked", true); - } - else { - clusterSelect.append(""); - dialogAddRouting.find("input[value=new_cluster_radio]").attr("checked", true); - } - } - }); - }); - - activateDialog($("#dialog_update_os").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - $.ajax({ - data: createURL("command=listOsCategories&response=json"), - dataType: "json", - success: function(json) { - var categories = json.listoscategoriesresponse.oscategory; - var select = $("#dialog_update_os #host_os"); - if (categories != null && categories.length > 0) { - for (var i = 0; i < categories.length; i++) - select.append(""); - } - } - }); - - // Routing Template Setup - var routingTemplate = $("#routing_template"); - routingTemplate.bind("mouseenter", function(event) { - $(this).find("#grid_links_container").show(); - return false; - }); - routingTemplate.bind("mouseleave", function(event) { - $(this).find("#grid_links_container").hide(); - return false; - }); - - function vmJSONToTemplate(json, template, type) { - var template = template.attr("id","vm"+json.id); - if (index++ % 2 == 0) { - template.addClass("hostadmin_showdetails_row_even"); - } else { - template.addClass("hostadmin_showdetails_row_odd"); - } - template.find("#detail_type").text(type); - template.find("#detail_name").text(getVmName(json.name, json.displayname)); - - if(type == "Instance") - template.find("#detail_ip").text(json.ipaddress); - else //Router, System - template.find("#detail_ip").text(json.privateip); - - template.find("#detail_service").text(json.serviceofferingname); - - if(json.account == null && type == "System") - template.find("#detail_owner").text("system"); - else - template.find("#detail_owner").text(json.account); - - setDateField(json.created, template.find("#detail_created")); - } - - routingTemplate.bind("click", function(event) { - var template = $(this); - var link = $(event.target); - var linkAction = link.attr("id"); - var hostId = template.data("hostId"); - var hostName = template.data("hostName"); - var submenuContent = $("#submenu_content_routing"); - switch (linkAction) { - case "host_action_details" : - var expanded = link.data("expanded"); - if (expanded == null || expanded == false) { - var itemTotal = 0; - var vms, routers, systemVms; - $.ajax({ - cache: false, - data: createURL("command=listVirtualMachines&hostid="+hostId+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - vms = json.listvirtualmachinesresponse.virtualmachine; - if(vms != null) - itemTotal += vms.length; - } - }); - $.ajax({ - cache: false, - data: createURL("command=listRouters&hostid="+hostId+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - routers = json.listroutersresponse.router; - if(routers != null) - itemTotal += routers.length; - } - }); - $.ajax({ - cache: false, - data: createURL("command=listSystemVms&hostid="+hostId+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - systemVms = json.listsystemvmsresponse.systemvm; - if(systemVms != null) - itemTotal += systemVms.length; - } - }); - - if(itemTotal > 0) { - var detailGrid = template.find("#detail_container").empty(); - var detailTemplate = $("#routing_detail_template"); - if (vms != null && vms.length > 0) { - for (var i = 0; i < vms.length; i++) { - var newDetailTemplate = detailTemplate.clone(true); - vmJSONToTemplate(vms[i], newDetailTemplate, "Instance"); - detailGrid.append(newDetailTemplate.show()); - } - } - if (routers != null && routers.length > 0) { - for (var i = 0; i < routers.length; i++) { - var newDetailTemplate = detailTemplate.clone(true); - vmJSONToTemplate(routers[i], newDetailTemplate, "Router"); - detailGrid.append(newDetailTemplate.show()); - } - } - if (systemVms != null && systemVms.length > 0) { - for (var i = 0; i < systemVms.length; i++) { - var newDetailTemplate = detailTemplate.clone(true); - vmJSONToTemplate(systemVms[i], newDetailTemplate, "System"); - detailGrid.append(newDetailTemplate.show()); - } - } - } - template.find("#host_action_details_container img").attr("src", "images/details_uparrow.jpg"); - template.find("#host_action_details_container a").text("Hide Details"); - template.find("#host_detail_panel").slideDown("slow"); - link.data("expanded", true); - } else { - template.find("#host_action_details_container img").attr("src", "images/details_downarrow.jpg"); - template.find("#host_action_details_container a").text("Show Details"); - template.find("#host_detail_panel").slideUp("slow"); - link.data("expanded", false); - } - break; - case "host_action_enable_maint" : - $("#dialog_confirmation") - .html("

Please confirm you enable maintenance for host: "+fromdb(hostName)+". Enabling maintenance mode will cause a live migration of all running instances on this host to any available host. An alert will be sent to the admin when this process has been completed.

") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - $.ajax({ - data: createURL("command=prepareHostForMaintenance&id="+hostId+"&response=json"), - dataType: "json", - success: function(json) { - template.find(".row_loading").show(); - template.find(".loading_animationcontainer .loading_animationtext").text("Preparing..."); - template.find(".loading_animationcontainer").show(); - template.fadeIn("slow"); - var that = template; - template.find(".continue_button").data("hostId", hostId).unbind("click").bind("click", function(event) { - that.find(".loading_animationcontainer").hide(); - that.find(".loadingmessage_container").fadeOut("slow"); - that.find(".row_loading").fadeOut("slow"); - - // Host status is likely to change at this point. So, refresh the row now. - $.ajax({ - data: createURL("command=listHosts&id="+hostId+"&response=json"), - dataType: "json", - success: function(json) { - routingJSONToTemplate(json.listhostsresponse.host[0], that); - } - }); - return false; - }); - var timerKey = "host"+hostId; - $("body").everyTime( - 15000, // Migration could possibly take a while - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.preparehostformaintenanceresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - routingStateToTemplate(result.host[0].state, template); - template.find("#routing_disconnected").text(result.host[0].disconnected); - template.find(".loadingmessage_container .loadingmessage_top p").html("We are actively enabling maintenance on your host. Please refresh periodically for an updated status."); - template.find(".loadingmessage_container").fadeIn("slow"); - } else if (result.jobstatus == 2) { - // Failed - routingStateToTemplate(result.host[0].state, template); - template.find(".loadingmessage_container .loadingmessage_top p").text("We were unable to successfully prepare your host for maintenance. Please check your logs for more info."); - template.find(".loadingmessage_container").fadeIn("slow"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "host_action_cancel_maint" : - $("#dialog_confirmation") - .html("

Please confirm you want to cancel maintenance for host: "+fromdb(hostName)+".

") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - $.ajax({ - data: createURL("command=cancelHostMaintenance&id="+hostId+"&response=json"), - dataType: "json", - success: function(json) { - template.find(".row_loading").show(); - template.find(".loading_animationcontainer .loading_animationtext").text("Cancelling..."); - template.find(".loading_animationcontainer").show(); - template.fadeIn("slow"); - var that = template; - template.find(".continue_button").data("hostId", hostId).unbind("click").bind("click", function(event) { - that.find(".loading_animationcontainer").hide(); - that.find(".loadingmessage_container").fadeOut("slow"); - that.find(".row_loading").fadeOut("slow"); - - // Host status is likely to change at this point. So, refresh the row now. - $.ajax({ - data: createURL("command=listHosts&id="+hostId+"&response=json"), - dataType: "json", - success: function(json) { - routingJSONToTemplate(json.listhostsresponse.host[0], that); - } - }); - return false; - }); - var timerKey = "host"+hostId; - $("body").everyTime( - 5000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.cancelhostmaintenanceresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - routingStateToTemplate(result.host[0].state, template); //result.host[0].status == "ErrorInMaintenance" - template.find("#routing_disconnected").text(result.host[0].disconnected); - template.find(".loadingmessage_container .loadingmessage_top p").html("We are actively cancelling your scheduled maintenance. Please refresh periodically for an updated status."); - template.find(".loadingmessage_container").fadeIn("slow"); - } else if (result.jobstatus == 2) { - // Failed - routingStateToTemplate(result.host[0].state, template); - template.find(".loadingmessage_container .loadingmessage_top p").text("We were unable to cancel your maintenance process. Please try again."); - template.find(".loadingmessage_container").fadeIn("slow"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - template.find(".loading_animationcontainer").hide(); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "host_action_reconnect" : - $("#dialog_confirmation") - .html("

Please confirm you want to force a reconnection for host: "+fromdb(hostName)+".

") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - $.ajax({ - data: createURL("command=reconnectHost&id="+hostId+"&response=json"), - dataType: "json", - success: function(json) { - template.find(".row_loading").show(); - template.find(".loading_animationcontainer .loading_animationtext").text("Reconnecting..."); - template.find(".loading_animationcontainer").show(); - template.fadeIn("slow"); - var that = template; - template.find(".continue_button").data("hostId", hostId).unbind("click").bind("click", function(event) { - that.find(".loading_animationcontainer").hide(); - that.find(".loadingmessage_container").fadeOut("slow"); - that.find(".row_loading").fadeOut("slow"); - - // Host status is likely to change at this point. So, refresh the row now. - $.ajax({ - data: createURL("command=listHosts&id="+hostId+"&response=json"), - dataType: "json", - success: function(json) { - routingJSONToTemplate(json.listhostsresponse.host[0], that); - } - }); - return false; - }); - var timerKey = "host"+hostId; - $("body").everyTime( - 5000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.reconnecthostresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - routingStateToTemplate(result.host[0].state, template); - template.find("#routing_disconnected").text(result.host[0].disconnected); - template.find(".loadingmessage_container .loadingmessage_top p").html("We are actively reconnecting your host. Please refresh periodically for an updated status."); - template.find(".loadingmessage_container").fadeIn("slow"); - - } else if (result.jobstatus == 2) { - // Failed - routingStateToTemplate(result.host[0].state, template); - template.find(".loadingmessage_container .loadingmessage_top p").text("We were unable to reconnect your host. Please try again."); - template.find(".loadingmessage_container").fadeIn("slow"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "host_action_remove" : - $("#dialog_confirmation") - .html("

Please confirm you want to remove this host: "+fromdb(hostName)+" from the management server.

") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - $.ajax({ - data: createURL("command=deleteHost&id="+hostId+"&response=json"), - dataType: "json", - success: function(json) { - template.slideUp("slow", function() { - $(this).remove(); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), -1); - }); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "host_action_update_os" : - $("#dialog_update_os #host_os").val(template.data("osId")); - $("#dialog_update_os") - .dialog('option', 'buttons', { - "Update": function() { - $(this).dialog("close"); - var osId = $("#dialog_update_os #host_os").val(); - var osName = $("#dialog_update_os #host_os option:selected").text(); - var category = ""; - if (osId.length > 0) { - category = "&osCategoryId="+osId; - } - $.ajax({ - data: createURL("command=updateHost&id="+hostId+category+"&response=json"), - dataType: "json", - success: function(json) { - template.find("#routing_os").text(osName); - template.data("osId", osId); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - default : - break; - } - return false; - }); - - // FUNCTION: Routing JSON to Template - function routingJSONToTemplate(json, template) { - template.attr("id", "host"+json.id); - - if (index++ % 2 == 0) { - template.find("#row_container").addClass("row_even"); - } else { - template.find("#row_container").addClass("row_odd"); - } - template.data("hostId", json.id).data("hostName", fromdb(json.name)); - - template.find("#routing_zone").text(fromdb(json.zonename)); - template.find("#routing_pod").text(fromdb(json.podname)); - template.find("#routing_cluster").text(fromdb(json.clustername)); - - template.find("#routing_name").text(fromdb(json.name)); - template.find("#routing_ipaddress").text(json.ipaddress); - template.find("#routing_version").text(json.version); - template.find("#routing_os").text(json.oscategoryname); - template.data("osId", json.oscategoryid); - - setDateField(json.disconnected, template.find("#routing_disconnected")); - - var spaceCharacter = "      " - var statHtml = "

CPU Total: " + ((json.cpunumber==null)? spaceCharacter:json.cpunumber) + " x " + ((json.cpuspeed==null)? spaceCharacter:convertHz(json.cpuspeed))+" | CPU Allocated: " + ((json.cpuallocated==null)? spaceCharacter:json.cpuallocated) + " | CPU Used: " + ((json.cpuused==null)? spaceCharacter:json.cpuused) + "

"; - template.find("#host_cpu_stat").html(statHtml); - statHtml = "

MEM Total: " + ((json.memorytotal==null)? spaceCharacter:convertBytes(json.memorytotal))+" | MEM Allocated: " + ((json.memoryallocated==null)? spaceCharacter:convertBytes(json.memoryallocated)) + " | MEM Used: " + ((json.memoryused==null)? spaceCharacter:convertBytes(json.memoryused)) + "

"; - template.find("#host_mem_stat").html(statHtml); - statHtml = "

Network Read: " + ((json.networkkbsread==null)? spaceCharacter:convertBytes(json.networkkbsread * 1024))+" | Network Write: " + ((json.networkkbswrite==null)? spaceCharacter:convertBytes(json.networkkbswrite * 1024)) + "

"; - template.find("#host_network_stat").html(statHtml); - - routingStateToTemplate(json.state, template); - } - - function routingStateToTemplate(state, template) { - template.find(".grid_links").find("#host_action_reconnect_container, #host_action_enable_maint_container, #host_action_cancel_maint_container, #host_action_remove_container, #host_action_update_os_container").show(); - - if (state == 'Up' || state == "Connecting") { - template.find("#host_state_bar").removeClass("yellow_statusbar grey_statusbar red_statusbar").addClass("green_statusbar "); - template.find("#routing_state").text(state).removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - template.find(".grid_links").find("#host_action_cancel_maint_container, #host_action_remove_container").hide(); - } else if (state == 'Down' || state == "Alert") { - template.find("#host_state_bar").removeClass("yellow_statusbar grey_statusbar green_statusbar").addClass("red_statusbar"); - template.find("#routing_state").text(state).removeClass("grid_celltitles grid_runningtitles").addClass("grid_stoppedtitles"); - - if (state == "Alert") { - template.find(".grid_links").find("#host_action_reconnect_container, #host_action_enable_maint_container, #host_action_cancel_maint_container, #host_action_remove_container").hide(); - } else { - template.find(".grid_links").find("#host_action_reconnect_container, #host_action_cancel_maint_container").hide(); - } - } else { - template.find("#host_state_bar").removeClass("yellow_statusbar green_statusbar red_statusbar").addClass("grey_statusbar"); - template.find("#routing_state").text(state).removeClass("grid_runningtitles grid_stoppedtitles").addClass("grid_celltitles "); - - if (state == "ErrorInMaintenance") { - template.find(".grid_links").find("#host_action_reconnect_container, #host_action_remove_container").hide(); - } else if (state == "PrepareForMaintenance") { - template.find(".grid_links").find("#host_action_reconnect_container, #host_action_enable_maint_container, #host_action_remove_container").hide(); - } else if (state == "Maintenance") { - template.find(".grid_links").find("#host_action_reconnect_container, #host_action_enable_maint_container").hide(); - } else if (state == "Disconnected") { - template.find(".grid_links").find("#host_action_reconnect_container, #host_action_enable_maint_container, #host_action_cancel_maint_container").hide(); - } else { - alert("Unsupported Host State: " + state); - } - } - } - - var submenuContent = $("#submenu_content_routing"); - - // Add New Routing Host - $("#host_action_new_routing").bind("click", function(event) { - dialogAddRouting.find("#new_cluster_name").val(""); - dialogAddRouting.find("#host_zone").change(); //refresh cluster dropdown - - dialogAddRouting - .dialog('option', 'buttons', { - "Add": function() { - var dialogBox = $(this); - var clusterRadio = dialogBox.find("input[name=cluster]:checked").val(); - - // validate values - var isValid = true; - isValid &= validateString("Host name", dialogBox.find("#host_hostname"), dialogBox.find("#host_hostname_errormsg")); - isValid &= validateString("User name", dialogBox.find("#host_username"), dialogBox.find("#host_username_errormsg")); - isValid &= validateString("Password", dialogBox.find("#host_password"), dialogBox.find("#host_password_errormsg")); - if (!isValid) return; - - var array1 = []; - - var zoneId = dialogBox.find("#host_zone").val(); - array1.push("&zoneId="+zoneId); - - var podId = dialogBox.find("#host_pod").val(); - array1.push("&podId="+podId); - - var username = trim(dialogBox.find("#host_username").val()); - array1.push("&username="+encodeURIComponent(username)); - - var password = trim(dialogBox.find("#host_password").val()); - array1.push("&password="+encodeURIComponent(password)); - - if(clusterRadio == "new_cluster_radio") { - var newClusterName = trim(dialogBox.find("#new_cluster_name").val()); - array1.push("&clustername="+todb(newClusterName)); - } - else if(clusterRadio == "existing_cluster_radio") { - var clusterId = dialogBox.find("#cluster_select").val(); - // We will default to no cluster if someone selects Join Cluster with no cluster available. - if (clusterId != '-1') { - array1.push("&clusterid="+clusterId); - } - } - - var hostname = trim(dialogBox.find("#host_hostname").val()); - var url; - if(hostname.indexOf("http://")==-1) - url = "http://" + todb(hostname); - else - url = hostname; - array1.push("&url="+encodeURIComponent(url)); - - var template = $("#routing_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - submenuContent.find("#grid_content").append(template.fadeIn("slow")); - - dialogBox.dialog("close"); - $.ajax({ - data: createURL("command=addHost&response=json" + array1.join("")), - dataType: "json", - success: function(json) { - var items = json.addhostresponse.host; - routingJSONToTemplate(items[0], template); - loadingImg.hide(); - rowContainer.show(); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1); - - if(items.length > 1) { - for(var i=1; i 0) - moreCriteria.push("&name="+todb(name)); - if (state!=null && state.length > 0) - moreCriteria.push("&state="+state); - if (zone!=null && zone.length > 0) - moreCriteria.push("&zoneId="+zone); - if (pod!=null && pod.length > 0) - moreCriteria.push("&podId="+pod); - commandString = "command=listHosts&page=" + currentPage + moreCriteria.join("") + "&type=Routing&response=json"; //moreCriteria.join("") - } else { - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listHosts&page=" + currentPage + "&keyword=" + searchInput + "&type=Routing&response=json"; - else - commandString = "command=listHosts&page=" + currentPage + "&type=Routing&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listhostsresponse", "host", $("#routing_template"), routingJSONToTemplate); - }; - - submenuContentEventBinder($("#submenu_content_routing"), listHosts); - - currentPage = 1; - listHosts(); -} diff --git a/ui/2.1/scripts/cloud.core.init.js b/ui/2.1/scripts/cloud.core.init.js deleted file mode 100644 index 23f81291352..00000000000 --- a/ui/2.1/scripts/cloud.core.init.js +++ /dev/null @@ -1,802 +0,0 @@ -$(document).ready(function() { - // Prevent the UI from being iframed if the iframe isn't from the same domain. - try { - if ( top != self && self.location.hostname != top.location.hostname) { - // leaving the code here in the oft change an older browser is being used that does not have - // cross-site scripting prevention. - alert("Detected a frame (" + top.location.hostname + ") not from the same domain (" + self.location.hostname + "). Moving app to top of browser to prevent any security tampering."); - top.location.href = window.location.href; - } - } catch (err) { - // This means the domains are different because the browser is preventing access to the parent's domain. - alert("Detected a frame not from the same domain (" + self.location.hostname + "). Moving app to top of browser to prevent any security tampering."); - top.location.href = window.location.href; - } - - // We don't support IE6 at the moment, so let's just inform customers it won't work - var IE6 = false /*@cc_on || @_jscript_version < 5.7 @*/; - var gteIE7 = false /*@cc_on || @_jscript_version >= 5.7 @*/; - - // Disable IE6 browsers as UI does not support it - if (IE6 == true) { - alert("Only IE7, IE8, FireFox 3.x, Chrome, and Safari browsers are supported at this time."); - return; - } - - initializeTestTool(); - - // We will be dropping all the main tab content into this container - mainContainer = $("#maincontentarea"); - - // Tab Links, dashboard is the initial active tab - mainContainer.load("jsp/tab_dashboard.jsp"); - - // Default AJAX Setup - $.ajaxSetup({ - url: "/client/api", - dataType: "json", - cache: false, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - }, - beforeSend: function(XMLHttpRequest) { - if (g_mySession == $.cookie("JSESSIONID")) { - return true; - } else { - $("#dialog_session_expired").dialog("open"); - return false; - } - } - }); - - // LOGIN/LOGOUT - // 'Enter' Key in any login form element = Submit click - $("#logoutpage #loginForm").keypress(function(event) { - var formId = $(event.target).attr("id"); - if(event.keyCode == keycode_Enter && formId != "loginbutton") { - login(); - } - }); - - $("#logoutpage .loginbutton").bind("click", function(event) { - login(); - return false; - }); - - $("#logoutaccount_link").bind("click", function(event) { - $.ajax({ - data: createURL("command=logout&response=json"), - dataType: "json", - success: function(json) { - logout(true); - }, - error: function() { - logout(true); - }, - beforeSend : function(XMLHTTP) { - return true; - } - }); - }); - - // FUNCTION: logs the user out - var activeTab = null; - function logout(refresh) { - g_mySession = null; - g_sessionKey = null; - g_username = null; - g_account = null; - g_domainid = null; - g_timezoneoffset = null; - g_timezone = null; - - $.cookie('JSESSIONID', null); - $.cookie('sessionKey', null); - $.cookie('username', null); - $.cookie('account', null); - $.cookie('domainid', null); - $.cookie('role', null); - $.cookie('networktype', null); - $.cookie('timezoneoffset', null); - $.cookie('timezone', null); - - $("body").stopTime(); - - // default is to redisplay the login page - if (onLogoutCallback()) { - if (refresh) { - location.replace('/client'); - return false; - } - $("#account_password").val(""); - $(".loginbutton_box p").hide(); - $("#logoutpage").show(); - $("body").css("background", "#4e4e4e url(images/logout_bg.gif) repeat-x top left"); - mainContainer.empty(); - $("#mainmaster").hide(); - $("#overlay_black").hide(); - - var menuOnClass = "menutab_on"; - var menuOffClass = "menutab_off"; - var tab = null; - if (isAdmin()) { - tab = $("#menutab_dashboard_root"); - menuOnClass = "admin_menutab_on"; - menuOffClass = "admin_menutab_off"; - } else if (isDomainAdmin()) { - tab = $("#menutab_dashboard_domain"); - menuOnClass = "admin_menutab_on"; - menuOffClass = "admin_menutab_off"; - } else if (isUser()) { - tab = $("#menutab_dashboard_user"); - menuOnClass = "menutab_on"; - menuOffClass = "menutab_off"; - } - if (activeTab != null) { - activeTab.removeClass(menuOnClass).addClass(menuOffClass); - activeTab = null; - } - if (tab != null) { - tab.removeClass(menuOffClass).addClass(menuOnClass); - } - g_role = null; - $("#account_username").focus(); - } - } - - // FUNCTION: logs the user in - function login() { - var array1 = []; - var username = encodeURIComponent($("#account_username").val()); - array1.push("&username="+username); - - var password = $.md5(encodeURIComponent($("#account_password").val())); - array1.push("&password="+password); - - var domain = encodeURIComponent($("#account_domain").val()); - if(domain != null && domain.length > 0) - array1.push("&domain="+domain); - - $.ajax({ - type: "POST", - data: createURL("command=login&response=json" + array1.join("")), - dataType: "json", - async: false, - success: function(json) { - g_mySession = $.cookie('JSESSIONID'); - g_sessionKey = encodeURIComponent(json.loginresponse.sessionkey); - g_role = json.loginresponse.type; - g_username = json.loginresponse.username; - g_account = json.loginresponse.account; - g_domainid = json.loginresponse.domainid; - g_timezone = json.loginresponse.timezone; - g_timezoneoffset = json.loginresponse.timezoneoffset; - if (json.loginresponse.networktype != null) - g_networkType = json.loginresponse.networktype; - if (json.loginresponse.hypervisortype != null) - g_hypervisorType = json.loginresponse.hypervisortype; - if (json.loginresponse.directattachnetworkgroupsenabled != null) - g_directAttachNetworkGroupsEnabled = json.loginresponse.directattachnetworkgroupsenabled; - if (json.loginresponse.directattacheduntaggedenabled != null) - g_directAttachedUntaggedEnabled = json.loginresponse.directattacheduntaggedenabled; - if (json.loginresponse.systemvmuselocalstorage != null) - g_systemVmUseLocalStorage = json.loginresponse.systemvmuselocalstorage; - - $.cookie('sessionKey', g_sessionKey, { expires: 1}); - $.cookie('networktype', g_networkType, { expires: 1}); - $.cookie('hypervisortype', g_hypervisorType, { expires: 1}); - $.cookie('username', g_username, { expires: 1}); - $.cookie('account', g_account, { expires: 1}); - $.cookie('domainid', g_domainid, { expires: 1}); - $.cookie('role', g_role, { expires: 1}); - $.cookie('timezoneoffset', g_timezoneoffset, { expires: 1}); - $.cookie('timezone', g_timezone, { expires: 1}); - $.cookie('directattachnetworkgroupsenabled', g_directAttachNetworkGroupsEnabled, { expires: 1}); - $.cookie('directattacheduntaggedenabled', g_directAttachedUntaggedEnabled, { expires: 1}); - $.cookie('systemvmuselocalstorage', g_systemVmUseLocalStorage, { expires: 1}); - - // Set Role - if (isUser()) { - $(".loginbutton_box p").text("").hide(); - $("#menutab_role_user #menutab_dashboard_user").click(); - } else if (isAdmin()) { - $(".loginbutton_box p").text("").hide(); - $("#menutab_role_root #menutab_dashboard_root").click(); - } else if (isDomainAdmin()) { - $(".loginbutton_box p").text("").hide(); - $("#menutab_role_domain #menutab_dashboard_domain").click(); - } else { - $(".loginbutton_box p").text("Account type of '" + username + "' is neither user nor admin.").show(); - return; - } - - $("#logoutpage").hide(); - $("body").css("background", "#FFF repeat top left"); - $("#mainmaster").show(); - }, - error: function() { - $("#account_password").val(""); - $("#logoutpage").show(); - $(".loginbutton_box p").text("Your username/password does not match our records.").show(); - $("#account_username").focus(); - }, - beforeSend: function(XMLHttpRequest) { - return true; - } - }); - } - - // Dialogs - $("#dialog_confirmation").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - }); - - $("#dialog_info").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000, - buttons: { "OK": function() { $(this).dialog("close"); } } - }); - - $("#dialog_alert").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000, - buttons: { "OK": function() { $(this).dialog("close"); } } - }); - $("#dialog_alert").siblings(".ui-widget-header").css("background", "url('/client/css/images/ui-bg_errorglass_30_ffffff_1x400.png') repeat-x scroll 50% 50% #393939"); - $("#dialog_alert").siblings(".ui-dialog-buttonpane").find(".ui-state-default").css("background", "url('/client/css/images/ui-bg_errorglass_30_ffffff_1x400.png') repeat-x scroll 50% 50% #393939"); - - $("#dialog_error").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000, - buttons: { "Close": function() { $(this).dialog("close"); } } - }); - $("#dialog_error").siblings(".ui-widget-header").css("background", "url('/client/css/images/ui-bg_errorglass_30_ffffff_1x400.png') repeat-x scroll 50% 50% #393939"); - $("#dialog_error").siblings(".ui-dialog-buttonpane").find(".ui-state-default").css("background", "url('/client/css/images/ui-bg_errorglass_30_ffffff_1x400.png') repeat-x scroll 50% 50% #393939"); - - $("#dialog_session_expired").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000, - buttons: { "OK": function() { logout(true); $(this).dialog("close"); } } - }); - $("#dialog_session_expired").siblings(".ui-widget-header").css("background", "url('/client/css/images/ui-bg_errorglass_30_ffffff_1x400.png') repeat-x scroll 50% 50% #393939"); - $("#dialog_session_expired").siblings(".ui-dialog-buttonpane").find(".ui-state-default").css("background", "url('/client/css/images/ui-bg_errorglass_30_ffffff_1x400.png') repeat-x scroll 50% 50% #393939"); - - $("#dialog_server_error").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000, - buttons: { "OK": function() { $(this).dialog("close"); } } - }); - $("#dialog_server_error").siblings(".ui-widget-header").css("background", "url('/client/css/images/ui-bg_errorglass_30_ffffff_1x400.png') repeat-x scroll 50% 50% #393939"); - $("#dialog_server_error").siblings(".ui-dialog-buttonpane").find(".ui-state-default").css("background", "url('/client/css/images/ui-bg_errorglass_30_ffffff_1x400.png') repeat-x scroll 50% 50% #393939"); - - // Menu Tabs - $("#global_nav").bind("click", function(event) { - var tab = $(event.target); - var tabId = tab.attr("id"); - var menuOnClass = "menutab_on"; - var menuOffClass = "menutab_off"; - if (tabId == "menutab_dashboard_user" || tabId == "menutab_dashboard_root" || tabId == "menutab_dashboard_domain") { - showDashboardTab(); - } else if (tabId == "menutab_vm") { - mainContainer.load("jsp/tab_instances.jsp", function() { - showInstancesTab(tab.data("domainId"), tab.data("account")); - }); - } else if (tabId == "menutab_networking") { - mainContainer.load("jsp/tab_networking.jsp", function() { - showNetworkingTab(tab.data("domainId"), tab.data("account")); - }); - } else if (tabId == "menutab_templates") { - mainContainer.load("jsp/tab_templates.jsp", function() { - showTemplatesTab(); - }); - } else if (tabId == "menutab_events") { - mainContainer.load("jsp/tab_events.jsp", function() { - showEventsTab(tab.data("showEvents")); - }); - } else if (tabId == "menutab_hosts") { - mainContainer.load("jsp/tab_hosts.jsp", function() { - showHostsTab(); - }); - } else if (tabId == "menutab_storage") { - mainContainer.load("jsp/tab_storage.jsp", function() { - showStorageTab(tab.data("domainId"), tab.data("targetTab")); - }); - } else if (tabId == "menutab_accounts") { - mainContainer.load("jsp/tab_accounts.jsp", function() { - showAccountsTab(tab.data("domainId")); - }); - } else if (tabId == "menutab_domain") { - mainContainer.load("jsp/tab_domains.jsp", function() { - showDomainsTab(); - }); - } else if (tabId == "menutab_configuration") { - mainContainer.load("jsp/tab_configuration.jsp", function() { - showConfigurationTab(); - }); - } else { - return false; - } - - if (isAdmin() || isDomainAdmin()) { - menuOnClass = "admin_menutab_on"; - menuOffClass = "admin_menutab_off"; - } else if (isUser()) { - menuOnClass = "menutab_on"; - menuOffClass = "menutab_off"; - } - if (activeTab != null) { - activeTab.removeClass(menuOnClass).addClass(menuOffClass); - } - tab.removeClass(menuOffClass).addClass(menuOnClass); - activeTab = tab; - removeDialogs(); - return false; - }); - - // Dashboard Tab - function showDashboardTab() { - mainContainer.load("jsp/tab_dashboard.jsp", function() { - $(".header_topright #header_username").text($.cookie("username")); - - if (isAdmin()) { - var sessionExpired = false; - var zones = null; - var noZones = false; - var noPods = true; - $("#menutab_dashboard_root, #menutab_vm, #menutab_networking_old, #menutab_networking, #menutab_templates, #menutab_events, #menutab_hosts, #menutab_storage, #menutab_accounts, #menutab_domain").hide(); - $.ajax({ - data: createURL("command=listZones&available=true&response=json"), - dataType: "json", - async: false, - success: function(json) { - zones = json.listzonesresponse.zone; - var zoneSelect = $("#capacity_zone_select").empty(); - if (zones != null && zones.length > 0) { - for (var i = 0; i < zones.length; i++) { - zoneSelect.append(""); - if(noPods) { - $.ajax({ - data: createURL("command=listPods&zoneId="+zones[i].id+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - var pods = json.listpodsresponse.pod; - if (pods != null && pods.length > 0) { - noPods = false; - $("#menutab_dashboard_root, #menutab_vm, #menutab_networking_old, #menutab_networking, #menutab_templates, #menutab_events, #menutab_hosts, #menutab_storage, #menutab_accounts, #menutab_domain").show(); - } - } - }); - } - } - } else { - noZones = true; - } - }, - beforeSend: function(XMLHttpRequest) { - return true; - } - }); - if (sessionExpired) return false; - if (noZones || noPods) { - $("#tab_dashboard_user").hide(); - $("#menutab_role_user").hide(); - $("#menutab_role_root").show(); - $("#menutab_configuration").click(); - return false; - } - - var capacities = null; - $.ajax({ - cache: false, - async: false, - data: createURL("command=listCapacity&response=json"), - dataType: "json", - success: function(json) { - capacities = json.listcapacityresponse.capacity; - } - }); - - $("#capacity_pod_select").bind("change", function(event) { - // Reset to Defaults - $("#public_ip_total, #storage_total, #storage_alloc_total, #sec_storage_total, #memory_total, #cpu_total, #private_ip_total").text("N/A"); - $("#public_ip_used, #storage_used, #storage_alloc, #sec_storage_used, #memory_used, #cpu_used, #private_ip_used,").attr("style", "width:50%").text("N/A"); - $(".db_bargraph_barbox_safezone").attr("style", "width:0%"); - $(".db_bargraph_barbox_unsafezone").attr("style", "width:0%"); - - var selectedZone = $("#capacity_zone_select option:selected").text(); - var selectedPod = $("#capacity_pod_select").val(); - - if (capacities != null && capacities.length > 0) { - for (var i = 0; i < capacities.length; i++) { - var capacity = capacities[i]; - if (capacity.zonename == selectedZone) { - // Public IPs - if (capacity.type == "4") { - $("#public_ip_used").attr("style", "width: " + ((parseFloat(capacity.percentused) < 50) ? "50%" : capacity.percentused + "%")).text("Used: " + capacity.capacityused + " / " + capacity.percentused + "%"); - $("#public_ip_total").text("Total: " + capacity.capacitytotal); - var usedPercentage = parseInt(capacity.percentused); - if (usedPercentage > 70) { - $("#capacity_public_ip .db_bargraph_barbox_safezone").attr("style", "width:70%"); - if(usedPercentage <= 100) - $("#capacity_public_ip .db_bargraph_barbox_unsafezone").attr("style", "width:"+(usedPercentage - 70)+"%"); - else - $("#capacity_public_ip .db_bargraph_barbox_unsafezone").attr("style", "width:30%"); - } else { - $("#capacity_public_ip .db_bargraph_barbox_safezone").attr("style", "width:"+usedPercentage+"%"); - $("#capacity_public_ip .db_bargraph_barbox_unsafezone").attr("style", "width:0%"); - } - // Secondary Storage - } else if (capacity.type == "6") { - $("#sec_storage_used").attr("style", "width: " + ((parseFloat(capacity.percentused) < 50) ? "50%" : capacity.percentused + "%")).text("Used: " + convertBytes(parseInt(capacity.capacityused)) + " / " + capacity.percentused + "%"); - $("#sec_storage_total").text("Total: " + convertBytes(parseInt(capacity.capacitytotal))); - var usedPercentage = parseInt(capacity.percentused); - if (usedPercentage > 70) { - $("#capacity_sec_storage .db_bargraph_barbox_safezone").attr("style", "width:70%"); - if(usedPercentage <= 100) - $("#capacity_sec_storage .db_bargraph_barbox_unsafezone").attr("style", "width:"+(usedPercentage - 70)+"%"); - else - $("#capacity_sec_storage .db_bargraph_barbox_unsafezone").attr("style", "width:30%"); - } else { - $("#capacity_sec_storage .db_bargraph_barbox_safezone").attr("style", "width:"+usedPercentage+"%"); - $("#capacity_sec_storage .db_bargraph_barbox_unsafezone").attr("style", "width:0%"); - } - } else { - if (capacity.podname == selectedPod) { - // Memory - if (capacity.type == "0") { - $("#memory_used").attr("style", "width: " + ((parseFloat(capacity.percentused) < 50) ? "50%" : capacity.percentused + "%")).text("Used: " + convertBytes(parseInt(capacity.capacityused)) + " / " + capacity.percentused + "%"); - $("#memory_total").text("Total: " + convertBytes(parseInt(capacity.capacitytotal))); - var usedPercentage = parseInt(capacity.percentused); - if (usedPercentage > 70) { - $("#capacity_memory .db_bargraph_barbox_safezone").attr("style", "width:70%"); - if(usedPercentage <= 100) - $("#capacity_memory .db_bargraph_barbox_unsafezone").attr("style", "width:"+(usedPercentage - 70)+"%"); - else - $("#capacity_memory .db_bargraph_barbox_unsafezone").attr("style", "width:30%"); - } else { - $("#capacity_memory .db_bargraph_barbox_safezone").attr("style", "width:"+usedPercentage+"%"); - $("#capacity_memory .db_bargraph_barbox_unsafezone").attr("style", "width:0%"); - } - // CPU - } else if (capacity.type == "1") { - $("#cpu_used").attr("style", "width: " + ((parseFloat(capacity.percentused) < 50) ? "50%" : capacity.percentused + "%")).text("Used: " + convertHz(parseInt(capacity.capacityused)) + " / " + capacity.percentused + "%"); - $("#cpu_total").text("Total: " + convertHz(parseInt(capacity.capacitytotal))); - var usedPercentage = parseInt(capacity.percentused); - if (usedPercentage > 70) { - $("#capacity_cpu .db_bargraph_barbox_safezone").attr("style", "width:70%"); - if(usedPercentage <= 100) - $("#capacity_cpu .db_bargraph_barbox_unsafezone").attr("style", "width:"+(usedPercentage - 70)+"%"); - else - $("#capacity_cpu .db_bargraph_barbox_unsafezone").attr("style", "width:30%"); - } else { - $("#capacity_cpu .db_bargraph_barbox_safezone").attr("style", "width:"+usedPercentage+"%"); - $("#capacity_cpu .db_bargraph_barbox_unsafezone").attr("style", "width:0%"); - } - // Storage Used - } else if (capacity.type == "2") { - $("#storage_used").attr("style", "width: " + ((parseFloat(capacity.percentused) < 50) ? "50%" : capacity.percentused + "%")).text("Used: " + convertBytes(parseInt(capacity.capacityused)) + " / " + capacity.percentused + "%"); - $("#storage_total").text("Total: " + convertBytes(parseInt(capacity.capacitytotal))); - var usedPercentage = parseInt(capacity.percentused); - if (usedPercentage > 70) { - $("#capacity_storage .db_bargraph_barbox_safezone").attr("style", "width:70%"); - if(usedPercentage <= 100) - $("#capacity_storage .db_bargraph_barbox_unsafezone").attr("style", "width:"+(usedPercentage - 70)+"%"); - else - $("#capacity_storage .db_bargraph_barbox_unsafezone").attr("style", "width:30%"); - } else { - $("#capacity_storage .db_bargraph_barbox_safezone").attr("style", "width:"+usedPercentage+"%"); - $("#capacity_storage .db_bargraph_barbox_unsafezone").attr("style", "width:0%"); - } - // Storage Allocated - } else if (capacity.type == "3") { - $("#storage_alloc").attr("style", "width: " + ((parseFloat(capacity.percentused) < 50) ? "50%" : capacity.percentused + "%")).text("Used: " + convertBytes(parseInt(capacity.capacityused)) + " / " + capacity.percentused + "%"); - $("#storage_alloc_total").text("Total: " + convertBytes(parseInt(capacity.capacitytotal))); - var usedPercentage = parseInt(capacity.percentused); - if (usedPercentage > 70) { - $("#capacity_storage_alloc .db_bargraph_barbox_safezone").attr("style", "width:70%"); - if(usedPercentage <= 100) - $("#capacity_storage_alloc .db_bargraph_barbox_unsafezone").attr("style", "width:"+(usedPercentage - 70)+"%"); - else - $("#capacity_storage_alloc .db_bargraph_barbox_unsafezone").attr("style", "width:30%"); - } else { - $("#capacity_storage_alloc .db_bargraph_barbox_safezone").attr("style", "width:"+usedPercentage+"%"); - $("#capacity_storage_alloc .db_bargraph_barbox_unsafezone").attr("style", "width:0%"); - } - // Private IPs - } else if (capacity.type == "5") { - $("#private_ip_used").attr("style", "width: " + ((parseFloat(capacity.percentused) < 50) ? "50%" : capacity.percentused + "%")).text("Used: " + capacity.capacityused + " / " + capacity.percentused + "%"); - $("#private_ip_total").text("Total: " + capacity.capacitytotal); - var usedPercentage = parseInt(capacity.percentused); - if (usedPercentage > 70) { - $("#capacity_private_ip .db_bargraph_barbox_safezone").attr("style", "width:70%"); - if(usedPercentage <= 100) - $("#capacity_private_ip .db_bargraph_barbox_unsafezone").attr("style", "width:"+(usedPercentage - 70)+"%"); - else - $("#capacity_private_ip .db_bargraph_barbox_unsafezone").attr("style", "width:30%"); - } else { - $("#capacity_private_ip .db_bargraph_barbox_safezone").attr("style", "width:"+usedPercentage+"%"); - $("#capacity_private_ip .db_bargraph_barbox_unsafezone").attr("style", "width:0%"); - } - } - } - } - } - } - } - }); - - $("#capacity_zone_select").bind("change", function(event) { - var zoneId = $(this).val(); - $.ajax({ - data: createURL("command=listPods&zoneId="+zoneId+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - var pods = json.listpodsresponse.pod; - var podSelect = $("#capacity_pod_select").empty(); - if (pods != null && pods.length > 0) { - podSelect.append(""); - for (var i = 0; i < pods.length; i++) { - podSelect.append(""); - } - } - $("#capacity_pod_select").change(); - } - }); - }); - $("#capacity_zone_select").change(); - - // Show Recent Alerts - $.ajax({ - data: createURL("command=listAlerts&response=json"), - dataType: "json", - success: function(json) { - var alerts = json.listalertsresponse.alert; - if (alerts != null && alerts.length > 0) { - var alertGrid = $("#alert_grid_content").empty(); - var length = (alerts.length>=5) ? 5 : alerts.length; - for (var i = 0; i < length; i++) { - var errorTemplate = $("#recent_error_template").clone(true); - errorTemplate.find("#db_error_type").text(toAlertType(alerts[i].type)); - errorTemplate.find("#db_error_msg").append(fromdb(alerts[i].description)); - setDateField(alerts[i].sent, errorTemplate.find("#db_error_date")); - alertGrid.append(errorTemplate.show()); - } - } - } - }); - - // Show Host Alerts - $.ajax({ - data: createURL("command=listHosts&state=Alert&response=json"), - dataType: "json", - success: function(json) { - var alerts = json.listhostsresponse.host; - if (alerts != null && alerts.length > 0) { - var alertGrid = $("#host_alert_grid_content").empty(); - var length = (alerts.length>=4) ? 4 : alerts.length; - for (var i = 0; i < length; i++) { - var errorTemplate = $("#recent_error_template").clone(true); - errorTemplate.find("#db_error_type").text("Host - Alert State"); - errorTemplate.find("#db_error_msg").append("Host - " + fromdb(alerts[i].name) + " has been detected in Alert state."); - setDateField(alerts[i].disconnected, errorTemplate.find("#db_error_date")); - alertGrid.append(errorTemplate.show()); - } - } - } - }); - - $("#alert_more").bind("click", function(event) { - event.preventDefault(); - - $("#menutab_role_root #menutab_events").data("showEvents", false).click(); - }); - $("#host_alert_more").bind("click", function(event) { - event.preventDefault(); - $("#menutab_hosts").click(); - }); - - $("#tab_dashboard_user, #tab_dashboard_domain, #loading_gridtable").hide(); - $("#tab_dashboard_root").show(); - $("#menutab_role_user").hide(); - $("#menutab_role_root").show(); - $("#menutab_role_domain").hide(); - $("#launch_test").show(); - } else if (isDomainAdmin()) { - var thisTab = $("#tab_dashboard_domain"); - $("#tab_dashboard_user, #tab_dashboard_root, #loading_gridtable").hide(); - thisTab.show(); - $("#menutab_role_user").hide(); - $("#menutab_role_root").hide(); - $("#menutab_role_domain").show(); - $("#launch_test").hide(); - - $.ajax({ - data: createURL("command=listVirtualMachines&response=json"), - dataType: "json", - success: function(json) { - if (json.listvirtualmachinesresponse.virtualmachine != undefined) - thisTab.find("#dashboard_instances").text(json.listvirtualmachinesresponse.virtualmachine.length); - } - }); - $.ajax({ - data: createURL("command=listVolumes&response=json"), - dataType: "json", - success: function(json) { - if (json.listvolumesresponse.volume) - thisTab.find("#dashboard_volumes").text(json.listvolumesresponse.volume.length); - } - }); - $.ajax({ - data: createURL("command=listSnapshots&response=json"), - dataType: "json", - success: function(json) { - if (json.listsnapshotsresponse.snapshot) - thisTab.find("#dashboard_snapshots").text(json.listsnapshotsresponse.snapshot.length); - } - }); - $.ajax({ - data: createURL("command=listAccounts&response=json"), - dataType: "json", - success: function(json) { - if (json.listaccountsresponse.account) - thisTab.find("#dashboard_accounts").text(json.listaccountsresponse.account.length); - } - }); - $.ajax({ - data: createURL("command=listEvents&level=ERROR&response=json"), - dataType: "json", - success: function(json) { - var events = json.listeventsresponse.event; - if (events != null && events.length > 0) { - var errorGrid = thisTab.find("#error_grid_content").empty(); - var length = (events.length>=3) ? 3 : events.length; - for (var i = 0; i < length; i++) { - var errorTemplate = $("#recent_error_template").clone(true); - errorTemplate.find("#db_error_type").text(events[i].type); - errorTemplate.find("#db_error_msg").text(fromdb(events[i].description)); - setDateField(events[i].created, errorTemplate.find("#db_error_date")); - errorGrid.append(errorTemplate.show()); - } - } - } - }); - } else if(isUser()) { - $("#launch_test").hide(); - $.ajax({ - cache: false, - data: createURL("command=listAccounts&response=json"), - dataType: "json", - success: function(json) { - var accounts = json.listaccountsresponse.account; - if (accounts != null && accounts.length > 0) { - var statJSON = accounts[0]; - var sent = parseInt(statJSON.sentbytes); - var rec = parseInt(statJSON.receivedbytes); - - if(sent==0 && rec==0) - $("#network_bandwidth_panel").hide(); - else - $("#network_bandwidth_panel").show(); - - $("#menutab_role_user").show(); - $("#menutab_role_root").hide(); - $("#menutab_role_domain").hide(); - $("#tab_dashboard_user").show(); - $("#tab_dashboard_root, #tab_dashboard_domain, #loading_gridtable").hide(); - - // This is in bytes, so let's change to KB - sent = Math.round(sent / 1024); - rec = Math.round(rec / 1024); - $("#db_sent").text(sent + "KB"); - $("#db_received").text(rec + "KB"); - $("#db_available_public_ips").text(statJSON.ipavailable); - $("#db_owned_public_ips").text(statJSON.iptotal); - $("#db_running_vms").text(statJSON.vmrunning + " VM(s)"); - $("#db_stopped_vms").text(statJSON.vmstopped + " VM(s)"); - $("#db_total_vms").text(statJSON.vmtotal + " VM(s)"); - $("#db_avail_vms").text(statJSON.vmavailable + " VM(s)"); - $("#db_account_id").text(statJSON.id); - $("#db_account").text(statJSON.name); - $("#db_type").text(toRole(statJSON.accounttype)); - $("#db_domain").text(statJSON.domain); - } - - // Events - $.ajax({ - data: createURL("command=listEvents&level=ERROR&response=json"), - dataType: "json", - success: function(json) { - var events = json.listeventsresponse.event; - if (events != null && events.length > 0) { - var errorGrid = $("#error_grid_content").empty(); - var length = (events.length>=3) ? 3 : events.length; - for (var i = 0; i < length; i++) { - var errorTemplate = $("#recent_error_template").clone(true); - errorTemplate.find("#db_error_type").text(events[i].type); - errorTemplate.find("#db_error_msg").text(fromdb(events[i].description)); - setDateField(events[i].created, errorTemplate.find("#db_error_date")); - errorGrid.append(errorTemplate.show()); - } - } - } - }); - }, - beforeSend: function(XMLHttpRequest) { - return true; - } - }); - } else { //no role - logout(false); - return; - } - }); - } - - // Check whether the session is valid. - g_mySession = $.cookie("JSESSIONID"); - g_sessionKey = $.cookie("sessionKey"); - g_role = $.cookie("role"); - g_username = $.cookie("username"); - g_account = $.cookie("account"); - g_domainid = $.cookie("domainid"); - g_networkType = $.cookie("networktype"); - g_hypervisorType = $.cookie("hypervisortype"); - g_timezone = $.cookie("timezone"); - g_directAttachNetworkGroupsEnabled = $.cookie("directattachnetworkgroupsenabled"); - g_directAttachedUntaggedEnabled = $.cookie("directattacheduntaggedenabled"); - g_systemVmUseLocalStorage = $.cookie("systemvmuselocalstorage"); - - if($.cookie("timezoneoffset") != null) - g_timezoneoffset = isNaN($.cookie("timezoneoffset"))?null: parseFloat($.cookie("timezoneoffset")); - else - g_timezoneoffset = null; - - if (!g_networkType || g_networkType.length == 0) - g_networkType = "vnet"; - - if (!g_hypervisorType || g_hypervisorType.length == 0) - g_hypervisorType = "kvm"; - - if (!g_directAttachNetworkGroupsEnabled || g_directAttachNetworkGroupsEnabled.length == 0) - g_directAttachNetworkGroupsEnabled = "false"; - - if (!g_directAttachedUntaggedEnabled || g_directAttachedUntaggedEnabled.length == 0) - g_directAttachedUntaggedEnabled = "false"; - - if (!g_systemVmUseLocalStorage || g_systemVmUseLocalStorage.length == 0) - g_systemVmUseLocalStorage = "false"; - - $.ajax({ - data: createURL("command=listZones&available=true&response=json"), - dataType: "json", - async: false, - success: function(json) { - // session is valid, continue - if (isUser()) { - $("#menutab_role_user #menutab_dashboard_user").click(); - } else if (isAdmin()) { - $("#menutab_role_root #menutab_dashboard_root").click(); - } else if (isDomainAdmin()) { - $("#menutab_role_domain #menutab_dashboard_domain").click(); - } else { - logout(false); - } - }, - error: function(xmlHTTP) { - logout(false); - }, - beforeSend: function(xmlHTTP) { - return true; - } - }); -}); - diff --git a/ui/2.1/scripts/cloud.core.instances.js b/ui/2.1/scripts/cloud.core.instances.js deleted file mode 100644 index d668b06a7f1..00000000000 --- a/ui/2.1/scripts/cloud.core.instances.js +++ /dev/null @@ -1,2648 +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 . - * - */ - -// Version: @VERSION@ - -function showInstancesTab(p_domainId, p_account) { - // Manage VM Tab - // Submenus change based on role - if (isUser()) { - $("#submenu_links, #submenu_routers, #submenu_console").hide(); - } else if (isDomainAdmin()) { - $("#submenu_console, #router_template #router_action_view_console_container").hide(); - } - - var vIndex = 0; - var vmPopup = $("#vmpopup"); - var currentPageInTemplateGridInVmPopup =1; - var selectedTemplateTypeInVmPopup; //selectedTemplateTypeInVmPopup will be set to "featured" when new VM dialog box opens - - activateDialog($("#dialog_change_service_offering").dialog({ - width: 600, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_create_template").dialog({ - width: 400, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_change_group").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_list_network_groups").dialog({ - width: 600, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_change_name").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_attach_iso").dialog({ - width: 600, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_t_and_c").dialog({ - width: 600, - autoOpen: false, - modal: true, - zIndex: 2000, - buttons: { "OK": function() { $(this).dialog("close"); } } - })); - - $("#t_and_c").click(function(event) { - $("#dialog_t_and_c").dialog("open"); - return false; - }); - - $("#apply_sg_public_ip").change(function() { - var publicIp = $(this).val(); - var vmId = $(this).data("vmId"); - var appliedSG = null; - // Get all the groups applied to this VM - $.ajax({ - data: createURL("command=listPortForwardingServicesByVm&ipaddress="+publicIp+"&virtualmachineid="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - var appliedSG = json.listportforwardingservicesbyvmresponse.portforwardingservice; - addSGToSelect(appliedSG); - } - }); - }); - // End Security Groups Dialog setup ------------------ - - // VM Instance Template Setup - var vmInstanceTemplate = $("#vm_instance_template"); - - // FUNCTION: Sets up the thumbnail effect - function enableConsoleHover(vmTemplate) { - var offset = vmTemplate.offset(); - var imgUrl = vmTemplate.data("imgUrl"); - var index = 0; - if (imgUrl != null) { - var time = new Date(); - $("#spopup .console_box0").css("background", "url("+imgUrl+"&t="+time.getTime()+")"); - $("#spopup .console_box1").css("background", "url("+imgUrl+"&t="+time.getTime()+")"); - vmTemplate.everyTime(2000, function() { - var time = new Date(); - if ((index % 2) == 0) { - $("#spopup .console_box0").hide().css("background", "url("+imgUrl+"&t="+time.getTime()+")"); - $("#spopup .console_box1").show(); - } else { - $("#spopup .console_box1").hide().css("background", "url("+imgUrl+"&t="+time.getTime()+")"); - $("#spopup .console_box0").show(); - } - index++; - }, 0); - } - $("#spopup").css("top", (offset.top - 210) + "px").css("left", offset.left + "px").show(); - } - vmInstanceTemplate.find("#vm_action_view_console").bind("mouseover", function(event) { - enableConsoleHover($(this)); - }); - vmInstanceTemplate.find("#vm_action_view_console").bind("mouseout", function(event) { - $(this).stopTime(); - $("#spopup").hide(); - }); - - function showInstanceLoading(vmInstance, actionText) { - vmInstance.find("#instance_loading_overlay").show(); - vmInstance.find("#vm_instance_menu").hide(); - vmInstance.find("#vm_loading_text").text(actionText); - vmInstance.find("#vm_loading_container").fadeIn("slow"); - } - - function hideInstanceLoading(vmInstance) { - vmInstance.find("#instance_loading_overlay").hide(); - vmInstance.find("#vm_loading_container").hide(); - vmInstance.find("#vm_instance_menu").fadeIn("slow"); - } - - vmInstanceTemplate.bind("click", function(event) { - var vmInstance = $(this); - var link = $(event.target); - var linkAction = link.attr("id"); - var vmId = vmInstance.data("id"); - var vmName = vmInstance.data("name"); - var vmState = vmInstance.data("state"); - var timerKey = "vm"+vmId; - - var closeActions = false; - if (link.hasClass("vmaction_links_off")) { - return false; - } else if (link.hasClass("vmaction_links_on")) { - closeActions = true; - } - switch (linkAction) { - case "vm_action_start" : - $("#dialog_confirmation") - .html("

Please confirm you want to start your virtual machine: "+vmName+"

") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - showInstanceLoading(vmInstance, "Starting..."); - vmInstance.find("#vm_state_bar").removeClass("admin_vmred_arrow admin_vmgreen_arrow").addClass("admin_vmgrey_arrow"); - vmInstance.find("#vm_state").text("Starting").removeClass("grid_stoppedtitles grid_runningtitles").addClass("grid_celltitles"); - vmInstance.find("#vm_action_volumes").removeClass().addClass("vm_botactionslinks_down").data("expanded", false); - vmInstance.find("#volume_detail_panel").slideUp("slow"); - $.ajax({ - data: createURL("command=startVirtualMachine&id="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - vmInstance.fadeIn("slow"); - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.startvirtualmachineresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - var virtualmachine = result.jobresult.startvirtualmachineresponse; - if (vmInstance != null) { - $("body").stopTime(timerKey); - vmInstance.find("#vm_loading_container").hide(); - if (result.jobstatus == 1) { - // Succeeded - vmInstance.find(".loadingmessage_container .loadingmessage_top p").html("Your instance has been successfully started."); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - vmInstance.find("#vm_state_bar").removeClass("admin_vmgrey_arrow admin_vmred_arrow").addClass("admin_vmgreen_arrow"); - - vmInstance.find("#vm_state").text(virtualmachine.state).removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - vmInstance.data("state", virtualmachine.state); - //vmInstance.find("#vm_state").text(result.virtualmachine[0].state).removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - //vmInstance.data("state", result.virtualmachine[0].state); - - if (virtualmachine.hostname != undefined) { - vmInstance.find("#vm_host").html("Host: " + fromdb(virtualmachine.hostname)); - //if (result.virtualmachine[0].hostname != undefined) { - //vmInstance.find("#vm_host").html("Host: " + fromdb(result.virtualmachine[0].hostname)); - } else { - vmInstance.find("#vm_host").html("Host: "); - } - - vmInstance.find("#vm_action_start, #vm_action_reset_password, #vm_action_change_service").removeClass().addClass("vmaction_links_off"); - vmInstance.find("#vm_action_stop, #vm_action_reboot").removeClass().addClass("vmaction_links_on"); - - - // Console Proxy UI - vmInstance.find("#vm_action_view_console").data("imgUrl", "console?cmd=thumbnail&vm=" + virtualmachine.id + "&w=144&h=110"); - vmInstance.find("#vm_action_view_console").data("proxyUrl", "console?cmd=access&vm=" + virtualmachine.id).data("vmId",virtualmachine.id).click(function(event) { - //vmInstance.find("#vm_action_view_console").data("imgUrl", "console?cmd=thumbnail&vm=" + result.virtualmachine[0].id + "&w=144&h=110"); - //vmInstance.find("#vm_action_view_console").data("proxyUrl", "console?cmd=access&vm=" + result.virtualmachine[0].id).data("vmId",result.virtualmachine[0].id).click(function(event) { - event.preventDefault(); - var viewer = window.open($(this).data("proxyUrl"),$(this).data("vmId"),"width=820,height=640,resizable=yes,menubar=no,status=no,scrollbars=no,toolbar=no,location=no"); - viewer.focus(); - }); - vmInstance.find("#vm_action_view_console").bind("mouseover", function(event) { - enableConsoleHover($(this)); - }); - } else if (result.jobstatus == 2) { - // Failed - vmInstance.find("#vm_state_bar").removeClass("admin_vmgrey_arrow admin_vmgreen_arrow").addClass("admin_vmred_arrow"); - vmInstance.find("#vm_state").text("Stopped").removeClass("grid_celltitles grid_runningtitles").addClass("grid_stoppedtitles"); - vmInstance.find(".loadingmessage_container .loadingmessage_top p").text("Unable to start your instance due to the error: " + result.jobresult); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - } - } - } - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "vm_action_stop" : - $("#dialog_confirmation") - .html("

Please confirm you want to stop your virtual machine: "+vmName+"

") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - showInstanceLoading(vmInstance, "Stopping..."); - vmInstance.find("#vm_state_bar").removeClass("admin_vmred_arrow admin_vmgreen_arrow").addClass("admin_vmgrey_arrow"); - vmInstance.find("#vm_state").text("Stopping").removeClass("grid_stoppedtitles grid_runningtitles").addClass("grid_celltitles"); - vmInstance.find("#vm_action_volumes").removeClass().addClass("vm_botactionslinks_down").data("expanded", false); - vmInstance.find("#volume_detail_panel").slideUp("slow"); - $.ajax({ - data: createURL("command=stopVirtualMachine&id="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.stopvirtualmachineresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - var virtualmachine = result.jobresult.stopvirtualmachineresponse; - if (vmInstance != null) { - $("body").stopTime(timerKey); - vmInstance.find("#vm_loading_container").hide(); - if (result.jobstatus == 1) { - // Succeeded - vmInstance.find(".loadingmessage_container .loadingmessage_top p").html("Your instance has been successfully stopped."); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - vmInstance.find("#vm_state_bar").removeClass("admin_vmgrey_arrow admin_vmgreen_arrow").addClass("admin_vmred_arrow"); - - vmInstance.find("#vm_state").text(virtualmachine.state).removeClass("grid_celltitles grid_runningtitles").addClass("grid_stoppedtitles"); - vmInstance.data("state", virtualmachine.state); - //vmInstance.find("#vm_state").text(result.virtualmachine[0].state).removeClass("grid_celltitles grid_runningtitles").addClass("grid_stoppedtitles"); - //vmInstance.data("state", result.virtualmachine[0].state); - - if (virtualmachine.hostname != undefined) { - vmInstance.find("#vm_host").html("Host: " + fromdb(virtualmachine.hostname)); - //if (result.virtualmachine[0].hostname != undefined) { - //vmInstance.find("#vm_host").html("Host: " + fromdb(result.virtualmachine[0].hostname)); - } else { - vmInstance.find("#vm_host").html("Host: "); - } - - vmInstance.find("#vm_action_start, #vm_action_reset_password, #vm_action_change_service").removeClass().addClass("vmaction_links_on"); - vmInstance.find("#vm_action_stop, #vm_action_reboot").removeClass().addClass("vmaction_links_off"); - vmInstance.find("#vm_action_view_console").unbind("mouseover click"); - - } else if (result.jobstatus == 2) { - // Failed - vmInstance.find("#vm_state_bar").removeClass("admin_vmgrey_arrow admin_vmred_arrow").addClass("admin_vmgreen_arrow"); - vmInstance.find("#vm_state").text("Running").removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - vmInstance.find(".loadingmessage_container .loadingmessage_top p").text("Unable to stop your instance due to the error: " + result.jobresult); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - } - } - } - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "vm_action_reboot" : - $("#dialog_confirmation") - .html("

Please confirm you want to reboot your virtual machine: "+vmName+"

") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - showInstanceLoading(vmInstance, "Rebooting..."); - vmInstance.find("#vm_state_bar").removeClass("admin_vmred_arrow admin_vmgreen_arrow").addClass("admin_vmgrey_arrow"); - vmInstance.find("#vm_state").text("Rebooting").removeClass("grid_stoppedtitles grid_runningtitles").addClass("grid_celltitles"); - $.ajax({ - data: createURL("command=rebootVirtualMachine&id="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.rebootvirtualmachineresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - if (vmInstance != null) { - $("body").stopTime(timerKey); - vmInstance.find("#vm_loading_container").hide(); - if (result.jobstatus == 1) { - // Succeeded - vmInstance.find(".loadingmessage_container .loadingmessage_top p").html("Your instance has been successfully rebooted."); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - vmInstance.find("#vm_state_bar").removeClass("admin_vmgrey_arrow admin_vmred_arrow").addClass("admin_vmgreen_arrow"); - vmInstance.find("#vm_state").text("Running").removeClass("grid_stoppedtitles grid_celltitles").addClass("grid_runningtitles"); - } else if (result.jobstatus == 2) { - // Failed - vmInstance.find("#vm_state_bar").removeClass("admin_vmgrey_arrow admin_vmred_arrow").addClass("admin_vmgreen_arrow"); - vmInstance.find("#vm_state").text("Running").removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - vmInstance.find(".loadingmessage_container .loadingmessage_top p").text("Unable to reboot your instance due to the error: " + result.jobresult); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - } - } - } - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "vm_action_destroy" : - $("#dialog_confirmation") - .html("

Please confirm you want to destroy your virtual machine: "+vmName+". Destroying your virtual machine will also delete the ROOT volume, but not attached data disk volumes.

") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - showInstanceLoading(vmInstance, "Destroying..."); - vmInstance.find("#vm_state_bar").removeClass("admin_vmred_arrow admin_vmgreen_arrow").addClass("admin_vmgrey_arrow"); - vmInstance.find("#vm_state").text("Destroying").removeClass("grid_stoppedtitles grid_runningtitles").addClass("grid_celltitles"); - vmInstance.find("#vm_action_volumes").removeClass().addClass("vm_botactionslinks_down").data("expanded", false); - vmInstance.find("#volume_detail_panel").slideUp("slow"); - $.ajax({ - data: createURL("command=destroyVirtualMachine&id="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.destroyvirtualmachineresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - if (vmInstance != null) { - $("body").stopTime(timerKey); - vmInstance.find("#vm_loading_container").hide(); - if (result.jobstatus == 1) { - // Succeeded - vmInstance.find(".loadingmessage_container .loadingmessage_top p").html("Your instance has been successfully destroyed."); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - if (isAdmin()) { - vmInstance.find("#vm_state_bar").removeClass("admin_vmred_arrow admin_vmgreen_arrow").addClass("admin_vmgrey_arrow"); - - //No embedded object is returned. So, hardcoding state as "Destroyed". - vmInstance.find("#vm_state").text("Destroyed").removeClass("grid_stoppedtitles grid_runningtitles").addClass("grid_celltitles"); - vmInstance.data("state", "Destroyed"); - - vmInstance.find("#vm_host").html("Host:"); - - vmInstance.find("#vm_action_restore").show(); - vmInstance.find("#vm_action_volumes, #vm_actions").hide(); - } else { - vmInstance.find(".continue_button").unbind("click").bind("click", function(event) { - $(this).parents(".loadingmessage_container").hide().prevAll(".row_loading").hide(); - vmInstance.fadeOut("slow", function(event) { - $(this).remove(); - }); - }); - } - } else if (result.jobstatus == 2) { - // Failed - if (vmState == 'Running') { - vmInstance.find("#vm_state_bar").removeClass("admin_vmgrey_arrow admin_vmred_arrow").addClass("admin_vmgreen_arrow"); - vmInstance.find("#vm_state").text("Running").removeClass("grid_stoppedtitles grid_celltitles").addClass("grid_runningtitles"); - } else { - vmInstance.find("#vm_state_bar").removeClass("admin_vmgrey_arrow admin_vmgreen_arrow").addClass("admin_vmred_arrow"); - vmInstance.find("#vm_state").text(vmState).removeClass("grid_runningtitles grid_celltitles").addClass("grid_stoppedtitles"); - } - vmInstance.find(".loadingmessage_container .loadingmessage_top p").text("Unable to destroy your instance due to the error: " + result.jobresult); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - } - } - } - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "vm_action_reset_password" : - if(vmState != "Stopped") { - $("#dialog_alert").html("

"+vmName+" needs to be stopped before you can reset your password.

") - $("#dialog_alert").dialog("open"); - return false; - } - if($(this).data("passwordEnabled") != "true") { - $("#dialog_alert").html("

"+vmName+" is not using a template that has the password reset feature enabled. If you have forgotten your root password, please contact support.

") - $("#dialog_alert").dialog("open"); - return false; - } - $("#dialog_confirmation") - .html("

Please confirm you want to change the ROOT password for your virtual machine: "+vmName+"

") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - showInstanceLoading(vmInstance, "Resetting password..."); - $.ajax({ - data: createURL("command=resetPasswordForVirtualMachine&id="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - vmInstance.fadeIn("slow"); - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.resetpasswordforvirtualmachineresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - if (vmInstance != null) { - $("body").stopTime(timerKey); - vmInstance.find("#vm_loading_container").hide(); - if (result.jobstatus == 1) { - // Succeeded - vmInstance.find(".loadingmessage_container .loadingmessage_top p").html("Your password has been successfully resetted. Your new password is : " + result.virtualmachine[0].password + " . Please reboot your virtual instance for the new password to take effect."); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - } else if (result.jobstatus == 2) { - // Failed - vmInstance.find(".loadingmessage_container .loadingmessage_top p").text("Unable to reset your password. Please try again or contact support."); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - } - } - } - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "vm_action_change_service" : - if(vmState != "Stopped") { - $("#dialog_alert").html("

"+vmName+" needs to be stopped before you can change its service.

") - $("#dialog_alert").dialog("open"); - return false; - } - - $("#dialog_change_service_offering").find("#change_vm_name").text(vmName); - $.ajax({ - data: createURL("command=listServiceOfferings&VirtualMachineId="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - var offerings = json.listserviceofferingsresponse.serviceoffering; - var offeringSelect = $("#dialog_change_service_offering #change_service_offerings").empty(); - - if (offerings != null && offerings.length > 0) { - for (var i = 0; i < offerings.length; i++) { - var option = $("").data("name", fromdb(offerings[i].name)); - offeringSelect.append(option); - } - } - } - }); - - $("#dialog_change_service_offering") - .dialog('option', 'buttons', { - "Change": function() { - $(this).dialog("close"); - $.ajax({ - data: createURL("command=changeServiceForVirtualMachine&id="+vmId+"&serviceOfferingId="+$("#dialog_change_service_offering #change_service_offerings").val()+"&response=json"), - dataType: "json", - success: function(json) { - var virtualmachine = json.changeserviceforvirtualmachineresponse; - vmInstance.find("#vm_loading_container").hide(); - vmInstance.find(".row_loading").show(); - vmInstance.find(".loadingmessage_container .loadingmessage_top p").html("Your virtual instance has been upgraded. Please restart your virtual instance for the new service offering to take effect."); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - vmInstance.find("#vm_service").html("Service: " + fromdb(virtualmachine.serviceofferingname)); - if (virtualmachine.haenable =='true') { - vmInstance.find("#vm_ha").html("HA: Enabled"); - vmInstance.find("#vm_action_ha").text("Disable HA"); - } else { - vmInstance.find("#vm_ha").html("HA: Disabled"); - vmInstance.find("#vm_action_ha").text("Enable HA"); - } - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - - case "vm_action_list_network_groups" : - $.ajax({ - data: createURL("command=listNetworkGroups&virtualmachineid="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - var networkgroups = json.listnetworkgroupsresponse.networkgroup; - if(networkgroups != null && networkgroups.length > 0) { - var firstLevelList = $("#dialog_list_network_groups #network_groups_list_first_level").empty(); - for(var i=0; i0) { - for(var k=0; k"; - secondLevelList.append(secondLevelItem); - } - } - var firstLevelItem = $("
  • "); - firstLevelItem.append(networkgroups[i].name); - firstLevelItem.append(secondLevelList); - firstLevelList.append(firstLevelItem); - } - } - else { //no network group is associated - $("#dialog_list_network_groups #network_groups_list_first_level").text("This instance is not associated with any network groups."); - } - - $("#dialog_list_network_groups") - .dialog('option', 'buttons', { - "Close": function() { - $(this).dialog("close"); - } - }).dialog("open"); - } - }); - break; - - case "vm_action_change_group" : - $("#dialog_change_group").find("#vm_name").text(vmName); - $("#dialog_change_group").find("#change_group_name").val((vmInstance.data("group")==null)?"":vmInstance.data("group")); - $("#dialog_change_group") - .dialog('option', 'buttons', { - "Confirm": function() { - // validate values - var isValid = true; - isValid &= validateString("Group", $("#change_group_name"), $("#change_group_name_errormsg"), true); //group name is optional - if (!isValid) return; - - var group = trim($("#change_group_name").val()); - var vmInstance = $("#vm"+vmId); - $.ajax({ - data: createURL("command=updateVirtualMachine&id="+vmId+"&group="+todb(group)+"&response=json"), - dataType: "json", - success: function(json) { - vmInstance.find("#vm_group").text(group); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - } - }); - $(this).dialog("close"); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "vm_action_change_name" : - $("#dialog_change_name").find("#vm_name").text(vmName); - $("#dialog_change_name") - .dialog('option', 'buttons', { - "Confirm": function() { - // validate values - var isValid = true; - isValid &= validateString("Name", $("#change_instance_name"), $("#change_instance_name_errormsg")); - if (!isValid) return; - - var name = trim($("#change_instance_name").val()); - - $.ajax({ - data: createURL("command=updateVirtualMachine&id="+vmId+"&displayName="+todb(name)+"&response=json"), - dataType: "json", - success: function(json) { - if (isAdmin()) { - var systemName = vmInstance.data("systemName"); - name = systemName + "(" + name + ")"; - vmInstance.find("#vm_name").text(name); - } else { - vmInstance.find("#vm_name").text(name); - } - vmInstance.data("name", name); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - } - }); - $(this).dialog("close"); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "vm_action_ha" : - var enable = true; - var message = "

    Please confirm you want to enable HA for your virtual machine: "+vmName+". Once HA is enabled, your Virtual Instance will be automatically restarted in the event it is detected to have failed.

    "; - if (vmInstance.data("ha") == 'true') { - enable = false; - message = "

    Please confirm you want to disable HA for your virtual machine: "+vmName+". Once HA is disabled, your Virtual Instance will no longer be be automatically restarted in the event of a failure.

    "; - } - $("#dialog_confirmation") - .html(message) - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - $.ajax({ - data: createURL("command=updateVirtualMachine&id="+vmId+"&haenable="+enable+"&response=json"), - dataType: "json", - success: function(json) { - if (enable) { - vmInstance.find("#vm_ha").html("HA: Enabled"); - vmInstance.find("#vm_action_ha").text("Disable HA"); - vmInstance.data("ha", "true"); - } else { - vmInstance.find("#vm_ha").html("HA: Disabled"); - vmInstance.find("#vm_action_ha").text("Enable HA"); - vmInstance.data("ha", "false"); - } - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "vm_action_restore" : - $("#dialog_confirmation") - .html("

    Please confirm you want to restore the virtual machine: "+vmName+".

    ") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - $.ajax({ - data: createURL("command=recoverVirtualMachine&id="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - vmInstance.find("#vm_state_bar").removeClass("admin_vmgrey_arrow admin_vmgreen_arrow").addClass("admin_vmred_arrow"); - vmInstance.find("#vm_state").text("Stopped").removeClass("grid_celltitles grid_runningtitles").addClass("grid_stoppedtitles"); - vmInstance.find("#vm_action_restore").hide(); - vmInstance.find("#vm_action_volumes, #vm_actions").show(); - vmInstance.find("#vm_action_start, #vm_action_reset_password, #vm_action_change_service").removeClass().addClass("vmaction_links_on"); - if (vmInstance.data("isoId") != null) { - vmInstance.find("#vm_action_detach_iso").removeClass().addClass("vmaction_links_on"); - vmInstance.find("#vm_action_attach_iso").removeClass().addClass("vmaction_links_off"); - } else { - vmInstance.find("#vm_action_detach_iso").removeClass().addClass("vmaction_links_off"); - vmInstance.find("#vm_action_attach_iso").removeClass().addClass("vmaction_links_on"); - } - vmInstance.find("#vm_action_stop, #vm_action_reboot").removeClass().addClass("vmaction_links_off"); - vmInstance.data("state", "Stopped"); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "vm_action_attach_iso" : - $.ajax({ - data: createURL("command=listIsos&isReady=true&response=json"), - dataType: "json", - async: false, - success: function(json) { - var isos = json.listisosresponse.iso; - var isoSelect = $("#dialog_attach_iso #attach_iso_select"); - if (isos != null && isos.length > 0) { - isoSelect.empty(); - for (var i = 0; i < isos.length; i++) { - isoSelect.append("");; - } - } - } - }); - $("#dialog_attach_iso").find("#vm_name").text(vmName); - $("#dialog_attach_iso") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - var isoId = $("#dialog_attach_iso #attach_iso_select").val(); - if (isoId == "none") { - $("#dialog_alert").html("

    There is no ISO file to attach to the virtual machine.

    ") - $("#dialog_alert").dialog("open"); - return false; - } - - showInstanceLoading(vmInstance, "Attaching ISO..."); - $.ajax({ - data: createURL("command=attachIso&virtualmachineid="+vmId+"&id="+isoId+"&response=json"), - dataType: "json", - success: function(json) { - $("body").everyTime( - 5000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.attachisoresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - if (vmInstance != null) { - $("body").stopTime(timerKey); - vmInstance.find("#vm_loading_container").hide(); - if (result.jobstatus == 1) { - // Succeeded - vmInstance.find("#iso_state").removeClass().addClass("vmiso_on"); - vmInstance.data("isoId", isoId); - vmInstance.find("#vm_action_detach_iso").removeClass().addClass("vmaction_links_on"); - vmInstance.find("#vm_action_attach_iso").removeClass().addClass("vmaction_links_off"); - vmInstance.find(".loadingmessage_container .loadingmessage_top p").html("Your ISO has been successfully attached."); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - } else if (result.jobstatus == 2) { - // Failed - vmInstance.find(".loadingmessage_container .loadingmessage_top p").text("We were unable to attach the ISO to your VM. Please contact support or try again."); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - } - } - } - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "vm_action_detach_iso" : - $("#dialog_confirmation") - .html("

    Please confirm you want to detach an ISO from the virtual machine: "+vmName+".

    ") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - showInstanceLoading(vmInstance, "Detaching ISO..."); - $.ajax({ - data: createURL("command=detachIso&virtualmachineid="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - $("body").everyTime( - 5000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.detachisoresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - if (vmInstance != null) { - $("body").stopTime(timerKey); - vmInstance.find("#vm_loading_container").hide(); - if (result.jobstatus == 1) { - // Succeeded - vmInstance.find("#iso_state").removeClass().addClass("vmiso_off"); - vmInstance.data("isoId", null); - vmInstance.find("#vm_action_detach_iso").removeClass().addClass("vmaction_links_off"); - vmInstance.find("#vm_action_attach_iso").removeClass().addClass("vmaction_links_on"); - vmInstance.find(".loadingmessage_container .loadingmessage_top p").html("You have successfully detached your ISO."); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - } else if (result.jobstatus == 2) { - // Failed - vmInstance.find(".loadingmessage_container .loadingmessage_top p").text(result.jobresult); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - } - } - } - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - hideInstanceLoading(vmInstance); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "vm_action_volumes" : - var expanded = link.data("expanded"); - if (expanded == null || expanded == false) { - var index = 0; - $.ajax({ - cache: false, - data: createURL("command=listVolumes&virtualMachineId="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - var volumes = json.listvolumesresponse.volume; - if (volumes != null && volumes.length > 0) { - var grid = vmInstance.find("#detail_container").empty(); - var detailTemplate = $("#volume_detail_template"); - for (var i = 0; i < volumes.length; i++) { - var detail = detailTemplate.clone(true).attr("id","volume"+volumes[i].id); - if (getHypervisorType() == "kvm") { - detail.find("#volume_action_create_template").show(); - } - if (vIndex++ % 2 == 0) { - detail.addClass("hostadmin_showdetails_row_even"); - } else { - detail.addClass("hostadmin_showdetails_row_odd"); - } - detail.find("#detail_id").text(volumes[i].id); - detail.data("volumeId", volumes[i].id).data("vmState", volumes[i].vmstate).data("vmName", volumes[i].vmname); - detail.find("#detail_name").text(volumes[i].name); - if (volumes[i].storagetype == "shared") { - detail.find("#detail_type").text(volumes[i].type + " (shared storage)"); - } else { - detail.find("#detail_type").text(volumes[i].type + " (local storage)"); - } - - detail.find("#detail_size").text((volumes[i].size == "0") ? "" : convertBytes(volumes[i].size)); - setDateField(volumes[i].created, detail.find("#detail_created")); - - grid.append(detail.show()); - - if(volumes[i].type=="ROOT") { - if (volumes[i].vmstate == "Stopped") { - detail.find("#volume_action_detach_disk, #volume_acton_separator").hide(); - detail.find("#volume_action_create_template").show(); - } else { - detail.find("#volume_action_detach_disk, #volume_acton_separator, #volume_action_create_template").hide(); - } - } else { - if (volumes[i].vmstate != "Stopped") { - detail.find("#volume_acton_separator, #volume_action_create_template").hide(); - } - } - } - } - //expand volumes panel - link.removeClass().addClass("vm_botactionslinks_up"); - vmInstance.find("#volume_detail_panel").slideDown("slow"); - link.data("expanded", true); - - //collapse statistics panel if it is expanding - if(vmInstance.find("#vm_statistics_panel").css("display") != "none") - vmInstance.find("#vm_action_statistics").click(); - } - }); - } else { - link.removeClass().addClass("vm_botactionslinks_down"); - vmInstance.find("#volume_detail_panel").slideUp("slow"); - link.data("expanded", false); - } - break; - case "vm_action_statistics" : - var expanded = link.data("expanded"); - if (expanded == null || expanded == false) { - //expand statistics panel - link.removeClass().addClass("vm_botactionslinks_up"); - vmInstance.find("#vm_statistics_panel").slideDown("slow"); - link.data("expanded", true); - - //collapse volumes panel if it is expanding - if(vmInstance.find("#volume_detail_panel").css("display") != "none") - vmInstance.find("#vm_action_volumes").click(); - - } else { - link.removeClass().addClass("vm_botactionslinks_down"); - vmInstance.find("#vm_statistics_panel").slideUp("slow"); - link.data("expanded", false); - } - break; - case "vm_actions" : - vmInstance.find("#vm_actions_container").slideDown("fast"); - break; - case "vm_actions_close" : - vmInstance.find("#vm_actions_container").hide(); - break; - case "vm_action_continue" : - hideInstanceLoading(vmInstance); - vmInstance.find(".loadingmessage_container").fadeOut("slow"); - vmInstance.find(".row_loading").fadeOut("slow"); - break; - default: - break; - } - if (closeActions) { - vmInstance.find("#vm_actions_container").hide(); - } - return false; - }); - - // FUNCTION: Parses the JSON object for VM Instances and applies it to the vm template - function vmJSONToTemplate(instanceJSON, instanceTemplate) { - instanceTemplate.attr("id","vm"+instanceJSON.id); - - // Setup - var vmName = getVmName(instanceJSON.name, instanceJSON.displayname); - - instanceTemplate.data("id", instanceJSON.id) - .data("systemName", fromdb(instanceJSON.name)) - .data("name", fromdb(vmName)) - .data("passwordEnabled", instanceJSON.passwordenabled) - .data("domainId", instanceJSON.domainid) - .data("account", fromdb(instanceJSON.account)) - .data("zoneId", fromdb(instanceJSON.zoneid)) - .data("state", instanceJSON.state) - .data("ha", instanceJSON.haenable); - instanceTemplate.data("group", fromdb(instanceJSON.group)); - - if (instanceJSON.isoId != undefined && instanceJSON.isoid.length > 0) { - instanceTemplate.data("isoId", instanceJSON.isoid); - } - instanceTemplate.find("#vm_actions").data("id", instanceJSON.id); - - // Populate the template - instanceTemplate.find("#vm_name").html("Name: " + fromdb(vmName)); - instanceTemplate.find("#vm_ip_address").html("IP Address: " + instanceJSON.ipaddress); - instanceTemplate.find("#vm_zone").html("Zone: " + fromdb(instanceJSON.zonename)); - instanceTemplate.find("#vm_template").html("Template: " + fromdb(instanceJSON.templatename)); - instanceTemplate.find("#vm_service").html("Service: " + fromdb(instanceJSON.serviceofferingname)); - if (instanceJSON.haenable =='true') { - instanceTemplate.find("#vm_ha").html("HA: Enabled"); - instanceTemplate.find("#vm_action_ha").text("Disable HA"); - } else { - instanceTemplate.find("#vm_ha").html("HA: Disabled"); - instanceTemplate.find("#vm_action_ha").text("Enable HA"); - } - - setDateField(instanceJSON.created, instanceTemplate.find("#vm_created"), "Created: "); - - instanceTemplate.find("#vm_account").html("Account: " + fromdb(instanceJSON.account)); - instanceTemplate.find("#vm_domain").html("Domain: " + fromdb(instanceJSON.domain)); - if (isAdmin()) { - if (instanceJSON.hostname != undefined) { - instanceTemplate.find("#vm_host").html("Host: " + fromdb(instanceJSON.hostname)); - } else { - instanceTemplate.find("#vm_host").html("Host: "); - } - } - if (instanceJSON.group != undefined) { - instanceTemplate.find("#vm_group").text(fromdb(instanceJSON.group)); - } else { - instanceTemplate.find("#vm_group").text("No Group"); - } - - // Show State of the VM - if (instanceJSON.state == 'Destroyed') { - instanceTemplate.find("#vm_state_bar").removeClass("admin_vmred_arrow admin_vmgreen_arrow").addClass("admin_vmgrey_arrow"); - instanceTemplate.find("#vm_state").text(instanceJSON.state).removeClass("grid_stoppedtitles grid_runningtitles").addClass("grid_celltitles"); - instanceTemplate.find("#vm_action_restore").show(); - instanceTemplate.find("#vm_action_volumes, #vm_actions").hide(); - instanceTemplate.find("#vm_action_view_console").unbind("mouseover"); - } else if (instanceJSON.state == 'Running') { - instanceTemplate.find("#vm_state_bar").removeClass("admin_vmgrey_arrow admin_vmred_arrow").addClass("admin_vmgreen_arrow"); - instanceTemplate.find("#vm_state").text(instanceJSON.state).removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - instanceTemplate.find("#vm_action_view_console").data("imgUrl", "console?cmd=thumbnail&vm=" + instanceJSON.id + "&w=144&h=110"); - - // Console Proxy UI - instanceTemplate.find("#vm_action_view_console").data("proxyUrl", "console?cmd=access&vm=" + instanceJSON.id).data("vmId",instanceJSON.id).click(function(event) { - event.preventDefault(); - var viewer = window.open($(this).data("proxyUrl"),$(this).data("vmId"),"width=820,height=640,resizable=yes,menubar=no,status=no,scrollbars=no,toolbar=no,location=no"); - viewer.focus(); - }); - - // Enable/Disable actions - instanceTemplate.find("#vm_action_start, #vm_action_reset_password, #vm_action_change_service").removeClass().addClass("vmaction_links_off"); - if (instanceJSON.isoid != undefined && instanceJSON.isoid.length > 0) { - instanceTemplate.find("#vm_action_attach_iso").removeClass().addClass("vmaction_links_off"); - } else { - instanceTemplate.find("#vm_action_detach_iso").removeClass().addClass("vmaction_links_off"); - } - } else { - if (instanceJSON.state == 'Stopped') { - instanceTemplate.find("#vm_state_bar").removeClass("admin_vmgrey_arrow admin_vmgreen_arrow").addClass("admin_vmred_arrow"); - instanceTemplate.find("#vm_state").text(instanceJSON.state).removeClass("grid_celltitles grid_runningtitles").addClass("grid_stoppedtitles"); - instanceTemplate.find("#vm_action_stop, #vm_action_reboot").removeClass().addClass("vmaction_links_off"); - if (instanceJSON.isoid != undefined && instanceJSON.isoid.length > 0) { - instanceTemplate.find("#vm_action_attach_iso").removeClass().addClass("vmaction_links_off"); - } else { - instanceTemplate.find("#vm_action_detach_iso").removeClass().addClass("vmaction_links_off"); - } - } else { - instanceTemplate.find("#vm_state_bar").removeClass("admin_vmred_arrow admin_vmgreen_arrow").addClass("admin_vmgrey_arrow"); - instanceTemplate.find("#vm_state").text(instanceJSON.state).removeClass("grid_stoppedtitles grid_runningtitles").addClass("grid_celltitles"); - instanceTemplate.find("#vm_action_start, #vm_action_stop, #vm_action_reboot, #vm_action_attach_iso, #vm_action_detach_iso, #vm_action_reset_password, #vm_action_change_service").removeClass().addClass("vmaction_links_off"); - if(instanceJSON.state == 'Creating') - instanceTemplate.find("#vm_action_destroy").hide(); - } - instanceTemplate.find("#vm_action_view_console").unbind("mouseover"); - } - - // Show ISO state - if (instanceJSON.isoid != undefined && instanceJSON.isoid.length > 0) { - instanceTemplate.find("#iso_state").removeClass().addClass("vmiso_on"); - } - - if(getDirectAttachNetworkGroupsEnabled() != "true") - instanceTemplate.find("#vm_action_list_network_groups_container").hide(); - - var spaceCharacter = "      " - var statHtml = "

    CPU Total: " + ((instanceJSON.cpunumber==null)? spaceCharacter:instanceJSON.cpunumber) + " x " + ((instanceJSON.cpuspeed==null)? spaceCharacter:convertHz(instanceJSON.cpuspeed)) + " | CPU Used: " + ((instanceJSON.cpuused==null)? spaceCharacter:instanceJSON.cpuused) + "

    "; - instanceTemplate.find("#vm_cpu_stat").html(statHtml); - statHtml = "

    Network Read: " + ((instanceJSON.networkkbsread==null)? spaceCharacter:convertBytes(instanceJSON.networkkbsread * 1024))+" | Network Write: " + ((instanceJSON.networkkbswrite==null)? spaceCharacter:convertBytes(instanceJSON.networkkbswrite * 1024)) + "

    "; - instanceTemplate.find("#vm_network_stat").html(statHtml); - } - - vmPopup.find("#wizard_service_offering").bind("click", function(event){ - event.stopPropagation(); //do not use event.preventDetault(), otherwise, radio button won't be checked. - var serviceOfferingId = vmPopup.find("#wizard_service_offering input[name=service]:checked").val(); - if(getDirectAttachNetworkGroupsEnabled() != "true") { - vmPopup.find("#wizard_network_groups_container").hide(); - } - else { - $.ajax({ - data: createURL("command=listServiceOfferings&response=json&id="+serviceOfferingId), - dataType: "json", - success: function(json) { - var offerings = json.listserviceofferingsresponse.serviceoffering; - if (offerings != null && offerings.length > 0) { - if(offerings[0].usevirtualnetwork =="true") { //virtual network - vmPopup.find("#wizard_network_groups_container").hide(); - } - else { //direct attached - if(vmPopup.find("#wizard_network_groups").find("option").length == 0) - vmPopup.find("#wizard_network_groups_container").hide(); - else - vmPopup.find("#wizard_network_groups_container").show(); - } - - } - } - }); - } - }); - - // Add New Wizard Setup - var currentStepInVmPopup; - $(".add_newvmbutton").bind("click", function(event) { - vmPopup.fadeIn("slow"); - $("#overlay_black").show(); - vmWizardCleanup(); - - $.ajax({ - data: createURL("command=listZones&available=true&response=json"), - dataType: "json", - success: function(json) { - var zones = json.listzonesresponse.zone; - var zoneSelect = vmPopup.find("#wizard_zone").empty(); - if (zones != null && zones.length > 0) { - for (var i = 0; i < zones.length; i++) { - zoneSelect.append(""); - } - } - listTemplatesInVmPopup(); - } - }); - - $.ajax({ - data: createURL("command=listNetworkGroups"+"&domainid="+g_domainid+"&account="+g_account+"&response=json"), - dataType: "json", - success: function(json) { - var items = json.listnetworkgroupsresponse.networkgroup; - var networkGroupSelect = vmPopup.find("#wizard_network_groups").empty(); - if (items != null && items.length > 0) { - for (var i = 0; i < items.length; i++) { - if(items[i].name != "default") - networkGroupSelect.append(""); - } - } - } - }); - - $.ajax({ - data: createURL("command=listServiceOfferings&response=json"), - dataType: "json", - async: false, - success: function(json) { - var offerings = json.listserviceofferingsresponse.serviceoffering; - $("#wizard_service_offering").empty(); - - var first = true; - if (offerings != null && offerings.length > 0) { - for (var i = 0; i < offerings.length; i++) { - if(getSystemVmUseLocalStorage() == "false" && offerings[i].storagetype == "local") - continue; - var checked = "checked"; - if (first == false) checked = ""; - var listItem = $("
  • "); - $("#wizard_service_offering").append(listItem); - first = false; - } - //Safari and Chrome are not smart enough to make checkbox checked if html markup is appended by JQuery.append(). So, the following 2 lines are added. - var html_all = $("#wizard_service_offering").html(); - $("#wizard_service_offering").html(html_all); - } - - $.ajax({ - data: createURL("command=listDiskOfferings&domainid=1&response=json"), - dataType: "json", - async: false, - success: function(json) { - var offerings = json.listdiskofferingsresponse.diskoffering; - $("#wizard_root_disk_offering, #wizard_data_disk_offering").empty(); - - var html = - "
  • " - +"" - +"" - +"
  • "; - $("#wizard_data_disk_offering").append(html); - - if (offerings != null && offerings.length > 0) { - for (var i = 0; i < offerings.length; i++) { - var html = - "
  • " - +"" - +"" - +"
  • "; - $("#wizard_root_disk_offering").append(html); - - var html2 = - "
  • " - +"" - +"" - +"
  • "; - $("#wizard_data_disk_offering").append(html2); - } - //Safari and Chrome are not smart enough to make checkbox checked if html markup is appended by JQuery.append(). So, the following 2 lines are added. - var html_all = $("#wizard_root_disk_offering").html(); - $("#wizard_root_disk_offering").html(html_all); - - var html_all2 = $("#wizard_data_disk_offering").html(); - $("#wizard_data_disk_offering").html(html_all2); - } - } - }); - } - }); - - vmPopup.find("#wizard_service_offering").click(); - }); - - function vmWizardClose() { - vmPopup.hide(); - $("#overlay_black").hide(); - vmWizardCleanup(); - } - - function vmWizardCleanup() { - currentStepInVmPopup = 1; - vmPopup.find("#step1").show().nextAll().hide(); - vmPopup.find(".rev_wizmid_actionback").hide(); - vmPopup.find(".rev_wizmid_actionnext").show(); - vmPopup.find("#wizard_message").hide(); - selectedTemplateTypeInVmPopup = "featured"; - $("#wiz_featured").removeClass().addClass("rev_wizmid_selectedtempbut"); - $("#wiz_my, #wiz_community, #wiz_blank").removeClass().addClass("rev_wizmid_nonselectedtempbut"); - currentPageInTemplateGridInVmPopup = 1; - } - - vmPopup.find("#vm_wizard_close").bind("click", function(event) { - vmWizardClose(); - return false; - }); - - vmPopup.find("#step1 #wiz_message_continue").bind("click", function(event) { - vmPopup.find("#step1 #wiz_message").hide(); - return false; - }); - - vmPopup.find("#step2 #wiz_message_continue").bind("click", function(event) { - vmPopup.find("#step2 #wiz_message").hide(); - return false; - }); - - function getIconForOS(osType) { - if (osType == null || osType.length == 0) { - return ""; - } else { - if (osType.match("^CentOS") != null) { - return "rev_wiztemo_centosicons"; - } else if (osType.match("^Windows") != null) { - return "rev_wiztemo_windowsicons"; - } else { - return "rev_wiztemo_linuxicons"; - } - } - } - - //vm wizard search and pagination - vmPopup.find("#search_button").bind("click", function(event) { - currentPageInTemplateGridInVmPopup = 1; - listTemplatesInVmPopup(); - return false; //event.preventDefault() + event.stopPropagation() - }); - - vmPopup.find("#search_input").bind("keypress", function(event) { - if(event.keyCode == keycode_Enter) { - vmPopup.find("#search_button").click(); - return false; //event.preventDefault() + event.stopPropagation() - } - }); - - vmPopup.find("#nextPage").bind("click", function(event){ - currentPageInTemplateGridInVmPopup++; - listTemplatesInVmPopup(); - return false; //event.preventDefault() + event.stopPropagation() - }); - - vmPopup.find("#prevPage").bind("click", function(event){ - currentPageInTemplateGridInVmPopup--; - listTemplatesInVmPopup(); - return false; //event.preventDefault() + event.stopPropagation() - }); - - var vmPopupStep2PageSize = 11; //max number of templates each page in step2 of New VM wizard is 11 - function listTemplatesInVmPopup() { - var zoneId = vmPopup.find("#wizard_zone").val(); - if(zoneId == null || zoneId.length == 0) - return; - - var hypervisor = vmPopup.find("#wizard_hypervisor").val(); - if (hypervisor == null || hypervisor.length == 0) - return; - - var container = vmPopup.find("#template_container"); - - var commandString; - var searchInput = vmPopup.find("#search_input").val(); - if (selectedTemplateTypeInVmPopup != "blank") { - if (searchInput != null && searchInput.length > 0) - commandString = "command=listTemplates&templatefilter="+selectedTemplateTypeInVmPopup+"&zoneid="+zoneId+"&hypervisor="+hypervisor+"&keyword="+searchInput+"&response=json"; - else - commandString = "command=listTemplates&templatefilter="+selectedTemplateTypeInVmPopup+"&zoneid="+zoneId+"&hypervisor="+hypervisor+"&response=json"; - } else { - if (searchInput != null && searchInput.length > 0) - commandString = "command=listIsos&isReady=true&bootable=true&zoneid="+zoneId+"&hypervisor="+hypervisor+"&keyword="+searchInput+"&response=json"; - else - commandString = "command=listIsos&isReady=true&bootable=true&zoneid="+zoneId+"&hypervisor="+hypervisor+"&response=json"; - } - commandString += commandString + "&pagesize="+vmPopupStep2PageSize + "&page="+currentPageInTemplateGridInVmPopup; - - var loading = vmPopup.find("#wiz_template_loading").show(); - if(currentPageInTemplateGridInVmPopup==1) - vmPopup.find("#prevPage").hide(); - else - vmPopup.find("#prevPage").show(); - - $.ajax({ - data: createURL(commandString), - dataType: "json", - async: false, - success: function(json) { - var items; - if (selectedTemplateTypeInVmPopup != "blank") - items = json.listtemplatesresponse.template; - else - items = json.listisosresponse.iso; - loading.hide(); - container.empty(); - if (items != null && items.length > 0) { - var first = true; - for (var i = 0; i < items.length; i++) { - var divClass = "rev_wiztemplistbox"; - if (first) { - divClass = "rev_wiztemplistbox_selected"; - first = false; - } - - var html = '
    ' - +'
    ' - +'
    '+fromdb(items[i].displaytext)+'
    ' - +'
    '+fromdb(items[i].account)+'
    ' - +'
    '; - container.append(html); - } - if(items.length < vmPopupStep2PageSize) - vmPopup.find("#nextPage").hide(); - else - vmPopup.find("#nextPage").show(); - - } else { - var msg; - if (selectedTemplateTypeInVmPopup != "blank") - msg = "No templates available"; - else - msg = "No ISOs available"; - var html = '
    ' - +'
    ' - +'
    '+msg+'
    ' - +'
    '; - container.append(html); - vmPopup.find("#nextPage").hide(); - } - } - }); - } - - vmPopup.find("#template_container").bind("click", function(event) { - var container = $(this); - var target = $(event.target); - var parent = target.parent(); - if (parent.hasClass("rev_wiztemplistbox_selected") || parent.hasClass("rev_wiztemplistbox")) { - target = parent; - } - if (target.attr("id") != "-2") { - if (target.hasClass("rev_wiztemplistbox")) { - container.find(".rev_wiztemplistbox_selected").removeClass().addClass("rev_wiztemplistbox"); - target.removeClass().addClass("rev_wiztemplistbox_selected"); - } else if (target.hasClass("rev_wiztemplistbox_selected")) { - target.removeClass().addClass("rev_wiztemplistbox"); - } - } - }); - - vmPopup.find("#wizard_zone").bind("change", function(event) { - var selectedZone = $(this).val(); - if(selectedZone != null && selectedZone.length > 0) - listTemplatesInVmPopup(); - return false; - }); - - vmPopup.find("#wizard_hypervisor").bind("change", function(event) { - var selectedHypervisor = $(this).val(); - if(selectedHypervisor != null && selectedHypervisor.length > 0) - listTemplatesInVmPopup(); - return false; - }); - - function displayDiskOffering(type) { - if(type=="data") { - vmPopup.find("#wizard_data_disk_offering_title").show(); - vmPopup.find("#wizard_data_disk_offering").show(); - vmPopup.find("#wizard_root_disk_offering_title").hide(); - vmPopup.find("#wizard_root_disk_offering").hide(); - } - else if(type=="root") { - vmPopup.find("#wizard_root_disk_offering_title").show(); - vmPopup.find("#wizard_root_disk_offering").show(); - vmPopup.find("#wizard_data_disk_offering_title").hide(); - vmPopup.find("#wizard_data_disk_offering").hide(); - } - } - displayDiskOffering("data"); //because default value of "#wiz_template_filter" is "wiz_featured" - - // Setup the left template filters - vmPopup.find("#wiz_template_filter").unbind("click").bind("click", function(event) { - var container = $(this); - var target = $(event.target); - var targetId = target.attr("id"); - selectedTemplateTypeInVmPopup = "featured"; - switch (targetId) { - case "wiz_featured": - vmPopup.find("#search_input").val(""); - currentPageInTemplateGridInVmPopup = 1; - selectedTemplateTypeInVmPopup = "featured"; - container.find("#wiz_featured").removeClass().addClass("rev_wizmid_selectedtempbut"); - container.find("#wiz_my, #wiz_community, #wiz_blank").removeClass().addClass("rev_wizmid_nonselectedtempbut"); - displayDiskOffering("data"); - break; - case "wiz_my": - vmPopup.find("#search_input").val(""); - currentPageInTemplateGridInVmPopup = 1; - container.find("#wiz_my").removeClass().addClass("rev_wizmid_selectedtempbut"); - container.find("#wiz_featured, #wiz_community, #wiz_blank").removeClass().addClass("rev_wizmid_nonselectedtempbut"); - selectedTemplateTypeInVmPopup = "selfexecutable"; - displayDiskOffering("data"); - break; - case "wiz_community": - vmPopup.find("#search_input").val(""); - currentPageInTemplateGridInVmPopup = 1; - container.find("#wiz_community").removeClass().addClass("rev_wizmid_selectedtempbut"); - container.find("#wiz_my, #wiz_featured, #wiz_blank").removeClass().addClass("rev_wizmid_nonselectedtempbut"); - selectedTemplateTypeInVmPopup = "community"; - displayDiskOffering("data"); - break; - case "wiz_blank": - vmPopup.find("#search_input").val(""); - currentPageInTemplateGridInVmPopup = 1; - container.find("#wiz_blank").removeClass().addClass("rev_wizmid_selectedtempbut"); - container.find("#wiz_my, #wiz_community, #wiz_featured").removeClass().addClass("rev_wizmid_nonselectedtempbut"); - selectedTemplateTypeInVmPopup = "blank"; - displayDiskOffering("root"); - break; - } - listTemplatesInVmPopup(); - return false; - }); - - vmPopup.find(".rev_wizmid_actionnext").bind("click", function(event) { - event.preventDefault(); - event.stopPropagation(); - - var thisPopup = vmPopup; - - if (currentStepInVmPopup == 1) { - // prevent a person from moving on if no templates are selected - if(thisPopup.find("#step1 #template_container .rev_wiztemplistbox_selected").length == 0) { - thisPopup.find("#step1 #wiz_message").show(); - return false; - } - } - - if (currentStepInVmPopup == 2) { - // prevent a person from moving on if no service offering is selected - if(thisPopup.find("#step2 #wizard_service_offering li").length == 0) { - thisPopup.find("#step2 #wiz_message #wiz_message_text").text("Please select a service offering to continue"); - thisPopup.find("#step2 #wiz_message").show(); - return false; - } - } - - if(currentStepInVmPopup ==3) { - // validate values - var isValid = true; - isValid &= validateString("Name", thisPopup.find("#wizard_vm_name"), thisPopup.find("#wizard_vm_name_errormsg"), true); - isValid &= validateString("Group", thisPopup.find("#wizard_vm_group"), thisPopup.find("#wizard_vm_group_errormsg"), true); - if (!isValid) return; - - // populate data for next step (step 4) - if (thisPopup.find("#wiz_blank").hasClass("rev_wizmid_selectedtempbut")) { //selected template type is ISO(blank template) - thisPopup.find("#wizard_review_root_disk_offering").text(thisPopup.find("#wizard_root_disk_offering input[name=rootdisk]:checked").next().text()); - thisPopup.find("#wizard_review_root_disk_offering_p").show(); - thisPopup.find("#wizard_review_iso").text(thisPopup.find("#step1 .rev_wiztemplistbox_selected .rev_wiztemp_listtext").text()); - thisPopup.find("#wizard_review_iso_p").show(); - thisPopup.find("#wizard_review_data_disk_offering_p").hide(); - thisPopup.find("#wizard_review_template").text("Blank Template"); - } else { //selected template type is template(non-blank template) - thisPopup.find("#wizard_review_template").text(thisPopup.find("#step1 .rev_wiztemplistbox_selected .rev_wiztemp_listtext").text()); - thisPopup.find("#wizard_review_data_disk_offering_p").show(); - thisPopup.find("#wizard_review_data_disk_offering").text(thisPopup.find("#wizard_data_disk_offering input[name=datadisk]:checked").next().text()); - thisPopup.find("#wizard_review_root_disk_offering_p").hide(); - thisPopup.find("#wizard_review_iso_p").hide(); - } - - thisPopup.find("#wizard_review_service_offering").text(thisPopup.find("#wizard_service_offering input[name=service]:checked").next().text()); - thisPopup.find("#wizard_review_zone").text(thisPopup.find("#wizard_zone option:selected").text()); - thisPopup.find("#wizard_review_name").text(thisPopup.find("#wizard_vm_name").val()); - thisPopup.find("#wizard_review_group").text(thisPopup.find("#wizard_vm_group").val()); - thisPopup.find("#wizard_review_hypervisor").text(thisPopup.find("#wizard_hypervisor option:selected").text()); - - if(thisPopup.find("#wizard_network_groups_container").css("display") != "none" && thisPopup.find("#wizard_network_groups").val() != null) { - var networkGroupList = thisPopup.find("#wizard_network_groups").val().join(","); - thisPopup.find("#wizard_review_network_groups_p").show(); - thisPopup.find("#wizard_review_network_groups").text(networkGroupList); - } else { - thisPopup.find("#wizard_review_network_groups_p").hide(); - thisPopup.find("#wizard_review_network_groups").text(""); - } - } - if (currentStepInVmPopup == 4) { - // Create a new VM!!!! - var moreCriteria = []; - moreCriteria.push("&zoneId="+thisPopup.find("#wizard_zone").val()); - - var name = trim(thisPopup.find("#wizard_vm_name").val()); - if (name != null && name.length > 0) - moreCriteria.push("&displayname="+todb(name)); - - var group = trim(thisPopup.find("#wizard_vm_group").val()); - if (group != null && group.length > 0) - moreCriteria.push("&group="+todb(group)); - - if(thisPopup.find("#wizard_network_groups_container").css("display") != "none" && thisPopup.find("#wizard_network_groups").val() != null) { - var networkGroupList = thisPopup.find("#wizard_network_groups").val().join(","); - moreCriteria.push("&networkgrouplist="+encodeURIComponent(networkGroupList)); - } - - moreCriteria.push("&templateId="+thisPopup.find("#step1 .rev_wiztemplistbox_selected").attr("id")); - - moreCriteria.push("&serviceOfferingId="+thisPopup.find("#wizard_service_offering input[name=service]:checked").val()); - - if (thisPopup.find("#wiz_blank").hasClass("rev_wizmid_selectedtempbut")) { //ISO - var diskOfferingId = thisPopup.find("#wizard_root_disk_offering input[name=rootdisk]:checked").val(); - moreCriteria.push("&diskOfferingId="+diskOfferingId); - } - else { //template - var diskOfferingId = thisPopup.find("#wizard_data_disk_offering input[name=datadisk]:checked").val(); - if(diskOfferingId != null && diskOfferingId != "") - moreCriteria.push("&diskOfferingId="+diskOfferingId); - } - - vmWizardClose(); - - var vmInstance = vmInstanceTemplate.clone(true); - // Add it to the DOM - showInstanceLoading(vmInstance, "Creating..."); - vmInstance.find("#vm_state_bar").removeClass("admin_vmred_arrow admin_vmgreen_arrow").addClass("admin_vmgrey_arrow"); - vmInstance.find("#vm_state").text("Creating").removeClass("grid_stoppedtitles grid_runningtitles").addClass("grid_celltitles"); - vmInstance.fadeIn("slow"); - $("#submenu_content_vms #grid_content").prepend(vmInstance); - - $.ajax({ - data: createURL("command=deployVirtualMachine"+moreCriteria.join("")+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.deployvirtualmachineresponse.jobid; - vmInstance.attr("id","vmNew"+jobId).data("jobId", jobId); - var timerKey = "vmNew"+jobId; - - // Process the async job - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+jobId+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - //vmInstance.find(".loading_animationcontainer").hide(); - vmInstance.find("#vm_loading_container").hide(); - if (result.jobstatus == 1) { - // Succeeded - var virtualMachine = result.jobresult.deployvirtualmachineresponse; - vmJSONToTemplate(virtualMachine, vmInstance); - if (virtualMachine.passwordenabled == 'true') { - vmInstance.find(".loadingmessage_container .loadingmessage_top p").html("Your instance has been successfully created. Your new password is : " + virtualMachine.password + " . Please change it as soon as you log into your new instance"); - } else { - vmInstance.find(".loadingmessage_container .loadingmessage_top p").html("Your instance has been successfully created."); - } - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - vmInstance.attr("id", "vm" + virtualMachine.id); - vmInstance.find("#vm_state_bar").removeClass("admin_vmred_arrow admin_vmgrey_arrow").addClass("admin_vmgreen_arrow"); - vmInstance.find("#vm_state").text("Running").removeClass("grid_stoppedtitles grid_celltitles").addClass("grid_runningtitles"); - changeGridRowsTotal($("#grid_rows_total"), 1); - } else if (result.jobstatus == 2) { - // Failed - vmInstance.find(".loadingmessage_container .loadingmessage_top p").text("Unable to create your new instance due to the error: " + result.jobresult); - vmInstance.find(".loadingmessage_container").fadeIn("slow"); - vmInstance.find(".continue_button").data("jobId", result.jobid).unbind("click").bind("click", function(event) { - event.preventDefault(); - var deadVM = $("#vmNew"+$(this).data("jobId")); - deadVM.slideUp("slow", function() { - $(this).remove(); - }); - }); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - vmInstance.slideUp("slow", function() { - $(this).remove(); - }); - handleError(XMLHttpResponse); - } - }); - } - - //since no error, move to next step - vmPopup.find(".rev_wizmid_actionback").show(); - vmPopup.find("#step" + currentStepInVmPopup).hide().next().show(); - currentStepInVmPopup++; - }); - - vmPopup.find(".rev_wizmid_actionback").bind("click", function(event) { - vmPopup.find("#step" + currentStepInVmPopup).hide().prev().show(); - currentStepInVmPopup--; - if (currentStepInVmPopup == 1) { - vmPopup.find(".rev_wizmid_actionback").hide(); - } - return false; //event.preventDefault() + event.stopPropagation() - }); - - var currentSubMenu = $("#submenu_vms"); - $("#submenu_vms").bind("click", function(event) { - event.preventDefault(); - - $(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off"); - currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on"); - currentSubMenu = $(this); - var submenuContent = $("#submenu_content_vms").show(); - $("#submenu_content_console, #submenu_content_routers, #submenu_content_snapshots").hide(); - - // Major HACK here. I am reusing the disk header as the account header. - if (isAdmin()) { - $("#vm_disk_header").text("Account"); - $("#vm_group_header").text("Host"); - submenuContent.find("#adv_search_pod_li, #adv_search_domain_li, #adv_search_account_li").show(); - } - - // Setup VM Page by listing User's VMs - currentPage = 1; - listVirtualMachines(); - }); - - function listVirtualMachines() { - var submenuContent = $("#submenu_content_vms"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var state = submenuContent.find("#advanced_search #adv_search_state").val(); - var zone = submenuContent.find("#advanced_search #adv_search_zone").val(); - var pod = submenuContent.find("#advanced_search #adv_search_pod").val(); - var domainId = submenuContent.find("#advanced_search #adv_search_domain").val(); - var account = submenuContent.find("#advanced_search #adv_search_account").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(name)); - if (state!=null && state.length > 0) - moreCriteria.push("&state="+state); - if (zone!=null && zone.length > 0) - moreCriteria.push("&zoneid="+zone); - if (domainId!=null && domainId.length > 0) - moreCriteria.push("&domainid="+domainId); - if (pod!=null && pod.length > 0) - moreCriteria.push("&podId="+pod); - if (account!=null && account.length > 0) - moreCriteria.push("&account="+account); - commandString = "command=listVirtualMachines&page="+currentPage+moreCriteria.join("")+"&response=json"; - } else { - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) { - commandString = "command=listVirtualMachines&page="+currentPage+"&keyword="+searchInput+"&response=json"; - } - else { - var moreCriteria = []; - // "p_domainId!=null" and "p_account!=null" means redirected from "VMs" link on Accounts page to here(Instances page) - if(p_domainId!=null && p_domainId.length > 0) - moreCriteria.push("&domainid="+p_domainId); - if (p_account!=null && p_account.length > 0) - moreCriteria.push("&account="+p_account); - commandString = "command=listVirtualMachines&page="+currentPage+moreCriteria.join("")+"&response=json"; - } - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listvirtualmachinesresponse", "virtualmachine", vmInstanceTemplate, vmJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_vms"), listVirtualMachines); - - //*** router_template event handler (begin) ****************************************************************** - $("#router_template").bind("mouseenter", function(event) { - $(this).find("#grid_links_container").show(); - return false; - }); - $("#router_template").bind("mouseleave", function(event) { - $(this).find("#grid_links_container").hide(); - return false; - }); - - $("#router_template").bind("click", function(event) { - var template = $(this); - var link = $(event.target); - var linkAction = link.attr("id"); - var id = template.data("routerId"); - var name = template.data("routerName"); - switch (linkAction) { - case "router_action_start" : - $("#dialog_confirmation") - .html("

    Please confirm you want to start the router: "+name+"

    ") - .dialog('option', 'buttons', { - "Confirm": function() { - var dialogBox = $(this); - $.ajax({ - data: createURL("command=startRouter&id="+id+"&response=json"), - dataType: "json", - success: function(json) { - dialogBox.dialog("close"); - - template.find(".row_loading").show(); - template.find(".loading_animationcontainer .loading_animationtext").text("Starting..."); - template.find(".loading_animationcontainer").show(); - template.fadeIn("slow"); - var that = template; //"that" is a closure and will be used in callback function. - template.find(".continue_button").data("id", id).unbind("click").bind("click", function(event) { - event.preventDefault(); - that.find(".loading_animationcontainer").hide(); - that.find(".loadingmessage_container").fadeOut("slow"); - that.find(".row_loading").fadeOut("slow"); - }); - var timerKey = "router"+id; - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.startrouterresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - routerJSONToTemplate(result.router[0], template); - template.find(".loadingmessage_container .loadingmessage_top p").html("Your router has been successfully started."); - template.find(".loadingmessage_container").fadeIn("slow"); - } else if (result.jobstatus == 2) { - // Failed - template.find("#router_state_bar").removeClass("yellow_statusbar green_statusbar grey_statusbar").addClass("red_statusbar"); - template.find("#router_state").text("Stopped").removeClass("grid_runningtitles grid_celltitles").addClass("grid_stoppedtitles"); - template.find(".grid_links").find("#router_action_start_container").show(); - template.find(".grid_links").find("#router_action_stop_container, #router_action_view_console_container, #router_action_reboot_container").hide(); - template.find(".loadingmessage_container .loadingmessage_top p").text("We were unable to start the router. Please check your logs for more info."); - template.find(".loadingmessage_container").fadeIn("slow"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "router_action_stop" : - $("#dialog_confirmation") - .html("

    Please confirm you want to stop the router: "+name+"

    ") - .dialog('option', 'buttons', { - "Confirm": function() { - var dialogBox = $(this); - $.ajax({ - data: createURL("command=stopRouter&id="+id+"&response=json"), - dataType: "json", - success: function(json) { - dialogBox.dialog("close"); - - template.find(".row_loading").show(); - template.find(".loading_animationcontainer .loading_animationtext").text("Stopping..."); - template.find(".loading_animationcontainer").show(); - template.fadeIn("slow"); - var that = template; //"that" is a closure and will be used in callback function. - template.find(".continue_button").data("id", id).unbind("click").bind("click", function(event) { - event.preventDefault(); - that.find(".loading_animationcontainer").hide(); - that.find(".loadingmessage_container").fadeOut("slow"); - that.find(".row_loading").fadeOut("slow"); - }); - var timerKey = "router"+id; - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.stoprouterresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - routerJSONToTemplate(result.jobresult.stoprouterresponse, template); - template.find(".loadingmessage_container .loadingmessage_top p").html("Your router has been successfully stopped."); - template.find(".loadingmessage_container").fadeIn("slow"); - } else if (result.jobstatus == 2) { - // Failed - template.find("#router_state_bar").removeClass("yellow_statusbar grey_statusbar red_statusbar").addClass("green_statusbar"); - template.find("#router_state").text("Running").removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - template.find(".grid_links").find("#router_action_stop_container, #router_action_view_console_container, #router_action_reboot_container").show(); - template.find(".grid_links").find("#router_action_start_container").hide(); - template.find(".loadingmessage_container .loadingmessage_top p").text("We were unable to stop the router. Please check your logs for more info."); - template.find(".loadingmessage_container").fadeIn("slow"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "router_action_reboot" : - $("#dialog_confirmation") - .html("

    Please confirm you want to reboot the router: "+name+"

    ") - .dialog('option', 'buttons', { - "Confirm": function() { - var dialogBox = $(this); - $.ajax({ - data: createURL("command=rebootRouter&id="+id+"&response=json"), - dataType: "json", - success: function(json) { - dialogBox.dialog("close"); - - template.find(".row_loading").show(); - template.find(".loading_animationcontainer .loading_animationtext").text("Rebooting..."); - template.find(".loading_animationcontainer").show(); - template.fadeIn("slow"); - var that = template; //"that" is a closure and will be used in callback function. - template.find(".continue_button").data("id", id).unbind("click").bind("click", function(event) { - event.preventDefault(); - that.find(".loading_animationcontainer").hide(); - that.find(".loadingmessage_container").fadeOut("slow"); - that.find(".row_loading").fadeOut("slow"); - }); - var timerKey = "router"+id; - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.rebootrouterresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - routerJSONToTemplate(result.router[0], template); - template.find(".loadingmessage_container .loadingmessage_top p").html("Your router has been successfully rebooted."); - template.find(".loadingmessage_container").fadeIn("slow"); - } else if (result.jobstatus == 2) { - // Failed - template.find("#router_state_bar").removeClass("yellow_statusbar grey_statusbar red_statusbar").addClass("green_statusbar"); - template.find("#router_state").text("Running").removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - template.find(".grid_links").find("#router_action_stop_container, #router_action_view_console_container, #router_action_reboot_container").show(); - template.find(".grid_links").find("#router_action_start_container").hide(); - template.find(".loadingmessage_container .loadingmessage_top p").text("We were unable to reboot the router. Please check your logs for more info."); - template.find(".loadingmessage_container").fadeIn("slow"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - default : - break; - } - return false; - }); - //*** router_template event handler (end) ******************************************************************** - - //*** console_template event handler (begin) ****************************************************************** - $("#console_template").bind("mouseenter", function(event) { - $(this).find("#grid_links_container").show(); - return false; - }); - $("#console_template").bind("mouseleave", function(event) { - $(this).find("#grid_links_container").hide(); - return false; - }); - - $("#console_template").bind("click", function(event) { - var template = $(this); - var link = $(event.target); - var linkAction = link.attr("id"); - var id = template.data("consoleId"); - var name = template.data("consoleName"); - switch (linkAction) { - case "console_action_start" : - $("#dialog_confirmation") - .html("

    Please confirm you want to start the system VM: "+name+"

    ") - .dialog('option', 'buttons', { - "Confirm": function() { - var dialogBox = $(this); - $.ajax({ - data: createURL("command=startSystemVm&id="+id+"&response=json"), - dataType: "json", - success: function(json) { - dialogBox.dialog("close"); - - template.find(".row_loading").show(); - template.find(".loading_animationcontainer .loading_animationtext").text("Starting..."); - template.find(".loading_animationcontainer").show(); - template.fadeIn("slow"); - var that = template; //"that" is a closure and will be used in callback function. - template.find(".continue_button").data("id", id).unbind("click").bind("click", function(event) { - event.preventDefault(); - that.find(".loading_animationcontainer").hide(); - that.find(".loadingmessage_container").fadeOut("slow"); - that.find(".row_loading").fadeOut("slow"); - }); - var timerKey = "console"+id; - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json["startsystemvmresponse"].jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - consoleJSONToTemplate(result.systemvm[0], template); - template.find(".loadingmessage_container .loadingmessage_top p").html("Your system vm has been successfully started."); - template.find(".loadingmessage_container").fadeIn("slow"); - } else if (result.jobstatus == 2) { - // Failed - template.find("#console_state_bar").removeClass("yellow_statusbar green_statusbar grey_statusbar").addClass("red_statusbar"); - template.find("#console_state").text("Stopped").removeClass("grid_runningtitles grid_celltitles").addClass("grid_stoppedtitles"); - template.find(".grid_links").find("#console_action_start_container").show(); - template.find(".grid_links").find("#console_action_stop_container, #console_action_view_console_container, #console_action_reboot_container").hide(); - template.find(".loadingmessage_container .loadingmessage_top p").text("We were unable to start the console. Please check your logs for more info."); - template.find(".loadingmessage_container").fadeIn("slow"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "console_action_stop" : - $("#dialog_confirmation") - .html("

    Please confirm you want to stop the system VM: "+name+"

    ") - .dialog('option', 'buttons', { - "Confirm": function() { - var dialogBox = $(this); - $.ajax({ - data: createURL("command=stopSystemVm&id="+id+"&response=json"), - dataType: "json", - success: function(json) { - dialogBox.dialog("close"); - - template.find(".row_loading").show(); - template.find(".loading_animationcontainer .loading_animationtext").text("Stopping..."); - template.find(".loading_animationcontainer").show(); - template.fadeIn("slow"); - var that = template; //"that" is a closure and will be used in callback function. - template.find(".continue_button").data("id", id).unbind("click").bind("click", function(event) { - event.preventDefault(); - that.find(".loading_animationcontainer").hide(); - that.find(".loadingmessage_container").fadeOut("slow"); - that.find(".row_loading").fadeOut("slow"); - }); - var timerKey = "console"+id; - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json["stopsystemvmresponse"].jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - consoleJSONToTemplate(result.systemvm[0], template); - template.find(".loadingmessage_container .loadingmessage_top p").html("Your system vm has been successfully stopped."); - template.find(".loadingmessage_container").fadeIn("slow"); - } else if (result.jobstatus == 2) { - // Failed - template.find("#console_state_bar").removeClass("yellow_statusbar grey_statusbar red_statusbar").addClass("green_statusbar"); - template.find("#console_state").text("Running").removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - template.find(".grid_links").find("#console_action_stop_container, #console_action_view_console_container, #console_action_reboot_container").show(); - template.find(".grid_links").find("#console_action_start_container").hide(); - template.find(".loadingmessage_container .loadingmessage_top p").text("We were unable to stop the console. Please check your logs for more info."); - template.find(".loadingmessage_container").fadeIn("slow"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "console_action_reboot" : - $("#dialog_confirmation") - .html("

    Please confirm you want to reboot the system VM: "+name+"

    ") - .dialog('option', 'buttons', { - "Confirm": function() { - var dialogBox = $(this); - $.ajax({ - data: createURL("command=rebootSystemVm&id="+id+"&response=json"), - dataType: "json", - success: function(json) { - dialogBox.dialog("close"); - - template.find(".row_loading").show(); - template.find(".loading_animationcontainer .loading_animationtext").text("Rebooting..."); - template.find(".loading_animationcontainer").show(); - template.fadeIn("slow"); - var that = template; //"that" is a closure and will be used in callback function. - template.find(".continue_button").data("id", id).unbind("click").bind("click", function(event) { - event.preventDefault(); - that.find(".loading_animationcontainer").hide(); - that.find(".loadingmessage_container").fadeOut("slow"); - that.find(".row_loading").fadeOut("slow"); - }); - var timerKey = "console"+id; - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json["rebootsystemvmresponse"].jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - consoleJSONToTemplate(result.systemvm[0], template); - template.find(".loadingmessage_container .loadingmessage_top p").html("Your system vm has been successfully rebooted."); - template.find(".loadingmessage_container").fadeIn("slow"); - } else if (result.jobstatus == 2) { - // Failed - template.find("#console_state_bar").removeClass("yellow_statusbar grey_statusbar red_statusbar").addClass("green_statusbar"); - template.find("#console_state").text("Running").removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - template.find(".grid_links").find("#console_action_stop_container, #console_action_view_console_container, #console_action_reboot_container").show(); - template.find(".grid_links").find("#console_action_start_container").hide(); - template.find(".loadingmessage_container .loadingmessage_top p").text("We were unable to reboot the console. Please check your logs for more info."); - template.find(".loadingmessage_container").fadeIn("slow"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - default : - break; - } - return false; - }); - //*** console_template event handler (end) ******************************************************************** - - //routers page - function listRouters() { - var submenuContent = $("#submenu_content_routers"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var state = submenuContent.find("#advanced_search #adv_search_state").val(); - var zone = submenuContent.find("#advanced_search #adv_search_zone").val(); - var pod = submenuContent.find("#advanced_search #adv_search_pod").val(); - var domainId = submenuContent.find("#advanced_search #adv_search_domain").val(); - var account = submenuContent.find("#advanced_search #adv_search_account").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(name)); - if (state!=null && state.length > 0) - moreCriteria.push("&state="+state); - if (zone!=null && zone.length > 0) - moreCriteria.push("&zoneId="+zone); - if (pod!=null && pod.length > 0) - moreCriteria.push("&podId="+pod); - if (domainId!=null && domainId.length > 0) - moreCriteria.push("&domainid="+domainId); - if (account!=null && account.length > 0) - moreCriteria.push("&account="+account); - commandString = "command=listRouters&page="+currentPage+moreCriteria.join("")+"&response=json"; - } else { - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listRouters&page="+currentPage+"&keyword="+searchInput+"&response=json"; - else - commandString = "command=listRouters&page="+currentPage+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listroutersresponse", "router", $("#router_template"), routerJSONToTemplate); - } - - function routerJSONToTemplate(json, template) { - if (index % 2 == 0) - template.addClass("row_odd"); - else - template.addClass("row_even"); - template.data("routerId", json.id).data("routerName", fromdb(json.name)).attr("id", "router"+json.id); - template.find("#router_zonename").text(fromdb(json.zonename)); - template.find("#router_name").text(fromdb(json.name)); - template.find("#router_public_ip").text(fromdb(json.publicip)); - template.find("#router_private_ip").text(fromdb(json.privateip)); - template.find("#router_guest_ip").text(fromdb(json.guestipaddress)); - template.find("#router_host").text(fromdb(json.hostname)); - template.find("#router_domain").text(fromdb(json.networkdomain)); - template.find("#router_owner").text(fromdb(json.account)); - setDateField(json.created, template.find("#router_created")); - - // State - if (json.state == 'Running') { - template.find("#router_state_bar").removeClass("yellow_statusbar grey_statusbar red_statusbar").addClass("green_statusbar "); - template.find("#router_state").text(json.state).removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - template.find(".grid_links").find("#router_action_start_container").hide(); - template.find(".grid_links").find("#router_action_stop_container, #router_action_reboot_container, #router_action_view_console_container").show(); - // Console Proxy UI - template.find("#router_action_view_console").data("proxyUrl", "console?cmd=access&vm=" + json.id).data("vmId",json.id).click(function(event) { - event.preventDefault(); - var viewer = window.open($(this).data("proxyUrl"),$(this).data("vmId"),"width=820,height=640,resizable=yes,menubar=no,status=no,scrollbars=no,toolbar=no,location=no"); - viewer.focus(); - }); - } else if (json.state == 'Stopped') { - template.find("#router_state_bar").removeClass("yellow_statusbar grey_statusbar green_statusbar").addClass("red_statusbar"); - template.find("#router_state").text(json.state).removeClass("grid_celltitles grid_runningtitles").addClass("grid_stoppedtitles"); - template.find(".grid_links").find("#router_action_stop_container, #router_action_reboot_container, #router_action_view_console_container").hide(); - template.find(".grid_links").find("#router_action_start_container").show(); - template.find("#router_action_view_console").unbind("click"); - } else { - template.find("#router_state_bar").removeClass("yellow_statusbar green_statusbar red_statusbar").addClass("grey_statusbar"); - template.find("#router_state").text(json.state).removeClass("grid_runningtitles grid_stoppedtitles").addClass("grid_celltitles"); - template.find(".grid_links").find("#router_action_start_container, #router_action_stop_container, #router_action_reboot_container, #router_action_view_console_container").hide(); - template.find("#router_action_view_console").unbind("click"); - } - } - - $("#submenu_routers").bind("click", function(event) { - event.preventDefault(); - - $(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off"); - currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on"); - currentSubMenu = $(this); - var submenuContent = $("#submenu_content_routers").show(); - $("#submenu_content_vms, #submenu_content_console, #submenu_content_snapshots").hide(); - - if (isAdmin()) - submenuContent.find("#adv_search_pod_li, #adv_search_domain_li, #adv_search_account_li").show(); - - currentPage = 1; - listRouters(); - }); - - submenuContentEventBinder($("#submenu_content_routers"), listRouters); - - //console proxy - function listConsoleProxies() { - var submenuContent = $("#submenu_content_console"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var state = submenuContent.find("#advanced_search #adv_search_state").val(); - var zone = submenuContent.find("#advanced_search #adv_search_zone").val(); - var pod = submenuContent.find("#advanced_search #adv_search_pod").val(); - var domainId = submenuContent.find("#advanced_search #adv_search_domain").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(name)); - if (state!=null && state.length > 0) - moreCriteria.push("&state="+state); - if (zone!=null && zone.length > 0) - moreCriteria.push("&zoneId="+zone); - if (pod!=null && pod.length > 0) - moreCriteria.push("&podId="+pod); - if (domainId!=null && domainId.length > 0) - moreCriteria.push("&domainid="+domainId); - commandString = "command=listSystemVms&page="+currentPage+moreCriteria.join("")+"&response=json"; - } else { - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listSystemVms&page="+currentPage+"&keyword="+searchInput+"&response=json" - else - commandString = "command=listSystemVms&page="+currentPage+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listsystemvmsresponse", "systemvm", $("#console_template"), consoleJSONToTemplate); - } - - function consoleJSONToTemplate(json, template) { - if (index++ % 2 == 0) - template.addClass("row_odd"); - else - template.addClass("row_even"); - template.data("consoleId", json.id).data("consoleName", fromdb(json.name)).attr("id", "console"+json.id); - template.find("#console_type").text(fromdb(json.systemvmtype)); - template.find("#console_name").text(fromdb(json.name)); - template.find("#console_zone").text(fromdb(json.zonename)); - template.find("#console_active_session").text(fromdb(json.activeviewersessions)); - template.find("#console_public_ip").text(fromdb(json.publicip)); - template.find("#console_private_ip").text(fromdb(json.privateip)); - template.find("#console_host").text(fromdb(json.hostname)); - template.find("#console_gateway").text(fromdb(json.gateway)); - setDateField(json.created, template.find("#console_created")); - - // State - if (json.state == 'Running') { - template.find("#console_state_bar").removeClass("yellow_statusbar grey_statusbar red_statusbar").addClass("green_statusbar "); - template.find("#console_state").text(json.state).removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - template.find(".grid_links").find("#console_action_start_container").hide(); - template.find(".grid_links").find("#console_action_stop_container, #console_action_reboot_container, #console_action_view_console_container").show(); - // Console Proxy UI - template.find("#console_action_view_console").data("proxyUrl", "console?cmd=access&vm=" + json.id).data("vmId", json.id).click(function(event) { - event.preventDefault(); - var viewer = window.open($(this).data("proxyUrl"),$(this).data("vmId"),"width=820,height=640,resizable=yes,menubar=no,status=no,scrollbars=no,toolbar=no,location=no"); - viewer.focus(); - }); - } else if (json.state == 'Stopped') { - template.find("#console_state_bar").removeClass("yellow_statusbar grey_statusbar green_statusbar").addClass("red_statusbar"); - template.find("#console_state").text(json.state).removeClass("grid_celltitles grid_runningtitles").addClass("grid_stoppedtitles"); - template.find(".grid_links").find("#console_action_stop_container, #console_action_reboot_container, #console_action_view_console_container").hide(); - template.find(".grid_links").find("#console_action_start_container").show(); - template.find("#console_action_view_console").unbind("click"); - } else { - template.find("#console_state_bar").removeClass("yellow_statusbar green_statusbar red_statusbar").addClass("grey_statusbar"); - template.find("#console_state").text(json.state).removeClass("grid_runningtitles grid_stoppedtitles").addClass("grid_celltitles"); - template.find(".grid_links").find("#console_action_start_container, #console_action_stop_container, #console_action_reboot_container, #console_action_view_console_container").hide(); - template.find("#console_action_view_console").unbind("click"); - } - } - - // CONSOLE PROXY SUBMENU - $("#submenu_console").bind("click", function(event) { - event.preventDefault(); - $(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off"); - currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on"); - currentSubMenu = $(this); - var submenuContent = $("#submenu_content_console").show(); - $("#submenu_content_vms, #submenu_content_routers, #submenu_content_snapshots").hide(); - - if (isAdmin()) - submenuContent.find("#adv_search_pod_li #adv_search_domain_li").show(); - - currentPage = 1; - listConsoleProxies(); - }); - - submenuContentEventBinder($("#submenu_content_console"), listConsoleProxies); - - activateDialog($("#dialog_detach_volume").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - $("#volume_detail_template").bind("click", function(event) { - var template = $(this); - var link = $(event.target); - var linkAction = link.attr("id"); - var volumeId = template.data("volumeId"); - var volumeName = template.data("volumeName"); - var vmState = template.data("vmState"); - var vmName = template.data("vmName"); - var timerKey = "volume"+volumeId; - switch (linkAction) { - case "volume_action_detach_disk" : - $("#dialog_confirmation") - .html("

    Please confirm you want to detach the volume. If you are detaching a disk volume from a Windows based virtual machine, you will need to reboot the instance for the settings to take effect.

    ") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - template.find(".adding_loading .adding_text").text("Detaching..."); - template.find(".adding_loading").show(); - template.find("#volume_body").hide(); - $.ajax({ - data: createURL("command=detachVolume&id="+volumeId+"&response=json"), - dataType: "json", - success: function(json) { - $("body").everyTime(5000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.detachvolumeresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - template.slideUp("slow", function() { - $(this).remove(); - }); - - } else if (result.jobstatus == 2) { - // Failed - template.find(".adding_loading").hide(); - template.find("#volume_body").show(); - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, 0); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - case "volume_action_create_template" : - if(vmState != "Stopped") { - $("#dialog_alert").html("

    "+vmName+" needs to be stopped before you can create a template of this disk volume.

    ") - $("#dialog_alert").dialog("open"); - return false; - } - $("#dialog_create_template").find("#volume_name").text(volumeName); - $("#dialog_create_template") - .dialog('option', 'buttons', { - "Create": function() { - // validate values - var isValid = true; - isValid &= validateString("Name", $("#create_template_name"), $("#create_template_name_errormsg")); - isValid &= validateString("Display Text", $("#create_template_desc"), $("#create_template_desc_errormsg")); - if (!isValid) return; - - var name = trim($("#create_template_name").val()); - var desc = trim($("#create_template_desc").val()); - var osType = $("#create_template_os_type").val(); - var isPublic = $("#create_template_public").val(); - var password = $("#create_template_password").val(); - - $(this).dialog("close"); - template.find(".adding_loading .adding_text").text("Creating Template..."); - template.find(".adding_loading").show(); - template.find("#volume_body").hide(); - $.ajax({ - data: createURL("command=createTemplate&volumeId="+volumeId+"&name="+todb(name)+"&displayText="+todb(desc)+"&osTypeId="+osType+"&isPublic="+isPublic+"&passwordEnabled="+password+"&response=json"), - dataType: "json", - success: function(json) { - $("body").everyTime( - 30000, // This is templates..it could take hours - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.createtemplateresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - template.find(".adding_loading").hide(); - template.find("#volume_body").show(); - if (result.jobstatus == 1) { - $("#dialog_info").html("

    Private template: " + name + " has been successfully created

    ").dialog("open"); - } else if (result.jobstatus == 2) { - $("#dialog_alert").html("

    " + result.jobresult + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - template.find(".adding_loading").hide(); - template.find("#volume_body").show(); - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - template.find(".adding_loading").hide(); - template.find("#volume_body").show(); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - default : - break; - } - return false; - }); - - $.ajax({ - data: createURL("command=listOsTypes&response=json"), - dataType: "json", - success: function(json) { - types = json.listostypesresponse.ostype; - if (types != null && types.length > 0) { - var select = $("#dialog_create_template #create_template_os_type").empty(); - for (var i = 0; i < types.length; i++) { - select.append(""); - } - } - } - }); - - $("#submenu_vms").click(); -} diff --git a/ui/2.1/scripts/cloud.core.js b/ui/2.1/scripts/cloud.core.js deleted file mode 100644 index 9fd5939de7f..00000000000 --- a/ui/2.1/scripts/cloud.core.js +++ /dev/null @@ -1,864 +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 . - * - */ - -// Version: @VERSION@ -var g_mySession = null; -var g_sessionKey = null; -var g_role = null; // roles - root, domain-admin, ro-admin, user -var g_username = null; -var g_account = null; -var g_domainid = null; -var g_enableLogging = false; -var g_timezoneoffset = null; -var g_timezone = null; - -// capabilities -var g_networkType = "vnet"; // vnet, vlan, direct -function getNetworkType() { return g_networkType; } - -var g_hypervisorType = "kvm"; -function getHypervisorType() { return g_hypervisorType; } - -var g_directAttachNetworkGroupsEnabled = "false"; -function getDirectAttachNetworkGroupsEnabled() { return g_directAttachNetworkGroupsEnabled; } - -var g_directAttachedUntaggedEnabled = "false" -function getDirectAttachUntaggedEnabled() { return g_directAttachedUntaggedEnabled; } - -var g_systemVmUseLocalStorage = "false" -function getSystemVmUseLocalStorage() { return g_systemVmUseLocalStorage; } - -//keyboard keycode -var keycode_Enter = 13; - -//XMLHttpResponse.status -var ERROR_ACCESS_DENIED_DUE_TO_UNAUTHORIZED = 401; -var ERROR_INTERNET_NAME_NOT_RESOLVED = 12007; -var ERROR_INTERNET_CANNOT_CONNECT = 12029; -var ERROR_VMOPS_ACCOUNT_ERROR = 531; - -var g_logger = new Logger(); -$(function() { - if(g_enableLogging) - g_logger.open(); -}); - -// Test Tool. Please comment this out or remove this when going production. -// This is intended to provide a simple test tool to create user accounts and -// domains. -function initializeTestTool() { - $("#launch_test").click(function(event) { - testWindow = window.open('/client/test'); - testWindow.g_sessionKey=g_sessionKey; - return false; - }); -} - -// Role Functions -function isAdmin() { - return (g_role == 1); -} - -function isUser() { - return (g_role == 0); -} - -function isDomainAdmin() { - return (g_role == 2); -} - -function createURL(url) { - return url + "&sessionkey=" + g_sessionKey; -} - -function fromdb(val) { - return sanitizeXSS(unescape(noNull(val))); -} - -function todb(val) { - return encodeURIComponent(escape(val)); -} - -function setDateField(dateValue, dateField, htmlMarkup) { - if (dateValue != null && dateValue.length > 0) { - var disconnected = new Date(); - disconnected.setISO8601(dateValue); - var showDate; - if(g_timezoneoffset != null) - showDate = disconnected.getTimePlusTimezoneOffset(g_timezoneoffset); - else - showDate = disconnected.format("m/d/Y H:i:s"); - if(htmlMarkup == null) - dateField.text(showDate); - else - dateField.html(htmlMarkup + showDate); - } -} - -function initResizable(resizeElement, alsoResizeElement) { - var alsoResizeUi_originalHeight; - $("#"+resizeElement).resizable({ - handles: 'e, w', - autoHide: true, - //containment: ".grid_header" , - alsoResize: "."+alsoResizeElement - }); -} - -var sortBy = ""; -var parseFunction = function() {} -var sortingOrder = "asc"; - -function sortArrayAlphabetically(a, b) { - if(a[sortBy] == null || b[sortBy] == null) - return 0; - - var A = a[sortBy].toLowerCase(); - var B = b[sortBy].toLowerCase(); - - if(sortingOrder == "asc") { - if (A < B) - return -1; - if (A > B) - return 1; - } else { - if (A < B) - return 1; - if (A > B) - return -1; - } - return 0; -} - -function sortArrayAlphabeticallyParse(a, b) { - if(a[sortBy] == null || b[sortBy] == null) - return 0; - - var A = parseFunction(a[sortBy]).toLowerCase(); - var B = parseFunction(b[sortBy]).toLowerCase(); - - if(sortingOrder == "asc") { - if (A < B) - return -1; - if (A > B) - return 1; - } else { - if (A < B) - return 1; - if (A > B) - return -1; - } - return 0; -} - -function sortArrayNumerically(a, b) { - if(a[sortBy] == null || b[sortBy] == null) - return 0; - - var A = parseInt(a[sortBy]); - var B = parseInt(b[sortBy]); - - if(sortingOrder == "asc") { - if (A < B) - return -1; - if (A > B) - return 1; - } else { - if (A < B) - return 1; - if (A > B) - return -1; - } - return 0; -} - -function sortArrayNumericallyParse(a, b) { - if(a[sortBy] == null || b[sortBy] == null) - return 0; - - var A = parseFunction(parseInt(a[sortBy])); - var B = parseFunction(parseInt(b[sortBy])); - - if(sortingOrder == "asc") { - if (A < B) - return -1; - if (A > B) - return 1; - } else { - if (A < B) - return 1; - if (A > B) - return -1; - } - return 0; -} - -function sortArrayByDate(a, b) { - if(a[sortBy] == null || b[sortBy] == null) - return 0; - - var A = convertMilliseconds(a[sortBy]); - var B = convertMilliseconds(b[sortBy]); - - if(sortingOrder == "asc") { - if (A < B) - return -1; - if (A > B) - return 1; - } else { - if (A < B) - return 1; - if (A > B) - return -1; - } - return 0; -} - -function convertMilliseconds(string) { - if (string != null && string.length > 0) { - var date1 = new Date(); - date1.setISO8601(string); - return date1.getTime(); - } else { - return null; - } -} - -function drawGrid(items, submenuContent, template, fnJSONToTemplate) { - var grid = submenuContent.find("#grid_content").empty(); - if (items != null && items.length > 0) { - for (var i = 0; i < items.length; i++) { - var newTemplate = template.clone(true); - fnJSONToTemplate(items[i], newTemplate); - grid.append(newTemplate.show()); - } - setGridRowsTotal(submenuContent.find("#grid_rows_total"), items.length); - if(items.length < pageSize) - submenuContent.find("#nextPage_div").hide(); - else - submenuContent.find("#nextPage_div").show(); - } else { - setGridRowsTotal(submenuContent.find("#grid_rows_total"), null); - submenuContent.find("#nextPage_div").hide(); - } -} - -//listItems() function takes care of loading image, pagination -var items = []; -function listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate ) { - if(currentPage==1) - submenuContent.find("#prevPage_div").hide(); - else - submenuContent.find("#prevPage_div").show(); - - submenuContent.find("#loading_gridtable").show(); - submenuContent.find("#pagination_panel").hide(); - - index = 0; - $.ajax({ - data: createURL(commandString+"&pagesize="+pageSize), - dataType: "json", - async: false, - success: function(json) { - //IF jsonResponse1=="listaccountsresponse", jsonResponse2=="account", THEN json[jsonResponse1][jsonResponse2] == json.listaccountsresponse.account - items = json[jsonResponse1][jsonResponse2]; - drawGrid(items, submenuContent, template, fnJSONToTemplate); - submenuContent.find("#loading_gridtable").hide(); - submenuContent.find("#pagination_panel").show(); - }, - error: function(XMLHttpResponse) { - submenuContent.find("#loading_gridtable").hide(); - handleError(XMLHttpResponse, function() { - if(XMLHttpResponse.status == ERROR_VMOPS_ACCOUNT_ERROR) { - submenuContent.find("#grid_content").empty(); - setGridRowsTotal(submenuContent.find("#grid_rows_total"), null); - submenuContent.find("#nextPage_div").hide(); - } - submenuContent.find("#loading_gridtable").hide(); - submenuContent.find("#pagination_panel").show(); - }); - } - }); -} - - -//event binder -var currentPage = 1; -var pageSize = 50; //consistent with server-side -function submenuContentEventBinder(submenuContent, listFunction) { - submenuContent.find("#nextPage").bind("click", function(event){ - event.preventDefault(); - currentPage++; - listFunction(); - }); - - submenuContent.find("#prevPage").bind("click", function(event){ - event.preventDefault(); - currentPage--; - listFunction(); - }); - - submenuContent.find("#refresh").bind("click", function(event){ - event.preventDefault(); - currentPage=1; - listFunction(); - }); - - submenuContent.find("#search_button").bind("click", function(event) { - event.preventDefault(); - currentPage = 1; - listFunction(); - }); - - submenuContent.find("#adv_search_button").bind("click", function(event) { - event.preventDefault(); - currentPage = 1; - listFunction(); - submenuContent.find("#search_button").data("advanced", false); - submenuContent.find("#advanced_search").hide(); - }); - - submenuContent.find("#search_input").bind("keypress", function(event) { - if(event.keyCode == keycode_Enter) { - event.preventDefault(); - submenuContent.find("#search_button").click(); - } - }); - - submenuContent.find("#advanced_search").bind("keypress", function(event) { - if(event.keyCode == keycode_Enter) { - event.preventDefault(); - submenuContent.find("#adv_search_button").click(); - } - }); - - submenuContent.find("#advanced_search_close").bind("click", function(event) { - event.preventDefault(); - submenuContent.find("#search_button").data("advanced", false); - submenuContent.find("#advanced_search").hide(); - }); - - submenuContent.find("#advanced_search_link").bind("click", function(event) { - event.preventDefault(); - submenuContent.find("#search_button").data("advanced", true); - submenuContent.find("#advanced_search").show(); - }); - - var zoneSelect = submenuContent.find("#advanced_search #adv_search_zone"); - if(zoneSelect.length>0) { //if zone dropdown is found on Advanced Search dialog - $.ajax({ - data: createURL("command=listZones&available=true&response=json"), - dataType: "json", - success: function(json) { - var zones = json.listzonesresponse.zone; - zoneSelect.empty(); - zoneSelect.append(""); - if (zones != null && zones.length > 0) { - for (var i = 0; i < zones.length; i++) { - zoneSelect.append(""); - } - } - } - }); - - var podSelect = submenuContent.find("#advanced_search #adv_search_pod").empty(); - var podLabel = submenuContent.find("#advanced_search #adv_search_pod_label"); - if(podSelect.length>0 && isAdmin()) { //if pod dropdown is found on Advanced Search dialog and if its role is admin - zoneSelect.bind("change", function(event) { - var zoneId = $(this).val(); - if (zoneId == null || zoneId.length == 0) { - podLabel.css("color", "gray"); - podSelect.attr("disabled", "disabled"); - podSelect.empty(); - } else { - podLabel.css("color", "black"); - podSelect.removeAttr("disabled"); - $.ajax({ - data: createURL("command=listPods&zoneId="+zoneId+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - var pods = json.listpodsresponse.pod; - podSelect.empty(); - if (pods != null && pods.length > 0) { - for (var i = 0; i < pods.length; i++) { - podSelect.append(""); - } - } - } - }); - } - return false; - }); - - zoneSelect.change(); - } - } - - var domainSelect = submenuContent.find("#advanced_search #adv_search_domain"); - if(domainSelect.length>0 && isAdmin()) { - var domainSelect = domainSelect.empty(); - $.ajax({ - data: createURL("command=listDomains&available=true&response=json"), - dataType: "json", - success: function(json) { - var domains = json.listdomainsresponse.domain; - if (domains != null && domains.length > 0) { - for (var i = 0; i < domains.length; i++) { - domainSelect.append(""); - } - } - } - }); - } - - var vmSelect = submenuContent.find("#advanced_search").find("#adv_search_vm"); - if(vmSelect.length>0) { - vmSelect.empty(); - vmSelect.append(""); - $.ajax({ - data: createURL("command=listVirtualMachines&response=json"), - dataType: "json", - success: function(json) { - var items = json.listvirtualmachinesresponse.virtualmachine; - if (items != null && items.length > 0) { - for (var i = 0; i < items.length; i++) { - vmSelect.append(""); - } - } - } - }); - } -} - -// Validation functions -function showError(isValid, field, errMsgField, errMsg) { - if(isValid) { - errMsgField.text("").hide(); - field.addClass("text").removeClass("error_text"); - } - else { - errMsgField.text(errMsg).show(); - field.removeClass("text").addClass("error_text"); - } -} - -function showError2(isValid, field, errMsgField, errMsg, appendErrMsg) { - if(isValid) { - errMsgField.text("").hide(); - field.addClass("text2").removeClass("error_text2"); - } - else { - if(appendErrMsg) //append text - errMsgField.text(errMsgField.text()+errMsg).show(); - else //reset text - errMsgField.text(errMsg).show(); - field.removeClass("text2").addClass("error_text2"); - } -} - -function validateDropDownBox(label, field, errMsgField, appendErrMsg) { - var isValid = true; - var errMsg = ""; - var value = field.val(); - if (value == null || value.length == 0) { - errMsg = label + " is a required value. "; - isValid = false; - } - showError2(isValid, field, errMsgField, errMsg, appendErrMsg); - return isValid; -} - -function validateNumber(label, field, errMsgField, min, max, isOptional) { - var isValid = true; - var errMsg = ""; - var value = field.val(); - if (value != null && value.length != 0) { - if(isNaN(value)) { - errMsg = label + " must be a number"; - isValid = false; - } else { - if (min != null && value < min) { - errMsg = label + " must be a value greater than or equal to " + min; - isValid = false; - } - if (max != null && value > max) { - errMsg = label + " must be a value less than or equal to " + max; - isValid = false; - } - } - } else if(isOptional!=true){ //required field - errMsg = label + " is a required value. "; - isValid = false; - } - showError(isValid, field, errMsgField, errMsg); - return isValid; -} - -function validateString(label, field, errMsgField, isOptional) { - var isValid = true; - var errMsg = ""; - var value = field.val(); - if (isOptional!=true && (value == null || value.length == 0)) { //required field - errMsg = label + " is a required value. "; - isValid = false; - } - else if (value!=null && value.length >= 255) { - errMsg = label + " must be less than 255 characters"; - isValid = false; - } - else if(value!=null && value.indexOf('"')!=-1) { - errMsg = "Double quotes are not allowed."; - isValid = false; - } - showError(isValid, field, errMsgField, errMsg); - return isValid; -} - -function validateIp(label, field, errMsgField, isOptional) { - if(validateString(label, field, errMsgField, isOptional) == false) - return; - var isValid = true; - var errMsg = ""; - var value = field.val(); - if(value!=null && value.length>0) { - myregexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; - var isMatch = myregexp.test(value); - if(!isMatch) { - errMsg = label + " should be like 75.52.126.11"; - isValid = false; - } - } - showError(isValid, field, errMsgField, errMsg); - return isValid; -} - -function validateCIDR(label, field, errMsgField, isOptional) { - if(validateString(label, field, errMsgField, isOptional) == false) - return; - var isValid = true; - var errMsg = ""; - var value = field.val(); - if(value!=null && value.length>0) { - myregexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$/; - var isMatch = myregexp.test(value); - if(!isMatch) { - errMsg = label + " should be like 10.1.1.0/24"; - isValid = false; - } - } - showError(isValid, field, errMsgField, errMsg); - return isValid; -} - -function validatePath(label, field, errMsgField, isOptional) { - if(validateString(label, field, errMsgField, isOptional) == false) - return; - var isValid = true; - var errMsg = ""; - var value = field.val(); - if(value!=null && value.length>0) { - myregexp = /^\//; - var isMatch = myregexp.test(value); - if(!isMatch) { - errMsg = label + " should be like /aaa/bbb/ccc"; - isValid = false; - } - } - showError(isValid, field, errMsgField, errMsg); - return isValid; -} - -function cleanErrMsg(field, errMsgField) { - showError(true, field, errMsgField); -} - -// setter -function setGridRowsTotal(field, gridRowsTotal) { - if(gridRowsTotal==null) { - field.text(""); - return; - } - - if(gridRowsTotal==1) - field.text(gridRowsTotal + " item"); - else - field.text(gridRowsTotal + " items"); -} - -function changeGridRowsTotal(field, difference) { - var t = field.text(); - var oldTotal = 0; - if(t.length>0 && t.indexOf(" item")!=-1) { - var s = t.substring(0, t.indexOf(" item")); - if(!isNaN(s)) - oldTotal = parseInt(s); - } - var newTotal = oldTotal + difference; - setGridRowsTotal(field, newTotal); -} - - -// others -function trim(val) { - if(val == null) - return null; - return val.replace(/^\s*/, "").replace(/\s*$/, ""); -} - -function noNull(val) { - if(val == null) - return ""; - else - return val; -} - -// Prevent cross-site-script(XSS) attack. -// used right before adding user input to the DOM tree. e.g. DOM_element.html(fromdb(user_input)); -function sanitizeXSS(val) { - if((val == null) || (typeof val != "string")) - return val; - val = val.replace(//g, ">"); //replace > whose unicode is \u003e - return val; -} - -function getVmName(p_vmName, p_vmDisplayname) { - if(p_vmDisplayname == null) - return fromdb(p_vmName); - var vmName = null; - if (isAdmin()) { - if (p_vmDisplayname != p_vmName) { - vmName = p_vmName + "(" + fromdb(p_vmDisplayname) + ")"; - } else { - vmName = p_vmName; - } - } else { - vmName = fromdb(p_vmDisplayname); - } - return vmName; -} - -// FUNCTION: Handles AJAX error callbacks. You can pass in an optional function to -// handle errors that are not already handled by this method. -function handleError(xmlHttp, handleErrorCallback) { - // User Not authenticated - if (xmlHttp.status == ERROR_ACCESS_DENIED_DUE_TO_UNAUTHORIZED) { - $("#dialog_session_expired").dialog("open"); - } - else if (xmlHttp.status == ERROR_INTERNET_NAME_NOT_RESOLVED) { - $("#dialog_error").text("Internet name can not be resolved").dialog("open"); - } - else if (xmlHttp.status == ERROR_INTERNET_CANNOT_CONNECT) { - $("#dialog_error").text("Management server is not accessible").dialog("open"); - } - else if (xmlHttp.status == ERROR_VMOPS_ACCOUNT_ERROR && handleErrorCallback != undefined) { - handleErrorCallback(); - } - else if (handleErrorCallback != undefined) { - handleErrorCallback(); - } - else { - var start = xmlHttp.responseText.indexOf("h1") + 3; - var end = xmlHttp.responseText.indexOf("Encountered an error:


    "+fromdb(errorMsg)+"

    ").dialog("open"); - } -} - -// FUNCTION: Adds a Dialog to the list of active Dialogs so that -// when you shift from one tab to another, we clean out the dialogs -var activeDialogs = new Array(); -function activateDialog(dialog) { - activeDialogs[activeDialogs.length] = dialog; - - //bind Enter-Key-pressing event handler to the dialog - dialog.keypress(function(event) { - if(event.keyCode == keycode_Enter) { - $('[aria-labelledby$='+dialog.attr("id")+']').find(":button:first").click(); - return false; //event.preventDefault() + event.stopPropagation() - } - }); -} -function removeDialogs() { - for (var i = 0; i < activeDialogs.length; i++) { - activeDialogs[i].remove(); - } - activeDialogs = new Array(); -} - -function convertBytes(bytes) { - if (bytes < 1024 * 1024) { - return (bytes / 1024).toFixed(2) + " KB"; - } else if (bytes < 1024 * 1024 * 1024) { - return (bytes / 1024 / 1024).toFixed(2) + " MB"; - } else if (bytes < 1024 * 1024 * 1024 * 1024) { - return (bytes / 1024 / 1024 / 1024).toFixed(2) + " GB"; - } else { - return (bytes / 1024 / 1024 / 1024 / 1024).toFixed(2) + " TB"; - } -} - -function convertHz(hz) { - if (hz < 1000) { - return hz + " MHZ"; - } else { - return (hz / 1000).toFixed(2) + " GHZ"; - } -} - -function toDayOfMonthDesp(dayOfMonth) { - return "Day "+dayOfMonth +" of Month"; -} - -function toDayOfWeekDesp(dayOfWeek) { - if (dayOfWeek == "1") - return "Sunday"; - else if (dayOfWeek == "2") - return "Monday"; - else if (dayOfWeek == "3") - return "Tuesday"; - else if (dayOfWeek == "4") - return "Wednesday"; - else if (dayOfWeek == "5") - return "Thursday" - else if (dayOfWeek == "6") - return "Friday"; - else if (dayOfWeek == "7") - return "Saturday"; -} - -function toBooleanText(booleanValue) { - if(booleanValue == "true") - return "Yes"; - else if(booleanValue == "false") - return "No"; -} - -function toBooleanValue(booleanText) { - if(booleanText == "Yes") - return "true"; - else if(booleanText == "No") - return "false"; -} - -function toNetworkType(usevirtualnetwork) { - if(usevirtualnetwork == "true") - return "Public"; - else - return "Direct"; -} - -var roleTypeUser = "0"; -var roleTypeAdmin = "1"; -var roleTypeDomainAdmin = "2"; -function toRole(type) { - if (type == roleTypeUser) { - return "User"; - } else if (type == roleTypeAdmin) { - return "Admin"; - } else if (type == roleTypeDomainAdmin) { - return "Domain-Admin"; - } -} - -function toAlertType(alertCode) { - switch (alertCode) { - case "0" : return "Capacity Threshold - Memory"; - case "1" : return "Capacity Threshold - CPU"; - case "2" : return "Capacity Threshold - Storage Used"; - case "3" : return "Capacity Threshold - Storage Allocated"; - case "4" : return "Capacity Threshold - Public IP"; - case "5" : return "Capacity Threshold - Private IP"; - case "6" : return "Monitoring - Host"; - case "7" : return "Monitoring - VM"; - case "8" : return "Monitoring - Domain Router"; - case "9" : return "Monitoring - Console Proxy"; - case "10" : return "Monitoring - Routing Host"; - case "11" : return "Monitoring - Storage"; - case "12" : return "Monitoring - Usage Server"; - case "13" : return "Monitoring - Management Server"; - case "14" : return "Migration - Domain Router"; - case "15" : return "Migration - Console Proxy"; - case "16" : return "Migration - User VM"; - case "17" : return "VLAN"; - case "18" : return "Monitoring - Secondary Storage VM"; - } -} - -// Timezones -var timezones = new Object(); -timezones['Etc/GMT+12']='[UTC-12:00] GMT-12:00'; -timezones['Etc/GMT+11']='[UTC-11:00] GMT-11:00'; -timezones['Pacific/Samoa']='[UTC-11:00] Samoa Standard Time'; -timezones['Pacific/Honolulu']='[UTC-10:00] Hawaii Standard Time'; -timezones['US/Alaska']='[UTC-09:00] Alaska Standard Time'; -timezones['America/Los_Angeles']='[UTC-08:00] Pacific Standard Time'; -timezones['Mexico/BajaNorte']='[UTC-08:00] Baja California'; -timezones['US/Arizona']='[UTC-07:00] Arizona'; -timezones['US/Mountain']='[UTC-07:00] Mountain Standard Time'; -timezones['America/Chihuahua']='[UTC-07:00] Chihuahua, La Paz'; -timezones['America/Chicago']='[UTC-06:00] Central Standard Time'; -timezones['America/Costa_Rica']='[UTC-06:00] Central America'; -timezones['America/Mexico_City']='[UTC-06:00] Mexico City, Monterrey'; -timezones['Canada/Saskatchewan']='[UTC-06:00] Saskatchewan'; -timezones['America/Bogota']='[UTC-05:00] Bogota, Lima'; -timezones['America/New_York']='[UTC-05:00] Eastern Standard Time'; -timezones['America/Caracas']='[UTC-04:00] Venezuela Time'; -timezones['America/Asuncion']='[UTC-04:00] Paraguay Time'; -timezones['America/Cuiaba']='[UTC-04:00] Amazon Time'; -timezones['America/Halifax']='[UTC-04:00] Atlantic Standard Time'; -timezones['America/La_Paz']='[UTC-04:00] Bolivia Time'; -timezones['America/Santiago']='[UTC-04:00] Chile Time'; -timezones['America/St_Johns']='[UTC-03:30] Newfoundland Standard Time'; -timezones['America/Araguaina']='[UTC-03:00] Brasilia Time'; -timezones['America/Argentina/Buenos_Aires']='[UTC-03:00] Argentine Time'; -timezones['America/Cayenne']='[UTC-03:00] French Guiana Time'; -timezones['America/Godthab']='[UTC-03:00] Greenland Time'; -timezones['America/Montevideo']='[UTC-03:00] Uruguay Time]'; -timezones['Etc/GMT+2']='[UTC-02:00] GMT-02:00'; -timezones['Atlantic/Azores']='[UTC-01:00] Azores Time'; -timezones['Atlantic/Cape_Verde']='[UTC-01:00] Cape Verde Time'; -timezones['Africa/Casablanca']='[UTC] Casablanca'; -timezones['Etc/UTC']='[UTC] Coordinated Universal Time'; -timezones['Atlantic/Reykjavik']='[UTC] Reykjavik'; -timezones['Europe/London']='[UTC] Western European Time'; -timezones['CET']='[UTC+01:00] Central European Time'; -timezones['Europe/Bucharest']='[UTC+02:00] Eastern European Time'; -timezones['Africa/Johannesburg']='[UTC+02:00] South Africa Standard Time'; -timezones['Asia/Beirut']='[UTC+02:00] Beirut'; -timezones['Africa/Cairo']='[UTC+02:00] Cairo'; -timezones['Asia/Jerusalem']='[UTC+02:00] Israel Standard Time'; -timezones['Europe/Minsk']='[UTC+02:00] Minsk'; -timezones['Europe/Moscow']='[UTC+03:00] Moscow Standard Time'; -timezones['Africa/Nairobi']='[UTC+03:00] Eastern African Time'; -timezones['Asia/Karachi']='[UTC+05:00] Pakistan Time'; -timezones['Asia/Kolkata']='[UTC+05:30] India Standard Time'; -timezones['Asia/Bangkok']='[UTC+05:30] Indochina Time'; -timezones['Asia/Shanghai']='[UTC+08:00] China Standard Time'; -timezones['Asia/Kuala_Lumpur']='[UTC+08:00] Malaysia Time'; -timezones['Australia/Perth']='[UTC+08:00] Western Standard Time (Australia)'; -timezones['Asia/Taipei']='[UTC+08:00] Taiwan'; -timezones['Asia/Tokyo']='[UTC+09:00] Japan Standard Time'; -timezones['Asia/Seoul']='[UTC+09:00] Korea Standard Time'; -timezones['Australia/Adelaide']='[UTC+09:30] Central Standard Time (South Australia)'; -timezones['Australia/Darwin']='[UTC+09:30] Central Standard Time (Northern Territory)'; -timezones['Australia/Brisbane']='[UTC+10:00] Eastern Standard Time (Queensland)'; -timezones['Australia/Canberra']='[UTC+10:00] Eastern Standard Time (New South Wales)'; -timezones['Pacific/Guam']='[UTC+10:00] Chamorro Standard Time'; -timezones['Pacific/Auckland']='[UTC+12:00] New Zealand Standard Time'; diff --git a/ui/2.1/scripts/cloud.core.network.js b/ui/2.1/scripts/cloud.core.network.js deleted file mode 100644 index c3dc844a2b0..00000000000 --- a/ui/2.1/scripts/cloud.core.network.js +++ /dev/null @@ -1,1762 +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 . - * - */ - -// Version: @VERSION@ - -function showNetworkingTab(p_domainId, p_account) { - //*** Network (begin) **************************************************************************** - activateDialog($("#dialog_acquire_public_ip").dialog({ - width: 325, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - //*** Acquire New IP (begin) *** - $.ajax({ - data: createURL("command=listZones&available=true&response=json"), - dataType: "json", - success: function(json) { - var zones = json.listzonesresponse.zone; - var zoneSelect = $("#dialog_acquire_public_ip #acquire_zone").empty(); - if (zones != null && zones.length > 0) { - for (var i = 0; i < zones.length; i++) { - zoneSelect.append(""); - } - } - } - }); - - $(".add_publicipbutton").bind("click", function(event) { - var submenuContent = $("#submenu_content_network"); - $("#dialog_acquire_public_ip").dialog('option', 'buttons', { - "Acquire": function() { - $("#submenu_content_network #overlay_white").show(); - $("#submenu_content_network #loading_gridtable").find("#message").text("Acquiring New IP...."); - $("#submenu_content_network #loading_gridtable").show(); - - var thisDialog = $(this); - var zoneid = thisDialog.find("#acquire_zone").val(); - thisDialog.dialog("close"); - - $.ajax({ - data: createURL("command=associateIpAddress&zoneid="+zoneid+"&response=json"), - dataType: "json", - success: function(json) { - var items = json.associateipaddressresponse.publicipaddress; - $("#dialog_info").html("

    The IP address "+items[0].ipaddress+" has been assigned to your account

    ").dialog("open"); - - $("#submenu_content_network #overlay_white").hide(); - $("#submenu_content_network #loading_gridtable").hide(); - - if(isAdmin() || isDomainAdmin()) { - ipListContainer.empty(); //clear search result if there is. - var template = ipTemplate.clone(); - ipJsonToPanel(items[0], template); - ipListContainer.append(template.show()); - showPfLbArea(items[0].ipaddress, items[0].domainid, items[0].account); - } else { - RefreshIpDropDown(items[0].ipaddress); - } - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - $("#submenu_content_network #overlay_white").hide(); - $("#submenu_content_network #loading_gridtable").hide(); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }); - $("#dialog_acquire_public_ip").dialog("open"); - return false; - }); - - var ipListContainer = $("#submenu_content_network #ip_list_container"); - var ipTemplate = $("#ip_template"); - - function refreshIpListContainer(strCmd) { - $("#pf_lb_area").hide(); - $("#pf_lb_area_blank").hide(); - $("#show_last_search").hide(); - ipListContainer.empty(); - $.ajax({ - data: createURL(strCmd), - dataType: "json", - success: function(json) { - var items = json.listpublicipaddressesresponse.publicipaddress; - if(items != null && items.length > 0) { - if (items.length > 1) { - for(var i=0; i < items.length; i++) { - var template = ipTemplate.clone(); - ipJsonToPanel(items[i], template); - ipListContainer.append(template.show()); - } - } else { - var template = ipTemplate.clone(); - ipJsonToPanel(items[0], template); - ipListContainer.append(template.show()); - template.find("#ip_manage").hide(); - - if(isIpManageable(items[0].domainid, items[0].account) == true) { - showPfLbArea(items[0].ipaddress, items[0].domainid, items[0].account); - listLoadBalancerRules(); - refreshCreateLoadBalancerRow(); - listPortForwardingRules(); - refreshCreatePortForwardingRow(); - $("#create_port_forwarding_row #add_link").data("ip", items[0].ipaddress); - $("#create_load_balancer_row #add_link").data("ip", items[0].ipaddress); - } else { - $("#pf_lb_area_blank p").text("This IP address is managed by the CloudStack for use with System VMs."); - $("#pf_lb_area_blank").show(); - } - } - } else { - $("#pf_lb_area_blank p").text("Unable to find any IP Addresses. Please try again."); - $("#pf_lb_area_blank").show(); - } - }, - error : function(XMLHttpResponse) { - $("#pf_lb_area_blank p").text("Unable to find any IP Addresses. Please try again."); - $("#pf_lb_area_blank").show(); - } - }); - } - - function refreshIpListContainerByInputBox() { - var ip = $("#submenu_content_network #admin_ip_search").val(); - $("#submenu_content_network #admin_ip_search").autocomplete("close"); - if(ip != null && ip.length >0) { - refreshIpListContainer("command=listPublicIpAddresses&response=json&forvirtualnetwork=true&ipaddress=" + ip); - } - } - - $("#submenu_content_network #admin_ip_search").autocomplete({ - source: function(request, response) { - $.ajax({ - data: createURL("command=listPublicIpAddresses&response=json&forvirtualnetwork=true&ipaddress=" + request.term), - dataType: "json", - success: function(json) { - var items = json.listpublicipaddressesresponse.publicipaddress; - var ipArray = []; - if(items != null && items.length > 0) { - for(var i=0; i < items.length; i++) - ipArray.push(items[i].ipaddress); - } - response(ipArray); - } - }); - }, - minLength: 2 - - }); - - $("#submenu_content_network #admin_ip_search").bind("keypress", function(event) { - if(event.keyCode == keycode_Enter) { - $("#submenu_content_network #ip_searchbutton1").click(); - return false; - } - }); - - $("#submenu_content_network #search_by_account").bind("keypress", function(event) { - if(event.keyCode == keycode_Enter) { - $("#submenu_content_network #ip_searchbutton2").click(); - return false; - } - }); - - //watermark (begin) - $("#submenu_content_network #admin_ip_search").bind('focus', function(event){ - if($(this).val() == "By Public IP Address") { - $(this).val(""); - $(this).removeClass("ipwatermark_text"); - } - }); - $("#submenu_content_network #admin_ip_search").bind('blur', function(event){ - if($(this).val() == "") { - $(this).val("By Public IP Address"); - $(this).addClass("ipwatermark_text"); - } - }); - - $("#submenu_content_network #search_by_account").bind('focus', function(event){ - if($(this).val() == "By Account") { - $(this).val(""); - $(this).removeClass("ipwatermark_text"); - } - }); - $("#submenu_content_network #search_by_account").bind('blur', function(event){ - if($(this).val() == "") { - $(this).val("By Account"); - $(this).addClass("ipwatermark_text"); - } - }); - //watermark (end) - - $("#submenu_content_network #ip_searchbutton1").bind("click", refreshIpListContainerByInputBox); - - function populateDomainDropdown() { - var domainSelect = $("#submenu_content_network #search_by_domain").empty(); - $.ajax({ - data: createURL("command=listDomains&available=true&response=json"), - dataType: "json", - success: function(json) { - var domains = json.listdomainsresponse.domain; - if (domains != null && domains.length > 0) { - for (var i = 0; i < domains.length; i++) { - domainSelect.append(""); - } - } - } - }); - } - - $("#submenu_content_network #ip_searchbutton2").bind("click", function(event){ - var array1 = []; - var account = $("#submenu_content_network #search_by_account").val(); - if(account != null && account.length > 0) - array1.push("&account=" + account); - var domainId = $("#submenu_content_network #search_by_domain").val(); - array1.push("&domainid=" + domainId); - refreshIpListContainer("command=listPublicIpAddresses&response=json&forvirtualnetwork=true" + array1.join("")); - return false; - }); - - function RefreshIpDropDown(ipAddress) { - var array1 = []; - // "p_domainId!=null" and "p_account!=null" means redirected from "IPs" link in Accounts tab to here(new Network tab) - if (p_domainId!=null && p_domainId.length > 0) - array1.push("&domainid="+p_domainId); - if (p_account!=null && p_account.length > 0) - array1.push("&account="+p_account); - - $.ajax({ - data: createURL("command=listPublicIpAddresses&response=json&forvirtualnetwork=true" + array1.join("")), - dataType: "json", - success: function(json) { - var items = json.listpublicipaddressesresponse.publicipaddress; - if(items != null && items.length > 0) { - var ipSelect = $("#submenu_content_network #ip_select").empty(); - for(var i=0; i < items.length; i++) { - ipSelect.append(""); - } - if(ipAddress != null) - ipSelect.val(ipAddress); - ipSelect.change(); - } - } - }); - } - - function ipJsonToPanel(json, panel) { - panel.find("#ip_release").show(); - panel.attr("id", "ip"+json.ipaddress).data("ip", json.ipaddress).data("domainid", json.domainid).data("account", json.account); - panel.find("#ip_manage").data("ip", json.ipaddress).data("domainid", json.domainid).data("account", json.account); - panel.data("ip_domainid", json.domainid).data("ip_account", json.account); - panel.find("#ipaddress").text(json.ipaddress); - panel.find("#zonename").text(json.zonename); - panel.find("#allocated").text(json.allocated); - panel.find("#vlanname").text(json.vlanname); - panel.find("#source_nat").text((json.issourcenat=="true")?"Yes":"No"); - panel.find("#network_type").text((json.forvirtualnetwork=="true")? "Public":"Direct"); - panel.find("#domain").text(json.domain); - panel.find("#account").text(json.account); - - var ipAddress = json.ipaddress; - if (json.issourcenat != "true" && json.forvirtualnetwork =="true") { - panel.find("#ip_release").data("ip", json.ipaddress).show(); - } else { - panel.find("#ip_release").hide(); - } - - if(isIpManageable(json.domainid, json.account) == true && !isUser()) - panel.find("#ip_manage").show(); - } - - var ipPanel = $("#submenu_content_network #network_container"); - $("#submenu_content_network #ip_select").bind("change", function(event) { - var ipAddress = $(this).val(); - if(ipAddress != null && ipAddress.length > 0) { - $.ajax({ - data: createURL("command=listPublicIpAddresses&ipaddress="+ipAddress+"&response=json"), - dataType: "json", - success: function(json) { - var items = json.listpublicipaddressesresponse.publicipaddress; - if(items != null && items.length > 0) { - var item = items[0]; - ipJsonToPanel(item, ipPanel); - showPfLbArea(ipAddress, item.domainid, item.account); - } - } - }); - } - return false; - }); - - function isIpManageable(domainid, account) { - if((g_domainid == domainid && g_account == account) || (isAdmin() && account!="system")) - return true; - else - return false; - } - - function showPfLbArea(ipAddress, domainid, account) { - //show portForwarding/loadBalancer if Ip is manageable - if(isIpManageable(domainid, account) == true) { - ipPanel.data("ip_domainid", domainid).data("ip_account", account).data("ip_address", ipAddress); - listLoadBalancerRules(); - refreshCreateLoadBalancerRow(); - listPortForwardingRules(); - refreshCreatePortForwardingRow(); - $("#create_port_forwarding_row #add_link").data("ip", ipAddress); - $("#create_load_balancer_row #add_link").data("ip", ipAddress); - $("#pf_lb_area").show(); - $("#pf_lb_area_blank").hide(); - } - //hide portForwarding/loadBalancer if IP is not manageable - else { - $("#pf_lb_area").hide(); - $("#pf_lb_area_blank p").text("This IP address is managed by the CloudStack for use with System VMs."); - $("#pf_lb_area_blank").show(); - } - } - - function hidePfLbArea() { - $("#pf_lb_area").hide(); - $("#pf_lb_area_blank").hide(); - } - - //*** Acquire New IP (end) *** - - //*** Port Forwarding (begin) *** - var createPortForwardingRow = $("#submenu_content_network #port_forwarding_panel #create_port_forwarding_row"); - var portForwardingGrid = $("#submenu_content_network #port_forwarding_panel #grid_content"); - - function listPortForwardingRules() { - var ipSelected = $("#submenu_content_network #ip_select").val(); - if (!isUser()) { - ipSelected = ipPanel.data("ip_address"); - } - if(ipSelected == null || ipSelected.length == 0) - return; - $.ajax({ - data: createURL("command=listPortForwardingRules&ipaddress=" + ipSelected + "&response=json"), - dataType: "json", - success: function(json) { - var items = json.listportforwardingrulesresponse.portforwardingrule; - portForwardingGrid.empty(); - if (items != null && items.length > 0) { - for (var i = 0; i < items.length; i++) { - var template = $("#port_forwarding_template").clone(true); - portForwardingJsonToTemplate(items[i], template); - portForwardingGrid.append(template.show()); - } - } - } - }); - } - - function refreshCreatePortForwardingRow() { - createPortForwardingRow.find("#public_port").val(""); - createPortForwardingRow.find("#private_port").val(""); - createPortForwardingRow.find("#protocol").val("TCP"); - - $.ajax({ - data: createURL("command=listVirtualMachines&response=json&domainid="+ipPanel.data("ip_domainid")+"&account="+ipPanel.data("ip_account")), - dataType: "json", - success: function(json) { - var instances = json.listvirtualmachinesresponse.virtualmachine; - var vmSelect = createPortForwardingRow.find("#vm").empty(); - if (instances != null && instances.length > 0) { - for (var i = 0; i < instances.length; i++) { - var html = $(""); - vmSelect.append(html); - } - } - } - }); - } - - var portForwardingIndex = 0; - function portForwardingJsonToTemplate(json, template) { - (portForwardingIndex++ % 2 == 0)? template.find("#row_container").addClass("smallrow_even"): template.find("#row_container").addClass("smallrow_odd"); - - template.attr("id", "portForwarding_" + json.id).data("portForwardingId", json.id); - - template.find("#row_container #public_port").text(json.publicport); - template.find("#row_container_edit #public_port").text(json.publicport); - - template.find("#row_container #private_port").text(json.privateport); - template.find("#row_container_edit #private_port").val(json.privateport); - - template.find("#row_container #protocol").text(json.protocol); - template.find("#row_container_edit #protocol").text(json.protocol); - - var vmName = getVmName(json.vmname, json.vmdisplayname); //json doesn't include vmdisplayname property(incorrect). Waiting for Bug 6241 to be fixed.... - template.find("#row_container #vm_name").text(vmName); - var virtualMachineId = json.virtualmachineid; - - $.ajax({ - data: createURL("command=listVirtualMachines&response=json&domainid="+ipPanel.data("ip_domainid")+"&account="+ipPanel.data("ip_account")), - dataType: "json", - success: function(json) { - var instances = json.listvirtualmachinesresponse.virtualmachine; - var vmSelect = template.find("#row_container_edit #vm").empty(); - if (instances != null && instances.length > 0) { - for (var i = 0; i < instances.length; i++) { - var html = $(""); - vmSelect.append(html); - } - vmSelect.val(virtualMachineId); - } - } - }); - - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - var rowContainerEdit = template.find("#row_container_edit"); - - template.find("#delete_link").unbind("click").bind("click", function(event){ - loadingImg.find(".adding_text").text("Deleting...."); - loadingImg.show(); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=deletePortForwardingRule&response=json&id="+json.id), - dataType: "json", - success: function(json) { - template.slideUp("slow", function(){ - $(this).remove(); - }); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - return false; - }); - - template.find("#edit_link").unbind("click").bind("click", function(event){ - rowContainer.hide(); - rowContainerEdit.show(); - }); - - template.find("#cancel_link").unbind("click").bind("click", function(event){ - rowContainer.show(); - rowContainerEdit.hide(); - }); - - template.find("#save_link").unbind("click").bind("click", function(event){ - // validate values - var isValid = true; - isValid &= validateNumber("Private Port", rowContainerEdit.find("#private_port"), rowContainerEdit.find("#private_port_errormsg"), 1, 65535); - if (!isValid) return; - - var loadingImg = template.find(".adding_loading"); - loadingImg.find(".adding_text").text("Saving...."); - loadingImg.show(); - rowContainerEdit.hide(); - - var ipAddress = $("#submenu_content_network #ip_select").val(); - if (!isUser()) { - ipAddress = ipPanel.data("ip_address"); - } - var publicPort = rowContainerEdit.find("#public_port").text(); - var privatePort = rowContainerEdit.find("#private_port").val(); - var protocol = rowContainerEdit.find("#protocol").text(); - var virtualMachineId = rowContainerEdit.find("#vm").val(); - - var array1 = []; - array1.push("&publicip="+ipAddress); - array1.push("&privateport="+privatePort); - array1.push("&publicport="+publicPort); - array1.push("&protocol="+protocol); - array1.push("&virtualmachineid=" + virtualMachineId); - - $.ajax({ - data: createURL("command=updatePortForwardingRule&response=json"+array1.join("")), - dataType: "json", - success: function(json) { - var jobId = json.updateportforwardingruleresponse.jobid; - var timerKey = "updateportforwardingruleJob"+jobId; - - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+jobId+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { // Succeeded - var items = result.portforwardingrule; - portForwardingJsonToTemplate(items[0],template); - loadingImg.hide(); - rowContainer.show(); - } else if (result.jobstatus == 2) { //Fail - loadingImg.hide(); - rowContainer.show(); - $("#dialog_alert").html("

    " + fromdb(result.jobresult.errortext) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - $("body").stopTime(timerKey); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }); - } - - createPortForwardingRow.find("#add_link").bind("click", function(event){ - // validate values - var isValid = true; - isValid &= validateNumber("Public Port", createPortForwardingRow.find("#public_port"), createPortForwardingRow.find("#public_port_errormsg"), 1, 65535); - isValid &= validateNumber("Private Port", createPortForwardingRow.find("#private_port"), createPortForwardingRow.find("#private_port_errormsg"), 1, 65535); - if (!isValid) return; - - var template = $("#port_forwarding_template").clone(); - portForwardingGrid.append(template.show()); - - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - - var ipAddress = $(this).data("ip"); - var publicPort = createPortForwardingRow.find("#public_port").val(); - var privatePort = createPortForwardingRow.find("#private_port").val(); - var protocol = createPortForwardingRow.find("#protocol").val(); - var virtualMachineId = createPortForwardingRow.find("#vm").val(); - - var array1 = []; - array1.push("&ipaddress="+ipAddress); - array1.push("&privateport="+privatePort); - array1.push("&publicport="+publicPort); - array1.push("&protocol="+protocol); - array1.push("&virtualmachineid=" + virtualMachineId); - $.ajax({ - data: createURL("command=createPortForwardingRule&response=json"+array1.join("")), - dataType: "json", - success: function(json) { - var items = json.createportforwardingruleresponse; - portForwardingJsonToTemplate(items,template); - loadingImg.hide(); - rowContainer.show(); - refreshCreatePortForwardingRow(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function() { - $(this).remove(); - }); - } - }); - - return false; - }); - //*** Port Forwarding (end) *** - - //*** Load Balancer (begin) *** - var createLoadBalancerRow = $("#submenu_content_network #load_balancer_panel #create_load_balancer_row"); - var loadBalancerGrid = $("#submenu_content_network #load_balancer_panel #grid_content"); - - function listLoadBalancerRules() { - var ipSelected = $("#submenu_content_network #ip_select").val(); - if (!isUser()) { - ipSelected = ipPanel.data("ip_address"); - } - if(ipSelected == null || ipSelected.length == 0) - return; - $.ajax({ - data: createURL("command=listLoadBalancerRules&publicip=" + ipSelected + "&response=json"), - dataType: "json", - success: function(json) { - var items = json.listloadbalancerrulesresponse.loadbalancerrule; - loadBalancerGrid.empty(); - if (items != null && items.length > 0) { - for (var i = 0; i < items.length; i++) { - var template = $("#load_balancer_template").clone(true); - loadBalancerJsonToTemplate(items[i], template); - loadBalancerGrid.append(template.show()); - } - } - } - }); - } - - function refreshCreateLoadBalancerRow() { - createLoadBalancerRow.find("#name").val(""); - createLoadBalancerRow.find("#public_port").val(""); - createLoadBalancerRow.find("#private_port").val(""); - createLoadBalancerRow.find("#algorithm_select").val("roundrobin"); - } - - var loadBalancerIndex = 0; - function loadBalancerJsonToTemplate(json, template) { - (loadBalancerIndex++ % 2 == 0)? template.find("#row_container").addClass("smallrow_even"): template.find("#row_container").addClass("smallrow_odd"); - - var loadBalancerId = json.id; - template.attr("id", "loadBalancer_" + loadBalancerId).data("loadBalancerId", loadBalancerId); - - template.find("#row_container #name").text(fromdb(json.name)); - template.find("#row_container_edit #name").val(fromdb(json.name)); - - template.find("#row_container #public_port").text(json.publicport); - template.find("#row_container_edit #public_port").text(json.publicport); - - template.find("#row_container #private_port").text(json.privateport); - template.find("#row_container_edit #private_port").val(json.privateport); - - template.find("#row_container #algorithm").text(json.algorithm); - template.find("#row_container_edit #algorithm").val(json.algorithm); - - template.find("#manage_link").unbind("click").bind("click", function(event){ - var vmSubgrid = template.find("#vm_subgrid"); - if(vmSubgrid.css("display") == "none") { - vmSubgrid.empty(); - $.ajax({ - cache: false, - data: createURL("command=listLoadBalancerRuleInstances&id="+loadBalancerId+"&response=json"), - dataType: "json", - success: function(json) { - var instances = json.listloadbalancerruleinstancesresponse.loadbalancerruleinstance; - if (instances != null && instances.length > 0) { - for (var i = 0; i < instances.length; i++) { - var lbVmTemplate = $("#load_balancer_vm_template").clone(); - var obj = {"loadBalancerId": loadBalancerId, "vmId": instances[i].id, "vmName": getVmName(instances[i].name, instances[i].displayname), "vmPrivateIp": instances[i].privateip}; - lbVmObjToTemplate(obj, lbVmTemplate); - template.find("#vm_subgrid").append(lbVmTemplate.show()); - } - } - } - }); - vmSubgrid.show(); - } - else { - vmSubgrid.hide(); - } - - var addVmToLbRow = template.find("#add_vm_to_lb_row"); - (addVmToLbRow.css("display") == "none")?addVmToLbRow.show():addVmToLbRow.hide(); - - return false; - }); - - var loadingContainer = template.find("#loading_container"); - var rowContainer = template.find("#row_container"); - var rowContainerEdit = template.find("#row_container_edit"); - - template.find("#delete_link").unbind("click").bind("click", function(event){ - loadingContainer.find(".adding_text").text("Deleting...."); - loadingContainer.show(); - rowContainer.hide(); - $.ajax({ - data: createURL("command=deleteLoadBalancerRule&id="+loadBalancerId+"&response=json"), - dataType: "json", - success: function(json) { - var lbJSON = json.deleteloadbalancerruleresponse; - var timerKey = "deleteLoadBalancerRuleJob_"+lbJSON.jobid; - $("body").everyTime( - 5000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+lbJSON.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { // Succeeded - template.slideUp("slow", function() { - $(this).remove(); - }); - } else if (result.jobstatus == 2) { // Failed - loadingContainer.hide(); - rowContainer.show(); - } - } - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - $("body").stopTime(timerKey); - loadingContainer.hide(); - rowContainer.show(); - } - }); - }, - 0 - ); - } - }); - return false; - }); - - template.find("#edit_link").unbind("click").bind("click", function(event){ - rowContainer.hide(); - rowContainerEdit.show(); - }); - - template.find("#cancel_link").unbind("click").bind("click", function(event){ - rowContainer.show(); - rowContainerEdit.hide(); - }); - - template.find("#save_link").unbind("click").bind("click", function(event){ - // validate values - var isValid = true; - isValid &= validateString("Name", rowContainerEdit.find("#name"), rowContainerEdit.find("#name_errormsg")); - isValid &= validateNumber("Private Port", rowContainerEdit.find("#private_port"), rowContainerEdit.find("#private_port_errormsg"), 1, 65535); - if (!isValid) return; - - var loadingContainer = template.find(".adding_loading"); - loadingContainer.find(".adding_text").text("Saving...."); - loadingContainer.show(); - rowContainerEdit.hide(); - - var name = rowContainerEdit.find("#name").val(); - var privatePort = rowContainerEdit.find("#private_port").val(); - var algorithm = rowContainerEdit.find("#algorithm_select").val(); - - var array1 = []; - array1.push("&id=" + loadBalancerId); - array1.push("&name=" + name); - array1.push("&privateport=" + privatePort); - array1.push("&algorithm=" + algorithm); - - $.ajax({ - data: createURL("command=updateLoadBalancerRule&response=json"+array1.join("")), - dataType: "json", - success: function(json) { - var jobId = json.updateloadbalancerruleresponse.jobid; - var timerKey = "updateloadbalancerruleJob"+jobId; - - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+jobId+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { // Succeeded - var items = result.loadbalancer; - loadBalancerJsonToTemplate(items[0],template); - loadingContainer.hide(); - rowContainer.show(); - } else if (result.jobstatus == 2) { //Fail - loadingContainer.hide(); - rowContainer.show(); - $("#dialog_alert").html("

    " + fromdb(result.jobresult.errortext) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - $("body").stopTime(timerKey); - loadingContainer.hide(); - rowContainer.show(); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingContainer.hide(); - rowContainer.show(); - } - }); - }); - - refreshLbVmSelect(template, json.id); - - template.find("#add_vm_to_lb_row #add_link").unbind("click").bind("click", function(event){ - var vmOption = template.find("#add_vm_to_lb_row #vm_select option:selected"); - var vmId = vmOption.val(); - var vmName = vmOption.data("vmName"); - var vmPrivateIp = vmOption.data("vmPrivateIp"); - if(vmId == null || vmId.length == 0) - return; - var loading = template.find("#adding_loading").show(); - var rowContainer = template.find("#adding_row_container").hide(); - - $.ajax({ - data: createURL("command=assignToLoadBalancerRule&id="+loadBalancerId+"&virtualmachineid="+vmId+"&response=json"), - dataType: "json", - success: function(json) { - var lbInstanceJSON = json.assigntoloadbalancerruleresponse; - var timerKey = "lbInstanceNew"+lbInstanceJSON.jobid; - $("body").everyTime( - 5000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+lbInstanceJSON.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { // Succeeded - var lbVmTemplate = $("#load_balancer_vm_template").clone(); - var obj = {"loadBalancerId": loadBalancerId, "vmId": vmId, "vmName": vmName, "vmPrivateIp": vmPrivateIp}; - lbVmObjToTemplate(obj, lbVmTemplate); - template.find("#vm_subgrid").append(lbVmTemplate.show()); - refreshLbVmSelect(template, loadBalancerId); - loading.hide(); - rowContainer.show(); - } else if (result.jobstatus == 2) { // Failed - $("#dialog_error").html("

    Operation error:


    "+ fromdb(result.jobresult.errortext)+"

    ").dialog("open"); - loading.hide(); - rowContainer.show(); - } - } - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - $("body").stopTime(timerKey); - loading.hide(); - rowContainer.show(); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loading.hide(); - rowContainer.show(); - } - }); - return false; - }); - } - - function lbVmObjToTemplate(obj, template) { - template.find("#vm_name").text(obj.vmName); - template.find("#vm_private_ip").text(obj.vmPrivateIp); - template.find("#delete_link").bind("click", function(event){ - var loading = template.find("#deleting_loading").show(); - var rowContainer = template.find("#deleting_row_container").hide(); - - $.ajax({ - data: createURL("command=removeFromLoadBalancerRule&id="+obj.loadBalancerId+"&virtualmachineid="+obj.vmId+"&response=json"), - dataType: "json", - success: function(json) { - var lbJSON = json.removefromloadbalancerruleresponse; - var timerKey = "removeVmFromLb"+obj.vmId; - $("body").everyTime( - 5000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+lbJSON.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { // Succeeded - refreshLbVmSelect($("#loadBalancer_" + obj.loadBalancerId), obj.loadBalancerId); - template.fadeOut("slow", function(event) { - $(this).remove(); - }); - } else if (result.jobstatus == 2) { // Failed - $("#dialog_error").html("

    We were unable to remove the Virtual Instance: "+vmName + " from your load balancer policy. Please try again.").dialog("open"); - loading.hide(); - rowContainer.show(); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - loading.hide(); - rowContainer.show(); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loading.hide(); - rowContainer.show(); - } - }); - return false; - }); - } - - function refreshLbVmSelect(template, loadBalancerId) { - var vmSelect = template.find("#add_vm_to_lb_row #vm_select"); - // Load the select box with the VMs that haven't been applied a LB rule to. - $.ajax({ - cache: false, - data: createURL("command=listLoadBalancerRuleInstances&id="+loadBalancerId+"&applied=false&response=json"), - dataType: "json", - success: function(json) { - var instances = json.listloadbalancerruleinstancesresponse.loadbalancerruleinstance; - vmSelect.empty(); - if (instances != null && instances.length > 0) { - for (var i = 0; i < instances.length; i++) { - var vmName = getVmName(instances[i].name, instances[i].displayname); - html = $("") - html.data("vmPrivateIp", instances[i].ipaddress).data("vmName", vmName); - vmSelect.append(html); - } - } else { - vmSelect.append(""); - } - } - }); - } - - createLoadBalancerRow.find("#add_link").bind("click", function(event){ - // validate values - var isValid = true; - isValid &= validateString("Name", createLoadBalancerRow.find("#name"), createLoadBalancerRow.find("#name_errormsg")); - isValid &= validateNumber("Public Port", createLoadBalancerRow.find("#public_port"), createLoadBalancerRow.find("#public_port_errormsg"), 1, 65535); - isValid &= validateNumber("Private Port", createLoadBalancerRow.find("#private_port"), createLoadBalancerRow.find("#private_port_errormsg"), 1, 65535); - if (!isValid) return; - - var template = $("#load_balancer_template").clone(); - loadBalancerGrid.append(template.show()); - - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - - var ipAddress = $(this).data("ip"); - var name = createLoadBalancerRow.find("#name").val(); - var publicPort = createLoadBalancerRow.find("#public_port").val(); - var privatePort = createLoadBalancerRow.find("#private_port").val(); - var algorithm = createLoadBalancerRow.find("#algorithm_select").val(); - - var array1 = []; - array1.push("&publicip="+ipAddress); - array1.push("&name="+todb(name)); - array1.push("&publicport="+publicPort); - array1.push("&privateport="+privatePort); - array1.push("&algorithm="+algorithm); - - $.ajax({ - data: createURL("command=createLoadBalancerRule&response=json"+array1.join("")), - dataType: "json", - success: function(json) { - var items = json.createloadbalancerruleresponse; - loadBalancerJsonToTemplate(items,template); - loadingImg.hide(); - rowContainer.show(); - refreshCreateLoadBalancerRow(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function() { - $(this).remove(); - }); - } - }); - - return false; - }); - //*** Load Balancer (begin) *** - - - $("#submenu_network").bind("click", function(event) { - currentSubMenu.removeClass().addClass("submenu_links_off"); - currentSubMenu = $(this); - currentSubMenu.removeClass().addClass("submenu_links_on"); - - var submenuContent = $("#submenu_content_network").show(); - $("#submenu_content_security_groups").hide(); - - if(isAdmin() || isDomainAdmin()) { - submenuContent.find(".select_directipbg_admin").show(); - submenuContent.find(".select_directipbg_user").hide(); - populateDomainDropdown(); - } else { - submenuContent.find(".select_directipbg_admin").hide(); - submenuContent.find(".select_directipbg_user").show(); - RefreshIpDropDown(); - } - - return false; - }); - - var ipMid = $("#submenu_content_network #ip_descriptionbox_mid"); - - $("#submenu_content_network #show_last_search").bind("click", function(event){ - $("#submenu_content_network").find("#show_last_search").hide(); - hidePfLbArea(); - var ips = ipListContainer.children(); - for (var i = 0; i < ips.length; i++) { - var ip = $(ips[i]); - ip.show(); - - if(isIpManageable(ip.data("domainid"), ip.data("account")) == true) - ip.find("#ip_manage").show(); - } - return false; - }); - - ipListContainer.bind("click", function(event) { - var target = $(event.target); - var id = target.attr("id"); - var targetIp = target.data("ip"); - var domainid = target.data("domainid"); - var account = target.data("account"); - - switch (id) { - case "ip_manage" : - var ips = ipListContainer.children(); - var ipSelected = null; - var first = false; - ipMid.css("height", ipMid.height()); - for (var i = 0; i < ips.length; i++) { - var ip = $(ips[i]); - if (ip.data("ip") != targetIp) { - ip.fadeOut("fast"); - } else { - if (i == 0) first = true; - var ipPosition = ip.position(); - ipSelected = ip.css("position", "absolute").css("top", ipPosition.top); - } - } - var animationSpeed = 2000; - if (first) { - animationSpeed = 500; - } - ipSelected.animate({top: '24px'}, animationSpeed, function() { - $(this).css("position", "static").css("float", "left"); - ipMid.css("height", "auto"); - target.hide(); - $("#submenu_content_network").find("#show_last_search").show(); - showPfLbArea(targetIp, domainid, account); - }); - break; - case "ip_release" : - $("#dialog_confirmation") - .html("

    Please confirm you want to release the IP address: "+targetIp+" from your account.

    ") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - - $("#submenu_content_network #overlay_white").show(); - $("#submenu_content_network #loading_gridtable").find("#message").text("Releasing IP...."); - $("#submenu_content_network #loading_gridtable").show(); - - $.ajax({ - data: createURL("command=disassociateIpAddress&ipAddress="+targetIp+"&response=json"), - dataType: "json", - success: function(json) { - $("#dialog_info").html("

    Your IP address " + targetIp + " has been released

    ").dialog("open"); - $("#submenu_content_network #overlay_white").hide(); - $("#submenu_content_network #loading_gridtable").hide(); - if (isUser()) { - RefreshIpDropDown(); - } else { - // Execute the codepath for showing last search result. - var ips = ipListContainer.children(); - if(ips != null && ips.length > 0) { - for (var i = 0; i < ips.length; i++) { - var ip = $(ips[i]); - if (ip.data("ip") == targetIp) { - ip.fadeOut("fast", function(){ - $(this).remove(); - - if(ipPanel.data("ip_address") == targetIp) - ipPanel.removeData("ip_address"); - - if(ipListContainer.children().length == 0) { - $("#submenu_content_network #show_last_search").hide(); - } else { - $("#submenu_content_network #show_last_search").show(); - $("#submenu_content_network #show_last_search").click(); - } - }); - } - } - } - } - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - $("#submenu_content_network #overlay_white").hide(); - $("#submenu_content_network #loading_gridtable").hide(); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - default : - break; - } - return false; - }); - - //*** Network (end) ****************************************************************************** - - //*** Network Group (begin) ********************************************************************** - function securityGroupJSONToTemplate(json, template) { - (index++ % 2 == 0)? template.addClass("smallrow_even"): template.addClass("smallrow_odd"); - template.attr("id", "securityGroup_"+json.id).data("securityGroupId", json.id).data("domainId", json.domainid).data("account",json.account).data("securityGroupName", fromdb(json.name)); - template.find("#delete_link, #ingress_rule_link").data("parent_template_id", "securityGroup_"+json.id); - - template.find("#id").text(json.id); - template.find("#name").text(fromdb(json.name)); - template.find("#description").text(fromdb(json.description)); - template.find("#domain").text(fromdb(json.domain)); - template.find("#account").text(fromdb(json.account)); - - // disable delete link from the default group - if(json.name == 'default' && json.description == 'Default Network Group') { - template.find("#delete_link").hide(); - } else { - if(json.ingressrule == null || json.ingressrule.length == 0) - template.find("#delete_link").show(); - else - template.find("#delete_link").hide(); - } - } - - function listSecurityGroups() { - var submenuContent = $("#submenu_content_security_groups"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var virtualMachineId = submenuContent.find("#advanced_search #adv_search_vm").val(); - var domainId = submenuContent.find("#advanced_search #adv_search_domain").val(); - var account = submenuContent.find("#advanced_search #adv_search_account").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&securityGroupname="+todb(name)); - if (virtualMachineId!=null && virtualMachineId.length > 0) - moreCriteria.push("&virtualmachineid="+virtualMachineId); - if (domainId!=null && domainId.length > 0) - moreCriteria.push("&domainid="+domainId); - if (account!=null && account.length > 0) - moreCriteria.push("&account="+account); - commandString = "command=listSecurityGroups&page=" + currentPage + moreCriteria.join("") + "&response=json"; - } else { - var moreCriteria = []; - if(domainId!=null) - moreCriteria.push("&domainid="+domainId); - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listSecurityGroups&page=" + currentPage + moreCriteria.join("") + "&keyword=" + searchInput + "&response=json" - else - commandString = "command=listSecurityGroups&page=" + currentPage + moreCriteria.join("") + "&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listsecuritygroupsresponse", "securitygroup", $("#security_group_template"), securityGroupJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_security_groups"), listSecurityGroups); - - $("#submenu_security_groups").bind("click", function(event) { - currentSubMenu.removeClass().addClass("submenu_links_off"); - currentSubMenu = $(this); - currentSubMenu.removeClass().addClass("submenu_links_on"); - - var submenuContent = $("#submenu_content_security_groups").show(); - $("#submenu_content_network").hide(); - - if (isAdmin()) - submenuContent.find("#adv_search_domain_li, #adv_search_account_li").show(); - - currentPage = 1; - listSecurityGroups(); - return false; - }); - - $("#submenu_content_security_groups").find("#grid_content").bind("click", function(event) { - var link = $(event.target); - var parentTemplateId = link.data("parent_template_id"); - var template = $(("#"+parentTemplateId)); - var securityGroupId = template.data("securityGroupId"); - var domainId = template.data("domainId"); - var account = template.data("account"); - var securityGroupId = template.data("securityGroupId"); - var securityGroupName = template.data("securityGroupName"); - - var submenuContent = $("#submenu_content_security_groups"); - switch(event.target.id) { - case "delete_link": - if(template.find("#ingress_rule_panel").css("display")=="block") //if network group's ingress rule grid is poped down, close it. - template.find("#ingress_rule_grid").click(); - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Deleting...."); - loadingImg.show(); - rowContainer.hide(); - - var array1 = []; - array1.push("&domainid="+domainId); - array1.push("&account="+account); - array1.push("&name="+securityGroupName); - - $.ajax({ - data: createURL("command=deleteSecurityGroup&response=json" + array1.join("")), - dataType: "json", - success: function(json) { - template.slideUp("slow", function() { $(this).remove() }); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), -1); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - break; - - case "ingress_rule_link": - var expanded = link.data("expanded"); - if (expanded == null || expanded == false) { - $.ajax({ - data: createURL("command=listSecurityGroups"+"&domainid="+domainId+"&account="+account+"&securitygroupname="+securityGroupName+"&response=json"), - dataType: "json", - success: function(json) { - var items = json.listsecuritygroupsresponse.securitygroup[0].ingressrule; - var grid = template.find("#ingress_rule_grid"); - if(grid.find("#security_group_ingress_rule_add_row").length==0) { - var row = $("#security_group_ingress_rule_add_row").clone().show(); - row.find("#security_group_ingress_rule_add_link").data("parent_template_id", parentTemplateId); - grid.append(row); - } - if (items != null && items.length > 0) { - grid.empty(); - - //need to append "add ingress rule" row again after emptying grid. - var row = $("#security_group_ingress_rule_add_row").clone().show(); - row.find("#security_group_ingress_rule_add_link").data("parent_template_id", parentTemplateId); - grid.append(row); - - for (var i = 0; i < items.length; i++) { - var newTemplate = $("#security_group_ingress_rule_template").clone(true); - ingressRuleJSONToTemplate(items[i], newTemplate).data("parentSecurityGroupId", securityGroupId).data("parentSecurityGroupDomainId", domainId).data("parentSecurityGroupAccount", account).data("parentSecurityGroupName",securityGroupName); - grid.append(newTemplate.show()); - } - } - link.removeClass().addClass("vm_botactionslinks_up"); - template.find("#ingress_rule_panel").slideDown("slow"); - link.data("expanded", true); - } - }); - } else { - link.removeClass().addClass("vm_botactionslinks_down"); - template.find("#ingress_rule_panel").slideUp("slow"); - link.data("expanded", false); - } - break; - - case "security_group_ingress_rule_add_link": - dialogAddIngressRule.find("#start_port").val(""); - cleanErrMsg(dialogAddIngressRule.find("#start_port"), dialogAddIngressRule.find("#start_port_errormsg")); - - dialogAddIngressRule.find("#end_port").val(""); - cleanErrMsg(dialogAddIngressRule.find("#end_port"), dialogAddIngressRule.find("#end_port_errormsg")); - - dialogAddIngressRule.find("#protocol").val("TCP"); - - dialogAddIngressRule.find("#cidr_container").empty(); - dialogAddIngressRule.find("#add_more_cidr").click(); - - dialogAddIngressRule.find("#account_securitygroup_container").empty(); - dialogAddIngressRule.find("#add_more_account_securitygroup").click(); - - $("#dialog_add_ingress_rule") - .dialog('option', 'buttons', { - "Add": function() { - var thisDialog = $(this); - - var moreCriteria = []; - moreCriteria.push("&domainid="+domainId); - moreCriteria.push("&account="+account); - moreCriteria.push("&securitygroupname="+securityGroupName); - - var protocol = thisDialog.find("#protocol").val(); - if (protocol!=null && protocol.length > 0) - moreCriteria.push("&protocol="+encodeURIComponent(protocol)); - - // validate values (begin) - var isValid = true; - if(protocol == "ICMP") { - isValid &= validateNumber("Type", thisDialog.find("#icmp_type"), thisDialog.find("#icmp_type_errormsg"), -1, 40, false); //required - isValid &= validateNumber("Code", thisDialog.find("#icmp_code"), thisDialog.find("#icmp_code_errormsg"), -1 , 15, false); //required - } - else { //TCP, UDP - isValid &= validateNumber("Start Port", thisDialog.find("#start_port"), thisDialog.find("#start_port_errormsg"), 1, 65535, false); //required - isValid &= validateNumber("End Port", thisDialog.find("#end_port"), thisDialog.find("#end_port_errormsg"), 1, 65535, false); //required - } - - if(thisDialog.find("input[name='ingress_rule_type']:checked").val() == "cidr") { - isValid &= validateCIDR("CIDR", thisDialog.find(".cidr_template").eq(0).find("#cidr"), thisDialog.find(".cidr_template").eq(0).find("#cidr_errormsg"), false); //required - for(var i=1; i 0) - moreCriteria.push("&icmptype="+encodeURIComponent(icmpType)); - var icmpCode = thisDialog.find("#icmp_code").val(); - if (icmpCode!=null && icmpCode.length > 0) - moreCriteria.push("&icmpcode="+encodeURIComponent(icmpCode)); - } - else { //TCP, UDP - var startPort = thisDialog.find("#start_port").val(); - if (startPort!=null && startPort.length > 0) - moreCriteria.push("&startport="+encodeURIComponent(startPort)); - var endPort = thisDialog.find("#end_port").val(); - if (endPort!=null && endPort.length > 0) - moreCriteria.push("&endport="+encodeURIComponent(endPort)); - } - - if(dialogAddIngressRule.find("input[name='ingress_rule_type']:checked").val() == "cidr") { - var array1 = []; - var cidrElementArray = dialogAddIngressRule.find(".cidr_template").find("#cidr"); - for(var i=0; i 0) - array1.push(cidrElementArray[i].value); - } - if(array1.length > 0) - moreCriteria.push("&cidrlist="+encodeURIComponent(array1.join(","))); - } - else if(dialogAddIngressRule.find("input[name='ingress_rule_type']:checked").val() == "account_securitygroup") { - var accountElementArray = dialogAddIngressRule.find(".account_securitygroup_template").find("#account"); - var securitygroupElementArray = dialogAddIngressRule.find(".account_securitygroup_template").find("#securitygroup"); - for(var i=0; i 0 && accountElementArray[i].value.length > 0) - moreCriteria.push("&usersecuritygrouplist["+i+"].account="+accountElementArray[i].value+"&usersecuritygrouplist["+i+"].group="+securitygroupElementArray[i].value); - } - } - - thisDialog.dialog("close"); - - var ingressRuleTemplate = $("#security_group_ingress_rule_template").clone(true); - var loadingImg = ingressRuleTemplate.find(".adding_loading"); - var rowContainer = ingressRuleTemplate.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - template.find("#ingress_rule_grid").append(ingressRuleTemplate.fadeIn("slow")); - template.find("#ingress_rule_grid").find("#no_ingress_rule").hide(); - - $.ajax({ - data: createURL("command=authorizeSecurityGroupIngress"+moreCriteria.join("")+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.authorizesecuritygroupingress.jobid; - var timerKey = "ingressRuleJob_"+jobId; - ingressRuleTemplate.attr("id","ingressRule_"+jobId); //temporary id until API call returns real id - $("body").everyTime( - 5000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+jobId+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { // Succeeded - var items = result.jobresult.securitygroup.ingressrule; - ingressRuleJSONToTemplate(items[0], ingressRuleTemplate).data("parentSecurityGroupId", securityGroupId).data("parentSecurityGroupDomainId", domainId).data("parentSecurityGroupAccount", account).data("parentSecurityGroupName",securityGroupName); - if(items.length > 1) { - for(var i=1; i 0) - cidrOrGroup = json.cidr; - else if (json.account != null && json.account.length > 0 && json.securitygroupname != null && json.securitygroupname.length > 0) - cidrOrGroup = json.account + "/" + json.securitygroupname; - template.find("#cidr").text(cidrOrGroup); - template.data("cidr", json.cidr); - template.data("account", json.account); - template.data("securityGroupName", json.securitygroupname); - - return template; - } - - $("#security_group_ingress_rule_template").bind("click", function(event) { - var template = $(this); - - var parentSecurityGroupId = template.data("parentSecurityGroupId"); - var parentNeteworkGroupTemplate = $("#securityGroup_" + parentSecurityGroupId); - - var moreCriteria = []; - - var parentSecurityGroupDomainId = template.data("parentSecurityGroupDomainId"); - moreCriteria.push("&domainid="+encodeURIComponent(parentSecurityGroupDomainId)); - - var parentSecurityGroupAccount = template.data("parentSecurityGroupAccount"); - moreCriteria.push("&account="+encodeURIComponent(parentSecurityGroupAccount)); - - var parentSecurityGroupName = template.data("parentSecurityGroupName"); - moreCriteria.push("&securitygroupname="+encodeURIComponent(parentSecurityGroupName)); - - var protocol = template.data("protocol"); - moreCriteria.push("&protocol="+encodeURIComponent(protocol)); - - if(protocol == "icmp") { - var icmpType = template.data("icmpType"); - if(icmpType != null && icmpType.length > 0) - moreCriteria.push("&icmptype="+encodeURIComponent(icmpType)); - - var icmpCode = template.data("icmpCode"); - if(icmpCode != null && icmpCode.length > 0) - moreCriteria.push("&icmpcode="+encodeURIComponent(icmpCode)); - } - else { //TCP, UDP - var startPort = template.data("startPort"); - if(startPort != null && startPort.length > 0) - moreCriteria.push("&startport="+encodeURIComponent(startPort)); - - var endPort = template.data("endPort"); - if(endPort != null && endPort.length > 0) - moreCriteria.push("&endport="+encodeURIComponent(endPort)); - } - - var cidr = template.data("cidr") - if(cidr != null && cidr.length > 0) - moreCriteria.push("&cidrlist="+encodeURIComponent(cidr)); - - var account = template.data("account"); - var securityGroupName = template.data("securityGroupName"); - if((account != null && account.length > 0) && (securityGroupName != null && securityGroupName.length > 0)) - moreCriteria.push("&usersecuritygrouplist[0].account="+account + "&usersecuritygrouplist[0].group="+securityGroupName); - - var link = $(event.target); - switch(event.target.id) { - case "ingress_rule_delete_link": - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Deleting...."); - loadingImg.show(); - rowContainer.hide(); - $.ajax({ - data: createURL("command=revokeSecurityGroupIngress"+moreCriteria.join("")+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.revokesecuritygroupingress.jobid; - var timerKey = "revokeSecurityGroupIngressJob"+jobId; - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+jobId+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { //success - template.slideUp("slow", function() { - $(this).remove(); - //After deleting ingress rule successfully, check if this network group has any ingress rule(s) left. Show delete link of network group if no ingress rule(s) are left. - $.ajax({ - data: createURL("command=listSecurityGroups&response=json&domainid="+parentSecurityGroupDomainId+"&account="+parentSecurityGroupAccount+"&securitygroupname="+parentSecurityGroupName), - dataType: "json", - success: function(json){ - securityGroupJSONToTemplate(json.listsecuritygroupsresponse.securitygroup[0], parentNeteworkGroupTemplate); - } - }); - }); - } else if (result.jobstatus == 2) { - $("#dialog_alert").html("

    " + fromdb(result.jobresult.errortext) + "

    ").dialog("open"); - loadingImg.hide(); - rowContainer.show(); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - break; - } - return false; - }); - - //*** event handler of dialog_add_ingress_rule (begin) *** - var dialogAddIngressRule = $("#dialog_add_ingress_rule"); - - dialogAddIngressRule.find("#add_more_cidr").bind("click", function(event){ - dialogAddIngressRule.find("#cidr_container").append($("#cidr_template").clone().show()); - return false; - }); - dialogAddIngressRule.find("#add_more_cidr").click(); - - - dialogAddIngressRule.find("#add_more_account_securitygroup").bind("click", function(event){ - dialogAddIngressRule.find("#account_securitygroup_container").append($("#account_securitygroup_template").clone().show()); - return false; - }); - dialogAddIngressRule.find("#add_more_account_securitygroup").click(); - - - dialogAddIngressRule.find("input[name='ingress_rule_type']").change(function(){ - if(dialogAddIngressRule.find("input[name='ingress_rule_type']:checked").val() == "cidr") { - //enable CIDR - dialogAddIngressRule.find(".cidr_template, #add_more_cidr").removeAttr("disabled"); - - //disable Account/Network Group, clear up error fields - dialogAddIngressRule.find(".account_securitygroup_template, #add_more_account_securitygroup").attr("disabled", "disabled"); - cleanErrMsg(dialogAddIngressRule.find(".account_securitygroup_template").find("#account"), dialogAddIngressRule.find(".account_securitygroup_template").find("#account_securitygroup_template_errormsg")); - cleanErrMsg(dialogAddIngressRule.find(".account_securitygroup_template").find("#securitygroup"), dialogAddIngressRule.find(".account_securitygroup_template").find("#account_securitygroup_template_errormsg")); - } - else if(dialogAddIngressRule.find("input[name='ingress_rule_type']:checked").val() == "account_securitygroup") { - //enable Account/Network Group - dialogAddIngressRule.find(".account_securitygroup_template, #add_more_account_securitygroup").removeAttr("disabled"); - - //disable CIDR, clear up error fields - dialogAddIngressRule.find(".cidr_template, #add_more_cidr").attr("disabled", "disabled"); - cleanErrMsg(dialogAddIngressRule.find(".cidr_template").find("#cidr"), dialogAddIngressRule.find(".cidr_template").find("#cidr_errormsg")); - } - }); - dialogAddIngressRule.find("input[name='ingress_rule_type']").change(); - - - dialogAddIngressRule.find("#protocol").bind("change", function(event){ - var thisDropDown = $(this); - if(thisDropDown.val() == "ICMP") { - dialogAddIngressRule.find("#icmp_type_container, #icmp_code_container").show(); - dialogAddIngressRule.find("#icmp_type, #icmp_code").val("-1"); - - dialogAddIngressRule.find("#start_port_container, #end_port_container").hide(); - dialogAddIngressRule.find("#start_port, #end_port").val(""); - cleanErrMsg(dialogAddIngressRule.find("#start_port"), dialogAddIngressRule.find("#start_port_errormsg")); - cleanErrMsg(dialogAddIngressRule.find("#end_port"), dialogAddIngressRule.find("#end_port_errormsg")); - } - else { //TCP, UDP - dialogAddIngressRule.find("#start_port_container, #end_port_container").show(); - - dialogAddIngressRule.find("#icmp_type_container, #icmp_code_container").hide(); - dialogAddIngressRule.find("#icmp_type, #icmp_code").val(""); - cleanErrMsg(dialogAddIngressRule.find("#icmp_type"),dialogAddIngressRule.find("#icmp_type_errormsg")); - cleanErrMsg(dialogAddIngressRule.find("#icmp_code"),dialogAddIngressRule.find("#icmp_code_errormsg")); - } - return false; - }); - dialogAddIngressRule.find("#protocol").change(); - //*** event handler of dialog_add_ingress_rule (end) *** - - $("#security_groups_action_new").bind("click", function(event){ - $("#dialog_add_security_groups") - .dialog('option', 'buttons', { - "Create": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg"), false); //required - isValid &= validateString("Description", thisDialog.find("#description"), thisDialog.find("#description_errormsg"), true); //optional - if (!isValid) return; - - var submenuContent = $("#submenu_content_security_groups"); - - var template = $("#security_group_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - submenuContent.find("#grid_content").prepend(template.fadeIn("slow")); - - var name = trim(thisDialog.find("#name").val()); - var desc = trim(thisDialog.find("#description").val()); - - thisDialog.dialog("close"); - - $.ajax({ - data: createURL("command=createSecurityGroup&name="+todb(name)+"&description="+todb(desc)+"&response=json"), - dataType: "json", - success: function(json) { - var item = json.createsecuritygroupresponse.securitygroup; - securityGroupJSONToTemplate(item, template); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1); - loadingImg.hide(); - rowContainer.show(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function(){ $(this).remove(); } ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - return false; - }); - - //*** Network Group (end) ************************************************************************ - - - //initialize page - /* - if(getDirectAttachNetworkGroupsEnabled() != "true") - $(".submenu_links, #submenu_content_security_groups").hide(); - */ - - var currentSubMenu = $("#submenu_network"); - currentSubMenu.click(); -} diff --git a/ui/2.1/scripts/cloud.core.storage.js b/ui/2.1/scripts/cloud.core.storage.js deleted file mode 100644 index df126acaab4..00000000000 --- a/ui/2.1/scripts/cloud.core.storage.js +++ /dev/null @@ -1,2214 +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 . - * - */ - -// Version: @VERSION@ - -function showStorageTab(domainId, targetTab) { - var currentSubMenu; - - var populateZoneField = function(isAdmin) { - $.ajax({ - data: createURL("command=listZones&available=true&response=json"), - dataType: "json", - success: function(json) { - var zones = json.listzonesresponse.zone; - if(isAdmin) { - var poolZoneSelect = $("#dialog_add_pool").find("#pool_zone").empty(); - var hostZoneSelect = $("#dialog_add_host").find("#storage_zone").empty(); - } - var volumeZoneSelect = $("#dialog_add_volume").find("#volume_zone").empty(); - if (zones != null && zones.length > 0) { - for (var i = 0; i < zones.length; i++) { - if(isAdmin) { - poolZoneSelect.append(""); - hostZoneSelect.append(""); - } - volumeZoneSelect.append(""); - } - } - if (isAdmin) { - poolZoneSelect.change(); - } - } - }); - } - - var populateDiskOfferingField = function() { - $.ajax({ - data: createURL("command=listDiskOfferings&response=json"), - dataType: "json", - success: function(json) { - var offerings = json.listdiskofferingsresponse.diskoffering; - var volumeDiskOfferingSelect = $("#dialog_add_volume").find("#volume_diskoffering").empty(); - if (offerings != null && offerings.length > 0) { - if (offerings != null && offerings.length > 0) { - for (var i = 0; i < offerings.length; i++) - volumeDiskOfferingSelect.append(""); - } - } - } - }); - } - - var populateVirtualMachineField = function(domainId, account, zoneId) { - $.ajax({ - cache: false, - data: createURL("command=listVirtualMachines&state=Running&zoneid="+zoneId+"&domainid="+domainId+"&account="+account+"&response=json"), - dataType: "json", - success: function(json) { - var instances = json.listvirtualmachinesresponse.virtualmachine; - var volumeVmSelect = $("#dialog_attach_volume").find("#volume_vm").empty(); - if (instances != null && instances.length > 0) { - for (var i = 0; i < instances.length; i++) { - volumeVmSelect.append(""); - } - } - $.ajax({ - cache: false, - data: createURL("command=listVirtualMachines&state=Stopped&zoneid="+zoneId+"&domainid="+domainId+"&account="+account+"&response=json"), - dataType: "json", - success: function(json) { - var instances = json.listvirtualmachinesresponse.virtualmachine; - if (instances != null && instances.length > 0) { - for (var i = 0; i < instances.length; i++) { - volumeVmSelect.append(""); - } - } - } - }); - } - }); - } - - var populateOSTypeField = function() { - $.ajax({ - data: createURL("command=listOsTypes&response=json"), - dataType: "json", - success: function(json) { - types = json.listostypesresponse.ostype; - if (types != null && types.length > 0) { - var osTypeField = $("#dialog_create_template_from_snapshot").find("#os_type").empty(); - for (var i = 0; i < types.length; i++) { - var html = ""; - osTypeField.append(html); - } - } - } - }); - } - - var initializeVolumeTab = function(isAdmin) { - // Add Volume Dialog (begin) - activateDialog($("#dialog_add_volume").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - $("#storage_action_new_volume").bind("click", function(event) { - $("#dialog_add_volume") - .dialog('option', 'buttons', { - "Add": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#add_volume_name"), thisDialog.find("#add_volume_name_errormsg")); - if (!isValid) return; - - var name = trim(thisDialog.find("#add_volume_name").val()); - var zoneId = thisDialog.find("#volume_zone").val(); - var diskofferingId = thisDialog.find("#volume_diskoffering").val(); - thisDialog.dialog("close"); - - var submenuContent = $("#submenu_content_volume"); - var template = $("#volume_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - submenuContent.find("#grid_content").prepend(template); - template.fadeIn("slow"); - - $.ajax({ - data: createURL("command=createVolume&zoneId="+zoneId+"&name="+todb(name)+"&diskOfferingId="+diskofferingId+"&accountId="+"1"+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.createvolumeresponse.jobid; - template.attr("id","volumeNew"+jobId).data("jobId", jobId); - var timerKey = "volume"+jobId; - - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.createvolumeresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - volumeJSONToTemplate(result.jobresult.createvolumeresponse, template); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1); - - loadingImg.hide(); - var createdSuccessfullyImg = template.find("#created_successfully").show(); - createdSuccessfullyImg.find("#close_button").bind("click", function() { - createdSuccessfullyImg.hide(); - rowContainer.show(); - }); - - } else if (result.jobstatus == 2) { - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - template.slideUp("slow", function() { - $(this).remove(); - }); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - template.slideUp("slow", function() { - $(this).remove(); - }); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function() { - $(this).remove(); - }); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - return false; - }); - // Add Volume Dialog (end) - - activateDialog($("#dialog_add_volume_from_snapshot").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_create_template_from_snapshot").dialog({ - width: 400, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - function hideShowDetachAttachLinks(vmname, template) { - var detachLink = template.find("#volume_action_detach_span"); - var attachLink = template.find("#volume_action_attach_span"); - - if (vmname=="none"||vmname==""||vmname==null) { //if NOT attached to a virtual machine, hide "detach" link, show "attach" link. - detachLink.hide(); - attachLink.show(); - } - else { //if attached to a virtual machine, hide "attach" link, show "ditach" link. - attachLink.hide(); - detachLink.show(); - } - } - - // FUNCTION: volume JSON to Template - function volumeJSONToTemplate(json, template) { - template.attr("id", "volume"+json.id); - if (index++ % 2 == 0) { - template.addClass("smallrow_even"); - } else { - template.addClass("smallrow_odd"); - } - template.data("volumeId", json.id); - template.data("vmname", getVmName(json.vmname, json.vmdisplayname)); - template.data("vmstate", json.vmstate); - template.data("domainId", json.domainid); - template.data("account", fromdb(json.account)); - template.data("volumeName", fromdb(json.name)); - template.data("vmid", json.virtualmachineid); - template.data("zoneId", json.zoneid); - - template.find("#volume_id").text(fromdb(json.id)); - template.find("#volume_name").text(fromdb(json.name)); - template.find("#volume_zone").text(fromdb(json.zonename)); - template.find("#volume_account").text(fromdb(json.account)); - template.find("#volume_deviceid").text(fromdb(json.deviceid)); - template.find("#volume_domain").text(fromdb(json.domain)); - template.find("#volume_hostname").text(fromdb(json.storage)); - template.find("#volume_path").text(fromdb(json.path)); - template.find("#volume_state").text(fromdb(json.state)); - template.find("#volume_size").text((json.size == "0") ? "" : convertBytes(json.size)); - template.find("#volume_type").text(fromdb(json.type) + " (" + fromdb(json.storagetype) + " storage)"); - if (json.virtualmachineid == null) { - template.find("#volume_vmname").text("detached"); - } else { - template.find("#volume_vmname").text(getVmName(json.vmname, json.vmdisplayname) + " (" + json.vmstate + ")"); - } - - setDateField(json.created, template.find("#volume_created")); - - if(json.type=="ROOT") { - if (json.vmstate == "Stopped") - template.find("#volume_action_create_template_span").show(); - } - else { //json.type=="DATADISK": "detach disk" is allowed, "create template" is disallowed. - if (json.virtualmachineid != undefined) { - if (json.storagetype == "shared" && (json.vmstate == "Running" || json.vmstate == "Stopped")) { - template.find("#volume_action_detach_span").show(); - } - } else { - // Disk not attached - if (json.storagetype == "shared") { - template.find("#volume_action_attach_span, #volume_action_delete_span").show(); - } - } - } - - if(json.state == "Creating" || json.state == "Corrupted" || json.name == "attaching") - template.find("#grid_links_container").hide(); - else - template.find("#grid_links_container").show(); - } - - function listVolumes() { - var submenuContent = $("#submenu_content_volume"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var zone = submenuContent.find("#advanced_search #adv_search_zone").val(); - var pod = submenuContent.find("#advanced_search #adv_search_pod").val(); - var domainId = submenuContent.find("#advanced_search #adv_search_domain").val(); - var account = submenuContent.find("#advanced_search #adv_search_account").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(name)); - if (zone!=null && zone.length > 0) - moreCriteria.push("&zoneId="+zone); - if (pod!=null && pod.length > 0) - moreCriteria.push("&podId="+pod); - if (domainId!=null && domainId.length > 0) - moreCriteria.push("&domainid="+domainId); - if (account!=null && account.length > 0) - moreCriteria.push("&account="+account); - commandString = "command=listVolumes&page=" + currentPage + moreCriteria.join("") + "&response=json"; - } else { - var moreCriteria = []; - if(domainId!=null) - moreCriteria.push("&domainid="+domainId); - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listVolumes&page=" + currentPage + moreCriteria.join("") + "&keyword=" + searchInput + "&response=json" - else - commandString = "command=listVolumes&page=" + currentPage + moreCriteria.join("") + "&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listvolumesresponse", "volume", $("#volume_template"), volumeJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_volume"), listVolumes); - - - $("#submenu_volume").bind("click", function(event) { - event.preventDefault(); - - currentSubMenu.addClass("submenu_links_off").removeClass("submenu_links_on"); - $(this).addClass("submenu_links_on").removeClass("submenu_links_off"); - currentSubMenu = $(this); - - $("#submenu_content_volume").show(); - $("#submenu_content_pool").hide(); - $("#submenu_content_storage").hide(); - $("#submenu_content_snapshot").hide(); - - var submenuContent = $("#submenu_content_volume"); - if (isAdmin) - submenuContent.find("#adv_search_pod_li, #adv_search_domain_li, #adv_search_account_li").show(); - - currentPage = 1; - listVolumes(); - }); - - function listSnapshots() { - var submenuContent = $("#submenu_content_snapshot"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var domainId = submenuContent.find("#advanced_search #adv_search_domain").val(); - var account = submenuContent.find("#advanced_search #adv_search_account").val(); - var moreCriteria = []; - if (domainId!=null && domainId.length > 0) - moreCriteria.push("&domainid="+domainId); - if (account!=null && account.length > 0) - moreCriteria.push("&account="+account); - commandString = "command=listSnapshots&page="+currentPage+moreCriteria.join("")+"&response=json"; - } else { - var moreCriteria = []; - if(domainId!=null) - moreCriteria.push("&domainid="+domainId); - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listSnapshots&page="+currentPage+moreCriteria.join("")+"&keyword="+searchInput+"&response=json" - else - commandString = "command=listSnapshots&page="+currentPage+moreCriteria.join("")+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listsnapshotsresponse", "snapshot", $("#snapshot_template"), snapshotJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_snapshot"), listSnapshots); - - $("#snapshot_template").bind("click", function(event) { - event.preventDefault(); - event.stopPropagation(); - - var template = $(this); - var snapshotId = template.data("snapshotId"); - - var target = event.target.id; - switch(target) { - case "snapshot_action_create_volume": - $("#dialog_add_volume_from_snapshot") - .dialog("option", "buttons", { - "Add": function() { - var thisDialog = $(this); - thisDialog.dialog("close"); - - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg")); - if (!isValid) return; - - var name = thisDialog.find("#name").val(); - - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Creating volume...."); - loadingImg.show(); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=createVolume&snapshotid="+snapshotId+"&name="+name+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.createvolumeresponse.jobid; - var timerKey = "createVolumeJob"+jobId; - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.createvolumeresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - loadingImg.hide(); - rowContainer.show(); - $("#dialog_info").html("

    Volume was created successfully

    ").dialog("open"); - } else if (result.jobstatus == 2) { - loadingImg.hide(); - rowContainer.show(); - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - - case "snapshot_action_delete": - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Deleting snapshot...."); - loadingImg.show(); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=deleteSnapshot&id="+snapshotId+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.deletesnapshotresponse.jobid; - var timerKey = "deleteSnapshotJob"+jobId; - - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.deletesnapshotresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - loadingImg.hide(); - rowContainer.show(); - template.slideUp("slow", function() { - $(this).remove(); - }); - } else if (result.jobstatus == 2) { - loadingImg.hide(); - rowContainer.show(); - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - break; - - case "snapshot_action_create_template": - $("#dialog_create_template_from_snapshot") - .dialog("option", "buttons", { - "Add": function() { - var thisDialog = $(this); - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg"), false); - isValid &= validateString("Display Text", thisDialog.find("#display_text"), thisDialog.find("#display_text_errormsg"), false); - if (!isValid) return; - - var name = thisDialog.find("#name").val(); - var displayText = thisDialog.find("#display_text").val(); - var osTypeId = thisDialog.find("#os_type").val(); - var password = thisDialog.find("#password").val(); - thisDialog.dialog("close"); - - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Creating template...."); - loadingImg.fadeIn("slow"); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=createTemplate&snapshotid="+snapshotId+"&name="+name+"&displaytext="+displayText+"&ostypeid="+osTypeId+"&passwordEnabled="+password+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.createtemplateresponse.jobid; - var timerKey = "createTemplateJob"+jobId; - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.createtemplateresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - loadingImg.hide(); - rowContainer.show(); - $("#dialog_info").html("

    Template was created successfully

    ").dialog("open"); - } else if (result.jobstatus == 2) { - loadingImg.hide(); - rowContainer.show(); - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - } - }); - - $("#volume_action_snapshot_grid, #volume_action_take_snapshot_container, #volume_action_recurring_snapshot_container").show(); - $("#submenu_snapshot").show().bind("click", function(event) { - event.preventDefault(); - - currentSubMenu.addClass("submenu_links_off").removeClass("submenu_links_on"); - $(this).addClass("submenu_links_on").removeClass("submenu_links_off"); - currentSubMenu = $(this); - - $("#submenu_content_snapshot").show(); - $("#submenu_content_pool").hide(); - $("#submenu_content_storage").hide(); - $("#submenu_content_volume").hide(); - - var submenuContent = $("#submenu_content_snapshot"); - if (isAdmin) - submenuContent.find("#adv_search_domain_li, #adv_search_account_li").show(); - else //There are no fields in Advanced Search Dialog Box for non-admin user. So, hide Advanced Search Link. - submenuContent.find("#advanced_search_link").hide(); - - currentPage = 1; - listSnapshots(); - }); - - activateDialog($("#dialog_detach_volume").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_attach_volume").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_delete_volume").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_create_template").dialog({ - width: 400, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_create_snapshot").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_recurring_snapshot").dialog({ - width: 735, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - $.ajax({ - data: createURL("command=listOsTypes&response=json"), - dataType: "json", - success: function(json) { - types = json.listostypesresponse.ostype; - if (types != null && types.length > 0) { - var select = $("#dialog_create_template #create_template_os_type").empty(); - for (var i = 0; i < types.length; i++) { - select.append(""); - } - } - } - }); - - // *** recurring snapshot dialog - event binding (begin) ****************************** - var dialogRecurringSnapshot = $("#dialog_recurring_snapshot"); - - function clearTopPanel(target) { // "target == null" means target at all (hourly + daily + weekly + monthly) - var dialogBox = dialogRecurringSnapshot; - if(target == "hourly" || target == null) { - dialogBox.find("#dialog_snapshot_hourly_info_unset").show(); - dialogBox.find("#dialog_snapshot_hourly_info_set").hide(); - dialogBox.find("#read_hourly_max, #read_hourly_minute").text("N/A"); - dialogBox.find("#hourly_edit_link, #hourly_delete_link").data("intervalType", "hourly").data("max", "").data("timezone", (g_timezone==null)?"Etc/GMT+12":g_timezone).data("minute", "00"); - } - if(target == "daily" || target == null) { - dialogBox.find("#dialog_snapshot_daily_info_unset").show(); - dialogBox.find("#dialog_snapshot_daily_info_set").hide(); - dialogBox.find("#read_daily_max, #read_daily_minute, #read_daily_hour, #read_daily_meridiem").text("N/A"); - dialogBox.find("#daily_edit_link, #daily_delete_link").data("intervalType", "daily").data("max", "").data("timezone", (g_timezone==null)?"Etc/GMT+12":g_timezone).data("minute", "00").data("hour12", "00").data("meridiem", "AM"); - } - if(target == "weekly" || target == null) { - dialogBox.find("#dialog_snapshot_weekly_info_unset").show(); - dialogBox.find("#dialog_snapshot_weekly_info_set").hide(); - dialogBox.find("#read_weekly_max, #read_weekly_minute, #read_weekly_hour, #read_weekly_meridiem, #read_weekly_day_of_week").text("N/A"); - dialogBox.find("#weekly_edit_link, #weekly_delete_link").data("intervalType", "weekly").data("max", "").data("timezone", (g_timezone==null)?"Etc/GMT+12":g_timezone).data("minute", "00").data("hour12", "00").data("meridiem", "AM").data("dayOfWeek", "1"); - } - if(target == "monthly" || target == null) { - dialogBox.find("#dialog_snapshot_monthly_info_unset").show(); - dialogBox.find("#dialog_snapshot_monthly_info_set").hide(); - dialogBox.find("#read_monthly_max, #read_monthly_minute, #read_monthly_hour, #read_monthly_meridiem, #read_monthly_day_of_month").text("N/A"); - dialogBox.find("#monthly_edit_link, #monthly_delete_link").data("intervalType", "monthly").data("max", "").data("timezone", (g_timezone==null)?"Etc/GMT+12":g_timezone).data("minute", "00").data("hour12", "00").data("meridiem", "AM").data("dayOfMonth", "1"); - } - } - - function clearBottomPanel() { - var dialogBox = dialogRecurringSnapshot; - - dialogBox.find("#edit_hour").val("00"); - cleanErrMsg(dialogBox.find("#edit_hour"), dialogBox.find("#edit_time_errormsg")); - - dialogBox.find("#edit_minute").val("00"); - cleanErrMsg(dialogBox.find("#edit_minute"), dialogBox.find("#edit_time_errormsg")); - - dialogBox.find("#edit_meridiem").val("AM"); - - dialogBox.find("#edit_max").val(""); - cleanErrMsg(dialogBox.find("#edit_max"), dialogBox.find("#edit_max_errormsg")); - - dialogBox.find("#edit_timezone").val((g_timezone==null)?"Etc/GMT+12":g_timezone); - cleanErrMsg(dialogBox.find("#edit_timezone"), dialogBox.find("#edit_timezone_errormsg")); - - dialogBox.find("#edit_day_of_week").val("1"); - cleanErrMsg(dialogBox.find("#edit_day_of_week"), dialogBox.find("#edit_day_of_week_errormsg")); - - dialogBox.find("#edit_day_of_month").val("1"); - cleanErrMsg(dialogBox.find("#edit_day_of_month"), dialogBox.find("#edit_day_of_month_errormsg")); - } - - $("#dialog_recurring_snapshot").bind("click", function(event) { - event.preventDefault(); - event.stopPropagation(); - - var target = event.target; - var targetId = target.id; - var thisDialog = $(this); - var volumeId = thisDialog.data("volumeId"); - var topPanel = thisDialog.find("#dialog_snapshotleft"); - var bottomPanel = thisDialog.find("#dialog_snapshotright"); - - if(targetId.indexOf("_edit_link")!=-1) { - clearBottomPanel(); - - bottomPanel.animate({ - height: 200 - }, 1000, function() { - //$(this).fadeIn("fast"); - // Animation complete. - }); - //bottomPanel.show("slide", { direction: "left" }, 1000); - } - else if(targetId.indexOf("_delete_link")!=-1) { - clearBottomPanel(); - var snapshotPolicyId = $("#"+targetId).data("snapshotPolicyId"); - if(snapshotPolicyId == null || snapshotPolicyId.length==0) - return; - $.ajax({ - data: createURL("command=deleteSnapshotPolicies&id="+snapshotPolicyId+"&response=json"), - dataType: "json", - success: function(json) { - clearTopPanel($("#"+targetId).data("intervalType")); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - } - }); - } - - var thisLink; - switch(targetId) { - case "hourly_edit_link": - $("#edit_interval_type").text("Hourly"); - $("#edit_time_colon, #edit_hour_container, #edit_meridiem_container, #edit_day_of_week_container, #edit_day_of_month_container").hide(); - $("#edit_past_the_hour, #edit_minute_container").show(); - thisLink = thisDialog.find("#hourly_edit_link"); - thisDialog.find("#edit_minute").val(thisLink.data("minute")); - thisDialog.find("#edit_max").val(thisLink.data("max")); - thisDialog.find("#edit_timezone").val(thisLink.data("timezone")); - break; - case "daily_edit_link": - $("#edit_interval_type").text("Daily"); - $("#edit_past_the_hour, #edit_day_of_week_container, #edit_day_of_month_container").hide(); - $("#edit_minute_container, #edit_hour_container, #edit_meridiem_container").show(); - thisLink = thisDialog.find("#daily_edit_link"); - thisDialog.find("#edit_minute").val(thisLink.data("minute")); - thisDialog.find("#edit_hour").val(thisLink.data("hour12")); - thisDialog.find("#edit_meridiem").val(thisLink.data("meridiem")); - thisDialog.find("#edit_max").val(thisLink.data("max")); - thisDialog.find("#edit_timezone").val(thisLink.data("timezone")); - break; - case "weekly_edit_link": - $("#edit_interval_type").text("Weekly"); - $("#edit_past_the_hour, #edit_day_of_month_container").hide(); - $("#edit_minute_container, #edit_hour_container, #edit_meridiem_container, #edit_day_of_week_container").show(); - thisLink = thisDialog.find("#weekly_edit_link"); - thisDialog.find("#edit_minute").val(thisLink.data("minute")); - thisDialog.find("#edit_hour").val(thisLink.data("hour12")); - thisDialog.find("#edit_meridiem").val(thisLink.data("meridiem")); - thisDialog.find("#edit_day_of_week").val(thisLink.data("dayOfWeek")); - thisDialog.find("#edit_max").val(thisLink.data("max")); - thisDialog.find("#edit_timezone").val(thisLink.data("timezone")); - break; - case "monthly_edit_link": - $("#edit_interval_type").text("Monthly"); - $("#edit_past_the_hour, #edit_day_of_week_container").hide(); - $("#edit_minute_container, #edit_hour_container, #edit_meridiem_container, #edit_day_of_month_container").show(); - thisLink = thisDialog.find("#monthly_edit_link"); - thisDialog.find("#edit_minute").val(thisLink.data("minute")); - thisDialog.find("#edit_hour").val(thisLink.data("hour12")); - thisDialog.find("#edit_meridiem").val(thisLink.data("meridiem")); - thisDialog.find("#edit_day_of_month").val(thisLink.data("dayOfMonth")); - thisDialog.find("#edit_max").val(thisLink.data("max")); - thisDialog.find("#edit_timezone").val(thisLink.data("timezone")); - break; - case "apply_button": - var intervalType = bottomPanel.find("#edit_interval_type").text().toLowerCase(); - var minute, hour12, hour24, meridiem, dayOfWeek, dayOfWeekString, dayOfMonth, schedule, max, timezone; - switch(intervalType) { - case "hourly": - var isValid = true; - isValid &= validateNumber("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); - if (!isValid) return; - - minute = bottomPanel.find("#edit_minute").val(); - schedule = minute; - max = bottomPanel.find("#edit_max").val(); - timezone = bottomPanel.find("#edit_timezone").val(); - break; - - case "daily": - var isValid = true; - isValid &= validateNumber("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); - if (!isValid) return; - - minute = bottomPanel.find("#edit_minute").val(); - hour12 = bottomPanel.find("#edit_hour").val(); - meridiem = bottomPanel.find("#edit_meridiem").val(); - if(meridiem=="AM") - hour24 = hour12; - else //meridiem=="PM" - hour24 = (parseInt(hour12)+12).toString(); - schedule = minute + ":" + hour24; - max = bottomPanel.find("#edit_max").val(); - timezone = bottomPanel.find("#edit_timezone").val(); - break; - - case "weekly": - var isValid = true; - isValid &= validateNumber("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); - if (!isValid) return; - - minute = bottomPanel.find("#edit_minute").val(); - hour12 = bottomPanel.find("#edit_hour").val(); - meridiem = bottomPanel.find("#edit_meridiem").val(); - if(meridiem=="AM") - hour24 = hour12; - else //meridiem=="PM" - hour24 = (parseInt(hour12)+12).toString(); - dayOfWeek = bottomPanel.find("#edit_day_of_week").val(); - dayOfWeekString = bottomPanel.find("#edit_day_of_week option:selected").text(); - schedule = minute + ":" + hour24 + ":" + dayOfWeek; - max = bottomPanel.find("#edit_max").val(); - timezone = bottomPanel.find("#edit_timezone").val(); - break; - - case "monthly": - var isValid = true; - isValid &= validateNumber("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); - if (!isValid) return; - - minute = bottomPanel.find("#edit_minute").val(); - hour12 = bottomPanel.find("#edit_hour").val(); - meridiem = bottomPanel.find("#edit_meridiem").val(); - if(meridiem=="AM") - hour24 = hour12; - else //meridiem=="PM" - hour24 = (parseInt(hour12)+12).toString(); - dayOfMonth = bottomPanel.find("#edit_day_of_month").val(); - schedule = minute + ":" + hour24 + ":" + dayOfMonth; - max = bottomPanel.find("#edit_max").val(); - timezone = bottomPanel.find("#edit_timezone").val(); - break; - } - - var thisLink; - $.ajax({ - data: createURL("command=createSnapshotPolicy&intervaltype="+intervalType+"&schedule="+schedule+"&volumeid="+volumeId+"&maxsnaps="+max+"&timezone="+encodeURIComponent(timezone)+"&response=json"), - dataType: "json", - success: function(json) { - switch(intervalType) { - case "hourly": - topPanel.find("#dialog_snapshot_hourly_info_unset").hide(); - topPanel.find("#dialog_snapshot_hourly_info_set").show(); - topPanel.find("#read_hourly_minute").text(minute); - topPanel.find("#read_hourly_timezone").text("("+timezones[timezone]+")"); - topPanel.find("#read_hourly_max").text(max); - topPanel.find("#hourly_edit_link, #hourly_delete_link").data("intervalType", "hourly").data("snapshotPolicyId", json.createsnapshotpolicyresponse.id).data("max",max).data("timezone",timezone).data("minute", minute); - break; - case "daily": - topPanel.find("#dialog_snapshot_daily_info_unset").hide(); - topPanel.find("#dialog_snapshot_daily_info_set").show(); - topPanel.find("#read_daily_minute").text(minute); - topPanel.find("#read_daily_hour").text(hour12); - topPanel.find("#read_daily_meridiem").text(meridiem); - topPanel.find("#read_daily_timezone").text("("+timezones[timezone]+")"); - topPanel.find("#read_daily_max").text(max); - topPanel.find("#daily_edit_link, #daily_delete_link").data("intervalType", "daily").data("snapshotPolicyId", json.createsnapshotpolicyresponse.id).data("max",max).data("timezone",timezone).data("minute", minute).data("hour12", hour12).data("meridiem", meridiem); - break; - case "weekly": - topPanel.find("#dialog_snapshot_weekly_info_unset").hide(); - topPanel.find("#dialog_snapshot_weekly_info_set").show(); - topPanel.find("#read_weekly_minute").text(minute); - topPanel.find("#read_weekly_hour").text(hour12); - topPanel.find("#read_weekly_meridiem").text(meridiem); - topPanel.find("#read_weekly_timezone").text("("+timezones[timezone]+")"); - topPanel.find("#read_weekly_day_of_week").text(dayOfWeekString); - topPanel.find("#read_weekly_max").text(max); - topPanel.find("#weekly_edit_link, #weekly_delete_link").data("intervalType", "weekly").data("snapshotPolicyId", json.createsnapshotpolicyresponse.id).data("max",max).data("timezone",timezone).data("minute", minute).data("hour12", hour12).data("meridiem", meridiem).data("dayOfWeek",dayOfWeek); - break; - case "monthly": - topPanel.find("#dialog_snapshot_monthly_info_unset").hide(); - topPanel.find("#dialog_snapshot_monthly_info_set").show(); - topPanel.find("#read_monthly_minute").text(minute); - topPanel.find("#read_monthly_hour").text(hour12); - topPanel.find("#read_monthly_meridiem").text(meridiem); - topPanel.find("#read_monthly_timezone").text("("+timezones[timezone]+")"); - topPanel.find("#read_monthly_day_of_month").text(toDayOfMonthDesp(dayOfMonth)); - topPanel.find("#read_monthly_max").text(max); - topPanel.find("#monthly_edit_link, #monthly_delete_link").data("intervalType", "monthly").data("snapshotPolicyId", json.createsnapshotpolicyresponse.id).data("max",max).data("timezone",timezone).data("minute", minute).data("hour12", hour12).data("meridiem", meridiem).data("dayOfMonth",dayOfMonth); - break; - } - - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - } - }); - - break; - - } - }); - // *** recurring snapshot dialog - event binding (end) ****************************** - - // *** volume template - event binding (begin) ************************************** - $("#volume_template").bind("click", function(event) { - var template = $(this); - var link = $(event.target); - var linkAction = link.attr("id"); - var volumeId = template.data("volumeId"); - var vmId = template.data("vmid"); - var vmname = template.data("vmname"); - var vmState = template.data("vmstate"); - var domainId = template.data("domainId"); - var account = template.data("account"); - var volumeName = template.data("volumeName"); - var zoneId = template.data("zoneId"); - var timerKey = "volume"+volumeId; - var submenuContent = $("#submenu_content_volume"); - - switch (linkAction) { - case "volume_action_delete" : - //check if this volume is attached to a virtual machine. If yes, can't be deleted. - if(vmname != null && vmname != "" && vmname != "none") { - $("#dialog_alert").html("

    This volume is attached to virtual machine " + vmname + " and can't be deleted.

    ") - $("#dialog_alert").dialog("open"); - return; - } - - $("#dialog_delete_volume") - .dialog('option', 'buttons', { - "Confirm": function() { - var volumeTemplate = $("#volume"+volumeId); - var loadingImg = volumeTemplate.find(".adding_loading"); - var rowContainer = volumeTemplate.find("#row_container"); - loadingImg.find(".adding_text").text("Deleting...."); - $(this).dialog("close"); - if(volumeTemplate.find("#volume_snapshot_detail_panel").css("display")=="block") //if volume's snapshot grid is poped down, close it. - volumeTemplate.find("#volume_action_snapshot_grid").click(); - loadingImg.fadeIn("slow"); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=deleteVolume&id="+volumeId+"&response=json"), - dataType: "json", - success: function(json) { - volumeTemplate.slideUp("slow", function(){ - $(this).remove(); - }); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - - case "volume_action_detach" : - $("#dialog_detach_volume") - .dialog('option', 'buttons', { - "Confirm": function() { - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Detaching...."); - $(this).dialog("close"); - if(template.find("#volume_snapshot_detail_panel").css("display")=="block") //if volume's snapshot grid is poped down, close it. - template.find("#volume_action_snapshot_grid").click(); - loadingImg.show(); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=detachVolume&id="+volumeId+"&response=json"), - dataType: "json", - success: function(json) { - $("body").everyTime(5000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.detachvolumeresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - template.find("#volume_action_attach_span, #volume_action_delete_span, #volume_action_create_template_span").show(); - template.find("#volume_action_detach_span").hide(); - template.find("#volume_vmname").text("detached"); - template.data("vmid", null).data("vmname", null); - loadingImg.hide(); - rowContainer.show(); - } else if (result.jobstatus == 2) { - // Failed - loadingImg.hide(); - rowContainer.show(); - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - - case "volume_action_attach" : - populateVirtualMachineField(domainId, account, zoneId); - - $("#dialog_attach_volume") - .dialog('option', 'buttons', { - "Confirm": function() { - var virtualMachineId = $("#dialog_attach_volume #volume_vm").val(); - if(virtualMachineId==null) { - $(this).dialog("close"); - $("#dialog_alert").html("

    Please attach volume to a valid virtual machine

    ").dialog("open"); - return; - } - - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Attaching...."); - $(this).dialog("close"); - if(template.find("#volume_snapshot_detail_panel").css("display")=="block") //if volume's snapshot grid is poped down, close it. - template.find("#volume_action_snapshot_grid").click(); - loadingImg.show(); - rowContainer.hide(); - - var virtualMachineId = $("#dialog_attach_volume #volume_vm").val(); - $.ajax({ - data: createURL("command=attachVolume&id="+volumeId+'&virtualMachineId='+virtualMachineId+"&response=json"), - dataType: "json", - success: function(json) { - $("body").everyTime(5000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.attachvolumeresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - var virtualmachine = result.jobresult.attachvolumeresponse; - if (virtualmachine.vmstate == "Stopped") { - template.find("#volume_action_attach_span, #volume_action_delete_span").hide(); - template.find("#volume_action_detach_span, #volume_action_create_template_span").show(); - } else { - template.find("#volume_action_attach_span, #volume_action_delete_span, #volume_action_create_template_span").hide(); - template.find("#volume_action_detach_span").show(); - } - template.find("#volume_vmname").text(getVmName(virtualmachine.vmname, virtualmachine.vmdisplayname) + " (" + virtualmachine.vmstate + ")"); - template.data("vmid", virtualMachineId).data("vmname", getVmName(virtualmachine.vmname, virtualmachine.vmdisplayname)); - loadingImg.hide(); - rowContainer.show(); - } else if (result.jobstatus == 2) { - // Failed - loadingImg.hide(); - rowContainer.show(); - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - - case "volume_action_create_template" : - if(vmId != null && vmState != "Stopped") { - $("#dialog_alert").html("

    "+vmname+" needs to be stopped before you can create a template of this disk volume.

    ") - $("#dialog_alert").dialog("open"); - return false; - } - $("#dialog_create_template").find("#volume_name").text(volumeName); - $("#dialog_create_template") - .dialog('option', 'buttons', { - "Create": function() { - // validate values - var isValid = true; - isValid &= validateString("Name", $("#create_template_name"), $("#create_template_name_errormsg")); - isValid &= validateString("Display Text", $("#create_template_desc"), $("#create_template_desc_errormsg")); - if (!isValid) return; - - var name = trim($("#create_template_name").val()); - var desc = trim($("#create_template_desc").val()); - var osType = $("#create_template_os_type").val(); - var isPublic = $("#create_template_public").val(); - var password = $("#create_template_password").val(); - - $(this).dialog("close"); - if(template.find("#volume_snapshot_detail_panel").css("display")=="block") //if volume's snapshot grid is poped down, close it. - template.find("#volume_action_snapshot_grid").click(); - template.find(".adding_loading .adding_text").text("Creating Template..."); - template.find(".adding_loading").show(); - template.find("#row_container").hide(); - - $.ajax({ - data: createURL("command=createTemplate&volumeId="+volumeId+"&name="+todb(name)+"&displayText="+todb(desc)+"&osTypeId="+osType+"&isPublic="+isPublic+"&passwordEnabled="+password+"&response=json"), - dataType: "json", - success: function(json) { - $("body").everyTime( - 30000, // This is templates..it could take hours - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.createtemplateresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - template.find(".adding_loading").hide(); - template.find("#row_container").show(); - if (result.jobstatus == 1) { - $("#dialog_info").html("

    " + ((isPublic=="true")? "Public":"Private") + " template: " + name + " has been successfully created

    ").dialog("open"); - } else if (result.jobstatus == 2) { - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - template.find(".adding_loading").hide(); - template.find("#row_container").show(); - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - template.find(".adding_loading").hide(); - template.find("#row_container").show(); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - - case "volume_action_take_snapshot": - $("#dialog_create_snapshot") - .dialog('option', 'buttons', { - "Confirm": function() { - var volumeTemplate = $("#volume"+volumeId); - var loadingImg = volumeTemplate.find(".adding_loading"); - var rowContainer = volumeTemplate.find("#row_container"); - loadingImg.find(".adding_text").text("Taking snapshot...."); - $(this).dialog("close"); - if(template.find("#volume_snapshot_detail_panel").css("display")=="block") //if volume's snapshot grid is poped down, close it. - template.find("#volume_action_snapshot_grid").click(); - loadingImg.fadeIn("slow"); - rowContainer.hide(); - $.ajax({ - data: createURL("command=createSnapshot&volumeid="+volumeId+"&response=json"), - dataType: "json", - success: function(json) { - $("body").everyTime(5000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.createsnapshotresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - if(result.jobprocstatus == 1) - loadingImg.find(".adding_text").text("Backing up...."); - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - //Succeeded - template.find("#volume_action_snapshot_grid").click(); //pop down volume's snapshot grid - loadingImg.hide(); - rowContainer.show(); - $("#dialog_info").html("

    Snapshot was created successfully

    ").dialog("open"); - } else if (result.jobstatus == 2) { - loadingImg.hide(); - rowContainer.show(); - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - - case "volume_action_recurring_snapshot": - var dialogBox = $("#dialog_recurring_snapshot"); - clearTopPanel(); - $.ajax({ - data: createURL("command=listSnapshotPolicies&volumeid="+volumeId+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - var items = json.listsnapshotpoliciesresponse.snapshotpolicy; - if(items!=null && items.length>0) { - for(var i=0; i 0) { - var grid = template.find("#volume_snapshot_grid").empty(); - for (var i = 0; i < items.length; i++) { - var newTemplate = $("#volume_snapshot_detail_template").clone(true); - volumeSnapshotJSONToTemplate(items[i], newTemplate); - grid.append(newTemplate.show()); - } - } - link.removeClass().addClass("vm_botactionslinks_up"); - template.find("#volume_snapshot_detail_panel").slideDown("slow"); - - link.data("expanded", true); - } - }); - } else { - link.removeClass().addClass("vm_botactionslinks_down"); - template.find("#volume_snapshot_detail_panel").slideUp("slow"); - link.data("expanded", false); - } - break; - - default : - break; - } - return false; - }); - // *** volume template - event binding (end) **************************************** - - // *** volume's snapshot template - event binding (begin) *************************** - $("#volume_snapshot_detail_template").bind("click", function(event) { - event.preventDefault(); - event.stopPropagation(); - - var template = $(this); - var snapshotId = template.data("snapshotId"); - var target = event.target.id; - switch(target) { - case "volume_snapshot_action_create_volume": - $("#dialog_add_volume_from_snapshot") - .dialog("option", "buttons", { - "Add": function() { - var thisDialog = $(this); - - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg")); - if (!isValid) return; - - var name = thisDialog.find("#name").val(); - thisDialog.dialog("close"); - - var submenuContent = $("#submenu_content_volume"); - var template = $("#volume_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - submenuContent.find("#grid_content").prepend(template); - template.fadeIn("slow"); - - $.ajax({ - data: createURL("command=createVolume&snapshotid="+snapshotId+"&name="+todb(name)+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.createvolumeresponse.jobid; - var timerKey = "createVolumeJob"+jobId; - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.createvolumeresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - volumeJSONToTemplate(result.volume[0], template); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1); - - loadingImg.hide(); - var createdSuccessfullyImg = template.find("#created_successfully").show(); - createdSuccessfullyImg.find("#close_button").bind("click", function() { - createdSuccessfullyImg.hide(); - rowContainer.show(); - }); - } else if (result.jobstatus == 2) { - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - template.slideUp("slow", function() { - $(this).remove(); - }); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - template.slideUp("slow", function() { - $(this).remove(); - }); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function() { - $(this).remove(); - }); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - - break; - - case "volume_snapshot_action_delete_snapshot": - var thisDialog = $(this); - thisDialog.dialog("close"); - - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Deleting snapshot...."); - loadingImg.show(); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=deleteSnapshot&id="+snapshotId+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.deletesnapshotresponse.jobid; - var timerKey = "deleteSnapshotJob"+jobId; - - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.deletesnapshotresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - loadingImg.hide(); - rowContainer.show(); - template.slideUp("slow", function() { - $(this).remove(); - }); - } else if (result.jobstatus == 2) { - loadingImg.hide(); - rowContainer.show(); - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - break; - - case "volume_snapshot_action_create_template": - $("#dialog_create_template_from_snapshot") - .dialog("option", "buttons", { - "Add": function() { - var thisDialog = $(this); - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg"), false); - isValid &= validateString("Display Text", thisDialog.find("#display_text"), thisDialog.find("#display_text_errormsg"), false); - if (!isValid) return; - - var name = thisDialog.find("#name").val(); - var displayText = thisDialog.find("#display_text").val(); - var osTypeId = thisDialog.find("#os_type").val(); - var password = thisDialog.find("#password").val(); - thisDialog.dialog("close"); - - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Creating template...."); - loadingImg.fadeIn("slow"); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=createTemplate&snapshotid="+snapshotId+"&name="+todb(name)+"&displaytext="+todb(displayText)+"&ostypeid="+osTypeId+"&passwordEnabled="+password+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.createtemplateresponse.jobid; - var timerKey = "createTemplateJob"+jobId; - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.createtemplateresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - loadingImg.hide(); - rowContainer.show(); - $("#dialog_info").html("

    Template was created successfully

    ").dialog("open"); - } else if (result.jobstatus == 2) { - loadingImg.hide(); - rowContainer.show(); - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - loadingImg.hide(); - rowContainer.show(); - handleError(XMLHttpResponse); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - } - }); - // *** volume's snapshot template - event binding (end) ***************************** - - function volumeSnapshotJSONToTemplate(json, template) { - template.addClass("smallrow_even"); - - template.attr("id", "volume_snapshot_"+json.id).data("snapshotId", json.id).data("volumeId", json.volumeid); - template.find("#id").text(json.id); - template.find("#name").text(fromdb(json.name)); - template.find("#volume").text(fromdb(json.volumename)); - template.find("#interval_type").text(json.intervaltype); - template.find("#account").text(fromdb(json.account)); - template.find("#domain").text(fromdb(json.domain)); - - setDateField(json.created, template.find("#created")); - } - - function snapshotJSONToTemplate(json, template) { - (index++ % 2 == 0)? template.addClass("smallrow_even"): template.addClass("smallrow_odd"); - - template.attr("id", "snapshot_"+json.id).data("snapshotId", json.id); - template.find("#id").text(json.id); - template.find("#name").text(fromdb(json.name)); - template.find("#volume").text(fromdb(json.volumename)); - template.find("#interval_type").text(json.intervaltype); - template.find("#account").text(fromdb(json.account)); - template.find("#domain").text(fromdb(json.domain)); - - setDateField(json.created, template.find("#created")); - } - } - - if (isAdmin()) { - populateZoneField(true); - populateDiskOfferingField(); - populateOSTypeField(); - - // *** Primary Storage (begin) *** - - function poolJSONToTemplate(json, template) { - template.attr("id", "pool"+json.id); - - if (index++ % 2 == 0) { - template.find("#row_container").addClass("smallrow_even"); - } else { - template.find("#row_container").addClass("smallrow_odd"); - } - - template.data("id", json.id).data("name", fromdb(json.name)); - template.find("#pool_id").text(json.id); - template.find("#pool_name").text(fromdb(json.name)); - template.find("#pool_zone").text(fromdb(json.zonename)); - template.find("#pool_pod").text(json.podname); - template.find("#pool_cluster").text(fromdb(json.clustername)); - template.find("#pool_type").text(json.type); - template.find("#pool_ip").text(json.ipaddress); - template.find("#pool_path").text(json.path); - template.find("#pool_tags").text(fromdb(json.tags)); - - var statHtml = " Disk Total: " +convertBytes(json.disksizetotal)+" | Disk Allocated: " + convertBytes(json.disksizeallocated); - template.find("#pool_statistics").html(statHtml); - - /* - var statHtml = "

    Disk Total: " +convertBytes(json.disksizetotal)+" | Disk Allocated: " + json.disksizeallocated + "

    "; - template.find("#storage_disk_stat").html(statHtml); - - // State - if (json.state == 'Up') { - template.find("#storage_state_bar").removeClass("yellow_statusbar grey_statusbar red_statusbar").addClass("green_statusbar "); - template.find("#storage_state").text(json.state).removeClass("grid_celltitles grid_stoppedtitles").addClass("grid_runningtitles"); - template.find(".grid_links").find("#storage_action_cancel_maint_container, #storage_action_remove_container").hide(); - } else if (json.state == 'Down' || json.state == "Alert") { - template.find("#storage_state_bar").removeClass("yellow_statusbar grey_statusbar green_statusbar").addClass("red_statusbar"); - template.find("#storage_state").text(json.state).removeClass("grid_celltitles grid_runningtitles").addClass("grid_stoppedtitles"); - - if (json.state == "Alert") { - template.find(".grid_links").find("#storage_action_reconnect_container, #storage_action_enable_maint_container, #storage_action_cancel_maint_container, #storage_action_remove_container").hide(); - } else { - template.find(".grid_links").find("#storage_action_reconnect_container, #storage_action_cancel_maint_container, #storage_action_remove_container").hide(); - } - } else { - template.find("#storage_state_bar").removeClass("yellow_statusbar green_statusbar red_statusbar").addClass("grey_statusbar"); - template.find("#storage_state").text(json.state).removeClass("grid_runningtitles grid_stoppedtitles").addClass("grid_celltitles "); - - if (json.state == "ErrorInMaintenance") { - template.find(".grid_links").find("#storage_action_reconnect_container, #storage_action_remove_container").hide(); - } else if (json.state == "PrepareForMaintenance") { - template.find(".grid_links").find("#storage_action_reconnect_container, #storage_action_enable_maint_container, #storage_action_remove_container").hide(); - } else if (json.state == "Maintenance") { - template.find(".grid_links").find("#storage_action_reconnect_container, #storage_action_enable_maint_container, #storage_action_cancel_maint_container").hide(); - } else if (json.state == "Disconnected") { - template.find(".grid_links").find("#storage_action_reconnect_container, #storage_action_enable_maint_container, #storage_action_cancel_maint_container, #storage_action_remove_container").hide(); - } else { - alert("Unsupported Host State: " + json.state); - } - } */ - } - - // Dialog Setup - activateDialog($("#dialog_add_pool").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - // if hypervisor is KVM, limit the server option to NFS for now - if (getHypervisorType() == 'kvm') { - $("#dialog_add_pool").find("#add_pool_protocol").empty().html(''); - } - - $("#dialog_add_pool").find("#pool_zone").bind("change", function(event) { - var zoneId = $(this).val(); - $.ajax({ - data: createURL("command=listPods&zoneId="+zoneId+"&response=json"), - dataType: "json", - async: false, - success: function(json) { - var pods = json.listpodsresponse.pod; - var podSelect = $("#dialog_add_pool").find("#pool_pod").empty(); - if (pods != null && pods.length > 0) { - for (var i = 0; i < pods.length; i++) { - podSelect.append(""); - } - } - $("#dialog_add_pool").find("#pool_pod").change(); - } - }); - }); - - $("#dialog_add_pool").find("#pool_pod").bind("change", function(event) { - var podId = $(this).val(); - if(podId == null || podId.length == 0) - return; - var clusterSelect = $("#dialog_add_pool").find("#pool_cluster").empty(); - $.ajax({ - data: createURL("command=listClusters&response=json&podid=" + podId), - dataType: "json", - success: function(json) { - var items = json.listclustersresponse.cluster; - if(items != null && items.length > 0) { - for(var i=0; i" + fromdb(items[i].name) + ""); - } - } - }); - }); - - function nfsURL(server, path) { - var url; - if(server.indexOf("://")==-1) - url = "nfs://" + server + path; - else - url = server + path; - return url; - } - - function iscsiURL(server, iqn, lun) { - var url; - if(server.indexOf("://")==-1) - url = "iscsi://" + server + iqn + "/" + lun; - else - url = server + iqn + "/" + lun; - return url; - } - - // Add New Primary Storage - - $("#dialog_add_pool #add_pool_protocol").change(function(event) { - if ($(this).val() == "iscsi") { - $("#dialog_add_pool #add_pool_path_container").hide(); - $("#dialog_add_pool #add_pool_iqn_container, #dialog_add_pool #add_pool_lun_container").show(); - } else { - $("#dialog_add_pool #add_pool_path_container").show(); - $("#dialog_add_pool #add_pool_iqn_container, #dialog_add_pool #add_pool_lun_container").hide(); - } - }); - - $("#pool_template").bind("click", function(event) { - var template = $(this); - var id = template.data("id"); - var name = template.data("name"); - var submenuContent = $("#submenu_content_pool"); - switch(event.target.id) { - case "delete_link": - $("#dialog_confirmation") - .html("Please confirm the deletion of your primary storage: " + name) - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - $.ajax({ - data: createURL("command=deleteStoragePool&id="+id+"&response=json"), - dataType: "json", - success: function(json) { - template.slideUp("slow", function() { - $(this).remove(); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), -1); - }); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - } - return false; //event.preventDefault() + event.stopPropogation() - }); - - $("#storage_action_new_pool").bind("click", function(event) { - $("#dialog_add_pool") - .dialog('option', 'buttons', { - "Add": function() { - var thisDialog = $(this); - - // validate values - var protocol = thisDialog.find("#add_pool_protocol").val(); - - var isValid = true; - isValid &= validateDropDownBox("Cluster", thisDialog.find("#pool_cluster"), thisDialog.find("#pool_cluster_errormsg"), false); //required, reset error text - isValid &= validateString("Name", thisDialog.find("#add_pool_name"), thisDialog.find("#add_pool_name_errormsg")); - isValid &= validateString("Server", thisDialog.find("#add_pool_nfs_server"), thisDialog.find("#add_pool_nfs_server_errormsg")); - if (protocol == "nfs") { - isValid &= validateString("Path", thisDialog.find("#add_pool_path"), thisDialog.find("#add_pool_path_errormsg")); - } else { - isValid &= validateString("Target IQN", thisDialog.find("#add_pool_iqn"), thisDialog.find("#add_pool_iqn_errormsg")); - isValid &= validateString("LUN #", thisDialog.find("#add_pool_lun"), thisDialog.find("#add_pool_lun_errormsg")); - } - isValid &= validateString("Tags", thisDialog.find("#add_pool_tags"), thisDialog.find("#add_pool_tags_errormsg"), true); //optional - if (!isValid) return; - - var submenuContent = $("#submenu_content_pool"); - var template = $("#pool_template").clone(true).attr("id", "pool"+(new Date().getTime())); //set a temporary Id to make the template unique before it gets a real Id. - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - submenuContent.find("#grid_content").prepend(template.fadeIn("slow")); - - var array1 = []; - var name = trim(thisDialog.find("#add_pool_name").val()); - array1.push("&name="+todb(name)); - - var server = trim(thisDialog.find("#add_pool_nfs_server").val()); - - var zoneId = thisDialog.find("#pool_zone").val(); - array1.push("&zoneId="+zoneId); - - var clusterId = thisDialog.find("#pool_cluster").val(); - array1.push("&clusterid="+clusterId); - - var podId = thisDialog.find("#pool_pod").val(); - array1.push("&podId="+podId); - - var url = null; - if (protocol == "nfs") { - var path = trim(thisDialog.find("#add_pool_path").val()); - if(path.substring(0,1)!="/") - path = "/" + path; - url = nfsURL(server, path); - } else { - var iqn = trim(thisDialog.find("#add_pool_iqn").val()); - if(iqn.substring(0,1)!="/") - iqn = "/" + iqn; - var lun = trim(thisDialog.find("#add_pool_lun").val()); - url = iscsiURL(server, iqn, lun); - } - array1.push("&url="+encodeURIComponent(url)); - - var tags = trim(thisDialog.find("#add_pool_tags").val()); - if(tags != null && tags.length > 0) - array1.push("&tags="+todb(tags)); - - thisDialog.dialog("close"); - - $.ajax({ - data: createURL("command=createStoragePool&response=json" + array1.join("")), - dataType: "json", - success: function(json) { - var json = json.createstoragepoolresponse; - poolJSONToTemplate(json, template); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1); - loadingImg.hide(); - rowContainer.show(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function(){ $(this).remove(); } ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - return false; - }); - - function listStoragePools() { - var submenuContent = $("#submenu_content_pool"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var zone = submenuContent.find("#advanced_search #adv_search_zone").val(); - var pod = submenuContent.find("#advanced_search #adv_search_pod").val(); - var ip = submenuContent.find("#advanced_search #adv_search_ip").val(); - var path = submenuContent.find("#advanced_search #adv_search_path").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(name)); - if (zone!=null && zone.length > 0) - moreCriteria.push("&zoneId="+zone); - if (pod!=null && pod.length > 0) - moreCriteria.push("&podId="+pod); - if (ip!=null && trim(ip).length > 0) - moreCriteria.push("&ipaddress="+encodeURIComponent(ip)); - if (path!=null && trim(path).length > 0) - moreCriteria.push("&path="+encodeURIComponent(path)); - commandString = "command=listStoragePools&page="+currentPage+moreCriteria.join("")+"&response=json"; - } else { - var searchInput = submenuContent.find("#search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listStoragePools&page="+currentPage+"&keyword="+searchInput+"&response=json" - else - commandString = "command=listStoragePools&page="+currentPage+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "liststoragepoolsresponse", "storagepool", $("#pool_template"), poolJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_pool"), listStoragePools); - - $("#submenu_pool").bind("click", function(event) { - event.preventDefault(); - - currentSubMenu.addClass("submenu_links_off").removeClass("submenu_links_on"); - $(this).addClass("submenu_links_on").removeClass("submenu_links_off"); - currentSubMenu = $(this); - - $("#submenu_content_pool").show(); - $("#submenu_content_storage").hide(); - $("#submenu_content_volume").hide(); - $("#submenu_content_snapshot").hide(); - - currentPage = 1; - listStoragePools(); - }); - // *** Primary Storage (end) *** - - - - - - - // *** Secondary Storage (begin) *** - // Add Secondary Storage Dialog (begin) - activateDialog($("#dialog_add_host").dialog({ - autoOpen: false, - modal: true, - zIndex: 2000 - })); - $("#storage_action_new_host").bind("click", function(event) { - $("#dialog_add_host") - .dialog('option', 'buttons', { - "Add": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("NFS Server", thisDialog.find("#add_storage_nfs_server"), thisDialog.find("#add_storage_nfs_server_errormsg")); - isValid &= validatePath("Path", thisDialog.find("#add_storage_path"), thisDialog.find("#add_storage_path_errormsg")); - if (!isValid) return; - - var submenuContent = $("#submenu_content_storage"); - var template = $("#storage_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - submenuContent.find("#grid_content").prepend(template.fadeIn("slow")); - - var zoneId = thisDialog.find("#storage_zone").val(); - var nfs_server = trim(thisDialog.find("#add_storage_nfs_server").val()); - var path = trim(thisDialog.find("#add_storage_path").val()); - var url = nfsURL(nfs_server, path); - - thisDialog.dialog("close"); - $.ajax({ - data: createURL("command=addSecondaryStorage&zoneId="+zoneId+"&url="+encodeURIComponent(url)+"&response=json"), - dataType: "json", - success: function(json) { - var secondaryStorage = json.addsecondarystorageresponse.secondarystorage[0]; - storageJSONToTemplate(secondaryStorage, template); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1) ; - loadingImg.hide(); - rowContainer.show(); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - template.slideUp("slow", function(){ $(this).remove(); } ); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - return false; - }); - // Add Secondary Storage Dialog (end) - - // FUNCTION: Storage JSON to Template - function storageJSONToTemplate(json, template) { - template.attr("id", "secondaryStorage_"+json.id).data("secondaryStorageId", json.id); - if (index++ % 2 == 0) { - template.find("#row_container").addClass("smallrow_even"); - } else { - template.find("#row_container").addClass("smallrow_odd"); - } - template.data("hostName", fromdb(json.name)); - - template.find("#storage_status").text(json.state); - template.find("#storage_type").text(json.type); - template.find("#storage_name").text(json.name); - template.find("#storage_zone").text(json.zonename); - //template.find("#storage_pod").text(json.podname); - template.find("#storage_ip").text(json.ipaddress); - template.find("#storage_version").text(json.version); - - setDateField(json.disconnected, template.find("#storage_disconnected")); - } - - function listSecondaryStorage() { - var submenuContent = $("#submenu_content_storage"); - - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var state = submenuContent.find("#advanced_search #adv_search_state").val(); - var zone = submenuContent.find("#advanced_search #adv_search_zone").val(); - //var pod = submenuContent.find("#advanced_search #adv_search_pod").val(); - var domainId = submenuContent.find("#advanced_search #adv_search_domain").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(name)); - if (state!=null && state.length > 0) - moreCriteria.push("&state="+state); - if (zone!=null && zone.length > 0) - moreCriteria.push("&zoneId="+zone); - //if (pod!=null && pod.length > 0) - // moreCriteria.push("&podId="+pod); - if (domainId!=null && domainId.length > 0) - moreCriteria.push("&domainid="+domainId); - commandString = "command=listHosts&type=SecondaryStorage&page="+currentPage+moreCriteria.join("")+"&response=json"; - } else { - var searchInput = $("#submenu_content_storage #search_input").val(); - if (searchInput != null && searchInput.length > 0) - commandString = "command=listHosts&type=SecondaryStorage&page="+currentPage+"&keyword="+searchInput+"&response=json" - else - commandString = "command=listHosts&type=SecondaryStorage&page="+currentPage+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listhostsresponse", "host", $("#storage_template"), storageJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_storage"), listSecondaryStorage); - - $("#submenu_storage").bind("click", function(event) { - event.preventDefault(); - - $(this).addClass("submenu_links_on").removeClass("submenu_links_off"); - currentSubMenu.addClass("submenu_links_off").removeClass("submenu_links_on"); - currentSubMenu = $(this); - - $("#submenu_content_storage").show(); - $("#submenu_content_pool").hide(); - $("#submenu_content_volume").hide(); - $("#submenu_content_snapshot").hide(); - - currentPage = 1; - listSecondaryStorage(); - }); - - $("#storage_template").bind("click", function(event) { - var template = $(this); - var id = template.data("secondaryStorageId"); - var name = template.data("hostName"); - var submenuContent = $("#submenu_content_storage"); - switch(event.target.id) { - case "delete_link": - $("#dialog_confirmation") - .html("Please confirm the deletion of your secondary storage: " + name) - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - $.ajax({ - data: createURL("command=deleteHost&id="+id+"&response=json"), - dataType: "json", - success: function(json) { - template.slideUp("slow", function() { - $(this).remove(); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), -1); - }); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - break; - } - return false; //event.preventDefault() + event.stopPropogation() - }); - // *** Secondary Storage (end) *** - - - // *** Volume (begin) *** - initializeVolumeTab(true); - $("#volume_hostname_header, #volume_hostname_container, #volume_account_header, #volume_account_container, #snapshot_account_header, #snapshot_account_container, #snapshot_domain_header, #snapshot_domain_container, #volume_snapshot_account_header, #volume_snapshot_account_container, #volume_snapshot_domain_header, #volume_snapshot_domain_container").show(); - // *** Volume (end) *** - - if(targetTab==null) { - currentSubMenu = $("#submenu_pool"); - $("#submenu_pool").click(); //default tab is Primary Storage page - } - else { - currentSubMenu = $("#"+targetTab); - $("#"+targetTab).click(); - } - - } else { //*** isAdmin()==false - $("#submenu_content_pool, #pool_template, #dialog_add_pool, #submenu_content_storage, #storage_template, #dialog_add_host, #submenu_pool, #submenu_storage").hide(); //hide Primary Storage tab, Secondary Storage tab - - populateZoneField(false); - populateDiskOfferingField(); - populateOSTypeField(); - - // *** Volume (begin) *** - initializeVolumeTab(false); - $("#volume_hostname_header, #volume_hostname_container, #volume_account_header, #volume_account_container, #snapshot_account_header, #snapshot_account_container, #snapshot_domain_header, #snapshot_domain_container, #volume_snapshot_account_header, #volume_snapshot_account_container, #volume_snapshot_domain_header, #volume_snapshot_domain_container").hide(); - $("#volume_created_header, #volume_created_container").css("width", "30%"); - // *** Volume (end) *** - - currentSubMenu = $("#submenu_volume"); //default tab is volume - $("#submenu_volume").click(); - } -} diff --git a/ui/2.1/scripts/cloud.core.templates.js b/ui/2.1/scripts/cloud.core.templates.js deleted file mode 100644 index 2a7ffe35c28..00000000000 --- a/ui/2.1/scripts/cloud.core.templates.js +++ /dev/null @@ -1,1121 +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 . - * - */ - -// Version: @VERSION@ - -var DomRTemplateId = 1; - -function showTemplatesTab() { - // Manage Templates - // *** Template (begin) *** - activateDialog($("#dialog_edit_template").dialog({ - width:450, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_add_template").dialog({ - width:450, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_copy_template").dialog({ - width:300, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_create_vm_from_template").dialog({ - width:300, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_create_vm_from_iso").dialog({ - width:300, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - var g_zoneIds = [], g_zoneNames = []; - var addTemplateZoneField = $("#dialog_add_template #add_template_zone"); - var addIsoZoneField = $("#dialog_add_iso #add_iso_zone"); - // Add default zone - if (isAdmin()) { - addTemplateZoneField.append(""); - addIsoZoneField.append(""); - } - $.ajax({ - data: createURL("command=listZones&available=true&response=json"), - dataType: "json", - success: function(json) { - var zones = json.listzonesresponse.zone; - if (zones != null && zones.length > 0) { - for (var i = 0; i < zones.length; i++) { - addTemplateZoneField.append(""); - addIsoZoneField.append(""); - g_zoneIds.push(zones[i].id); - g_zoneNames.push(zones[i].name); - } - } - } - }); - - function populateZoneField(zoneField, excludeZoneId) { - zoneField.empty(); - if (g_zoneIds != null && g_zoneIds.length > 0) { - for (var i = 0; i < g_zoneIds.length; i++) { - if(g_zoneIds[i] != excludeZoneId) - zoneField.append(""); - } - } - } - - $.ajax({ - data: createURL("command=listOsTypes&response=json"), - dataType: "json", - success: function(json) { - types = json.listostypesresponse.ostype; - if (types != null && types.length > 0) { - var templateSelect = $("#dialog_add_template #add_template_os_type, #dialog_edit_template #edit_template_os_type").empty(); - var isoSelect = $("#dialog_add_iso #add_iso_os_type").empty(); - for (var i = 0; i < types.length; i++) { - var html = ""; - templateSelect.append(html); - isoSelect.append(html); - } - } - } - }); - - $.ajax({ - data: createURL("command=listServiceOfferings&response=json"), - dataType: "json", - success: function(json) { - var items = json.listserviceofferingsresponse.serviceoffering; - if(items != null && items.length > 0 ) { - var templateServiceOfferingField = $("#dialog_create_vm_from_template #service_offering").empty(); - var isoServiceOfferingField = $("#dialog_create_vm_from_iso #service_offering").empty(); - for(var i = 0; i < items.length; i++) { - templateServiceOfferingField.append(""); - isoServiceOfferingField.append(""); - } - } - } - }); - - $.ajax({ - data: createURL("command=listDiskOfferings&response=json"), - dataType: "json", - success: function(json) { - var items = json.listdiskofferingsresponse.diskoffering; - if(items != null && items.length > 0 ) { - var templateDiskOfferingField = $("#dialog_create_vm_from_template #disk_offering").empty(); - templateDiskOfferingField.append(""); - - var isoDiskOfferingField = $("#dialog_create_vm_from_iso #disk_offering").empty(); - - for(var i = 0; i < items.length; i++) { - templateDiskOfferingField.append(""); - isoDiskOfferingField.append(""); - } - } - - } - }); - - $("#template_action_new").show(); - var formatSelect = $("#add_template_format").empty(); - if (getHypervisorType() == "kvm") { - formatSelect.append(""); - formatSelect.append(""); - formatSelect.append(""); - } else if (getHypervisorType() == "xenserver") { - formatSelect.append(""); - formatSelect.append(""); - formatSelect.append(""); - } - - $("#template_action_new").bind("click", function(event) { - $("#dialog_add_template") - .dialog('option', 'buttons', { - "Create": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#add_template_name"), thisDialog.find("#add_template_name_errormsg")); - isValid &= validateString("Display Text", thisDialog.find("#add_template_display_text"), thisDialog.find("#add_template_display_text_errormsg")); - isValid &= validateString("URL", thisDialog.find("#add_template_url"), thisDialog.find("#add_template_url_errormsg")); - if (!isValid) return; - - var name = trim(thisDialog.find("#add_template_name").val()); - var desc = trim(thisDialog.find("#add_template_display_text").val()); - var url = trim(thisDialog.find("#add_template_url").val()); - var zoneId = thisDialog.find("#add_template_zone").val(); - var format = thisDialog.find("#add_template_format").val(); - var password = thisDialog.find("#add_template_password").val(); - var isPublic = thisDialog.find("#add_template_public").val(); - var osType = thisDialog.find("#add_template_os_type").val(); - var hypervisor = thisDialog.find("#add_template_hypervisor").val(); - - var moreCriteria = []; - if(thisDialog.find("#add_template_featured_container").css("display")!="none") { - var isFeatured = thisDialog.find("#add_template_featured").val(); - moreCriteria.push("&isfeatured="+isFeatured); - } - - thisDialog.dialog("close"); - - var submenuContent = $("#submenu_content_template"); - var template = $("#vm_template_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - submenuContent.find("#grid_content").prepend(template.fadeIn("slow")); - - $.ajax({ - data: createURL("command=registerTemplate&name="+todb(name)+"&displayText="+todb(desc)+"&url="+encodeURIComponent(url)+"&zoneid="+zoneId+"&ispublic="+isPublic+moreCriteria.join("")+"&format="+format+"&passwordEnabled="+password+"&osTypeId="+osType+"&hypervisor="+hypervisor+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.registertemplateresponse; - if($("#template_type").val() == "self") { - templateJSONToTemplate(result.template[0], template); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1); - loadingImg.hide(); - rowContainer.show(); - - if(result.template.length > 1) { - for(var i=1; i is used by all zones. Please confirm you want to delete it from all zones.

    "; - else - htmlMsg = "

    Please confirm you want to delete your template "+name+".

    "; - - $("#dialog_confirmation") - .html(htmlMsg) - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - - var loadingImg = thisTemplate.find(".adding_loading"); - var rowContainer = thisTemplate.find("#row_container"); - loadingImg.find(".adding_text").text("Deleting...."); - loadingImg.show(); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=deleteTemplate&id="+id+moreCriteria.join("")+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.deletetemplateresponse.jobid; - var timerKey = "deleteTemplateJob"+jobId; - - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.deletetemplateresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { //success - that.slideUp("slow", function() { $(this).remove() }); - changeGridRowsTotal($("#submenu_content_template").find("#grid_rows_total"), -1); - } else if (result.jobstatus == 2) { - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - loadingImg.hide(); - rowContainer.show(); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - }); - template.find("#template_copy").data("parentElementId", "template"+json.id+"_zone"+json.zoneid).unbind("click").bind("click", function(event) { - var parentElementId = $(this).data("parentElementId"); - var thisTemplate = $("#"+parentElementId); - var id = thisTemplate.data("templateId"); - var name = thisTemplate.data("name"); - var sourceZoneId = thisTemplate.data("zoneId"); - - populateZoneField($("#dialog_copy_template #copy_template_zone"), sourceZoneId); - - $("#dialog_copy_template #copy_template_name_text").text(name); - - var sourceZoneName = thisTemplate.data("zoneName"); - $("#dialog_copy_template #copy_template_source_zone_text").text(sourceZoneName); - - $("#dialog_copy_template") - .dialog('option', 'buttons', { - "OK": function() { - var thisDialog = $(this); - - var isValid = true; - isValid &= validateDropDownBox("Zone", thisDialog.find("#copy_template_zone"), thisDialog.find("#copy_template_zone_errormsg"), false); //reset error text - if (!isValid) return; - - var destZoneId = thisDialog.find("#copy_template_zone").val(); - thisDialog.dialog("close"); - - var loadingImg = thisTemplate.find(".adding_loading"); - var rowContainer = thisTemplate.find("#row_container"); - loadingImg.find(".adding_text").text("Copying...."); - loadingImg.show(); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=copyTemplate&id="+id+"&sourcezoneid="+sourceZoneId+"&destzoneid="+destZoneId+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.copytemplateresponse.jobid; - var timerKey = "copyTemplateJob"+jobId; - - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.copytemplateresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - $("#dialog_info").html("

    Template download started (ID: "+result.copytemplateresponse[0].id+", Zone: "+fromdb(result.copytemplateresponse[0].zonename)+", Name: "+fromdb(result.copytemplateresponse[0].name)+") . Check the progress...

    ").dialog("open"); - loadingImg.hide(); - rowContainer.show(); - $("#template_type").val("self"); - $("#template_type").change(); - } else if (result.jobstatus == 2) { - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - loadingImg.hide(); - rowContainer.show(); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - }); - template.find("#template_create_vm").data("parentElementId", "template"+json.id+"_zone"+json.zoneid).unbind("click").bind("click", function(event) { - createVMFromTemplateOrISO($(this), "template"); - }); - } - - function createVMFromTemplateOrISO(actionLink, sourceType) { - var parentElementId = actionLink.data("parentElementId"); - var thisTemplate = $("#"+parentElementId); - var name = thisTemplate.data("name"); - var zoneId = thisTemplate.data("zoneId"); - - var id; - var createVmDialog; - if(sourceType == "template") { - id = thisTemplate.data("templateId"); - createVmDialog = $("#dialog_create_vm_from_template"); - } - else { //sourceType == "iso" - id = thisTemplate.data("isoId"); - createVmDialog = $("#dialog_create_vm_from_iso"); - } - createVmDialog.find("#source_name").text(name); - - createVmDialog - .dialog('option', 'buttons', { - "Create": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg"), true); - isValid &= validateString("Group", thisDialog.find("#group"), thisDialog.find("#group_errormsg"), true); - if (!isValid) return; - - thisDialog.dialog("close"); - - var array1 = []; - var name = trim(thisDialog.find("#name").val()); - array1.push("&displayname="+todb(name)); - - var group = trim(thisDialog.find("#group").val()); - array1.push("&group="+todb(group)); - - var serviceOfferingId = thisDialog.find("#service_offering").val(); - array1.push("&serviceOfferingId="+serviceOfferingId); - - var diskOfferingId = thisDialog.find("#disk_offering").val(); - if(diskOfferingId != null && diskOfferingId.length > 0) - array1.push("&diskOfferingId="+diskOfferingId); - - var loadingImg = thisTemplate.find(".adding_loading"); - var rowContainer = thisTemplate.find("#row_container"); - loadingImg.find(".adding_text").text("Creating VM...."); - loadingImg.show(); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=deployVirtualMachine&zoneId="+zoneId+"&templateId="+id+array1.join("")+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.deployvirtualmachineresponse.jobid; - var timerKey = "newVMFromTemplate"+jobId; - - $("body").everyTime( - 10000, - timerKey, - function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+jobId+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - // Succeeded - var htmlMsg; - if (result.virtualmachine[0].passwordenabled == 'true') - htmlMsg = "Your instance from " + fromdb(name) + " has been successfully created. Your new password is : " + result.virtualmachine[0].password + " . Please change it as soon as you log into your new instance"; - else - htmlMsg = "Your instance from " + fromdb(name) + " has been successfully created."; - $("#dialog_info").html(htmlMsg).dialog("open"); - loadingImg.hide(); - rowContainer.show(); - } else if (result.jobstatus == 2) { - // Failed - $("#dialog_info").html("Unable to create your new instance from " + fromdb(name) + " due to the error: " + fromdb(result.jobresult)).dialog("open"); - loadingImg.hide(); - rowContainer.show(); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, - 0 - ); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - } - - - function listTemplates() { - var submenuContent = $("#submenu_content_template"); - - var type = $("#template_type").val(); //my template, featured, community - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(trim(name))); - commandString = "command=listTemplates&page="+currentPage+moreCriteria.join("")+"&templatefilter="+type+"&response=json"; - } else { - var searchInput = $("#submenu_content_template #search_input").val(); //search button - if (searchInput != null && searchInput.length > 0) - commandString = "command=listTemplates&page="+currentPage+"&templatefilter="+type+"&keyword="+searchInput+"&response=json"; - else - commandString = "command=listTemplates&page="+currentPage+"&templatefilter="+type+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listtemplatesresponse", "template", $("#vm_template_template"), templateJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_template"), listTemplates); - - $("#template_type").bind("change", function(event){ - currentPage=1; - event.preventDefault(); - listTemplates(); - }); - - $("#submenu_template").bind("click",function(event){ - event.preventDefault(); - - $(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off"); - currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on"); - currentSubMenu = $(this); - - var submenuContent = $("#submenu_content_template").show(); - $("#submenu_content_iso").hide(); - - currentPage=1; - listTemplates(); - }); - - // *** Template (end) *** - - - - // *** ISO (begin) *** - activateDialog($("#dialog_edit_iso").dialog({ - width:450, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_add_iso").dialog({ - width:450, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - activateDialog($("#dialog_copy_iso").dialog({ - width:300, - autoOpen: false, - modal: true, - zIndex: 2000 - })); - - $("#iso_action_new").show(); - - $("#iso_action_new").bind("click", function(event) { - $("#dialog_add_iso") - .dialog('option', 'buttons', { - "Create": function() { - var thisDialog = $(this); - - // validate values - var isValid = true; - isValid &= validateString("Name", thisDialog.find("#add_iso_name"), thisDialog.find("#add_iso_name_errormsg")); - isValid &= validateString("Display Text", thisDialog.find("#add_iso_display_text"), thisDialog.find("#add_iso_display_text_errormsg")); - isValid &= validateString("URL", thisDialog.find("#add_iso_url"), thisDialog.find("#add_iso_url_errormsg")); - if (!isValid) return; - - var submenuContent = $("#submenu_content_iso"); - var template = $("#vm_iso_template").clone(true); - var loadingImg = template.find(".adding_loading"); - var rowContainer = template.find("#row_container"); - loadingImg.find(".adding_text").text("Adding...."); - loadingImg.show(); - rowContainer.hide(); - submenuContent.find("#grid_content").prepend(template.fadeIn("slow")); - - var name = trim(thisDialog.find("#add_iso_name").val()); - var desc = trim(thisDialog.find("#add_iso_display_text").val()); - var url = trim(thisDialog.find("#add_iso_url").val()); - var zoneId = thisDialog.find("#add_iso_zone").val(); - //var isPublic = thisDialog.find("#add_iso_public").val(); - var isPublic = "false"; //default to private for now - var osType = thisDialog.find("#add_iso_os_type").val(); - var bootable = thisDialog.find("#add_iso_bootable").val(); - var hypervisor = thisDialog.find("#add_iso_hypervisor").val(); - - thisDialog.dialog("close"); - - $.ajax({ - data: createURL("command=registerIso&name="+todb(name)+"&displayText="+todb(desc)+"&url="+encodeURIComponent(url)+"&zoneId="+zoneId+"&isPublic="+isPublic+"&osTypeId="+osType+"&bootable="+bootable+"&hypervisor="+hypervisor+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.registerisoresponse; - if($("#iso_type").val() == "self") { - isoJSONToTemplate(result.iso[0], template); - changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1); - loadingImg.hide(); - rowContainer.show(); - - if(result.iso.length > 1) { - for(var i=1; i is used by all zones. Please confirm you want to delete it from all zones.

    "; - else - htmlMsg = "

    Please confirm you want to delete your ISO "+name+".

    "; - - $("#dialog_confirmation") - .html(htmlMsg) - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - - var loadingImg = thisTemplate.find(".adding_loading"); - var rowContainer = thisTemplate.find("#row_container"); - loadingImg.find(".adding_text").text("Deleting...."); - loadingImg.show(); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=deleteIso&id="+id+moreCriteria.join("")+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.deleteisosresponse.jobid; - var timerKey = "deleteIsoJob"+jobId; - - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.deleteisosresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { //success - that.slideUp("slow", function() { $(this).remove() }); - changeGridRowsTotal($("#submenu_content_iso").find("#grid_rows_total"), -1); - } else if (result.jobstatus == 2) { - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - loadingImg.hide(); - rowContainer.show(); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - }); - - template.find("#iso_copy").data("parentElementId", "iso"+json.id+"_zone"+json.zoneid).bind("click", function(event) { - var moreCriteria = []; - var parentElementId = $(this).data("parentElementId"); - var thisTemplate = $("#"+parentElementId); - var id = thisTemplate.data("isoId"); - var name = thisTemplate.data("name"); - var sourceZoneId = thisTemplate.data("zoneId"); - if (sourceZoneId != null) - moreCriteria.push("&sourcezoneid="+sourceZoneId); - - populateZoneField($("#dialog_copy_iso #copy_iso_zone"), sourceZoneId); - - $("#dialog_copy_iso #copy_iso_name_text").text(name); //ISO name - - var sourceZoneName = thisTemplate.data("zoneName"); - $("#dialog_copy_iso #copy_iso_source_zone_text").text(sourceZoneName); // source zone - - $("#dialog_copy_iso") - .dialog('option', 'buttons', { - "OK": function() { - var thisDialog = $(this); - - var isValid = true; - isValid &= validateDropDownBox("Zone", thisDialog.find("#copy_iso_zone"), thisDialog.find("#copy_iso_zone_errormsg"), false); //reset error text - if (!isValid) return; - - var destZoneId = thisDialog.find("#copy_iso_zone").val(); - thisDialog.dialog("close"); - - var loadingImg = thisTemplate.find(".adding_loading"); - var rowContainer = thisTemplate.find("#row_container"); - loadingImg.find(".adding_text").text("Copying...."); - loadingImg.show(); - rowContainer.hide(); - - $.ajax({ - data: createURL("command=copyIso&id="+id+"&sourcezoneid="+sourceZoneId+"&destzoneid="+destZoneId+"&response=json"), - dataType: "json", - success: function(json) { - var jobId = json.copyisoresponse.jobid; - var timerKey = "copyIsoJob"+jobId; - - $("body").everyTime(2000, timerKey, function() { - $.ajax({ - data: createURL("command=queryAsyncJobResult&jobId="+json.copyisoresponse.jobid+"&response=json"), - dataType: "json", - success: function(json) { - var result = json.queryasyncjobresultresponse; - if (result.jobstatus == 0) { - return; //Job has not completed - } else { - $("body").stopTime(timerKey); - if (result.jobstatus == 1) { - $("#dialog_info").html("

    ISO download started (ID: "+result.copytemplateresponse[0].id+", Zone: "+fromdb(result.copytemplateresponse[0].zonename)+", Name: "+fromdb(result.copytemplateresponse[0].name)+") . Check the progress...

    ").dialog("open"); - loadingImg.hide(); - rowContainer.show(); - currentPage=1; //refresh the whole ISO grid until Keshav changes copyIso to return the newly created ISO. - listIsos(); - } else if (result.jobstatus == 2) { - $("#dialog_alert").html("

    " + fromdb(result.jobresult) + "

    ").dialog("open"); - loadingImg.hide(); - rowContainer.show(); - } - } - }, - error: function(XMLHttpResponse) { - $("body").stopTime(timerKey); - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, 0); - }, - error: function(XMLHttpResponse) { - handleError(XMLHttpResponse); - loadingImg.hide(); - rowContainer.show(); - } - }); - }, - "Cancel": function() { - $(this).dialog("close"); - } - }).dialog("open"); - }); - template.find("#iso_create_vm").data("parentElementId", "iso"+json.id+"_zone"+json.zoneid).bind("click", function(event) { - createVMFromTemplateOrISO($(this), "iso"); - }); - } - //*** isoJSONToTemplate (end) ******************************* - - function listIsos() { - var submenuContent = $("#submenu_content_iso"); - - var type = $("#iso_type").val(); //my template, community - var commandString; - var advanced = submenuContent.find("#search_button").data("advanced"); - if (advanced != null && advanced) { - var name = submenuContent.find("#advanced_search #adv_search_name").val(); - var moreCriteria = []; - if (name!=null && trim(name).length > 0) - moreCriteria.push("&name="+todb(trim(name))); - commandString = "command=listIsos&page="+currentPage+moreCriteria.join("")+"&isofilter="+type+"&response=json"; - } else { - var searchInput = $("#submenu_content_iso #search_input").val(); //keyword - if (searchInput != null && searchInput.length > 0) - commandString = "command=listIsos&page="+currentPage+"&keyword="+searchInput+"&isofilter="+type+"&response=json" - else - commandString = "command=listIsos&page="+currentPage+"&isofilter="+type+"&response=json"; - } - - //listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate); - listItems(submenuContent, commandString, "listisosresponse", "iso", $("#vm_iso_template"), isoJSONToTemplate); - } - - submenuContentEventBinder($("#submenu_content_iso"), listIsos); - - $("#iso_type").bind("change", function(event){ - currentPage=1; - event.preventDefault(); - listIsos(); - }); - - $("#submenu_iso").bind("click", function(event) { - event.preventDefault(); - - $(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off"); - currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on"); - currentSubMenu = $(this); - - var submenuContent = $("#submenu_content_iso").show(); - $("#submenu_content_template").hide(); - - currentPage=1; - listIsos(); - }); - - // *** ISO (end) *** - - - - var currentSubMenu = $("#submenu_template"); - currentSubMenu.click(); - - if(isAdmin()) - $("#dialog_add_template #add_template_featured_container, #dialog_edit_template #edit_template_featured_container").show(); - else - $("#dialog_add_template #add_template_featured_container, #dialog_edit_template #edit_template_featured_container").hide(); -} diff --git a/ui/2.1/scripts/cloud.logger.js b/ui/2.1/scripts/cloud.logger.js deleted file mode 100644 index 895e421ce91..00000000000 --- a/ui/2.1/scripts/cloud.logger.js +++ /dev/null @@ -1,288 +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 . - * - */ - -// Version: 1.9.1.152 - -// -// Javascript logger utility -// Author -// Kelven Yang -// 2/25/2010 -// - -function Logger() { - this.bDockEnabled = true; - - this.logWin = null; - this.logger = null; - this.header = null; - - this.bEnabled = true; - this.level = 0; - - this.bMoving = false; - this.offsetStart = {left: 0, top: 0}; - this.ptStart = {x: 0, y: 0}; -} - -Logger.DEFAULT_WIN_HEIGHT = 500; -Logger.LEVEL_TRACE = 0; -Logger.LEVEL_DEBUG = 1; -Logger.LEVEL_INFO = 2; -Logger.LEVEL_WARN = 3; -Logger.LEVEL_ERROR = 4; -Logger.LEVEL_FATAL = 5; -Logger.LEVEL_SYS = 100; - -Logger.prototype = { - - open: function() { - var logger = this; - var logWinMarkup = [ - '
    ', - '
    ', - '
    ', - '', - '', - '', - '
    ', - '', - '
    ', - '
    ', - '
    ', - '', - '', - '
    ', - '
    ', - '
    ', - '
    ' - ].join(''); - - this.logWin = $(logWinMarkup).appendTo(document.body); - this.header = $('.logwin_title:first', this.logWin); - this.logger = $('.logwin_content:first', this.logWin); - - $(".logwin_title", this.logWin).mousedown(function(e) { - if($(e.target).attr('cmd')) - return true; - - if(!logger.bMoving) { - logger.bMoving = true; - logger.offsetStart = logger.logWin.offset(); - logger.ptStart = {x: e.pageX, y: e.pageY}; - - $(document).bind("mousemove", function(e) { - if(logger.bMoving) { - logger.enableDocking(false); - - var logWinNewLeft = logger.offsetStart.left + e.pageX - logger.ptStart.x; - var logWinNewTop = logger.offsetStart.top + e.pageY - logger.ptStart.y; - - logger.logWin.css("left", logWinNewLeft + "px").css("top", logWinNewTop + "px"); - } - return false; - }); - - $(document).bind("mouseup", function(e) { - if(logger.bMoving) { - logger.bMoving = false; - $(document).unbind("mousemove", arguments.callee.name); - $(document).unbind("mouseup", arguments.callee.name); - - return false; - } - return true; - }); - } - - // prevent default handling - return false; - }).dblclick(function(e) { - logger.expand(!logger.isExpanded()); - }); - - this.logWin.click(function(e) { - if($(e.target).attr('cmd')) { - switch($(e.target).attr('cmd')) { - case '1' : - logger.enable(true); - break; - - case '2' : - logger.enable(false); - break; - - case '3' : - logger.clear(); - break; - - case '4' : - logger.enableDocking(true); - logger.dockIn(); - break; - - case '5' : - logger.expand(!logger.isExpanded()); - break; - - default : - break; - } - } - }); - - $("#template_type", this.logWin).change(function(e) { - logger.setLevel(parseInt($(this).val())); - }); - - this.logWin.css("left", (($(document.body).width() - this.logWin.width()) / 2) + "px"); - this.dockIn(); - - this.log(Logger.LEVEL_SYS, "Logger started"); - }, - - dockIn: function() { - var logger = this; - var offset = this.logWin.offset(); - var bottom = offset.top + this.logWin.height(); - var delta = bottom - 2; - - this.logWin.animate({top: (offset.top - delta) + "px"}, 200, - function() { - logger.logWin.unbind("mouseleave"); - logger.logWin.bind("mouseenter", function(e) { - if(logger.bDockEnabled) - logger.dockOut(); - }); - } - ); - }, - - dockOut: function() { - var logger = this; - this.logWin.animate({top: "0px"}, 200, - function() { - logger.logWin.unbind("mouseenter"); - logger.logWin.bind("mouseleave", function(e) { - if(logger.bDockEnabled) { - var xPosInLogWin = e.pageX - logger.logWin.offset().left; - var yPosInLogWin = e.pageY - logger.logWin.offset().top; - - if(xPosInLogWin < 0 || yPosInLogWin < 0 || - xPosInLogWin > logger.logWin.width() || yPosInLogWin > logger.logWin.height()) { - logger.dockIn(); - } - } - }); - } - ); - }, - - enableDocking: function(bEnable) { - this.bDockEnabled = bEnable; - }, - - log: function(level, message) { - // Note : LEVEL_SYS message will always be logged - if(this.logger && (level == Logger.LEVEL_SYS || this.bEnabled && level >= this.level)) { - var curTime = new Date(); - var curTimeString = [ - '', curTime.getMonth(), - '/', curTime.getDate(), - '/', curTime.getYear(), - ' ', - curTime.getHours(), - ':', curTime.getMinutes(), - ":", curTime.getSeconds(), - ".", curTime.getMilliseconds()].join(''); - - this.logger.append(this.getLevelDisplayString(level) + " - " + curTimeString + " - " + message + '
    '); - } - }, - - clear: function() { - if(this.logger) { - this.logger.empty(); - this.log(Logger.LEVEL_SYS, "Logger is cleared"); - } - }, - - setLevel: function(level) { - this.level = level; - - this.log(Logger.LEVEL_SYS, "Set logger trace level to " + this.getLevelDisplayString(level)); - }, - - enable: function(bEnabled) { - this.bEnabled = bEnabled; - - if(bEnabled) - this.log(Logger.LEVEL_SYS, "Logger is enabled"); - else - this.log(Logger.LEVEL_SYS, "Logger is disabled"); - }, - - expand: function(bExpand) { - if(bExpand) { - this.logWin.height(Logger.DEFAULT_WIN_HEIGHT); - this.logger.height(Logger.DEFAULT_WIN_HEIGHT - this.header.height()); - } else { - this.logWin.height(this.header.height()); - this.logger.height(0); - } - }, - - isExpanded: function() { - return this.logWin.height() > this.header.height(); - }, - - getLevelDisplayString: function(level) { - switch(level) { - case Logger.LEVEL_TRACE : - return "TRACE"; - - case Logger.LEVEL_DEBUG : - return "DEBUG"; - - case Logger.LEVEL_INFO : - return "INFO"; - - case Logger.LEVEL_WARN : - return "WARN"; - - case Logger.LEVEL_ERROR : - return "ERROR"; - - case Logger.LEVEL_FATAL : - return "FATAL"; - - case Logger.LEVEL_SYS : - return "SYSINFO"; - } - - return "LEVEL " + level; - } -}; - diff --git a/ui/2.1/scripts/date.js b/ui/2.1/scripts/date.js deleted file mode 100644 index 769a4474846..00000000000 --- a/ui/2.1/scripts/date.js +++ /dev/null @@ -1,127 +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 . - * - */ - -Date.prototype.setISO8601 = function(dString){ - - var regexp = /(\d\d\d\d)(-)?(\d\d)(-)?(\d\d)(T)?(\d\d)(:)?(\d\d)(:)?(\d\d)(\.\d+)?(Z|([+-])(\d\d)(:)?(\d\d))/; - - if (dString.toString().match(new RegExp(regexp))) { - var d = dString.match(new RegExp(regexp)); - var offset = 0; - - this.setUTCDate(1); - this.setUTCFullYear(parseInt(d[1],10)); - this.setUTCMonth(parseInt(d[3],10) - 1); - this.setUTCDate(parseInt(d[5],10)); - this.setUTCHours(parseInt(d[7],10)); - this.setUTCMinutes(parseInt(d[9],10)); - this.setUTCSeconds(parseInt(d[11],10)); - if (d[12]) - this.setUTCMilliseconds(parseFloat(d[12]) * 1000); - else - this.setUTCMilliseconds(0); - if (d[13] != 'Z') { - offset = (d[15] * 60) + parseInt(d[17],10); - offset *= ((d[14] == '-') ? -1 : 1); - this.setTime(this.getTime() - offset * 60 * 1000); - } - } - else { - this.setTime(Date.parse(dString)); - } - return this; -}; - -//***** vmops (begin) *************************************************************** - -/* -This is a hack/temporary solution that lacks calculation of Daylight Saving Time. -We'll fix the problem by getting datetime in a specified timezone (including Daylight Saving Time) from server-side in next release. -*/ -Date.prototype.getTimePlusTimezoneOffset = function(timezoneOffset) { - var milliseconds = this.getTime(); - var s1 = new Date(milliseconds + (timezoneOffset * 60 * 60 * 1000)).toUTCString(); //e.g. "Tue, 08 Jun 2010 19:13:49 GMT", "Tue, 25 May 2010 12:07:01 UTC" - var s2 = s1.substring(s1.indexOf(", ")+2); //e.g. "08 Jun 2010 19:13:49 GMT", "25 May 2010 12:07:01 UTC" - var s3 = s2.substring(0,s2.length-4); //e.g. "08 Jun 2010 19:13:49", "25 May 2010 12:10:16" - return s3; -} - -//***** vmops (end) ***************************************************************** - -Date.prototype.format = function(format) { - var returnStr = ''; - var replace = Date.replaceChars; - for (var i = 0; i < format.length; i++) { - var curChar = format.charAt(i); - if (replace[curChar]) { - returnStr += replace[curChar].call(this); - } else { - returnStr += curChar; - } - } - return returnStr; -}; -Date.replaceChars = { - shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - longMonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - longDays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - - // Day - d: function() { return (this.getDate() < 10 ? '0' : '') + this.getDate(); }, - D: function() { return Date.replaceChars.shortDays[this.getDay()]; }, - j: function() { return this.getDate(); }, - l: function() { return Date.replaceChars.longDays[this.getDay()]; }, - N: function() { return this.getDay() + 1; }, - S: function() { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 3 && this.getDate() != 13 ? 'rd' : 'th'))); }, - w: function() { return this.getDay(); }, - z: function() { return "Not Yet Supported"; }, - // Week - W: function() { return "Not Yet Supported"; }, - // Month - F: function() { return Date.replaceChars.longMonths[this.getMonth()]; }, - m: function() { return (this.getMonth() < 9 ? '0' : '') + (this.getMonth() + 1); }, - M: function() { return Date.replaceChars.shortMonths[this.getMonth()]; }, - n: function() { return this.getMonth() + 1; }, - t: function() { return "Not Yet Supported"; }, - // Year - L: function() { return "Not Yet Supported"; }, - o: function() { return "Not Supported"; }, - Y: function() { return this.getFullYear(); }, - y: function() { return ('' + this.getFullYear()).substr(2); }, - // Time - a: function() { return this.getHours() < 12 ? 'am' : 'pm'; }, - A: function() { return this.getHours() < 12 ? 'AM' : 'PM'; }, - B: function() { return "Not Yet Supported"; }, - g: function() { return this.getHours() % 12 || 12; }, - G: function() { return this.getHours(); }, - h: function() { return ((this.getHours() % 12 || 12) < 10 ? '0' : '') + (this.getHours() % 12 || 12); }, - H: function() { return (this.getHours() < 10 ? '0' : '') + this.getHours(); }, - i: function() { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); }, - s: function() { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); }, - // Timezone - e: function() { return "Not Yet Supported"; }, - I: function() { return "Not Supported"; }, - O: function() { return (-this.getTimezoneOffset() < 0 ? '-' : '+') + (Math.abs(this.getTimezoneOffset() / 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() / 60)) + '00'; }, - T: function() { var m = this.getMonth(); this.setMonth(0); var result = this.toTimeString().replace(/^.+ \(?([^\)]+)\)?$/, '$1'); this.setMonth(m); return result;}, - Z: function() { return -this.getTimezoneOffset() * 60; }, - // Full Date/Time - c: function() { return "Not Yet Supported"; }, - r: function() { return this.toString(); }, - U: function() { return this.getTime() / 1000; } -}; \ No newline at end of file diff --git a/ui/2.1/scripts/jquery-1.4.2.min.js b/ui/2.1/scripts/jquery-1.4.2.min.js deleted file mode 100644 index 7c243080233..00000000000 --- a/ui/2.1/scripts/jquery-1.4.2.min.js +++ /dev/null @@ -1,154 +0,0 @@ -/*! - * jQuery JavaScript Library v1.4.2 - * http://jquery.com/ - * - * Copyright 2010, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2010, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Sat Feb 13 22:33:48 2010 -0500 - */ -(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, -Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& -(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, -a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== -"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, -function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
    a"; -var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, -parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= -false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= -s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, -applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; -else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, -a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== -w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, -cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= -c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); -a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, -function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); -k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), -C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= -e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& -f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; -if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", -e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, -"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, -d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, -e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); -t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| -g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, -CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, -g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, -text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, -setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= -h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== -"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, -h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& -q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; -if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

    ";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); -(function(){var g=s.createElement("div");g.innerHTML="
    ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: -function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= -{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== -"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", -d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? -a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== -1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
    ","
    "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= -c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, -wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, -prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, -this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); -return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, -""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); -return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", -""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= -c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? -c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= -function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= -Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, -"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= -a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= -a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== -"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
    ").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, -serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), -function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, -global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& -e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? -"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== -false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= -false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", -c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| -d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); -g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== -1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== -"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; -if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== -"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| -c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; -this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= -this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, -e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
    "; -a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); -c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, -d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- -f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": -"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in -e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/ui/2.1/scripts/jquery-ui-1.8.2.custom.min.js b/ui/2.1/scripts/jquery-ui-1.8.2.custom.min.js deleted file mode 100644 index c11e844f9b9..00000000000 --- a/ui/2.1/scripts/jquery-ui-1.8.2.custom.min.js +++ /dev/null @@ -1,1012 +0,0 @@ -/*! - * jQuery UI 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI - */ -(function(c){c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.2",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=0)&&c(a).is(":focusable")}})}})(jQuery); -;/*! - * jQuery UI Widget 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Widget - */ -(function(b){var j=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add(this).each(function(){b(this).triggerHandler("remove")});return j.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend({},c.options);b[e][a].prototype= -b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==undefined){h=i;return false}}):this.each(function(){var g= -b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){this.element=b(c).data(this.widgetName,this);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create(); -this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===undefined)return this.options[a];d={};d[a]=c}b.each(d,function(f, -h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a= -b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery); -;/*! - * jQuery UI Mouse 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Mouse - * - * Depends: - * jquery.ui.widget.js - */ -(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&& -this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault(); -return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.browser.safari||a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&& -this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX- -a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); -;/* - * jQuery UI Position 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Position - */ -(function(c){c.ui=c.ui||{};var m=/left|center|right/,n=/top|center|bottom/,p=c.fn.position,q=c.fn.offset;c.fn.position=function(a){if(!a||!a.of)return p.apply(this,arguments);a=c.extend({},a);var b=c(a.of),d=(a.collision||"flip").split(" "),e=a.offset?a.offset.split(" "):[0,0],g,h,i;if(a.of.nodeType===9){g=b.width();h=b.height();i={top:0,left:0}}else if(a.of.scrollTo&&a.of.document){g=b.width();h=b.height();i={top:b.scrollTop(),left:b.scrollLeft()}}else if(a.of.preventDefault){a.at="left top";g=h= -0;i={top:a.of.pageY,left:a.of.pageX}}else{g=b.outerWidth();h=b.outerHeight();i=b.offset()}c.each(["my","at"],function(){var f=(a[this]||"").split(" ");if(f.length===1)f=m.test(f[0])?f.concat(["center"]):n.test(f[0])?["center"].concat(f):["center","center"];f[0]=m.test(f[0])?f[0]:"center";f[1]=n.test(f[1])?f[1]:"center";a[this]=f});if(d.length===1)d[1]=d[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(a.at[0]==="right")i.left+=g;else if(a.at[0]==="center")i.left+= -g/2;if(a.at[1]==="bottom")i.top+=h;else if(a.at[1]==="center")i.top+=h/2;i.left+=e[0];i.top+=e[1];return this.each(function(){var f=c(this),k=f.outerWidth(),l=f.outerHeight(),j=c.extend({},i);if(a.my[0]==="right")j.left-=k;else if(a.my[0]==="center")j.left-=k/2;if(a.my[1]==="bottom")j.top-=l;else if(a.my[1]==="center")j.top-=l/2;j.left=parseInt(j.left);j.top=parseInt(j.top);c.each(["left","top"],function(o,r){c.ui.position[d[o]]&&c.ui.position[d[o]][r](j,{targetWidth:g,targetHeight:h,elemWidth:k, -elemHeight:l,offset:e,my:a.my,at:a.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(j,{using:a.using}))})};c.ui.position={fit:{left:function(a,b){var d=c(window);b=a.left+b.elemWidth-d.width()-d.scrollLeft();a.left=b>0?a.left-b:Math.max(0,a.left)},top:function(a,b){var d=c(window);b=a.top+b.elemHeight-d.height()-d.scrollTop();a.top=b>0?a.top-b:Math.max(0,a.top)}},flip:{left:function(a,b){if(b.at[0]!=="center"){var d=c(window);d=a.left+b.elemWidth-d.width()-d.scrollLeft();var e=b.my[0]==="left"? --b.elemWidth:b.my[0]==="right"?b.elemWidth:0,g=-2*b.offset[0];a.left+=a.left<0?e+b.targetWidth+g:d>0?e-b.targetWidth+g:0}},top:function(a,b){if(b.at[1]!=="center"){var d=c(window);d=a.top+b.elemHeight-d.height()-d.scrollTop();var e=b.my[1]==="top"?-b.elemHeight:b.my[1]==="bottom"?b.elemHeight:0,g=b.at[1]==="top"?b.targetHeight:-b.targetHeight,h=-2*b.offset[1];a.top+=a.top<0?e+b.targetHeight+h:d>0?e+g+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(a,b){if(/static/.test(c.curCSS(a,"position")))a.style.position= -"relative";var d=c(a),e=d.offset(),g=parseInt(c.curCSS(a,"top",true),10)||0,h=parseInt(c.curCSS(a,"left",true),10)||0;e={top:b.top-e.top+g,left:b.left-e.left+h};"using"in b?b.using.call(a,e):d.css(e)};c.fn.offset=function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(){c.offset.setOffset(this,a)});return q.call(this)}}})(jQuery); -;/* - * jQuery UI Draggable 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Draggables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */ -(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== -"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= -this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top- -this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions(); -d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis|| -this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element, -b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this== -a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]|| -0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], -this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top- -(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment== -"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&& -a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"), -10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], -this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft(): -f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.leftthis.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?e:!(e-this.offset.click.left').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options; -if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!= -"HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e=j&&f<=l||h>=j&&h<=l||fl)&&(e>=i&& -e<=k||g>=i&&g<=k||ek);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), -top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= -this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!d(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", -nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var e=0;e');/sw|se|ne|nw/.test(g)&&f.css({zIndex:++a.zIndex});"se"==g&&f.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[g]=".ui-resizable-"+g;this.element.append(f)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== -String)this.handles[i]=d(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=d(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}d(this.handles[i])}};this._renderAxis(this.element);this._handles=d(".ui-resizable-handle",this.element).disableSelection(); -this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();d(this.element).addClass("ui-resizable-autohide").hover(function(){d(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){d(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){d(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()}; -if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(d(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(), -e=this.element;this.resizing=true;this.documentScroll={top:d(document).scrollTop(),left:d(document).scrollLeft()};if(e.is(".ui-draggable")||/absolute/.test(e.css("position")))e.css({position:"absolute",top:c.top,left:c.left});d.browser.opera&&/relative/.test(e.css("position"))&&e.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var g=m(this.helper.css("top"));if(a.containment){c+=d(a.containment).scrollLeft()||0;g+=d(a.containment).scrollTop()||0}this.offset= -this.helper.offset();this.position={left:c,top:g};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:c,top:g};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio: -this.originalSize.width/this.originalSize.height||1;a=d(".ui-resizable-"+this.axis).css("cursor");d("body").css("cursor",a=="auto"?this.axis+"-resize":a);e.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,e=this._change[this.axis];if(!e)return false;c=e.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize", -b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var e=this._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName);e=g&&d.ui.hasScroll(e[0],"left")?0:c.sizeDiff.height; -g={width:c.size.width-(g?0:c.sizeDiff.width),height:c.size.height-e};e=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var f=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(d.extend(g,{top:f,left:e}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}d("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop", -b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(k(b.left))this.position.left=b.left;if(k(b.top))this.position.top=b.top;if(k(b.height))this.size.height=b.height;if(k(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,e=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(e=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(e=="nw"){b.top= -a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,e=k(b.width)&&a.maxWidth&&a.maxWidthb.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(f)b.width=a.minWidth;if(h)b.height=a.minHeight;if(e)b.width=a.maxWidth;if(g)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height, -l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(f&&l)b.left=i-a.minWidth;if(e&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(g&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a');var a=d.browser.msie&&d.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+ -a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return d.extend(this._change.n.apply(this, -arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return d.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){d.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});d.extend(d.ui.resizable, -{version:"1.8.2"});d.ui.plugin.add("resizable","alsoResize",{start:function(){var b=d(this).data("resizable").options,a=function(c){d(c).each(function(){d(this).data("resizable-alsoresize",{width:parseInt(d(this).width(),10),height:parseInt(d(this).height(),10),left:parseInt(d(this).css("left"),10),top:parseInt(d(this).css("top"),10)})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else d.each(b.alsoResize,function(c){a(c)}); -else a(b.alsoResize)},resize:function(){var b=d(this).data("resizable"),a=b.options,c=b.originalSize,e=b.originalPosition,g={height:b.size.height-c.height||0,width:b.size.width-c.width||0,top:b.position.top-e.top||0,left:b.position.left-e.left||0},f=function(h,i){d(h).each(function(){var j=d(this),l=d(this).data("resizable-alsoresize"),p={};d.each((i&&i.length?i:["width","height","top","left"])||["width","height","top","left"],function(n,o){if((n=(l[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(/relative/.test(j.css("position"))&& -d.browser.opera){b._revertToRelativePosition=true;j.css({position:"absolute",top:"auto",left:"auto"})}j.css(p)})};typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?d.each(a.alsoResize,function(h,i){f(h,i)}):f(a.alsoResize)},stop:function(){var b=d(this).data("resizable");if(b._revertToRelativePosition&&d.browser.opera){b._revertToRelativePosition=false;el.css({position:"relative"})}d(this).removeData("resizable-alsoresize-start")}});d.ui.plugin.add("resizable","animate",{stop:function(b){var a= -d(this).data("resizable"),c=a.options,e=a._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName),f=g&&d.ui.hasScroll(e[0],"left")?0:a.sizeDiff.height;g={width:a.size.width-(g?0:a.sizeDiff.width),height:a.size.height-f};f=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(d.extend(g,h&&f?{top:h,left:f}:{}),{duration:c.animateDuration,easing:c.animateEasing, -step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};e&&e.length&&d(e[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});d.ui.plugin.add("resizable","containment",{start:function(){var b=d(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof d?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement= -d(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:d(document),left:0,top:0,width:d(document).width(),height:d(document).height()||document.body.parentNode.scrollHeight}}else{var e=d(a),g=[];d(["Top","Right","Left","Bottom"]).each(function(i,j){g[i]=m(e.css("padding"+j))});b.containerOffset=e.offset();b.containerPosition=e.position();b.containerSize={height:e.innerHeight()-g[3],width:e.innerWidth()-g[1]};c=b.containerOffset; -var f=b.containerSize.height,h=b.containerSize.width;h=d.ui.hasScroll(a,"left")?a.scrollWidth:h;f=d.ui.hasScroll(a)?a.scrollHeight:f;b.parentData={element:a,left:c.left,top:c.top,width:h,height:f}}}},resize:function(b){var a=d(this).data("resizable"),c=a.options,e=a.containerOffset,g=a.position;b=a._aspectRatio||b.shiftKey;var f={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))f=e;if(g.left<(a._helper?e.left:0)){a.size.width+=a._helper?a.position.left-e.left: -a.position.left-f.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?e.left:0}if(g.top<(a._helper?e.top:0)){a.size.height+=a._helper?a.position.top-e.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?e.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-f.left:a.offset.left-f.left)+a.sizeDiff.width);e=Math.abs((a._helper?a.offset.top-f.top:a.offset.top- -e.top)+a.sizeDiff.height);g=a.containerElement.get(0)==a.element.parent().get(0);f=/relative|absolute/.test(a.containerElement.css("position"));if(g&&f)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(e+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-e;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=d(this).data("resizable"),a=b.options,c=b.containerOffset,e=b.containerPosition, -g=b.containerElement,f=d(b.helper),h=f.offset(),i=f.outerWidth()-b.sizeDiff.width;f=f.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f});b._helper&&!a.animate&&/static/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f})}});d.ui.plugin.add("resizable","ghost",{start:function(){var b=d(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25, -display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=d(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=d(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});d.ui.plugin.add("resizable","grid",{resize:function(){var b= -d(this).data("resizable"),a=b.options,c=b.size,e=b.originalSize,g=b.originalPosition,f=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-e.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-e.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a}else if(/^(ne)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}else{if(/^(sw)$/.test(f)){b.size.width=e.width+h;b.size.height= -e.height+a}else{b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}b.position.left=g.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery); -; -/* - * jQuery UI Selectable 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Selectables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */ -(function($) { - -$.widget("ui.selectable", $.ui.mouse, { - options: { - appendTo: 'body', - autoRefresh: true, - distance: 0, - filter: '*', - tolerance: 'touch' - }, - _create: function() { - var self = this; - - this.element.addClass("ui-selectable"); - - this.dragged = false; - - // cache selectee children based on filter - var selectees; - this.refresh = function() { - selectees = $(self.options.filter, self.element[0]); - selectees.each(function() { - var $this = $(this); - var pos = $this.offset(); - $.data(this, "selectable-item", { - element: this, - $element: $this, - left: pos.left, - top: pos.top, - right: pos.left + $this.outerWidth(), - bottom: pos.top + $this.outerHeight(), - startselected: false, - selected: $this.hasClass('ui-selected'), - selecting: $this.hasClass('ui-selecting'), - unselecting: $this.hasClass('ui-unselecting') - }); - }); - }; - this.refresh(); - - this.selectees = selectees.addClass("ui-selectee"); - - this._mouseInit(); - - this.helper = $("
    "); - }, - - destroy: function() { - this.selectees - .removeClass("ui-selectee") - .removeData("selectable-item"); - this.element - .removeClass("ui-selectable ui-selectable-disabled") - .removeData("selectable") - .unbind(".selectable"); - this._mouseDestroy(); - - return this; - }, - - _mouseStart: function(event) { - var self = this; - - this.opos = [event.pageX, event.pageY]; - - if (this.options.disabled) - return; - - var options = this.options; - - this.selectees = $(options.filter, this.element[0]); - - this._trigger("start", event); - - $(options.appendTo).append(this.helper); - // position helper (lasso) - this.helper.css({ - "z-index": 100, - "position": "absolute", - "left": event.clientX, - "top": event.clientY, - "width": 0, - "height": 0 - }); - - if (options.autoRefresh) { - this.refresh(); - } - - this.selectees.filter('.ui-selected').each(function() { - var selectee = $.data(this, "selectable-item"); - selectee.startselected = true; - if (!event.metaKey) { - selectee.$element.removeClass('ui-selected'); - selectee.selected = false; - selectee.$element.addClass('ui-unselecting'); - selectee.unselecting = true; - // selectable UNSELECTING callback - self._trigger("unselecting", event, { - unselecting: selectee.element - }); - } - }); - - $(event.target).parents().andSelf().each(function() { - var selectee = $.data(this, "selectable-item"); - if (selectee) { - var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected'); - selectee.$element - .removeClass(doSelect ? "ui-unselecting" : "ui-selected") - .addClass(doSelect ? "ui-selecting" : "ui-unselecting"); - selectee.unselecting = !doSelect; - selectee.selecting = doSelect; - selectee.selected = doSelect; - // selectable (UN)SELECTING callback - if (doSelect) { - self._trigger("selecting", event, { - selecting: selectee.element - }); - } else { - self._trigger("unselecting", event, { - unselecting: selectee.element - }); - } - return false; - } - }); - - }, - - _mouseDrag: function(event) { - var self = this; - this.dragged = true; - - if (this.options.disabled) - return; - - var options = this.options; - - var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY; - if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; } - if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; } - this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1}); - - this.selectees.each(function() { - var selectee = $.data(this, "selectable-item"); - //prevent helper from being selected if appendTo: selectable - if (!selectee || selectee.element == self.element[0]) - return; - var hit = false; - if (options.tolerance == 'touch') { - hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) ); - } else if (options.tolerance == 'fit') { - hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2); - } - - if (hit) { - // SELECT - if (selectee.selected) { - selectee.$element.removeClass('ui-selected'); - selectee.selected = false; - } - if (selectee.unselecting) { - selectee.$element.removeClass('ui-unselecting'); - selectee.unselecting = false; - } - if (!selectee.selecting) { - selectee.$element.addClass('ui-selecting'); - selectee.selecting = true; - // selectable SELECTING callback - self._trigger("selecting", event, { - selecting: selectee.element - }); - } - } else { - // UNSELECT - if (selectee.selecting) { - if (event.metaKey && selectee.startselected) { - selectee.$element.removeClass('ui-selecting'); - selectee.selecting = false; - selectee.$element.addClass('ui-selected'); - selectee.selected = true; - } else { - selectee.$element.removeClass('ui-selecting'); - selectee.selecting = false; - if (selectee.startselected) { - selectee.$element.addClass('ui-unselecting'); - selectee.unselecting = true; - } - // selectable UNSELECTING callback - self._trigger("unselecting", event, { - unselecting: selectee.element - }); - } - } - if (selectee.selected) { - if (!event.metaKey && !selectee.startselected) { - selectee.$element.removeClass('ui-selected'); - selectee.selected = false; - - selectee.$element.addClass('ui-unselecting'); - selectee.unselecting = true; - // selectable UNSELECTING callback - self._trigger("unselecting", event, { - unselecting: selectee.element - }); - } - } - } - }); - - return false; - }, - - _mouseStop: function(event) { - var self = this; - - this.dragged = false; - - var options = this.options; - - $('.ui-unselecting', this.element[0]).each(function() { - var selectee = $.data(this, "selectable-item"); - selectee.$element.removeClass('ui-unselecting'); - selectee.unselecting = false; - selectee.startselected = false; - self._trigger("unselected", event, { - unselected: selectee.element - }); - }); - $('.ui-selecting', this.element[0]).each(function() { - var selectee = $.data(this, "selectable-item"); - selectee.$element.removeClass('ui-selecting').addClass('ui-selected'); - selectee.selecting = false; - selectee.selected = true; - selectee.startselected = true; - self._trigger("selected", event, { - selected: selectee.element - }); - }); - this._trigger("stop", event); - - this.helper.remove(); - - return false; - } - -}); - -$.extend($.ui.selectable, { - version: "1.8.2" -}); - -})(jQuery); -(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), -selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("
    ")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, -c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting"); -b.unselecting=true;f._trigger("unselecting",c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f= -this;this.dragged=true;if(!this.options.disabled){var d=this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); -this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this, -arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem= -c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset, -{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment(); -if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start", -a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); -if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a, -c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]== -document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate", -null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem): -d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c}, -_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")},_getDragHorizontalDirection:function(){var a= -this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)? -h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"), -b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)? -i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h=0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement, -c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height= -this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()- -parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0], -this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b= -1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update", -g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity", -this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()==location.href.toLowerCase()}},_create:function(){var a=this.options,b=this;this.running=0;this.element.addClass("ui-accordion ui-widget ui-helper-reset"); -this.element.children("li").addClass("ui-accordion-li-fix");this.headers=this.element.find(a.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){c(this).removeClass("ui-state-focus")});this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); -if(a.navigation){var d=this.element.find("a").filter(a.navigationFilter);if(d.length){var f=d.closest(".ui-accordion-header");this.active=f.length?f:d.closest(".ui-accordion-content").prev()}}this.active=this._findActive(this.active||a.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");this.active.next().addClass("ui-accordion-content-active");this._createIcons();this.resize();this.element.attr("role","tablist");this.headers.attr("role", -"tab").bind("keydown",function(g){return b._keydown(g)}).next().attr("role","tabpanel");this.headers.not(this.active||"").attr("aria-expanded","false").attr("tabIndex","-1").next().hide();this.active.length?this.active.attr("aria-expanded","true").attr("tabIndex","0"):this.headers.eq(0).attr("tabIndex","0");c.browser.safari||this.headers.find("a").attr("tabIndex","-1");a.event&&this.headers.bind(a.event+".accordion",function(g){b._clickHandler.call(b,g,this);g.preventDefault()})},_createIcons:function(){var a= -this.options;if(a.icons){c("").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.find(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role").unbind(".accordion").removeData("accordion"); -this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active");if(a.autoHeight||a.fillHeight)b.css("height", -"");return this},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();b&&this._createIcons()}},_keydown:function(a){var b=c.ui.keyCode;if(!(this.options.disabled||a.altKey||a.ctrlKey)){var d=this.headers.length,f=this.headers.index(a.target),g=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:g=this.headers[(f+1)%d];break;case b.LEFT:case b.UP:g=this.headers[(f-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target}, -a.target);a.preventDefault()}if(g){c(a.target).attr("tabIndex","-1");c(g).attr("tabIndex","0");g.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0, -b-c(this).innerHeight()+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a=="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d= -this.options;if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]==this.active[0];d.active=d.collapsible&&b?false:c(".ui-accordion-header",this.element).index(a);if(!(this.running||!d.collapsible&&b)){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").find(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected); -a.next().addClass("ui-accordion-content-active")}e=a.next();f=this.active.next();g={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):e,oldContent:f};d=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(e,f,g,b,d)}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); -this.active.next().addClass("ui-accordion-content-active");var f=this.active.next(),g={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:f},e=this.active=c([]);this._toggle(e,f,g)}},_toggle:function(a,b,d,f,g){var e=this.options,k=this;this.toShow=a;this.toHide=b;this.data=d;var i=function(){if(k)return k._completed.apply(k,arguments)};this._trigger("changestart",null,this.data);this.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&f?{toShow:c([]), -toHide:b,complete:i,down:g,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:i,down:g,autoHeight:e.autoHeight||e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;f=c.ui.accordion.animations;var h=e.duration,j=e.animated;if(j&&!f[j]&&!c.easing[j])j="slide";f[j]||(f[j]=function(l){this.slide(l,{easing:j, -duration:h||700})});f[j](d)}else{if(e.collapsible&&f)a.toggle();else{b.hide();a.show()}i(true)}b.prev().attr("aria-expanded","false").attr("tabIndex","-1").blur();a.prev().attr("aria-expanded","true").attr("tabIndex","0").focus()},_completed:function(a){var b=this.options;this.running=a?0:--this.running;if(!this.running){b.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion, -{version:"1.8.2",animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),f=0,g={},e={},k;b=a.toShow;k=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(i,h){e[h]="hide";i=(""+c.css(a.toShow[0], -h)).match(/^([\d+-.]+)(.*)$/);g[h]={value:i[1],unit:i[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(e,{step:function(i,h){if(h.prop=="height")f=h.end-h.start===0?0:(h.now-h.start)/(h.end-h.start);a.toShow[0].style[h.prop]=f*g[h.prop].value+g[h.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css("width",k);a.toShow.css({overflow:d});a.complete()}})}else a.toHide.animate({height:"hide"}, -a);else a.toShow.animate({height:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); -;/* - * jQuery UI Autocomplete 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Autocomplete - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.position.js - */ -(function(e){e.widget("ui.autocomplete",{options:{minLength:1,delay:300},_create:function(){var a=this,c=this.element[0].ownerDocument;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(d){var b=e.ui.keyCode;switch(d.keyCode){case b.PAGE_UP:a._move("previousPage",d);break;case b.PAGE_DOWN:a._move("nextPage",d);break;case b.UP:a._move("previous",d);d.preventDefault(); -break;case b.DOWN:a._move("next",d);d.preventDefault();break;case b.ENTER:case b.NUMPAD_ENTER:a.menu.active&&d.preventDefault();case b.TAB:if(!a.menu.active)return;a.menu.select(d);break;case b.ESCAPE:a.element.val(a.term);a.close(d);break;case b.LEFT:case b.RIGHT:case b.SHIFT:case b.CONTROL:case b.ALT:case b.COMMAND:case b.COMMAND_RIGHT:case b.INSERT:case b.CAPS_LOCK:case b.END:case b.HOME:break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){a.search(null,d)},a.options.delay); -break}}).bind("focus.autocomplete",function(){a.selectedItem=null;a.previous=a.element.val()}).bind("blur.autocomplete",function(d){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(d);a._change(d)},150)});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=e("
      ").addClass("ui-autocomplete").appendTo("body",c).mousedown(function(){setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(d,b){b=b.item.data("item.autocomplete"); -false!==a._trigger("focus",null,{item:b})&&/^key/.test(d.originalEvent.type)&&a.element.val(b.value)},selected:function(d,b){b=b.item.data("item.autocomplete");false!==a._trigger("select",d,{item:b})&&a.element.val(b.value);a.close(d);d=a.previous;if(a.element[0]!==c.activeElement){a.element.focus();a.previous=d}a.selectedItem=b},blur:function(){a.menu.element.is(":visible")&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");e.fn.bgiframe&&this.menu.element.bgiframe()}, -destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();e.Widget.prototype.destroy.call(this)},_setOption:function(a){e.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource()},_initSource:function(){var a,c;if(e.isArray(this.options.source)){a=this.options.source;this.source=function(d,b){b(e.ui.autocomplete.filter(a,d.term))}}else if(typeof this.options.source=== -"string"){c=this.options.source;this.source=function(d,b){e.getJSON(c,d,b)}}else this.source=this.options.source},search:function(a,c){a=a!=null?a:this.element.val();if(a.length").data("item.autocomplete", -c).append(""+c.label+"").appendTo(a)},_move:function(a,c){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](c);else this.search(null,c)},widget:function(){return this.menu.element}});e.extend(e.ui.autocomplete,{escapeRegex:function(a){return a.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")},filter:function(a,c){var d=new RegExp(e.ui.autocomplete.escapeRegex(c), -"i");return e.grep(a,function(b){return d.test(b.label||b.value||b)})}})})(jQuery); -(function(e){e.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(e(c.target).closest(".ui-menu-item a").length){c.preventDefault();a.select(c)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", --1).mouseenter(function(c){a.activate(c,e(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,c){this.deactivate();if(this.hasScroll()){var d=c.offset().top-this.element.offset().top,b=this.element.attr("scrollTop"),f=this.element.height();if(d<0)this.element.attr("scrollTop",b+d);else d>f&&this.element.attr("scrollTop",b+d-f+c.height())}this.active=c.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:c})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id"); -this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prev().length},last:function(){return this.active&&!this.active.next().length},move:function(a,c,d){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);a.length?this.activate(d,a):this.activate(d,this.element.children(c))}else this.activate(d,this.element.children(c))},nextPage:function(a){if(this.hasScroll())if(!this.active|| -this.last())this.activate(a,this.element.children(":first"));else{var c=this.active.offset().top,d=this.element.height(),b=this.element.children("li").filter(function(){var f=e(this).offset().top-c-d+e(this).height();return f<10&&f>-10});b.length||(b=this.element.children(":last"));this.activate(a,b)}else this.activate(a,this.element.children(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(":last")); -else{var c=this.active.offset().top,d=this.element.height();result=this.element.children("li").filter(function(){var b=e(this).offset().top-c+d-e(this).height();return b<10&&b>-10});result.length||(result=this.element.children(":first"));this.activate(a,result)}else this.activate(a,this.element.children(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()
      ").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":""));d.primary&&b.prepend("");d.secondary&&b.append("");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon"); -this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{_create:function(){this.element.addClass("ui-buttonset");this._init()},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(":button, :submit, :reset, :checkbox, :radio, a, :data(button)").filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()}, -destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery); -;/* - * jQuery UI Dialog 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Dialog - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.button.js - * jquery.ui.draggable.js - * jquery.ui.mouse.js - * jquery.ui.position.js - * jquery.ui.resizable.js - */ -(function(c){c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:"center",resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");var a=this,b=a.options,d=b.title||a.originalTitle||" ",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("
      ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+ -b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("
      ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g), -h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id", -e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"); -a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!== -b.uiDialog[0])d=Math.max(d,c(this).css("z-index"))});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index", -c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;d.next().length&&d.appendTo("body");a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target=== -f[0]&&e.shiftKey){g.focus(1);return false}}});c([]).add(d.find(".ui-dialog-content :tabbable:first")).add(d.find(".ui-dialog-buttonpane :tabbable:first")).add(d).filter(":first").focus();a._trigger("open");a._isOpen=true;return a}},_createButtons:function(a){var b=this,d=false,e=c("
      ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a, -function(g,f){g=c('').text(g).click(function(){f.apply(b.element[0],arguments)}).appendTo(e);c.fn.button&&g.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging"); -b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize,position:f.position,size:f.size}}a=a===undefined?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position"); -a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop", -f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0];a=a||c.ui.dialog.prototype.options.position;if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(e,g){if(+b[e]===b[e]){d[e]=b[e];b[e]= -g}})}else if(typeof a==="object"){if("left"in a){b[0]="left";d[0]=a.left}else if("right"in a){b[0]="right";d[0]=-a.right}if("top"in a){b[1]="top";d[1]=a.top}else if("bottom"in a){b[1]="bottom";d[1]=-a.bottom}}(a=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position({my:b.join(" "),at:b.join(" "),offset:d.join(" "),of:window,collision:"fit",using:function(e){var g=c(this).css(e).offset().top;g<0&&c(this).css("top",e.top-g)}});a||this.uiDialog.hide()},_setOption:function(a, -b){var d=this,e=d.uiDialog,g=e.is(":data(resizable)"),f=false;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");break;case "draggable":b?d._makeDraggable():e.draggable("destroy");break; -case "height":f=true;break;case "maxHeight":g&&e.resizable("option","maxHeight",b);f=true;break;case "maxWidth":g&&e.resizable("option","maxWidth",b);f=true;break;case "minHeight":g&&e.resizable("option","minHeight",b);f=true;break;case "minWidth":g&&e.resizable("option","minWidth",b);f=true;break;case "position":d._position(b);break;case "resizable":g&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title", -d.uiDialogTitlebar).html(""+(b||" "));break;case "width":f=true;break}c.Widget.prototype._setOption.apply(d,arguments);f&&d._size()},_size:function(){var a=this.options,b;this.element.css({width:"auto",minHeight:0,height:0});b=this.uiDialog.css({height:"auto",width:a.width}).height();this.element.css(a.height==="auto"?{minHeight:Math.max(a.minHeight-b,0),height:"auto"}:{minHeight:0,height:Math.max(a.height-b,0)}).show();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight", -this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.2",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&& -c(document).bind(c.ui.dialog.overlay.events,function(d){return c(d.target).zIndex()>=c.ui.dialog.overlay.maxZ})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("
      ").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&& -b.bgiframe();this.instances.push(b);return b},destroy:function(a){this.oldInstances.push(this.instances.splice(c.inArray(a,this.instances),1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var b=0;c.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight, -document.body.offsetHeight);return a");if(!b.values)b.values=[this._valueMin(),this._valueMin()];if(b.values.length&&b.values.length!==2)b.values=[b.values[0],b.values[0]]}else this.range=d("
      ");this.range.appendTo(this.element).addClass("ui-slider-range");if(b.range==="min"||b.range==="max")this.range.addClass("ui-slider-range-"+b.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("").appendTo(this.element).addClass("ui-slider-handle"); -if(b.values&&b.values.length)for(;d(".ui-slider-handle",this.element).length").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur(); -else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),g,h,i;if(!a.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e= -false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");g=a._start(c,f);if(g===false)return}break}i=a.options.step;g=a.options.values&&a.options.values.length?(h=a.values(f)):(h=a.value());switch(c.keyCode){case d.ui.keyCode.HOME:h=a._valueMin();break;case d.ui.keyCode.END:h=a._valueMax();break;case d.ui.keyCode.PAGE_UP:h=a._trimAlignValue(g+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=a._trimAlignValue(g-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(g=== -a._valueMax())return;h=a._trimAlignValue(g+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(g===a._valueMin())return;h=a._trimAlignValue(g-i);break}a._slide(c,f,h);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(c,e);a._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"); -this._mouseDestroy();return this},_mouseCapture:function(a){var b=this.options,c,e,f,g,h,i;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c={x:a.pageX,y:a.pageY};e=this._normValueFromMouse(c);f=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(j){var k=Math.abs(e-h.values(j));if(f>k){f=k;g=d(this);i=j}});if(b.range===true&&this.values(1)===b.min){i+=1;g=d(this.handles[i])}if(this._start(a, -i)===false)return false;this._mouseSliding=true;h._handleIndex=i;g.addClass("ui-state-active").focus();b=g.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-g.width()/2,top:a.pageY-b.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)};e=this._normValueFromMouse(c);this._slide(a,i,e);return this._animateOff=true},_mouseStart:function(){return true}, -_mouseDrag:function(a){var b=this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b; -if(this.orientation==="horizontal"){b=this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value= -this.values(b);c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var e;if(this.options.values&&this.options.values.length){e=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>e||b===1&&c1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;fthis._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=a%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a= -this.options.range,b=this.options,c=this,e=!this._animateOff?b.animate:false,f,g={},h,i,j,k;if(this.options.values&&this.options.values.length)this.handles.each(function(l){f=(c.values(l)-c._valueMin())/(c._valueMax()-c._valueMin())*100;g[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](g,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(l===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},b.animate);if(l===1)c.range[e?"animate":"css"]({width:f- -h+"%"},{queue:false,duration:b.animate})}else{if(l===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},b.animate);if(l===1)c.range[e?"animate":"css"]({height:f-h+"%"},{queue:false,duration:b.animate})}h=f});else{i=this.value();j=this._valueMin();k=this._valueMax();f=k!==j?(i-j)/(k-j)*100:0;g[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](g,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"}, -b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.2"})})(jQuery); -;/* - * jQuery UI Tabs 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Tabs - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(d){function s(){return++u}function v(){return++w}var u=0,w=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
      ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:'
    • #{label}
    • '},_create:function(){this._tabify(true)},_setOption:function(c,e){if(c=="selected")this.options.collapsible&& -e==this.options.selected||this.select(e);else{this.options[c]=e;this._tabify()}},_tabId:function(c){return c.title&&c.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+s()},_sanitizeSelector:function(c){return c.replace(/:/g,"\\:")},_cookie:function(){var c=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+v());return d.cookie.apply(null,[c].concat(d.makeArray(arguments)))},_ui:function(c,e){return{tab:c,panel:e,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var c= -d(this);c.html(c.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function e(g,f){g.css({display:""});!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}this.list=this.element.find("ol,ul").eq(0);this.lis=d("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);var a=this,b=this.options,h=/^#.+/;this.anchors.each(function(g,f){var j=d(f).attr("href"),l=j.split("#")[0],p;if(l&&(l===location.toString().split("#")[0]|| -(p=d("base")[0])&&l===p.href)){j=f.hash;f.href=j}if(h.test(j))a.panels=a.panels.add(a._sanitizeSelector(j));else if(j!="#"){d.data(f,"href.tabs",j);d.data(f,"load.tabs",j.replace(/#.*$/,""));j=a._tabId(f);f.href="#"+j;f=d("#"+j);if(!f.length){f=d(b.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else b.disabled.push(g)});if(c){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); -this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(b.selected===undefined){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){b.selected=g;return false}});if(typeof b.selected!="number"&&b.cookie)b.selected=parseInt(a._cookie(),10);if(typeof b.selected!="number"&&this.lis.filter(".ui-tabs-selected").length)b.selected= -this.lis.index(this.lis.filter(".ui-tabs-selected"));b.selected=b.selected||(this.lis.length?0:-1)}else if(b.selected===null)b.selected=-1;b.selected=b.selected>=0&&this.anchors[b.selected]||b.selected<0?b.selected:0;b.disabled=d.unique(b.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(b.selected,b.disabled)!=-1&&b.disabled.splice(d.inArray(b.selected,b.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); -if(b.selected>=0&&this.anchors.length){this.panels.eq(b.selected).removeClass("ui-tabs-hide");this.lis.eq(b.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[b.selected],a.panels[b.selected]))});this.load(b.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else b.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));this.element[b.collapsible?"addClass": -"removeClass"]("ui-tabs-collapsible");b.cookie&&this._cookie(b.selected,b.cookie);c=0;for(var i;i=this.lis[c];c++)d(i)[d.inArray(c,b.disabled)!=-1&&!d(i).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");b.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(b.event!="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+g)};this.lis.bind("mouseover.tabs", -function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(b.fx)if(d.isArray(b.fx)){m=b.fx[0];o=b.fx[1]}else m=o=b.fx;var q=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",function(){e(f,o);a._trigger("show", -null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},r=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};this.anchors.bind(b.event+".tabs", -function(){var g=this,f=d(this).closest("li"),j=a.panels.filter(":not(.ui-tabs-hide)"),l=d(a._sanitizeSelector(this.hash));if(f.hasClass("ui-tabs-selected")&&!b.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}b.selected=a.anchors.index(this);a.abort();if(b.collapsible)if(f.hasClass("ui-tabs-selected")){b.selected=-1;b.cookie&&a._cookie(b.selected,b.cookie);a.element.queue("tabs",function(){r(g, -j)}).dequeue("tabs");this.blur();return false}else if(!j.length){b.cookie&&a._cookie(b.selected,b.cookie);a.element.queue("tabs",function(){q(g,l)});a.load(a.anchors.index(this));this.blur();return false}b.cookie&&a._cookie(b.selected,b.cookie);if(l.length){j.length&&a.element.queue("tabs",function(){r(g,j)});a.element.queue("tabs",function(){q(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";d.browser.msie&&this.blur()});this.anchors.bind("click.tabs", -function(){return false})},destroy:function(){var c=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(b,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this, -"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});c.cookie&&this._cookie(null,c.cookie);return this},add:function(c,e,a){if(a===undefined)a=this.anchors.length;var b=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,e));c=!c.indexOf("#")?c.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs", -true);var i=d("#"+c);i.length||(i=d(h.panelTemplate).attr("id",c).data("destroy.tabs",true));i.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);i.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);i.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");i.removeClass("ui-tabs-hide"); -this.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[0],b.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(c){var e=this.options,a=this.lis.eq(c).remove(),b=this.panels.eq(c).remove();if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(c+(c+1=c?--h:h});this._tabify();this._trigger("remove", -null,this._ui(a.find("a")[0],b[0]));return this},enable:function(c){var e=this.options;if(d.inArray(c,e.disabled)!=-1){this.lis.eq(c).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=c});this._trigger("enable",null,this._ui(this.anchors[c],this.panels[c]));return this}},disable:function(c){var e=this.options;if(c!=e.selected){this.lis.eq(c).addClass("ui-state-disabled");e.disabled.push(c);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}return this}, -select:function(c){if(typeof c=="string")c=this.anchors.index(this.anchors.filter("[href$="+c+"]"));else if(c===null)c=-1;if(c==-1&&this.options.collapsible)c=this.options.selected;this.anchors.eq(c).trigger(this.options.event+".tabs");return this},load:function(c){var e=this,a=this.options,b=this.anchors.eq(c)[0],h=d.data(b,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(b,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(c).addClass("ui-state-processing"); -if(a.spinner){var i=d("span",b);i.data("label.tabs",i.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){d(e._sanitizeSelector(b.hash)).html(k);e._cleanup();a.cache&&d.data(b,"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[c],e.panels[c]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[c],e.panels[c]));try{a.ajaxOptions.error(k,n,c,b)}catch(m){}}}));e.element.dequeue("tabs");return this}}, -abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(c,e){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.2"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(c,e){var a=this,b=this.options,h=a._rotate||(a._rotate= -function(i){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=b.selected;a.select(++k')}function E(a,b){d.extend(a, -b);for(var c in b)if(b[c]==null||b[c]==undefined)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.2"}});var y=(new Date).getTime();d.extend(J.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]= -f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('
      ')}}, -_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& -b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f== -""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, -c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), -true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor== -Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]); -d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}}, -_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b= -d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; -for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target|| -a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a); -d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&& -d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f, -h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover"); -this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover"); -this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); -a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(), -k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"]; -a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val(): -"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&& -!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth; -b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){a=this._getInst(d(a)[0]); -a.input&&a._selectingMonthYear&&!d.browser.msie&&a.input.focus();a._selectingMonthYear=!a._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a, -"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")|| -this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null; -for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1-1){k=1;l=u;do{e=this._getDaysInMonth(c,k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c, -k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c? -c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear|| -a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay? -new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a)); -n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m, -g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+r+"":f?"":''+r+"";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&& -a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
      '+(c?h:"")+(this._isInRange(a,r)?'":"")+(c?"":h)+"
      ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),G=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var K=this._getDefaultDate(a),H="",C=0;C1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='
      '+(/all|left/.test(t)&&C==0?c? -f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'
      ';var A=k?'":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="=5?' class="ui-datepicker-week-end"':"")+'>'+s[q]+""}x+=A+"";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, -A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var N=0;N";var O=!k?"":'";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,I=B&&!G||!F[0]||j&&qo;O+='";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=O+""}g++;if(g>11){g=0;m++}x+="
      '+this._get(a,"weekHeader")+"
      '+this._get(a,"calculateWeek")(q)+""+(B&&!w?" ":I?''+q.getDate()+ -"":''+q.getDate()+"")+"
      "+(l?""+(i[0]>0&&D==i[1]-1?'
      ':""):"");L+=x}H+=L}H+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': -"");a._keyEvent=false;return H},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='
      ',o="";if(h||!k)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(j+=o+(h||!(k&&l)?" ":""));if(h||!l)j+=''+c+"";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b, -i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?" ":"")+o;j+="
      ";return j},_adjustInstDate:function(a,b,c){var e= -a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a, -"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); -c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, -"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= -function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b)); -return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new J;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.2";window["DP_jQuery_"+y]=d})(jQuery); -;/* - * jQuery UI Progressbar 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Progressbar - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(b){b.widget("ui.progressbar",{options:{value:0},_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this._valueMin(),"aria-valuemax":this._valueMax(),"aria-valuenow":this._value()});this.valueDiv=b("
      ").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); -this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===undefined)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){switch(a){case "value":this.options.value=c;this._refreshValue();this._trigger("change");break}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;if(athis._valueMax())a=this._valueMax();return a}, -_valueMin:function(){return 0},_valueMax:function(){return 100},_refreshValue:function(){var a=this.value();this.valueDiv[a===this._valueMax()?"addClass":"removeClass"]("ui-corner-right").width(a+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.2"})})(jQuery); -;/* - * jQuery UI Effects 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Effects/ - */ -jQuery.effects||function(f){function k(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], -16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return l.transparent;return l[f.trim(c).toLowerCase()]}function q(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return k(b)}function m(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, -a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function n(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in r||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function s(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function j(c,a,b,d){if(typeof c=="object"){d= -a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(f.isFunction(b)){d=b;b=null}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:f.fx.speeds[b]||f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=q(b.elem,a);b.end=k(b.end);b.colorInit= -true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var l={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189, -183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255, -165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},o=["add","remove","toggle"],r={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,d){if(f.isFunction(b)){d=b;b=null}return this.each(function(){var e=f(this),g=e.attr("style")||" ",h=n(m.call(this)),p,t=e.attr("className");f.each(o,function(u, -i){c[i]&&e[i+"Class"](c[i])});p=n(m.call(this));e.attr("className",t);e.animate(s(h,p),a,b,function(){f.each(o,function(u,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)})})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a? -f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===undefined?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.2",save:function(c,a){for(var b=0;b").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"}); -c.css({position:"relative",top:0,left:0})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=j.apply(this,arguments);a={options:a[1],duration:a[2],callback:a[3]};var b=f.effects[c];return b&&!f.fx.off?b.call(this,a):this},_show:f.fn.show,show:function(c){if(!c|| -typeof c=="number"||f.fx.speeds[c])return this._show.apply(this,arguments);else{var a=j.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(!c||typeof c=="number"||f.fx.speeds[c])return this._hide.apply(this,arguments);else{var a=j.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(!c||typeof c=="number"||f.fx.speeds[c]||typeof c=="boolean"||f.isFunction(c))return this.__toggle.apply(this, -arguments);else{var a=j.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c, -a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+ -b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2, -10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)* -a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ -e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); -;/* - * jQuery UI Effects Fold 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Effects/Fold - * - * Depends: - * jquery.effects.core.js - */ -(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100* -f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); -;/* - * jQuery UI Effects Highlight 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Effects/Highlight - * - * Depends: - * jquery.effects.core.js - */ -(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& -this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); -;/* - * jQuery UI Effects Pulsate 1.8.2 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Effects/Pulsate - * - * Depends: - * jquery.effects.core.js - */ -(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); -b.dequeue()})})}})(jQuery); -; \ No newline at end of file diff --git a/ui/2.1/scripts/jquery.cookies.js b/ui/2.1/scripts/jquery.cookies.js deleted file mode 100644 index 6036754e815..00000000000 --- a/ui/2.1/scripts/jquery.cookies.js +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Cookie plugin - * - * Copyright (c) 2006 Klaus Hartl (stilbuero.de) - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - */ - -/** - * Create a cookie with the given name and value and other optional parameters. - * - * @example $.cookie('the_cookie', 'the_value'); - * @desc Set the value of a cookie. - * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); - * @desc Create a cookie with all available options. - * @example $.cookie('the_cookie', 'the_value'); - * @desc Create a session cookie. - * @example $.cookie('the_cookie', null); - * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain - * used when the cookie was set. - * - * @param String name The name of the cookie. - * @param String value The value of the cookie. - * @param Object options An object literal containing key/value pairs to provide optional cookie attributes. - * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. - * If a negative value is specified (e.g. a date in the past), the cookie will be deleted. - * If set to null or omitted, the cookie will be a session cookie and will not be retained - * when the the browser exits. - * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). - * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). - * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will - * require a secure protocol (like HTTPS). - * @type undefined - * - * @name $.cookie - * @cat Plugins/Cookie - * @author Klaus Hartl/klaus.hartl@stilbuero.de - */ - -/** - * Get the value of a cookie with the given name. - * - * @example $.cookie('the_cookie'); - * @desc Get the value of a cookie. - * - * @param String name The name of the cookie. - * @return The value of the cookie. - * @type String - * - * @name $.cookie - * @cat Plugins/Cookie - * @author Klaus Hartl/klaus.hartl@stilbuero.de - */ -jQuery.cookie = function(name, value, options) { - if (typeof value != 'undefined') { // name and value given, set cookie - options = options || {}; - if (value === null) { - value = ''; - options.expires = -1; - } - var expires = ''; - if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { - var date; - if (typeof options.expires == 'number') { - date = new Date(); - date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); - } else { - date = options.expires; - } - expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE - } - // CAUTION: Needed to parenthesize options.path and options.domain - // in the following expressions, otherwise they evaluate to undefined - // in the packed version for some reason... - var path = options.path ? '; path=' + (options.path) : ''; - var domain = options.domain ? '; domain=' + (options.domain) : ''; - var secure = options.secure ? '; secure' : ''; - document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); - } else { // only name given, get cookie - var cookieValue = null; - if (document.cookie && document.cookie != '') { - var cookies = document.cookie.split(';'); - for (var i = 0; i < cookies.length; i++) { - var cookie = jQuery.trim(cookies[i]); - // Does this cookie string begin with the name we want? - if (cookie.substring(0, name.length + 1) == (name + '=')) { - cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); - break; - } - } - } - return cookieValue; - } -}; \ No newline at end of file diff --git a/ui/2.1/scripts/jquery.md5.js b/ui/2.1/scripts/jquery.md5.js deleted file mode 100644 index 54885ab451d..00000000000 --- a/ui/2.1/scripts/jquery.md5.js +++ /dev/null @@ -1,229 +0,0 @@ - /** - * jQuery MD5 hash algorithm function - * - * - * Calculate the md5 hash of a String - * String $.md5 ( String str ) - * - * - * Calculates the MD5 hash of str using the » RSA Data Security, Inc. MD5 Message-Digest Algorithm, and returns that hash. - * MD5 (Message-Digest algorithm 5) is a widely-used cryptographic hash function with a 128-bit hash value. MD5 has been employed in a wide variety of security applications, and is also commonly used to check the integrity of data. The generated hash is also non-reversable. Data cannot be retrieved from the message digest, the digest uniquely identifies the data. - * MD5 was developed by Professor Ronald L. Rivest in 1994. Its 128 bit (16 byte) message digest makes it a faster implementation than SHA-1. - * This script is used to process a variable length message into a fixed-length output of 128 bits using the MD5 algorithm. It is fully compatible with UTF-8 encoding. It is very useful when u want to transfer encrypted passwords over the internet. If you plan using UTF-8 encoding in your project don't forget to set the page encoding to UTF-8 (Content-Type meta tag). - * This function orginally get from the WebToolkit and rewrite for using as the jQuery plugin. - * - * Example - * Code - * - * $.md5("I'm Persian."); - * - * Result - * - * "b8c901d0f02223f9761016cfff9d68df" - * - * - * @alias Muhammad Hussein Fattahizadeh < muhammad [AT] semnanweb [DOT] com > - * @link http://www.semnanweb.com/jquery-plugin/md5.html - * @see http://www.webtoolkit.info/ - * @license http://www.gnu.org/licenses/gpl.html [GNU General Public License] - * @param {jQuery} {md5:function(string)) - * @return string - */ - - (function($){ - - var rotateLeft = function(lValue, iShiftBits) { - return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); - } - - var addUnsigned = function(lX, lY) { - var lX4, lY4, lX8, lY8, lResult; - lX8 = (lX & 0x80000000); - lY8 = (lY & 0x80000000); - lX4 = (lX & 0x40000000); - lY4 = (lY & 0x40000000); - lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); - if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8); - if (lX4 | lY4) { - if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); - else return (lResult ^ 0x40000000 ^ lX8 ^ lY8); - } else { - return (lResult ^ lX8 ^ lY8); - } - } - - var F = function(x, y, z) { - return (x & y) | ((~ x) & z); - } - - var G = function(x, y, z) { - return (x & z) | (y & (~ z)); - } - - var H = function(x, y, z) { - return (x ^ y ^ z); - } - - var I = function(x, y, z) { - return (y ^ (x | (~ z))); - } - - var FF = function(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - }; - - var GG = function(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - }; - - var HH = function(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - }; - - var II = function(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - }; - - var convertToWordArray = function(string) { - var lWordCount; - var lMessageLength = string.length; - var lNumberOfWordsTempOne = lMessageLength + 8; - var lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64; - var lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16; - var lWordArray = Array(lNumberOfWords - 1); - var lBytePosition = 0; - var lByteCount = 0; - while (lByteCount < lMessageLength) { - lWordCount = (lByteCount - (lByteCount % 4)) / 4; - lBytePosition = (lByteCount % 4) * 8; - lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition)); - lByteCount++; - } - lWordCount = (lByteCount - (lByteCount % 4)) / 4; - lBytePosition = (lByteCount % 4) * 8; - lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); - lWordArray[lNumberOfWords - 2] = lMessageLength << 3; - lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; - return lWordArray; - }; - - var wordToHex = function(lValue) { - var WordToHexValue = "", WordToHexValueTemp = "", lByte, lCount; - for (lCount = 0; lCount <= 3; lCount++) { - lByte = (lValue >>> (lCount * 8)) & 255; - WordToHexValueTemp = "0" + lByte.toString(16); - WordToHexValue = WordToHexValue + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, 2); - } - return WordToHexValue; - }; - - var uTF8Encode = function(string) { - string = string.replace(/\x0d\x0a/g, "\x0a"); - var output = ""; - for (var n = 0; n < string.length; n++) { - var c = string.charCodeAt(n); - if (c < 128) { - output += String.fromCharCode(c); - } else if ((c > 127) && (c < 2048)) { - output += String.fromCharCode((c >> 6) | 192); - output += String.fromCharCode((c & 63) | 128); - } else { - output += String.fromCharCode((c >> 12) | 224); - output += String.fromCharCode(((c >> 6) & 63) | 128); - output += String.fromCharCode((c & 63) | 128); - } - } - return output; - }; - - $.extend({ - md5: function(string) { - var x = Array(); - var k, AA, BB, CC, DD, a, b, c, d; - var S11=7, S12=12, S13=17, S14=22; - var S21=5, S22=9 , S23=14, S24=20; - var S31=4, S32=11, S33=16, S34=23; - var S41=6, S42=10, S43=15, S44=21; - string = uTF8Encode(string); - x = convertToWordArray(string); - a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476; - for (k = 0; k < x.length; k += 16) { - AA = a; BB = b; CC = c; DD = d; - a = FF(a, b, c, d, x[k+0], S11, 0xD76AA478); - d = FF(d, a, b, c, x[k+1], S12, 0xE8C7B756); - c = FF(c, d, a, b, x[k+2], S13, 0x242070DB); - b = FF(b, c, d, a, x[k+3], S14, 0xC1BDCEEE); - a = FF(a, b, c, d, x[k+4], S11, 0xF57C0FAF); - d = FF(d, a, b, c, x[k+5], S12, 0x4787C62A); - c = FF(c, d, a, b, x[k+6], S13, 0xA8304613); - b = FF(b, c, d, a, x[k+7], S14, 0xFD469501); - a = FF(a, b, c, d, x[k+8], S11, 0x698098D8); - d = FF(d, a, b, c, x[k+9], S12, 0x8B44F7AF); - c = FF(c, d, a, b, x[k+10], S13, 0xFFFF5BB1); - b = FF(b, c, d, a, x[k+11], S14, 0x895CD7BE); - a = FF(a, b, c, d, x[k+12], S11, 0x6B901122); - d = FF(d, a, b, c, x[k+13], S12, 0xFD987193); - c = FF(c, d, a, b, x[k+14], S13, 0xA679438E); - b = FF(b, c, d, a, x[k+15], S14, 0x49B40821); - a = GG(a, b, c, d, x[k+1], S21, 0xF61E2562); - d = GG(d, a, b, c, x[k+6], S22, 0xC040B340); - c = GG(c, d, a, b, x[k+11], S23, 0x265E5A51); - b = GG(b, c, d, a, x[k+0], S24, 0xE9B6C7AA); - a = GG(a, b, c, d, x[k+5], S21, 0xD62F105D); - d = GG(d, a, b, c, x[k+10], S22, 0x2441453); - c = GG(c, d, a, b, x[k+15], S23, 0xD8A1E681); - b = GG(b, c, d, a, x[k+4], S24, 0xE7D3FBC8); - a = GG(a, b, c, d, x[k+9], S21, 0x21E1CDE6); - d = GG(d, a, b, c, x[k+14], S22, 0xC33707D6); - c = GG(c, d, a, b, x[k+3], S23, 0xF4D50D87); - b = GG(b, c, d, a, x[k+8], S24, 0x455A14ED); - a = GG(a, b, c, d, x[k+13], S21, 0xA9E3E905); - d = GG(d, a, b, c, x[k+2], S22, 0xFCEFA3F8); - c = GG(c, d, a, b, x[k+7], S23, 0x676F02D9); - b = GG(b, c, d, a, x[k+12], S24, 0x8D2A4C8A); - a = HH(a, b, c, d, x[k+5], S31, 0xFFFA3942); - d = HH(d, a, b, c, x[k+8], S32, 0x8771F681); - c = HH(c, d, a, b, x[k+11], S33, 0x6D9D6122); - b = HH(b, c, d, a, x[k+14], S34, 0xFDE5380C); - a = HH(a, b, c, d, x[k+1], S31, 0xA4BEEA44); - d = HH(d, a, b, c, x[k+4], S32, 0x4BDECFA9); - c = HH(c, d, a, b, x[k+7], S33, 0xF6BB4B60); - b = HH(b, c, d, a, x[k+10], S34, 0xBEBFBC70); - a = HH(a, b, c, d, x[k+13], S31, 0x289B7EC6); - d = HH(d, a, b, c, x[k+0], S32, 0xEAA127FA); - c = HH(c, d, a, b, x[k+3], S33, 0xD4EF3085); - b = HH(b, c, d, a, x[k+6], S34, 0x4881D05); - a = HH(a, b, c, d, x[k+9], S31, 0xD9D4D039); - d = HH(d, a, b, c, x[k+12], S32, 0xE6DB99E5); - c = HH(c, d, a, b, x[k+15], S33, 0x1FA27CF8); - b = HH(b, c, d, a, x[k+2], S34, 0xC4AC5665); - a = II(a, b, c, d, x[k+0], S41, 0xF4292244); - d = II(d, a, b, c, x[k+7], S42, 0x432AFF97); - c = II(c, d, a, b, x[k+14], S43, 0xAB9423A7); - b = II(b, c, d, a, x[k+5], S44, 0xFC93A039); - a = II(a, b, c, d, x[k+12], S41, 0x655B59C3); - d = II(d, a, b, c, x[k+3], S42, 0x8F0CCC92); - c = II(c, d, a, b, x[k+10], S43, 0xFFEFF47D); - b = II(b, c, d, a, x[k+1], S44, 0x85845DD1); - a = II(a, b, c, d, x[k+8], S41, 0x6FA87E4F); - d = II(d, a, b, c, x[k+15], S42, 0xFE2CE6E0); - c = II(c, d, a, b, x[k+6], S43, 0xA3014314); - b = II(b, c, d, a, x[k+13], S44, 0x4E0811A1); - a = II(a, b, c, d, x[k+4], S41, 0xF7537E82); - d = II(d, a, b, c, x[k+11], S42, 0xBD3AF235); - c = II(c, d, a, b, x[k+2], S43, 0x2AD7D2BB); - b = II(b, c, d, a, x[k+9], S44, 0xEB86D391); - a = addUnsigned(a, AA); - b = addUnsigned(b, BB); - c = addUnsigned(c, CC); - d = addUnsigned(d, DD); - } - var tempValue = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d); - return tempValue.toLowerCase(); - } - }); - })(jQuery); diff --git a/ui/2.1/scripts/jquery.timers.js b/ui/2.1/scripts/jquery.timers.js deleted file mode 100644 index bb51157d405..00000000000 --- a/ui/2.1/scripts/jquery.timers.js +++ /dev/null @@ -1,138 +0,0 @@ -/** - * jQuery.timers - Timer abstractions for jQuery - * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com) - * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/). - * Date: 2009/10/16 - * - * @author Blair Mitchelmore - * @version 1.2 - * - **/ - -jQuery.fn.extend({ - everyTime: function(interval, label, fn, times) { - return this.each(function() { - jQuery.timer.add(this, interval, label, fn, times); - }); - }, - oneTime: function(interval, label, fn) { - return this.each(function() { - jQuery.timer.add(this, interval, label, fn, 1); - }); - }, - stopTime: function(label, fn) { - return this.each(function() { - jQuery.timer.remove(this, label, fn); - }); - } -}); - -jQuery.extend({ - timer: { - global: [], - guid: 1, - dataKey: "jQuery.timer", - regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/, - powers: { - // Yeah this is major overkill... - 'ms': 1, - 'cs': 10, - 'ds': 100, - 's': 1000, - 'das': 10000, - 'hs': 100000, - 'ks': 1000000 - }, - timeParse: function(value) { - if (value == undefined || value == null) - return null; - var result = this.regex.exec(jQuery.trim(value.toString())); - if (result[2]) { - var num = parseFloat(result[1]); - var mult = this.powers[result[2]] || 1; - return num * mult; - } else { - return value; - } - }, - add: function(element, interval, label, fn, times) { - var counter = 0; - - if (jQuery.isFunction(label)) { - if (!times) - times = fn; - fn = label; - label = interval; - } - - interval = jQuery.timer.timeParse(interval); - - if (typeof interval != 'number' || isNaN(interval) || interval < 0) - return; - - if (typeof times != 'number' || isNaN(times) || times < 0) - times = 0; - - times = times || 0; - - var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {}); - - if (!timers[label]) - timers[label] = {}; - - fn.timerID = fn.timerID || this.guid++; - - var handler = function() { - if ((++counter > times && times !== 0) || fn.call(element, counter) === false) - jQuery.timer.remove(element, label, fn); - }; - - handler.timerID = fn.timerID; - - if (!timers[label][fn.timerID]) - timers[label][fn.timerID] = window.setInterval(handler,interval); - - this.global.push( element ); - - }, - remove: function(element, label, fn) { - var timers = jQuery.data(element, this.dataKey), ret; - - if ( timers ) { - - if (!label) { - for ( label in timers ) - this.remove(element, label, fn); - } else if ( timers[label] ) { - if ( fn ) { - if ( fn.timerID ) { - window.clearInterval(timers[label][fn.timerID]); - delete timers[label][fn.timerID]; - } - } else { - for ( var fn in timers[label] ) { - window.clearInterval(timers[label][fn]); - delete timers[label][fn]; - } - } - - for ( ret in timers[label] ) break; - if ( !ret ) { - ret = null; - delete timers[label]; - } - } - - for ( ret in timers ) break; - if ( !ret ) - jQuery.removeData(element, this.dataKey); - } - } - } -}); - -jQuery(window).bind("unload", function() { - jQuery.each(jQuery.timer.global, function(index, item) { - jQuery.timer.remove(item); - }); -}); diff --git a/ui/css/main.css b/ui/css/main.css index 05a7509b616..a5f36c50c26 100644 --- a/ui/css/main.css +++ b/ui/css/main.css @@ -226,7 +226,7 @@ a:hover { } .loginoptions_dropdownbutton { - width: 109px; + width: 139px; height:21px; float:left; position:relative; @@ -243,7 +243,7 @@ a:hover { } .loginoptions_dropdownbutton p{ - width:78px; + width:105px; height:auto; float:left; color:#2c8bbc; @@ -267,7 +267,7 @@ a:hover { } .loginoptions_dropdown { - width:91px; + width:120px; height:auto; float:left; position:absolute; @@ -279,7 +279,7 @@ a:hover { } .loginoptions_dropdown ul{ - width:73px; + width:110px; height:auto; float:left; margin:3px 0 0 5px; @@ -288,7 +288,7 @@ a:hover { } .loginoptions_dropdown li{ - width:80px; + width:106px; height:auto; float:left; color:#333; @@ -1056,7 +1056,7 @@ a:hover { .rev_wiztemplistbox { width:508px; - height:auto; + height:35px; float:left; border-bottom:1px solid #999; margin:0; @@ -1064,6 +1064,7 @@ a:hover { background:#FFF repeat top left; cursor:pointer; cursor:hand; + overflow:hidden; } .rev_wiztemplistbox:hover { @@ -1072,7 +1073,7 @@ a:hover { .rev_wiztemplistbox_selected { width:508px; - height:auto; + height:35px; float:left; border-bottom:1px solid #999; margin:0; @@ -1080,6 +1081,7 @@ a:hover { background:#8fe0f4 repeat top left; cursor:pointer; cursor:hand; + overflow:hidden; } @@ -1113,7 +1115,7 @@ a:hover { .rev_wiztemp_listtext { width:460px; - height:auto; + height:15px; float:left; color:#021a28; font-size:11px; @@ -1121,11 +1123,12 @@ a:hover { text-align:left; margin:5px 0 0 0; padding:0; + overflow:hidden; } .rev_wiztemp_hypervisortext { width:318px; - height:auto; + height:14px; float:left; color:#525252; font-size:10px; @@ -1134,11 +1137,12 @@ a:hover { margin:2px 0 0 33px; display:inline; padding:0; + overflow:hidden; } .rev_wiztemp_ownertext { - width:110px; - height:auto; + width:130px; + height:14px; float:left; color:#666; font-size:10px; @@ -1146,6 +1150,7 @@ a:hover { text-align:left; margin:0px 0 0 0; padding:0; + overflow:hidden; } .rev_wiztemp_ownertext span { color:#666; @@ -1575,9 +1580,7 @@ a:hover { border-bottom:1px solid #FFF; margin:0; padding:0; - overflow-x:scoll; - overflow-x:auto; - overflow-y:hidden; + overflow:hidden; } .leftmenu_expandedlist{ @@ -3463,7 +3466,7 @@ a:hover.search_button { float:right; position:absolute; background:#99b2c3 url(../images/gridheader_loadingbg.gif) repeat-x top left; - border-left:1px solid #999; + border: 1px solid #999; padding:0 5px 0 0; z-index:1001; right:0; diff --git a/ui/images/loginoptions_dropdownbutton.png b/ui/images/loginoptions_dropdownbutton.png index ba150042924..a0161645a5f 100644 Binary files a/ui/images/loginoptions_dropdownbutton.png and b/ui/images/loginoptions_dropdownbutton.png differ diff --git a/ui/images/loginoptions_dropdownbutton_hover.png b/ui/images/loginoptions_dropdownbutton_hover.png index 60159850e28..80b47d2ec9a 100644 Binary files a/ui/images/loginoptions_dropdownbutton_hover.png and b/ui/images/loginoptions_dropdownbutton_hover.png differ diff --git a/ui/images/midmenuicon_storage_iso.png b/ui/images/midmenuicon_iso.png similarity index 100% rename from ui/images/midmenuicon_storage_iso.png rename to ui/images/midmenuicon_iso.png diff --git a/ui/images/search_closeicon.gif b/ui/images/search_closeicon.gif index c6148ab69d0..fed08fc9ee4 100644 Binary files a/ui/images/search_closeicon.gif and b/ui/images/search_closeicon.gif differ diff --git a/ui/images/search_closeicon_hover.gif b/ui/images/search_closeicon_hover.gif index f011186d669..8980f90ed4f 100644 Binary files a/ui/images/search_closeicon_hover.gif and b/ui/images/search_closeicon_hover.gif differ diff --git a/ui/index.jsp b/ui/index.jsp index 762145fadb3..b9aa6377781 100644 --- a/ui/index.jsp +++ b/ui/index.jsp @@ -114,23 +114,23 @@
      -

      English

      +

      -

      Default Theme

      +

      @@ -161,20 +161,6 @@

      ,

      -
      @@ -189,7 +175,7 @@
    • @@ -462,7 +448,7 @@ -
      + @@ -732,12 +718,6 @@
      diff --git a/ui/jsp/account.jsp b/ui/jsp/account.jsp index 9d134ae0156..e3aa0358da5 100644 --- a/ui/jsp/account.jsp +++ b/ui/jsp/account.jsp @@ -1,20 +1,15 @@ -<%@ page import="java.util.*" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> + + + + -<%@ page import="com.cloud.utils.*" %> - -<% - Locale browserLocale = request.getLocale(); - CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale); -%> - - -
      -

      - Accounts

      +

      - <%=t.t("Details")%>
      +
      - <%=t.t("Users")%>
      +
      (title)
      -
      - <%=t.t("ID")%>:
      + :
      @@ -66,7 +61,7 @@
      - <%=t.t("Role")%>:
      + :
      @@ -76,7 +71,7 @@
      - Account Name:
      + :
      @@ -88,7 +83,7 @@
      - <%=t.t("Domain")%>:
      + :
      @@ -98,7 +93,7 @@
      - <%=t.t("VMs")%>:
      + :
      @@ -108,7 +103,7 @@
      - <%=t.t("IPs")%>:
      + :
      @@ -118,7 +113,7 @@
      - <%=t.t("Bytes.Received")%>:
      + :
      @@ -128,7 +123,7 @@
      - <%=t.t("Bytes.Sent")%>:
      + :
      @@ -138,7 +133,7 @@
      - <%=t.t("State")%>:
      + :
      @@ -147,8 +142,8 @@
      - - + +
      @@ -157,7 +152,7 @@
      @@ -172,18 +167,18 @@
      @@ -205,7 +200,7 @@

      - Waiting … +

      @@ -213,14 +208,14 @@
      - ID:
      + :
      @@ -230,7 +225,7 @@
      - User Name:
      + :
      @@ -240,7 +235,7 @@
      - State:
      + :
      @@ -250,7 +245,7 @@
      - API Key:
      + :
      @@ -260,7 +255,7 @@
      - Secret Key:
      + :
      @@ -270,7 +265,7 @@
      - Account Name:
      + :
      @@ -280,7 +275,7 @@
      - Role:
      + :
      @@ -290,7 +285,7 @@
      - Domain:
      + :
      @@ -300,7 +295,7 @@
      - Email:
      + :
      @@ -310,7 +305,7 @@
      - First Name:
      + :
      @@ -320,7 +315,7 @@
      - Last Name:
      + :
      @@ -330,7 +325,7 @@
      - Timezone:
      + :
      @@ -343,33 +338,33 @@