From 7fcd0314d8c67c399909889741c3f4acce5200a7 Mon Sep 17 00:00:00 2001 From: kishan Date: Thu, 20 Jan 2011 16:51:53 +0530 Subject: [PATCH 001/151] bug 6414, 6513: do not send host alerts when conole proxy or ssvm goes down status 6414, 6513: resolved fixed --- .../com/cloud/agent/manager/AgentManagerImpl.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) 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 { From 75fa8493244d761eb83ce36384b0b7cffdc66d53 Mon Sep 17 00:00:00 2001 From: nit Date: Thu, 20 Jan 2011 17:28:12 +0530 Subject: [PATCH 002/151] bug 7418,7706 : listisos - removing domainid = -1 for system isos. Adding the created attr. status 7418,7706 : resolved fixed --- server/src/com/cloud/api/ApiResponseHelper.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index e3db40ed3a4..4c65555ffa4 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -1848,7 +1848,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 +1862,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); From d1aa043aba227679f68de621aee44348f30c6a0b Mon Sep 17 00:00:00 2001 From: nit Date: Thu, 20 Jan 2011 20:38:43 +0530 Subject: [PATCH 003/151] bug 7525: Cleaning up primary storage stats from op_host_Capacity(reflected on dashboard) when primary storage is deleted. status 7525 : resolved fixed --- .../src/com/cloud/capacity/dao/CapacityDao.java | 4 +++- .../com/cloud/capacity/dao/CapacityDaoImpl.java | 15 ++++++++++++--- .../com/cloud/storage/StorageManagerImpl.java | 17 +++++++++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) mode change 100644 => 100755 server/src/com/cloud/capacity/dao/CapacityDao.java mode change 100644 => 100755 server/src/com/cloud/capacity/dao/CapacityDaoImpl.java 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/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 9392e449d0b..1daedf8dcab 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -73,6 +73,7 @@ import com.cloud.api.commands.PreparePrimaryStorageForMaintenanceCmd; import com.cloud.api.commands.UpdateStoragePoolCmd; import com.cloud.async.AsyncInstanceCreateStatus; import com.cloud.async.AsyncJobManager; +import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.Config; @@ -1413,6 +1414,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 +1464,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 +1473,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); From 94ec7bf27ac9bd9ff8dde2a233b74b0e9fdb3d11 Mon Sep 17 00:00:00 2001 From: kishan Date: Thu, 20 Jan 2011 21:49:20 +0530 Subject: [PATCH 004/151] bug 7842: events refactoring. Still wrok in progress --- .../com/cloud/api/commands/DeployVMCmd.java | 2 +- api/src/com/cloud/event/ActionEvent.java | 1 + api/src/com/cloud/user/UserContext.java | 9 ++ server/src/com/cloud/api/ApiDispatcher.java | 35 +---- server/src/com/cloud/api/ApiServer.java | 17 ++- .../configuration/ConfigurationManager.java | 2 - .../ConfigurationManagerImpl.java | 130 +----------------- .../consoleproxy/ConsoleProxyManagerImpl.java | 13 -- .../com/cloud/event/ActionEventCallback.java | 79 +++++------ server/src/com/cloud/event/EventUtils.java | 3 +- .../com/cloud/network/NetworkManagerImpl.java | 43 ------ .../lb/LoadBalancingRulesManagerImpl.java | 24 +--- .../VirtualNetworkApplianceManagerImpl.java | 24 ---- .../cloud/network/rules/RulesManagerImpl.java | 14 -- .../vpn/RemoteAccessVpnManagerImpl.java | 5 - .../cloud/server/ManagementServerImpl.java | 28 +--- .../com/cloud/storage/StorageManagerImpl.java | 20 +-- .../storage/download/DownloadListener.java | 2 - .../storage/download/DownloadMonitorImpl.java | 42 +----- .../SecondaryStorageManagerImpl.java | 24 ---- .../storage/snapshot/SnapshotManagerImpl.java | 36 +---- .../cloud/storage/upload/UploadListener.java | 4 - .../storage/upload/UploadMonitorImpl.java | 40 ------ .../cloud/template/TemplateManagerImpl.java | 80 ----------- .../com/cloud/user/AccountManagerImpl.java | 24 +--- .../src/com/cloud/vm/UserVmManagerImpl.java | 13 +- 26 files changed, 81 insertions(+), 633 deletions(-) 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/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/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/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/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 1251dd75bf2..2719ef0817e 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); diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java index a9163cbeb63..20b6808a205 100644 --- a/server/src/com/cloud/configuration/ConfigurationManager.java +++ b/server/src/com/cloud/configuration/ConfigurationManager.java @@ -184,7 +184,5 @@ public interface ConfigurationManager extends Manager { void createDefaultNetworks(long zoneId) throws ConcurrentOperationException; - Long saveConfigurationEvent(long userId, Long accountId, String type, String description, String... paramsList); - DataCenterVO getZone(long id); } diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index b666a28da25..e82cca54772 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -80,9 +80,6 @@ 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; @@ -115,7 +112,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; @@ -242,7 +238,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 +491,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 +500,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 +527,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 +542,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 +645,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 +727,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 +904,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura checkIfZoneIsDeletable(zoneId); - DataCenterVO zone = _zoneDao.findById(zoneId); - boolean success = _zoneDao.expunge(zoneId); try { @@ -949,7 +929,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; @@ -1134,8 +1113,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura } - 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 +1162,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 +1339,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 +1413,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 +1515,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 +1557,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; @@ -1962,13 +1925,6 @@ 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()); @@ -2028,15 +1984,9 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura 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); @@ -2070,44 +2020,13 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura 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(); - } - // Delete all public IPs in the VLAN if (!deletePublicIPRange(vlanDbId)) { return false; } // 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 @@ -2523,48 +2442,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); @@ -2725,8 +2602,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 +2671,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 +2686,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; diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 1d8a0cb1013..a2169b366ed 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -340,8 +340,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 +361,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 +368,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 +640,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 +647,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 +666,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; } @@ -1171,8 +1163,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 +1185,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 +1193,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); } } } 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/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 5388bcd85ee..d0adcc088db 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -65,8 +65,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; @@ -259,11 +257,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag 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(); @@ -297,8 +290,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag // 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 @@ -333,9 +324,6 @@ 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); } } @@ -524,11 +512,6 @@ 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; @@ -566,9 +549,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag _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()); @@ -604,9 +584,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(); } } @@ -662,9 +639,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - - EventUtils.saveEvent(userId, ip.getAllocatedToAccountId(), EventTypes.EVENT_NET_IP_RELEASE, "released a public ip: " + addr); - return success; } @@ -1455,21 +1429,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } 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); @@ -1725,8 +1684,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag _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()); } } diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index dbf20d78fde..4c2f2229510 100644 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -346,14 +346,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 +361,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); } } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index f73cdd3c462..0fe95b78fd7 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -891,7 +891,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 +932,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 +966,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 +985,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; } diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index 26ad550267d..6001f4e4ce2 100644 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -237,20 +237,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(); - } } } 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/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 60c0fb54fed..feb6db0927a 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -2629,7 +2629,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 +2900,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 +2968,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 +3010,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 +4263,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 +4303,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 +4318,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 +4551,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()) { diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 1daedf8dcab..74d8109884b 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -90,6 +90,7 @@ 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.ActionEvent; import com.cloud.event.Event; import com.cloud.event.EventTypes; import com.cloud.event.EventUtils; @@ -1597,7 +1598,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(); @@ -1755,7 +1756,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; @@ -2263,18 +2264,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{ @@ -2519,7 +2508,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); @@ -2564,8 +2552,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){ 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..5f37ed32fe4 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; @@ -216,12 +213,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 +232,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 @@ -375,8 +359,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 +367,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 +376,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 +388,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; } diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index 044bd672065..b45281c9679 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; @@ -580,12 +578,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); } @@ -750,7 +743,6 @@ public class SnapshotManagerImpl implements SnapshotManager, SnapshotService, Ma _usageEventDao.persist(usageEvent); } - return success; } @@ -928,7 +920,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 +985,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 +1002,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 +1010,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..68bb36cf168 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 @@ -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..6d93131346d 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -840,13 +840,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); } } @@ -1010,12 +1006,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 +1061,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 +1142,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 +1440,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 { diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index d8aeb0c79ea..ad3909c28ab 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -92,6 +92,7 @@ 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; @@ -325,15 +326,12 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } 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 { @@ -361,7 +359,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 +370,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; } } @@ -1603,8 +1598,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); } @@ -1852,7 +1845,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(); @@ -2100,7 +2093,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); From 3a9d6884cefdea0d31fbd8dfd4e0d1adbba6524e Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Wed, 19 Jan 2011 18:14:50 -0800 Subject: [PATCH 005/151] Removed useless code --- server/src/com/cloud/api/doc/Command.java | 10 +- server/src/com/cloud/ha/StorageFence.java | 81 ------- .../src/com/cloud/storage/StorageManager.java | 82 ------- .../com/cloud/storage/StorageManagerImpl.java | 205 +----------------- 4 files changed, 10 insertions(+), 368 deletions(-) delete mode 100644 server/src/com/cloud/ha/StorageFence.java 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/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/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 74d8109884b..36e2db55fd2 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -73,7 +73,6 @@ import com.cloud.api.commands.PreparePrimaryStorageForMaintenanceCmd; import com.cloud.api.commands.UpdateStoragePoolCmd; import com.cloud.async.AsyncInstanceCreateStatus; import com.cloud.async.AsyncJobManager; -import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.Config; @@ -91,10 +90,7 @@ import com.cloud.deploy.DeployDestination; import com.cloud.domain.Domain; 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; -import com.cloud.event.EventVO; import com.cloud.event.UsageEventVO; import com.cloud.event.dao.EventDao; import com.cloud.event.dao.UsageEventDao; @@ -164,7 +160,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; @@ -242,7 +237,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 @@ -299,16 +293,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()); @@ -329,89 +313,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>(); @@ -453,16 +354,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()) { @@ -656,10 +547,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(); @@ -818,12 +705,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) { @@ -894,30 +775,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) { @@ -943,30 +800,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; @@ -1225,15 +1058,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(); @@ -2058,27 +1882,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(); @@ -2540,8 +2343,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); } @@ -2575,7 +2379,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) { @@ -2607,7 +2411,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) { From 57def20cf68458b20aaf5179f7b2bb587e4bd786 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 20 Jan 2011 09:52:32 -0800 Subject: [PATCH 006/151] moved all agent commands to api. --- .../computing/LibvirtComputingResource.java | 12 +- .../cloud/agent/api/AgentControlAnswer.java | 0 .../cloud/agent/api/AgentControlCommand.java | 0 .../com/cloud/agent/api/AttachIsoCommand.java | 0 .../cloud/agent/api/AttachVolumeAnswer.java | 0 .../cloud/agent/api/AttachVolumeCommand.java | 0 .../cloud/agent/api/BackupSnapshotAnswer.java | 0 .../agent/api/BackupSnapshotCommand.java | 0 .../com/cloud/agent/api/CancelCommand.java | 0 .../cloud/agent/api/ChangeAgentAnswer.java | 0 .../cloud/agent/api/ChangeAgentCommand.java | 0 .../cloud/agent/api/CheckHealthAnswer.java | 0 .../cloud/agent/api/CheckHealthCommand.java | 0 .../cloud/agent/api/CheckOnHostAnswer.java | 0 .../cloud/agent/api/CheckOnHostCommand.java | 4 +- .../com/cloud/agent/api/CheckStateAnswer.java | 0 .../cloud/agent/api/CheckStateCommand.java | 0 .../agent/api/CheckVirtualMachineAnswer.java | 0 .../agent/api/CheckVirtualMachineCommand.java | 0 .../agent/api/CleanupNetworkRulesCmd.java | 0 .../ConsoleAccessAuthenticationAnswer.java | 0 .../ConsoleAccessAuthenticationCommand.java | 0 .../api/ConsoleProxyLoadReportCommand.java | 0 ...atePrivateTemplateFromSnapshotCommand.java | 0 ...reatePrivateTemplateFromVolumeCommand.java | 0 .../api/CreateVolumeFromSnapshotAnswer.java | 0 .../api/CreateVolumeFromSnapshotCommand.java | 0 .../src/com/cloud/agent/api/CronCommand.java | 0 .../agent/api/DeleteSnapshotBackupAnswer.java | 0 .../api/DeleteSnapshotBackupCommand.java | 0 .../agent/api/DeleteSnapshotsDirCommand.java | 0 .../agent/api/DeleteStoragePoolCommand.java | 20 +-- .../src/com/cloud/agent/api/FenceAnswer.java | 0 .../src/com/cloud/agent/api/FenceCommand.java | 6 +- .../cloud/agent/api/GetFileStatsAnswer.java | 0 .../cloud/agent/api/GetFileStatsCommand.java | 0 .../cloud/agent/api/GetHostStatsAnswer.java | 0 .../cloud/agent/api/GetHostStatsCommand.java | 0 .../agent/api/GetStorageStatsAnswer.java | 0 .../agent/api/GetStorageStatsCommand.java | 0 .../com/cloud/agent/api/GetVmStatsAnswer.java | 0 .../cloud/agent/api/GetVmStatsCommand.java | 0 .../com/cloud/agent/api/GetVncPortAnswer.java | 0 .../cloud/agent/api/GetVncPortCommand.java | 0 .../com/cloud/agent/api/HostStatsEntry.java | 0 .../com/cloud/agent/api/MaintainAnswer.java | 0 .../com/cloud/agent/api/MaintainCommand.java | 0 .../cloud/agent/api/ManageSnapshotAnswer.java | 0 .../agent/api/ManageSnapshotCommand.java | 0 .../com/cloud/agent/api/MigrateAnswer.java | 0 .../com/cloud/agent/api/MigrateCommand.java | 0 .../cloud/agent/api/ModifySshKeysCommand.java | 0 .../cloud/agent/api/NetworkUsageAnswer.java | 0 .../cloud/agent/api/NetworkUsageCommand.java | 0 .../src/com/cloud/agent/api/PingAnswer.java | 0 .../src/com/cloud/agent/api/PingCommand.java | 0 .../cloud/agent/api/PingRoutingCommand.java | 0 .../api/PingRoutingWithNwGroupsCommand.java | 48 +++++++ .../agent/api/PingRoutingWithOvsCommand.java | 0 .../cloud/agent/api/PingStorageCommand.java | 0 .../com/cloud/agent/api/PingTestCommand.java | 0 .../com/cloud/agent/api/PoolEjectCommand.java | 0 .../agent/api/PrepareForMigrationAnswer.java | 0 .../agent/api/PrepareForMigrationCommand.java | 7 -- .../src/com/cloud/agent/api/ReadyAnswer.java | 0 .../src/com/cloud/agent/api/ReadyCommand.java | 0 .../src/com/cloud/agent/api/RebootAnswer.java | 0 .../com/cloud/agent/api/RebootCommand.java | 0 .../cloud/agent/api/RebootRouterCommand.java | 0 .../api/SecStorageFirewallCfgCommand.java | 57 --------- .../agent/api/SecStorageSetupCommand.java | 0 .../agent/api/SecurityIngressRuleAnswer.java | 0 .../agent/api/SecurityIngressRulesCmd.java | 0 .../src/com/cloud/agent/api/SetupAnswer.java | 0 .../src/com/cloud/agent/api/SetupCommand.java | 0 .../com/cloud/agent/api/ShutdownCommand.java | 0 .../com/cloud/agent/api/SnapshotCommand.java | 0 .../src/com/cloud/agent/api/StartAnswer.java | 0 .../com/cloud/agent/api/StartupAnswer.java | 0 .../com/cloud/agent/api/StartupCommand.java | 0 .../api/StartupExternalFirewallCommand.java | 0 .../StartupExternalLoadBalancerCommand.java | 0 .../cloud/agent/api/StartupProxyCommand.java | 0 .../agent/api/StartupRoutingCommand.java | 2 +- .../agent/api/StartupStorageCommand.java | 0 .../src/com/cloud/agent/api/StopAnswer.java | 0 .../src/com/cloud/agent/api/StopCommand.java | 0 .../com/cloud/agent/api/UpgradeAnswer.java | 0 .../com/cloud/agent/api/UpgradeCommand.java | 0 .../agent/api/ValidateSnapshotAnswer.java | 0 .../agent/api/ValidateSnapshotCommand.java | 0 .../src/com/cloud/agent/api/VmStatsEntry.java | 0 .../cloud/agent/api/check/CheckSshAnswer.java | 0 .../agent/api/check/CheckSshCommand.java | 0 .../proxy/CheckConsoleProxyLoadCommand.java | 0 .../api/proxy/ConsoleProxyLoadAnswer.java | 0 .../cloud/agent/api/proxy/ProxyCommand.java | 0 .../api/proxy/UpdateCertificateCommand.java | 0 .../proxy/WatchConsoleProxyLoadCommand.java | 0 .../routing/RemoteAccessVpnCfgCommand.java | 0 .../api/routing/SavePasswordCommand.java | 0 .../agent/api/routing/UserDataCommand.java | 0 .../agent/api/routing/VpnUsersCfgCommand.java | 0 .../api/storage/AbstractDownloadCommand.java | 0 .../api/storage/AbstractUploadCommand.java | 0 .../agent/api/storage/CopyVolumeAnswer.java | 0 .../agent/api/storage/CopyVolumeCommand.java | 11 +- .../cloud/agent/api/storage/CreateAnswer.java | 0 .../CreateEntityDownloadURLAnswer.java | 0 .../CreateEntityDownloadURLCommand.java | 0 .../storage/CreatePrivateTemplateAnswer.java | 0 .../storage/CreatePrivateTemplateCommand.java | 0 .../DeleteEntityDownloadURLAnswer.java | 0 .../DeleteEntityDownloadURLCommand.java | 0 .../api/storage/DeleteTemplateCommand.java | 1 - .../agent/api/storage/DestroyAnswer.java | 0 .../agent/api/storage/DestroyCommand.java | 10 +- .../agent/api/storage/DownloadAnswer.java | 13 +- .../agent/api/storage/DownloadCommand.java | 6 +- .../api/storage/DownloadProgressCommand.java | 0 .../ManageVolumeAvailabilityAnswer.java | 0 .../ManageVolumeAvailabilityCommand.java | 0 .../storage/PrimaryStorageDownloadAnswer.java | 0 .../PrimaryStorageDownloadCommand.java | 0 .../agent/api/storage/StorageCommand.java | 0 .../agent/api/storage/UpgradeDiskAnswer.java | 0 .../agent/api/storage/UpgradeDiskCommand.java | 0 .../cloud/agent/api/storage/UploadAnswer.java | 17 +-- .../agent/api/storage/UploadCommand.java | 27 ++-- .../api/storage/UploadProgressCommand.java | 0 .../src/com/cloud/agent/api/to/HostTO.java | 4 +- .../com/cloud/agent/api/to/TemplateTO.java | 5 +- api/src/com/cloud/host/Host.java | 38 ++++-- .../src/com/cloud/host/HostEnvironment.java | 0 .../src/com/cloud/host/HostStats.java | 0 api/src/com/cloud/network/Networks.java | 8 ++ .../src/com/cloud/storage/StorageStats.java | 0 .../VMTemplateStorageResourceAssoc.java | 38 +++--- .../src/com/cloud/storage/VolumeStats.java | 0 .../template/VirtualMachineTemplate.java | 6 + {core => api}/src/com/cloud/vm/VmStats.java | 0 core/.classpath | 2 +- .../com/cloud/agent/api/CheckOnVmAnswer.java | 52 -------- .../com/cloud/agent/api/CheckOnVmCommand.java | 41 ------ .../src/com/cloud/agent/api/MirrorAnswer.java | 85 ------------- .../com/cloud/agent/api/MirrorCommand.java | 104 --------------- .../api/PingRoutingWithNwGroupsCommand.java | 111 ---------------- .../api/routing/LoadBalancerCfgCommand.java | 76 ----------- .../cloud/agent/api/storage/ShareAnswer.java | 44 ------- .../cloud/agent/api/storage/ShareCommand.java | 89 ------------- .../VirtualRoutingResource.java | 38 +----- .../com/cloud/agent/transport/Request.java | 118 +++++++++++++++++- core/src/com/cloud/host/HostVO.java | 25 ++-- .../xen/resource/CitrixResourceBase.java | 92 +------------- core/src/com/cloud/network/NetworkEnums.java | 32 ----- .../storage/VMTemplateStoragePoolVO.java | 85 ++++++++----- .../storage/resource/StoragePoolResource.java | 6 +- .../src/com/cloud/server/StatsCollector.java | 25 ++-- .../storage/upload/UploadMonitorImpl.java | 2 +- 159 files changed, 378 insertions(+), 989 deletions(-) rename {core => api}/src/com/cloud/agent/api/AgentControlAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/AgentControlCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/AttachIsoCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/AttachVolumeAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/AttachVolumeCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/BackupSnapshotAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/BackupSnapshotCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/CancelCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/ChangeAgentAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/ChangeAgentCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/CheckHealthAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/CheckHealthCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/CheckOnHostAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/CheckOnHostCommand.java (93%) rename {core => api}/src/com/cloud/agent/api/CheckStateAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/CheckStateCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/CheckVirtualMachineCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/CleanupNetworkRulesCmd.java (100%) rename {core => api}/src/com/cloud/agent/api/ConsoleAccessAuthenticationAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/ConsoleAccessAuthenticationCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/ConsoleProxyLoadReportCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/CreateVolumeFromSnapshotAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/CronCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/DeleteSnapshotBackupAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/DeleteSnapshotBackupCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/DeleteSnapshotsDirCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/DeleteStoragePoolCommand.java (70%) rename {core => api}/src/com/cloud/agent/api/FenceAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/FenceCommand.java (92%) rename {core => api}/src/com/cloud/agent/api/GetFileStatsAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/GetFileStatsCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/GetHostStatsAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/GetHostStatsCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/GetStorageStatsAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/GetStorageStatsCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/GetVmStatsAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/GetVmStatsCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/GetVncPortAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/GetVncPortCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/HostStatsEntry.java (100%) rename {core => api}/src/com/cloud/agent/api/MaintainAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/MaintainCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/ManageSnapshotAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/ManageSnapshotCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/MigrateAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/MigrateCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/ModifySshKeysCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/NetworkUsageAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/NetworkUsageCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/PingAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/PingCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/PingRoutingCommand.java (100%) create mode 100644 api/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java rename {core => api}/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/PingStorageCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/PingTestCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/PoolEjectCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/PrepareForMigrationAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/PrepareForMigrationCommand.java (81%) rename {core => api}/src/com/cloud/agent/api/ReadyAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/ReadyCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/RebootAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/RebootCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/RebootRouterCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/SecStorageFirewallCfgCommand.java (50%) rename {core => api}/src/com/cloud/agent/api/SecStorageSetupCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/SecurityIngressRuleAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/SecurityIngressRulesCmd.java (100%) rename {core => api}/src/com/cloud/agent/api/SetupAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/SetupCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/ShutdownCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/SnapshotCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/StartAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/StartupAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/StartupCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/StartupExternalFirewallCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/StartupExternalLoadBalancerCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/StartupProxyCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/StartupRoutingCommand.java (98%) rename {core => api}/src/com/cloud/agent/api/StartupStorageCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/StopAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/StopCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/UpgradeAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/UpgradeCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/ValidateSnapshotAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/ValidateSnapshotCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/VmStatsEntry.java (100%) rename {core => api}/src/com/cloud/agent/api/check/CheckSshAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/check/CheckSshCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/proxy/CheckConsoleProxyLoadCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/proxy/ConsoleProxyLoadAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/proxy/ProxyCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/proxy/UpdateCertificateCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/proxy/WatchConsoleProxyLoadCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/routing/RemoteAccessVpnCfgCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/routing/SavePasswordCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/routing/UserDataCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/routing/VpnUsersCfgCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/AbstractDownloadCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/AbstractUploadCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/CopyVolumeAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/CopyVolumeCommand.java (87%) rename {core => api}/src/com/cloud/agent/api/storage/CreateAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/CreateEntityDownloadURLAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/CreateEntityDownloadURLCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/CreatePrivateTemplateAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/CreatePrivateTemplateCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/DeleteEntityDownloadURLCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/DeleteTemplateCommand.java (96%) rename {core => api}/src/com/cloud/agent/api/storage/DestroyAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/DestroyCommand.java (85%) rename {core => api}/src/com/cloud/agent/api/storage/DownloadAnswer.java (91%) rename {core => api}/src/com/cloud/agent/api/storage/DownloadCommand.java (94%) rename {core => api}/src/com/cloud/agent/api/storage/DownloadProgressCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/ManageVolumeAvailabilityCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/PrimaryStorageDownloadAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/StorageCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/UpgradeDiskAnswer.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/UpgradeDiskCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/storage/UploadAnswer.java (83%) rename {core => api}/src/com/cloud/agent/api/storage/UploadCommand.java (78%) rename {core => api}/src/com/cloud/agent/api/storage/UploadProgressCommand.java (100%) rename {core => api}/src/com/cloud/agent/api/to/HostTO.java (97%) rename {core => api}/src/com/cloud/agent/api/to/TemplateTO.java (89%) rename {core => api}/src/com/cloud/host/HostEnvironment.java (100%) rename {core => api}/src/com/cloud/host/HostStats.java (100%) rename {core => api}/src/com/cloud/storage/StorageStats.java (100%) rename {core => api}/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java (61%) rename {core => api}/src/com/cloud/storage/VolumeStats.java (100%) rename {core => api}/src/com/cloud/vm/VmStats.java (100%) delete mode 100644 core/src/com/cloud/agent/api/CheckOnVmAnswer.java delete mode 100644 core/src/com/cloud/agent/api/CheckOnVmCommand.java delete mode 100644 core/src/com/cloud/agent/api/MirrorAnswer.java delete mode 100644 core/src/com/cloud/agent/api/MirrorCommand.java delete mode 100644 core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java delete mode 100644 core/src/com/cloud/agent/api/routing/LoadBalancerCfgCommand.java delete mode 100644 core/src/com/cloud/agent/api/storage/ShareAnswer.java delete mode 100644 core/src/com/cloud/agent/api/storage/ShareCommand.java delete mode 100644 core/src/com/cloud/network/NetworkEnums.java diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index e5319d555d8..d9bacc7e84e 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -104,7 +104,6 @@ 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; @@ -165,8 +164,8 @@ 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.TrafficType; import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResourceBase; @@ -798,8 +797,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) { @@ -887,7 +884,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); @@ -2220,8 +2217,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) { 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 100% rename from core/src/com/cloud/agent/api/BackupSnapshotAnswer.java rename to api/src/com/cloud/agent/api/BackupSnapshotAnswer.java 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 100% rename from core/src/com/cloud/agent/api/NetworkUsageCommand.java rename to api/src/com/cloud/agent/api/NetworkUsageCommand.java 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/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/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/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/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/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/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/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/core/.classpath b/core/.classpath index db9b9a922f1..f1a4de71803 100644 --- a/core/.classpath +++ b/core/.classpath @@ -38,6 +38,6 @@ - + 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/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..d52a901fb1d 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -126,7 +126,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 +142,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; @@ -170,7 +167,6 @@ 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; @@ -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) { @@ -1094,63 +1086,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); @@ -3983,15 +3918,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 +4487,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; 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/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/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/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/upload/UploadMonitorImpl.java b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java index 68bb36cf168..b02aec8bf33 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java +++ b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java @@ -154,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); From 5d3bcdeb28e9e841430248e89fc92bbb5cda27b6 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 20 Jan 2011 09:59:08 -0800 Subject: [PATCH 007/151] merge changes --- .../com/cloud/storage/VMTemplateHostVO.java | 85 ++++++++++++------- 1 file changed, 54 insertions(+), 31 deletions(-) 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; + } } From 2ec5bef63f71659d5cfe8e264307660ca16f4d7a Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 20 Jan 2011 10:31:18 -0800 Subject: [PATCH 008/151] eclipse workspace changes --- agent/.classpath | 1 + api/.classpath | 1 + api/src/com/cloud/resource/Concierge.java | 10 ----- client/tomcatconf/components.xml.in | 3 -- console-proxy/.classpath | 2 +- console-viewer/.classpath | 2 +- core/.classpath | 1 + deps/.project | 28 ++++++++----- server/.classpath | 51 ++++++++++++----------- utils/.classpath | 33 ++++++++------- 10 files changed, 65 insertions(+), 67 deletions(-) delete mode 100644 api/src/com/cloud/resource/Concierge.java 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/api/.classpath b/api/.classpath index e52580d102b..dc73036afd7 100644 --- a/api/.classpath +++ b/api/.classpath @@ -5,5 +5,6 @@ + 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/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 f1a4de71803..27c5aa6a984 100644 --- a/core/.classpath +++ b/core/.classpath @@ -39,5 +39,6 @@ + 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/server/.classpath b/server/.classpath index b18c9660ffe..52b60598f7d 100644 --- a/server/.classpath +++ b/server/.classpath @@ -1,25 +1,26 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/utils/.classpath b/utils/.classpath index e1b97740fe8..6248f0c9744 100644 --- a/utils/.classpath +++ b/utils/.classpath @@ -1,16 +1,17 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + From c05ee30a9ea0cbb6dc5a95fb04d3f2dad39092f3 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 20 Jan 2011 10:33:56 -0800 Subject: [PATCH 009/151] missing classpath for deps --- deps/.classpath | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 deps/.classpath diff --git a/deps/.classpath b/deps/.classpath new file mode 100644 index 00000000000..1d025545ca3 --- /dev/null +++ b/deps/.classpath @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From bec7ea4a96952547ab904713e05e54d468c0ef76 Mon Sep 17 00:00:00 2001 From: abhishek Date: Thu, 20 Jan 2011 10:23:45 -0800 Subject: [PATCH 010/151] bug 8069: returning vm display name in list vols for user vms status 8069: resolved fixed --- server/src/com/cloud/api/ApiResponseHelper.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 4c65555ffa4..70b81f92397 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -743,7 +743,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()); } From 8a1ec4ef8e43a2ff669908da7ad6af785d0f2ea5 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 10:55:47 -0800 Subject: [PATCH 011/151] fix a bug that shows in multiple-selection page (e.g. Instance page) when doing search: search result is duplicate. --- ui/scripts/cloud.core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index 2223175b01e..37ec4ce9150 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -934,7 +934,7 @@ function initDialogWithOK(elementId, width1, addToActive) { function createMultipleSelectionSubContainer() { var $multipleSelectionSubContainer = $("
"); - $("#midmenu_container").append($multipleSelectionSubContainer); + $("#midmenu_container").empty().append($multipleSelectionSubContainer); $multipleSelectionSubContainer.selectable({ selecting: function(event, ui) { From 72485f95eac979fedda35d3e58385ef9d719d6da Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 11:13:25 -0800 Subject: [PATCH 012/151] fix a bug that right panel doesn't get refreshed if clicking dashboard first and clicking another page (e.g. My Instances page). --- ui/scripts/cloud.core.init.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/scripts/cloud.core.init.js b/ui/scripts/cloud.core.init.js index 8f1ca9dd976..fcf83dfcd08 100644 --- a/ui/scripts/cloud.core.init.js +++ b/ui/scripts/cloud.core.init.js @@ -167,6 +167,7 @@ $(document).ready(function() { }); $("#right_panel").load("jsp/dashboard.jsp", function(){ + currentRightPanelJSP = "jsp/dashboard.jsp"; afterLoadDashboardJSP(); }); }); From a4cfe20db870dd581f4c0d87a4b0f38b71f38bec Mon Sep 17 00:00:00 2001 From: alena Date: Thu, 20 Jan 2011 11:31:08 -0800 Subject: [PATCH 013/151] bug 7389: implemented listPortForwardingRules by ip/account/domainId. Also fixed broken pagination for this call status 7389: resolved fixed --- .../commands/ListPortForwardingRulesCmd.java | 14 ++++ api/src/com/cloud/user/AccountService.java | 6 ++ .../cloud/network/rules/RulesManagerImpl.java | 44 ++++++++--- .../com/cloud/user/AccountManagerImpl.java | 73 ++++++++++++++----- 4 files changed, 111 insertions(+), 26 deletions(-) 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/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/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index 6001f4e4ce2..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; @@ -337,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()); @@ -347,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/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index 6d93131346d..655d6de54fe 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -1488,28 +1488,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) { + throw new InvalidParameterValueException("AccountName and domainId must be specified together"); + } + //regular user can't create/list resources for other people return caller; } } @@ -1546,4 +1548,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); + } } From b30b75cd18120d1b541f0ecf5f02271f9ede1070 Mon Sep 17 00:00:00 2001 From: abhishek Date: Thu, 20 Jan 2011 11:41:04 -0800 Subject: [PATCH 014/151] bug 8048: preventing returning of volumes attached to destroyed vms, when list vols is executed by normal user status 8048: resolved fixed --- .../com/cloud/server/ManagementServerImpl.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index feb6db0927a..6172d799d71 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -2405,7 +2405,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); + } + } } } From 217b87afb733cefa30a95495799c6c924a01337e Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 11:52:01 -0800 Subject: [PATCH 015/151] IP Address page - DomainAdmin is allowed to manage IP created by a regular user under the same domain. --- ui/scripts/cloud.core.ipaddress.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/scripts/cloud.core.ipaddress.js b/ui/scripts/cloud.core.ipaddress.js index 183cb9eda56..9fc63adfc1a 100644 --- a/ui/scripts/cloud.core.ipaddress.js +++ b/ui/scripts/cloud.core.ipaddress.js @@ -296,7 +296,8 @@ function ipToMidmenu(jsonObj, $midmenuItem1) { } function isIpManageable(domainid, account) { - if((g_domainid == domainid && g_account == account) || (isAdmin() && account!="system")) + if(((g_domainid == domainid && g_account == account) || (g_domainid == domainid && isDomainAdmin()) || (isAdmin())) + && account!="system") return true; else return false; From af3373c4d62b772a35322def38e8dfd1a66ff2e8 Mon Sep 17 00:00:00 2001 From: alena Date: Thu, 20 Jan 2011 11:41:31 -0800 Subject: [PATCH 016/151] Deleted global config parameter direct.network.no.default.route that is no longer in use. --- server/src/com/cloud/configuration/Config.java | 1 - server/src/com/cloud/user/AccountManagerImpl.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index dc32b45da9f..41225640431 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -59,7 +59,6 @@ public enum Config { 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), //VPN diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index 655d6de54fe..af6e0290c06 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -1508,7 +1508,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag return caller; } } else { - if (accountName == null || domainId == null) { + 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 From 31c9cce6c38f7f62a65362e9667a52f414e444cd Mon Sep 17 00:00:00 2001 From: abhishek Date: Thu, 20 Jan 2011 14:21:03 -0800 Subject: [PATCH 017/151] bug 7949: changing security group code to use ids instead of name status 7949: resolved fixed --- api/src/com/cloud/api/ApiConstants.java | 1 + .../AuthorizeSecurityGroupIngressCmd.java | 11 +-- .../api/commands/DeleteSecurityGroupCmd.java | 10 +-- .../RevokeSecurityGroupIngressCmd.java | 11 +-- .../security/SecurityGroupManagerImpl.java | 70 +++++++++---------- 5 files changed, 54 insertions(+), 49 deletions(-) diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 7b9f96a1bcf..ebded15a1bf 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"; 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/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/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/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java index a3d13946595..601043e8091 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(); @@ -1129,7 +1129,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 +1145,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 +1169,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 +1216,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 +1244,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 +1297,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 + "%"); From a63ff737f4737f556ccbd994b10a1d961b363886 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 14:58:09 -0800 Subject: [PATCH 018/151] zone/pod/cluster/host page: add host dialog - hide 5 vmware-related fields. --- ui/jsp/cluster.jsp | 10 +++++----- ui/jsp/host.jsp | 10 +++++----- ui/jsp/pod.jsp | 10 +++++----- ui/jsp/zone.jsp | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/ui/jsp/cluster.jsp b/ui/jsp/cluster.jsp index 84c5b2da6e5..0525fde5c5f 100644 --- a/ui/jsp/cluster.jsp +++ b/ui/jsp/cluster.jsp @@ -189,35 +189,35 @@ -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • diff --git a/ui/jsp/host.jsp b/ui/jsp/host.jsp index 0d9e3174cf1..f309db6a09c 100644 --- a/ui/jsp/host.jsp +++ b/ui/jsp/host.jsp @@ -863,35 +863,35 @@
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • diff --git a/ui/jsp/pod.jsp b/ui/jsp/pod.jsp index 38f81cb3c33..578475b7778 100644 --- a/ui/jsp/pod.jsp +++ b/ui/jsp/pod.jsp @@ -312,35 +312,35 @@
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • diff --git a/ui/jsp/zone.jsp b/ui/jsp/zone.jsp index ab63ac09183..efc4b1707f0 100644 --- a/ui/jsp/zone.jsp +++ b/ui/jsp/zone.jsp @@ -626,35 +626,35 @@
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • From ea1940f30c19e9764844848496de62cef48e2076 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 15:22:17 -0800 Subject: [PATCH 019/151] bug 7949: deleteSecurityGroup API has been changed to take in ID parameter instead of name parameter. Here is related UI change. --- ui/scripts/cloud.core.securitygroup.js | 29 ++------------------------ 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/ui/scripts/cloud.core.securitygroup.js b/ui/scripts/cloud.core.securitygroup.js index dcfe2e31118..44a6e23fef8 100644 --- a/ui/scripts/cloud.core.securitygroup.js +++ b/ui/scripts/cloud.core.securitygroup.js @@ -395,31 +395,6 @@ function doEditSecurityGroup2($actionLink, $detailsTab, $midmenuItem1, $readonly }); } -function doDeleteSecurityGroup($actionLink, $thisTab, $midmenuItem1) { - $("#dialog_info") - .text("Are you sure you want to delete this security group?") - .dialog('option', 'buttons', { - "Confirm": function() { - $(this).dialog("close"); - - var jsonObj = $midmenuItem1.data("jsonObj"); - - var array1 = []; - array1.push("&domainid="+jsonObj.domainid); - array1.push("&account="+jsonObj.account); - array1.push("&name="+jsonObj.name); - - var id = jsonObj.id; - var apiCommand = "command=deleteSecurityGroup" + array1.join(""); - doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $thisTab); - }, - "Cancel": function() { - $(this).dialog("close"); - - } - }).dialog("open"); -} - function securityGroupToMidmenu(jsonObj, $midmenuItem1) { $midmenuItem1.attr("id", getMidmenuId(jsonObj)); $midmenuItem1.data("jsonObj", jsonObj); @@ -659,8 +634,8 @@ var securityGroupActionMap = { dialogBeforeActionFn: doEditSecurityGroup }, "Delete Security Group": { - isAsyncJob: false, - dialogBeforeActionFn: doDeleteSecurityGroup, + api: "deleteSecurityGroup", + isAsyncJob: false, inProcessText: "Deleting Security Group....", afterActionSeccessFn: function(json, $midmenuItem1, id) { $midmenuItem1.slideUp("slow", function() { From e83f58312287cfd79e6ed0e7af92b56b61c1ffb8 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 15:33:41 -0800 Subject: [PATCH 020/151] bug 7949: authorizeSecurityGroupIngress API and revokeSecurityGroupIngress API has been changed to take in ID parameter instead of name parameter. Here is related UI change. --- ui/scripts/cloud.core.securitygroup.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ui/scripts/cloud.core.securitygroup.js b/ui/scripts/cloud.core.securitygroup.js index 44a6e23fef8..d698b1051b2 100644 --- a/ui/scripts/cloud.core.securitygroup.js +++ b/ui/scripts/cloud.core.securitygroup.js @@ -227,7 +227,8 @@ function initAddIngressRuleDialog() { var moreCriteria = []; moreCriteria.push("&domainid=" + domainId); moreCriteria.push("&account=" + account); - moreCriteria.push("&securitygroupname=" + securityGroupName); + //moreCriteria.push("&securitygroupname=" + securityGroupName); + moreCriteria.push("&securitygroupid=" + securityGroupId); if (protocol!=null && protocol.length > 0) moreCriteria.push("&protocol="+encodeURIComponent(protocol)); @@ -564,7 +565,8 @@ function doDeleteIngressRule($actionLink, $subgridItem) { var moreCriteria = []; moreCriteria.push("&domainid="+securityGroupObj.domainid); moreCriteria.push("&account="+securityGroupObj.account); - moreCriteria.push("&securitygroupname="+securityGroupObj.name); + //moreCriteria.push("&securitygroupname="+securityGroupObj.name); + moreCriteria.push("&securitygroupid="+securityGroupObj.id); var protocol = ingressRuleObj.protocol; moreCriteria.push("&protocol="+protocol); From 50c3e04697e0013ccce4e198b1ed78db3ea18b83 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 15:59:28 -0800 Subject: [PATCH 021/151] Security Group page - fix a bug that newly created ingress rule failed to be deleted. --- ui/scripts/cloud.core.securitygroup.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ui/scripts/cloud.core.securitygroup.js b/ui/scripts/cloud.core.securitygroup.js index d698b1051b2..208be679d90 100644 --- a/ui/scripts/cloud.core.securitygroup.js +++ b/ui/scripts/cloud.core.securitygroup.js @@ -218,11 +218,11 @@ function initAddIngressRuleDialog() { $thisDialog.find("#spinning_wheel").show(); - var securitygroupObj = $currentMidmenuItem.data("jsonObj"); - var securityGroupId = securitygroupObj.id; - var domainId = securitygroupObj.domainid; - var account = securitygroupObj.account; - var securityGroupName = securitygroupObj.name; + var securityGroupObj = $currentMidmenuItem.data("jsonObj"); + var securityGroupId = securityGroupObj.id; + var domainId = securityGroupObj.domainid; + var account = securityGroupObj.account; + var securityGroupName = securityGroupObj.name; var moreCriteria = []; moreCriteria.push("&domainid=" + domainId); @@ -294,7 +294,8 @@ function initAddIngressRuleDialog() { var items = result.jobresult.securitygroup.ingressrule; var $subgridItem = $("#ingressrule_tab_template").clone(true); - securityGroupIngressRuleJSONToTemplate(items[0], $subgridItem).data("parentSecurityGroupId", securityGroupId).data("parentSecurityGroupDomainId", domainId).data("parentSecurityGroupAccount", account).data("parentSecurityGroupName",securityGroupName); + //securityGroupIngressRuleJSONToTemplate(items[0], $subgridItem).data("parentSecurityGroupId", securityGroupId).data("parentSecurityGroupDomainId", domainId).data("parentSecurityGroupAccount", account).data("parentSecurityGroupName",securityGroupName); + securityGroupIngressRuleJSONToTemplate(items[0], $subgridItem).data("parentObj", securityGroupObj); $subgridItem.find("#after_action_info").text("Ingress rule was added successfully."); $subgridItem.find("#after_action_info_container").removeClass("error").addClass("success").show(); $("#right_panel_content").find("#tab_content_ingressrule").find("#tab_container").prepend($subgridItem.show()); @@ -302,7 +303,8 @@ function initAddIngressRuleDialog() { if(items.length > 1) { for(var i=1; i Date: Thu, 20 Jan 2011 16:08:58 -0800 Subject: [PATCH 022/151] change text. --- ui/jsp/securitygroup.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/jsp/securitygroup.jsp b/ui/jsp/securitygroup.jsp index 08d6b88d66c..5e35fbc99d5 100644 --- a/ui/jsp/securitygroup.jsp +++ b/ui/jsp/securitygroup.jsp @@ -214,7 +214,7 @@
    - CIDR or Account/Network Group:
    + CIDR or Account/Security Group:
    From 0f48ac413311cb6f0d110bd66f5a9cba3fc85a69 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 16:16:37 -0800 Subject: [PATCH 023/151] Security Group page - API was changed to return icmpType/icmpCode as integer(e.g. 1) instead of string(e.g. "-1"). This is related UI change. --- ui/scripts/cloud.core.securitygroup.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/scripts/cloud.core.securitygroup.js b/ui/scripts/cloud.core.securitygroup.js index 208be679d90..0abddee24c8 100644 --- a/ui/scripts/cloud.core.securitygroup.js +++ b/ui/scripts/cloud.core.securitygroup.js @@ -575,11 +575,11 @@ function doDeleteIngressRule($actionLink, $subgridItem) { if(protocol == "icmp") { var icmpType = ingressRuleObj.icmptype; - if(icmpType != null && icmpType.length > 0) + if(icmpType != null) moreCriteria.push("&icmptype="+encodeURIComponent(icmpType)); var icmpCode = ingressRuleObj.icmpcode; - if(icmpCode != null && icmpCode.length > 0) + if(icmpCode != null) moreCriteria.push("&icmpcode="+encodeURIComponent(icmpCode)); } else { //TCP, UDP From 1634c29e818de7843d7896f38cecc5c11f39beb5 Mon Sep 17 00:00:00 2001 From: will Date: Thu, 20 Jan 2011 15:09:11 -0800 Subject: [PATCH 024/151] - Cleaned up more capabilities related to security groups and to make use of listCapabilities. --- server/src/com/cloud/api/ApiServer.java | 6 ------ ui/scripts/cloud.core.init.js | 8 +++++--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 2719ef0817e..6d29c56e78e 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -668,11 +668,6 @@ public class ApiServer implements HttpRequestHandler { 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()); @@ -683,7 +678,6 @@ public class ApiServer implements HttpRequestHandler { 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/ui/scripts/cloud.core.init.js b/ui/scripts/cloud.core.init.js index fcf83dfcd08..422d07dafc6 100644 --- a/ui/scripts/cloud.core.init.js +++ b/ui/scripts/cloud.core.init.js @@ -687,8 +687,6 @@ $(document).ready(function() { g_timezoneoffset = json.loginresponse.timezoneoffset; if (json.loginresponse.hypervisortype != null) g_hypervisorType = json.loginresponse.hypervisortype; - if (json.loginresponse.directattachsecuritygroupsenabled != null) - g_directAttachSecurityGroupsEnabled = json.loginresponse.directattachsecuritygroupsenabled; $.cookie('sessionKey', g_sessionKey, { expires: 1}); $.cookie('hypervisortype', g_hypervisorType, { expires: 1}); @@ -698,7 +696,6 @@ $(document).ready(function() { $.cookie('role', g_role, { expires: 1}); $.cookie('timezoneoffset', g_timezoneoffset, { expires: 1}); $.cookie('timezone', g_timezone, { expires: 1}); - $.cookie('directattachsecuritygroupsenabled', g_directAttachSecurityGroupsEnabled, { expires: 1}); $.ajax({ data: createURL("command=listCapabilities"), @@ -710,6 +707,11 @@ $(document).ready(function() { $.cookie('userpublictemplateenabled', g_userPublicTemplateEnabled, { expires: 1}); } + if (json.listcapabilitiesresponse.capability.securitygroupsenabled != null) { + g_directAttachSecurityGroupsEnabled = ""+json.listcapabilitiesresponse.capability.securitygroupsenabled; + $.cookie('directattachsecuritygroupsenabled', g_directAttachSecurityGroupsEnabled, { expires: 1}); + } + buildSecondLevelNavigation(); $("#main_username").text(g_username); $("#login_wrapper").hide(); From 775cdfe7c29a7ad4a202a43cf2c8bb4db84fb30f Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 17:01:47 -0800 Subject: [PATCH 025/151] search panel - show close button when middle menu is populated with search result. hide close button otherwise. --- ui/index.jsp | 2 +- ui/scripts/cloud.core.js | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ui/index.jsp b/ui/index.jsp index 762145fadb3..dafd8a9af79 100644 --- a/ui/index.jsp +++ b/ui/index.jsp @@ -189,7 +189,7 @@
  • diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index 37ec4ce9150..6803bdfc8ec 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -988,10 +988,16 @@ function listMidMenuItems2(commandString, getSearchParamsFn, jsonResponse1, json (page > 1)? $("#midmenu_prevbutton").show(): $("#midmenu_prevbutton").hide(); + var searchParams = getSearchParamsFn(); + if(searchParams.length > 0) + $("#search_closebutton").show(); + else + $("#search_closebutton").hide(); + var count = 0; $.ajax({ cache: false, - data: createURL("command="+commandString+getSearchParamsFn()+"&pagesize="+midmenuItemCount+"&page="+page), + data: createURL("command="+commandString+searchParams+"&pagesize="+midmenuItemCount+"&page="+page), dataType: "json", async: false, success: function(json) { From df5d64bb85cd9c863b99a55032f7e1515aeefa1a Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 17:39:28 -0800 Subject: [PATCH 026/151] implement Clear Search function - when clear search button is clicked, remove search text and search result and list all items in middle menu. --- ui/index.jsp | 2 +- ui/scripts/cloud.core.init.js | 7 +++++++ ui/scripts/cloud.core.js | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ui/index.jsp b/ui/index.jsp index dafd8a9af79..c93e7e2e570 100644 --- a/ui/index.jsp +++ b/ui/index.jsp @@ -189,7 +189,7 @@
  • diff --git a/ui/scripts/cloud.core.init.js b/ui/scripts/cloud.core.init.js index 422d07dafc6..a44a671c7d6 100644 --- a/ui/scripts/cloud.core.init.js +++ b/ui/scripts/cloud.core.init.js @@ -343,6 +343,13 @@ $(document).ready(function() { return; } + //clear search + $("#clear_search").unbind("click").bind("click", function(event) { + if($selectedSubMenu != null) + $selectedSubMenu.click(); + return false; + }); + //basic search $("#basic_search").find("#search_input").unbind("keypress").bind("keypress", function(event) { event.stopPropagation(); diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index 6803bdfc8ec..bb0fb7c0430 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -990,9 +990,9 @@ function listMidMenuItems2(commandString, getSearchParamsFn, jsonResponse1, json var searchParams = getSearchParamsFn(); if(searchParams.length > 0) - $("#search_closebutton").show(); + $("#clear_search").show(); else - $("#search_closebutton").hide(); + $("#clear_search").hide(); var count = 0; $.ajax({ From 953c862713df293f8b7e9535ecf0c0f871937d0c Mon Sep 17 00:00:00 2001 From: will Date: Thu, 20 Jan 2011 17:48:58 -0800 Subject: [PATCH 027/151] Removed hypervisor.type from the login response since this capability does make sense anymore in 2.2 --- server/src/com/cloud/api/ApiServer.java | 6 ------ ui/scripts/cloud.core.init.js | 7 ------- ui/scripts/cloud.core.instance.js | 7 ------- ui/scripts/cloud.core.js | 3 --- ui/scripts/cloud.core.resource.js | 5 +++-- ui/scripts/cloud.core.serviceoffering.js | 2 -- ui/scripts/cloud.core.zone.js | 5 +++-- 7 files changed, 6 insertions(+), 29 deletions(-) diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index 6d29c56e78e..924a8b0b019 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -663,11 +663,6 @@ public class ApiServer implements HttpRequestHandler { Account account = _ms.findAccountById(userAcct.getAccountId()); - String hypervisorType = _ms.getConfigurationValue("hypervisor.type"); - if (hypervisorType == null) { - hypervisorType = "kvm"; - } - // set the userId and account object for everyone session.setAttribute("userid", userAcct.getId()); session.setAttribute("username", userAcct.getUsername()); @@ -677,7 +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); if (timezone != null) { session.setAttribute("timezone", timezone); diff --git a/ui/scripts/cloud.core.init.js b/ui/scripts/cloud.core.init.js index a44a671c7d6..f2de32627ee 100644 --- a/ui/scripts/cloud.core.init.js +++ b/ui/scripts/cloud.core.init.js @@ -692,11 +692,8 @@ $(document).ready(function() { g_domainid = json.loginresponse.domainid; g_timezone = json.loginresponse.timezone; g_timezoneoffset = json.loginresponse.timezoneoffset; - if (json.loginresponse.hypervisortype != null) - g_hypervisorType = json.loginresponse.hypervisortype; $.cookie('sessionKey', g_sessionKey, { 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}); @@ -775,7 +772,6 @@ $(document).ready(function() { g_username = $.cookie("username"); g_account = $.cookie("account"); g_domainid = $.cookie("domainid"); - g_hypervisorType = $.cookie("hypervisortype"); g_timezone = $.cookie("timezone"); g_directAttachSecurityGroupsEnabled = $.cookie("directattachsecuritygroupsenabled"); g_userPublicTemplateEnabled = $.cookie("userpublictemplateenabled"); @@ -785,9 +781,6 @@ $(document).ready(function() { else g_timezoneoffset = null; - if (!g_hypervisorType || g_hypervisorType.length == 0) - g_hypervisorType = "kvm"; - if (!g_directAttachSecurityGroupsEnabled || g_directAttachSecurityGroupsEnabled.length == 0) g_directAttachSecurityGroupsEnabled = "false"; diff --git a/ui/scripts/cloud.core.instance.js b/ui/scripts/cloud.core.instance.js index 2a40f9863ad..0c019f60c06 100644 --- a/ui/scripts/cloud.core.instance.js +++ b/ui/scripts/cloud.core.instance.js @@ -1961,11 +1961,9 @@ function vmVolumeJSONToTemplate(json, $template) { buildActionLinkForSubgridItem("Take Snapshot", vmVolumeActionMap, $actionMenu, $template); noAvailableActions = false; - var hasCreateTemplate = false; if(json.type=="ROOT") { //"create template" is allowed(when stopped), "detach disk" is disallowed. if (json.vmstate == "Stopped") { buildActionLinkForSubgridItem("Create Template", vmVolumeActionMap, $actionMenu, $template); - hasCreateTemplate = true; noAvailableActions = false; } } @@ -1974,11 +1972,6 @@ function vmVolumeJSONToTemplate(json, $template) { noAvailableActions = false; } - if (getHypervisorType() == "kvm" && hasCreateTemplate == false) { - buildActionLinkForSubgridItem("Create Template", vmVolumeActionMap, $actionMenu, $template); - noAvailableActions = false; - } - // no available actions if(noAvailableActions == true) { $actionMenu.find("#action_list").append($("#no_available_actions").clone().show()); diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index bb0fb7c0430..9ce254b0b54 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -1217,9 +1217,6 @@ var g_timezoneoffset = null; var g_timezone = null; // capabilities -var g_hypervisorType = "kvm"; -function getHypervisorType() { return g_hypervisorType; } - var g_directAttachSecurityGroupsEnabled = "false"; function getDirectAttachSecurityGroupsEnabled() { return g_directAttachSecurityGroupsEnabled; } diff --git a/ui/scripts/cloud.core.resource.js b/ui/scripts/cloud.core.resource.js index 13bacad7d9c..b234d96f566 100644 --- a/ui/scripts/cloud.core.resource.js +++ b/ui/scripts/cloud.core.resource.js @@ -1629,8 +1629,9 @@ function initAddPrimaryStorageShortcut($midmenuAddLink2, currentPageInRightPanel var $dialogAddPool = $("#dialog_add_pool_in_resource_page"); // if hypervisor is KVM, limit the server option to NFS for now - if (getHypervisorType() == 'kvm') - $dialogAddPool.find("#add_pool_protocol").empty().html(''); + // TODO: Fix this to use the hypervisor from the cluster + //if (getHypervisorType() == 'kvm') + // $dialogAddPool.find("#add_pool_protocol").empty().html(''); bindEventHandlerToDialogAddPool($dialogAddPool); $dialogAddPool.find("#zone_dropdown").bind("change", function(event) { diff --git a/ui/scripts/cloud.core.serviceoffering.js b/ui/scripts/cloud.core.serviceoffering.js index 74d0f5db835..be34909a8b1 100644 --- a/ui/scripts/cloud.core.serviceoffering.js +++ b/ui/scripts/cloud.core.serviceoffering.js @@ -82,8 +82,6 @@ function initAddServiceOfferingDialog() { $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(); - $dialogAddService .dialog('option', 'buttons', { "Add": function() { diff --git a/ui/scripts/cloud.core.zone.js b/ui/scripts/cloud.core.zone.js index bca624bef79..3c9e13ac8aa 100644 --- a/ui/scripts/cloud.core.zone.js +++ b/ui/scripts/cloud.core.zone.js @@ -1358,8 +1358,9 @@ function bindAddPrimaryStorageButtonOnZonePage($button, zoneId, zoneName) { var $dialogAddPool = $("#dialog_add_pool_in_zone_page"); // if hypervisor is KVM, limit the server option to NFS for now - if (getHypervisorType() == 'kvm') - $dialogAddPool.find("#add_pool_protocol").empty().html(''); + // TODO: Fix this to use the hypervisor from the cluster + //if (getHypervisorType() == 'kvm') + // $dialogAddPool.find("#add_pool_protocol").empty().html(''); bindEventHandlerToDialogAddPool($dialogAddPool); var $podSelect = $dialogAddPool.find("#pod_dropdown"); From 1b977acaf9850cd0178986bfb43274d566fa4e27 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 18:16:19 -0800 Subject: [PATCH 028/151] Refresh button - when refresh button is clicked, populate search result again if middle menu is previously populated with search result. --- ui/scripts/cloud.core.init.js | 4 ++-- ui/scripts/cloud.core.js | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/ui/scripts/cloud.core.init.js b/ui/scripts/cloud.core.init.js index f2de32627ee..8012f47561a 100644 --- a/ui/scripts/cloud.core.init.js +++ b/ui/scripts/cloud.core.init.js @@ -358,7 +358,7 @@ $(document).ready(function() { var params = $("#middle_menu_pagination").data("params"); if(params == null) return; - lastSearchType = "basic_search"; + //lastSearchType = "basic_search"; listMidMenuItems2(params.commandString, params.getSearchParamsFn, params.jsonResponse1, params.jsonResponse2, params.toMidmenuFn, params.toRightPanelFn, params.getMidmenuIdFn, params.isMultipleSelectionInMidMenu, 1); } }); @@ -396,7 +396,7 @@ $(document).ready(function() { var params = $("#middle_menu_pagination").data("params"); if(params == null) return; - lastSearchType = "advanced_search"; + //lastSearchType = "advanced_search"; listMidMenuItems2(params.commandString, params.getSearchParamsFn, params.jsonResponse1, params.jsonResponse2, params.toMidmenuFn, params.toRightPanelFn, params.getMidmenuIdFn, params.isMultipleSelectionInMidMenu, 1); } }); diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index 9ce254b0b54..5e4ac8d1f69 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -970,9 +970,12 @@ function getMidmenuId(jsonObj) { return "midmenuItem_" + jsonObj.id; } -var lastSearchType; +//var lastSearchType; var currentCommandString; function listMidMenuItems2(commandString, getSearchParamsFn, jsonResponse1, jsonResponse2, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, page) { + $("#midmenu_container").hide(); + $("#midmenu_spinning_wheel").show(); + var params = { "commandString": commandString, "getSearchParamsFn": getSearchParamsFn, @@ -1046,12 +1049,14 @@ var currentRightPanelJSP = null; function listMidMenuItems(commandString, getSearchParamsFn, jsonResponse1, jsonResponse2, rightPanelJSP, afterLoadRightPanelJSPFn, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, leftmenuId, refreshDataBindingFn) { clearMiddleMenu(); showMiddleMenu(); - $("#midmenu_container").hide(); - $("#midmenu_spinning_wheel").show(); currentLeftMenuId = leftmenuId; $("#right_panel").data("onRefreshFn", function() { - $("#"+leftmenuId).click(); + //$("#"+leftmenuId).click(); + var params = $("#middle_menu_pagination").data("params"); + if(params == null) + return; + listMidMenuItems2(params.commandString, params.getSearchParamsFn, params.jsonResponse1, params.jsonResponse2, params.toMidmenuFn, params.toRightPanelFn, params.getMidmenuIdFn, params.isMultipleSelectionInMidMenu, 1); }); if (currentRightPanelJSP != rightPanelJSP) { From 3a6926e40f0a43336a677b07a9749f814d05cc57 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 20 Jan 2011 18:42:16 -0800 Subject: [PATCH 029/151] bug 6922: instance page - spare an API call when middle menu item is clicked. --- ui/scripts/cloud.core.instance.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/scripts/cloud.core.instance.js b/ui/scripts/cloud.core.instance.js index 0c019f60c06..fbff7164f98 100644 --- a/ui/scripts/cloud.core.instance.js +++ b/ui/scripts/cloud.core.instance.js @@ -1649,7 +1649,8 @@ function vmJsonToDetailsTab(){ var $thisTab = $("#right_panel_content").find("#tab_content_details"); $thisTab.find("#tab_container").hide(); $thisTab.find("#tab_spinning_wheel").show(); - + + /* var id = jsonObj.id; $.ajax({ data: createURL("command=listVirtualMachines&id="+id), @@ -1664,6 +1665,7 @@ function vmJsonToDetailsTab(){ } } }); + */ resetViewConsoleAction(jsonObj, $thisTab); setVmStateInRightPanel(jsonObj.state, $thisTab.find("#state")); From 80e81647a937da76a3d28ee9b94e8d81d9a9049c Mon Sep 17 00:00:00 2001 From: will Date: Fri, 21 Jan 2011 09:49:06 -0800 Subject: [PATCH 030/151] bug 8152: removed security.password.md5hashed as it's no longer being used. --- server/src/com/cloud/configuration/Config.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 41225640431..18d2061a237 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -160,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), From 671cce23ad34f69cbe1226b01da10f675184e4e8 Mon Sep 17 00:00:00 2001 From: alena Date: Fri, 21 Jan 2011 09:37:24 -0800 Subject: [PATCH 031/151] bug 7704: network_rate is a part of network offering now. It's optional parameter; if not specified - global config param is used. status 7704: resolved fixed --- .../com/cloud/agent/api/to/IpAddressTO.java | 8 +++++- api/src/com/cloud/agent/api/to/NicTO.java | 2 +- api/src/com/cloud/api/ApiConstants.java | 1 + .../commands/CreateNetworkOfferingCmd.java | 7 +++++ .../api/response/NetworkOfferingResponse.java | 12 ++++++++ .../configuration/ConfigurationService.java | 4 +++ api/src/com/cloud/vm/NicProfile.java | 10 ++++++- .../xen/resource/CitrixResourceBase.java | 6 ++-- server/src/com/cloud/api/ApiDBUtils.java | 7 +++++ .../src/com/cloud/api/ApiResponseHelper.java | 1 + .../src/com/cloud/configuration/Config.java | 2 +- .../configuration/ConfigurationManager.java | 2 +- .../ConfigurationManagerImpl.java | 21 ++++++++++++++ .../cloud/hypervisor/HypervisorGuruBase.java | 2 +- .../com/cloud/network/NetworkManagerImpl.java | 28 ++++++++++++------- .../VirtualNetworkApplianceManagerImpl.java | 9 +++++- .../cloud/server/ConfigurationServerImpl.java | 6 ++-- 17 files changed, 104 insertions(+), 24 deletions(-) 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/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index ebded15a1bf..d2c3fcc80ff 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -179,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/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/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..e2ad06e1b28 100644 --- a/api/src/com/cloud/configuration/ConfigurationService.java +++ b/api/src/com/cloud/configuration/ConfigurationService.java @@ -184,5 +184,9 @@ public interface ConfigurationService { List searchForNetworkOfferings(ListNetworkOfferingsCmd cmd); boolean deleteNetworkOffering(DeleteNetworkOfferingCmd cmd); + + NetworkOffering getNetworkOffering(long id); + + Integer getNetworkRate(long networkOfferingId); } diff --git a/api/src/com/cloud/vm/NicProfile.java b/api/src/com/cloud/vm/NicProfile.java index 1786e2b2235..d4f7b70010d 100644 --- a/api/src/com/cloud/vm/NicProfile.java +++ b/api/src/com/cloud/vm/NicProfile.java @@ -34,6 +34,7 @@ public class NicProfile { Integer deviceId; String dns1; String dns2; + int networkRate; public String getDns1() { return dns1; @@ -182,8 +183,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 +208,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) { diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index d52a901fb1d..f6b6e524e4b 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -1251,7 +1251,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); @@ -1290,7 +1290,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); @@ -1383,7 +1383,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) { diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index b397cbd5adf..67f5b7b4c6a 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; @@ -137,6 +138,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 +152,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); @@ -521,4 +524,8 @@ public class ApiDBUtils { } } + public static Integer getNetworkRate(long networkOfferingId) { + return _configMgr.getNetworkRate(networkOfferingId); + } + } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 70b81f92397..eecdb703898 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -2198,6 +2198,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/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 18d2061a237..48bd8949987 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -56,7 +56,7 @@ 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), OvsNetwork("Network", ManagementServer.class, Boolean.class, "open.vswitch.network", "false", "enable/disable open vswitch network", null), diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java index 20b6808a205..b2581be9bfe 100644 --- a/server/src/com/cloud/configuration/ConfigurationManager.java +++ b/server/src/com/cloud/configuration/ConfigurationManager.java @@ -43,7 +43,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 diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index e82cca54772..ff4532d4480 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -2761,4 +2761,25 @@ 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; + } } 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/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index d0adcc088db..7143043d0ff 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -655,8 +655,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag _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); @@ -679,9 +677,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag 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(); @@ -891,7 +889,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) { @@ -963,6 +964,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag to.setDns1(profile.getDns1()); to.setDns2(profile.getDns2()); } + + Integer networkRate = _configMgr.getNetworkRate(config.getNetworkOfferingId()); + to.setNetworkRateMbps(networkRate); return to; } @@ -1043,6 +1047,8 @@ 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); @@ -1055,7 +1061,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()); @@ -1069,7 +1075,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag 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); } @@ -1090,8 +1096,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag List nics = _nicDao.listBy(vm.getId()); for (NicVO nic : nics) { Network network = _networksDao.findById(nic.getNetworkId()); + NetworkOffering no = _configMgr.getNetworkOffering(network.getNetworkOfferingId()); + Integer networkRate = _configMgr.getNetworkRate(no.getId()); - NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri()); + NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), networkRate); vm.addNic(profile); } @@ -1109,7 +1117,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag NetworkGuru concierge = _networkGurus.get(network.getGuruName()); nic.setState(Resource.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); if (originalState == Nic.State.Reserved) { @@ -1284,7 +1292,7 @@ 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()); diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 0fe95b78fd7..1b38fdf2156 100644 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -124,6 +124,7 @@ 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; @@ -1497,7 +1498,13 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian 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/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); } From b0d390aef1918d6ed20b35dee2949b440f187c46 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 21 Jan 2011 10:11:50 -0800 Subject: [PATCH 032/151] bug 7817: create new shared function validateInteger(). --- ui/scripts/cloud.core.diskoffering.js | 2 +- ui/scripts/cloud.core.js | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/ui/scripts/cloud.core.diskoffering.js b/ui/scripts/cloud.core.diskoffering.js index 2ec9215c886..42eae175c8c 100644 --- a/ui/scripts/cloud.core.diskoffering.js +++ b/ui/scripts/cloud.core.diskoffering.js @@ -103,7 +103,7 @@ function initAddDiskOfferingDialog() { isValid &= validateString("Description", thisDialog.find("#add_disk_description"), thisDialog.find("#add_disk_description_errormsg")); if($("#add_disk_disksize_container").css("display") != "none") - isValid &= validateNumber("Disk size", thisDialog.find("#add_disk_disksize"), thisDialog.find("#add_disk_disksize_errormsg"), 0, null, false); //required + isValid &= validateInteger("Disk size", thisDialog.find("#add_disk_disksize"), thisDialog.find("#add_disk_disksize_errormsg"), 0, null, false); //required isValid &= validateString("Tags", thisDialog.find("#add_disk_tags"), thisDialog.find("#add_disk_tags_errormsg"), true); //optional if (!isValid) diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index 5e4ac8d1f69..ca75fa13701 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -1464,7 +1464,11 @@ function validateDropDownBox(label, field, errMsgField, appendErrMsg) { return isValid; } -function validateNumber(label, field, errMsgField, min, max, isOptional) { +function validateInteger(label, field, errMsgField, min, max, isOptional) { + validateNumber(label, field, errMsgField, min, max, isOptional, "integer"); +} + +function validateNumber(label, field, errMsgField, min, max, isOptional, type) { var isValid = true; var errMsg = ""; var value = field.val(); @@ -1472,7 +1476,13 @@ function validateNumber(label, field, errMsgField, min, max, isOptional) { if(isNaN(value)) { errMsg = label + " must be a number"; isValid = false; - } else { + } + else { + if(type == "integer" && (value % 1) != 0) { + errMsg = label + " must be an integer"; + isValid = false; + } + if (min != null && value < min) { errMsg = label + " must be a value greater than or equal to " + min; isValid = false; @@ -1482,7 +1492,8 @@ function validateNumber(label, field, errMsgField, min, max, isOptional) { isValid = false; } } - } else if(isOptional!=true){ //required field + } + else if(isOptional!=true){ //required field errMsg = label + " is a required value. "; isValid = false; } From b47d843cc1a425bc2367a4894858e6bb1a02bdd2 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 21 Jan 2011 10:20:39 -0800 Subject: [PATCH 033/151] bug 7817: service offering page - apply validateInteger(). --- ui/scripts/cloud.core.js | 5 +++-- ui/scripts/cloud.core.serviceoffering.js | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index ca75fa13701..4e1fd3e170b 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -1465,13 +1465,14 @@ function validateDropDownBox(label, field, errMsgField, appendErrMsg) { } function validateInteger(label, field, errMsgField, min, max, isOptional) { - validateNumber(label, field, errMsgField, min, max, isOptional, "integer"); + return validateNumber(label, field, errMsgField, min, max, isOptional, "integer"); } function validateNumber(label, field, errMsgField, min, max, isOptional, type) { var isValid = true; var errMsg = ""; - var value = field.val(); + var value = field.val(); + if (value != null && value.length != 0) { if(isNaN(value)) { errMsg = label + " must be a number"; diff --git a/ui/scripts/cloud.core.serviceoffering.js b/ui/scripts/cloud.core.serviceoffering.js index be34909a8b1..f358e2c9e58 100644 --- a/ui/scripts/cloud.core.serviceoffering.js +++ b/ui/scripts/cloud.core.serviceoffering.js @@ -91,9 +91,9 @@ function initAddServiceOfferingDialog() { 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 &= validateInteger("# of CPU Core", thisDialog.find("#add_service_cpucore"), thisDialog.find("#add_service_cpucore_errormsg"), 1, 1000); + isValid &= validateInteger("CPU", thisDialog.find("#add_service_cpu"), thisDialog.find("#add_service_cpu_errormsg"), 100, 100000); + isValid &= validateInteger("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; From aedb433ca2b3d09323f35cc68e967f4d8b2cfb27 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Fri, 21 Jan 2011 10:34:13 -0800 Subject: [PATCH 034/151] Bug 8010: retire capacity.skipcounting.hours and capacity.skipcounting.destroyed.hours Status 8010: Resolved Fixed --- .../impl/UserConcentratedAllocator.java | 19 ++++++++++--------- .../src/com/cloud/configuration/Config.java | 2 -- .../allocator/LocalStoragePoolAllocator.java | 8 ++++---- 3 files changed, 14 insertions(+), 15 deletions(-) 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/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 48bd8949987..6227d22fdb4 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -71,8 +71,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), 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); From 8739a93f3a1cf5a5c61a82ae73afab5b50f8cda6 Mon Sep 17 00:00:00 2001 From: will Date: Fri, 21 Jan 2011 10:40:36 -0800 Subject: [PATCH 035/151] bug 7922: changed verbiage on dashboad to avoid confusion. --- ui/jsp/dashboard.jsp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ui/jsp/dashboard.jsp b/ui/jsp/dashboard.jsp index 4bcc16667bc..2167a6f03d3 100644 --- a/ui/jsp/dashboard.jsp +++ b/ui/jsp/dashboard.jsp @@ -51,7 +51,7 @@ Public IP Addresses

    - Used: N/A + Allocated: N/A

    @@ -72,7 +72,7 @@ Private IP Addresses

    - Used: N/A + Allocated: N/A

    @@ -93,7 +93,7 @@ Memory Allocated

    - Used: N/A + Allocated: N/A

    @@ -111,10 +111,10 @@

    - CPU

    + CPU Allocated

    - Used: N/A + Allocated: N/A

    @@ -135,7 +135,7 @@ Primary Storage Allocated

    - Used: N/A + Allocated: N/A

    From cd0f5e7c2043e5c0a455b368d9d2a65122b996c3 Mon Sep 17 00:00:00 2001 From: anthony Date: Thu, 20 Jan 2011 18:11:20 -0800 Subject: [PATCH 036/151] bug 7976: if the snapshot is empty, still create a snapshot entry which has the same backupSnapshotId even though nothing is backed up to secondary storage status 7976: resolved fixed --- .../computing/LibvirtComputingResource.java | 10 +-- .../cloud/agent/api/BackupSnapshotAnswer.java | 8 ++- .../xen/resource/CitrixResourceBase.java | 37 ++++++----- .../com/cloud/storage/dao/SnapshotDao.java | 1 + .../cloud/storage/dao/SnapshotDaoImpl.java | 13 ++++ .../storage/snapshot/SnapshotManagerImpl.java | 65 +++++++++++-------- 6 files changed, 85 insertions(+), 49 deletions(-) diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index d9bacc7e84e..87adefa412d 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -1080,7 +1080,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*/ @@ -1116,15 +1116,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) { diff --git a/api/src/com/cloud/agent/api/BackupSnapshotAnswer.java b/api/src/com/cloud/agent/api/BackupSnapshotAnswer.java index 93b5fe78520..807ce0d3851 100644 --- a/api/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/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index f6b6e524e4b..792f1b31bf9 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -5013,10 +5013,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) { @@ -5025,22 +5027,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; @@ -5050,21 +5060,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); @@ -5073,7 +5078,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) { @@ -5168,7 +5173,7 @@ public abstract class CitrixResourceBase implements ServerResource { } } } - return new DeleteSnapshotBackupAnswer(cmd, success, details); + return new DeleteSnapshotBackupAnswer(cmd, true, details); } protected Answer execute(DeleteSnapshotsDirCommand cmd) { 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/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index b45281c9679..fbe01b3b9df 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -209,9 +209,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; @@ -242,11 +239,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(); } } @@ -262,10 +258,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) { @@ -292,16 +289,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()); @@ -430,7 +428,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) { @@ -460,8 +457,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); @@ -505,6 +504,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()); @@ -675,11 +677,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); @@ -715,17 +723,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 " From 32c1fb77f429bf8acfdf20c45811c39e3de8c054 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 21 Jan 2011 10:41:24 -0800 Subject: [PATCH 037/151] replace validateNumber() with validateInteger() on all integer fields on all pages. --- ui/scripts/cloud.core.account.js | 10 +++++----- ui/scripts/cloud.core.domain.js | 10 +++++----- ui/scripts/cloud.core.ipaddress.js | 10 +++++----- ui/scripts/cloud.core.iso.js | 2 +- ui/scripts/cloud.core.resource.js | 2 +- ui/scripts/cloud.core.securitygroup.js | 8 ++++---- ui/scripts/cloud.core.template.js | 2 +- ui/scripts/cloud.core.volume.js | 10 +++++----- ui/scripts/cloud.core.zone.js | 2 +- 9 files changed, 28 insertions(+), 28 deletions(-) diff --git a/ui/scripts/cloud.core.account.js b/ui/scripts/cloud.core.account.js index d0eef7b6d68..eadea6e55cc 100644 --- a/ui/scripts/cloud.core.account.js +++ b/ui/scripts/cloud.core.account.js @@ -684,11 +684,11 @@ function doResourceLimitsForAccount($actionLink, $detailsTab, $midmenuItem1) { "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); + isValid &= validateInteger("Instance Limit", $("#dialog_resource_limits #limits_vm"), $("#dialog_resource_limits #limits_vm_errormsg"), -1, 32000, false); + isValid &= validateInteger("Public IP Limit", $("#dialog_resource_limits #limits_ip"), $("#dialog_resource_limits #limits_ip_errormsg"), -1, 32000, false); + isValid &= validateInteger("Disk Volume Limit", $("#dialog_resource_limits #limits_volume"), $("#dialog_resource_limits #limits_volume_errormsg"), -1, 32000, false); + isValid &= validateInteger("Snapshot Limit", $("#dialog_resource_limits #limits_snapshot"), $("#dialog_resource_limits #limits_snapshot_errormsg"), -1, 32000, false); + isValid &= validateInteger("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()); diff --git a/ui/scripts/cloud.core.domain.js b/ui/scripts/cloud.core.domain.js index 88e9dba72ee..39ce263aaa4 100644 --- a/ui/scripts/cloud.core.domain.js +++ b/ui/scripts/cloud.core.domain.js @@ -537,11 +537,11 @@ function doEditResourceLimits2($actionLink, $detailsTab, $midmenuItem1, $readonl var $resourceLimitsTab = $("#right_panel_content #tab_content_resource_limits"); var isValid = true; - isValid &= validateNumber("Instance Limit", $resourceLimitsTab.find("#limits_vm_edit"), $resourceLimitsTab.find("#limits_vm_edit_errormsg"), -1, 32000, false); - isValid &= validateNumber("Public IP Limit", $resourceLimitsTab.find("#limits_ip_edit"), $resourceLimitsTab.find("#limits_ip_edit_errormsg"), -1, 32000, false); - isValid &= validateNumber("Disk Volume Limit", $resourceLimitsTab.find("#limits_volume_edit"), $resourceLimitsTab.find("#limits_volume_edit_errormsg"), -1, 32000, false); - isValid &= validateNumber("Snapshot Limit", $resourceLimitsTab.find("#limits_snapshot_edit"), $resourceLimitsTab.find("#limits_snapshot_edit_errormsg"), -1, 32000, false); - isValid &= validateNumber("Template Limit", $resourceLimitsTab.find("#limits_template_edit"), $resourceLimitsTab.find("#limits_template_edit_errormsg"), -1, 32000, false); + isValid &= validateInteger("Instance Limit", $resourceLimitsTab.find("#limits_vm_edit"), $resourceLimitsTab.find("#limits_vm_edit_errormsg"), -1, 32000, false); + isValid &= validateInteger("Public IP Limit", $resourceLimitsTab.find("#limits_ip_edit"), $resourceLimitsTab.find("#limits_ip_edit_errormsg"), -1, 32000, false); + isValid &= validateInteger("Disk Volume Limit", $resourceLimitsTab.find("#limits_volume_edit"), $resourceLimitsTab.find("#limits_volume_edit_errormsg"), -1, 32000, false); + isValid &= validateInteger("Snapshot Limit", $resourceLimitsTab.find("#limits_snapshot_edit"), $resourceLimitsTab.find("#limits_snapshot_edit_errormsg"), -1, 32000, false); + isValid &= validateInteger("Template Limit", $resourceLimitsTab.find("#limits_template_edit"), $resourceLimitsTab.find("#limits_template_edit_errormsg"), -1, 32000, false); if (!isValid) return; diff --git a/ui/scripts/cloud.core.ipaddress.js b/ui/scripts/cloud.core.ipaddress.js index 9fc63adfc1a..141aab2c8b0 100644 --- a/ui/scripts/cloud.core.ipaddress.js +++ b/ui/scripts/cloud.core.ipaddress.js @@ -122,8 +122,8 @@ function afterLoadIpJSP() { $createPortForwardingRow.find("#add_link").bind("click", function(event){ var isValid = true; isValid &= validateDropDownBox("Instance", $createPortForwardingRow.find("#vm"), $createPortForwardingRow.find("#vm_errormsg")); - 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); + isValid &= validateInteger("Public Port", $createPortForwardingRow.find("#public_port"), $createPortForwardingRow.find("#public_port_errormsg"), 1, 65535); + isValid &= validateInteger("Private Port", $createPortForwardingRow.find("#private_port"), $createPortForwardingRow.find("#private_port_errormsg"), 1, 65535); if (!isValid) return; @@ -220,8 +220,8 @@ function afterLoadIpJSP() { // 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); + isValid &= validateInteger("Public Port", createLoadBalancerRow.find("#public_port"), createLoadBalancerRow.find("#public_port_errormsg"), 1, 65535); + isValid &= validateInteger("Private Port", createLoadBalancerRow.find("#private_port"), createLoadBalancerRow.find("#private_port_errormsg"), 1, 65535); if (!isValid) return; var $template = $("#load_balancer_template").clone(); @@ -1306,7 +1306,7 @@ function portForwardingJsonToTemplate(jsonObj, $template) { $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); + isValid &= validateInteger("Private Port", $rowContainerEdit.find("#private_port"), $rowContainerEdit.find("#private_port_errormsg"), 1, 65535); if (!isValid) return; var $spinningWheel = $rowContainerEdit.find("#spinning_wheel"); diff --git a/ui/scripts/cloud.core.iso.js b/ui/scripts/cloud.core.iso.js index 671c1b7df83..38959c2004a 100644 --- a/ui/scripts/cloud.core.iso.js +++ b/ui/scripts/cloud.core.iso.js @@ -644,7 +644,7 @@ function doCreateVMFromIso($actionLink, $detailsTab, $midmenuItem1) { isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg"), true); isValid &= validateString("Group", thisDialog.find("#group"), thisDialog.find("#group_errormsg"), true); if(thisDialog.find("#size_container").css("display") != "none") - isValid &= validateNumber("Size", thisDialog.find("#size"), thisDialog.find("#size_errormsg")); + isValid &= validateInteger("Size", thisDialog.find("#size"), thisDialog.find("#size_errormsg")); if (!isValid) return; diff --git a/ui/scripts/cloud.core.resource.js b/ui/scripts/cloud.core.resource.js index b234d96f566..1ae1a0d98bc 100644 --- a/ui/scripts/cloud.core.resource.js +++ b/ui/scripts/cloud.core.resource.js @@ -1316,7 +1316,7 @@ function addZoneWizardValidatePublicIPRange($thisWizard) { isValid &= validateString("Account", $thisWizard.find("#step4").find("#add_publicip_vlan_account"), $thisWizard.find("#step4").find("#add_publicip_vlan_account_errormsg"), true); //optional if (isTagged) { - isValid &= validateNumber("VLAN", $thisWizard.find("#step4").find("#add_publicip_vlan_vlan"), $thisWizard.find("#step4").find("#add_publicip_vlan_vlan_errormsg"), 2, 4095); + isValid &= validateInteger("VLAN", $thisWizard.find("#step4").find("#add_publicip_vlan_vlan"), $thisWizard.find("#step4").find("#add_publicip_vlan_vlan_errormsg"), 2, 4095); } isValid &= validateIp("Gateway", $thisWizard.find("#step4").find("#add_publicip_vlan_gateway"), $thisWizard.find("#step4").find("#add_publicip_vlan_gateway_errormsg"), false); //required diff --git a/ui/scripts/cloud.core.securitygroup.js b/ui/scripts/cloud.core.securitygroup.js index 0abddee24c8..48658690d49 100644 --- a/ui/scripts/cloud.core.securitygroup.js +++ b/ui/scripts/cloud.core.securitygroup.js @@ -192,12 +192,12 @@ function initAddIngressRuleDialog() { 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 + isValid &= validateInteger("Type", $thisDialog.find("#icmp_type"), $thisDialog.find("#icmp_type_errormsg"), -1, 40, false); //required + isValid &= validateInteger("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 + isValid &= validateInteger("Start Port", $thisDialog.find("#start_port"), $thisDialog.find("#start_port_errormsg"), 1, 65535, false); //required + isValid &= validateInteger("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") { diff --git a/ui/scripts/cloud.core.template.js b/ui/scripts/cloud.core.template.js index eb4198e616d..a2634c694b5 100644 --- a/ui/scripts/cloud.core.template.js +++ b/ui/scripts/cloud.core.template.js @@ -676,7 +676,7 @@ function doCreateVMFromTemplate($actionLink, $detailsTab, $midmenuItem1) { isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg"), true); isValid &= validateString("Group", thisDialog.find("#group"), thisDialog.find("#group_errormsg"), true); if(thisDialog.find("#size_container").css("display") != "none") - isValid &= validateNumber("Size", thisDialog.find("#size"), thisDialog.find("#size_errormsg")); + isValid &= validateInteger("Size", thisDialog.find("#size"), thisDialog.find("#size_errormsg")); if (!isValid) return; diff --git a/ui/scripts/cloud.core.volume.js b/ui/scripts/cloud.core.volume.js index a8fe7165823..6606d10b3d5 100644 --- a/ui/scripts/cloud.core.volume.js +++ b/ui/scripts/cloud.core.volume.js @@ -132,7 +132,7 @@ function afterLoadVolumeJSP() { var isValid = true; isValid &= validateString("Name", thisDialog.find("#add_volume_name"), thisDialog.find("#add_volume_name_errormsg")); if(thisDialog.find("#size_container").css("display") != "none") - isValid &= validateNumber("Size", thisDialog.find("#size"), thisDialog.find("#size_errormsg")); + isValid &= validateInteger("Size", thisDialog.find("#size"), thisDialog.find("#size_errormsg")); if (!isValid) return; thisDialog.dialog("close"); @@ -783,7 +783,7 @@ function doRecurringSnapshot($actionLink, $detailsTab, $midmenuItem1) { return false; case "0": var isValid = true; - isValid &= validateNumber("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); + isValid &= validateInteger("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); if (!isValid) return; intervalType = "hourly"; minute = bottomPanel.find("#edit_minute").val(); @@ -794,7 +794,7 @@ function doRecurringSnapshot($actionLink, $detailsTab, $midmenuItem1) { case "1": var isValid = true; - isValid &= validateNumber("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); + isValid &= validateInteger("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); if (!isValid) return; intervalType = "daily"; minute = bottomPanel.find("#edit_minute").val(); @@ -811,7 +811,7 @@ function doRecurringSnapshot($actionLink, $detailsTab, $midmenuItem1) { case "2": var isValid = true; - isValid &= validateNumber("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); + isValid &= validateInteger("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); if (!isValid) return; intervalType = "weekly"; minute = bottomPanel.find("#edit_minute").val(); @@ -830,7 +830,7 @@ function doRecurringSnapshot($actionLink, $detailsTab, $midmenuItem1) { case "3": var isValid = true; - isValid &= validateNumber("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); + isValid &= validateInteger("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg")); if (!isValid) return; intervalType = "monthly"; minute = bottomPanel.find("#edit_minute").val(); diff --git a/ui/scripts/cloud.core.zone.js b/ui/scripts/cloud.core.zone.js index 3c9e13ac8aa..dce58c04b0b 100644 --- a/ui/scripts/cloud.core.zone.js +++ b/ui/scripts/cloud.core.zone.js @@ -474,7 +474,7 @@ function bindAddVLANButton($button, $leftmenuItem1) { 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 &= validateInteger("VLAN", $thisDialog.find("#add_publicip_vlan_vlan"), $thisDialog.find("#add_publicip_vlan_vlan_errormsg"), 2, 4095); } if (isDirect) { isValid &= validateString("Network Name", $thisDialog.find("#add_publicip_vlan_network_name"), $thisDialog.find("#add_publicip_vlan_network_name_errormsg")); From 4649935ef243a72240396b826080f6cfc0a20013 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 21 Jan 2011 10:45:37 -0800 Subject: [PATCH 038/151] bug 7817: instance page - apply validateInteger(). --- ui/scripts/cloud.core.instance.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/scripts/cloud.core.instance.js b/ui/scripts/cloud.core.instance.js index fbff7164f98..799c21c1c79 100644 --- a/ui/scripts/cloud.core.instance.js +++ b/ui/scripts/cloud.core.instance.js @@ -846,9 +846,9 @@ function initVMWizard() { var isValid = true; if($diskOfferingElement.find("#custom_disk_size").length > 0) - isValid &= validateNumber("Disk Size", $diskOfferingElement.find("#custom_disk_size"), $diskOfferingElement.find("#custom_disk_size_errormsg"), null, null, false); //required + isValid &= validateInteger("Disk Size", $diskOfferingElement.find("#custom_disk_size"), $diskOfferingElement.find("#custom_disk_size_errormsg"), null, null, false); //required else - isValid &= validateNumber("Disk Size", $diskOfferingElement.find("#custom_disk_size"), $diskOfferingElement.find("#custom_disk_size_errormsg"), null, null, true); //optional + isValid &= validateInteger("Disk Size", $diskOfferingElement.find("#custom_disk_size"), $diskOfferingElement.find("#custom_disk_size_errormsg"), null, null, true); //optional if (!isValid) return; From 835835dd0b70b6569947d0e91809c45479351912 Mon Sep 17 00:00:00 2001 From: will Date: Fri, 21 Jan 2011 10:47:26 -0800 Subject: [PATCH 039/151] bug 8154: removed type and added network rate to network offering detail page. --- ui/jsp/networkoffering.jsp | 4 ++-- ui/scripts/cloud.core.networkoffering.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/jsp/networkoffering.jsp b/ui/jsp/networkoffering.jsp index f51c9fd292f..0ad8d34350a 100644 --- a/ui/jsp/networkoffering.jsp +++ b/ui/jsp/networkoffering.jsp @@ -132,10 +132,10 @@
    - Type:
    + Network Rate:
    -
    +
    diff --git a/ui/scripts/cloud.core.networkoffering.js b/ui/scripts/cloud.core.networkoffering.js index 992c65b750c..1be8a52a7a3 100644 --- a/ui/scripts/cloud.core.networkoffering.js +++ b/ui/scripts/cloud.core.networkoffering.js @@ -158,7 +158,7 @@ function networkOfferingJsonToDetailsTab() { setBooleanReadField(jsonObj.isdefault, $thisTab.find("#isdefault")); setBooleanReadField(jsonObj.specifyvlan, $thisTab.find("#specifyvlan")); - $thisTab.find("#type").text(fromdb(jsonObj.type)); + $thisTab.find("#rate").text(fromdb(jsonObj.networkrate)); $thisTab.find("#traffictype").text(fromdb(jsonObj.traffictype)); //actions *** From 4d0d47f6fcba0b1b720e31be62d75ebcddb413f3 Mon Sep 17 00:00:00 2001 From: alena Date: Fri, 21 Jan 2011 10:54:59 -0800 Subject: [PATCH 040/151] listVlanIpRanges api: for Account specific Virtual ip range return account information taken from account_vlan_map table instead of taking it from corresponding network --- .../configuration/ConfigurationService.java | 3 +++ server/src/com/cloud/api/ApiDBUtils.java | 4 ++++ .../src/com/cloud/api/ApiResponseHelper.java | 20 +++++----------- .../ConfigurationManagerImpl.java | 24 +++++++++++++++++++ 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/api/src/com/cloud/configuration/ConfigurationService.java b/api/src/com/cloud/configuration/ConfigurationService.java index e2ad06e1b28..0bb032b22ae 100644 --- a/api/src/com/cloud/configuration/ConfigurationService.java +++ b/api/src/com/cloud/configuration/ConfigurationService.java @@ -31,6 +31,7 @@ import com.cloud.exception.InvalidParameterValueException; import com.cloud.offering.DiskOffering; import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; +import com.cloud.user.Account; public interface ConfigurationService { @@ -188,5 +189,7 @@ public interface ConfigurationService { NetworkOffering getNetworkOffering(long id); Integer getNetworkRate(long networkOfferingId); + + Account getVlanAccount(long vlanId); } diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 67f5b7b4c6a..37bc5da460a 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -528,4 +528,8 @@ public class ApiDBUtils { return _configMgr.getNetworkRate(networkOfferingId); } + public static Account getVlanAccount(long vlanId) { + return _configMgr.getVlanAccount(vlanId); + } + } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index eecdb703898..bd274c51ad7 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -568,20 +568,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"); diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index ff4532d4480..ab218a28325 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -2782,4 +2782,28 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura 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); + } } From bc628178907e08f8cb64141465736e091b049e57 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Wed, 19 Jan 2011 12:31:59 -0500 Subject: [PATCH 041/151] bug 8085: fix live migration status 8085: resolved fixed --- .../computing/LibvirtComputingResource.java | 60 ++++++++++++------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index 87adefa412d..23a22274e5b 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; @@ -113,6 +114,7 @@ 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; @@ -1813,26 +1815,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 { From 1bcbd983f19ea84217e6a0ec6252a617ea2c0280 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 20 Jan 2011 04:12:44 -0500 Subject: [PATCH 042/151] pass down iso, not matter is bootable or not --- server/src/com/cloud/vm/UserVmManagerImpl.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index ad3909c28ab..752d19107f0 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2145,7 +2145,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) { String isoPath = null; Pair isoPathPair = _storageMgr.getAbsoluteIsoPath(template.getId(), vo.getDataCenterId()); if (isoPathPair == null) { @@ -2154,10 +2154,15 @@ 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); From 314a491b9c122ce341985bf293a27befde5ff961 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Sat, 22 Jan 2011 04:03:29 -0500 Subject: [PATCH 043/151] bug 8094: forword port NetworkRulesSystemVmComman from 2.1.x to 2.2, to fix security group is lost after migration status 8094: resovled fixed Conflicts: agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java --- .../computing/LibvirtComputingResource.java | 21 +++++- .../api/NetworkRulesSystemVmCommand.java | 69 +++++++++++++++++++ .../xen/resource/CitrixResourceBase.java | 16 +++++ .../cloud/vm/VirtualMachineManagerImpl.java | 14 +++- 4 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 core/src/com/cloud/agent/api/NetworkRulesSystemVmCommand.java diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index 23a22274e5b..47a905c1fe6 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -108,6 +108,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.NetworkUsageAnswer; import com.cloud.agent.api.NetworkUsageCommand; import com.cloud.agent.api.PingCommand; @@ -168,6 +169,7 @@ import com.cloud.host.Host.Type; import com.cloud.hypervisor.Hypervisor.HypervisorType; 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; @@ -865,6 +867,8 @@ 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 { s_logger.warn("Unsupported command "); return Answer.createUnsupportedCommandAnswer(cmd); @@ -1724,6 +1728,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()); @@ -2224,7 +2229,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 @@ -3593,4 +3603,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/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/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 792f1b31bf9..dc32f46c8c6 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; @@ -441,6 +442,8 @@ 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 { return Answer.createUnsupportedCommandAnswer(cmd); } @@ -5664,4 +5667,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/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 923414dbb76..7ef58f453ee 100644 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -39,6 +39,7 @@ 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.StartAnswer; @@ -91,6 +92,7 @@ import com.cloud.user.AccountManager; import com.cloud.user.User; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; +import com.cloud.uservm.UserVm; import com.cloud.utils.Journal; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; @@ -997,9 +999,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); From 4b355ca301642cd98aafd7c811e2c91386cffeb1 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 20 Jan 2011 13:09:32 -0500 Subject: [PATCH 044/151] bug 8118: add security group back status 8118: resolved fixed --- .../computing/LibvirtComputingResource.java | 21 +++++++++++++++++++ scripts/vm/network/security_group.py | 15 +++++++------ .../security/SecurityGroupManager.java | 2 +- .../security/SecurityGroupManagerImpl.java | 15 ++++++++----- .../src/com/cloud/vm/UserVmManagerImpl.java | 5 ++++- 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index 47a905c1fe6..8598b9fa29b 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -79,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; @@ -869,6 +870,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv 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); @@ -1574,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(); @@ -3500,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"); 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/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 601043e8091..590276b3ab8 100644 --- a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java +++ b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java @@ -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); } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 752d19107f0..404cae9d8aa 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -128,6 +128,7 @@ import com.cloud.network.ovs.OvsNetworkManager; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.rules.RulesManager; import com.cloud.network.security.SecurityGroupManager; +import com.cloud.network.security.SecurityGroupVO; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.server.Criteria; import com.cloud.service.ServiceOfferingVO; @@ -2134,7 +2135,9 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager } finally { updateVmStateForFailedVmCreation(vm.getId()); } - vm.setPassword(password); + + _networkGroupMgr.addInstanceToGroups(vm.getId(), cmd.getSecurityGroupList()); + return vm; } From d45f5cd5bfb919fe9f1d323126fd35bb97f1ef45 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 20 Jan 2011 13:40:45 -0500 Subject: [PATCH 045/151] bug 8119: don't boot from iso, if iso is dettached status 8119: resolved fixed --- .../cloud/network/security/SecurityGroupManagerImpl.java | 2 +- server/src/com/cloud/vm/UserVmManagerImpl.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java index 590276b3ab8..5e0e5dc8e74 100644 --- a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java +++ b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java @@ -1071,7 +1071,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG if (!_enabled) { return true; } - if (groups != null || !groups.isEmpty()) { + if (groups != null && !groups.isEmpty()) { final Transaction txn = Transaction.currentTxn(); txn.start(); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 404cae9d8aa..9a26502492f 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2064,6 +2064,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; @@ -2148,7 +2152,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager if (vo.getIsoId() != null) { template = _templateDao.findById(vo.getIsoId()); } - if (template != null && template.getFormat() == ImageFormat.ISO) { + if (template != null && template.getFormat() == ImageFormat.ISO && vo.getIsoId() != null) { String isoPath = null; Pair isoPathPair = _storageMgr.getAbsoluteIsoPath(template.getId(), vo.getDataCenterId()); if (isoPathPair == null) { @@ -2169,7 +2173,6 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager 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, From cfb51ece2545d21dcb82312a3cb50549325fb629 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Fri, 21 Jan 2011 11:08:15 -0800 Subject: [PATCH 046/151] Bug 8019: send snapshot commands to host that owns the VM --- server/src/com/cloud/storage/StorageManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 36e2db55fd2..287867e924b 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -2198,7 +2198,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; From dce0ab6190956e765fedfd7e53b305fa20f2c964 Mon Sep 17 00:00:00 2001 From: anthony Date: Fri, 21 Jan 2011 11:23:51 -0800 Subject: [PATCH 047/151] fixed ConcurrentModificationException --- .../hypervisor/xen/resource/CitrixResourceBase.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index dc32f46c8c6..99f2c6c79c1 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -740,7 +740,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"); @@ -2655,7 +2657,9 @@ public abstract class CitrixResourceBase implements ServerResource { 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; @@ -2666,7 +2670,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) { From 4a3954690a8592e4b0e4608830c4318df6109cc0 Mon Sep 17 00:00:00 2001 From: will Date: Fri, 21 Jan 2011 11:45:01 -0800 Subject: [PATCH 048/151] removing 2.1 legacy UI from 2.2 --- ui/2.1/css/cloud_custom.css | 540 -- .../images/._ui-bg_flat_0_aaaaaa_40x100.png | Bin 4096 -> 0 bytes .../images/._ui-bg_flat_75_ffffff_40x100.png | Bin 4096 -> 0 bytes .../images/._ui-bg_glass_30_393939_1x400.png | Bin 47996 -> 0 bytes .../images/._ui-bg_glass_30_ffffff_1x400.png | Bin 4096 -> 0 bytes .../images/._ui-bg_glass_55_fbf9ee_1x400.png | Bin 4096 -> 0 bytes .../._ui-bg_inset-soft_95_fef1ec_1x100.png | Bin 4096 -> 0 bytes .../css/images/._ui-icons_222222_256x240.png | Bin 4096 -> 0 bytes .../css/images/._ui-icons_2e83ff_256x240.png | Bin 4096 -> 0 bytes ui/2.1/css/images/._ui-icons_FFF_256x240.png | Bin 4096 -> 0 bytes .../css/images/._ui-icons_cd0a0a_256x240.png | Bin 4096 -> 0 bytes .../css/images/._ui-icons_ffffff_256x240.png | Bin 4096 -> 0 bytes ui/2.1/css/images/alert_icon.png | Bin 545 -> 0 bytes ui/2.1/css/images/clr_button.gif | Bin 1274 -> 0 bytes ui/2.1/css/images/clr_button_hover.gif | Bin 437 -> 0 bytes ui/2.1/css/images/comment_loader.gif | Bin 1849 -> 0 bytes ui/2.1/css/images/grid_headerbg.gif | Bin 196 -> 0 bytes ui/2.1/css/images/groupbox_top.gif | Bin 613 -> 0 bytes ui/2.1/css/images/minimize_button.gif | Bin 634 -> 0 bytes ui/2.1/css/images/minimize_button_hover.gif | Bin 227 -> 0 bytes ui/2.1/css/images/play_button.gif | Bin 657 -> 0 bytes ui/2.1/css/images/play_button_hover.gif | Bin 243 -> 0 bytes ui/2.1/css/images/shrink_button.gif | Bin 655 -> 0 bytes ui/2.1/css/images/shrink_button_hover.gif | Bin 243 -> 0 bytes ui/2.1/css/images/sortable_groupbox.gif | Bin 2773 -> 0 bytes ui/2.1/css/images/sortable_leftarrow.gif | Bin 426 -> 0 bytes .../css/images/sortable_leftarrow_hover.gif | Bin 427 -> 0 bytes ui/2.1/css/images/sortable_rightarrow.gif | Bin 425 -> 0 bytes .../css/images/sortable_rightarrow_hover.gif | Bin 427 -> 0 bytes ui/2.1/css/images/stop_button.gif | Bin 649 -> 0 bytes ui/2.1/css/images/stop_button_hover.gif | Bin 231 -> 0 bytes .../ui-bg_errorglass_30_ffffff_1x400.png | Bin 1067 -> 0 bytes .../css/images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_30_393939_1x400.png | Bin 2830 -> 0 bytes .../images/ui-bg_glass_30_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 120 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui-bg_glass_75_000000_1x400.png | Bin 132 -> 0 bytes .../images/ui-bg_glass_75_212121_1x400.png | Bin 132 -> 0 bytes .../ui-bg_inset-soft_95_fef1ec_1x100.png | Bin 123 -> 0 bytes ui/2.1/css/images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes ui/2.1/css/images/ui-icons_2e83ff_256x240.png | Bin 4369 -> 0 bytes ui/2.1/css/images/ui-icons_454545_256x240.png | Bin 4369 -> 0 bytes ui/2.1/css/images/ui-icons_FFF_256x240.png | Bin 550 -> 0 bytes ui/2.1/css/images/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 0 bytes ui/2.1/css/images/ui-icons_ffffff_256x240.png | Bin 4369 -> 0 bytes ui/2.1/css/jquery-ui-1.7.2.custom.css | 420 - ui/2.1/css/jquery-ui-1.8.2.custom.css | 499 -- ui/2.1/css/logger.css | 119 - ui/2.1/css/main.css | 7906 ----------------- ui/2.1/favicon.ico | Bin 1406 -> 0 bytes ui/2.1/images/32bit_icon.gif | Bin 856 -> 0 bytes ui/2.1/images/64bit_icon.gif | Bin 856 -> 0 bytes ui/2.1/images/ISO_OFF.gif | Bin 1185 -> 0 bytes ui/2.1/images/ISO_ON.gif | Bin 1170 -> 0 bytes ui/2.1/images/KVM_icon.gif | Bin 1446 -> 0 bytes ui/2.1/images/XEN_icon.gif | Bin 1004 -> 0 bytes ui/2.1/images/account_bg.gif | Bin 310 -> 0 bytes ui/2.1/images/account_shadow.gif | Bin 635 -> 0 bytes ui/2.1/images/accountstitle_icons.gif | Bin 1468 -> 0 bytes ui/2.1/images/add_domainbutton.gif | Bin 1451 -> 0 bytes ui/2.1/images/add_domainbutton_hover.gif | Bin 1536 -> 0 bytes ui/2.1/images/add_ipbutton.gif | Bin 2154 -> 0 bytes ui/2.1/images/add_ipbutton_hover.gif | Bin 2185 -> 0 bytes ui/2.1/images/add_userbutton.gif | Bin 1468 -> 0 bytes ui/2.1/images/add_userbutton_hover.gif | Bin 1540 -> 0 bytes ui/2.1/images/addnetgroup_button.gif | Bin 1885 -> 0 bytes ui/2.1/images/addnetgroup_button_hover.gif | Bin 1957 -> 0 bytes ui/2.1/images/admin_vmblue_left.gif | Bin 487 -> 0 bytes ui/2.1/images/admin_vmblue_mid.gif | Bin 464 -> 0 bytes ui/2.1/images/admin_vmblue_right.gif | Bin 481 -> 0 bytes ui/2.1/images/admin_vmconsole.gif | Bin 1541 -> 0 bytes ui/2.1/images/admin_vmconsole_hover.gif | Bin 1556 -> 0 bytes ui/2.1/images/admin_vmgrey_left.gif | Bin 454 -> 0 bytes ui/2.1/images/admin_vmgrey_mid.gif | Bin 300 -> 0 bytes ui/2.1/images/admin_vmgrey_right.gif | Bin 453 -> 0 bytes ui/2.1/images/admin_vmyellow_left.gif | Bin 453 -> 0 bytes ui/2.1/images/admin_vmyellow_mid.gif | Bin 292 -> 0 bytes ui/2.1/images/admin_vmyellow_right.gif | Bin 450 -> 0 bytes ui/2.1/images/adv_searchbutton.gif | Bin 781 -> 0 bytes ui/2.1/images/adv_searchbutton_hover.gif | Bin 781 -> 0 bytes ui/2.1/images/ajax-loader.gif | Bin 1849 -> 0 bytes ui/2.1/images/alert_icon.png | Bin 545 -> 0 bytes ui/2.1/images/alerttitle_icons.gif | Bin 1567 -> 0 bytes ui/2.1/images/alpha_rowbg.png | Bin 143 -> 0 bytes ui/2.1/images/alpha_vmrowbg.png | Bin 156 -> 0 bytes ui/2.1/images/arrow_bullet.gif | Bin 49 -> 0 bytes ui/2.1/images/bigrotation2.gif | Bin 1787 -> 0 bytes ui/2.1/images/bootable_nonselectedicon.gif | Bin 1034 -> 0 bytes ui/2.1/images/bootable_selectedicon.gif | Bin 997 -> 0 bytes ui/2.1/images/box_bullet.gif | Bin 193 -> 0 bytes ui/2.1/images/bytes_in.gif | Bin 1058 -> 0 bytes ui/2.1/images/bytes_out.gif | Bin 1023 -> 0 bytes ui/2.1/images/calendar_icon.gif | Bin 1062 -> 0 bytes ui/2.1/images/capacitypanel_bot.gif | Bin 12878 -> 0 bytes ui/2.1/images/capacitypanel_mid.gif | Bin 1291 -> 0 bytes ui/2.1/images/capacitypanel_top.gif | Bin 15212 -> 0 bytes ui/2.1/images/close_button.png | Bin 1450 -> 0 bytes ui/2.1/images/close_button_hover.png | Bin 2034 -> 0 bytes ui/2.1/images/cloud_logo.gif | Bin 8973 -> 0 bytes ui/2.1/images/console_bg.png | Bin 4868 -> 0 bytes ui/2.1/images/cproxytitle_icons.gif | Bin 1609 -> 0 bytes ui/2.1/images/cpu_icon.gif | Bin 1095 -> 0 bytes ui/2.1/images/crosszone_nonselectedicon.gif | Bin 1056 -> 0 bytes ui/2.1/images/crosszone_selectedicon.gif | Bin 1072 -> 0 bytes ui/2.1/images/dashboardtitle_icons.gif | Bin 1677 -> 0 bytes ui/2.1/images/db_bardg_bg.gif | Bin 1202 -> 0 bytes ui/2.1/images/db_bardg_titlebg.gif | Bin 697 -> 0 bytes ui/2.1/images/db_domain_top.gif | Bin 6638 -> 0 bytes ui/2.1/images/db_domainbg.gif | Bin 955 -> 0 bytes ui/2.1/images/db_vmmid.gif | Bin 204 -> 0 bytes ui/2.1/images/db_vmyellowmid.gif | Bin 387 -> 0 bytes ui/2.1/images/details_downarrow.jpg | Bin 158 -> 0 bytes ui/2.1/images/details_uparrow.jpg | Bin 158 -> 0 bytes ui/2.1/images/disk_icon.gif | Bin 582 -> 0 bytes ui/2.1/images/diskofftitle_icons.gif | Bin 1416 -> 0 bytes ui/2.1/images/display_boxbot.gif | Bin 5690 -> 0 bytes ui/2.1/images/display_boxmid.gif | Bin 321 -> 0 bytes ui/2.1/images/display_boxtop.gif | Bin 4066 -> 0 bytes ui/2.1/images/display_deleteicon.png | Bin 166 -> 0 bytes ui/2.1/images/display_deleteicon_hover.png | Bin 166 -> 0 bytes ui/2.1/images/display_editicon.png | Bin 286 -> 0 bytes ui/2.1/images/display_editicon_hover.png | Bin 282 -> 0 bytes ui/2.1/images/display_headerbg.gif | Bin 206 -> 0 bytes ui/2.1/images/display_rollbackicon.png | Bin 341 -> 0 bytes ui/2.1/images/display_rollbackicon_hover.png | Bin 341 -> 0 bytes ui/2.1/images/displaygrid_loader.gif | Bin 1849 -> 0 bytes ui/2.1/images/domain_dbaccount.gif | Bin 2686 -> 0 bytes ui/2.1/images/domain_dbdiskoff.gif | Bin 4467 -> 0 bytes ui/2.1/images/domain_dbinstance.gif | Bin 3526 -> 0 bytes ui/2.1/images/domain_dbsnapshots.gif | Bin 3693 -> 0 bytes ui/2.1/images/domain_serachboxleft.gif | Bin 2274 -> 0 bytes ui/2.1/images/domain_serachboxmid.gif | Bin 508 -> 0 bytes ui/2.1/images/domain_serachboxright.gif | Bin 2492 -> 0 bytes ui/2.1/images/domaintitle_icons.gif | Bin 1443 -> 0 bytes ui/2.1/images/domdetailsbox_left.gif | Bin 3482 -> 0 bytes ui/2.1/images/domdetailsbox_mid.gif | Bin 392 -> 0 bytes ui/2.1/images/domdetailsbox_right.gif | Bin 2769 -> 0 bytes ui/2.1/images/eventstitle_icons.gif | Bin 1546 -> 0 bytes ui/2.1/images/featured_nonselectedicon.gif | Bin 950 -> 0 bytes ui/2.1/images/featured_selectedicon.gif | Bin 967 -> 0 bytes ui/2.1/images/graph_titleicon.gif | Bin 1200 -> 0 bytes ui/2.1/images/green_statusbar.gif | Bin 536 -> 0 bytes ui/2.1/images/grey_statusbar.gif | Bin 326 -> 0 bytes ui/2.1/images/grid_headerbg | Bin 224 -> 0 bytes ui/2.1/images/grid_headerbg.gif | Bin 204 -> 0 bytes ui/2.1/images/grid_loader.gif | Bin 1849 -> 0 bytes ui/2.1/images/grid_morebutton.gif | Bin 1427 -> 0 bytes ui/2.1/images/grid_morebutton_hover.gif | Bin 1427 -> 0 bytes ui/2.1/images/gridresult_closebutton.gif | Bin 1230 -> 0 bytes .../images/gridresult_closebutton_hover.gif | Bin 1231 -> 0 bytes ui/2.1/images/gridsorting_downarrow.gif | Bin 51 -> 0 bytes ui/2.1/images/gridsorting_uparrow.gif | Bin 51 -> 0 bytes ui/2.1/images/group_icon.gif | Bin 634 -> 0 bytes ui/2.1/images/gsettingstitle_icons.gif | Bin 1543 -> 0 bytes ui/2.1/images/ha_disable.gif | Bin 785 -> 0 bytes ui/2.1/images/ha_enable.gif | Bin 803 -> 0 bytes ui/2.1/images/header_bg | Bin 491 -> 0 bytes ui/2.1/images/header_bg.gif | Bin 519 -> 0 bytes ui/2.1/images/help_actionicon.png | Bin 809 -> 0 bytes ui/2.1/images/hostdetails_headerbg.jpg | Bin 410 -> 0 bytes ui/2.1/images/hostnetwork_icon.gif | Bin 722 -> 0 bytes ui/2.1/images/hosttitle_icons.gif | Bin 1641 -> 0 bytes ui/2.1/images/hvm_nonselectedicon.gif | Bin 839 -> 0 bytes ui/2.1/images/hvm_selectedicon.gif | Bin 858 -> 0 bytes ui/2.1/images/instancetitle_icons.gif | Bin 1654 -> 0 bytes ui/2.1/images/ip_ORicon.gif | Bin 749 -> 0 bytes ui/2.1/images/ip_detailtopbox.gif | Bin 8412 -> 0 bytes ui/2.1/images/ip_managebox_bg.gif | Bin 175 -> 0 bytes ui/2.1/images/ip_managebox_icon.gif | Bin 770 -> 0 bytes ui/2.1/images/ip_searchbutton.gif | Bin 767 -> 0 bytes ui/2.1/images/ipbox_nonselected.gif | Bin 941 -> 0 bytes ui/2.1/images/ipbox_selected.gif | Bin 2313 -> 0 bytes ui/2.1/images/ipdescr_boxbot.gif | Bin 16820 -> 0 bytes ui/2.1/images/ipdescr_boxmid.gif | Bin 6626 -> 0 bytes ui/2.1/images/ipdescr_boxtop.gif | Bin 10762 -> 0 bytes ui/2.1/images/ipdescr_contbot.gif | Bin 2148 -> 0 bytes ui/2.1/images/ipdescr_contbot_blank.gif | Bin 2345 -> 0 bytes ui/2.1/images/ipdescr_contmid.gif | Bin 824 -> 0 bytes ui/2.1/images/ipdescr_contmid_blank.gif | Bin 1227 -> 0 bytes ui/2.1/images/ipdescr_conttop.gif | Bin 5976 -> 0 bytes ui/2.1/images/ipdescr_conttop_blank.gif | Bin 5756 -> 0 bytes ui/2.1/images/iptitle_icons.gif | Bin 1599 -> 0 bytes ui/2.1/images/isotitle_icons.gif | Bin 1671 -> 0 bytes ui/2.1/images/laoding.gif | Bin 14647 -> 0 bytes ui/2.1/images/load_add.gif | Bin 870 -> 0 bytes ui/2.1/images/load_addicon.gif | Bin 354 -> 0 bytes ui/2.1/images/load_aniloader.gif | Bin 1849 -> 0 bytes ui/2.1/images/load_joint.gif | Bin 59 -> 0 bytes ui/2.1/images/load_routericon.gif | Bin 3674 -> 0 bytes ui/2.1/images/load_stoppedvm.gif | Bin 3650 -> 0 bytes ui/2.1/images/load_workingvm.gif | Bin 2723 -> 0 bytes ui/2.1/images/loadgr_closebutton.png | Bin 474 -> 0 bytes ui/2.1/images/loadgr_closebutton_hover.png | Bin 487 -> 0 bytes ui/2.1/images/loadind_textbg.gif | Bin 407 -> 0 bytes ui/2.1/images/loading.gif | Bin 2718 -> 0 bytes ui/2.1/images/loading_1.gif | Bin 2704 -> 0 bytes ui/2.1/images/loading_addbg.gif | Bin 870 -> 0 bytes ui/2.1/images/loading_load.gif | Bin 870 -> 0 bytes ui/2.1/images/loading_messagebg.gif | Bin 225 -> 0 bytes ui/2.1/images/loadingmsg_left.gif | Bin 609 -> 0 bytes ui/2.1/images/loadingmsg_mid.gif | Bin 776 -> 0 bytes ui/2.1/images/loadingmsg_right.gif | Bin 657 -> 0 bytes ui/2.1/images/loadnetwork_titleicon.gif | Bin 777 -> 0 bytes ui/2.1/images/loadtitle_icons.gif | Bin 1507 -> 0 bytes ui/2.1/images/loadvm_loader.gif | Bin 1849 -> 0 bytes ui/2.1/images/logo.gif | Bin 11559 -> 0 bytes ui/2.1/images/logout_bg.gif | Bin 547 -> 0 bytes ui/2.1/images/logout_bot.gif | Bin 7037 -> 0 bytes ui/2.1/images/logout_cloudlogo.gif | Bin 4743 -> 0 bytes ui/2.1/images/logout_logo.gif | Bin 4291 -> 0 bytes ui/2.1/images/logout_mid.gif | Bin 570 -> 0 bytes ui/2.1/images/logout_top.gif | Bin 46277 -> 0 bytes ui/2.1/images/mcontent_bg.gif | Bin 179 -> 0 bytes ui/2.1/images/memory_icon.gif | Bin 1159 -> 0 bytes ui/2.1/images/overlay_morebot.png | Bin 1346 -> 0 bytes ui/2.1/images/overlay_moremid.png | Bin 314 -> 0 bytes ui/2.1/images/overlay_moretop.png | Bin 970 -> 0 bytes ui/2.1/images/pagination_bg.gif | Bin 108 -> 0 bytes ui/2.1/images/pagination_firsticon.gif | Bin 636 -> 0 bytes ui/2.1/images/pagination_lasticon.gif | Bin 636 -> 0 bytes ui/2.1/images/pagination_nexticon.gif | Bin 615 -> 0 bytes ui/2.1/images/pagination_previcon.gif | Bin 618 -> 0 bytes ui/2.1/images/pagination_refresh.gif | Bin 1147 -> 0 bytes ui/2.1/images/password_nonselectedicon.gif | Bin 1014 -> 0 bytes ui/2.1/images/password_selectedicon.gif | Bin 1447 -> 0 bytes ui/2.1/images/pin_icon.gif | Bin 601 -> 0 bytes ui/2.1/images/portnetwork_titleicon.gif | Bin 805 -> 0 bytes ui/2.1/images/primestoragetitle_icons.gif | Bin 1704 -> 0 bytes ui/2.1/images/public_nonselectedicon.gif | Bin 906 -> 0 bytes ui/2.1/images/public_selectedicon.gif | Bin 901 -> 0 bytes ui/2.1/images/red_statusbar.gif | Bin 535 -> 0 bytes ui/2.1/images/register_box.gif | Bin 2016 -> 0 bytes ui/2.1/images/rev_wizbot.gif | Bin 661 -> 0 bytes ui/2.1/images/rev_wizmid.gif | Bin 149 -> 0 bytes ui/2.1/images/rev_wiztop.jpg | Bin 22700 -> 0 bytes ui/2.1/images/revwiz_backbutton.gif | Bin 1383 -> 0 bytes ui/2.1/images/revwiz_closebutton.gif | Bin 1295 -> 0 bytes ui/2.1/images/revwiz_closebutton_hover.gif | Bin 1297 -> 0 bytes ui/2.1/images/revwiz_nextbutton.gif | Bin 2733 -> 0 bytes ui/2.1/images/revwiz_nonselcted_tempbut.gif | Bin 2278 -> 0 bytes .../revwiz_nonselcted_tempbut_hover.gif | Bin 4481 -> 0 bytes ui/2.1/images/revwiz_nonselectednumber.gif | Bin 2179 -> 0 bytes ui/2.1/images/revwiz_selcted_tempbut.gif | Bin 5065 -> 0 bytes ui/2.1/images/revwiz_selectednumber.gif | Bin 2187 -> 0 bytes ui/2.1/images/routerstitle_icons.gif | Bin 1582 -> 0 bytes ui/2.1/images/running_icon.gif | Bin 588 -> 0 bytes ui/2.1/images/safebar_bg.gif | Bin 197 -> 0 bytes ui/2.1/images/search_closearrow.gif | Bin 203 -> 0 bytes ui/2.1/images/search_closeicon.gif | Bin 201 -> 0 bytes ui/2.1/images/search_closeicon_hover.gif | Bin 201 -> 0 bytes ui/2.1/images/search_resulticon.gif | Bin 1166 -> 0 bytes ui/2.1/images/searchicon_button.jpg | Bin 1460 -> 0 bytes ui/2.1/images/searchicon_button_hover.jpg | Bin 1486 -> 0 bytes ui/2.1/images/searchpanel_bg.gif | Bin 207 -> 0 bytes ui/2.1/images/secondstoragetitle_icons.gif | Bin 1699 -> 0 bytes ui/2.1/images/select_ipbg.gif | Bin 7263 -> 0 bytes ui/2.1/images/select_ipbg_admin.gif | Bin 11051 -> 0 bytes ui/2.1/images/serviceofftitle_icons.gif | Bin 1451 -> 0 bytes ui/2.1/images/sgtitle_icons.gif | Bin 1418 -> 0 bytes ui/2.1/images/small_ppbot.png | Bin 2866 -> 0 bytes ui/2.1/images/small_ppmid.png | Bin 602 -> 0 bytes ui/2.1/images/small_pptop.png | Bin 2794 -> 0 bytes ui/2.1/images/smenu_selectedbg.gif | Bin 235 -> 0 bytes ui/2.1/images/sprint.gif | Bin 17003 -> 0 bytes ui/2.1/images/sprite1.gif | Bin 65239 -> 0 bytes ui/2.1/images/srow_loading.png | Bin 120 -> 0 bytes ui/2.1/images/step1.png | Bin 1190 -> 0 bytes ui/2.1/images/step2.png | Bin 1483 -> 0 bytes ui/2.1/images/step3.png | Bin 1537 -> 0 bytes ui/2.1/images/step4.png | Bin 1395 -> 0 bytes ui/2.1/images/stepbox_slected.gif | Bin 253 -> 0 bytes ui/2.1/images/stopped_icon.gif | Bin 550 -> 0 bytes ui/2.1/images/stopped_vm.gif | Bin 3400 -> 0 bytes ui/2.1/images/storagetitle_icons.gif | Bin 1777 -> 0 bytes ui/2.1/images/submenu_bg.gif | Bin 144 -> 0 bytes ui/2.1/images/submenu_linkbg.gif | Bin 2212 -> 0 bytes ui/2.1/images/temp_centosicon.gif | Bin 1024 -> 0 bytes ui/2.1/images/temp_deleteicon.gif | Bin 562 -> 0 bytes ui/2.1/images/temp_deleteicon_hover.gif | Bin 562 -> 0 bytes ui/2.1/images/temp_editicon.gif | Bin 551 -> 0 bytes ui/2.1/images/temp_editicon_hover.gif | Bin 550 -> 0 bytes ui/2.1/images/temp_linuxicon.gif | Bin 552 -> 0 bytes ui/2.1/images/temp_windowsicon.gif | Bin 1083 -> 0 bytes ui/2.1/images/templatestitle_icons.gif | Bin 1527 -> 0 bytes ui/2.1/images/test_icon.gif | Bin 1048 -> 0 bytes ui/2.1/images/tick_arrow.gif | Bin 372 -> 0 bytes ui/2.1/images/total_vm.gif | Bin 3066 -> 0 bytes ui/2.1/images/tree_boxright.gif | Bin 3219 -> 0 bytes ui/2.1/images/tree_eventicon.gif | Bin 581 -> 0 bytes ui/2.1/images/tree_minusopen_icon.png | Bin 728 -> 0 bytes ui/2.1/images/trusted_icon.gif | Bin 916 -> 0 bytes ui/2.1/images/unknown_icon.gif | Bin 885 -> 0 bytes ui/2.1/images/unsafebar_bg.gif | Bin 160 -> 0 bytes ui/2.1/images/untrusted_icon.gif | Bin 955 -> 0 bytes ui/2.1/images/userlinks_bgleft.gif | Bin 640 -> 0 bytes ui/2.1/images/userlinks_bgmid.gif | Bin 285 -> 0 bytes ui/2.1/images/userlinks_bgright.gif | Bin 639 -> 0 bytes ui/2.1/images/userlogin_mid.gif | Bin 55 -> 0 bytes ui/2.1/images/v1_logo.gif | Bin 8453 -> 0 bytes ui/2.1/images/v1_popupbuttonbg.gif | Bin 920 -> 0 bytes ui/2.1/images/v1_popupbuttonbg_hover.gif | Bin 894 -> 0 bytes ui/2.1/images/v1_popupheaderbg.gif | Bin 592 -> 0 bytes ui/2.1/images/v1_vmopoup_left.png | Bin 1930 -> 0 bytes ui/2.1/images/v1_vmopoup_mid.png | Bin 395 -> 0 bytes ui/2.1/images/v1_vmopoup_right.png | Bin 2905 -> 0 bytes ui/2.1/images/v1adddiskoff_button.gif | Bin 1798 -> 0 bytes ui/2.1/images/v1adddiskoff_button_hover.gif | Bin 1887 -> 0 bytes ui/2.1/images/v1addhost_button.gif | Bin 1278 -> 0 bytes ui/2.1/images/v1addhost_button_hover.gif | Bin 1351 -> 0 bytes ui/2.1/images/v1addiso_button.gif | Bin 1387 -> 0 bytes ui/2.1/images/v1addiso_button_hover.gif | Bin 1442 -> 0 bytes ui/2.1/images/v1addloadbalncer_button.gif | Bin 2822 -> 0 bytes .../images/v1addloadbalncer_button_hover.gif | Bin 2710 -> 0 bytes ui/2.1/images/v1addnewvm_button.gif | Bin 1755 -> 0 bytes ui/2.1/images/v1addnewvm_button_hover.gif | Bin 1903 -> 0 bytes ui/2.1/images/v1addpstorage_button.gif | Bin 1987 -> 0 bytes ui/2.1/images/v1addpstorage_button_hover.gif | Bin 2037 -> 0 bytes ui/2.1/images/v1addserviceoff_button.gif | Bin 1951 -> 0 bytes .../images/v1addserviceoff_button_hover.gif | Bin 2022 -> 0 bytes ui/2.1/images/v1addsggroup_button.gif | Bin 2868 -> 0 bytes ui/2.1/images/v1addsggroup_button_hover.gif | Bin 2946 -> 0 bytes ui/2.1/images/v1addsstorage_button.gif | Bin 2126 -> 0 bytes ui/2.1/images/v1addsstorage_button_hover.gif | Bin 2239 -> 0 bytes ui/2.1/images/v1addtemplate_button.gif | Bin 1649 -> 0 bytes ui/2.1/images/v1addtemplate_button_hover.gif | Bin 1725 -> 0 bytes ui/2.1/images/v1addvolume_button.gif | Bin 1442 -> 0 bytes ui/2.1/images/v1addvolume_button_hover.gif | Bin 1488 -> 0 bytes ui/2.1/images/v1admin_menutab_off.gif | Bin 1611 -> 0 bytes ui/2.1/images/v1admin_menutab_off_hover.gif | Bin 1589 -> 0 bytes ui/2.1/images/v1admin_menutab_on.gif | Bin 250 -> 0 bytes ui/2.1/images/v1aquireip_button.gif | Bin 1611 -> 0 bytes ui/2.1/images/v1aquireip_button_hover.gif | Bin 1717 -> 0 bytes ui/2.1/images/v1grid_morebutton.gif | Bin 1754 -> 0 bytes ui/2.1/images/v1grid_morebutton_hover.gif | Bin 1313 -> 0 bytes ui/2.1/images/v1gridheader_bg.gif | Bin 357 -> 0 bytes ui/2.1/images/v1header_bg.gif | Bin 539 -> 0 bytes ui/2.1/images/v1menutab_off.gif | Bin 2226 -> 0 bytes ui/2.1/images/v1menutab_off_hover.gif | Bin 2137 -> 0 bytes ui/2.1/images/v1menutab_on.gif | Bin 381 -> 0 bytes ui/2.1/images/v1stepbox_slected.gif | Bin 791 -> 0 bytes ui/2.1/images/v1stepcontainer_bg.gif | Bin 741 -> 0 bytes ui/2.1/images/vm_actionbg.gif | Bin 230 -> 0 bytes ui/2.1/images/vm_continuebutton.gif | Bin 950 -> 0 bytes ui/2.1/images/vm_continuebutton.png | Bin 1355 -> 0 bytes ui/2.1/images/vm_continuebutton_hover.gif | Bin 1390 -> 0 bytes ui/2.1/images/vm_continuebutton_hover.png | Bin 1611 -> 0 bytes ui/2.1/images/vm_greenarrow.gif | Bin 131 -> 0 bytes ui/2.1/images/vm_greyarrow.gif | Bin 122 -> 0 bytes ui/2.1/images/vm_redarrow.gif | Bin 129 -> 0 bytes ui/2.1/images/vmbot_loader.gif | Bin 1849 -> 0 bytes ui/2.1/images/vmdropdown_closebutt.gif | Bin 510 -> 0 bytes ui/2.1/images/vmdropdown_closebutt_hover.gif | Bin 520 -> 0 bytes ui/2.1/images/vmopoup_left.png | Bin 3770 -> 0 bytes ui/2.1/images/vmopoup_mid.png | Bin 691 -> 0 bytes ui/2.1/images/vmopoup_right.png | Bin 2962 -> 0 bytes ui/2.1/images/windowsconsole_icon.gif | Bin 1422 -> 0 bytes ui/2.1/images/windowsconsole_iconhover.gif | Bin 1373 -> 0 bytes ui/2.1/images/wizard_contentbg.gif | Bin 201 -> 0 bytes ui/2.1/images/working_vm.gif | Bin 3112 -> 0 bytes ui/2.1/images/yellow_statusbar.gif | Bin 529 -> 0 bytes ui/2.1/images/zone_addicon.png | Bin 880 -> 0 bytes ui/2.1/images/zone_addipbutton.gif | Bin 1574 -> 0 bytes ui/2.1/images/zone_addipbutton_hover.gif | Bin 1581 -> 0 bytes ui/2.1/images/zone_addpodbutton.gif | Bin 1124 -> 0 bytes ui/2.1/images/zone_addpodbutton_hover.gif | Bin 1137 -> 0 bytes ui/2.1/images/zone_addpubIP.gif | Bin 1547 -> 0 bytes ui/2.1/images/zone_addpubIP_hover.gif | Bin 1552 -> 0 bytes ui/2.1/images/zone_changeipbutton.gif | Bin 1212 -> 0 bytes ui/2.1/images/zone_changeipbutton_hover.gif | Bin 1649 -> 0 bytes ui/2.1/images/zone_deletebutton.gif | Bin 1017 -> 0 bytes ui/2.1/images/zone_deletebutton_hover.gif | Bin 1022 -> 0 bytes ui/2.1/images/zone_detailsboxleft.gif | Bin 2310 -> 0 bytes ui/2.1/images/zone_detailsboxmid.gif | Bin 248 -> 0 bytes ui/2.1/images/zone_detailsboxright.gif | Bin 1805 -> 0 bytes ui/2.1/images/zone_directipbutton.gif | Bin 1530 -> 0 bytes ui/2.1/images/zone_directipbutton_hover.gif | Bin 1540 -> 0 bytes ui/2.1/images/zone_directipicon.png | Bin 1024 -> 0 bytes ui/2.1/images/zone_editpodbutton.gif | Bin 1090 -> 0 bytes ui/2.1/images/zone_editpodbutton_hover.gif | Bin 1115 -> 0 bytes ui/2.1/images/zone_editzonebutton.gif | Bin 1131 -> 0 bytes ui/2.1/images/zone_editzonebutton_hover.gif | Bin 1137 -> 0 bytes ui/2.1/images/zone_enablefirewallbutton.gif | Bin 1382 -> 0 bytes .../zone_enablefirewallbutton_hover.gif | Bin 1874 -> 0 bytes ui/2.1/images/zone_ipicon.png | Bin 1023 -> 0 bytes ui/2.1/images/zone_openarrow.png | Bin 251 -> 0 bytes ui/2.1/images/zone_podicon.png | Bin 1055 -> 0 bytes ui/2.1/images/zone_sidearrow.png | Bin 283 -> 0 bytes ui/2.1/images/zone_zoneicon.png | Bin 1284 -> 0 bytes ui/2.1/images/zonedetails_left.gif | Bin 6261 -> 0 bytes ui/2.1/images/zonedetails_mid.gif | Bin 476 -> 0 bytes ui/2.1/images/zonedetails_right.gif | Bin 5046 -> 0 bytes ui/2.1/images/zonestitle_icons.gif | Bin 1560 -> 0 bytes ui/2.1/images/zonetree_addbutton.jpg | Bin 2679 -> 0 bytes ui/2.1/images/zonetree_blankbutton.jpg | Bin 1678 -> 0 bytes ui/2.1/images/zonetree_left.gif | Bin 2547 -> 0 bytes ui/2.1/images/zonetree_mid.gif | Bin 387 -> 0 bytes ui/2.1/images/zonetree_nonselectedbutton.jpg | Bin 2328 -> 0 bytes ui/2.1/images/zonetree_right.gif | Bin 2864 -> 0 bytes ui/2.1/images/zonetree_selectedbutton.jpg | Bin 2505 -> 0 bytes ui/2.1/index.jsp | 182 - ui/2.1/jsp/tab_accounts.jsp | 214 - ui/2.1/jsp/tab_configuration.jsp | 973 -- ui/2.1/jsp/tab_dashboard.jsp | 535 -- ui/2.1/jsp/tab_domains.jsp | 146 - ui/2.1/jsp/tab_events.jsp | 379 - ui/2.1/jsp/tab_hosts.jsp | 319 - ui/2.1/jsp/tab_instances.jsp | 1725 ---- ui/2.1/jsp/tab_networking.jsp | 890 -- ui/2.1/jsp/tab_storage.jsp | 1534 ---- ui/2.1/jsp/tab_templates.jsp | 694 -- ui/2.1/scripts/cloud.core.accounts.js | 322 - ui/2.1/scripts/cloud.core.callbacks.js | 91 - ui/2.1/scripts/cloud.core.configuration.js | 1734 ---- ui/2.1/scripts/cloud.core.domains.js | 399 - ui/2.1/scripts/cloud.core.events.js | 284 - ui/2.1/scripts/cloud.core.hosts.js | 709 -- ui/2.1/scripts/cloud.core.init.js | 802 -- ui/2.1/scripts/cloud.core.instances.js | 2648 ------ ui/2.1/scripts/cloud.core.js | 864 -- ui/2.1/scripts/cloud.core.network.js | 1762 ---- ui/2.1/scripts/cloud.core.storage.js | 2214 ----- ui/2.1/scripts/cloud.core.templates.js | 1121 --- ui/2.1/scripts/cloud.logger.js | 288 - ui/2.1/scripts/date.js | 127 - ui/2.1/scripts/jquery-1.4.2.min.js | 154 - ui/2.1/scripts/jquery-ui-1.8.2.custom.min.js | 1012 --- ui/2.1/scripts/jquery.cookies.js | 96 - ui/2.1/scripts/jquery.md5.js | 229 - ui/2.1/scripts/jquery.timers.js | 138 - ui/scripts/cloud.core.networkoffering.js | 2 +- 432 files changed, 1 insertion(+), 32070 deletions(-) delete mode 100644 ui/2.1/css/cloud_custom.css delete mode 100644 ui/2.1/css/images/._ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 ui/2.1/css/images/._ui-bg_flat_75_ffffff_40x100.png delete mode 100644 ui/2.1/css/images/._ui-bg_glass_30_393939_1x400.png delete mode 100644 ui/2.1/css/images/._ui-bg_glass_30_ffffff_1x400.png delete mode 100644 ui/2.1/css/images/._ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 ui/2.1/css/images/._ui-bg_inset-soft_95_fef1ec_1x100.png delete mode 100644 ui/2.1/css/images/._ui-icons_222222_256x240.png delete mode 100644 ui/2.1/css/images/._ui-icons_2e83ff_256x240.png delete mode 100644 ui/2.1/css/images/._ui-icons_FFF_256x240.png delete mode 100644 ui/2.1/css/images/._ui-icons_cd0a0a_256x240.png delete mode 100644 ui/2.1/css/images/._ui-icons_ffffff_256x240.png delete mode 100644 ui/2.1/css/images/alert_icon.png delete mode 100644 ui/2.1/css/images/clr_button.gif delete mode 100644 ui/2.1/css/images/clr_button_hover.gif delete mode 100644 ui/2.1/css/images/comment_loader.gif delete mode 100644 ui/2.1/css/images/grid_headerbg.gif delete mode 100644 ui/2.1/css/images/groupbox_top.gif delete mode 100644 ui/2.1/css/images/minimize_button.gif delete mode 100644 ui/2.1/css/images/minimize_button_hover.gif delete mode 100644 ui/2.1/css/images/play_button.gif delete mode 100644 ui/2.1/css/images/play_button_hover.gif delete mode 100644 ui/2.1/css/images/shrink_button.gif delete mode 100644 ui/2.1/css/images/shrink_button_hover.gif delete mode 100644 ui/2.1/css/images/sortable_groupbox.gif delete mode 100644 ui/2.1/css/images/sortable_leftarrow.gif delete mode 100644 ui/2.1/css/images/sortable_leftarrow_hover.gif delete mode 100644 ui/2.1/css/images/sortable_rightarrow.gif delete mode 100644 ui/2.1/css/images/sortable_rightarrow_hover.gif delete mode 100644 ui/2.1/css/images/stop_button.gif delete mode 100644 ui/2.1/css/images/stop_button_hover.gif delete mode 100644 ui/2.1/css/images/ui-bg_errorglass_30_ffffff_1x400.png delete mode 100644 ui/2.1/css/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 ui/2.1/css/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100644 ui/2.1/css/images/ui-bg_glass_30_393939_1x400.png delete mode 100644 ui/2.1/css/images/ui-bg_glass_30_ffffff_1x400.png delete mode 100644 ui/2.1/css/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 ui/2.1/css/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 ui/2.1/css/images/ui-bg_glass_75_000000_1x400.png delete mode 100644 ui/2.1/css/images/ui-bg_glass_75_212121_1x400.png delete mode 100644 ui/2.1/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png delete mode 100644 ui/2.1/css/images/ui-icons_222222_256x240.png delete mode 100644 ui/2.1/css/images/ui-icons_2e83ff_256x240.png delete mode 100644 ui/2.1/css/images/ui-icons_454545_256x240.png delete mode 100644 ui/2.1/css/images/ui-icons_FFF_256x240.png delete mode 100644 ui/2.1/css/images/ui-icons_cd0a0a_256x240.png delete mode 100644 ui/2.1/css/images/ui-icons_ffffff_256x240.png delete mode 100644 ui/2.1/css/jquery-ui-1.7.2.custom.css delete mode 100644 ui/2.1/css/jquery-ui-1.8.2.custom.css delete mode 100644 ui/2.1/css/logger.css delete mode 100644 ui/2.1/css/main.css delete mode 100644 ui/2.1/favicon.ico delete mode 100644 ui/2.1/images/32bit_icon.gif delete mode 100644 ui/2.1/images/64bit_icon.gif delete mode 100644 ui/2.1/images/ISO_OFF.gif delete mode 100644 ui/2.1/images/ISO_ON.gif delete mode 100644 ui/2.1/images/KVM_icon.gif delete mode 100644 ui/2.1/images/XEN_icon.gif delete mode 100644 ui/2.1/images/account_bg.gif delete mode 100644 ui/2.1/images/account_shadow.gif delete mode 100644 ui/2.1/images/accountstitle_icons.gif delete mode 100644 ui/2.1/images/add_domainbutton.gif delete mode 100644 ui/2.1/images/add_domainbutton_hover.gif delete mode 100644 ui/2.1/images/add_ipbutton.gif delete mode 100644 ui/2.1/images/add_ipbutton_hover.gif delete mode 100644 ui/2.1/images/add_userbutton.gif delete mode 100644 ui/2.1/images/add_userbutton_hover.gif delete mode 100644 ui/2.1/images/addnetgroup_button.gif delete mode 100644 ui/2.1/images/addnetgroup_button_hover.gif delete mode 100644 ui/2.1/images/admin_vmblue_left.gif delete mode 100644 ui/2.1/images/admin_vmblue_mid.gif delete mode 100644 ui/2.1/images/admin_vmblue_right.gif delete mode 100644 ui/2.1/images/admin_vmconsole.gif delete mode 100644 ui/2.1/images/admin_vmconsole_hover.gif delete mode 100644 ui/2.1/images/admin_vmgrey_left.gif delete mode 100644 ui/2.1/images/admin_vmgrey_mid.gif delete mode 100644 ui/2.1/images/admin_vmgrey_right.gif delete mode 100644 ui/2.1/images/admin_vmyellow_left.gif delete mode 100644 ui/2.1/images/admin_vmyellow_mid.gif delete mode 100644 ui/2.1/images/admin_vmyellow_right.gif delete mode 100644 ui/2.1/images/adv_searchbutton.gif delete mode 100644 ui/2.1/images/adv_searchbutton_hover.gif delete mode 100644 ui/2.1/images/ajax-loader.gif delete mode 100644 ui/2.1/images/alert_icon.png delete mode 100644 ui/2.1/images/alerttitle_icons.gif delete mode 100644 ui/2.1/images/alpha_rowbg.png delete mode 100644 ui/2.1/images/alpha_vmrowbg.png delete mode 100644 ui/2.1/images/arrow_bullet.gif delete mode 100644 ui/2.1/images/bigrotation2.gif delete mode 100644 ui/2.1/images/bootable_nonselectedicon.gif delete mode 100644 ui/2.1/images/bootable_selectedicon.gif delete mode 100644 ui/2.1/images/box_bullet.gif delete mode 100644 ui/2.1/images/bytes_in.gif delete mode 100644 ui/2.1/images/bytes_out.gif delete mode 100644 ui/2.1/images/calendar_icon.gif delete mode 100644 ui/2.1/images/capacitypanel_bot.gif delete mode 100644 ui/2.1/images/capacitypanel_mid.gif delete mode 100644 ui/2.1/images/capacitypanel_top.gif delete mode 100644 ui/2.1/images/close_button.png delete mode 100644 ui/2.1/images/close_button_hover.png delete mode 100644 ui/2.1/images/cloud_logo.gif delete mode 100644 ui/2.1/images/console_bg.png delete mode 100644 ui/2.1/images/cproxytitle_icons.gif delete mode 100644 ui/2.1/images/cpu_icon.gif delete mode 100644 ui/2.1/images/crosszone_nonselectedicon.gif delete mode 100644 ui/2.1/images/crosszone_selectedicon.gif delete mode 100644 ui/2.1/images/dashboardtitle_icons.gif delete mode 100644 ui/2.1/images/db_bardg_bg.gif delete mode 100644 ui/2.1/images/db_bardg_titlebg.gif delete mode 100644 ui/2.1/images/db_domain_top.gif delete mode 100644 ui/2.1/images/db_domainbg.gif delete mode 100644 ui/2.1/images/db_vmmid.gif delete mode 100644 ui/2.1/images/db_vmyellowmid.gif delete mode 100644 ui/2.1/images/details_downarrow.jpg delete mode 100644 ui/2.1/images/details_uparrow.jpg delete mode 100644 ui/2.1/images/disk_icon.gif delete mode 100644 ui/2.1/images/diskofftitle_icons.gif delete mode 100644 ui/2.1/images/display_boxbot.gif delete mode 100644 ui/2.1/images/display_boxmid.gif delete mode 100644 ui/2.1/images/display_boxtop.gif delete mode 100644 ui/2.1/images/display_deleteicon.png delete mode 100644 ui/2.1/images/display_deleteicon_hover.png delete mode 100644 ui/2.1/images/display_editicon.png delete mode 100644 ui/2.1/images/display_editicon_hover.png delete mode 100644 ui/2.1/images/display_headerbg.gif delete mode 100644 ui/2.1/images/display_rollbackicon.png delete mode 100644 ui/2.1/images/display_rollbackicon_hover.png delete mode 100644 ui/2.1/images/displaygrid_loader.gif delete mode 100644 ui/2.1/images/domain_dbaccount.gif delete mode 100644 ui/2.1/images/domain_dbdiskoff.gif delete mode 100644 ui/2.1/images/domain_dbinstance.gif delete mode 100644 ui/2.1/images/domain_dbsnapshots.gif delete mode 100644 ui/2.1/images/domain_serachboxleft.gif delete mode 100644 ui/2.1/images/domain_serachboxmid.gif delete mode 100644 ui/2.1/images/domain_serachboxright.gif delete mode 100644 ui/2.1/images/domaintitle_icons.gif delete mode 100644 ui/2.1/images/domdetailsbox_left.gif delete mode 100644 ui/2.1/images/domdetailsbox_mid.gif delete mode 100644 ui/2.1/images/domdetailsbox_right.gif delete mode 100644 ui/2.1/images/eventstitle_icons.gif delete mode 100644 ui/2.1/images/featured_nonselectedicon.gif delete mode 100644 ui/2.1/images/featured_selectedicon.gif delete mode 100644 ui/2.1/images/graph_titleicon.gif delete mode 100644 ui/2.1/images/green_statusbar.gif delete mode 100644 ui/2.1/images/grey_statusbar.gif delete mode 100644 ui/2.1/images/grid_headerbg delete mode 100644 ui/2.1/images/grid_headerbg.gif delete mode 100644 ui/2.1/images/grid_loader.gif delete mode 100644 ui/2.1/images/grid_morebutton.gif delete mode 100644 ui/2.1/images/grid_morebutton_hover.gif delete mode 100644 ui/2.1/images/gridresult_closebutton.gif delete mode 100644 ui/2.1/images/gridresult_closebutton_hover.gif delete mode 100644 ui/2.1/images/gridsorting_downarrow.gif delete mode 100644 ui/2.1/images/gridsorting_uparrow.gif delete mode 100644 ui/2.1/images/group_icon.gif delete mode 100644 ui/2.1/images/gsettingstitle_icons.gif delete mode 100644 ui/2.1/images/ha_disable.gif delete mode 100644 ui/2.1/images/ha_enable.gif delete mode 100644 ui/2.1/images/header_bg delete mode 100644 ui/2.1/images/header_bg.gif delete mode 100644 ui/2.1/images/help_actionicon.png delete mode 100644 ui/2.1/images/hostdetails_headerbg.jpg delete mode 100644 ui/2.1/images/hostnetwork_icon.gif delete mode 100644 ui/2.1/images/hosttitle_icons.gif delete mode 100644 ui/2.1/images/hvm_nonselectedicon.gif delete mode 100644 ui/2.1/images/hvm_selectedicon.gif delete mode 100644 ui/2.1/images/instancetitle_icons.gif delete mode 100644 ui/2.1/images/ip_ORicon.gif delete mode 100644 ui/2.1/images/ip_detailtopbox.gif delete mode 100644 ui/2.1/images/ip_managebox_bg.gif delete mode 100644 ui/2.1/images/ip_managebox_icon.gif delete mode 100644 ui/2.1/images/ip_searchbutton.gif delete mode 100644 ui/2.1/images/ipbox_nonselected.gif delete mode 100644 ui/2.1/images/ipbox_selected.gif delete mode 100644 ui/2.1/images/ipdescr_boxbot.gif delete mode 100644 ui/2.1/images/ipdescr_boxmid.gif delete mode 100644 ui/2.1/images/ipdescr_boxtop.gif delete mode 100644 ui/2.1/images/ipdescr_contbot.gif delete mode 100644 ui/2.1/images/ipdescr_contbot_blank.gif delete mode 100644 ui/2.1/images/ipdescr_contmid.gif delete mode 100644 ui/2.1/images/ipdescr_contmid_blank.gif delete mode 100644 ui/2.1/images/ipdescr_conttop.gif delete mode 100644 ui/2.1/images/ipdescr_conttop_blank.gif delete mode 100644 ui/2.1/images/iptitle_icons.gif delete mode 100644 ui/2.1/images/isotitle_icons.gif delete mode 100644 ui/2.1/images/laoding.gif delete mode 100644 ui/2.1/images/load_add.gif delete mode 100644 ui/2.1/images/load_addicon.gif delete mode 100644 ui/2.1/images/load_aniloader.gif delete mode 100644 ui/2.1/images/load_joint.gif delete mode 100644 ui/2.1/images/load_routericon.gif delete mode 100644 ui/2.1/images/load_stoppedvm.gif delete mode 100644 ui/2.1/images/load_workingvm.gif delete mode 100644 ui/2.1/images/loadgr_closebutton.png delete mode 100644 ui/2.1/images/loadgr_closebutton_hover.png delete mode 100644 ui/2.1/images/loadind_textbg.gif delete mode 100644 ui/2.1/images/loading.gif delete mode 100644 ui/2.1/images/loading_1.gif delete mode 100644 ui/2.1/images/loading_addbg.gif delete mode 100644 ui/2.1/images/loading_load.gif delete mode 100644 ui/2.1/images/loading_messagebg.gif delete mode 100644 ui/2.1/images/loadingmsg_left.gif delete mode 100644 ui/2.1/images/loadingmsg_mid.gif delete mode 100644 ui/2.1/images/loadingmsg_right.gif delete mode 100644 ui/2.1/images/loadnetwork_titleicon.gif delete mode 100644 ui/2.1/images/loadtitle_icons.gif delete mode 100644 ui/2.1/images/loadvm_loader.gif delete mode 100644 ui/2.1/images/logo.gif delete mode 100644 ui/2.1/images/logout_bg.gif delete mode 100644 ui/2.1/images/logout_bot.gif delete mode 100644 ui/2.1/images/logout_cloudlogo.gif delete mode 100644 ui/2.1/images/logout_logo.gif delete mode 100644 ui/2.1/images/logout_mid.gif delete mode 100644 ui/2.1/images/logout_top.gif delete mode 100644 ui/2.1/images/mcontent_bg.gif delete mode 100644 ui/2.1/images/memory_icon.gif delete mode 100644 ui/2.1/images/overlay_morebot.png delete mode 100644 ui/2.1/images/overlay_moremid.png delete mode 100644 ui/2.1/images/overlay_moretop.png delete mode 100644 ui/2.1/images/pagination_bg.gif delete mode 100644 ui/2.1/images/pagination_firsticon.gif delete mode 100644 ui/2.1/images/pagination_lasticon.gif delete mode 100644 ui/2.1/images/pagination_nexticon.gif delete mode 100644 ui/2.1/images/pagination_previcon.gif delete mode 100644 ui/2.1/images/pagination_refresh.gif delete mode 100644 ui/2.1/images/password_nonselectedicon.gif delete mode 100644 ui/2.1/images/password_selectedicon.gif delete mode 100644 ui/2.1/images/pin_icon.gif delete mode 100644 ui/2.1/images/portnetwork_titleicon.gif delete mode 100644 ui/2.1/images/primestoragetitle_icons.gif delete mode 100644 ui/2.1/images/public_nonselectedicon.gif delete mode 100644 ui/2.1/images/public_selectedicon.gif delete mode 100644 ui/2.1/images/red_statusbar.gif delete mode 100644 ui/2.1/images/register_box.gif delete mode 100644 ui/2.1/images/rev_wizbot.gif delete mode 100644 ui/2.1/images/rev_wizmid.gif delete mode 100644 ui/2.1/images/rev_wiztop.jpg delete mode 100644 ui/2.1/images/revwiz_backbutton.gif delete mode 100644 ui/2.1/images/revwiz_closebutton.gif delete mode 100644 ui/2.1/images/revwiz_closebutton_hover.gif delete mode 100644 ui/2.1/images/revwiz_nextbutton.gif delete mode 100644 ui/2.1/images/revwiz_nonselcted_tempbut.gif delete mode 100644 ui/2.1/images/revwiz_nonselcted_tempbut_hover.gif delete mode 100644 ui/2.1/images/revwiz_nonselectednumber.gif delete mode 100644 ui/2.1/images/revwiz_selcted_tempbut.gif delete mode 100644 ui/2.1/images/revwiz_selectednumber.gif delete mode 100644 ui/2.1/images/routerstitle_icons.gif delete mode 100644 ui/2.1/images/running_icon.gif delete mode 100644 ui/2.1/images/safebar_bg.gif delete mode 100644 ui/2.1/images/search_closearrow.gif delete mode 100644 ui/2.1/images/search_closeicon.gif delete mode 100644 ui/2.1/images/search_closeicon_hover.gif delete mode 100644 ui/2.1/images/search_resulticon.gif delete mode 100644 ui/2.1/images/searchicon_button.jpg delete mode 100644 ui/2.1/images/searchicon_button_hover.jpg delete mode 100644 ui/2.1/images/searchpanel_bg.gif delete mode 100644 ui/2.1/images/secondstoragetitle_icons.gif delete mode 100644 ui/2.1/images/select_ipbg.gif delete mode 100644 ui/2.1/images/select_ipbg_admin.gif delete mode 100644 ui/2.1/images/serviceofftitle_icons.gif delete mode 100644 ui/2.1/images/sgtitle_icons.gif delete mode 100644 ui/2.1/images/small_ppbot.png delete mode 100644 ui/2.1/images/small_ppmid.png delete mode 100644 ui/2.1/images/small_pptop.png delete mode 100644 ui/2.1/images/smenu_selectedbg.gif delete mode 100644 ui/2.1/images/sprint.gif delete mode 100644 ui/2.1/images/sprite1.gif delete mode 100644 ui/2.1/images/srow_loading.png delete mode 100644 ui/2.1/images/step1.png delete mode 100644 ui/2.1/images/step2.png delete mode 100644 ui/2.1/images/step3.png delete mode 100644 ui/2.1/images/step4.png delete mode 100644 ui/2.1/images/stepbox_slected.gif delete mode 100644 ui/2.1/images/stopped_icon.gif delete mode 100644 ui/2.1/images/stopped_vm.gif delete mode 100644 ui/2.1/images/storagetitle_icons.gif delete mode 100644 ui/2.1/images/submenu_bg.gif delete mode 100644 ui/2.1/images/submenu_linkbg.gif delete mode 100644 ui/2.1/images/temp_centosicon.gif delete mode 100644 ui/2.1/images/temp_deleteicon.gif delete mode 100644 ui/2.1/images/temp_deleteicon_hover.gif delete mode 100644 ui/2.1/images/temp_editicon.gif delete mode 100644 ui/2.1/images/temp_editicon_hover.gif delete mode 100644 ui/2.1/images/temp_linuxicon.gif delete mode 100644 ui/2.1/images/temp_windowsicon.gif delete mode 100644 ui/2.1/images/templatestitle_icons.gif delete mode 100644 ui/2.1/images/test_icon.gif delete mode 100644 ui/2.1/images/tick_arrow.gif delete mode 100644 ui/2.1/images/total_vm.gif delete mode 100644 ui/2.1/images/tree_boxright.gif delete mode 100644 ui/2.1/images/tree_eventicon.gif delete mode 100644 ui/2.1/images/tree_minusopen_icon.png delete mode 100644 ui/2.1/images/trusted_icon.gif delete mode 100644 ui/2.1/images/unknown_icon.gif delete mode 100644 ui/2.1/images/unsafebar_bg.gif delete mode 100644 ui/2.1/images/untrusted_icon.gif delete mode 100644 ui/2.1/images/userlinks_bgleft.gif delete mode 100644 ui/2.1/images/userlinks_bgmid.gif delete mode 100644 ui/2.1/images/userlinks_bgright.gif delete mode 100644 ui/2.1/images/userlogin_mid.gif delete mode 100644 ui/2.1/images/v1_logo.gif delete mode 100644 ui/2.1/images/v1_popupbuttonbg.gif delete mode 100644 ui/2.1/images/v1_popupbuttonbg_hover.gif delete mode 100644 ui/2.1/images/v1_popupheaderbg.gif delete mode 100644 ui/2.1/images/v1_vmopoup_left.png delete mode 100644 ui/2.1/images/v1_vmopoup_mid.png delete mode 100644 ui/2.1/images/v1_vmopoup_right.png delete mode 100644 ui/2.1/images/v1adddiskoff_button.gif delete mode 100644 ui/2.1/images/v1adddiskoff_button_hover.gif delete mode 100644 ui/2.1/images/v1addhost_button.gif delete mode 100644 ui/2.1/images/v1addhost_button_hover.gif delete mode 100644 ui/2.1/images/v1addiso_button.gif delete mode 100644 ui/2.1/images/v1addiso_button_hover.gif delete mode 100644 ui/2.1/images/v1addloadbalncer_button.gif delete mode 100644 ui/2.1/images/v1addloadbalncer_button_hover.gif delete mode 100644 ui/2.1/images/v1addnewvm_button.gif delete mode 100644 ui/2.1/images/v1addnewvm_button_hover.gif delete mode 100644 ui/2.1/images/v1addpstorage_button.gif delete mode 100644 ui/2.1/images/v1addpstorage_button_hover.gif delete mode 100644 ui/2.1/images/v1addserviceoff_button.gif delete mode 100644 ui/2.1/images/v1addserviceoff_button_hover.gif delete mode 100644 ui/2.1/images/v1addsggroup_button.gif delete mode 100644 ui/2.1/images/v1addsggroup_button_hover.gif delete mode 100644 ui/2.1/images/v1addsstorage_button.gif delete mode 100644 ui/2.1/images/v1addsstorage_button_hover.gif delete mode 100644 ui/2.1/images/v1addtemplate_button.gif delete mode 100644 ui/2.1/images/v1addtemplate_button_hover.gif delete mode 100644 ui/2.1/images/v1addvolume_button.gif delete mode 100644 ui/2.1/images/v1addvolume_button_hover.gif delete mode 100644 ui/2.1/images/v1admin_menutab_off.gif delete mode 100644 ui/2.1/images/v1admin_menutab_off_hover.gif delete mode 100644 ui/2.1/images/v1admin_menutab_on.gif delete mode 100644 ui/2.1/images/v1aquireip_button.gif delete mode 100644 ui/2.1/images/v1aquireip_button_hover.gif delete mode 100644 ui/2.1/images/v1grid_morebutton.gif delete mode 100644 ui/2.1/images/v1grid_morebutton_hover.gif delete mode 100644 ui/2.1/images/v1gridheader_bg.gif delete mode 100644 ui/2.1/images/v1header_bg.gif delete mode 100644 ui/2.1/images/v1menutab_off.gif delete mode 100644 ui/2.1/images/v1menutab_off_hover.gif delete mode 100644 ui/2.1/images/v1menutab_on.gif delete mode 100644 ui/2.1/images/v1stepbox_slected.gif delete mode 100644 ui/2.1/images/v1stepcontainer_bg.gif delete mode 100644 ui/2.1/images/vm_actionbg.gif delete mode 100644 ui/2.1/images/vm_continuebutton.gif delete mode 100644 ui/2.1/images/vm_continuebutton.png delete mode 100644 ui/2.1/images/vm_continuebutton_hover.gif delete mode 100644 ui/2.1/images/vm_continuebutton_hover.png delete mode 100644 ui/2.1/images/vm_greenarrow.gif delete mode 100644 ui/2.1/images/vm_greyarrow.gif delete mode 100644 ui/2.1/images/vm_redarrow.gif delete mode 100644 ui/2.1/images/vmbot_loader.gif delete mode 100644 ui/2.1/images/vmdropdown_closebutt.gif delete mode 100644 ui/2.1/images/vmdropdown_closebutt_hover.gif delete mode 100644 ui/2.1/images/vmopoup_left.png delete mode 100644 ui/2.1/images/vmopoup_mid.png delete mode 100644 ui/2.1/images/vmopoup_right.png delete mode 100644 ui/2.1/images/windowsconsole_icon.gif delete mode 100644 ui/2.1/images/windowsconsole_iconhover.gif delete mode 100644 ui/2.1/images/wizard_contentbg.gif delete mode 100644 ui/2.1/images/working_vm.gif delete mode 100644 ui/2.1/images/yellow_statusbar.gif delete mode 100644 ui/2.1/images/zone_addicon.png delete mode 100644 ui/2.1/images/zone_addipbutton.gif delete mode 100644 ui/2.1/images/zone_addipbutton_hover.gif delete mode 100644 ui/2.1/images/zone_addpodbutton.gif delete mode 100644 ui/2.1/images/zone_addpodbutton_hover.gif delete mode 100644 ui/2.1/images/zone_addpubIP.gif delete mode 100644 ui/2.1/images/zone_addpubIP_hover.gif delete mode 100644 ui/2.1/images/zone_changeipbutton.gif delete mode 100644 ui/2.1/images/zone_changeipbutton_hover.gif delete mode 100644 ui/2.1/images/zone_deletebutton.gif delete mode 100644 ui/2.1/images/zone_deletebutton_hover.gif delete mode 100644 ui/2.1/images/zone_detailsboxleft.gif delete mode 100644 ui/2.1/images/zone_detailsboxmid.gif delete mode 100644 ui/2.1/images/zone_detailsboxright.gif delete mode 100644 ui/2.1/images/zone_directipbutton.gif delete mode 100644 ui/2.1/images/zone_directipbutton_hover.gif delete mode 100644 ui/2.1/images/zone_directipicon.png delete mode 100644 ui/2.1/images/zone_editpodbutton.gif delete mode 100644 ui/2.1/images/zone_editpodbutton_hover.gif delete mode 100644 ui/2.1/images/zone_editzonebutton.gif delete mode 100644 ui/2.1/images/zone_editzonebutton_hover.gif delete mode 100644 ui/2.1/images/zone_enablefirewallbutton.gif delete mode 100644 ui/2.1/images/zone_enablefirewallbutton_hover.gif delete mode 100644 ui/2.1/images/zone_ipicon.png delete mode 100644 ui/2.1/images/zone_openarrow.png delete mode 100644 ui/2.1/images/zone_podicon.png delete mode 100644 ui/2.1/images/zone_sidearrow.png delete mode 100644 ui/2.1/images/zone_zoneicon.png delete mode 100644 ui/2.1/images/zonedetails_left.gif delete mode 100644 ui/2.1/images/zonedetails_mid.gif delete mode 100644 ui/2.1/images/zonedetails_right.gif delete mode 100644 ui/2.1/images/zonestitle_icons.gif delete mode 100644 ui/2.1/images/zonetree_addbutton.jpg delete mode 100644 ui/2.1/images/zonetree_blankbutton.jpg delete mode 100644 ui/2.1/images/zonetree_left.gif delete mode 100644 ui/2.1/images/zonetree_mid.gif delete mode 100644 ui/2.1/images/zonetree_nonselectedbutton.jpg delete mode 100644 ui/2.1/images/zonetree_right.gif delete mode 100644 ui/2.1/images/zonetree_selectedbutton.jpg delete mode 100755 ui/2.1/index.jsp delete mode 100755 ui/2.1/jsp/tab_accounts.jsp delete mode 100755 ui/2.1/jsp/tab_configuration.jsp delete mode 100755 ui/2.1/jsp/tab_dashboard.jsp delete mode 100755 ui/2.1/jsp/tab_domains.jsp delete mode 100755 ui/2.1/jsp/tab_events.jsp delete mode 100755 ui/2.1/jsp/tab_hosts.jsp delete mode 100755 ui/2.1/jsp/tab_instances.jsp delete mode 100755 ui/2.1/jsp/tab_networking.jsp delete mode 100755 ui/2.1/jsp/tab_storage.jsp delete mode 100755 ui/2.1/jsp/tab_templates.jsp delete mode 100644 ui/2.1/scripts/cloud.core.accounts.js delete mode 100644 ui/2.1/scripts/cloud.core.callbacks.js delete mode 100644 ui/2.1/scripts/cloud.core.configuration.js delete mode 100644 ui/2.1/scripts/cloud.core.domains.js delete mode 100644 ui/2.1/scripts/cloud.core.events.js delete mode 100644 ui/2.1/scripts/cloud.core.hosts.js delete mode 100644 ui/2.1/scripts/cloud.core.init.js delete mode 100644 ui/2.1/scripts/cloud.core.instances.js delete mode 100644 ui/2.1/scripts/cloud.core.js delete mode 100644 ui/2.1/scripts/cloud.core.network.js delete mode 100644 ui/2.1/scripts/cloud.core.storage.js delete mode 100644 ui/2.1/scripts/cloud.core.templates.js delete mode 100644 ui/2.1/scripts/cloud.logger.js delete mode 100644 ui/2.1/scripts/date.js delete mode 100644 ui/2.1/scripts/jquery-1.4.2.min.js delete mode 100644 ui/2.1/scripts/jquery-ui-1.8.2.custom.min.js delete mode 100644 ui/2.1/scripts/jquery.cookies.js delete mode 100644 ui/2.1/scripts/jquery.md5.js delete mode 100644 ui/2.1/scripts/jquery.timers.js 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 4dd1de65b272b796075a48b06ab964a86d16cbec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v%76Fz z7DNZb44`r?G%bukK2%&ZIX_n~v7jI)Rj;r#u_!UGBr`9S!2k%XO_I#aEi6-$tlct; zQq%G)tZVX%()Dult1@$P67|v`f@mg>az{g8Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qYzTlln;;AZav>R+#R^5K#rdU0$*Bry`9;|ZnRz9tz;0)LUSdv8r9w_>T8TnZ ZPGVj*urCbNHKZw2|HHi^!yxznKLCP1HaP$Q 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 9adaaf8faf2f92658ebd66309eb6b977f4228f8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103vQkeJl z8AJ!e44`r?G%bukK2%&ZIX_n~v7jI)Rj;r#u_!UGBr`9S!2k%XO_I#aEi6-$tlct; zQq%G)tZVX%()Dult1@$P67|v`f@mg>az{g8Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qYzTlln;;AZav>R+#R^5K#rdU0$*Bry`9;|ZnRz9tz;0)LUSdv8r9w_>T8TnZ ZPGVj*urCbNHKZw2|HHi^!yxznKLDe+HK+gp 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 95cb227bcaebe612cb8f0275f23e76a2a3cf9e13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47996 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 F{s&2)VPgOQ 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 c0e8f6cd3480e1dede01c59e5fc3b802f6290c71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v@@bHY zfaqYD0aUJqriBs6hl-0P=jZAr78K;9>J^qI7A5ADWagzZ7yyB_Ns^hlg=K1zwOeLU zYFd7UbxnRzx?XO6Rc203qFx$A5Y6OK?q~>%hQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2C74FOPR6NJG)E+iwfSfMDjIKQ+gIaMJozbIQFGp{5S*zL^EOU%isRLDt9D^W$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v`oyDi z1fqjs22i;cnifVNA1W@IoS&>3X^ORhc$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v+U(&U z2GPMV1E^dJO$#HC4;2?p&d=3LEGWoH)hjGbEK1BP$;?Y-FaQE;lO!{93(M3bYq!jz z)U^Bx>ze$cbiLgCs?406M7=bKAezae+|dvi4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!83D8v>xtCJ2LpTu4S{u|iR5aeir0a;idFeo?kUW?o4uu-loRmza}NsgRSJR-%xU ZlbDwc>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103vy4YC% z0-}Rq22i;cnifVNA1W@IoS&>3X^ORhc$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v3YojX z0HT9o22i;cnifVNA1W@IoS&>3X^ORhc$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103vdN<=7 zP&G&g!wewSLes*C5Eo6(&(%vTD9B0GD=bYcO3W+C%u8i300L{1Br|gh%hV)mx6Go{ zwEPO|n*5@4z1;k&%$%G=y)=j*n#rTw(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S^9G0-(+&2!nxKNJeI{LQ!gQerZv1szO?RQMN*6UP&sj+nJx2n3GefkdvBLqL7r6 Yn3oOg3qy4cX$sZBh0K4WkO#lD@ 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 8e798954198bbeb918222cdcae2d2964873d8f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103vl2Du5 z4AH?b1E^dJO$#HC4;2?p&d=3LEGWoH)hjGbEK1BP$;?Y-FaQE;lO!{93(M3bYq!jz z)U^Bx>ze$cbiLgCs?406M7=bKAezae+|dvi4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!83D8v>xtCJ2LpTu4S{u|iR5aeir0a;idFeo?kUW?o4uu-loRmza}NsgRSJR-%xU ZlbDwc>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v(p>uM z2Sf+M44`r?G%bukK2%&ZIX_n~v7jI)Rj;r#u_!UGBr`9S!2k%XO_I#aEi6-$tlct; zQq%G)tZVX%()Dult1@$P67|v`f@mg>az{g8Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qYzTlln;;AZav>R+#R^5K#rdU0$*Bry`9;|ZnRz9tz;0)LUSdv8r9w_>T8TnZ ZPGVj*urCbNHKZw2|HHi^!yxznKLCSfHP-+D 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 9e5b604712a5830c683c0c846ab71d08730cb362..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 545 zcmV++0^a?JP)D2vaN8nv<*E=6QQHzk5Clc=v#6VPV+vM@7&T3u##%Fr zPLyOOGw=1zWF?H!2N&Kw_ndpq<3TBfu=38{4SL@OHe6$&^)8NvkR#2{tuS}rYj(Y# zE>~AnHLr*9Ld7t$Q<`h18a5Lgt4|r9-u#zX7H4}kr}%2~tA!V%1st5zpjC6@-o^UM zd&Sbq>r`Hw1qg+bgIxXw#&4Gg9_Z&%M%tCconk63PNII@1y4gfCLp4OSX998>AL(3 z#gCJrVr8s%XD9QyagQ(BP=G65};pOW75oZ-V)1tMW~Z(1}^E43^{}+ zNgZtofyePk&ACmf1sxABMkP*Z=AOLmD$XmxLUfJjwZ zYI%Qhlc86Dl52H&KSD!kdxL9hYfOfodaJ)ndW~*!zU`S6=Q-G6ScY$wuepFjtQ+``WiK)21V}FZeWMoQcbcC3o)!EuWMoDF5Wx31JTX=939w!FV>euPwNb4^Z8RCk7JZf{g!XI*G*ReFkNYi)+3uV!y^ zNnK^P!pBQ>he%FQf}pIs#mSAOuWERHUxbv^*xGDzbV_f2Yjt{HZgj)X)Oe7YM@UGy z#>-r8c1dJ!LPSJsba+xyQd@U}Sd^`TpQ~wlfUUT_dzYiPz{JDO(}9zlRe6Y4e2Z*v zaDAMpewCd@M@Mpzoob1d)YsT@m858XhmWSPS95-Hi>>KU2Ab*Y;j6!c}i`2l(D^2e2&D<({6l%Szu#$n5BQ4 zrf7hQYlM$nbbe1zQD1d_Uv_^`P*G=WZ@I+Dn5(l`ldM;Qlxuc+y2Z*=WNVL~rEiOt zSAmjPXm4eAep6FZW^iqOdyG|okyn9}NK{x!Vr)Q2OHNKsPESwD z(9%nEhRxB_A^8LV00000EC2ui02}}h000R80A0Wc*I)nw007Vcn1Ue5fB_&5c4?un z1povCQuz`Xz*`y#D0FCeqCv+Q3N<9upm64i2@}^eP>`Tz&ptE!OgZ|%Aw;|;V?uCP zbnXKrWS(4Yld-J{hfHMp1R(N49K0VutZWg3r5TWUd49Na#!Xo#M0QrOnKdX-fB-LO zMfw)zAB4NLj1e0JE=MqJTzZtT)@a?XXv~}hNcP84oqw-busCrASRz!L!2CMZgA<){ zxyW^c=0-pOUBaHly2CEWJ#!vBpaa#bRFF54NRU_~N)fDf*i7&6qi52%3p_61xX`9j zwrV_Zz=`pNR}5mVm@fXG3i515>V8F1VRh1DVstAgc&%q(n2M8=# z7K#cfKr_q`g%Ro*GK4Bdlu!aA{m4_m1{MgALIp)gfrJX5D4+lpeBe@uh6)HFix7`Y zBaJ$E*g${*0uUj`0TVb-fDe~M07V25WT2xKP|)LpEl3owfCB{FP=OPgG{A%bG)Q5? z5(`9m1R(`fdBiOaJiq_}1khl?0ZastMG6flalj1|5Wv8e1mN?)23k%~garoFc|Zk9 kU^0gYUcA$Q01+iHMFNB(WM~2oJv4v-0#H(n2mt{AJI!|_qW}N^ 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 f882fa0baef700d492cd02fe95a274ab7962e5a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 zcmZ?wbhEHblwsg!xXQrb?(S}HZ=ai+TU1mO7Z(>25|WXT5g8eol$5k>+qS^K!1ng` z{QUfT_wFrPw8+`n+0D(Zrl#iT(W8}>m3#N@ZEkKpeE4v5bhML`Q$az&&Ye3O8XC@? zJ)51KJ!{r1e}Dfyd-hzrcFoVv@9Nd7Yu2nOE-tRFu1-x&4GId%$;t8c^=)l!y>jKs znKNf*%$N}n5HMxRl!+53_VxAc-o1PE>eX3US;4`)Ucg&Ru`i;Q89oC%A9bg#5RFP~hm8~c1KvH6SH zjRhAAiU|s8iy19;W8EYywP_oxl<+oTWhq@{gY9k%N5plGFmUNHaPpks;XJ}AdV=Bb z2~IvPE!3T`{ Z8Wr`j9-6nkKr}RUg zk7v%A^PB&3o;f*tb{n=^AOewpAjr4RA8a}}w)Sjk_}1;mE59rqob+6s39eX2uj`Lq z^xd6bSpIoJ^SSXmezARQclV{k7k$Y8Q?cLDh1q*w&omZgCvVeX8-izJ|1HUEvRV#X z_e)!BhYv_C^_EuqAiyI@nW!OoLl>etkmtgQ5?tr)gzO$D&yRJdLikG zh!Nw5e!U}EE;)j6fReYVQ-F}BSm3IOLrEUO?gt%dfR}PwM!%g#)7IEb3$NTctnwZreL&3}@3T)5B6) zLzK^%AO&QR*)np#*W+=|B{!)jUpe1cv>4fib|8`B`kMjsssZwduS5Y3l7@Xzxgxbx zwftBo)_laSHta4Jf4#DOwxDP{J0%gNpu&ZkWGs)a>wC9bWh$@HdXJ$jS0nej+Vh*7 z>Bgq;nDtyfPYq%`v1IO=>@$^UU^Bf`JfP*=)7=^Y6gg8nAix(cJ7B7ywx5T5XH@JDuLT z_PCSYQ~HtNxUhis5a6fkAiyOf-D{FX6?Hs=ag^MMM?F(XFqF1a2v`X&IuLV3f)} z4M8FWR{JqNK{wcrB7k5Utd)sjNk0sc_P`)1AS1u~cm1L&Fd<9NzJJQ&f~^l6 zjrCkb=OypU+YwU6^VfLp8i07q)e5B)dK`94K@D^{A6)Av$;Ri+s*O^4RRSVGkkgP(_R7O+)(3iBgR0agq>4qAU-6A8tx}XE-r$pd zSmFE49?OAPUe4(&)>iR5zGr#5ZtETWT!1TUE1kr_TI%hYtOj3ayj*bq$6qRXlOI3)eV_V+ znSTkuus6F(VRw&R-kOmn?RyB*L|NX&=nmbJEjLnJma96A=)|VMTbdZb@~ao-#3P`8 z!R^RRjf8j^AI7sbjKG9K%28P&YvZH6C@C04N>gCKL zdSXI%j<%f1_}z)6sSR%$ocqkFPv08fLI);H`w-W@pS8yLarN~4gNSJV(D~`lqWt$a zt}H9~BI4fc)T>fJle~Cp7e=roPBT=p3J^lH2jvNEDw?mw@f~n9QI26p!fTpCuV!6i zue>6EMEUYyW97v_Ba<>}F0OnbNZaUqu_Id0^WG}h^G2+0uF05X5Hp!aCI>%_#Q&IE zRA-Cuuh@{{5isC37IBWvFq6l|XCZ764+3Fvs-D4v7}i#6Lm^pMuWMmF%J3ug-!5%q z8vPTLItQh%=Ru@N@o`Mvpn)N~GFMkr5j|bUO*hq}lK##ww~BXCozC8ye~1=I=g`tp_L9vFC!kuaw>x4U#_6lJ&52b!o3x-Z7u#E@h6c^HD Jgg&D6`VY!-7oq?F 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 5a0f72b82fb307a05cd58280c4ae508cf9f387a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 zcmZ?wbhEHbsi54K5^0sOYMu6zeFZw_-zDF#m}g$| zUirWR11B9R))PyN4(3>8>doI`xFTwO*P62I7ghUPH&pm&%s$_}rHVIWJ9FNFM8Eaz H3=Gx)?!i0) 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 4bb847219350f4c0b4f6c5abf0204a14625bbe7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613 zcmV-r0-F6tNk%w1Vd(%D0K@2$@8#v?@$vEC;Nafg-s|h@ z>gwv<-QDTw>E`C4@&q;ko$@f?T+1hPOlh|R2a%k3h02?-!VjsPSHtar_ByOrR@!=rFG z6rRT-U3~lhfPrxj3KIzk2niDkdVGP8kdaG+3JeVh000OL42*kflA)rbER>d*nVJcm z7N32ju(4bz2R#C}xVKOQ7L}K&sfnx*R=LK<$jQpf%+1cv(9zP<)VH-MCr_6W3k2TZ z1P~Yl7a706!3h}`0~iqC@bU8V^!4`l`1$(#{Qdq55;k3VB?1fr2oEAq7{IXM1`d@p zoI{sR1A`A7HZ0P@%#^ zioqK6?4Yx#(W6L{DqYI7sne%Wqe`91V9@|g4hSA-0AWCk1E_$aLvTQr*|RqWKxj~Q z1Xw}=#LAsZx31m0c=PJr%eSxJya5=IB_TjUgb8u~DqhUEvE#>(?*^C{zMVV3?$*JR zD_{P3IBvqLku#r8y*gmq&r?V5ZN0nq>duQF=l;FCdEeoo^FGhMeeCoBLI40e0%S(p 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 a4e2e267c7ee671d2797ee8bc0f4bfa687385604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 zcmZ?wbhEHb6k_0Kc*ekBZ*TAJ?w*^QTU1o!?%{Fo-aR)rx1^*bcTX>OZy#r8XODmo zcQ0>uU;ntcIFGRC?Ck9H+yW;jr;Ln@kkGJ*tiq(EWDozKjEqc=kVucvsECwI58r^u zm^eQ_zmSj+e}DgstgOhWsEERv$b{s?^vv{}e9!odxVZSp$jI2VOpoA*kcg<* z+_;2955EA{PLLGVs{_k#GHbJ+~V|{T#v|v zh`jQoloZdD{P3dMn1V_VzrdiNpoF~Q)YQ~~fB?_f)RdHzz`(%Z;9!P92^4>_fZe47 zB0+J&z<#}fozIhtp{>1xfla=NK|z>#;-tyU>}+xha!j-5%$+O1AjB>#p=fTWCb&w? z&RkJKxQ$)R(L`0x#@5}|Mo-nmQLK$mLtj_R!phRc(#k?hS6`z|Q%P1uTGT<=S=m8U zT18f=O>(V|7DGaUp>j?hTI3to(IX0)ieNZ)W9{ z;9+s#cVyz@4$G)mka(1dk5hnWO2PuAW?9|@k;aP&?93Ax86*M)7A!kE+k#Ptalrx= Yzd39w28|6%JQuojGA(Hk;9#%@0IxicasU7T 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 7837ed00baf57a8978cf13cafcc71b456a1f7b30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmZ?wbhEHb6k_0KIKsf-?(S}HZ=aNu6c-m485x<8k&&C5TU1mO5)yLn-aR)rH)m(( z?CfkOCnrBYKYxG!prD|@z`)eh)RdHz;NakZfB*)(K=CIFSY8K2g6w2qO;}(M;+-%r zV}U}_2N8Fj^X&^P`jg+(+&6A)Ti~E0)vwlAbTWs_r+Gz*m+TCV8*9qE4HWm?Z>gBW vpzPDIrRpr(g4-XySl{E*dQp0U={%ng6L)z97q1|Xkcg_LCIbtPB7-#mJBdP0 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 6f483082ecb33d34bb09dd744ff77521d6a54aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 657 zcmZ?wbhEHb6k_0Kc*ekBZ*TAJ?w*vC6c-m~@8A#;5_0d}y~xPOjEoF7H#c`LZ)a!c z+}vDu4-a>5A9qjBqN3uWq9P|JC$H4P?CflhfMCz4q};rGkDzc5-vB>9KM%ivqT&*N zfB&4q;&Yd;rWKaD`}h?V7iVN;c|^o}#-_S^dZp(TCT8UY1O%iNR|E$KM`RcK6gGNB zCb)b1=H}-4p=j5iQrbbt_$0n!6C8c;KW_$PthZNL=*L3GK_atWKgoK6X6cpv;7p&WR*fTkI z)z)1eA(8RrjY%nK=dN5!E3S+$sR@Zqj4!T^NYC}kt&S(@*$mi#;!hT^unvd>#R&uZy9Op^O>Ty^_6`P4)+Pp74nYAW z8G9Ke0RcflCQd0?DIT6AaZ@=5IbT0iVsilrZ`TaK5cexcFW^8QocIgp5 z@7fsuN~#D~T&Na0>?gtc_s3Um$HOPYm{X#BHe5LB;>7TmY0rTKMz1Lr!d_=MJ}NA1 zVfibPGr_URms32bPa|VOz`3S6ewmyV4UE36JbW2ybC?qxo7nh8EF>N~G;%KFR9Ui6 WA;ndZDdKv9YJtW9My^H%25SKAOWz&< 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 6689e3eec8145fca0cb0179380228b77bd320bf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmZ?wbhEHb6k_0KIKsf-?(S}HZ=aNul#!7U7Z;bCn;RJ!84?mwR8(~D-aR)rH&0Jb zXJ_Z^>})3|r*r4d`TP6(`T3=$rUnKE1_uWR1qCH0CKeVJ1_T7GTD5BB%9U%@tjWyG zOi4*OfBrlJ1B2pE79h#MpaUX6b~3OQEO1EhNtljAhIHOa^h)I6}dU@u9axa=I>npw8nt(UV%f^<__jNWtGeF qj^8$|spaFUY^)XKsqD&Ulx5^;>CWfk6Xq2XQPtFBVB=L}um%8Cp;dVR 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 834625a2732e02d13962d05e17fb288716ee82fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmZ?wbhEHb6k-ryc*ekBZ*TAJ?w*&I=kDQAR8(~D-aU73A2&C*q@*N|fDmVAXAi#s zcTcalxVW66lI-kkCnqO=fB%e(%$&kvkMP)>f})U+kl3^=kFe;(^sI=K%$)oJ&*-GM z+D?zqD38F<^z2-(%(9TI;-sYHkkHWBqH52S{P>FI+`RmNiq7pvPy6}#rRNqTrKCl* z&x}h)(FPRGT^C*%}HMn!qXrF(?M1Ox=c)%64h2BwzR1qB6VWMo8k&h<(! z&dtqDNl8gfO?CJ2o3d(4aBwigzyZadEMUuZKqM$m7}(!5aPWF^F|@UJFtCd?F$nsx zOq?{Cg@avNP&?3ALt0drZ=tZLw1zQ1g8+w+se+D$p}CK_p@oiusZbk-vaY17qq?k@ zth%GCq^@!suZzC8lYx<*zn+nSleoT1n}eIZl&U4`lP8v{Quc0bVk&kvN+w!QwM>+3 z>{Qwqnb|mH6w7!t4N}}W_&9lZZkRV5Wa64;NQE4`lS1byw4NX&Z*fm^leq?A-Yrz785TAs384DDW3xRbh-gaR1%!>V+F$f39jQaO7%gW0d4+ cYhn~<0I2<+Un{mi^XEI*>pO6X=zC&lWlBl ztgWqWZ*OmHZHdKVi9{k43Z+u%=H{kAAP|W}larG(Gc&WZvw;5(`!<#TC${-_|NR6| zk-MhEde{Inp&xnpC{W2@%T;nYbl!SQBvAtqFDRkMZ?$b9&lrGODhK0q1#p5J2>>j)9||9_{4bZZrvs{flx&@ zjr*}eqpvd7)|o6ehs)y&#z#Hf@1XY@?cSE}cD8ZM1z;Uw=Z^zCVuPQlLUayz6?uFq z`}WfCSj05`OF2$+Z`{lyb7emjZFMt4M{L8V9V$&{jn5YNr9xCRY#OHtD8zug#Px4= z6R*a~p>mIW;0eGP1*glu*<$y^mcD@i0#GVy3W~kp!gtG7=P7jT zBC*&ycvRuKvB#fu>b$F-1|GYg3^`Lc-*Z_jf$o=}7JNZj*&7CKZCEB19E+SKx1wld zr z9NJ*H_Z=TI>@#)zbBj>c6O4#W?YZ0qE5-^}=0|F7$P=C8hDk%HlJi|IVQcJs96P3~ zODsEosN&l#vPlH_#lLw_4r&;X3ZK~zC zkZEClaeszoGk*TXPK?EY=k`R0#cYi+53?NSVZ@@MtBU1P?pgitrPm(jRZDr`ldDVl zer}e_uTT4iFTV{4sak$_E%3^1XmFb4O2Msro44PGRaC7M-h>fWKE(D}(sE<^!)e6{ zg_$J~sU?+G0#UJ|m!|4R(BT>8)%3EglMH%!u734jAK&;#tbQs8sSf{?AH!Hhl%`oR zDvEO=7*&-O>Je4d%?w6Oy*e?Xws9=Nx+>9X;+k^1kg0KnNb(Rqz$79x;*H~?wK5KTnU@Vf| zAzrCrck-)A>@I++4F{`iAVYSk9IEAXYdBo9@78j+;r8lT*On_7hSqZXjN{k2IJ0yc z9{y)&6pvtmsO8}dkn22>JXbpKgo=r5_d!fvj!|e}o}E3n!z{zg+qegF7smelQ-5 zzH#v{{LIV~5mPi5*P|(>rW(YwoCgJ#iWjmRSmMQ8ciYXSH$Flx~(%qr-pnRLBzJVq{Mw$SRNtacGg%EqeN$vC|<(?l-*5K_h? zJFuO3xYKr9g725_bnu66Ah(3m@uxd-v{UW2#Y@mT+naO*a$B;FW^YS5I6JwF9?JeF zZ8T&uQ^;n^<$&IxS(jcD$sP_w4P2^dfX6DOAfM@El`0?d_^RSkpJGTZRdKNR`k#B8 zzs)q@Y9z#gp9(ms7GSvgWqh|jhV$G$3$79B(F2_1q&Y_2{OLZv$5g^echxAE(L!!k7`Plr z2KzUS0wDqqzft;OlkaHB94^g}W#5LLu)BT=}5YWdhM3!+VRkbkHW$lN30a z_qL(^lWjbK6a+d7?bN8SPv1jQ(6Ug#gDZ|g3FHtE|NUTA#c_luB_fbtI6u;yoO!`3d#&Am2M8ip&YMEa8u1H4|lKOyh6dpeWSXH z{>0&T7{MpGeRdT%)N7=0Qc&SYsq&2{j=+d|A1ySi{nEX@m%;QZ-F&JqK#7;&)!z|* z+0~a2UZd54yQ|N4RQsceqjir*tFLTT2jINM8e&e=hWOM3juZW%Wlf)Bvumz>1^Kba z8+8ek8sCSPAf1v8Bt)||Sk-%?8z`*L@TvXNfHctu5`IZtw!U@9`v);l*ib-Ozjd(Y zNB?6Xs#G&N#L0ScxKP+wxnUE2ku*7m5jH`tAC3z3o|?>QuA_YU91~Bv+DB|gV>MYZ z$=1^gKxh+aC*&TKG`#{6wGL+2JwSNRFakxG2})fYnlwWJG+-;a<7n7Mkuazk7nb=~dx`P*Xeh~Ls_;NGO)h_6_iND$B+4N`WIVt)@!3do)cmU-G@u zcLPo+uVGY5M(aBTu-!h9mLEW4E&WaKGoROjq?45P?WX$lj(5Skq!aj{he?7s`mIw_ zKl+lI8}FJh!>^ti9qnvxK3B|)PD~t`*=}yJG-2KS&^EN}g2wD9W<6|6>}MvS+n+sM zdo*=*c%u{DxoXUQDm6O1wT;H2j;;k7J;5vNZNcuUi%m9=QFXfRbsG8JZL)7)5GEz` zIt2ZdeP6bCE#$=LwQO!)C~(N^d~5Hy{wT#t*|L++ksPXZ^Zkfyw{7=WWmVJ{S6U%KkUR~^97$NO5(EYrJ+L0Y=!P<#QUADr8 z4_lo^E^U+JbwLfNEoLmDZfen2gt3li#SNUA;?{{ep~dVZZRc?XJ8^e>0VnPJlVn|_ zxNi!|&3PqD+-J8*ME}BkHy}&0L~i!SL-{c6rx{1=B*Qmg%PRy*Ob$shR{qYhPd7K* zZ&5Ni)rmq?`8+aR1Sn2#i?HcYVS4sJ9Os)|hG!?w1a8=8cGK#QGuS`CIb4h*)i%y7 z)6=gkuji3mO1)!ru_#YH_>HoX@r3(n=k9G`n|zD&s!K-G*3Hf6mHj@Sa)R+yzAgPH X!iEq<3y8>dCn+AHrlx)d066tuFzV`S 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 88ff3b53a07bfde0cd093d2180c8e9837f10e46b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426 zcmZ?wbhEHb)MOB6xXQrr=FOY`|NpOFzg|yIZ^42EFJ8QO`SRt44IBFU`i>ntcK!Nw zV`JkRH*UOs{o2#hGbJVE=FOYiw{QRY^=n#M+RmLj_wCzv_3G6>fBtORv}ynT{gWq8 z{{H>@zkmN$uU>um^5v&bpFVr`?9ib@$B!T1wQHA=k#U`;w8667Zaw&Mp5s3~el^`BT0H1h_Fp0Znl*V?G{ z5jx2w8!I+FD7cZl(BsI95(g*Cf-4_%o-1^)$ISIRB&TuAnVXr9t)?zZvaz|QwluSY zS*@kpm0{|%>C+@sns{c+n?G&Jf|;|Kmn~nhTxv1HqBYtpH?CN{c->-F;bl53d-m>Q z(O9!>`%Y$#H75>l=U;aG#DY_&&z_%u@e;H8l^NG=-JQy$#dh!UbXHwe%_pz86dBm% nU)_^u=VcTS!-fr;Zalkw{rcC>-YzwX?*bNlw~SFc{ZapT6!3y=T(`?vMxv(7V*tB&6P^XJdy z%a?E7ym{={v8!*te*gac`0?YrcI|rh?AgA3`%XM~aqZf*7cX9Poq4il%a(_qe$2V} z_}2Sx4_>^!{_fkMLx*0ze7Sk^=8ZR=cAR>6`0(LtPhRz&dB{KrDE?#tE71XwAU`p% zojB0YuB;)|e_~0{$&V~X3p^9N)<&(5c*8PfV#cNi1rf@PHb-8RJYX~ox$+_Bs6q#O zKyTYAIgMkHT+HG;HFa6CjmntcK!Nw zV`JkRH*UOs{o2#hGbJVE=FOYiw{QRY^=n#M+RmLj_wCzv_3G6>fBtORv}ynT{gWq8 z{{H>@zkmN$uU>um^5v&bpFVr`?9ib@$B!T1wQHA=k#U`;w8667Zawqpkls3~el^`BT0H1h_Fp0Znl*V?G{ z5jx2w8!I+FD7cZl(BsI95(g*Cf-4_%o-1_t3(xI49k+#@hmVFP}Sk{p!7Iy0`D&W7AUPdi+vTm6u)q m(VBAhlnn8=|d<-^IuU=08sWxo#q 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 62c12ad9ad7fa85423a788c4ce21f617e0cf70b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 zcmZ?wbhEHb)MOB6xXQrr=FOY`|NpOFzrOs){k?adzkK~>!-fr;Zalkw{rcC>-YzwX?*bNlw~SFc{ZapT6!3y=T(`?vMxv(7V*tB&6P^XJdy z%a?E7ym{={v8!*te*gac`0?YrcI|rh?AgA3`%XM~aqZf*7cX9Poq4il%a(_qe$2V} z_}2Sx4_>^!{_fkMLx*0ze7Sk^=8ZR=cAR>6`0(LtPhRz&dB{KrDE?#tE71XwAU`p% zojB0YuB;)|e_~0{$&V~X3p^9N)<&(5c*8PfV#cNi1rf@PHb-8RJYX~ox$+_Bs6vN- zXfNBTxGn4w;>=t+g|&4JO|k`T?P{G_t_+hVPnkMR+mKm8dD`5Gb0>*0FJ7{A>Ffnl z<}X;ZY~2#gm6KP`HD=kqV<(HrViDF&leQd~#=dv|;X{WfA7$n~euC-Lk;UgOF`PVX zaOM1|8`th%S66-TWRjk~F2~a+Dn^`ae6O$Zu`w`8D{&}(+N8*#B)vlAhd^TI!De@* L8V>_i4hCxgQGDV9 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 bfec9c64a89595f39b6642290b326c569a533fa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 649 zcmZ?wbhEHb6k_0Kc*ekBZ*TAJ?tbsyy`rL`q@*NwFYmaxxR8(#H#fJ)$Vji$LU&(( zXJ=>cs$TEn7Iz;%cMlJDPcP4;oZQ@8&!{Aiu$YXD43CgVcW+;hfDk7qr|j(Pocw~w zj@h|+`Oy`v;q?UY}M*;Q2(l^!!GDXOTxZewKR z7v})?jKYxG!)YR0VprC+&fZ*WZl$4afz(5APK=CIFSY8K2g6w2qO<7>z;hiuq zV}U}_2LVr=^PLMU`jg+(+&5=zYjDt!>Q`$lI+?@e)4Za@OLhj|jhw{j6KTF38)ifc zbo(}JnYAWt@ofgPKfLRAOLFbD6Nr5AmQjR}yRx2vi$|1KKv-2%lYyOAk--`O8$&_% 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 f3af8e767bd5142f0f5e682ae9685492b937c6e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1067 zcmeAS@N?(olHy`uVBq!ia0vp^Mhpy$6F8WFq{z=Hia-I$64!{5;QX|b^2DN42FH~A zq*MjZ+{E}1%{ke?YGByY)z_uOa9ViHqB#++l^eS@ z@pcy+&^mLdCv-|HOJJCg%T0~2({9qY8JIc>)eH|>Xqm9IZV+LJD6*fnreF0hPn5lp z;N;C4QxbBV*0^wPoVc1x*?=kk+N7H9|l6_|Nn!}tTcl*F^=AecD)mOZ;m-`H~ ze8sOhorxhAS1by2UEJj++N&iM+LAq?`OGuEz+4uwvaGF29mT?zGqfZ^O*B5s8m@|v zSebTdLg*2n_{lTcx6bC!WLmcUKa1#J`G1P%TFhG%bQ&1m+`7ospup3bXtMfy{mHn; zS8_8SrCeBWe|N&~8`svYxoDko{x_cv3RoY^=f2t^YWCu-)=}AKDmQ+Q0D@-upnV&P z0#0u}{*?XmDaYqqFDP$b|LWD>qDuRf@@0`y=dK^w!}GJWzn`VGqJPu5AG(_&r@wlB z#m(ee@_vh%Wucd==lh&|`y!a3?43rdqeKT&0`uPgQ{(Mj*Z9V?iWspM)XZMf^x{>m zZuilojS)Ix7}VK~ZU1}>vwr4f%=;R*;27(#(|=)VzWy-2KmXiI9mDP`Zys-XZu0v? z)W-c+G_Eg^+TY_gwb(Q}er;jKmTZG?ubqCvUlz+2J$-W{=G0buEAwxL>tpU+{(IAW z^(C2=-)r-~Z4ph{^6$)}4{H*C?JSBrw|3uo;adBzb{nVO-~5Yv>O-l|KD}>Wnf^TN zRrxl$a>>t(r*-}{EE(_lilkc_H5#sEzOO$$@A2~4UXck|vlptqJgp?nVe^lt&sAjS zr~g~UYi$}^$pl|j*7Tpx-jo+1yrvu&Tg*o$Z@i@%nI-^=8&vSW^{L`h?j=h*x;lV% zef_Poe_vAO&xhgH#BwaH*DmXbiW6L_s_R36H5-hSG9b>C+1^vfqyl!bTq ze+`qnXKwyC)g#yXZ+L2RtKYIOT$aM#cKJ-4*Q%&}+X{>` z=bk)O6}A1AO4qxoPq&y&&dB%lOl7|`i$fuFs;q~$YUsXGN1g?A_iq0)arOF`z|9|C z8E4zB?8wc$P#=-}^_uOoiK|i_Zj`+{wRX#;owH2y!geKX?wBi_URxGuN1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 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 ac8b229af950c29356abf64a6c4aa894575445f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= 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 af4655f7556d24597697f129005863d162bf8b8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 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 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 ad3d6346e00f246102f72f2e026ed0491988b394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v 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 42ccba269b6e91bef12ad0fa18be651b5ef0ee68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& 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 2b919f2aa30bdfddcaffa2a300e6d1457a051e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq`W;{978O6-=5#ddq6?J`J(<} zW}ej>|648DX~gVu(bT`};h{Oj>lnHg{m^CzUu$}$+C7;k#rkIT;;mt7wFAGzi?OIm)lq^6nl>L!!h#u2osVE)K@bcV&AzoYU-fM!Pg*uiYGQ gm4A+8+rz2cdw#HA=#F0W9B3?qr>mdKI;Vst04h8!;Q#;t 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 0e05810fffe0b6b8ac320e55d1eb4ba259b89d92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l#{26V~E7myXUR>S{Ou}E*`%9 zKPdOkfrN+ZlHSt7(uY{3{#;wiJb&Ugx1>W4qtrSDm(4hFaaY-$3p3x|sIU3`%J?Qj YcLn#R=pC)AfTl5cy85}Sb4q9e0MP_2(*OVf 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 ee039dc096a38a3753f92519546eee94bcfbeffa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 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 45e8928e5284adacea3f9ec07b9b50667d2ac65f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 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 7ec70d11bfb2f77374dfd00ef61ba0c3647b5a0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 k*Kv;w;*%(i9W@fAqs5i2wiq 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 ad9a84a8b237cb233fa71644efa735ba99539384..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 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 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 bef5178a9054c16582876bac57017f783272e750..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 l!Q;r%?Y*7ztoF~2ao>D^xRgPV&GAM 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 392f395539ec5ddd1f9e7819fb9cf79182f71007..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmeHFNla5w6g{X2&Nv}BqJXqY?f<_Bv{*V*D02k?K|y3JGPDdrSr`)x3MwQdAc>1c ztRaA)AVeaXiixt27z9lTEi!{hSeUrbl@D0p&P2D|m-FtqH+e7To%;YAvK$<+92vHN zBVjCprIrhU4eZIjOjhzAe4<5xYOMs`6bG6FIVN8ffyYo-=vITKdEoOnSm;uLPr1X7 zV4_Ke@8)X!oHOEGIS&K10$fYvAuCCRDyVX1|LcEv8%)i`n0=zeSfc{Hjd>V-D2Am$Mzn}vZb<<{Q<(2m z!Q7e-0oR@QNMW=+1;aghSUNPY5=^%Sps!hr@opU++=xVFju;~^3Sn(h<6D0j#*89Z zo@SsT)1P=9gsz%+GB4s4!CYqujJINlPKIb?Flj0VpX-6CCh6+@*Vvi^!~ym{M5to( zmX%1-v)OxX4;_f`_qW;2*D!f!*=$zy5y7U5+H)aWbDS<8E^y~;-&p8)Ix>cPLMd`N zx@%kMu{3zaotK>1pIj0Y73}60nC)|AkAp0JXQtXdG?tQkhHW_I8?Ynyc+^2>HY+{L y`_jn_IzgD?x{hcqF4)KONYxdI6Q$uR(l0o#SFu>D&$yb;va?$)|HA(F6Z{5wA?)J- diff --git a/ui/2.1/images/32bit_icon.gif b/ui/2.1/images/32bit_icon.gif deleted file mode 100644 index 9cefdc205713455d0bbbc24ca9874b31fa25e9a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 zcmV-e1E>5)Nk%w1VKe{{0Oof9|NsBd(b4Pc>*?v~{{H^%?(XvP^7Qod{r&y=`uh9( z`&wFB@bK{X`1tnr_F9Mm*VosDg@xSQ+=GLI=;-Ln%gg8I=hD*Bnwpw~goNhi=FH5@ zdU|@_-``|pWbEwh`T6;fkdSU}Zt3mfT!{o_Wo53eu9ugW@9*#7;o-%_#jvoj)z#JG z`nwYBT-gs}mf@6*k zmX?;()YQ1RxM7VA}vVmm#*cw%_N^_V@Jp`}Xnk?09&1xXY4j zlpBkxPolhV$;rvOy1LQayriV0;^)_Km?Yce$(x&-@ABw#nJJ;6q3!MMkB^V#<>i{T zV~wm)aBy&5iwAa_EdT%i000000000000000000000000000000A^8LW004IYEC2ui z05kv*000O7fOiQl0fmN#h>41ei~%kQcL)#z0F{=Pn3I9}3hC(>7z!&P3hW9hFX;>E3?VD(LJ{i!|J2kW_h8GvLJ1NkM1dlK3OEU_ z#7Ve-qCzA;5=2PAp+p&l3fUy&l7(Cv9v~AGYQVB(gEJ*sxHMse<$??uIJ|h%U_k>D z9AviiazqA|20+Nw(BYD0AqP;SI)E_4!w0BRU|e;uV1w5TGq^g~kU^@MFyx4gnDW5R z2&qxE3mup{w?c=x6Dl0g0;37t1#~M+H~?5M-MKiPJRmXWK@~KI4;L~(nX(%j2BL_d zkmC!5$_5rxK5-(n0WuRnQ>M{|+zubAK^I~`o3;ig3q&Yk;33-r+P5)Nk%w1VKe{{0OoT5|NsBd(b4JY>Few3{{H^%?(Y5l{qpki`}_O!^z{1r z`tb1ZT3TB6_V)Pr_*#eogoK1|Z*R=Z%+k`**Vos2dU}I{gXZSu=jZ3k%gbbBWS5th z=;-L-;o;oe+|||9g@uJ&i3H^2}vhdwZt6daJ9eqP%eZ{`}J4y5Hx|%-FWk+`PWN zzPh@)ahN3IlpNWo4JMV1j~zj*gDF%aV<(QEQYN;O5qL zoGoaQ7RboR`TO>+uC92UF|o0+@ABxy#l^0}gsrWunwpy0 z5C8xF000000000000000000000000000000000000000000000A^8LW0046UEC2ui z05kv*000O7fO85X0fmN#h>41ei~%DGa|RRw0F{=Pn3Ew=r17X{QPlE;vVeaS4e?DgB7r}XmPMagbF1L zGC0U0iUJS{DrEU_@E{t4Opb^H(x#(=LJm@s|gd`43L_h%n#mbfyBA9T%z(JV` zK~y?eA|wVC2WrHHks&l?p$1T)GLX;!N`wwv)--@XwZT*g5+ES)+8}Jy20gxr(~?5U zgCZ%l&PFYipl)3ab}eMERxLvU26i)8_?tkm-MUxgJP6_Cft4AD4;MN>nev7k2b^f& zP}zbC$_y%R*l-}U3JaAhgBc?336IpU3oV#E`vMFGaD32Suw~3_zA!E{1|$AAft@IfO8CdkMKB*-^MAOJgt9<^2g diff --git a/ui/2.1/images/ISO_OFF.gif b/ui/2.1/images/ISO_OFF.gif deleted file mode 100644 index 43936445e2613d4cd90fcaf83e101dcbdb38581d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1185 zcmY+DYfKXd0LKp~6Q>dsVyYnvMu&!=5~34zE~p8jQ^JgMncI@7ab{B&T(U)%Nea`6 zuVp?mhoC_d2g9L6&BXZNDCMq?yX#%A?e*^3YkSx0yYxZd&*8r9_u>EH|Kb1Pm;86^ zY-!qfunJfNBmltSaAYzWQ53V;tgjkKCX>-bQJP$&K z(1E=!mn$BR=W@AxB$ChP8HNe&{2&&K6$%A{<@}LY)**;qf2^-J*7rv+7!C$Qk!aK@ zhzNpty*}P%W35~!lMMs{!9XAs42eF!OK|82g3#&w?-tRVEqdibEFAIr0t~}3c2Ub% z34*-d51}TrM{v4bF0<(6ME5o8Gc(Kif)Sh3tAJFIOwQ-?83< z7A-Juw-17dz)nC@u+gX|4f@eRC5jn|&63 zxNjm?D5zjHt$&)y7wir}O>*}Jah}4*Ur(ObA!E-WoHD(BhP`4y+Tr4z9^UPmo}PaA z04FGd(Bc$?}i~3jee#5lf7ZK^g?5j8uA7 zP%i(^pemluhT^GEa3&Ioq?C|19HVJE9Ezl12t$dPXjE^aoxW+t?u_;K%3n{RddeLP z3!y}!{M+>#iEFo^90ThYH$qE7-)?C)6CHZJvFXSCX2xR@>bk8s{Rnz!8RkW& z#bS|9Drl?l8$ptWkyI{ASghALoq?t;##dSlo4MSBGv+Bd4g8;FDan6D{hNIA381V1 zl+2e_G}mnHDy^)mPxefJhvyep*Hm3>S^mkY^6GZ*WcOOBbzor+rPP9v)Z`(`@TkXd(qt9GTYUy;9cp5 zYpeAqi5Fj3-weksC+Uc gM>lJlaC`SV%t~Nm>)7@^8=Ho%BB!d~k^r0k1z4>J(EtDd diff --git a/ui/2.1/images/ISO_ON.gif b/ui/2.1/images/ISO_ON.gif deleted file mode 100644 index 78ffdbab768b3fafef47ac557ac6ea5ba65a3e6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1170 zcmb`G?N1wZ0LOoHpn$|NL^CE^z!7lD=0LXK!wY0%o5V$@Q>T*2=7NSS*_?ZUBu+pU zFq@O$#4#8v4-N*(I)cEIhdy`LCn#;Ny=$+%UVC?KkJ1OOw6uk~`8W7^@qP12zVAMV z-#%3O+Nn&C0YU&c9FAx-N|Iza9R8^fL?V&Z)z!7NHI`+s^#O{aVzJn@en8VSilV{L z5x!C(-@$5vL@086#~4n(TPaM%}(#spG0vKAAFM86J!Wv|!a zu%o0)C={-*M*=KMP%e+xN05|K-=TwbTC{(KWhur(Gs}zMEHF9UTTVSJv3kIVGvr2@rISGVV z?JbLnslTPX9+_}fqB0osUJ zTAfa7u|YCv|Byx?6pO^NN%0wx^0!9@x8PIa8ifv@n-RgVfxvOvZkGum5|c53pi-q) z>u+HCX`}U?%|@6kSly`fs)0W`vVfUT#NpKIw8LDvFSNFRntfg$U#fT6sm5Dkt$wr{ z`{Vj8X(SfAZjp@(s!S+mGFdu?0cN!@UcXwk;3gNR4ZW+87~?ed_CQ9>s0P-|s~5rl zMDAMRe@}&v_i+;-ISw`@SLN{Vrh@~iFQuL5+8Q~VpDM)5XyNV6+f&PQrQCiQ=fDnb zE_e$WC?86#E8(}3;K}@f^dlf4yJP3c`e&-mBqZA2E}ns>YjGq*ZT%PyjwYZ@{{^ka~pV_X+zoWkA#g$mAsDW z_Zpj|dr~qAt8&DD$_u`z&E`dlTA|FZnrfy$^TIo#7lQ_yVc;jEKfzF)( diff --git a/ui/2.1/images/KVM_icon.gif b/ui/2.1/images/KVM_icon.gif deleted file mode 100644 index fe3c6f291bd1b0691de8c6ea70d0e5bc1450037c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1446 zcmeH`?K9g40LOolNFpARpw*V^LYff7rWyUwmGEUVQGpz7Krd+=(9mX22l; zTwGj?kB=*r%8iW;olZ9~F|o6=BbUo}cXv-tPPVqT&d<-)YW4B)@!8p#R;yJg6nlGn z+uPd*2M4F8r~CW+8ja@g@Njc;GdVeVc6L@Q7OPaMz`(#DDmW=ADUb>r9UbN5DJcP`1tsUh=|6<#>vUasi`R*kJsMb zPRO$u8ygFx0Zb+{B_$;;E-sjc5DJA=RaGr5Ei*GSTrPKXbhN&{J|G*&&dye-WswXA znOvH{^pVIGMIsST)XeEC{GkFDnr}I~IwX}X>vX4@H`_fuJ$ybtoNg0c?A+PeSzB96 zCX;)6dlgFg+UC;p-?OT_lQ|rYYFoarHW~NSZRd@8b@T6rhKAD8(vp&rN4X}6iHQ=4 zgv789paKa@-zC{pVN+C4P*7J_7o8K;Hc&~U(dOpn;>$gM{>87Oqob&(Xn1&dLn#>? z92^)Jm|hw>INU!zJz7{;sO!sNu~-ZSgF>N5rP9CVUiFIVE87#+*Vn77t3&ckf&cd( z6tF&q{A+c5%eS8Z;1__NEgsDx@If#`d)IC!z$?SZ`Wn+-%X$Skm;$jZ96+IC?&erM zXssEdqg>s1POCK|WllH~9t-!?Xyq+7#I&6E#0UmlrUYY(>&0}R^eo4Zrby#;hEQ$6 zcdl~KRedYc^t??b7=$Ks#i5}$Q!jxYk}0eXKbU)n0gCGJW%JCfm?uy3gYeD42p4Y@ z7E_ANyOMl(#il^2Z`|Yfn4ndafxZUOuoP}wIiR0uZkhpgl;WUXY-iqm-ZkTVh)pPy zXbk@B`pmO{?7=g;F#{{iFn(@qo|wM&+AvJ0d4{8|T}^Ox67#We^v48OY$4mncwIy< zx^Ook8Nrc13NT3RAA0?U7IuOaacUvb#cciCaTj6+UH5&oh7Y}AeA7sq;vYVMYJ z5w^QmszzeER-08ZFBchjECj$}gf`%H&Q721K(+Jd1%m}bp(y6523WTm{5?Y#^0+t3 RgIVB>=pcZ40SE-}_y@q}GVcHY diff --git a/ui/2.1/images/XEN_icon.gif b/ui/2.1/images/XEN_icon.gif deleted file mode 100644 index 37e68fbdd24cfc8b41b76405cbff842eed9ed801..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1004 zcmVgML=($doW{QUa*`t$Si@9*#Z{r&Cj z?da&}>FMeI{{Hs%_WAkw?Ck9I_4Qg>TJiDm?(XjN^z{4t`|$Aa`1tsWii%o@0PE}P z=jZ2$h=_}ei}&~U-{0R`hy#gl1W)V8*^*Vot1&d%iI-rnA{ zw6t<^a@^e9T8IPK*x1(A)?0}K&(F_hW@cw+XVcTuTU%R)hlk?g;^pY#S%&~xhX7)Y z8hM;W+vC$|k}98{pQO5mmX?-}s%q-$>3f|@X_6`4<y=-#ZXtijH%etv%I?&!6(wV$|to3wghj2GbL+;*Blv$M0$ z*~D>}IH94Tk&%(8sHkO*A#9Z~)ZECt&8ODj$@TX1;^p3Rb91V_k>={*-QC^c;o)0| z36ZU9TZsv%zKZYi?6Sq1{r&u2ix0QAx9aWY`uq9d=h^@N{{R30A^8LW004dfEC2ui z05t#;000O7fPMxn0fhtvg^2-(iiwPfkBx_mj+BKg27U=K3;>>=prN9pq@|t$CZ&J8yK3E2q+Cmz`c zHXsQS6J3`jG)c#wgBkQNx466IOcryZYb#Atva1qjifJ_|Yc;Gk?-EF#L7l@Ndg zi2w@!K8PSep@s?(0mzmm3uQ=`HxBNEn4u(#S-oWsMOa*6F_1LkPzJWfh%Ta z$eE)7NfqA}j31gn{lWqlE2=XgGXY0A2{|t0$UXstgzOipU%24qOOFs!!l+MQeZqxB z2oO-%pPz#M|M>;jAAkQ57$5~Z91(&W{`Ci7fCQMZfdUjl0D%G*Qi$P(7G_xCh8SAN zp#p3aVT6YwW(dIsCcvS?1_Hz=K$Ri_w(4`-N002ANU;#A% diff --git a/ui/2.1/images/account_bg.gif b/ui/2.1/images/account_bg.gif deleted file mode 100644 index fca7c3575b9ffa56d04c214dbca6b83c65778d0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310 zcmZ?wbhEHbWMx>*aD;*3%a<=7K79E0?c4Y7-#>r;{Po+npFe-RfB)|F>sN2yzWw;| z=$!u&eYaxW`NfuiW0B2QR{;{%1*zn+Mm$jcv@rj`4?NFY%_M>|FC0^?uy&*f7I+mP_&0nx^(c&db7?-bDxoY*AHT>&0Y}~YY zGy9fJf;)HZ-m`b#{@ucd4j(xx%z5nOsgvSo&z-+;@zUihSH-U1xOwaLoxAsLa@({UU_wV2D-@h+kzI^oP(f9A)&zUo4|Ni}d|NdRJY}ukkixw_ic=+())2C10 zy?b}dmMv@7uKoJ;>&~4!Z{ECl>eQ)Kt5*H_^XKi`w{z#ty>a8l>eZ|F?%lg*&z^7J zzJ2-f<o)vH(g_U*fN?b@bIn|}TJ_3quf zOP4M!Sg>H@#*N>*?sn$x%1{P zSh#5MlKJh+SFBvsqQu3itg9z)sUV>tEh8$5Y!GN@VPX1Eb#=B!;UW$e&9DayKOQ#na0uJHF$ip2*wQgiYgNq2NlZ+l qr%YHnA0{_3u%)+G;_&%ZCP<~vBzYs*k8s14Aua(nF!?o diff --git a/ui/2.1/images/accountstitle_icons.gif b/ui/2.1/images/accountstitle_icons.gif deleted file mode 100644 index dc91765d0461af4e02c0c3e4e7ddb476a876059d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1468 zcmV;t1w;BrNk%w1VIlw?0QUd@|NsC0{{Q~|{{Q{|`T6<${QUm^|IyLW<>lpASXfq8 zR!vP!2?`0^+}uM$L;wE%`}_Oy^78%u{Zmp?mX?+7bukSM4c^|~larI`>gwX+;_dD2 zFfTCh@bG$hde+v~`1trWG&SVpFNIb`ohD)YHDf`5fR|v z;5Roni;IdeGBFt$8DU{z*x17#J8978XiMN+~KS@v~$|M@a9QRqvix z@uyY$|No<;qwIu4WMpI<931oW^Efy-?U7Ob{{8Om?(gsK9UUF8u(0v1Ur$d@EiElP zJUl-?Kkutuy1KeWMMXwNMmae-_xJba=H~wX{Qv#^^z`)ann2&*-~avoIXF4~`tey? zS@p?rKR`eI`0wzHOdA^;{r~+I7Zx)!Gf_`b@wZomgo4x5*6@!{F)uOe?CUQtFY={Z z{qya1bad^MQS+^478w?xo}lV@Alg?S?Gq>hAB8J@1cA^T1~N?cn|U`SFra{`~&5yuqBDoOyS5@U&*{kWL>T zAMT)7#l^+(nM+$+Tl2ACt*x!FudwvCXMTTxYiw)ofHU#BWVN=n@Tgn()xhhBM(v70 z?TAMD=FQ{rvU8jrP-uvazxk7Z>R0=!1cS^Qm9; z^z~t-~j*w%+>%Hz_4OMhYky@h&OMTuxH~87#l#*q(zzzzeS02j}spwP!64g zXfYwpcyoNoa>Zm!DowdY5-p08CIE8o=rLmAg_a9=PqG*g@UW=Ef!B`9DP#X<4HZ_wLaf7a<*A)uyNgZA1)OLoc$F)X+$99iMWFjd0_I$>(@#EBs+ zn~HP;@Sv{EgH}-*fTZYFDLYe&OwkeL5!urx1@d|Wpq4Fd>?&Z>0l-?h!cs3!6e+M? z9YUTA2rLkQtkuI2t#0{{DHO6yez@8H05JZ#MU*sc{ObecmxpE0D2(a?4gj8_60-v+ zASD|K8V9`M!3h|UAj3X^03ZP<$lWE70HRFbj|`NgP{=!r0MQE%2}A;dg18a15KTLn zVPFEy>;MZDsL-H53_~bELtzpWB|u>?OmIm82`m7MIWee$jt4s?pgz;PZtUv#1k7nGS>@2mwm&7YrCR zTyX{%d$3Z57+nmpL=AbufyfB>6-K}vO8~+_5YsgAf*2vZAcr)PaPTMtt>70C2n_U) zPaZ-r5JDo!AXE~87A52` W0|E$$fIu4heA|H);*wiXKma>h{OKtG diff --git a/ui/2.1/images/add_domainbutton.gif b/ui/2.1/images/add_domainbutton.gif deleted file mode 100644 index 66e8a9dff64541193e591177ed86e00ebd294dd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1451 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 L>)jd7A`k#Ojd4Vq diff --git a/ui/2.1/images/add_userbutton.gif b/ui/2.1/images/add_userbutton.gif deleted file mode 100644 index 68d72f6050147b8af63bfeb1dd9b3b53c88a4114..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1468 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 XCoLIjPiQXFpMH?R3N9dsKmY(c;tX$d 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 0daa81e0f7c8b7ee5f915c5adb9082d161a7114f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1957 zcmV;W2U_??Nk%w1VQl~w0OkMypwi`j#NKwm+m6lTrPk-I+3BU#=eXbP==Axj*y)kZ z|ze8b(#-p}9g_KwTqipt^l`~BYU_Q~e(lFZ_%*XVr2-RAT7 z#NzJm_xix%@3h?Oyx;A`;Kt4nJQlhNmv(&>cA;E&Gb ziOb`7z}thz;EBrPmec8a!Q6$&;B~;-qtxb^)#|_D?%(kD;qmu?#@^uZ_lU~l*6Z`4 z)8^pt_LR=#i_7Bh`1_;P=avv8ax`Xfx z!c$m+MUfvrid@9V5hIfyb3PVfLeeA2izAtg#E3HEoRJzkW<;s-N6n2YYi68jv!zLu z8)E`pxl&|CCM?qU@F8UBQXx>8LTwuL>C>rGrDkR7G%8lERKb3wTD56cty#@-J!|$W z(=>Je>O2`RK<C&W=q&~fxH5t&VW1CiuS~l&}WNy#Som;nV*uR0ZCOrj6aVSu} z0D%IB%M>U;j7R5^V0m;naEdSILgI^Z6xE|6fBwM?bn(lfXrJ=sIP?T4fV6+k9>@m- zf*2^Uejd7Z=*da9+!WeH7u^(eBuK{+3nqvF12|Y=#ex%xkwAh=EP)*zE+i<%9|>fL zLIx8uxZo0EWPss`30kqlgcGg^AA=?)n7|ARSTVo_C@7eq3ntb`M~N7^*dUEdNFl}l z8%{LIMc893p=3}rB&g%eVMDTW7SG|5Ej3zYE(2@^O$0s=D}Q0D;`C>bUL3xuhp2PUX+!3+pc`9~QGIB~!MV$OL17k_Zk zXOmz`LByy;bkW7A48YLE2}BH`1p{Ol@CN}fbT9@6CulLm5TklwfDXF)3IhTZP=Ejo zV<4b~7B9GZLIJD7P=Nsycsax$1&l#}823@Y>#l$BN-D1gR4~REug01J8O!n-uB-)6 zFhT>Tira;_t?oKT1IDJqy4pait%^Ya85LmQs}^O5Ax5rU3`{})1w<(O z!m!)&N`M5{j%q*(vkp;j$lwY>K*vLfVL+)0w@bvk2<&Qr7x?ZPz|K4eAj1eUwDE!k z0a$>=&PK~1!_Hc?(eoBZf3OAAGU$MX8D?Nmv>5@6P{0Wou8Waw};Tlw6Md2E-fy2)(gz-lhYPey7 z32w-6I0PCP&AA1CU{SdVF0g@x1`?p5!F?e>;06LFKu`e|ae$%uABBe@fd;lC4gne! zBv5z)6@-C?1&7N3MjT+bYDgP6*AmlLH_`?m>V1z$xFAO#? zLJKOO2KfO141xf|00CeD?zP|sf9SvfC$ND(fZz{R0Kf)7*FW!Z&j@;mp$ugh1wA-m zh7P!)4R4sk7}n5-4u}E|Z}>wR>fwhxoFNW%XB^BvNOCoarl8xNtAwLO8P*U=e zob2Q%Eg6JK20;WESmY=XNrM&i!4H18r5*gh2VCAVmwospAA-rtU)o`pzQkoNmuZJS z40D-&Xr?lQxywFO6Pd@XrZRCU&0GG`n8-|~H-*W}VLEdK5pbqBsY%RdM$?$Sw5B`9 z$%kx0Gn&2Br8SS4%Vugboa%h%K9xC4ZTeE1<^*Ou?a<3=szMIZ?BzDC=}c$VlbzAT zr9|I3O>Y`fn#EjZFs-S~W;QgV8&xPblex`|w$z&wZK)sRu!;!uAO^`iraRq>KE3>{}lJ(|&9=9HP=%;z*^>W3KgAOeB{2m}B-R+8c3 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 44d32bca3d2f0cc634ca59de81f8e83fa960833e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 487 zcmb75I|9Dsi@f6_E@oej}Yhp>5&Dn00BY&vv`R0kf!gC`Fa@e_Ek>S65!b-oQ1 z$C%YJ@SqG2MP)ZPMA<}I1sm9G*NI)4%++SiOPgfcpU!XKb9ipg;W;)C?dd)1gI0s5udJ})zShKO=p=#h-0}Th&IvPz}YohI8E|;@i)J&|} zxMETqrG>6Uvf+&%uhkyEn7B0POM*Xm^VV>1&S5LI%eMkE6sdhr`azc%}bv| znI$FIvnT_ps7gswHM&+KpzDT714Yp;<*fg5jNf!;KOCY+8?z;m?7Vi}4M#R7CSpgZ yZF_}Rv5CVpFLIZw@q093#U3#-*F|`?E!G{+ye$u~$4|}l?S6VRNH}o_;J_bJ@a=j4 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 8ff77634d4434e892195cfa5bc1ed966ea62e6f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmZ?wbhEHbWM{BsxXQrr;?w`vU;cmj`Ty1D|L?#3|Mu(uyRZM>e*ORQ^Z!pj{=fP1 z|M{o?AHV-Ud-m+-AOAmm`~Ttl|CgWsKmYju#pnNDfBydpRR8V&r|j3;=4tYsFN-;I(mkS@%oLMjIy_G zGBY#YfAsj#by?=;k{qvJ-Irv3&GCWb?Pmr-4naYNKi_|Hd}n&ce8OM;0IRT&AHxO) theLII;-4mS9ALKRWKgNta3a6aol{7xg-6p!g|lDDRwz?piK766H2_Kt%$ooJ 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 1302115b84057221bddee9024122640aba46c355..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481 zcmb7Z%|T3%(3CJQB#U6!o1!1U8-ra4UJmL)ifE$Z3%i&T zgei=IZi)&*X}6Qrjj)NZ33Efs>Ko4Ja^B<^JMt(oq=Er3_u-r_XUOv2T9aAPIYN1H4`)#Q?ME`oUgI{+S}z^VqvhC+TaYv~+w^xl3uN3Qma r+M-S_z&QM&YeS)qVbWTO?yAQuqFs%y zI9pGry{XxCJGSXs>hxNV6h+ZUh?g`k@}eO~kchX|*8Ug!{P6kt`@`oOeljdDDAOHq z2F$<*1_lOXGFg9rKLkMu2?^WV+k=CHTU%QpAt6K}@%{Vvr%s((UtgEYTh{QT(X=*`VdYisM?-d;AF-PhOW>+8F^y1KHmvbMIy z0+^XYioOHY3ag+3sfpquh%CgCQeUF!otE9 z7nepyN4vYbwc5GR&`_C7{#REz48t=sN{wb#C=_Y#h4%FH%+1YBOiYNy6Pue`DJdyZ zsfl+(e?W)m7u#nt6D5ckO67rpfjZrSTCK^=&24UOK6>cHGBQ%7QWq8$c64<3`TKWu zbwx!*m6Vjce*HQwE>0qO^B?kC>^E+9Rw+XVvQ)vH(2($eHIMRs=f$AbRHqHRDQ*L!~Ohfe^6 z9RN>oInmnCU5W=?D23Gf7z{h4c4XXd#Ni1@cE_d0QUZsX0~};qOx!#jUu~c$Xk%PF zIic;JRBo8LGTmO5DbzF@S)Ds zib3tg84cqOaQd9}P0Bb3;?LM(LhP%E3j0se_W0W2fAID`#^?w#95^Y09hvdt=o5As z(>=7@+SYxv#y?<%z=-|rRg%p~`y)QohR1V4TPQGa_-9iN&Lx@P--@E8k|*EyW6zwg z;G9B>t>j)<*#d5lg%5!Y;lG<5`E_RyYv?rT#`lpFKJ~_HuAV21J5=^D7VLRvKPAbR z{j6qfaSG0!OhdsKrxl$WlPCHUDxp&qT!_d(U0@4t4ZygpP?VKF7Jv-5;%N5uJ?GYO zM8`%&Cd3lZqQgK|b>7ueF!OZ?^cRvwN{@&RDWA)Ymu;@^6G_ZJE# zKq@Xgh#kq#p5g*k0`!FkYy?VOT}jbaV37TErBx7$RT7ax&}!F30*X5feog0scMqZ0 z@h%JuXO)MRE|lhJw1hwe#bELIA}<^9rDm^osBnw_$es?di6GFh)Va{E%YUjS_MGX|i*vmJ zwd+MJ%_!69J8$21MiXqebA13C5~mdXj2k_j^T$1h?i`zl2xbo0@`|j9#{rt8e6K_)(%a7qvr$E2q(n~0z&=;aCC%5 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 67e98b90b7da919ccccb520aa89c74a3a90357ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1556 zcmV+v2J87pNk%w1VIlw<0QUd@0002V$;sZ{-pI(v1Ox=i%E}4~3RhQG-QC?XGBW-B z{rmg-J3Bkm)6+#oMNUpm-{0RTC@B2={Qmy_ZfvGA^Jux~`T6=yO-&FG5cKr)5)u+(uG-_{ z<0K>`1qB8B`~2PA-a*(m|uD@P6P+nlI+1c6K_V)L`zrR(Hw9wGd+uPel zMn=)m()aiH&CSkDoYLar*atl8n=;$L51Z*Onr=I7GV(n52QBQriUQ)U$& zB<$?%(b3T;K~VGa^xWLtHAYWXf0sLFfG0RYQjW1RQ)MSNLeS9BMR$`#c9Y%R-!n8c zZNv3Pc$Dbq>Q!THI$w6*jzRG7@jhH`J7yUU3#>gwR&;4MZ}M@L5-FFI9YZ04Or+uPhBGCdR>BSCbK z7Z(>gQD5QV;SmuLLv@lxc9XuozT)EITcXS?K1f@f!rzWU9WFZQ>FK-4W!Bc$IZ<9} zy6MEk#P#*}ZNv0quiFd^3`l^W*Vou6K~LD&+E9(K?Ck8@+uii^^+9HQQirH6H#{>l zGfab{ReqMl#KmE)+D?nF^Yisbc$HzT*}}rYM|qW7TU*D+$K2f9*x1?SokVla|5T8( zXlQ6jfS^>6v`&hyPmHfvn!j$u_8u=gFHd0r000000000000000000000000000000 z0000000000A^8LV00000EC2ui03rYz000R801E^dIB)>Lg9Hr*P)JbVK!*VeOi(ak z0tp2eB}iDX00RyT6*O40(d5O6VoF?r$>avf09IWhR!ozoV!BxyjXkmea)gE*7Zfcy zL8S@=T2tsS8DPTKKoS$ml)*SGQIG{#uwcM2Vp#^DDwbHGqGZN75MRgyFw(`K0;m}! zT(yA1LWL1rGGwrGK}9MnDSUhY1EK+v0Nu_Av>12pf(nqiXwU$T(gjs6TD376rLbCM zXCji2AfPk?)1?JKNG;$rYt*X+m>4$@BLWTwavz9s05|U5zjx~vjvIjqBMTLfen5c& z8#c|OH)q!&$AjzGv*!@Nbl^q-VOX^PXt9Qc_!cbIl!N7<{Urxs+RJY*pny5=3j{DY z(xC(Y{<0jB11StZ!T=ErBzT~L2@0TzKm~9lKms8QQDF!e=E2P%2_#TLhaP?iVu#uY zki;ni3?N|yC6v%eho*3{2_6wdkVP&LWRpdW$kez_r0EDBmE7P*A>{0FLmzS6@JchK zY!eS6;fR7ungWR7gqav1z=IAtV8RR>J?J1qAoQTpiwuC&A_Ffy)G48#!eVv7N9$PtS;-#h`#DhBjwfBdf=R zEpHegi5A{Gld2Ya81POzsT$x60vos?&=?~KK)|>Jpg=APC;&08y5zR2uDJqi(7-@G z2>`&o_~xtczWT;HZvYx(fB?S)7kqE14G5&yzy>#*ufGHBV1vC5R}4V||JratYY@ct zT4@j<(6MT+wZ_^=A3uKl@ZrO&SFhf^d-wVC=NB(teERh1%a<>2-@bkD;K7wESN{M1fA#9sbLY1>g?31TX>tSG@J8#asxeR>le9QP2FIl>RnU8t>igjz(GprY6 z-oACmdgiTy+jk1G?mxu9di=yOjuWiM&Yb1Ac!}W>>%}W9H(59sZr!?Z?=IV87Pd!h zPgxiqzj?;Q#P)&d^~d+0nK-|3GJN~?=htT;4jGOFg@X(ng73U%2rxLe@JXs|xUkTv Yl|fukWn)EPGbi>12+X^aYI)#oQ3B z3$IHLyyer1*-&m1P$Bwai`Co!m3tqy@1Cn6^6I;dT)w`?8=?B9hWZAU#>RFImTs25 z{=VJ`6FH_%?VmQ4Y4)7ivpD7~SU87o>5|!eOni(>molzjzi!Ry)f?8cZ`;ARYuj%2 j{Ra*nWH@s4*zx1+CyojVGMqhf_R_hFXO*ujGFSru1qha6 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 148ed6a3a9b4a9517e122abba613af5930fba77a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 453 zcmcJK%}c@n96*0-b1Ts>nbj!>Bn&!uG`bXmeO&6&t)i~|2XzQD3&Vv$;34RXvWo@T zImoDpFa&W%;P?A8nG8+S*=#nS&zDLi zhGAHi<$1nVtL1XJdc9sQmy5+>rBV?Dp-?C^8jW;1&2d~H5U5tGq9}Gcop3lDiA0*s zW-676Mx(JHzG8vD@6NyB--G={R_#68RkNx`h32ziA*$^&=Gdym@<9zyj11c7;p$7k>B(;MddfDgZ1 z?h8RE7z_ll7%Klv0?K4)24QFxWr3|BfFpuHiemMP!&?$BwV-=&W+6R^qOvY>l{*Ky b8lOAlkmnbh+Mx65E{u2|xo6d@F_`!PP}IfF 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 2cc75b8500102b23d376b95c466e95cd0f17735c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 453 zcmb`C&r6zd9LGOC-{*PsK|vpg@UTcv8)L^EiXw`bTmQi5(1_S&myHgC!A|a!9Uco7 z*eNqQ1fn~(9~b*U5zB{$h%S|pJ&$`{1TKIxpbDG<=fD+k4b*^&s;YpVPN#wYtyU|QO6j@|AeYOT=CNTM zx7$}}mo)9L(P%WAO~WXd=4C#g*R(%$-*`>_F8QS6&J&5n;r)l~5%>7BvNaN!c=2=X zS=TFHpL6%Mef-@wWx8&8Gq|HvGZQbr7T$hvSB4&Rz5mfOxz1`IWvk0CyJi9un6)WE zQd~hfIOhm0&WCIv62gu!MZ$t(X*EKUAjO5HFR^GWEJfpSd({4Y-JVGBw7Idp$@4PL z?d_4O9{k$c=Q12+vxm9goG4~QIw}?mB~4`Pi0S33Ts>p8lM1txZ^%NXP`6I^4t^4( hbLNhW4*R>G(t^jE5S&itk>uqS-r@1NEiRr0ZUF+s$N2yN 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 953503f3e343f43923fc80dfedf10d54ab0ae84f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmZ?wbhEHbWM{BsIKsg2|Npc9|6l(9|NQ^|SO5RN{r~^{|Nk%k|Ns2||GWSHzx@CI z@&Er%|Np=F|Nr&>{~!MU|9bZ9+5i8a{{R2&+_`fML;%H~EMQeSAQEIJ1M5NsmA=U; zw#$C5$+@jopmW}R?v>-cx2yKb*e?j!5uwrN=32NjL~g3v@#0kztk&Jo+4exAV*i5; zI~o*}&%H32S&$}tC)ezeZT)S@p6WRN8;?Ko*7NW-HZb$HGq<;Nb+`0%^iG=G%h<&@ zW9F>cb7ruy&08>!asJXpOO`S*v8`UcX4U#t>(;JiU}D&@ZTrrhtM=^Jy=&7Z2EqM% QjtL$+apIKnc|`_m0Iju+fdBvi 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 03a83340055fd0788b1d0c07831954ff93174272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450 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 EAHN$8j{pDw diff --git a/ui/2.1/images/alert_icon.png b/ui/2.1/images/alert_icon.png deleted file mode 100644 index 9e5b604712a5830c683c0c846ab71d08730cb362..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 545 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 DJ+CYW diff --git a/ui/2.1/images/arrow_bullet.gif b/ui/2.1/images/arrow_bullet.gif deleted file mode 100644 index b6f51955af904fe64198b75437283b166b5a0b48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49 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 diff --git a/ui/2.1/images/bytes_out.gif b/ui/2.1/images/bytes_out.gif deleted file mode 100644 index 609df13a279b610c6cd811c0c4c417c657bbafc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1023 zcmeH`Yfn-E0ESPdrrD-l*RnONmFC<^XQj2~s!dJX+?;KdW)fsxN)i$VEuhxwQ`ryb7xeDk^X2{aY;W56)TCtmb|4)1 z0RUIn5TOCa^Tw$%)MQ^NsMk^@mMpr;@Ack&VJ3AT<(&wnYmO>eV8|?m0z*DW!%)~u zTc!)RkN?(6ZyJt zet+px11Lx8RW65f`6}PAw)%zCi4=3kSPCn-%gi3aZZsNr!;ZXKNUU-6!4Ayj9)jkl zOxPl}qA)o7br@oCv7f@6es*~x;Fi8qOF+PsVoDPl8^1#X6oWOknfdGC_QSs9#ApBQSImkXIN-aDoZ9Q-_ zXzO7h_Rg8D&Wt+TfnCti4SId_i3+hQ23L?78WfheTM8Zw5T3yu-hSgXwPXQf{$!5E)Y23kxaZVhNS_|Mh6|+mKc$sVRxU}m~tyg z8GIf{zaqL6MbR_4VfR8Bi^-b$pd+X6dx|K;y69wZ^M1N;B3#Vdgbm?1i#S$f{Gs4L G;M8wrXqe~# diff --git a/ui/2.1/images/calendar_icon.gif b/ui/2.1/images/calendar_icon.gif deleted file mode 100644 index bd41d84712e8c700661181e7c62b4cee3501748b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1062 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").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/scripts/cloud.core.networkoffering.js b/ui/scripts/cloud.core.networkoffering.js index 1be8a52a7a3..27632b0abea 100644 --- a/ui/scripts/cloud.core.networkoffering.js +++ b/ui/scripts/cloud.core.networkoffering.js @@ -158,7 +158,7 @@ function networkOfferingJsonToDetailsTab() { setBooleanReadField(jsonObj.isdefault, $thisTab.find("#isdefault")); setBooleanReadField(jsonObj.specifyvlan, $thisTab.find("#specifyvlan")); - $thisTab.find("#rate").text(fromdb(jsonObj.networkrate)); + $thisTab.find("#rate").text(fromdb(jsonObj.networkrate) + " Mb/s"); $thisTab.find("#traffictype").text(fromdb(jsonObj.traffictype)); //actions *** From 450322240916973d489508dd787539a6a434ae77 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Fri, 21 Jan 2011 11:57:04 -0800 Subject: [PATCH 049/151] Bug:6510 add VM state check --- server/src/com/cloud/vm/UserVmManagerImpl.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 9a26502492f..03283a189a7 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -299,6 +299,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); @@ -1571,6 +1576,11 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager 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 = ""; From f551cf963eb639047fc7a5720f6c8421b4c3fde2 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 21 Jan 2011 12:04:41 -0800 Subject: [PATCH 050/151] bug 7664: account page - user tab - show "Disable User" when user state is enabled; show "Enabled User" when user state is disabled. --- ui/scripts/cloud.core.account.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ui/scripts/cloud.core.account.js b/ui/scripts/cloud.core.account.js index eadea6e55cc..cc19e85e9b5 100644 --- a/ui/scripts/cloud.core.account.js +++ b/ui/scripts/cloud.core.account.js @@ -514,8 +514,10 @@ function accountUserJSONToTemplate(jsonObj, $template) { noAvailableActions = false; if(jsonObj.id != systemUserId && jsonObj.id != adminUserId) { - buildActionLinkForSubgridItem("Disable User", accountUserActionMap, $actionMenu, $template); - buildActionLinkForSubgridItem("Enable User", accountUserActionMap, $actionMenu, $template); + if(jsonObj.state == "enabled") + buildActionLinkForSubgridItem("Disable User", accountUserActionMap, $actionMenu, $template); + if(jsonObj.state == "disabled") + buildActionLinkForSubgridItem("Enable User", accountUserActionMap, $actionMenu, $template); buildActionLinkForSubgridItem("Delete User", accountUserActionMap, $actionMenu, $template); } } From 48ec23ce956d52bcb7c69e81d679ff818792f867 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 21 Jan 2011 11:17:32 -0800 Subject: [PATCH 051/151] Removed a bunch of useless code --- .../AssignToLoadBalancerExecutor.java | 66 ---- .../async/executor/AttachISOExecutor.java | 92 ----- .../cloud/async/executor/AttachISOParam.java | 61 ---- .../AttachVolumeOperationResultObject.java | 103 ------ ...AuthorizeSecurityGroupIngressExecutor.java | 84 ----- .../executor/ConsoleProxyExecutorHelper.java | 54 --- .../ConsoleProxyOperationResultObject.java | 260 ------------- .../async/executor/CopyTemplateExecutor.java | 135 ------- .../async/executor/CopyTemplateParam.java | 64 ---- .../executor/CopyTemplateResultObject.java | 235 ------------ .../executor/CreateOrUpdateRuleExecutor.java | 119 ------ .../executor/CreateOrUpdateRuleParam.java | 140 ------- .../CreateOrUpdateRuleResultObject.java | 123 ------- .../CreatePrivateTemplateExecutor.java | 194 ---------- .../executor/CreatePrivateTemplateParam.java | 154 -------- .../CreatePrivateTemplateResultObject.java | 225 ------------ .../executor/CreateSnapshotExecutor.java | 144 -------- .../executor/CreateSnapshotResultObject.java | 149 -------- .../CreateVolumeFromSnapshotExecutor.java | 134 ------- .../async/executor/DeleteDomainExecutor.java | 56 --- .../async/executor/DeleteDomainParam.java | 44 --- .../executor/DeleteLoadBalancerExecutor.java | 67 ---- .../DeleteNetworkRuleConfigExecutor.java | 51 --- .../async/executor/DeleteRuleExecutor.java | 72 ---- .../cloud/async/executor/DeleteRuleParam.java | 58 --- .../executor/DeleteSnapshotExecutor.java | 83 ----- .../async/executor/DeleteUserExecutor.java | 70 ---- .../cloud/async/executor/DeleteUserParam.java | 25 -- .../executor/DestroyConsoleProxyExecutor.java | 73 ---- .../executor/ExtractTemplateExecutor.java | 38 -- .../async/executor/ExtractTemplateParam.java | 71 ---- .../async/executor/ExtractVolumeExecutor.java | 40 -- .../executor/RebootConsoleProxyExecutor.java | 79 ---- .../async/executor/RebootRouterExecutor.java | 83 ----- .../async/executor/RebootVMExecutor.java | 142 -------- .../async/executor/ReconnectExecutor.java | 199 ---------- .../RevokeNetworkGroupIngressExecutor.java | 57 --- .../executor/SecurityGroupIngressParam.java | 56 --- .../executor/StartConsoleProxyExecutor.java | 75 ---- .../executor/StartConsoleProxyResult.java | 260 ------------- .../async/executor/StartRouterExecutor.java | 91 ----- .../executor/StartRouterResultObject.java | 300 --------------- .../executor/StopConsoleProxyExecutor.java | 79 ---- .../async/executor/StopRouterExecutor.java | 76 ---- .../async/executor/SystemVmCmdExecutor.java | 147 -------- .../SystemVmOperationResultObject.java | 260 ------------- .../executor/UpdateLoadBalancerParam.java | 45 --- .../UpdateLoadBalancerRuleResultObject.java | 105 ------ .../UpdatePortForwardingRuleResultObject.java | 104 ------ .../async/executor/UpgradeVMExecutor.java | 134 ------- .../cloud/async/executor/UpgradeVMParam.java | 67 ---- .../executor/VolumeOperationExecutor.java | 164 --------- .../executor/VolumeOperationListener.java | 128 ------- .../async/executor/VolumeOperationParam.java | 135 ------- .../executor/VolumeOperationResultObject.java | 344 ------------------ 55 files changed, 6414 deletions(-) delete mode 100644 server/src/com/cloud/async/executor/AssignToLoadBalancerExecutor.java delete mode 100644 server/src/com/cloud/async/executor/AttachISOExecutor.java delete mode 100644 server/src/com/cloud/async/executor/AttachISOParam.java delete mode 100644 server/src/com/cloud/async/executor/AttachVolumeOperationResultObject.java delete mode 100644 server/src/com/cloud/async/executor/AuthorizeSecurityGroupIngressExecutor.java delete mode 100644 server/src/com/cloud/async/executor/ConsoleProxyExecutorHelper.java delete mode 100644 server/src/com/cloud/async/executor/ConsoleProxyOperationResultObject.java delete mode 100644 server/src/com/cloud/async/executor/CopyTemplateExecutor.java delete mode 100644 server/src/com/cloud/async/executor/CopyTemplateParam.java delete mode 100644 server/src/com/cloud/async/executor/CopyTemplateResultObject.java delete mode 100644 server/src/com/cloud/async/executor/CreateOrUpdateRuleExecutor.java delete mode 100644 server/src/com/cloud/async/executor/CreateOrUpdateRuleParam.java delete mode 100644 server/src/com/cloud/async/executor/CreateOrUpdateRuleResultObject.java delete mode 100644 server/src/com/cloud/async/executor/CreatePrivateTemplateExecutor.java delete mode 100644 server/src/com/cloud/async/executor/CreatePrivateTemplateParam.java delete mode 100644 server/src/com/cloud/async/executor/CreatePrivateTemplateResultObject.java delete mode 100755 server/src/com/cloud/async/executor/CreateSnapshotExecutor.java delete mode 100644 server/src/com/cloud/async/executor/CreateSnapshotResultObject.java delete mode 100644 server/src/com/cloud/async/executor/CreateVolumeFromSnapshotExecutor.java delete mode 100644 server/src/com/cloud/async/executor/DeleteDomainExecutor.java delete mode 100644 server/src/com/cloud/async/executor/DeleteDomainParam.java delete mode 100644 server/src/com/cloud/async/executor/DeleteLoadBalancerExecutor.java delete mode 100644 server/src/com/cloud/async/executor/DeleteNetworkRuleConfigExecutor.java delete mode 100644 server/src/com/cloud/async/executor/DeleteRuleExecutor.java delete mode 100644 server/src/com/cloud/async/executor/DeleteRuleParam.java delete mode 100644 server/src/com/cloud/async/executor/DeleteSnapshotExecutor.java delete mode 100644 server/src/com/cloud/async/executor/DeleteUserExecutor.java delete mode 100644 server/src/com/cloud/async/executor/DeleteUserParam.java delete mode 100644 server/src/com/cloud/async/executor/DestroyConsoleProxyExecutor.java delete mode 100755 server/src/com/cloud/async/executor/ExtractTemplateExecutor.java delete mode 100644 server/src/com/cloud/async/executor/ExtractTemplateParam.java delete mode 100644 server/src/com/cloud/async/executor/ExtractVolumeExecutor.java delete mode 100644 server/src/com/cloud/async/executor/RebootConsoleProxyExecutor.java delete mode 100644 server/src/com/cloud/async/executor/RebootRouterExecutor.java delete mode 100644 server/src/com/cloud/async/executor/RebootVMExecutor.java delete mode 100644 server/src/com/cloud/async/executor/ReconnectExecutor.java delete mode 100644 server/src/com/cloud/async/executor/RevokeNetworkGroupIngressExecutor.java delete mode 100644 server/src/com/cloud/async/executor/SecurityGroupIngressParam.java delete mode 100644 server/src/com/cloud/async/executor/StartConsoleProxyExecutor.java delete mode 100644 server/src/com/cloud/async/executor/StartConsoleProxyResult.java delete mode 100644 server/src/com/cloud/async/executor/StartRouterExecutor.java delete mode 100644 server/src/com/cloud/async/executor/StartRouterResultObject.java delete mode 100644 server/src/com/cloud/async/executor/StopConsoleProxyExecutor.java delete mode 100644 server/src/com/cloud/async/executor/StopRouterExecutor.java delete mode 100644 server/src/com/cloud/async/executor/SystemVmCmdExecutor.java delete mode 100644 server/src/com/cloud/async/executor/SystemVmOperationResultObject.java delete mode 100644 server/src/com/cloud/async/executor/UpdateLoadBalancerParam.java delete mode 100644 server/src/com/cloud/async/executor/UpdateLoadBalancerRuleResultObject.java delete mode 100644 server/src/com/cloud/async/executor/UpdatePortForwardingRuleResultObject.java delete mode 100644 server/src/com/cloud/async/executor/UpgradeVMExecutor.java delete mode 100644 server/src/com/cloud/async/executor/UpgradeVMParam.java delete mode 100644 server/src/com/cloud/async/executor/VolumeOperationExecutor.java delete mode 100644 server/src/com/cloud/async/executor/VolumeOperationListener.java delete mode 100644 server/src/com/cloud/async/executor/VolumeOperationParam.java delete mode 100644 server/src/com/cloud/async/executor/VolumeOperationResultObject.java 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/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/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/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/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/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/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/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; - } -} From 73e5a789d1c648dd07f43b83a4770d51f1f99ef9 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 21 Jan 2011 12:10:35 -0800 Subject: [PATCH 052/151] removed useless code --- .../async/executor/DeployVMExecutor.java | 253 ---------- .../cloud/async/executor/DeployVMParam.java | 169 ------- .../async/executor/DeployVMResultObject.java | 413 ---------------- .../executor/DisableAccountExecutor.java | 162 ------- .../async/executor/DisableUserExecutor.java | 191 -------- .../executor/DisassociateIpAddressParam.java | 59 --- .../executor/ExtractJobResultObject.java | 334 ++++++------- .../async/executor/HostResultObject.java | 442 ------------------ .../async/executor/LoadBalancerParam.java | 70 --- .../async/executor/OperationResponse.java | 33 -- .../executor/PrepareMaintenanceExecutor.java | 189 -------- ...parePrimaryStorageMaintenanceExecutor.java | 117 ----- .../executor/PrimaryStorageResultObject.java | 185 -------- .../executor/RecurringSnapshotParam.java | 70 --- .../RemoveFromLoadBalancerExecutor.java | 68 --- .../executor/RemoveSecurityGroupParam.java | 68 --- .../executor/ResetVMPasswordExecutor.java | 72 --- .../async/executor/ResetVMPasswordParam.java | 58 --- .../async/executor/RouterExecutorHelper.java | 65 --- .../executor/RouterOperationResultObject.java | 311 ------------ .../executor/SnapshotOperationParam.java | 113 ----- .../async/executor/VMExecutorHelper.java | 117 ----- .../async/executor/VMOperationExecutor.java | 28 -- .../async/executor/VMOperationListener.java | 126 ----- .../async/executor/VMOperationParam.java | 101 ---- .../executor/VMOperationResultObject.java | 400 ---------------- .../cloud/async/executor/VmResultObject.java | 286 ------------ 27 files changed, 167 insertions(+), 4333 deletions(-) delete mode 100644 server/src/com/cloud/async/executor/DeployVMExecutor.java delete mode 100644 server/src/com/cloud/async/executor/DeployVMParam.java delete mode 100644 server/src/com/cloud/async/executor/DeployVMResultObject.java delete mode 100644 server/src/com/cloud/async/executor/DisableAccountExecutor.java delete mode 100644 server/src/com/cloud/async/executor/DisableUserExecutor.java delete mode 100644 server/src/com/cloud/async/executor/DisassociateIpAddressParam.java mode change 100755 => 100644 server/src/com/cloud/async/executor/ExtractJobResultObject.java delete mode 100644 server/src/com/cloud/async/executor/HostResultObject.java delete mode 100644 server/src/com/cloud/async/executor/LoadBalancerParam.java delete mode 100644 server/src/com/cloud/async/executor/OperationResponse.java delete mode 100644 server/src/com/cloud/async/executor/PrepareMaintenanceExecutor.java delete mode 100644 server/src/com/cloud/async/executor/PreparePrimaryStorageMaintenanceExecutor.java delete mode 100644 server/src/com/cloud/async/executor/PrimaryStorageResultObject.java delete mode 100644 server/src/com/cloud/async/executor/RecurringSnapshotParam.java delete mode 100644 server/src/com/cloud/async/executor/RemoveFromLoadBalancerExecutor.java delete mode 100644 server/src/com/cloud/async/executor/RemoveSecurityGroupParam.java delete mode 100644 server/src/com/cloud/async/executor/ResetVMPasswordExecutor.java delete mode 100644 server/src/com/cloud/async/executor/ResetVMPasswordParam.java delete mode 100644 server/src/com/cloud/async/executor/RouterExecutorHelper.java delete mode 100644 server/src/com/cloud/async/executor/RouterOperationResultObject.java delete mode 100644 server/src/com/cloud/async/executor/SnapshotOperationParam.java delete mode 100644 server/src/com/cloud/async/executor/VMExecutorHelper.java delete mode 100644 server/src/com/cloud/async/executor/VMOperationExecutor.java delete mode 100644 server/src/com/cloud/async/executor/VMOperationListener.java delete mode 100644 server/src/com/cloud/async/executor/VMOperationParam.java delete mode 100644 server/src/com/cloud/async/executor/VMOperationResultObject.java delete mode 100644 server/src/com/cloud/async/executor/VmResultObject.java 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/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/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/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/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/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/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; - -} From d80a02c9182180d5376ce6f9ec5da34b3e83e354 Mon Sep 17 00:00:00 2001 From: anthony Date: Fri, 21 Jan 2011 12:10:32 -0800 Subject: [PATCH 053/151] use async for start/stop/reboot --- .../xen/resource/CitrixResourceBase.java | 297 +++++++++++++----- 1 file changed, 222 insertions(+), 75 deletions(-) diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 99f2c6c79c1..474f426bf65 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -153,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; @@ -196,6 +197,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; @@ -281,12 +283,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); @@ -318,20 +315,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) { @@ -2610,25 +2606,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 { @@ -2638,19 +2658,187 @@ 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(); @@ -5431,48 +5619,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, From edc46783adb497b9c740880904dfa8b287a681bf Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 21 Jan 2011 13:43:58 -0800 Subject: [PATCH 054/151] bug 7741: instance page - clear details tab if no item exists in middle menu. --- ui/scripts/cloud.core.instance.js | 54 +++++++++++++++++++++---------- ui/scripts/cloud.core.js | 16 ++++++++- 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/ui/scripts/cloud.core.instance.js b/ui/scripts/cloud.core.instance.js index 799c21c1c79..02f15855625 100644 --- a/ui/scripts/cloud.core.instance.js +++ b/ui/scripts/cloud.core.instance.js @@ -90,6 +90,8 @@ var init = false; var $selectedVmWizardTemplate; var osTypeMap = {}; function afterLoadInstanceJSP() { + $("#right_panel_content").data("clearRightPanelFn", vmClearRightPanel); + if (!init) { //initialize VM Wizard $doTemplateNo = $("#vm_popup_disk_offering_template_no"); @@ -107,7 +109,7 @@ function afterLoadInstanceJSP() { bindDestroyVMButton(); if (isAdmin() || isDomainAdmin()) - $("#right_panel_content").find("#tab_router,#tab_router").show(); + $("#right_panel_content").find("#tab_router,#tab_router").show(); // switch between different tabs var tabArray = [$("#tab_details"), $("#tab_nic"), $("#tab_volume"), $("#tab_statistics"), $("#tab_router")]; @@ -1875,22 +1877,40 @@ function vmJsonToRouterTab() { }); } -function vmClearRightPanel(jsonObj) { - $("#right_panel_header").find("#vm_name").text(""); - setVmStateInRightPanel(""); - - var $rightPanelContent = $("#right_panel_content"); - $rightPanelContent.find("#ipAddress").text(""); - $rightPanelContent.find("#zoneName").text(""); - $rightPanelContent.find("#templateName").text(""); - $rightPanelContent.find("#serviceOfferingName").text(""); - $rightPanelContent.find("#ha").hide(); - $rightPanelContent.find("#created").text(""); - $rightPanelContent.find("#account").text(""); - $rightPanelContent.find("#domain").text(""); - $rightPanelContent.find("#hostName").text(""); - $rightPanelContent.find("#group").text(""); - $rightPanelContent.find("#iso").hide(); +function vmClearRightPanel(jsonObj) { + vmJsonClearDetailsTab(); + $("#tab_details").click(); +} + +function vmJsonClearDetailsTab(){ + var $thisTab = $("#right_panel_content").find("#tab_content_details"); + resetViewConsoleAction(null, $thisTab); + setVmStateInRightPanel(null, $thisTab.find("#state")); + $thisTab.find("#ipAddress").text(""); + $thisTab.find("#id").text(""); + $thisTab.find("#zoneName").text(""); + $thisTab.find("#title").text(""); + $thisTab.find("#vmname").text(""); + $thisTab.find("#vmname_edit").val(""); + $thisTab.find("#ipaddress").text(""); + $thisTab.find("#templateName").text(""); + $thisTab.find("#ostypename").text(""); + $thisTab.find("#ostypename_edit").val(""); + $thisTab.find("#serviceOfferingName").text(""); + $thisTab.find("#account").text(""); + $thisTab.find("#domain").text(""); + $thisTab.find("#hostName").text(""); + $thisTab.find("#group").text(""); + $thisTab.find("#group_edit").val(""); + $thisTab.find("#created").text(""); + $thisTab.find("#haenable").text(""); + $thisTab.find("#haenable_edit").text(""); + $thisTab.find("#iso").text(""); + + //actions *** + var $actionMenu = $("#right_panel_content #tab_content_details #action_link #action_menu"); + $actionMenu.find("#action_list").empty(); + $actionMenu.find("#action_list").append($("#no_available_actions").clone().show()); } //***** declaration for volume tab (begin) ********************************************************* diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index 4e1fd3e170b..0c6a5bc8890 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -847,6 +847,9 @@ function disableConsoleHover($viewConsoleContainer) { function resetViewConsoleAction(jsonObj, $detailsTab) { var $viewConsoleContainer = $detailsTab.find("#view_console_container").empty(); //reset view console panel + if(jsonObj == null) + return; + var $viewConsoleTemplate = $("#view_console_template").clone(); $viewConsoleContainer.append($viewConsoleTemplate.show()); if (jsonObj.state == 'Running') { @@ -867,7 +870,12 @@ function resetViewConsoleAction(jsonObj, $detailsTab) { } } -function setVmStateInRightPanel(stateValue, $stateField) { +function setVmStateInRightPanel(stateValue, $stateField) { + if(stateValue == null) { + $stateField.text("").removeClass("green red gray"); + return; + } + if(stateValue == "Running") $stateField.text(stateValue).removeClass("red gray").addClass("green"); else if(stateValue == "Stopped" || stateValue == "Error") @@ -1034,6 +1042,12 @@ function listMidMenuItems2(commandString, getSearchParamsFn, jsonResponse1, json count = items.length; } else { + clearRightPanel(); //general one + + var clearRightPanelFn = $("#right_panel_content").data("clearRightPanelFn"); //page-specific one. e.g. vmClearRightPanel() + if(clearRightPanelFn != null) + clearRightPanelFn(); + $container.append($("#midmenu_container_no_items_available").clone().show()); } $("#midmenu_container").show(); From 94f62c3bf15e6109c6a83a145dd8cc4f4277a922 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 21 Jan 2011 13:58:47 -0800 Subject: [PATCH 055/151] bug 7741: instance page - clear NICs tab, Volumes tab, Statistics tab if no item exists in middle menu. --- ui/scripts/cloud.core.instance.js | 33 ++++++++++++++++++++++++++++++- ui/scripts/cloud.core.js | 6 ++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/ui/scripts/cloud.core.instance.js b/ui/scripts/cloud.core.instance.js index 02f15855625..e6cac413edf 100644 --- a/ui/scripts/cloud.core.instance.js +++ b/ui/scripts/cloud.core.instance.js @@ -1778,6 +1778,11 @@ function vmJsonToNicTab() { } } +function vmJsonClearNicTab() { + var $thisTab = $("#right_panel_content").find("#tab_content_nic"); + $thisTab.find("#tab_container").empty(); +} + function vmJsonToVolumeTab() { var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); if ($midmenuItem1 == null) @@ -1813,6 +1818,11 @@ function vmJsonToVolumeTab() { } +function vmJsonClearVolumeTab() { + var $thisTab = $("#right_panel_content").find("#tab_content_volume"); + $thisTab.find("#tab_container").empty(); +} + function vmJsonToStatisticsTab() { var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); if ($midmenuItem1 == null) @@ -1843,6 +1853,18 @@ function vmJsonToStatisticsTab() { $thisTab.find("#networkkbswrite").text(networkKbsWrite); } +function vmJsonClearStatisticsTab() { + var $thisTab = $("#right_panel_content #tab_content_statistics"); + var $barChartContainer = $thisTab.find("#cpu_barchart"); + $barChartContainer.find("#cpunumber").text(""); + $barChartContainer.find("#cpuspeed").text(""); + $barChartContainer.find("#bar_chart").removeClass().addClass("db_barbox").css("width", "0%"); + $barChartContainer.find("#percentused").text(""); + drawBarChart($barChartContainer, null); + $thisTab.find("#networkkbsread").text(""); + $thisTab.find("#networkkbswrite").text(""); +} + function vmJsonToRouterTab() { var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); if ($midmenuItem1 == null) @@ -1876,9 +1898,18 @@ function vmJsonToRouterTab() { } }); } + +function vmJsonClearRouterTab() { + var $thisTab = $("#right_panel_content").find("#tab_content_router"); + $thisTab.find("#tab_container").empty(); +} function vmClearRightPanel(jsonObj) { - vmJsonClearDetailsTab(); + vmJsonClearDetailsTab(); + vmJsonClearNicTab(); + vmJsonClearVolumeTab(); + vmJsonClearStatisticsTab(); + vmJsonClearRouterTab(); $("#tab_details").click(); } diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index 0c6a5bc8890..3c6e881b4e4 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -1160,6 +1160,12 @@ function showLeftNavigationBasedOnRole() { } function drawBarChart($capacity, percentused) { //percentused == "0.01%" (having % inside) + if(percentused == null) { + $capacity.find("#percentused").text(""); + $capacity.find("#bar_chart").removeClass().addClass("db_barbox low").css("width", 0); + return; + } + $capacity.find("#percentused").text(percentused); var percentusedFloat; From 3941e98dbbc0af3a393dd1549b8d77fa09c3ea56 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 21 Jan 2011 14:31:53 -0800 Subject: [PATCH 056/151] bug 8158: Network page - public network - IP Range - add domain, account row. --- ui/jsp/network.jsp | 22 +++++++++++++++++++++- ui/scripts/cloud.core.network.js | 4 +++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/ui/jsp/network.jsp b/ui/jsp/network.jsp index 0c435d1b596..ceebc5e5936 100644 --- a/ui/jsp/network.jsp +++ b/ui/jsp/network.jsp @@ -625,7 +625,27 @@
    - + +
    +
    +
    + Domain:
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + Account:
    +
    +
    +
    +
    +
    +
    diff --git a/ui/scripts/cloud.core.network.js b/ui/scripts/cloud.core.network.js index e2757fce5de..25fd3e7dcbd 100644 --- a/ui/scripts/cloud.core.network.js +++ b/ui/scripts/cloud.core.network.js @@ -216,7 +216,9 @@ function publicNetworkIprangeJsonToTemplate(jsonObj, $template) { $template.find("#vlan").text(jsonObj.vlan); $template.find("#gateway").text(jsonObj.gateway); $template.find("#netmask").text(jsonObj.netmask); - $template.find("#iprange").text(ipRange); + $template.find("#iprange").text(ipRange); + $template.find("#domain").text(jsonObj.domain); + $template.find("#account").text(jsonObj.account); var $actionLink = $template.find("#iprange_action_link"); $actionLink.bind("mouseover", function(event) { From 6545cb99d2858ce76bc26384b762028f6da86fee Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 21 Jan 2011 15:09:19 -0800 Subject: [PATCH 057/151] bug 7116: instance page - cleanup the confirmation dialogs to use a single dialog (i.e. "dialog_confirmation"). --- .../classes/resources/resource.properties | 9 --- ui/jsp/instance.jsp | 67 ------------------- ui/scripts/cloud.core.instance.js | 57 ++++++++-------- 3 files changed, 28 insertions(+), 105 deletions(-) diff --git a/client/WEB-INF/classes/resources/resource.properties b/client/WEB-INF/classes/resources/resource.properties index 260e5ca880e..17649d12d92 100644 --- a/client/WEB-INF/classes/resources/resource.properties +++ b/client/WEB-INF/classes/resources/resource.properties @@ -112,9 +112,6 @@ 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. @@ -134,12 +131,6 @@ Please.choose.a.OS.preference.for.this.host..Virtual.machines.will.always.be.all 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 diff --git a/ui/jsp/instance.jsp b/ui/jsp/instance.jsp index 2c33906c9a7..22e6e2f8dac 100644 --- a/ui/jsp/instance.jsp +++ b/ui/jsp/instance.jsp @@ -1422,73 +1422,6 @@ - - - - - - - - - - - - - - - - - - - - - - -
    diff --git a/ui/scripts/cloud.core.instance.js b/ui/scripts/cloud.core.instance.js index e6cac413edf..09a24ab9fe5 100644 --- a/ui/scripts/cloud.core.instance.js +++ b/ui/scripts/cloud.core.instance.js @@ -125,22 +125,8 @@ function afterLoadInstanceJSP() { initDialog("dialog_attach_iso"); initDialog("dialog_change_name"); initDialog("dialog_change_group"); - initDialog("dialog_change_service_offering", 600); - initDialog("dialog_confirmation_change_root_password"); - initDialog("dialog_confirmation_enable_ha"); - initDialog("dialog_confirmation_disable_ha"); - initDialog("dialog_create_template", 400); - initDialog("dialog_confirmation_start_vm"); - initDialog("dialog_confirmation_stop_vm"); - initDialog("dialog_confirmation_reboot_vm"); - initDialog("dialog_confirmation_destroy_vm"); - - if(isAdmin() || isDomainAdmin()) - initDialog("dialog_confirmation_restore_vm"); - - initDialog("dialog_confirmation_start_router"); - initDialog("dialog_confirmation_stop_router"); - initDialog("dialog_confirmation_reboot_router"); + initDialog("dialog_change_service_offering", 600); + initDialog("dialog_create_template", 400); $.ajax({ data: createURL("command=listOsTypes"), @@ -194,7 +180,8 @@ function bindStartVMButton() { return false; } - $("#dialog_confirmation_start_vm") + $("#dialog_confirmation") + .text("Please confirm you want to start instance") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); @@ -240,7 +227,8 @@ function bindStopVMButton() { return false; } - $("#dialog_confirmation_stop_vm") + $("#dialog_confirmation") + .text("Please confirm you want to stop instance") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); @@ -286,7 +274,8 @@ function bindRebootVMButton() { return false; } - $("#dialog_confirmation_reboot_vm") + $("#dialog_confirmation") + .text("Please confirm you want to reboot instance") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); @@ -332,7 +321,8 @@ function bindDestroyVMButton() { return false; } - $("#dialog_confirmation_destroy_vm") + $("#dialog_confirmation") + .text("Please confirm you want to destroy instance") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); @@ -1342,7 +1332,8 @@ var vmActionMap = { } function doStartVM($actionLink, $detailsTab, $midmenuItem1) { - $("#dialog_confirmation_start_vm") + $("#dialog_confirmation") + .text("Please confirm you want to start instance") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); @@ -1360,7 +1351,8 @@ function doStartVM($actionLink, $detailsTab, $midmenuItem1) { } function doStopVM($actionLink, $detailsTab, $midmenuItem1) { - $("#dialog_confirmation_stop_vm") + $("#dialog_confirmation") + .text("Please confirm you want to stop instance") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); @@ -1378,7 +1370,8 @@ function doStopVM($actionLink, $detailsTab, $midmenuItem1) { } function doRebootVM($actionLink, $detailsTab, $midmenuItem1) { - $("#dialog_confirmation_reboot_vm") + $("#dialog_confirmation") + .text("Please confirm you want to reboot instance") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); @@ -1396,7 +1389,8 @@ function doRebootVM($actionLink, $detailsTab, $midmenuItem1) { } function doDestroyVM($actionLink, $detailsTab, $midmenuItem1) { - $("#dialog_confirmation_destroy_vm") + $("#dialog_confirmation") + .text("Please confirm you want to destroy instance") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); @@ -1414,7 +1408,8 @@ function doDestroyVM($actionLink, $detailsTab, $midmenuItem1) { } function doRestoreVM($actionLink, $detailsTab, $midmenuItem1) { - $("#dialog_confirmation_restore_vm") + $("#dialog_confirmation") + .text("Please confirm you want to restore instance") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); @@ -1545,7 +1540,8 @@ function doDetachISO($actionLink, $detailsTab, $midmenuItem1) { } function doResetPassword($actionLink, $detailsTab, $midmenuItem1) { - $("#dialog_confirmation_change_root_password") + $("#dialog_confirmation") + .text("Please confirm you want to change the ROOT password for the virtual machine") .dialog('option', 'buttons', { "Yes": function() { $(this).dialog("close"); @@ -2211,7 +2207,8 @@ var vmRouterActionMap = { } function doStartVmRouter($actionLink, $subgridItem) { - $("#dialog_confirmation_start_router") + $("#dialog_confirmation") + .text("Please confirm you want to start router") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); @@ -2229,7 +2226,8 @@ function doStartVmRouter($actionLink, $subgridItem) { } function doStopVmRouter($actionLink, $subgridItem) { - $("#dialog_confirmation_stop_router") + $("#dialog_confirmation") + .text("Please confirm you want to stop router") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); @@ -2247,7 +2245,8 @@ function doStopVmRouter($actionLink, $subgridItem) { } function doRebootVmRouter($actionLink, $subgridItem) { - $("#dialog_confirmation_reboot_router") + $("#dialog_confirmation") + .text("Please confirm you want to reboot router") .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); From 26b6d17ec6b1e4037a65b98a17241437029f9a25 Mon Sep 17 00:00:00 2001 From: alena Date: Fri, 21 Jan 2011 15:09:20 -0800 Subject: [PATCH 058/151] bug 8139: Allow to have Virtual and Direct networks with the same vlanId status 8139: resolved fixed --- .../configuration/ConfigurationManagerImpl.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index ab218a28325..204e5b86c99 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -1734,20 +1734,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); @@ -1766,11 +1754,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)) { From 61ce43bdffe4e8cf0c3167ca06afcbc2f427f63b Mon Sep 17 00:00:00 2001 From: abhishek Date: Fri, 21 Jan 2011 15:24:36 -0800 Subject: [PATCH 059/151] bug 7892: introducing recursive listings for various artifacts based on the domain id and the isRecursive flag --- .../cloud/api/commands/ListAccountsCmd.java | 9 ++- .../cloud/api/commands/ListSnapshotsCmd.java | 7 +++ .../com/cloud/api/commands/ListVMsCmd.java | 6 ++ .../cloud/api/commands/ListVolumesCmd.java | 8 +++ .../cloud/server/ManagementServerImpl.java | 48 +++++++++++++--- .../storage/snapshot/SnapshotManagerImpl.java | 18 ++++-- .../src/com/cloud/vm/UserVmManagerImpl.java | 55 +++++++++++++++++++ 7 files changed, 137 insertions(+), 14 deletions(-) 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/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/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 6172d799d71..e3c34febed3 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1738,7 +1738,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 +1754,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 +1780,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 +1814,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 +2293,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 +2314,7 @@ public class ManagementServerImpl implements ManagementServer { } } else { domainId = ((account == null) ? DomainVO.ROOT_DOMAIN : account.getDomainId()); + isRecursive = true; } } else { accountId = account.getId(); @@ -2339,12 +2362,16 @@ public class ManagementServerImpl implements ManagementServer { // Only return volumes that are not destroyed sb.and("destroyed", sb.entity().getDestroyed(), 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 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 +2395,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 + "%"); diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java index fbe01b3b9df..6bd2e140ae5 100755 --- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java +++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java @@ -777,7 +777,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); @@ -798,7 +799,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); @@ -810,6 +811,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(); @@ -831,7 +835,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); } @@ -863,7 +870,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) { diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 03283a189a7..759c089ed72 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2347,6 +2347,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())) { @@ -2374,6 +2376,23 @@ 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()); @@ -2403,6 +2422,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()); From c44dc97f31c36f6ec256d1cc05fa805789509413 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 21 Jan 2011 15:27:37 -0800 Subject: [PATCH 060/151] bug 7116: volume page, snapshot page, IP Address page - cleanup the confirmation dialogs to use a single dialog (i.e. "dialog_confirmation"). --- client/WEB-INF/classes/resources/resource.properties | 1 - ui/jsp/ipaddress.jsp | 6 ------ ui/jsp/snapshot.jsp | 6 ------ ui/jsp/volume.jsp | 6 ------ ui/scripts/cloud.core.ipaddress.js | 4 ++-- ui/scripts/cloud.core.snapshot.js | 6 +++--- ui/scripts/cloud.core.volume.js | 6 +++--- 7 files changed, 8 insertions(+), 27 deletions(-) diff --git a/client/WEB-INF/classes/resources/resource.properties b/client/WEB-INF/classes/resources/resource.properties index 17649d12d92..3ec9e405e3c 100644 --- a/client/WEB-INF/classes/resources/resource.properties +++ b/client/WEB-INF/classes/resources/resource.properties @@ -121,7 +121,6 @@ please.confirm.you.want.to.disable.account.that.will.prevent.account.access.to.t 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 diff --git a/ui/jsp/ipaddress.jsp b/ui/jsp/ipaddress.jsp index 50501b79907..bac97d0771b 100644 --- a/ui/jsp/ipaddress.jsp +++ b/ui/jsp/ipaddress.jsp @@ -603,12 +603,6 @@ - - - - - - @@ -546,7 +532,7 @@
    - All Accounts +
    @@ -708,7 +694,7 @@
    - Network Offering +
    @@ -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 @@
  • 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 diff --git a/ui/2.1/images/capacitypanel_mid.gif b/ui/2.1/images/capacitypanel_mid.gif deleted file mode 100644 index c3a34937cc681bdaa168ed37e3a0b1fe4949d2df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1291 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 Ef@v$NRsaA1 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 2e1272329d8705ccbf7461ca8967f6b9b929c47a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2034 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

    lz(XBol{!J##Lws0bWbgG2C}bN2 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 diff --git a/ui/2.1/images/cproxytitle_icons.gif b/ui/2.1/images/cproxytitle_icons.gif deleted file mode 100644 index 6fb269f6c55977e756c139014b7f8c28114c7caa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1609 zcmV-P2DbS}Nk%w1VIlw?0QUd@|NsC0{{Q~|{@&i+V`F1jSXfzESz20J`}_M_TU+Df z<18#J=H}+)FMd6ot=GseIp|y+}zwcIy(OS{!dR&rKP1#PEPLb?qy|V@bK{L?Ci?Q%J%m5DJdz1 zg@uBGg75F|B_$>8?d`(C!d6yRczAd%D=m6@dVzs~jf{;eDl4X?ranGC)WyTJw6sb} zO5o(->gwvVva@Y%ZQ$VG+uPe+TwUwy>#nY@*x1;)xw%tQQ*Uo?^YingqoX!9Hrd(P zE-o%jO-;78w$jql)YR0lu&~k5(HR*Tyu7^k_xFB&e)RP8o12^c{{G?L;jOK$CnhJ6 zk&)lu-`3gKudlDFs;ZovobmDT#KgoO9Un|fOwP{E%gf7NUS6M_pJ8EP*4EZlRaO4~ z|N8p+C@3gfSzB^)a%gC1YinzNe}5hx9{&ISx3{zrWz&;OOY+-`(H!_4Ulm%tS;))6>(}*Vk6G#SRV*|Ns8g)zzAunj|D7`uqCJ z%+9~EuYRYnxVE*~?b($m$`q@tv1X==sA#(sW($i~Or-rcOMtl!nuZ*Xt&@$#{) zuf4s#vZ$s;MMS!lm*nH*U|(R;(a|(CH0tE!e}aJH z;^W)e+pw>&=;`Rw)YP-6sORYCwy&<&)Yh)9ujJkdW0R)5;DF9(ei6S*x6eysj2$T;?GHeN;qyPrW24KK2Kxa>#L>>S* z1Sk~GpFS}>Ia9Hw3Sw^vNS!Lxzzrh;`kiP);EzHy zL&H0^XyHN&E!^P2CpI9{Od!?J;DHA!x{!|xINA`5CM;1@iXjYeP(d#pa1n$N7EF_j zHG41t0RzlH&_t4C0O8Fsvuw~sNa_u8K?Pz|fCM8`P=N#-quldDAkkc4h!;a#P|OsY zG=fAs<+LJ4O#vXFNEjz9aYr61fZ~ZPJUDVrJP1^>&k3Y-lE*jPcp^ii=76&YSqM}S zK?l5a(8MYANMnjBv}m&mCB8)eV1^qVkWfevM=S#kHkVuj30V{*K}HW!VA4YvlHl?S zE0#Dj#w({BA%zrt9D&0+K~z!2Kd89!rvM_zG>`yGkibw3Gbm%w1nB{gf)@=)Ajl0k z4DyTu_~tuI1Mz<0K?hSdP(eCfu)~o+-RQze8L;5tM+>6ZLqY@;N1y`uhp02f4J#Tsm=u*MoxGy=kuMxd~T%>z*l00J9q z@dD5g4DbXTj96hsnn-{qFoXphnDF!*?CLzO04FE%fC(vZAb|xIG++S(hct}>6HrTC HP(T1XwPYjF diff --git a/ui/2.1/images/cpu_icon.gif b/ui/2.1/images/cpu_icon.gif deleted file mode 100644 index 4ff03b35e003b8bba4703c50850540f833bd9d77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1095 zcmchW{Zo<$0LLE?706oBDy-ctO-t08i*%NAhfXWYZO&R#rylESEAzVAb(}fZnJ-hb z?ew-%tDVi4gVSR%t*M(Sii)TRN`gL!yclnS@CXm@53t%FvF{JxUq5%>&wWp3o=7_O zH4)eXH~_%!0)_Mp0X@U-T1LEHgL$)KXw2*N`CTi+T!F^}>l31-zP~5>2FK%QSA$aaK{l7)Ez7=rTeUpR2W9wkp9>gzXj2bal;Y{C&K{+B?wiJYA-M_LisE61 zQ!bh3@fT&F_LXF+zvB+(gNTFmH+4pV)#h#+{5ZAlgaYI@F?;K~SzN{iBV=u&KmCKl zEo`piNkF+$hds4ls@DC(grhB3D3>O@!VRY%t z(2i@TF-gJ8ay5OJBLo%OGIvVBHPa?s(cT8xoxa!hY`R;mt!qY;VH1`}B?XPyv?s-f zYN>vg^vmi>yUn$#*6NnHW}VIH@mOBZ{xr+&K!P)(yl#zp1B$#%#%ITxY<8Q;)x()m zE^)U~Q>=D7CIMI4*6Q(ieO@2!VY3H8a(=2jQgC!=v5$JUws)M@KTs7?m^|Ba(G1&H zH2UDQC;>fPwGMH3^A?9QFd1jDyYc4}A5K2go2?!X5||RM*)SK>RH;oe+^0B|%Bav8 zf9Yca|5w6YnEz05Z~DzA0IVNCVKIt;x2gkzv9FZBRtd_#C6$&Tz`Z9tS6Ft0-9ACRP#Q`=6_5QKlgPjl2xAq8g7cArx19_wDVoq*%3yU7 zI?#b375jFja+|-!V{f;{QWaup^xu6{5bDAJ&!BJDXGKY6#jC81*`_R@FVmoBG8%;7($ZGS=%#{hWL zc{B^hj%2@&x`uuy60eA+?1}pwfGC{@*aTE6hDfN0WN$~EeIO$U!znRYzhN*y^1rcF BL?{3N diff --git a/ui/2.1/images/crosszone_nonselectedicon.gif b/ui/2.1/images/crosszone_nonselectedicon.gif deleted file mode 100644 index a68298decc2a260a51764c21752b5074daaa86ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1056 zcmbu6`%~Hl0KmWUQkhe*0&TX$xgYYTY1(v~Td2FOF4wu{c}iMR$WE@)@5*gH8wluh zKCoQ!N&%%cpVUs`VFP^K5D)X+QdFh_Uwo08Cz8^wf1%G0pC3QJe6D_QCGH%V1YiLR z05F+M7KmIy&0Z)03Z{Z!{X~>+5YcTWxKv)oP_sC^FMc?j*h0LroO(usjrK8t*GVhdfs&FElgR`r`glCv%N> zFL36iUp@gm-E>-ZWG=g+@_tqIgPPj9`l`rm8U;nAad~`!@Q3CWkys+6q9}eRTiZK2 zyM)*HC;d>d-SS@*&9NvvFb2M5m^#wSKDeyF`TPQm9=OeQ~4 z7$q}2e8Fmi>3-)1Ei$`o5{IzADBA?N;#;R<3sleJaRIy(A7Kq#>M z$|&Ib+NE_a2Ig~L9AD+D4J0Qb#a99`(<1=uMwho2ogj-23&6*;D-@sOZW5wEw;7d= ziOs9@1=WMobA*13Dl~*;BTBltNHqFQU*N9Cvhu-Dfj2Q@t31M|I-u@E5}h6(Si_-{ z_%X;J>A>aZL%_Qw_I2zY?2WqSi4L4rJeGUXHpPvSDXLMUKp87}bE49e@CqFcj_scE^Z57ViS zSHI6BIhnx6$vhVDUUr6ufAll@F#k(AWD$VFZ&`%}Gl7qMqDyZjz;kvXYYQC}W)rb+ zG@F=l7S!QsjlbyN)XQN|TVomxl5(l-(2ot5WQ^0i(x`rKP9x3!_@|Js`n_t}v0lK1 Fe*qht{kH%B diff --git a/ui/2.1/images/crosszone_selectedicon.gif b/ui/2.1/images/crosszone_selectedicon.gif deleted file mode 100644 index 58a80be4535f19d713c898af3fc23c5b8cd0c63d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1072 zcmV-01kd|NNk%w1VOjtY0OkMyT8IIIgM);GgoTBLrKP2;tgP49*UZe!udlCfZ*SDp z)XvV%kB^V&=;)1&jb&wJWMpLL=jY+!;mga*&(F`UuCA@Et=rq%Zfgwv%)z!(#$>!$f-{0Swnwqw@w(afhy1Kf0dU}S2hWYvV+j^j!NJ<&$m{IrkdTnP&6{D34PJ`}?Ck9Q{`|kczs%US zxw*NEs!wZ_8}sw?c%3nDaB$$})^?mN(cHY5nVDmb59RCIXOR_qdwXw}A@=w5;^x|O znJL@k$}w?^Xy)V2a%DH`TO>9m?UVD7IvE~m$P8v=hwK)lHcdgoSd9mT3Yh* z^85Sy_V)Jl^z``n`1<<#{{H^`{r&Fl?(6I8>FMe4@bJ;m(f|MdA^8LV00000EC2ui z09pVM000O7fPZ%~euajIh>41ejE#rCeYT`*u*#hYR-8Z zetF{J5mhXCayB;O?CtLF<8oc+@b&iZZU6u)?uB#z{|FEO*eA!F9t7eLxG*5jfD3aj zB#46~V4MUR0BQ^|aE^wFA^OY__~1dtJ`EqvK^dpS2aPc2h*_c!z#Eu_?&#DxfWpq5 z2nJ+O!2rRXpmzpn$PhvWg%Wp282x#4z|IF0G89e9;AmF{B%*djK;RAmpHy||{NhDl z8Y5Ky?-a5_m#%;Xb?a8BKsQcZzZD*2!8_tXi3%g~+F6hw@nQjV7eK!I*iIY)nEft@ z!vKonGCx*qu_Hv^6(Wl17NWzNwFMfj>FkhT!2;_zt#Q*aKm)=II!tB=ND$jV0t2lN z2w<(8j(`Jnn#Van9XcJ_2~xDiB1IpY7fJxEc@aByp*rZ%gGeBv4u=#0>J%t|-U0mr z@nKA;W50+44jn*{9tSYAmtGwZOu&JCbp){A1o1H_LVP^j=fHtUXaRr=Ljb@<8wZA1 zh#VxAs6YV8)X;z&F~mUPiE#v=fE+hK5Mu)kpa{VYC3-N;G;%nBK^!W|5r7ABco2Y% z957-qqXI)ZSt5y6grScaPfV$$9DXREM;~B@Ddw1DmTBghXr@Uf8B_q^1DY8G(E0+o_zM{r=DO$aYUaev{1(e4eX)lqKr1`=%bKED(R$@I@-Vnb^K9^1QGDz q>8GHED(a}DmTKy$sCpWK1eRn{2M8TNBI~TQ){006AY}SSAOJfwjWizs diff --git a/ui/2.1/images/dashboardtitle_icons.gif b/ui/2.1/images/dashboardtitle_icons.gif deleted file mode 100644 index 1fb5e3b3484a720ee4a1c40f200fed7871cf7102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1677 zcmV;826FjFNk%w1VIlw?0QUd@|NsB~{{H{||Jm8uQBYBbhlhWEe^X0L=;-N>kB_{* zz+GKk%H?C$RFtgWt>mzPRPN}{2nHa0f!@bLEb_GM*dR#sLp zFff^!nRj=0ii(O%Oic3f^5y2}z*9_xSj$tE}(u@ZaF$*VotH-riJHRB&)`wzjvvzQVdG zE3>q><>lq|_4PS9In~wI+}_`Hb#>I%*D^9P^z-w`$jH*t($?46uduM~@9x~(+~?}( z+}z$zPEO9y)BgPag@uLx|Nd7iEMZ|`F)=ag>+4)EF!_6b{QLaj;o^FGeEIqL?(FSK zNlK)nq*XgR@g*kn^7HcZ^3lx9o12^O@9%_yh1=WS{r&x#CMk!9iH(VgOG`^`ZgKrE zF*7qXq;PSgEir2$BWp4;jgF8%KtRyY(}#(QQ&UrCXK7?&Wll{`LqkLI^6~on{CIeH zqmz_8Jw3!7BTi0G@$&I#XKC&vCwwz9`TF|Vac{{ZB;4EH_9!k_S6Aic=fcCopO~2K z?d?lLLoYBeWJpQ-{QLFx^+`%f^Y!*hNlA`GL;U*s>FMdJAs?WhqOcw!)z;Ocqonuu z_oJkz>g?=kX=&%@=V@wd<>ThXEicq$Xw@Pm*d{I8C?~(b#Mjx|!o$a2GBli>o?>8R zgM@|TCMx~^|LZ0w@FXjeBPE$ADf|2S!?Cl#y1JK`oAUDW{{H`sjgO9wkJHrGhK7dG z($r#NVun;!A^8LV00000EC2ui03rY$000R8009UbNU)&6g9rr*SSV0JEd(=+MN%>h z&l(yt1_d%gkl{fA0TKZ~LoEs+Jz;*FdBqBZk09ri7`q2bV1R@-0n}lDM-PcuxgvZS z8sXHgd=ro;8BsH*K>-5m&{*S&T`pQH3?wK~qJRw+xmGCn6e-0`rvz_KYOuyosbw|T zx!`i5E*CLlY|tVF2M+^h0H7Xpr$)*jNp_}?aZy5rHW7{L)M4DA(5x^FsLe}=W)KZ7 zt)}QBlORE-CZ*FLC{3nA3=B#TctMDd7q@=J79c9XyFeK&FbV(?(Hq8#9dNd6;b_p7 z8ZT)oX3oy;#4VQyLBcns6z=CPlptHfoGP zGuxmxsc)?C20?GULBdUa*x*DIxX@Dw7Fcv+MhXXI0?q_02vmfI0QAz$0x@{tL<9e* zf{Y~}m_UmZ4IGrr9SUUl0RS`3SWF0~EEB;dzdYc;0!~=ahX?y0anKNk2w{UjHPiq= z7670SK?{30(8D;WIB|p+kreQZA%7gyNEboy0{|=pF~Z0m8Ym)%FVc)s1q@Z>fkHPE z+;NZ^6-5$NrYocJG!J}LNq&sVCo`W%uxX_2x*eR z210z(0t$A>0na1B2$Mt%1Qb$83_Fklhyo-qkWeC@Y?A{MHK1TcD&&aMgFFYYPz(z! z5CDrh=IGFe1PDPji555bkU=lBT(U|v4=_{10t{!d$O-1)07NGV0dSKH8Q8OdIS{Nv zfE!sX@PR)c$l}Qp8G!IZixwl46CZIvfCIQ4OtC@{-`LOr7fhr9LAW+moRcj{5hxr` zP{s(9G{OKjS^$y84?h5EQpFKS(18FoBgmjlGiViLgf=oHLk$CM41f(4R~&J~6<2`4 zh9E>V&`1gvsGSf8lUUG+2;LA8IW}NWL4_Y+3?N7pbPz6s3P$kjasYAHA;SnFP~#09 XbTB|i0|*R}ObTVFFo^_-2Lu2+XWb;N 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 3217008628b54f9f8f567415120d36305481cbfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1202 zcmdUs`!m}I0KmUVzKO43GF1(iUDd0R%k6TvV_d68xhh>-n{Kt6x~N^(sXDh+*V)dg zH%GlnCr_!Q5!53H5|1c}NRSXU8j>g?iC36;j_kVsVxJ#AKY#8%;SpB?0^`x}F98Dp zSglqHg<`Q-R#sM4S69tu^U~7N+S=O2#)i>oG#CsflWBQ*d3}9-b91w&r$?jFG&D5y z_4TRMY7U2Ucz8&o(UeMMS6A2k{5+G%+}heYI5=Rl*+)l5R4SFr<&KSw4Gj$mg+j4d z+}_^4v$G=-iR$a?Pfkwgbh<<$kxHfGprfPX`1p8XVWGCRRxX#zWU_&Q0S1FH zH#f)Q@w8g)@bK`|)RaP@Xl!hpoSamtR63n*dwY9ybaY~3g3spz|2NJZfd3^EKlsBF zz{Z*Zf(SSo0iMAIoP`xXD=952uXtWr_2Q3e3YA7@Fl$&ZYuTJv+&W%;=~=w@83^sfeyjCai1u>pMpCcR~ zyKD#|5>Dy2|JwO`cW?jT@aUgouj1AJ)w?p zsGZHa{v-rZZ`akbFc^vOaxdy?T^#m81d#2!`OAu9IKHN+yKP0OfkS$GVY^8!hhyD~ zg&hx6FsLQ{x=4^P()MswOTV3xtQBWb9a8k2mPOg?dVfYw_s=!3sY}coL9J`%nKpH7 zQ?F>R42B|EZ}jy9%^B1Uy1ew>qdk3CN#4!=bUxr<(CGS^7pzvmLmig^qOQ`?kv=o@ zyAZ+Xo_Z35XQlmi{XXkg`?xyRFQ=1@@u?Gj`wRKph4UT-_%s(yfv+IuTL5Y?zAwrj z312L3n$2H)#;KMqmJnQQmP)HkSC`8C3iFn%<+(ZMJu9LvEr0*~mNu1K8Pm6%P!(In znXR~!>snEEx5}6E=-#W@Te*pXKxb;Q)D)ff({x~T_G813la*<^uCwHHl$#SH)8!CT zo$Di16&Csn>q?(psduE6e-r7*s=D`XEQ9jc&8>!!ODT>e7bFt=PR|4b$gk;U^Jnm= zoRF`Yr-k+)7H2`+6zrxIftRsS0P@p=L?VEGGjqfdkm~i6Okn`=NEk_CVhc6<)uxyfez!v8O0T=!ShfNre 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 0e84163775b409c60334ab50433084bbbc37e201..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 697 zcmV;q0!IBuNk%w1VYmPk0M!5hy}iAfnwrDI!^p_U%gf8s($d-4*}uQP!NI}B#l_Xt z)y~e&+}zyY;Nauq~>+9?A@bJye&E(|d>FMe0?Ck35>dMN> z{{H^u<>ki4#@E-^^z`(xv9ay#?W3ckot>SVo16Xp{imm=va+(izP`!H$+)<*`-QC>)00000 z00000A^8LV00000EC2ui0Js1Y000L6Knmqii99H>Rjw3hI-k&}bV{vSuh^`1%k4HL zlS?GSYoTf|<73TkyWjA*d`_?1@A$kvAAvxK5)vLH0uF|Uh>41ejE#f)YaD4*xB0K+}+;a;NjMO5*9ZK=;`X~?CtLF@bU8V^!4`l`0jofG${rD z00RmfNU)&6g9sBUT*$DY!-oa^L^$DLfyIj$Giuz(v7^V2AVZ2ANwTC#j(#+-7(k$< z%a<@?%A85Frp=o;bL!m5v**m#lmP|^9ZIyQ(W6L{DqYI7sne%Wqe?}(!B2+(39@S4 z%C)Q4uVBN99ZR;X*|TWVezjmVfPlAf(BTJr4x$@!(ekKGsz`3*M&!9t#9!C>oFt6t4IG!7GfVgvv{ySDAy zxO3~?&AYen-@tfB^4@LI4W_(954sKllb67{0TI5Ci}_-NToN 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 0c7d9c51ece10dd4c35b66b10c6bcdf93b45e45e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6638 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 A>;M1& diff --git a/ui/2.1/images/db_vmmid.gif b/ui/2.1/images/db_vmmid.gif deleted file mode 100644 index 5fe26b2f462099cebbc6917a16eaefda42f4d393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmV;-05ktbNk%w1VFv(r0J8u9>gwv<-QDo;@a^sG>+9?C^78NR@BIAy?Ck9E@$v5N z?(_5W^z`)g_4WJv`}X$sA^8LV00000EC2ui00#hf000DeFvuC6z3=GFyZ=roj$~<` zXsWJki@k6x&vb3yc&_h!@BhG{aCm7LkI1BQ$!sDS(5Q4utyUM%zRcg?eR!Q-z3Sc9->cD%@R&&^%`gk=!ClBU~WFklY|dk=*BUzdnnQM7TnTP&lJ-f)GcNLb#+@KnNkpQhcNM zf#i|mJH;ZBJoDdEfAjv5?PZofG5ihP{9t$6iY~G>ArNYviP2BJXUOYZHbh?y+Tq3V zfeuIf#W%%{9p;NAO^=r=sAr7cuM(X$@=dcQo_WsPVp*_MS(mH=+p4Y3zGkm?tUDA= zMU!jORqNh%i*`g6o?VZ8Pu}R;_qF;D{Nf{VbKp3j3@RH!;gIA~Qpv_xRZ_*I(kW?1 TTEk_z>ikn)_AJv2yO_=&*!{b< diff --git a/ui/2.1/images/details_downarrow.jpg b/ui/2.1/images/details_downarrow.jpg deleted file mode 100644 index a366b80fa1564186530e77d682352a96a4654122..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmZ?wbhEHb^I?j*>c; bnAfZh^awIhU@kaNa7crt&s-pegTWdAu`M&8 diff --git a/ui/2.1/images/details_uparrow.jpg b/ui/2.1/images/details_uparrow.jpg deleted file mode 100644 index 42365664df88cb0ecc47e832b8d5cecb38f41b30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmZ?wbhEHb;lIy%}CD bhg6<3@|+OpY-POjU0K&rp2NYNgTWdA!7Vg8 diff --git a/ui/2.1/images/disk_icon.gif b/ui/2.1/images/disk_icon.gif deleted file mode 100644 index c642f533efa9ad9fa1b4d2ddb2c6813368e74eff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmV-M0=fN1Nk%w1VF~~c0OkMy|M}Xvxw*8ow9d}XwY9a_*x3L1*+WA^KR-X=;Nh{c zvC+@by}iAvs;bb?(1C%0mz9W`nwsqD-{Rupx3{;{)YRPE+}_>a(a*)u&cxQ%*6r)! zz`?+;udkSvick7tE=bd=ZJ`it*x!)<>j!ju=4Qo{QL2Zjg7jxx`2Ry?(Xj1 z+}!Ny;HIah$H&K`q@%vQzQo1FgMoqH;NaBL)4{>PMn*>M>fq7R(ap}y>+9<5?(E>< z;0Oo^+1J_Y>EGVo-hzRG-QL}ik&%RgchJtzsHUji+}`c%?Ck99j*gChe}BTl!o$PE z(a_Q4FKGesk^+pmz0Rb#Km`acci1FjEaori5-ve^8)*|3K3#NCB?$#p8a7HiCoE_^3kh&bH5Y9< zNo9B-6$L^Q3{qh&4nz)ma|0q|I~F$u0}TWVFmXpJF+fitS6LiRGZb4;0SyBL0RdkX zFKPl26bb?YW&(L$9c(6YR&@#l4>BYpU}sHYMJW#qNLFwe!ek8%H(CNvc{Akz0t5$e U{D_dj$Oi~}Ab7xH2SXqLJ7>-}>Hq)$ diff --git a/ui/2.1/images/diskofftitle_icons.gif b/ui/2.1/images/diskofftitle_icons.gif deleted file mode 100644 index 52734fe87b16d85bdd06c2ccf65731da69c475dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1416 zcmchWX;YF30DxZtl$0s2%4-OZnn2nWb+|V}IrV+Sx0n0@46qIW zcDsFhd)sQYj*X42t*sdhhS}L!JRUzXG9nU*UcGvy)oMpaN2jN!r>3Ufzkjb*tGBkc zj7H-=B7jcHUhlYk$S68`Qu2FB)>-8)a%VaQFESA#J zQdysDV`HPcyPHa-_V@P}6%{F!%9@&*?#}KeaZ`DDIgiJysHmu~uUDy6no&)2bFzP@nc?Y-o(TNpU;=|%5qpa zWo2cJjg3;Nba8&MrKKhHMk=S0)7IW*7&8nE4!nN-8j?tqDkTPk@$&L{&V8=a>TDL9 zc2r9ulT*`DiwcVekr)g{K|ukLNHm+w zw{G1URu8wfwsv%Mbai)e>$p~njeVb8TU*OyGW%uyy}i942x>+~SFNjSwzcBoVh)ER z6bLmV8iUbrn|3>!l}({g`uh4>nwxnIyy=PWEZ?CGVdd}s_74qupYL!ye+t=IE)3dz1NTbmP1_tcg_MGgT&!0b!o5r)UvNHb4 zXcRP-|6QJ#nArN}4UI~hnVRYB?4;bFh+c@!oH^6c*`ZJ>0s{m80ilwTl1Gmo8BNBe z#U$8QtyUz6~~U!DL^b^wO*jTKfxOq4r5xh39H%79_q&~j`63?BB?#To?|1$Wc< z|KJhJVC3z{sJKaK3h1YnVt~-$q`E%r?lkOKY z?hvrnuJi5z$G0o#!n=(FVI{{1bm5Ldn3G%T;yDI@^6Cx0yck?phtkA>;t|68umM(Gy2+BEHrVJo<}4+{ly%6I0@Ssa3KlX9aM&Pk3}~1u))wA-z*Rt z=ivwUCXCXZd@hUP5$+cVIM-c@q!o#SPnZOW^&!20oWHKA>Su&!h#bGc*O5RD3sWf} zP@_ViSQyKN;pT_%qa!hK!3;-?uO9$AlI#K_`XBI!LL7OT0z-OT2TxpdCS0XU05`S? zgkw=I5~TmbU*%p$P(bExZx12p6iTBr@elxm&IX2=GLa`(kK+;h5M~%Juu^=|IkbNT sfk2}{2K-oD<-C`FDYf1WfeMBpk6kg*;ocE)SHa$=!rvN^NCa^7Unp?DF#rGn diff --git a/ui/2.1/images/display_boxbot.gif b/ui/2.1/images/display_boxbot.gif deleted file mode 100644 index 67ef2c78e7ba9b7005a63b51c2b2f3d4ede21535..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5690 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 diff --git a/ui/2.1/images/display_boxtop.gif b/ui/2.1/images/display_boxtop.gif deleted file mode 100644 index 851a9a28dafa846633273f8c28ad8e09e9a8083d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4066 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 diff --git a/ui/2.1/images/display_deleteicon.png b/ui/2.1/images/display_deleteicon.png deleted file mode 100644 index f103dcd7743103c67241afd82d25d8d1b3e515fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^+(697!3HFMCO(@Aq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6?u5NIEGZ*O8WEvzdf^%#o-1{p9eYzopr0DMO@)c^nh 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 a68e51c5df4f7069ea2dbbb17a4d1aa989d36e61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^+(697!3HFMCO(@Aq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6?u5NIEGZ*O8WEvzdf^%NAdxd%@1@YB&p14>p#ySl%OD% zV8|=(r+hOd$%p;4vEc-U3!=*(F4(B0cJj%>1v3O^P3Y*H5y`;F#t^@$l&$lvKs(S( N22WQ%mvv4FO#tLoHj4lN diff --git a/ui/2.1/images/display_editicon.png b/ui/2.1/images/display_editicon.png deleted file mode 100644 index 1bd5c0e9adbd9b625c70537af2aff63456e9084c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^!a&T=!3HGRT)yZ4DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MF%`x978H@CH?sS-=3LKhvmpUhn!~r*!1-0^+_}cKpj=7aVB+ag;r{{aa4|~NqGiLmlKjE~) h&Uq6Xxfm1DSr z1<%~X^wgl##FWaylc_d9MSDD5978H@CH?sS-=3NA4Cj$72c35R*!1-0^=fQ~9Hcs$ z8!R|GTt8^4q|6W(_|Nnx(&3L#$NmY~5ex#e84Gy?K0EOKaqLS}Xy#dvW2SJ8@zMU4 zL(QEHjtT{g9oq#3w@I`m8fP#wPi*LnVpEiU=DO0+;BZ9a4>c3c3Aq9s8ysSna39fb zjF@}lz_Iih8dH3?0p<5GeUwtDJMW;#Ai1q);>3-O5=S{XIe9)mKc9afT|(o!xj_IU c1B(R1^Q%#lF19M21^R=*)78&qol`;+0NYw*D*ylh diff --git a/ui/2.1/images/display_headerbg.gif b/ui/2.1/images/display_headerbg.gif deleted file mode 100644 index 53a5b9b52deaf1b7d4cabe9db93e0214cfb6dfbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmZ?wbhEHb2&!7ML_3Qih@3(H!Gi}kZrorX1QdU=fR*TgNRXWjtlkQ$ zeJPpqG?uK>ez;Fx>AZ2m{qGCk|9%*JNc2BL? ff4{ZDrfA`rKrE1V0&+(5hymx)AM4G=&?DMSusU7V_*;n4-eU(mt`j$w>9P({K}91Fx} zfmjw<5eU0tG37P7A{fRniDcj51ONd>bbyi)-^ic~h<^gHBB_QUyQ~d}BY;>Kh?#-- zJ`hU+u^_U# n22Ht-DDfsP@RwL`QZ+UK%TWqI8jd$G00000NkvXXu0mjf4BB_T 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 839bfb185a7b48194f1a73151f0650041cc728e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmV-b0jmCqP)qJpMnGH*#Ht|8 zKr9KwoQtuKLYV9AbtkKkAV0&KEw6`@mr|N*noH`)BtP%WQiTrqMg_b1Az-r nOcr1vLQOpmZyq8$dk_NvbB(%?@t_6=00000NkvXXu0mjfL7;hM diff --git a/ui/2.1/images/displaygrid_loader.gif b/ui/2.1/images/displaygrid_loader.gif deleted file mode 100644 index 1dfa2aac1c22695fa31445d8668887e9774c590b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1849 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 bqZXLz)CUe!A39d)bH6V1dcB4U71;cLti#!D diff --git a/ui/2.1/images/domain_dbinstance.gif b/ui/2.1/images/domain_dbinstance.gif deleted file mode 100644 index 67da02cda81e2c6b9978572921b8471d0e52d9bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3526 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 diff --git a/ui/2.1/images/domain_serachboxleft.gif b/ui/2.1/images/domain_serachboxleft.gif deleted file mode 100644 index 44214b8c1f9466f257b99c736415283667366620..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2274 zcmV<82p#uFNk%w1VGsaT0>l6S|NsB~{{H*>`}6bj{QUg(_V)e#{rLF!_4W1n`T6?# z`tkAc_xJbm^78cb^ziWT;o;%$@9*yJ?&9L&?d|RC?Cjv+;Opz_000000000000000 z000000000000000A^8LV00000EC2ui01yCH0ssa7AS7CoXj-ONQPI*22*Mo6K_|&2 zJ+9-(44k5tsO(<9!cB-{JsLh`O(76a6|C04Q3xKaiXk@AXv7#n1)&PwEnrHTy1Ev) z&D}$o&6c>}HdJ*21OyRJfC+SKj9NcIiUbCelLQYBQ8sjw0S28snUMqmos>^Wa+Co8 zoTms%YO0+80Xh~ky=d?9 ziG#QWUO0c`))9I*Pva8^57DXEw!FkwHC-F5?lEh!uv#k`#eKb;?E0MTV&2buBwq zrrD`2pWY0raFkNHaCb#SX_9Rff{C(@qjZ03~~>hEG_ig$j6 zJk8-*;bQPf*cw%09X4Kw&GGb}L^TPO*>wd9I8c12A!eI_&;_ZW zSu4)7-hiu-2cjA?3WptWXb3dlX7PO$+H^+Z=pTCon#dxP5Avv>d+llIqLLzN*&`Ze z(gzW){(+)`6yyuDwTw~VJgz3m1@$3B31*lD_nHc$=5HwhwfG}nC)Hc zqp8PASK_rQW}D~16c(xLu#{D(XI!j_?CxX{#ak+*D#NTTnNG$CRPf$z>u-p_g;!E#sFpa|VSoX+PA>(r4_Uw%LS3p^X&=*tLo- zQxA&7%U|ZnF{70JgL%^&BMnfonkzF*@Kq91@T)5}I zM2*lzJjn|G2TDBJPIl^%f#(dg#KUo77H3ODukh8$X{d5k#}gp?0{x5do&@0dWMN zg&WKGyfnoBf)>Bys1NdZJHKTE0dm*~B_@Fg==Ex&2H3#>I7Em-NTLwbGa{NK7(h-| z5rr-r+LQ*x$6HE|nzgInG;_y=es&_C&Wt1&hxxM=3MGCCq@6CKxV}~N@}j*f#VnE( zL}S+QW{4DwQp7kHbml~J_dCk7v^GHhxayrf^(3oGm(0igl&xTy-7oM77&1`f3y53Tl>=TAeb!vt-oUz1kWw*@ z;rk&ZLAyz&ijs>8_HMfEfVB z4i`B8$5{iOf~Gv-T5>0seJJ~6>9K$&gj}*ZD^G|?RTWCjfM+4&G|K5T!7(*FRAR;N zGFh*zook0IMBXfGn^Un}wXOaOZ{-I3Np7a;m4&M1fs^svG7feR>l@s8@A}!kvQ4O; zTIcha=wW~;OOp-m?im#)xcTA}q=PHk8bA6}PncD83IB2CDMXPo<8UR1c6s0&I#71m- z;{khbXNElJIv2X&@`6~!?qi9C5d>HJ${4YU(}gZtnn&r)Pj@8Er{B(ti!aw05zXaa zhN5Nal^WF4rjl?(cwXAO-uWRbf+z$XTJR3$U77$#*aAu~s^&iMzzi?sgB{2avnvQh w0TQ5f45T0sD_DUAS586!aG;1V;6eg!$ONnRkbns|TLjLIb_t$6fe-)yJE!1P{{R30 diff --git a/ui/2.1/images/domain_serachboxmid.gif b/ui/2.1/images/domain_serachboxmid.gif deleted file mode 100644 index 9ebac9785c0d506d69aad9f107d0d122c88f410c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 zcmV_{rvp=`}_O)`uh3#`QhQ=;^N}?`1s)9 z-~a#s000000000000000A^8LV00000EC2ui00;n90ssX65TQelIwmKR`sP_!WMg5T zCP5e`%N8n;#>5cYG(GHm&HpulP`DEWj6>n^Xbd=ofaWj&SOTt9Diy1(UbS1ScuX#v z&*-#z&2GEj@VI#AM2s#Me(vpuy0_*}2rUvZKGJNB{#!N&`&s0zvHpJ8sC!S(dE(r&mU@$O0#9 z*Q;^invH{k1mPZZ{!(c(2!;!kC$lE5ikPV4KYjeEDEh0S#M`w<+j4FD#j;yKbyBDi zLC3@%4|_HE?W?$r;Ws;;l-=qk(4ih_8%Iux*3TlwbATXl6S{QUg={r&s<`}z6#`uh6*{{H{}|KsE1`1ttZ;^O4w z+9?F_4W4l_Ve@e=jZ3~@$u;B=EYqw?d|RC?Cj>|=IZL| z?(XgY0000000000A^8LV00000EC2ui01W_E0ssa7ASEVR))YpX4(w7*n?yY4uV)(MK~rHfqGnSK-2&MTWMAZ z;&L%Pm;m_Wb2kS80e*Q&EeC&qa|?rocyd$-iUp8zd0PnumY0%S2PlLAaFUdq29c(e z2AqUK=XVj= zYE^5x21>DZ(a*R60k@*`)-YTgKuF-8W2fz+T&a3tWkgYn-V}-bAgY|X*QZ)ZbBAJ! zqmwaJbT`E@^z12Y!Dnkl4O6T$SU+A;SULRrNrBVIc@S9qx`yc{OGn4Zez{PS3Ys-f zd89~&?N}^c*F<&ZQ9it+GoU{vsRv8{X3L#b5iKO;Clqdr)zytl(q(lZf|doxmupx( zmT z*2ku5<}wXEo*wtCgIlkyfMsNt!u{7n+h;CMF8-g5nw1R!8ZE+xa|C*0;Dl&I%Lv&~VT3<_z(1;1%kDoWmoDT(48ZP(4QGN)WyK022*VH0k~*^};m zLa!SK#c~R7zU+y-V#H@@h)va9 z8G6n3Wlo+|_AVM9_0(OyH2cgNHZv%C(e??9Eu+G3{BpkIu|z&%nBF1Wp%!C}$2wLi zRaAa+nJG|$5Z&|MAQbW}IfN^0H5nSD!oxr_p#x{jD$)T>CXz#yCsBa1iNKsBh`K$F zRJN$rJSu~;QL$_+h;j-~0yQJ){4X>@qBkyBG(& z;Bjv-Ol%JVzt=zit$i;-vofE{c6L9MX+aVc>>eAE*1udeaUJn!Vq!2CySUx4KKauh zBN*tc3z6|5u*1bm8ucU9WiDRWdSBQ4QWgHaMjxjzAqnY3AQl<%MFZTAFWy$hhA9Up zc6_*vl=j z40u!s=8D>($Hj%qYwrwY)0`$9C#{qy9;7BE+jqg1MTMS6gGFaFQw$z)3M^ZbpmCZ+ z(ew~7cu(2qH+ff|u&{H6-Ww-StVq^+^aZ5zk(rZhN)cvY=WH1PkS;;NzBwr;r53d4 zI!tB*6D{(5q>5MUvcm#^i0gUV+v6Om$jCGLPY>n+D;ZxmL4)p3k)`sA6gQ`!hqjB7 z!XYC|`RPPs5*9U^G>TdtlRmptYmxRu=))4!7{bV{fb~P=X2;{0L|}7pUD!m>w5AEO zJkPoRp7>upueSt6oP&AjjAu*csoTmd43@mT;wbqFrpeMPtRZ?*Hy7x-=H3>P;!~S3 zKX|~hTI8{Bv?V#$R~i|1u^o<>$3|nrPM}d%Jiy5zVRu--Eb?Yf4vP{$V@kv0{^eX& z@-2hnqE$@oONBrTT|!GcK1@c@zQMF=sFs&1RVihE1012L;6^33<`af96GYpH>YN7? za;c$%D|9FqxBo^aE5PB(Nnb{(1b4!C=xgQ^wc#$eQ{!}myG2K!LJ_Xa>Tg&12_cN=P?$yeN}O%F(@v-R)>CN8Ht&*@lzPgE(k8PE z@w)}vTt<7k$<8OX;0U!*HJ#UfQ4QtEB7({zRItJm)p-;IMe=ZY22SmUE5}1Js5^#YFBme?npg{^k G0028K60?^8 diff --git a/ui/2.1/images/domaintitle_icons.gif b/ui/2.1/images/domaintitle_icons.gif deleted file mode 100644 index 55473065b26be6df34f5c73476b3f692748bc189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmV;U1zh?^Nk%w1VIlw?0QUd@|NsC0{{Q~|{?XCV{{H{||Ns2_{OYtt|M%$X>gn>b z82Im^!C6? z=;-Lq&d%Q6-oSwX?Bmnr<>mPJ`1It)`Mg2wwLapkI`s7P_V)Ju{{H^|{P)9C{r&#p zsyg}X-qMc@@V!v|!%WMcMb?=cy?qMs@bKZPH~aD2)YR72(8b)yrTpy8?zc+r?(Wpo z)YH?{9OB~Q*4Nqj_3r-t{p;)N z=GeUX!&S@6%h%V}+}zymxlXru17Tui`^sfoU0-8mXyD-B{`lzr{rms^{{R2}|M%w7 z)Yf8SX7}jG)1NEZv257b+`D!F@4H3$ygJ{eH~YQjOzE7VUlm7em8>yR^yB#Q=*^K2{PpScw=>I<7=eR^goTUO!HV0a zEZw0i+@devq%Y&*;oPb?`QEGIyK(QnQ1;An=&&~O*r)s7qd`GNpqbT5|Eaast^61<4>B47cZ1CgB^W((FkRk8m#_7Rq|Iusz({AgwNZP@S&yES) z!;a(3nD4njA^8LV00000EC2ui03rY$000R8009UbNU)&6g9sBUT*$DY!-o(fN-P+l zVt`BrFf0PY1pxvsV00Bo@ui}`002-XRH=epCoGhT%$ZXpMl@u~1f)D^a-jeg0K!p- zvSI~MTxqI-N@;PYQ;Gt;5GatVgew?WvHmOJVjxP3Dh>7&cyH5zvuE`MVbqnW*QW$k znl#jI*)j_jl1Xx7>d(%vO%KWySj*0Z3rG&D$wnp-)31L8TO5I3xW4?5xq zb4VWGtdkEGI|x94EOPXb4l4zyuz*_z-4IA98<3;GD+_3%03RCwg2oLyOhdv3Bv23! z0HxtK&=_~rQAHI&*a8Y3oJ{Zy4~>km4J?B2z{4-G0MLb$1JSd}J0|R*1SY|>qC_Pv zn4rxFyri;>2{vG3&VB`WD9}8Y%)m?wFGS)=8T{Bl$T*_dbIT|0AaP1LL;#Qi0c-+b z1RE0cLW4I@905%nH25KbI!AzjAcGaXSRq3b1l(w7cwM{!f({MO@dL06TjgAmRW3 diff --git a/ui/2.1/images/domdetailsbox_left.gif b/ui/2.1/images/domdetailsbox_left.gif deleted file mode 100644 index 569e198e9ca362f28f4d12e00dd421aceb4b3109..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3482 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 diff --git a/ui/2.1/images/eventstitle_icons.gif b/ui/2.1/images/eventstitle_icons.gif deleted file mode 100644 index 0a91b5200dc8e7816363649f049666ebdd32a9ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1546 zcmWlY`BM`I0EKsxO|k?MQ;q}_Fd(*QBPP^o@u=kxOFOg^>(SO;SRJRGu~pR0SaqgR z8IQ_Tq=&6nqXr7tqEZpCh?_t|IHUn`kOh(~xia!pN5>GgV_&u2E9JsuB=qFSxi(Eh;b zbUGXkx7%&8SX2$SMn^~I=jYL;J1rzoN~da3^l>8O^!vuf$Lvbw;NYN6r&Fud{b|Wp zLEssWGeApFsZ^m*Xl7<65{X3p{)L5w$;rvSzP_Q!>6qW&N+$O7^hCq6!C-J&bW74J z2?PRuzkfa+pPijmC=?ExEgTNVqR~b&K|VgRnD&lG?df!z-99`#tkGyXv(kDqm&T&8 zg;-pvR8CAxIMB(!+??O*oxx_jUhiEZfLn2mUT=5Wqkf;+Xtp~Xi!dUgkW?ydra%UR z!HQeY-TiBNdb%S!&FOZV#YiIsLK_;Kc83kO$z(EFdC1K@LqB{oDX5hYPWksVaXf%lK zMCYUC=0EV()~`!Seq6?^-nj!|(c~i|R*SXvQK!jh(qTHg&DL@J_!D;ejTdt-zrq{i-rwPpk|91 zK@i!X>==cN{rXcpzR;P)GMh{~t=42VDQ{fUU8_eY(f?8y9T`gk;fP^Tsjg0iQsHtq zJi+jTWNHVCZftJ;dkI-CmwW9t-~7CPegV^A!EmT6o0$`Vfal>nujiit;5Y!nnHBei z;xll{>W|O!1!bq!5FkJZ33@L+A;49~4sAQX5%zZbxZCt)HEG{HcC z>ZL!|Z6jZ8L8v90hS+O%-~5a@JWZpNE<^GHX-W>{=dih^(xM%5 z0Tn(vhOE2Z4bn47Npb`{gj>tOME;k28j12j{Nm?R<4?>i5b}5Kw@&z!Z>6Rq>%`Yr(^XXS*M-mA$o>7Db3G1Z50CHNIY3b&P zS?6RMzwd`1Fw1=lMk zMTWT$G1GMSUQ}HvcIAmkm-=0rF;}9)Z%*?*ovv?XCb` z&EN~5B+>oSEeQh{k(iuR1wc!<)u$LaHS8M3rdpwZN@ME*I{l>@F|~*Tdb diff --git a/ui/2.1/images/featured_nonselectedicon.gif b/ui/2.1/images/featured_nonselectedicon.gif deleted file mode 100644 index 1a2b4be36d4fe32c0a0b6413bfa41181579472b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 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 OMhUEv(E$hq1OPjl6_6$X diff --git a/ui/2.1/images/green_statusbar.gif b/ui/2.1/images/green_statusbar.gif deleted file mode 100644 index 8c771f47d9da231acc88f5b286527dd063a30066..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 536 zcmd6k*)p2}07g$D#J=xaQB}3m+KZwnBDRiwnfL`2Ya)_1eu+pVC`K1c2W^MeUY^Q3 zxKp0OH)qcEnfYpJs|yNMQi`~N=3yGun15qE;{6zH;|y6*4r2O&VgQAT@fDnxEMM|r z3CkgqYdFs7n51=-m4Ec;={3;*3EMG!MkYR^GGRYv%!y#8WfbdQmd-HkF(9J0uzE$4 z8pAf-I##b4vEjU+RfBPtPAy&k(V^XBc#+vHmM@t9g>eT#ME3>pC*lFZJlYNP-aGcROg<*@iJ?8ci_nF?ne!`%c1_Avy+9%L$@^}`1D|?7ZyZ8Mk z$n_RaPY(}exm+$ul1Nx5DCkL=Oy=s^6c|{YnUS0o5)v935fK&^744gw$Vh+x`q$0br3H;8H81m?r&qeWze}jCD=d=cN~L~&E-qzp;o;HIii-HE TfPmCj-rhbw!ND({El_+1azSLy diff --git a/ui/2.1/images/grey_statusbar.gif b/ui/2.1/images/grey_statusbar.gif deleted file mode 100644 index 6b76f1e9102a13ad5c1e18a85971de35b44f72cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmZ?wbhEHbWMZ&lxXQrb>FHTfQQ_+9>f+*3Sy>qy8(UmlTv}RMRaKRckPs3QQc_Y9 zA0O}J>M2(ot>Q>78aJ7nd$HE9~>NVQa)pBUJZ4+J?|Xz;Ok9DMrd zqmNpHhJwhfop$qm+?FymCJ3F(TB@-)U@l*K@X8rJo0@End0Y|J6=N}yx|*Y;BqpY* sDJZC}E+r)`Eg@mT$ETtqBEmL>UtCFMF&;VCI8?(Xh|g@rCIE+HWy(b3Tn5fMQ_L1AHGfq{Vm z0RapQ42nNlfFuKh4u}BR$-o+$pq3UWX{fPy?X4$%F=tpy8t&d$mLL26`@99u)pe>^ zJPxK-Dq3((%~*P|z=R=!A%$D>otZ^X&*4iwM*Uw7A28#&$J{kXX{EQ&kCvqM4nG9N S8pYUK*ty%eS-V&j8LR<1*-VfC diff --git a/ui/2.1/images/grid_headerbg.gif b/ui/2.1/images/grid_headerbg.gif deleted file mode 100644 index 67319cf656de0483ab80ed3ff2a2082b84168508..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmZ?wbhEHbi$V*v_1H MAklAqI|G9?03Dz`AOHXW diff --git a/ui/2.1/images/grid_loader.gif b/ui/2.1/images/grid_loader.gif deleted file mode 100644 index d42f72c723644bbf8cf8d6e1b7ff0bea7ddd305a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1849 zcma*odr%wI9tZGc_iT2vk7P+x3@LU(2yGIQCcHvgYTblq0THkTesI znR7n#{hi;OjP2?A&1ME-pkE;9;lqaz1T8KudOV)_`T6wp^p=(uf2Fv%SSFK=kB@u3 zUZGGpJUk2l(CKv5)z$vpzrP~?FHUK&nD<(COPZ{Et0m?db93z;^X^U7=d1QWkq-bw z_z#PGNam*Pcq+w^mln54i-h<~s=yrqB!o6eBrwd4{B{&hHR9I{{bQLC?)mG!al!d3 z<_YADRELlGj+H!fNocrRe7`?$gk5?^y3^@6pC85jwesu>G6*{Wrto)mL5D?z)j-L++&!SNH!MDuhyZ1*)jGIdEgHH>qdP6}DTp>kJ!bZd!oke!Q0J5vRHHSl&=?=ft+HzcfBB?ZKg#rgtngf(C zDL)0I;%QR6Z_49x&crpS#vVCUpEoP)gxevZsOEytw5Vq|*bf39%i#K5VVMGzL^=13 zR-}G|UaU(m68*HWc{(R=BrQG$CK$N`HcDv@S=IAWm(o~Np>ZF8X|_V%3_!1*u`vm}?t+-#K2Qs= zlXouK&f(YJG|lD7kLqye?NcYji#s*HOSm|xQ~{R)Ao3VZxwQ7l4$VQO;kkhWM?7Tq zV7I5-(5BO!(yinIf+@AjEfNKCk>b~u*83@)>qu(a3nA*y_1a7za7?y8mYaN9Z=br4iilUPLeBE8>z7SjUY!R@qdmA$~nkLiZ z9qy{OsKf4~y1^q+D*!YY&=vr^tMUUJQrx*Do>dYDlPO!l`DoZR5vApf95=i4Lz;yXc(}m~6Zh#oS@fHF;-MHT+t;8_YoNLuk zSUE;16g_GThjJ{n2e=qnXWb70jIOhk#;lMy!K4=hr0tBKfB(rz4e z+1U)aJZHl#TYU{%(($JI!F!<+%Jp+Jdk!#Y(|CzO!nka;h@9x_wBI_{i{tgbHY(SI zVOYV2N)E%tOc-CGkW(0fy>Or+s~>c2t0?1P8+jRZNqDzxRf7dRy(%%W_#a<6{e3caEW8DdD|KsdZBw z(K6nRmw&K{D1uvtp&1a;%;nPiAvOlI0*Zq9*kdsS7JEd^O*1FLwTe{>9&A}oMlrlF z`pQPbaQ2zQZ_j_#qk8qy|9IetJFQG!>l{9_AvsafGtVRnQr)xR?bImN4qo-#?gP`}S)0UYaWY9t`6HQwY4B_($TWNu`l?!*nIBy_|7=pQc9cnFU zs%%oO^oje|8ddh7^1-E9_|T~KBxydL{KcW06CqFQ?Ym3~cb^|wPx?lUyCBD|_nRZU zsA}@ctKd0_^(q#G?{G;+$w=8-md|N>W6e5@3AT19SLRCCSyG z=oV%uMus5!Ry9PhrZMnpmb0lXJuACSOl2|krLXzwsrVsNe(8N);u`z?E#W-RKNi9E z;z;dGgCSKfqEhya^?xWt|DBmvWexQ%SfTtu(C0Mdv9@(g3WttPh3GsE1Niv~Ituk; zXltbvX7Jn^Z4>QMtd0~JELrW+CaT^$N~khm@~tceYLLGjk=3uK@XnOQ1!btG^Pus9 zYDnDM@%;wTR-(h+ec@l>g6c`Cs7=j$FkqTfajDLuzmAAh_qHK0!$~G+eL?P46^V2( gTVr?dnQ{(H{Ie1a9NS3OKPMyDfF?Qc5iPGj047fkWdHyG diff --git a/ui/2.1/images/grid_morebutton.gif b/ui/2.1/images/grid_morebutton.gif deleted file mode 100644 index c4e62a8524c49357737f933d65c31bacb0696da4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1427 zcmWlY|5H;10KlJ#0;RYUOfoV=Ed@iqgd!|O`A&mv47R~Gw)bV*+xFhxd)wRF+qcKQ zz`iiS33kFsiu48I%4ROpJFg%tGf6$`F7G<-fb&eVvdqlNBKzg@2Yl}HsjaUm-368b znZO?aKoCShK>-9oi;IgIjYgqGE$&WX^jKx*Kr`ut{ZW=>K@emZMyu6g7-qFvK^OsH zSVA~Z6jdU6gTc^lB&AX*f*>N=YjtsItxlykn$6}0X9R{}8OgSpD3i%FG&IzX;!U*A z#xMdlg!pgwc1Qpot#Fd}9GN{kX)IS_<25UfFs8V%TiXc>odc6OGc zs8-x&Wu3U&`>Hci?K#kDBxSg@zP?^;X2p>sI-RbC=47;|xwDs|ZK9sn8`+>51eLVA zgYigdPD@yI-iQ*>ReEBr_CT}6jpMjlZ$y02b|axMm{lrOLqmg<@v2}%hkdU{B{#HHa12&JqquB8E&&VUHZKMxjuswfYve zOM_E#XLn_1e_>&vj&_J#5w+eR>pryC9a9-_Ii!^Y2AX{_Gvg5AjM7LnxuX)&QR{z= zwzC>fP{;%@+D^DQfj|KJqC!WgjkL?y0BFP&B-6?UNSnQZ4cY8=A=if!ge=gn(3{#Z z3Um8Gtxk$rCE+0v<8LuDG85GrIxOkjuO#hz_Uuu?IBr-dOd=ZgynGqVE_O&{F(Ha0I=+>F7xlcS$SGmD=d7wuhha!sRo1ya#pvodSC z;n0E@-{(JE0Dn1LKk&k6>YMvM{NYC0=b8PR!LGa|KOHW@DlTu3f0=ma>oL*sn|t+X z1CiAH)AQp~6+k>CH~(Da!4tCNCFs`^s!ONe`!2CMG4pW5*H}!gPO2L}Ree2Flvcw6 z6=&k})8X{I9gnrZ(HdKDSvLK_vYkNtI)}zPotSdS+OJ4HGuwB z*VN9%#n~f#_IBBL-syPm>fIX;#Wvl${P)>^?p-@JaAmuv;;-M|$ZAeq>&v*8?3tMz z)36V^cOJF=wK5ijR-MU?7K3DE(wZld=H^4$X*_RuQ{O`{vc4x}A+j_U&k4UY$gAZ& zF%DcQdG2Et>fukIqX#O2w?_NcpB|Yi&B+X9B`0`>g@N3@3mc=mn{MCO`0d5GaM$=R z^B13K3U0kQxE;FMyVfq(tSA|H==ZHhKHvIc_{7NZNcyAwUO|R%6IHd=y1Y!cgTC%d zF2Bac>x*38!jz26H~rC(Lmc`QFRA5Z(<>L;r>4{XdAa{m&hT(f{qw|I6UK@A@|-W$ z{TU}ecxpTEn~9_i??tDArK3ord~K7D5Mm5QsAi5ItA z3#{Ay%|b9^YsKi~M{~ivpU>RrJ5v4RzhC?s*?8|(|Hagm+p_PT+jSi}@XWL0@Z`sj Z9^AS636OklYWZB^;L@z$@_9U<{6Ak|Wo!Td 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 17bbec34f84a22f295e492fd0567ff43d3d15f4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1427 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 Mu_aO|19?dK2O54n+W-In diff --git a/ui/2.1/images/gridsorting_downarrow.gif b/ui/2.1/images/gridsorting_downarrow.gif deleted file mode 100644 index f8d5b09f97de63780ccc4036263f62810be467cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51 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 diff --git a/ui/2.1/images/header_bg.gif b/ui/2.1/images/header_bg.gif deleted file mode 100644 index 170b9f0bdf539976e1023da234b2beb7ae0dd886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 519 zcmZ?wbhEHb`OUo{*3b92^`F5D*?7URYR|mzNh9 z7?_=%osp3d5fPD^nwpf96cZB@8X6iD6y)#k&p%=}m=1^p`H6w;ze8t%hYla_ zi6uoRQ_SXFSW#kiH)8#bHD#yQR_uT9A>2`K_W2Bx^s{-p?|;~l;J5zv`|llf=ik4# zZD?$2ZfR{}?C9+3?&%TfpD=OK1o^4crq7r;Yqr?jdGi;{V_3Xo>9Xa^6<4iZvv%G3 z4cwbHZ`rzSo50RpyZ7u;+JE5Sp~FXxvK&8g^3>_m;^)p^xOnLj`_*gLZ`{1edgt!F z`wt%QJ$~}^+4JYhuU@}-`|kY*o==~@eEs%~`RA|SfBydEWMJl!@tB~{(aa&N6?0<4 z!nSq+Wv@9N86C5*G~?3mbcykEh&OU854ljg}9!K-3+3N@deZjgLxj_2lR|{{-x_c@#TY$kD0JLJ( AV*mgE diff --git a/ui/2.1/images/help_actionicon.png b/ui/2.1/images/help_actionicon.png deleted file mode 100644 index 77f87eff354eb1a6a1063e57c9b9bcb89ab0d55d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 809 zcmV+^1J?YBP)7s`w*c`ZfB<5EDTUee>C?ym z$YSWWzJ2}r4I{DuKmeiWe){xj8O*&Xy7~BcAOHCAql=A=wG8eU7~|8Y&$67H9RI(6 z{{c4|#a^JqJ7hkisi~9voJHW zK7IC_QAtS&LmdkP764KVqPe&@AG5Ns$}r#nOgJT&n2!JW@$<>YPoEfZsln=OVgV># zLAJAjf*ObgfLIX9<^p0?P&xqOA3*#C6yl(m1mcfC{0$(0Fl@ee?;e=u;NU0&MH+~W zEwE4$4+uYb@}%s?_iz6{e)#YfM8AIh>NvU@tVx-fnaSb(hY#D|ynQSD`puhic6N3P zto}q7`1b9)7dZ4785KD>I6FUo{(OR$myfu3h4_*E-nZ}HumAr2+ma|7Vc^%V-|znZ z{i{WCVgPCq!WWlhCj?L;5ChWEKr9cXC4pENhdzFf80_CjZI9>%T2yNaprV)kM6+$dNGR&nT z-Ib<^1gUaU*Ucr%mP+Z((}yM}&iNdo0iw+ywf`Ato?l1r^2XFrrK(mky&LMv08{~p z_Q-sndw?V5{alvi)QLr|pp3BtaGGnaK}2fs6?I)70N@rPB_H$t0t&rDrY0npuNICj zYY#pZ5s-6-q&IsW(jDu3?~#*Z)Hu*^xRE|9(y%>i3KP&sKz7D2BVtT@ME4N^+d`QA n;~fA56cCd38;zCL7|>-Nme*ismy<%X00000NkvXXu0mjfhK_E0 diff --git a/ui/2.1/images/hostdetails_headerbg.jpg b/ui/2.1/images/hostdetails_headerbg.jpg deleted file mode 100644 index 826cebae9f3b1f9c328677854dcafb80f1d6805b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmex=C5UDGKfoZ!!644S!^|kiz$D1XEXer(2tz6Z z0~0gQkw}1%nU#x?5lH~d6aadeiJhGlE-uJu$iSu;$iy7ND*C~(P>4lLJh4%@L{$(& z>;GFIOM!MW3o_UyKa?=fc$k=&mX?-aU|_GWuTW4>^YZPBi;ME{>O@3D zE-o%sR#r$zNV2P{DJm%;At6jmOfoVuF)%Uz`{lH>w9n7ak&%(3qoat3h`PGEg@uKN zhK5{RT+PkRK0ZFw)6|}xp3u+G^oSdA_&d$5LyU57Mb*HlL?&$68 z<&u$-qNAhT-Q7AlI*^c%c6N5j$jK}#EY8i%y1BZ@$HiR~E5N_NySlo{&du)U->|Q*tgNil z(9X8ExzyCuwY0T+xWu8Mp?svQ!^6YJ$H(pL?W(J+dU<*`H#Tr^aM#Vs)YH?Fl9JQU z%qJ%(eSUp7I5?oa!lI(0v$V6Zv9YtWvshSI|N7)rRaK0PjQ{)OA^8LV00000EC2ui z02lxc000O7fH_wgeuaiD2Y)muDu#wEcNkj`eU+9SA~JtL6#|x(m`xfr7cMRVd#M2s zIDb?Xd#4?$7g9YI09r5?eFDB76D1KGAwnX(zeGM@0L={!A`lQ8C?zo*%^?OJ(i?6C z3?W8FAafjT4je6fGi`HPTJHu9BozfIS_bnD4hAE0bpGssLBc>Ce*Qr0!BWJ`00K<> zC`d5?h!{RrQVXI?38Uym z3^+3{SgbhlLJkxRB}?*=a6@m(5_$RhEr}-23KVQ?=y_nm1ewMr4*W=r=gAi}B?18e EI}0XQGynhq diff --git a/ui/2.1/images/hosttitle_icons.gif b/ui/2.1/images/hosttitle_icons.gif deleted file mode 100644 index bffcfafa3d0aeee6fdc071742cbc53ec2f7dc186..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1641 zcmV-v2A26pNk%w1VIlw?0QUd@|NsC0{{I7dyrZL~sj05n+1i$?w;YVby1v2yn$w=1 zqUGo5aihFVle%@R#p~na`SI`U?Cjj#-3qwpuCTJf#mUFW%FWKs=H})ArP}iH^2W!< zyu!v!smk5p;^W)f@bL2R@bKH!)1h*lO(dq5(t*)>DpVrI9#>2$Mg=MVsNmw|wYR#%!^Pm? z;?mR7P_xng{{EGho6^+Q`1tszsjUD1{(7^_+1}#U*x4D9$>`|l%FE6B`}@er%cZos z0FTNUo6feiw-=(*8Liub#@zPy_OZ3O=jiD1>FD$G^sL3r(a_QA>gt`EoBH+iu(Gzx z%ggli^t!se?Cb2*+TZ;A{n*~##naofwYIywzr?@4{q^$G*4pju?bOuN)YjMH;^MHe zwa?MhmYJQ>x9DE%*)NPv$c()t=Ze$^6~Qi|NsB~{@2~$ zy0o_9YA6E?CtID z@bI;_xwf{r(#pyD^YY-};IXo_$;!&z+T8B$?eX&SQhJIIxVO38+1dB``2GL=?eFgL^6`Gg+VS!6^6~Hf|NgPDv;6=5E{nghtE~X9;j5>o zsJ+M;d$q8~(4Mlszs=VGmCs3uw1BFFJ{-|On>gT&fRoWa%5(bd)1*3{J2)z+}d)3nXh zu&%STwYgKT(6+R>(9F!x&(El>vbVUp$JgQF;o@wZw%5?m-`Lj3%+U7q^c{%5$k5Zv z($=D=uk-ZvA^8LV00000EC2ui03rY$000R8009UbNU)&6g9rmCB&e`q0D%h|LX5a@ zU_}5AF*?*Z@!>{}77>aRDJY{wK>)Onc@zOgOENIXyp##ErOOBrtcWDTLqU-~V{Wk6 zV1diIKN4QN@UbJ#A19&iL<$86p$Qs72FOuk!2}Z)1$V~NY^!DmjOS~{+S-w2tW)0;02KXfRbUt1X~$0)JV{)7ZgYENsx#U=%T<_s(9IB zz`(%~88T=?j4M?XNX{Mz{&Iu^4lsa*8QTqXhCE)}LdY8M;G@VrA3T5z9uPo~2^(x= zA%YFX2y?{(2L1;T`_S% z0XXJBNm;J|;v-u{yyHQH0Ib4~R4d5h!U-nu0oG-DuyP6rt)w+a1w0U-0yV)+L&^Y) z5RwcgB4DBjJ{=-siYa)2_`p3jEK&<33j|_N5N4p^3n-#AV2v{!NCU*C?v&uEA%-|p zjx`N5K+iz|FatmxqvS%%GY2UDp-eF1P(ej0Q%n&>6iW1Zz&`ubflwfaJVA#JkRXuH zG8|NpPe0d`K@AerdT>nz2&mwX3LtP9ND}N!0?sxrT;Rh6Ty(-sIG(@)NHx{yGtLhi zpfVbfCJAIj5-{q3mjwmD!9q4T>M`YDR<0GKC53QlL<`;=i`NN5%#jV0hv=ah2yFV; z!yN>qApw^FI8j7aTan2GB0gLOLnUTuA%tK^nts0@Mv^s1Zsi zJ>0NC5A*av!wP9=5#d7EJQ5BLn*5Q@4;O?H1}8*0;p7h{NKg+JU0@SLz63Qvga&S0 zEkOb4aM3j<7sT^MA`-+#fdLsIh=ENLA~k`H7@@fypeF#^poJCKm=Q!l0RaFzWfGRg diff --git a/ui/2.1/images/hvm_nonselectedicon.gif b/ui/2.1/images/hvm_nonselectedicon.gif deleted file mode 100644 index d061ac4c69e90f605426a76cb833b6331c37b81c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 839 zcmZ?wbhEHbG+_{Acoxg>|NsAs7cahh_wMD(m#<&H{`c?S-@kvqeEIV0*RKyBKK%au z`^S$T-@bkO^yyPnRMa*G-j7wY9mqIX^%D%$YM)RaMWQKY#Y@SyNNf zyGM_gELn2l!iDqa&p&+l@WhD|r%#{WB_MO}-o2A2PgYh|UcGwt&Ye5A+j`EOJ9os$ z=KlTrFJ8P@v}n<@Z97i~Mm^rV?a6_|KY#xGaQfV>Teo_9duPv{efaRU21CTl`B{J`}^-MSTbwYtgkO$?b)+u7})`o>=P)n}u}MhIU9xo9R7nXTqvdPYO*0Y_WMkdBZTpU$yLK7}Y%|`?CdkNk z^r)clu@fHA$Jjj0*!UujnelBt$7U0G)QkV-xmK>nk7b3QJmci!d?Fsq#V0EHSX5N@ z$rBBJ4SW8u9}L`z5*8N@vox^@N}M#D;MUs6x5QvcVPX?|lSJr;6^kBm9P4it>kygg z#L+TYTtR0?p`!{rpOWkyg-r?^>>QeIuSz~XXyl&jATE;RFl9xnkl3WGMu#m;ENoVG z0;L5<8JRh36(TfFmAapojX7+jQL-TCrhv$qMY^{au}%<5TOup7;DL)?t3cY>Llqw$ z9c7lNWERhIm|?)l)ygj{w{WrB)HUIzs diff --git a/ui/2.1/images/hvm_selectedicon.gif b/ui/2.1/images/hvm_selectedicon.gif deleted file mode 100644 index 22d20b8d47018567d7b7279eed7e57d322664538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcmV-g1Eu^&Nk%w1VKe{{0OkMy|NsBd(b4Yi?(6I8>FMeI{{H>_{qXSc^z`)d^78un z`uqF)`1ttt_V!wc0a{vG($dm|goJ~GgV)#Bg@uL8%*=0ZZ|3Ia=jZ2odU}F_g5KWV z&(F`Kq@>8m$jQmc(9qD~;o-~6%VcC^`T6;;udlPp z#r^*LpSf*iWo3AHc=7Y>nzm!O%aV4REbQ#;i>goS?C5iuDdp+kyu7@RkB`*U)M1Sc zjjU0^!op*Y57FGbcAPC}k`}?i!Qbc4ahN3U^60U#v2bv3;^x|yvtZ@x+w1S-Zng!cFJtE;PCiU*L8kfyzQs;a8e-@2Nb zns}Wt000000000000000000000000000000000000000000000A^8LV00000EC2ui z05kv*000O7fB*^`0fmN#h>41ei~$=800t8T0F{=Pn3IV-8=ovl>4;B~a78W4r{OCAk;v8J*S4e?DgB&OvOsGIk34<>z z7<@qH;fo9uI2=5f#o!t+;;@+6Xs{52lP6mQiNG>L1O_HDob1ry;B*QPaa~S4abVQIDi4g!Hye;BNs|Qneqn-l`m7? zFam{`$`2B-5rQItgb$S|*H9v^4Vu)j69jM~;DGG|9yHv}eOtqW3%B1vcmU^s1`oGy zFPY=uP4edl&h&^OLxA<`*t2WjzMTt_B;2jbh=BmYi~;D=t6$H)z5DkAWs0D%AiI}=5+;{X5v diff --git a/ui/2.1/images/instancetitle_icons.gif b/ui/2.1/images/instancetitle_icons.gif deleted file mode 100644 index 2e44ffca52b162cc27456a4e890b3ff091b9ce44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1654 zcmV-+28sDcNk%w1VIlw?0QUd@|NsC0{{Q~|{`vX&@bK{U_4V!T?dj?1_xJbj@9(v_ zy!iO|`uh6v^788H>h|{b?(XjN^z{4s`{Ci^=;-M4^YiiX@%#Jx?Ck92<>lJi+Ux7< z{QUgl;^OV>?a|TE{r&yY)79PI;N9Kb)6>%uD>T{J+1cCMH(F)e-QI1n%GlW0z`(%N z)z*S~c!1IDacO6S)bZTh+;M7Xb->$nzuMm3-q+XH*x1|j^Ys`xMAzBc_xAVX*4XCe=I7_85tfL8R6mKgVyuj-{j!n;8RLR`}_Rg-{08U-0<)4)!E$q z`}}ga($3G(5hgJH|Ndr)mDbkQ0ga-O9t&_AONE+Dhn>yM&9ASo z)z#H-u*UrR`d3s^dY7O$G%@%0^@xXv&dtqz$KdAY=NuXt^Yiu6(bDYe?1+kpwzjuo zhm=r9MC0P)QcFnK+1Zun_;$nGyuHA3xzS;vxO8o6EhQu{D=KQQ$6kPn;Ns)r;o@MK zt>xzEV4k)5`TBi%cXGMZbiLM~prD%((dI$=;v#*&0$$qZL-Xe&*e!#JKo*i?(OcqyS>xY*6i)<`1kmZ>G=p18PU?xQjMX) z!^ZaZ_tw|elGN?#=;-9+;9!4>KxuW*&(Dq9?=xX=J#ByF<>mA9@_3-F0SOFikDBM^ z=k@jWVWG8y((vHn-c@#mxVye>w9Af%gzfI_j);Zs?(9}iPtwxT}pF z{Qdm*`1jk|+u-2h;NjyHA}QV6-R9=!>gnp{=jO@D$;ipfIWaQH%E~`AGR)1-*xJ_Y z>+ALQ^{cC^A^8LV00000EC2ui03rY$000R8009UbNU)&6g9sBUTsSa*LjVs0Kzu0h z2%H2M5EGRKz7!Cq2X)r*5KmuSG{2XZJ?nln1IKfKHVZ(%pAKF%oi%@|rp9BUr zPzZ7(!P2l2IYzkAkDTbNcz&Czyo5m1`J@}83CL)3H&(F@Fgkh)-)OP`*472 z1%C?|Fpxl9`ho`$EEsTLq7;LitU)^e5VA}b1qihf3`iA5f*}snLl;*^dikPTM*R5 z4o2JngdP-lKtKdM@GyWPJbZEs6Wn-$iYRP^!-g(vFoQyq0}0W_Jt5dZ3M?7bRzN%3 z6aeHVa?~M*97U`mh8RUq@y#v-g)oL1$KW6WItN%;fil)qHA4whsGtHbo3i5R6MOXW z20=!&kjxk@q%gre4j5oT4zF7O07D5cFyV$9Occ=x4Mt+ohb08zlEgh~w6Q`OvE@H9ip30Vg}`vrhx-%HF4j@y+J4GOX zAY;lOI$%PO04=B!g%@C?ki`T97d(Lxp`>F)6$?MI@GHLPlL#fPB?Z7c;3%N+#vCg^ zf<4E45Dg(RNHM|fP>6l(9Dm_EI<(q3xgox3KIXYFb5P+Sg;gB z2t~385|glCTvG`Nz`+IAMbLm%5I~SX0v60ML@PrK!T@pz32*@dq+zf`4_eqDg9aK% zAww4(WYB5@4-CLT#Rf4`fB=05^k9PqgnW<(9{C6oO%pfB(18*gTsgo630*Ki1Q;#R zL0M;z@WBV?G_isVT4ZnldJixFRoP}QFdqaM9I!+N8T62W5)`ybKm~d4T~I&(J9Rl} A^#A|> diff --git a/ui/2.1/images/ip_ORicon.gif b/ui/2.1/images/ip_ORicon.gif deleted file mode 100644 index ff163d808adec3fb4b783a58d4b50bde584b7185..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 749 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 X=wsE(x8(A}f*I$Q7i;n|GFSruOTKH7 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 afb6768096c6b3e6e0c09c5e6f7398ebb980d1cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 770 zcmV+d1O5C*Nk%w1VHE%p0OkMy0s;aP6BF(2?H3mp9v&X-?CdZwFe@u7DJdx|EG!)z z9Uveee}8`*92^!F7B4R^4-XFr2neI2qkVmSf`Wp6etv|6gc%tbtgNgfBO?q93?U&Q zdwYB9>+2{eD29fHF)=YMEiEc4Dhmq>4Gj$t5D*3i2BoE?udlDf#KccePokotmX?-t zb911eps1**d3kw6L_|D1JPHa54h{~_&&+&$e5t9a+}zuMfPf+*A|@s#5fKqCE-nWL z2gJj`)YH(}*w??lyWQQ}+uGU9&B`PsB(brsb#-+%Ha4H1pUTS0larI-;os!s2txU8$Hn3$NGo159$*=uWSGcz-kl$6!g(_vv@U0q#eWo21eSw}}lot>Sl ztE#l=5AKh)FG)6&n$$i~Xa$AN)?-rn5b-rd>R)~2SWr>CdT(9prb zy}`h~;^N}Y&d%D}*%A^GgM)(_8XBaeq!bhs6%`d58ygrH7ytkOA^8LV00000EC2ui z02Kfd000O7fN^vk0)-s~hysU+g#u1ib}20_6$}%V6%(2^9Gx&%aBWc-BxV~B3mF*; z1PTOw7k&eLe++auD11tFA29|=SRe)<4-X*-A|@71L?{g^Wl&uJ1PBHXJqHH}2nRlR zY(W@zE-xxETwXEW|K7R7_$rEc`4;XU7-@un8L=m?tgm~X@_;}>!yhDKq+~G>fd*q5BQ$83 zF(ZQK2qplukTd1R8VVLttH#5c0&CVbsvKd#LXRE^D{kACAi=ht6ShxKVG;-cJ7^&_ AumAu6 diff --git a/ui/2.1/images/ip_searchbutton.gif b/ui/2.1/images/ip_searchbutton.gif deleted file mode 100644 index 9dcf987e12e5a638c218435be6b9154410ace872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 767 zcmV>Gz<>lq(_4&El;@$K4>gwv^;^Nxc z+O4gvj*E-#`u*MA-Q4l^D=I2TT64?G%UM}j%*@PWb&L}e6S}&(+VS>HVR}AMYSz}) z)$sPv(9qJ<*7*4N!^6Y4x46j2$;HLRpP!#MN@C#i_`$%yL|1NCX@KYF=l=fwI7?%) zva-6t$(ELu=jrUm$jbZs`(0~&y}Z2h^!8I|f>mmRo~5nD$I0sK?q_v}>gnn{Pi9nT zg0Zo&=H}-7`~2hg{nF9Wo12@dzQpL~=;9S@%hx=;^*e)!o|kX(b50@|JBvi-{0TZ*w{5lVE_OBA^8LV00000EC2ui z02Tlh000O7fCB?&5j}o~h>3?i5oUq|DLXDYf0dS(l{zjvDFYQHFqop4FeMczE|n`Q ze?ePEOdqOxf3$yMC@eLqe+YS1Rb3QbvbMA}EPj_pAYEBxV;*dIGL?F^hn62BBT^0D zZ&)-@wdH@=l`0o@LQ@3=Q($-_)tBghUKdvfCjBM{OK1qdbk9o&E*LO8cz_{E8#x27 zRk{b{$C5e#IAo+l<%An^=lmcTNnpX8G6qt@K@&#;f-^jLj69^GrV1q_NPH<0rim63 z7x<{SWAhM!qet@~VZihSlou18Y(PrjP=c#i6Lc6MLP3HH5FkuYgY^)fvuM+zT>!zt zgbrt1{gm+Fpss=qL!3~Mz?Z@v5*93kaImI?1}h2_^l`%GLVy-6e*9<=-~^Eu8x*9` xkik!mKA=O39^EI0pA0u5%)k+2kL%a4UB|#NBfay&bR{s06Pu?tp)%9 diff --git a/ui/2.1/images/ipbox_nonselected.gif b/ui/2.1/images/ipbox_nonselected.gif deleted file mode 100644 index fbe462c4ccf30f5b3cd03869bc30696a4fd4b21a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 941 zcmV;e15*4)Nk%w1VVM9J0J8u9%gf8l%gXur`OC`6%*)IA`uhC*{Qdp?`}_On=jZxGbJS^qZ5nVI-0~h@2DRe(CZ!jNhIxTLgN0NIm|Cyctai)odcWYX_*=CS z7K&?H!EU3|@Ai5fceADPIlg|s$KQK-dVhX`fOv(8e0pwEeT`9OkB?}3b(NTuaGQOW zc66DAh>V`1mz$%YYKwq$bBuJ6Q)hvGo|dFeX#>FRCO_T=u}`uosQ1mEq%<&y_+ zoxy?!(Gk2h@L)iO>Il9=7;&3BhWPA>i#V{~0s;sB3>XMGl4Q1#C{dmaX;S3Ml-*Ri zG)YZnNt-oGvV^&_QSfq zWcC!>Ri##+)I1I_fIwthq;A>5h1>S++_-k>%Ds!UF5kR&{RZYM7jWFZd;cCrOc-gI zSqLIao=my2<;$2eYu?Pcvu3uRJtKJRPqgXNs8g%<3|eyQ%%ndeC{SQF?b(rO>)xGv zw{G0Fecu-TyLNEm#DODU-aC15-nNfBzuh}H0;LNE&=ydDyMXWDw}T(gy*v5w;?Ji) z|9yRX^X%WNhd+OQ_x0|Hli$vtKlT9(1SsJDfB_~zpn(D+nBaj77TDl`3OX1e0~1on z;DixkxS)mxB3L1X7$z{GM*wUHp@|Dh_+W=AT3DfiES~rxiZoiNVu37r=wN~(%J|@p z*b%@Zh&I}oV~QQdXk?K~9=T(TIy%|plP)4zWRfjH$RUwj;^>i(SrUjNlS7I*8uX2L0DoOBYIq>c=Hd7+kOj(K94YR(Agpga1>XP-T)NoApZf(Rp%A|{~L zg&~qTCYF4nX=J5rZt5naZC+X^no&Y2A)W)0XlJ8g{#fU$jehu{tBfjoXqX!QY3qL; zMmj2#Fur-_uS;HODxAfx>LReiDjVxsip7Q)8-Qgdx~Z@YX87l&za9C$`+qW{zxnqk0J$A92#dwgs0=0z zgRxD=P_Q62BOAocrKhuatX!IanZwRzb17`wJJbp~w}6}3Ae9vHD#{x88Ljj?x3Qt! z-B_3^45qEx*FT`D)8D5J(;0X=)HkRzI{Nha{LIt2!3EWc-u~y4+S)oBy>I6F=T-*h zHpUmGrpDe4zk9Pj?QUT;Hfxb8Q;~?}T=F%|m9=gA7lU6@SsI3p!#Vb^dzEaCtt@Wk z-s#KOd(^eO&FpHAoRRg#ql8$U^E}hzmF3~?l@~HCE#8;UnB5u8H8{8|zut%$$=B>V zdBOt1rigv-`d5S?fj(gGdk_VvTHUlHa0I<{aaR;djM*6rMINw{_}BR~G8PPzKTNd} z*99Xlt>j;I1*}dW-@&6CLO}X%i)ClcubKoL3!CQnfmcTN|0_&w#AY*Wq{zY9YFqR3 z+mSM-`1dYziEp158+J@beK(iQwpz$NCE0B)4|p6@yij^>h^;MDy;sxc@xumaCW7cOL9r~HN`fc3d=FQ)9(p!BOW?;&EuJyl( zqx5exrU#9r2swqLQu03KV}KAk^uks!Llvh{O4ssFS)!{r&MeaRCXvgidmZ~*!wag`tD9}&j)ennU<2*MGn_^Eq; z=!$M!%#hs4spB8Pd+Y)n_CW0d%yyorFG}%y)bS6@dX-SAu{|2hU-UlZdZceF4;{)kb1g4!wU_$I_r z?^4Tik8kA7aqlw=%@bZhh2RNn@^LXIu13` z{1SIyJ5kZEnq9qo z=7*j15$Vf@^Wooh$@KMlWfIsZ4cN{^{4!2cI9I~j-D+yD;ev!uGC)9-xTVJ&_KEbgFtS%fIV7dwFAK*6Lc*5%5a(5qZxpiz>JNYN5h9MIGQAV z;snmWhV|&5x0=Y!^zK1xzQ}j9_BPAHBw!AG(RVx@I?f52*9NXs_d6tg%7&0B`$x0@ z0N*(IT>!)}%Ygx4iun%D0f5jqZg;wLgDYP+U#@2p;pAP$%`0}fYG~m%cv*6nU+5w; zc5-s|6{!dtCS}K&3eG65ha!x|QNOTA54GYIn3F4&u!}BX=AT7Z@ZA;#HJ2j&d7`1Z zP^(@W*EmX3feGIJ#6!fTXhBnfxtpF%$AC)=gSXqHdeutoM2Y-racjXS?97-GNYiM* z4}Bs0ECx@ZS$QcbpR#w*`|(V}XtPW$ulg*Z#4W>>F9$+en;}CVi>#tElzvV0ks*rfPkWwZ7e=$>#fslFJp5 zKI(rC0Jf$YTzUZ@P?y(kd4Uwz)fKYMN_zyFmS)1Eum@1SmF7v(^oK@h^;wlVlP8HUzCORM_N}e6B|7nGWWZvQddK8739)#H z{Fgwz?SM8eNk8zN!*m`n^{*ext8zIZfc8BL%&FMK_V==uPbBoucnetNHVUnxB% zl$dQ8xWN^+KhQO$cQ^;gVSFCLRz9S>ydLydXmUp%UBV>1^mNWet4P+s`ovs?e_Ypw ziPn0xJb()JC(!Ub{O&&x?oglM{Qjc+PnoDvMa`Sq{rM@4N3?*;&Mxh6_tW5@T|j`{ Fe*oNmJG%e? diff --git a/ui/2.1/images/ipdescr_boxbot.gif b/ui/2.1/images/ipdescr_boxbot.gif deleted file mode 100644 index 84bf47ec73baea9dcbd7e9a4f3159509f11297cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16820 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

    # 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 N7IbF@SO@@n{vV7x$eREF diff --git a/ui/2.1/images/ipdescr_boxtop.gif b/ui/2.1/images/ipdescr_boxtop.gif deleted file mode 100644 index 7b95712b16b2a33624c2dd9c563dd2fbbadb5184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10762 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 QO7^p~Kw%IG03i2&0M>M!WB>pF diff --git a/ui/2.1/images/ipdescr_contbot.gif b/ui/2.1/images/ipdescr_contbot.gif deleted file mode 100644 index 810fdb823703899f54a0cbc19a042fcb84921eac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2148 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 diff --git a/ui/2.1/images/ipdescr_contmid.gif b/ui/2.1/images/ipdescr_contmid.gif deleted file mode 100644 index 5820b8227cf4e1f5113c0d92f2d87e833dd251ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 824 zcmV-81IPSFNk%w1VXXrO0HOc@nwpyb|NqO&%bA&(%F4?3_xJYp_5c6?A^8LV00000 zEC2ui0IdTC000C32v)Z3g*6tRd^p?9HLsp0T^LAaV+c{GHC`;tYUgB6ucJ~YS^cWc zEF}tlO1j(5XhP~{pL%!M>@?((=!SZkqTpZCs5eegqifZ((C%GJ9!>8OA@r3Tz2 zi!Sc*+EFL}5-CTBcEu36WL2Ahf3^v6BurViZW84cg9K|^vRNVJNW3u)7)^|v;Ao49 zDnsM~!L zp|a&T6f$V1rY)*1`|Istgl(^SR=U&}QJuE3)*PLiBDWkMgH{~IIM!HREWbGo=A{4{ zI?!cfY#91#an>EZ*_IrY9Jkcn0eZG52?mqe>X=bM^=QM05r1C>eSk4p9?Ses40 zc}0Bg-K5`(=yf*TmS$eLAbL}(_R~t~30d2noQ(;QY*Y$2M}iEjqhwWQN_Z)4VaB+p zp5C0+-lMGvY1(~eQT8d22~roCrHuj65vz{Y=^8~%wHjckcp3I(mDp7%q6Y&c0029^ CqlTIQ 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 d12ff0c48007cfd1798fd4fda015f4a03dd6790a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1227 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 y9$yIkGF>>bKxJjRjICszQZ$vH)@hJlF zNe_`mfWw&Z(rtJ?5|J5!{E!MSVj?ljDku|K>xwA%hT~mP@AXjP`g|lf9}eF}R3qWd zTsU5%n&e##)j+l7Bgo#UNE)gYS>4P<^tvJkn8=OqsBC*=Hx1FsM7JQTOPL6wUd>>B zHQXCr7l9^o(Ks5qRv!78Rx|I7T*=2&x}vv{s9zT7K?_ud2AbkpO(9fo*<;EGNLgNW z39VKJRwLA_WiZj-m>5YE29u9eg`m`U7-I>UN&A`{`|5pe$kUKo6$LEa8@ps*r@*U~ z)kJe$YmHg8r!27--OvWCn%{cp9WL7Z7D^L>nMtkvBaac&Fg5nLBdGeLuo@c_?jj7) zZI2$;z}=wN{-Pld`rxSEH4lmCzge~7pZ2&lSL`$sx8hpwiNbopYWLC`1AK5NSdD?a z+F%~iiq){5kLFom{VZ{gZn!ue?g9jz2*F1Xo77lXT{qNog*t#+;~vchGamjfuPK^P zr9*En^TvM^VkhMBuZT^38U%F^0j1ECgCe-OVZR6)AMk2a==df}0vlN)g~Hc^@D=(P z`CDizticn6NfF}PVZ_Y*x@66of86kS^rkL7)Zl##0EMikH<|i0&_T_?M6835c6(Qr(cMkG!r$-nU2yal@|( z@g~H!WJ{_Hm>L3VcXw+LDG(Pxom={CGpIT}P0Ez8HH=r+%B!-Mz*w;B2>FfodDwtO zl0d#QoJD$ONjhTC-k9G7BsF+xwuL)%QT3ZL-P*{o#tVQRO%dk2KDCKS^gtmgpe`o> z^#L343DhC*={l%JTUYnr*J>`&>bhao&e9(gK|8a3zaFw4RG6Z~TM~a3bm9Shk~?k7fPr05osLy6 ziPX42>{=%dlNUSZcwLfEJf7S93^ZcaPrE@Mb^_B!-3E_~x-qB`5{Qz?Zrir1&nDKC z5F6(en_oiPV+_bbK+g)aCr@EGNn!Xan+&yTvQ=v6A<)H*4vhy3J5Kr$l(gDy0L?Lg z_H)&Q&tRgy;YhJ%AIi5am)MhKNsoXMUl;UT?e7(F$Br%9_X zo%HonfAysPfYpv8kO|Lo>J!Mv~-{>8#rL%dBblihWMQ725QpQY=bbN=j*Ks5j zJ$gs8E!}UZv%kq?XX*r??ywf;iqVt^P5Brxlc+Q_M4w{Ael==wr25&@te&dEp=;W+ z4o=i#+QW;tzAB<=LsM*b<*q^iF&I2f-exHqeAiPNK!8c0rGdPi!3@Q3Br@xiHZ8Jx z?x|wezfL4TIy1|l`|^{%*Gsg27r$Fu5Bwt4ibVWz4hlv5q}=;@7paL z$x#{yPA$X^j4vXY49Btj$WieR!3ZT&i)_KE@yF|SCi;~4)Fb086j7VsWEnN@ z*wVeHkWpkX%~IyaLoti}42`Ke0coUxh%4CbgFxrSMV!#3slAkziQSqXM}D1EoT;_$ zD@)_;RsMF_y@Rkjg=!(4Rv5F=UUjQkX-u0`*Qr0Jy!>0_&}M|`XVTzSD}&1Da>KqC z>9ahW(FZL*UUHapFz>2ww{IF*&w25SJa(Qv{Kt26y`@vGpet@i@JhMwuK$#)4Lqxm zlqp(`YZ+6x%n)bu*XxQV&fnVj=+N{G)B3@hcf*N(+<46+YQxX?yM>sL6}6%2OjPb) z{;5n+XHNyIAj%XQHux*Ek?UK0-jydU>!SKfKf(RMep?D9tEQ(r>Zj(@t}9a=@#*7v zMQm@U`LUh8cTO{~UH(<$`2@fDNO|c!5)ySP5_@h7vC+c%0Aane5K9q~oQ18^Lb5>E zW-M%=2-^aLO#!0L3?Xe$)E_M(3<_yacZQ=y&4Z#A6;W4)Xv%q~y?AFrAYx#4*a8tX zL)0r4eG~6coOih5-JiumdbDukvZ!B0%nuMxsz}91#N1HS`f#-@2>4Pt!EtuvY@rb( z^p4jU;-U%hI=oS#%NxP+1->C4r?P|YPUfdCJV9Ml&){})Bq@E&UG~>+k}F+@8I5gQ zyUgwRrmsC68pnQFjI~HyIrHbIln^fCY-c*Byl;=G(je*fn3;m?Ir>GcjpiB5_&=V9 W>embcFX+7c?y9r*Zk&XK<^Kb`Nyumb 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 d95f11e237fa78943f3231afd521e0d390303c4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5756 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 OUmTqM0tv&F+y4g@6F?LI diff --git a/ui/2.1/images/load_add.gif b/ui/2.1/images/load_add.gif deleted file mode 100644 index 88e968440565afed5217051d9765d79878f11c44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 870 zcmZ?wbhEHbJi_3~aFu~!`t<4b_4QAlJc)^k$;im~{rmT?U%!fqil$7NQdwD5g8ddZQ8W1uC9WDg4ER1oSdAJl9KG~?1+d6Q&UrSclW}= zLN70`sHi9t6BAEQPX<~7#h)x-<8?qJ$WIJx{~h`dIO|CDpIB0KGRJEEg%u@UYvtOn zttmVGwranJPKA%&?DIZ`RcG^d&waJM#!vqE>mPgM_Pzi8->IRgIlsK6y(6Zrv!^$p zyKmwow+WM{^-i5Wt7T>YGaru-!{Q}Nmn~nha@FcJYuBycuyNB0As#+vm$`nt+~NYV z@(KqJA3A#E__32GPM-5zG=%N!DVM>m@huNCP;Ys`Tuk5`M)ie6j^a` zk@dc#wfh<6Xs$kFiHtCAiCY%s(bgo@{)3Ym7s~ z^YaUwyT7fOzA0_W9M#!zbA=lkudnjo?Dp%H!<(C%a(|@;S()dx?VkSS-&^T~0@cIa z!pqBTJU=}>bzG>AYj4%zXCCw1x9`i}75?tFa+3WbS(_gp-A=We+gm8+fBSHLq5dK} zyN^FzUah}>o@YP%-*2wZ(cg{p>6D-_&!APa*v0Iv{tivR!s diff --git a/ui/2.1/images/load_addicon.gif b/ui/2.1/images/load_addicon.gif deleted file mode 100644 index b37be30ecea1986dc0189d343f7bae3ec8c0dac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmZ?wbhEHbbWcyuzkmP!`}gnv|Nj>+UJMNlwYRr-b93|Y z@tHq=zLS&FnKNes0s?;j{(bM>y%#TD95`?wHa2$Y(xn+088>d+Sh8eEVq)Ufty}Nj zy?gE2wc6U+>gwwF`1mPPrp%f(>%oHu_4V~09v*>#f!^NUhYlUm)z$s=>sM4%6a!^I z@h1z|038qs@)HAF{ecDt4;d-uBj+6^2JmROJX8waxkOL&bdrQag;HCAg^?4B*G%7q z3ai#|OP@||P`u%`PneXrX=45QzXk2532t>X^5WQai?Afyo8#efSzU=Jm>({Rj3=9NTE?>SpGc!|P zUtd{SIX5@wbUL3teR}84o#EkOOupgFDDSwJC;|DQ8vXKBi@TlBT~QzAx; z@BCzKf?Tp2;{YXZQYQi-O|igL9)prRgxv;Ok^nF9u#A2!iKcDQp)9+D7CUEK)177_ zKQh72v5u*QNkN!)IMU+SE*E#DT4OmW-g)DpBl9Fl9)%-~;~P<@zy3vUICL**jA_ML z0Q{@3eBs&ma(HET7|21(Wf)F5s6?~7$O#~z+sm4Acx^vbC5J{jmQ+KrK;)s zI~3o!Hji9#S`>-TtM6$F7>bM0D&C?go9vP(md zNRF*~FQ1@m?0XPEur;=lxR9jRgQQI`K=RATKYVMLQu&8u$?3Nad7NB^LXorbuA{b! zD{g(?`{aW#DdYKHEO!P#yy0}QQVKneYD_`(v^npd=_bkA@9R}dBM72kWd#rN2@4@q zDisWY5wGnn&+>ux_2s1kVwE7HCYkJ%ht@0(^r8k;srO42Q>qEYkLIKjQM`D`nDnp3 zV|O-Lw@33b4xh3$ir*M}l%;F8T`^4hxx%I`!#G&be{dPPuP18y&FsAy3AcApkC>g+z%lS@d~ur!y+eokB@#FF>!0@ z?6iU}B5sb4JTC<_$&01dV+2d$G(#n*03k#>P@d4PqWM}JUkm%=MbPcRW8G59C?b2$d zc4CN9XQ1@iEQr)8&P8SUj11Y9IzOul>uB3&zM$@xbhm!BQoN38b#`9(ccf_hC{xs| zfgko-rqz6=?a=pwV)di-7z%kQ6l*NVU8kn8R=6&Hvk;c?Q0mVWp!e`9w)Ryy#RWAf J!H;OMegPCU8Mgoc diff --git a/ui/2.1/images/load_joint.gif b/ui/2.1/images/load_joint.gif deleted file mode 100644 index 1ad4d83fa9adbc5e47f245ed71c2439b5560596a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59 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 PJwp=!%XHBo2pInlLdH!}$d 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 Qa{vGU07*qoM6N<$f?g=ja{vGU 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 976074323f1d74c5459258c3323ce192e15b0f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 487 zcmV((xs>&#pl=Vu&R{)a`bo-EKo1AHqZ918XM* z9OWxW%PM9^oxDa2v1YoU)oO*V>!2VW@nSVy#Le?7)`J432l{x87-Eg+(MV9zG>r#u zU*Fg`zlDFWAIlRXI4IoX>hXowx=e`#8C6wzl3=p^1wVG?#<*~k2!+8*wnx6Gb=NEtW+vs4D}*q%H?wJ?0wZ*t>$Ppn_dDe77KqFYMd;~kR<7^ad(DZ dzs8RM0{~_~sq0;w2cG}{002ovPDHLkV1m^Z(t`j1 diff --git a/ui/2.1/images/loadind_textbg.gif b/ui/2.1/images/loadind_textbg.gif deleted file mode 100644 index 783a5e8f711a03921ae4e2602aa28cb4b9ba5a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 407 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 S*jxrhPSWs#=L4?$kN*Kl{^v#j diff --git a/ui/2.1/images/loading_1.gif b/ui/2.1/images/loading_1.gif deleted file mode 100644 index e548b4c21595de080865732f6f60e7feda085e9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2704 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 diff --git a/ui/2.1/images/loading_load.gif b/ui/2.1/images/loading_load.gif deleted file mode 100644 index 88e968440565afed5217051d9765d79878f11c44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 870 zcmZ?wbhEHbJi_3~aFu~!`t<4b_4QAlJc)^k$;im~{rmT?U%!fqil$7NQdwD5g8ddZQ8W1uC9WDg4ER1oSdAJl9KG~?1+d6Q&UrSclW}= zLN70`sHi9t6BAEQPX<~7#h)x-<8?qJ$WIJx{~h`dIO|CDpIB0KGRJEEg%u@UYvtOn zttmVGwranJPKA%&?DIZ`RcG^d&waJM#!vqE>mPgM_Pzi8->IRgIlsK6y(6Zrv!^$p zyKmwow+WM{^-i5Wt7T>YGaru-!{Q}Nmn~nha@FcJYuBycuyNB0As#+vm$`nt+~NYV z@(KqJA3A#E__32GPM-5zG=%N!DVM>m@huNCP;Ys`Tuk5`M)ie6j^a` zk@dc#wfh<6Xs$kFiHtCAiCY%s(bgo@{)3Ym7s~ z^YaUwyT7fOzA0_W9M#!zbA=lkudnjo?Dp%H!<(C%a(|@;S()dx?VkSS-&^T~0@cIa z!pqBTJU=}>bzG>AYj4%zXCCw1x9`i}75?tFa+3WbS(_gp-A=We+gm8+fBSHLq5dK} zyN^FzUah}>o@YP%-*2wZ(cg{p>6D-_&!APa*v0Iv{tivR!s diff --git a/ui/2.1/images/loading_messagebg.gif b/ui/2.1/images/loading_messagebg.gif deleted file mode 100644 index bd374437b5c54cf236337e4462d88c403d5ba953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmV<703QEGNk%w1VFUm(0K@lq->gwO$ z-_z66?d|Q+(b3x4+V=ML^78WG;o$@ZH_r z_4W1Q;^O!B_wn)ZA^8LV00000EC2ui00aOt000GEARvxpX`U!rtOd!gV<6A-O9ul^ z=ejHmgCB4>6c~?4fkCNU8VH0ZG&+?+C!WdV!Q~vj2gnBk(MZmWG$X-ISSl3@VvdMJ bIuV6lL7{9Y84iLN7#9}{hzkvi4IuzK%PxJl diff --git a/ui/2.1/images/loadingmsg_left.gif b/ui/2.1/images/loadingmsg_left.gif deleted file mode 100644 index a5854d7d438ea76806756211fae3aca68331da3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 609 zcmZ?wbhEHbpIXOAe(b2r3;;vbx;_AA(j-ITn ztO1P^%~DH^v+Fdy!_CvmY>HY8BGZ;FTP7r@WFMEI=j178V#CJ9CZVY>r==&Upj0+} zkxNpJnyD4T-~ft0S-=j_0g<3MVPN0az|U`{Z7I?&!mr2I)63`1J8{xP2A*ltr&%$~ zo->*_UY*w$~@z`S|O7N+exc5v?AvxjB>fdlM^j~wARe&R&% z=`&}~oxgDL(&Z~xuU)@!^VaPrKM$IVd3uXZfk2B8ylOHl$4Q?5fl_;Vq&7NuU}kT91#(r zrlyvgo9pcC?BnCZ%*JjSnjopB$;Kz3U|=fm>@T8itQrt!m{ltxEz7T<#w9N8Q`@H< zo99wcuV&-S&CM+!EW*ykEoJV=!op&kTp(p=spk=>ZsQ`Vs?9Ads_z-Z%*@Qn%4(ZZ zpc|HARnTmcoNt_5;#%0CXzQ-#8Oq7YsU4TcFC#A?qrfjDEM?&+Y3|6y#l^wFVO`iP zB&TGMRm;i4>s{N+#Kfd%XvV|C!z(JTVB@Ce8KmwN>YQJv7oMW;6~r(of#OdVu)B0X zBq&Z8*#9?hH8r=iwsG-xc6Imk^0G~sIBD_}HrDAgX3m<;$}(^Mf`yA%xR)+lzG5Xe z`WX^6Ldia#6B`%4Y?BdMxYBof{{Ggz`c|GqsFBZD;n%)sW| diff --git a/ui/2.1/images/loadingmsg_right.gif b/ui/2.1/images/loadingmsg_right.gif deleted file mode 100644 index 9b3f4d6070b6ad25fc951b664dcc72772700a415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 657 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 diff --git a/ui/2.1/images/logo.gif b/ui/2.1/images/logo.gif deleted file mode 100644 index f248ecf68c2b3225e73034ade9fb3b385dc997d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11559 zcmdVARZv_}(Ra01+X_dj*c zJx}MaTXi39@7k+-cduUE`(dr_uGMeLZ`%MY1sQo603193VEOL>yqy6+U@r@Y&j2_8 zBH%wvz}p1?L&DO<+zMdX|BnOrwgw0X!2S0D{(k|&|Ahac4i5+SPx|lupMw7`@zxIj z0RhT@F$6de03HN~0D^lP1a$oK4-p;#4(^|${{xVafv6~GaPWu-@BXp>iT(rsONatQ zK!ity!vX-1;1Q6JkPuN&kp3fvgGWF_LPq&#gi;+F2ba?fGK*S7HJ74wB@u$R!=+KY zi~qq*(ma`(25rEdTa$+#^dHM`2=M=wK}13Qw*(yE9|b}}ro=|!#F0=p!v#`txk=)M zKs30E8opE0H1nIgH+nSjcxroncv}UaBm7eUA%Fm4fP}`uoZO_aQbunFdDyMvq%p6m z4298B5U;=^aCtF0#Dk1>ql408!us=eY=9GyU1;W9V4l-KW{h;x3V~ds+@hw8T%=B6 zoz=Yjf;xu>Ay*=+&0~3pI|lL?-KUG~81);+S4i8a;?4kQw&_V`i;_JOQC4Q=g!oH% zFA0d0Sgh3PH}-=o*z^Bi(+u*1M&Xm~6i-!Eye4QALNnl(7d)R|4Xh~fOoA(Sm!u`I zudWGdtIctxngIxb-qTYzb-?y(`>E6UEg5po~`jhEK6{}|owy0>z?b(q}@s7XZ1Xj|2doa`s+$lx|vOv{OX^{JV` z{I#|=P07iVx6?P_*mN_cRfIP0t+*4^U`z~YY_*tj^V~>A6-_{Ju!TcU;Z=I$dMY0r z#3*{%gOs&9?ANO>xk6#OB zm&|SNp)&IbssdpqA#G!$Wdaxji3hUcuu7othX};}j(sZ1qJE{F}r!hTwPAzDtA9Zrnfb^Q2Ow#I4^zanr|QW=ONViNr8!6lNfiRfvoE!+BA zcf?8oW&F#uU@Bnoul$WhTSriaS5ovHxf?p0uPIwCitfj|W^*oipMJOnL1W`S&2qJf z%G@7|(Swja9WVG*!!#4Rwa7Rf4OS-C-(UtD+u*W6xOgytizPw81w!B2ar&4;f#bAq*N zy#_B^&AmN=OF<~WQTmhID$OD%W21=?`9?tb!w04 ziezE<2LuC|Wu?DDJqK6(BVX(FQrlzO%sT7|#JtV=;1XSC5MSj9tCZm)$qF5wH2w!7 zK7m}B)F{b7mN@8LDHtX5iIyemcxY1F;d?-L1Bne8+mV=y!U*QN7?vn%@5c12Zsx`Y zD*bG|h+%=OWf0e_aL)ID=Op)YMGtP9$P1#aLsLjkV_XootSot~-(Otl!powEwPVV2 z2p%fVM|IiBftIoerz(??LDjL!5}A}kXETP%W^*(q&vtP69@Z*=I)*&q27Ny_FFO`{ z43B^K54+j9$DZw2q8L31!i{bph0CXr_O-j8(j=`b)QHA=tPbn0G$T`m$)eS8w&a=_ zd{4sdp0^V|#B3MYE|~0iEW@nLk{dkPm&6^W2VGQ<#!`7LG|L1egkWH*2YO@cqfOZH zLygvj9nr&HZcm~`t_j!AITF-UE)3w!1GFMmu>4obm~;NgWU`zT*-}eUBnAzBk`M_N zP_z%}tCvr;Lz+e1`q#!L7DhileAH^9bT`YB%6ofQ3z9-sS$^FKH=UL`cnAwgMI32S z4LmH`4`}lJGtz0IKC;riU!OmfWpunOvIIxs_8N>bSdb)Eif+nuBzn|U$J-Z}k-&v^ zyX#>28PuFbPJc>s(@)MNrY_=fT(4st*J$<$ z`JmMMb^>*J zl=lf zt_$L-vawrL+l9sD@9Z4kKK9ns-EB$?u&{V!UmWh0d(3|1)&8=fpC_Wz#+0UxlEwvb zo7K6drqHdD*S_^=O}Z%p{u}}LW);ZMRVH~8a$$V_zzKYX8>Zf0AFoR^ePSilNx1@^>aV`j)_u5=#O7LP9yr%dPPkv>% zVcEH|8%wwzog4Ebk;O9Lr?Gnat*WF|?BNmY12;-NIIOMm1(aC^n!GUJ^7Ybx_l7AB zKc;qWiV&B;p0VVHJEq+R8+i8*2J=gwaAu`^ZIWFcbrB;S#!4-_>N^^66C4Z%GRwc1 z0)7(z64VI9_jgSPUmo=aU;iQ>J;!(#WSPMCs&6C1)HFH+J z<|yQyE}q<8&zxn7Rn%a4nw$4K@LcZalTm zIF^ZvP zn&%`Y8EgpjG)tTzS|AKjap{AaPThiBLqyGKa#J3}x->-(xO`$C>N;y%HD;i#mr3W& zo+Cq7-^mP>q@jZYfUvLza88rzs{CGaW2-C2j-L{;v&D^um89E|RyyUNqMn|+#@6r5}pNoE&y);EX=2+KW1gKxAD_J#mUtUB{78aP$5z3$uJZMb23=7~!5ppWUa@aJ46 z_xOPlzLgI2K_Yt)3uESyjp2bgMx&rn@=B80ed z2Hc$_Z}XIg6N8>UTG{vIkt26H7?_hhX11SFiHV=;@y1*XnTs0P7fGjvU5(s@jus@| z0N|L`vMMX@$q!DMBICyw*+25bfzFKb%yLpY`INhOV!=Z304)n6wX^Y)|~d=1l0 zd~W&e7CQ0|X}#+g{5j=L^j{_uYLGe*ir51K0JmzF3+ZK5gbo_V!%cZ<<^w_sn^}DE z#ta)&F|Y;huUf= zHfPdz-WKJ3w0$RgeUH~ctsTtQVy_i#Z-D8Xm#>WnE5#OUJ&kqe-D7gTr*r9<6^l3k z%b3I!Xo{}%T7!)95U+xmTNFY9-dnvteW^}plB~@A(tIkrQ*XyvF#w{fT^73JSWK@ zxbjc=#)!1Llan*1Zn6iHfFp715OU9tis!Cce3p*Bd!mnA zA{d6(MqPugt=(TeVy=`Uj4cv-9f-l-?S5kH4)5}hmd0$CR?tKR@wnrZ%- zZvY%=xAplO4|zLsEbX?GW9HxW9Ou3V^}p+`E?vZS{*`cKqBTJdArDwMRFmtUH&k^y zy^8ET7rA?w=eb+HUfOojE3^M%<=T1aDAw;l3Wl>1pEOpcZ`x$~%D*nC@H?JY1*u}g z=@@eEP7L}14n=)tlyaQjNtAfXf_n6Se=(_n{)*%#hf=AHXg zF!zjbETK%yQT%OHwV_SgQr8F0rp3i@NgHBV=%c_>Mxu*%&dDz9sktkdR1vF|c3M8_ ziwzz=V`B_-?LTrx*pV#w+id^*@c0H$F$nZ$egpi`s7{fo4EI3K18-Wh+9K(tD+@Mn z@d(TB#U-)n9zdAB|J0A69+}+R-dW4n8`ar_a&32nKx^_V+0n-^UzodyAkEIjx_U8m zo6cX0PgmiSAyum=?H{z%1& zYo&E+f~1@iWn&H0WKbd5>&_^M>h_ZnAX-uIlmn|N8EALXITRKN)n-NKOTkkQl z(~`oyH%b`!o5O2p1|6b0GA-Bf{-nY_N(oyRMUhw{DTdOQXH*0Ab##RaTqFk9R>#xY z=Yi|(o#x8=P$8L?EY32^imGT{h2Y9XORZCUu)2iKM5Q@{xBv#QjQ@W-f zs{P7&Ww$vV_<)Nvm;Y@kd11@mHo`z>X)$R*u0?5AQ(lJG6;%a{8Y1bMY=Y;*8p$~d zXWYdh{e)=v3{f&h!%u9#(aOfYiT6?gFKF#2(<4A&O7lGVEu7&98^%=C6Ix-A6s-u# zV03kK(8s6E-!FaWAlX{AXyosQCOKDnO(9oYz1hr{Z{*E-}cSh}??g9S7iO{C-g##*|R zzF%A{(+%!KDp);?nD+(9B^x(B7rLnVSE*LXuWuM=dY!X04L73A-?FOfb;qhd=uWQH`0IU9`T7`zc-jnCNQ92LRD5_az zWmw3L)Gx+F_d|76=R2*mz@dPHy}gcAgI_lXqS%%hSASX>1-Afd8<#c#== zVp0$DhbF8nDc5xplHv0_e6muk5g9EN6dzx4_u=JHG1_kG7Fs4NO|+MYo(vUst05BA z`e-r5IkhGV-Ht|)2*8w0 z&<)`NQ^POq`utyR^rd!`UCgd`!-37Q)D|OMpGENEJ%KI#d8D`yX7L!>u_8>`k7w~9 zz@(qmWeQ$F4`!aGZEg!!p5mxuH{jVfzsV6#Er~}#LC!&8l}~ASSb)}K^4=_E$|8c`}CrE^T8cDB7gQQI*>imb`G~neg6Dum3W@;M&qL- z5kgQ|OupZau9p^)s=jEX$VcSGOqQhY--kN%@%BlwVATvq3HzisW94w8l-R1Vx8W;a z-%XO)hmC4c&Yk?4`lK@!u!7#xySEAVp1>k^v899l9$Q6(b4l*XC-}^F#7guH;BWu# zqtB0XnPvZ%_GLLXkr@Y)qb@+;Pryu-2dx|gXS!^ujICl{s#%?y7gCxI8yr#JsR@Gc^ui@>ma?`BM zuu*C0NcKEo^t4*^jNwH%b>c7oB3Fu~?w;pu^+k&Df{uC+q0O4g(S66H*+^#bJHt-8 zi=R+kTD-?T#kbMXF-*69Y6{TLzp2e6qKuallMW7>&kg+)$@3QeVdfZ^pq_1f9v`eT z60#ycyK(%lrPdB;5n1JwJJ!D*Y07>H(lNN_X=%t6d*Xbi`Z9>CRaNQS&tPqVp`Qu1 ztassiW@@SW)Iih1$kB-0zArQ9Zm^X!O1_R#sJ{9tQVLsd3o7eZ+1?=)s2oK zcIc{lpK_}3G{<9%CovyU%82GphnA^6S=~ahN;yPU5^zaWz*g6a$f%B{vFZgz299!Q7t(}ye%LA{$}2eSJ*FV@x;{1p7PSyLWsXp z_CxnAeRZz9n8vs4Y?=ASL|i>vs$@=GWY1cY_!!i^~hRkCszRe(vfF*q-XD8(D30cIehV+0!( zjUp8uaLo{Rtje=Hm1jF#7z1QX7^fg*MN0s=Pz6x+80C_leGe{q)~vUJEMS#P6= zi-SP^5F%Q7j#6)D)RCsPeh}4;m(Z4A{yRc8d0h*YW6a7n_cc#d(-zjuQV6*5sF)3{ z3h$2@Rtx8dNaL+m$I&oWXkhVB@@yc?@9_h z_d@s5HI~L#I|OltyMoVu`A^*ag)%;ycKN*LZx+dq z+N0{nho$=G$L!oN6s=;B7sOUH<>NZ3bQPzKQw3oJ$<$)>EoNU`PyQQbIt{%1S76 z-Hq!loP{0D-0Z?-feh2v%JN*{M!ejK&=PV*SPBN5>h|t*)4fkXC`QQet$FBMRtDc17OqkH{hY=NE#nZvrsk8-HZfcGUlij~H4t z9=w*ibIV#?SF@u1Q=z=`Ps|27m=LGGGbqf&YDyGP^;-Z9`^j}NTok{h&XHWrIILLX zXpnlW8)3vm;K+ofW&H6)DE%}3v{U#qX?VQNrcOSwH^JeML)!+_tM_M2d-NpU;CoiW zF_Dkcf|p`Df%3J(zS3RVH$um@KP2OvgI4t-41NmMrMCujiNQpEupH`iPg_%t5Ww}@ z7x&iEGcj}pxb8BxqY z2P?01E-|LUrufx={ERDhtnKWOHZ9|cdrmtgs{Lwt>pS52xC%z|J*)s=P!wpHqoQX= zCz9h)tM9)7m_DkkkIvqO&;LlY={3+h-jBP# zH)_onysl4l)`I;;<7?wPcYi6bSjXSckFQlQ0JS=gF7Mq-T{NQjG?I|fScWyV?dX~0 zR4)A%Dr?w~n0xnAOIxR8S%HDM)2TT%Mb%p2p`Ch-3WBetJ=`4DRLlMdSXaD0Tny=-& z=R@7Pdk!*3#09Gz>mW~+Mw5y>< zMj5UjG)^_O19-_5*9aL0i;vql?1Uwuu_b$JaudwF>Um3tETv5Dq^c7_Ty)8d4C^CI z-#yHIg7#Hu4EO%lkLNnL)YcER59KIF8a>rQ+6tGxk5zc(e0@E0-$2^3x;wX^wy5qn z&+HlhAlv_dE3cTF%$iHv(ZkR>p z<<{4Gzn%ERB(b z7E7aN$=Q2ug7?4p*!3-33)Hr`jS7dcn9DgxJ5Pe7hrRIk@9d{|u*N=y5zX8uvcyN| zE7Ev6S=2&YMKGQXOIO^Z?Yp##w;Q?}9k8|Qd6IvVmg&8$aSZV^eBb>22Do>`gzPdr z?_qkZQJihq7^req>FG?C&V5#$rkP{Yu_qGB&B%)KCm5H&v)ZAuvdZL4u{`lo=P33} zHij>)(xk{8!U(2nG7Z<0}mvanZ*$gak-89c^ze75H)WXy!Y6xalD=vrj;r{K-4 zn-{2Yt$@v?)eBr~X2}e=z6*kK@B&nGhFaN$?N3WRb3XYyrJNwv6bk3SMFwAK2 zQ2GSNNlg>SNj5?VJ=& zLjP6InG046I#-nLmlnuQ(53E`h*oZwK*!7JQmgVa(U85=<{FaEO=;8h6yU!>*Zm-G zfT>A1ERryv?Rw(NyL4}#Uq+6)2VCpb@1GZrjg$7++a!rWu)OJEOZKSek-wL&*cern zf5gP*92|a~=vAIDN}t1;SeZ08st9hZ44cHC)p$Dw&5{#sgHq0ufEv(qug=;}l+@~) zgYMTr*iKwEp?*7uKU#8yK7+nxVX1|Bc7(jP3a#x`b=$xDMEY*W{YRU~FK$zpvW@$G zv#g6cc(KL#Q=hz>jEq(niFIrZt-FklKu94hQXR`Sr`{IrBWWG?7^N?PVWt+9&&d6b zNlQ)V%dYSFD7-SQy*`gRNaQ1sRJ3#ioe+GIOe-^}=Q*g6@*da1{VT%EBs1|*q7(KP zUgKD5m|~W8bWsGKVY-u1x&vDvO&o#17xjl23ev8Zqe+ua4poXpUA>I!h}@!3nar}2 zFEOzRb#wzC?A-2aLwjWK5!vXo>Cxer>`B~TE3J=&l7H{b*d0g?SDTMXg{S?qKQWhj z*~(*goFj!tB;4QgSg~x>XK^ElmQPZWqY^8p@ul4I*kfaH0%L8LJ43o1e}I|1mf4cbZ~1od0aDn@mLN$sqTSo-Usj669lOtnua8TdrDimn<^^H z7_BEpYijH-u~j6^N_mQ}PKr}CqoGc@VSe6jzWX`lV3lj=p;B~GAq5fx%52+JMr_;K z-soL+=KhMv&rX@>8d(FMrT31QO)7#}Dib>n1j`%ds7AvL@rcOHnD2Eng%iu>;*r~| z@6;@;9GyAEpRroqkCayL_M;c8TXjV)Am5aUjgH!r6mu2ATRI9W2&XwyLzTzz-Ydmh z(YTLJwEE&H`c^)G>8WW9`XnXMBnT>-)hU;uYvF}v@1YEIkhO=3U>7@+qUNP&isiGl zhRo<1F4bO3kd9NOb%M^6j?Mt0Tg$>H41gP{Wm4Dn!XtOiiPKzHZMQ{sLq zrPIz)sCibDUfP;onI~DWRi91X*^i53VU;eS;`k0KG5hV%5nBUoR0z(8l9iE_VLO_p zWQ9@RN43m~EDsl`;_wwFKqr~O!6**@De@|iwZCP~{-O3$Yc0=3wyuzTMYdfo(UPJ_ zEViQXZ~T_p%XHbUmRehpT7dNLI*T#E+J`&g^qFc&dj&4%8oID*ruoi^Nrx7K3%n)g zZ;VMpJTonsvH(}l1^YFz;Q1P(h|)SB9+*fu2GcG_7JuJ2MplJpqcrtgF56t4OwkgX z@(<>%IHEh%;_lPd+D``qR{=OeUf1eKHzd*W(nQL&g4dqBLv!n zGIA4X9@_B1P-#E%V%u8fu=D+;RxCp`um|1W1_CYDr9}G)gulCcj>O% zrz}N%7oY*$>^YOVy4MJ2u7#d@ZN^ouLT>AOszoIMJx0G(P6SN&2&yj@cxsK5@pE!i zCiaq4nr>L&cB*w0MWMb1zp0Y%m5sdoq>^J$g@wiJ0P86>UV>u{B$D!78q6UvP5(Wbr@udgSO=X6ayRo%G+i%M2~BE-doOo>oJ-atcWwTlKOs@d3ugEhK`j3X;sU#$HxtVs_4Ply(mvNet7sl(-LS3o0J zIry$YqMUz$MdwR($+m-L|Nd4}S3z1mwbXz~FuCgVgwOK~2N#<%!Rtd(s(Rx`G>Oqd zDhsP5KmxF(`Am3bW}v+9=j434J$tyQu1F0H9x&ViuOsH*rgV+RdON8? z6kYL&HJFPs&W)-FM}m>cGFNq6e!7z)=tfCiIK>FjeNsZUn#~n75eUp6YO zc!@Zgw!A}xg*)?3;)L50LsKm0u<5GX99P+uwd#Q8!I?(9&d`oT?3MEYyy`VEJ#v-j z>}*6xr&lc`L!V~4ly|FeD-HUN1R-;sDMniU0mQ_FA?}5z8da1pu@cItOj!MbIa#R7 z!aG|Uj?L*CoU&AxQl1xVl`mt(b5Igm@EP0@ydB-5>Ch*h>P~OsVu%kf9*wKyuGS)0 zM;!uqhPcS{L9{(E3;~5y0#u>8HcOhaFby^Xeg6ROTO_rlI<%>?9KOZ65WG>N9HxW) z%)aUj3F+3%uL%?}W*Jz(2(Z?Vsu|5ZbNktnRUPw68yhF?SwT#Pb1G-MsG%`;x~Jz2*XY*j zqJA%#5+sA*k^pHm*)PesdUYSYIRr&RW@J(Wosz17<^Mn>e;^Oir!oD+H~U{K5$ z6JX@k*2>vvPG~jsm?I?rA-H_c?I?e99VF#Y=2JiPH;EIs4u!0hLSD-@JmJ(HR>XcAo@b59=EsO&}~~ zbcXW{u(VNNJqZ%bel^Z`c9mky3nkOH3Z+7qcqN1#FMa`Xl7<+Wo2b(XlQS5Z(?Gir>Cc* zqhoDt?di9proV(wBFdr$j{G@ zfpnnwlLf3v2SkGW#K89dz|;Z@5sCg2DwCGFu+6)$qQt9KYTb=BWzjFH_CMH=?4vjP zFwj0Fmcl4iE7iP&zL4T zd(PZ>Dhn1aTA;gtd-;l$t5!&_UAKON#-`0%Hi>WFv2&ODp1u3_a2-5!_{bsE<0noY zmpF6w+;56B`yfw{a+W&GFc{sHI!NIO|Bn!o|n?6>QZcJU1;l zIhiGBRm{mvOHVNxB%hk&Ia#e?wng!)J12vecRS2?Xy%gj+Op!}VvosMv8T4Iyu3VM zvDaL$t*frCj@X=a_te(a*ViW;?vnN1w&v#MjLWNHPj6d$dwap-Q**tyzq_WuU=0A9 CGuPn& diff --git a/ui/2.1/images/logout_bot.gif b/ui/2.1/images/logout_bot.gif deleted file mode 100644 index a49608f9bce6162d219c6d7f8569a54b2926e1fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7037 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 diff --git a/ui/2.1/images/logout_logo.gif b/ui/2.1/images/logout_logo.gif deleted file mode 100644 index f9e927a6d847eb5942c67775225a275ac0f561e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4291 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 diff --git a/ui/2.1/images/logout_mid.gif b/ui/2.1/images/logout_mid.gif deleted file mode 100644 index 363e36a8bcbb60937212037eb417f8873098e0ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmZ?wbhEHb3}EJEIKsg2_uv0N|Ni~?_y6C&|3TR$p|#!q5mEj@A%RI5Va-!^@80bn z8Xgdr9GI5p7Z?~26&F(099&TS``3I4E%JxI1Y_>N*b*1wkj~gB22D?0iZpY8qNPdIm-jJ-vPX6DCfY zJZ0*%=`&`|@`;}tm$)D;Gd(9azo1C0w7jyqw!X1hRb5kCSKn~$||aA>KdAqH@9u;+W=$A$$5n>mEtimrQx*qB~;c68@;F6lM7Eg7=AmU=8a-ml=? zCF8kC{BR22B;_dCrZp?=>BV4A-BVAle~EWropE_p?CCJw3)`J{O8tGMmUE_7 za_>yu>)Y1f-`~KzT>6*inZxNz`)*xr-#FX8uZGoop3lxrPc CiViLS diff --git a/ui/2.1/images/logout_top.gif b/ui/2.1/images/logout_top.gif deleted file mode 100644 index 70797cd3c430287b93311c10752112b3e446c014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46277 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 h&*<}I&2GEj@VI+i%fLSnU zN`;?2Z)isdKqL!bLUWWlYIrGfVJd#1j8=kISAthrSz2psZZ(2-|NT)#NM9vkMMXG6 zA!Up8%$b!Euf%0@hM9)|)2vgReQ3hjK%ET>_WlLyBM8pmZppV#cg~9|mo^w?YW1cf%yq3E*SH zCvFs0Q8@QQ9TqG0K+ zu}IX30vfQvfhCbh@c<Ns00KFZ9hk;{ zFboj@Oy43v>K!<#43&(DQNjKF`*&zM{Li01qajWQ@E_*zf85;M3?Dy!9P}>c=jR89 zGtA+Cfwd9;jjLA|^Kf(f4OT~g{_aa4K30j7;4DuubD#O9eHh=(v zH9*-wWjT$SiX$FGM@P#oU%vbmDBw{7d?*&@gB>t4Gs7zTFQ5QN$%;d<8X5`#j!|un z1~}~iJ3Bk}0Du4H4FeCbI{p6r`)DXpv5N@`S6JJM0jY-u3V8O5=gw6tsi;))@bWTz z`SOL~*RNlrp++KLV`F3B;o)KU`uQ`%&Fj~@jLpq^fWqHELlK}t1i4Ghgw$1Lg+>A+ zTEvV3B6`VX`z2x}7l!xfN>Xm}Km7x2g!4gdlO6re0m9z6IhEiXSBOf&#bA3g*P zi1PxOKbYXr0qpRMV(McMC@n4JLTR0h_AY4$y1To-jRrQI0X(pW;&Ae4V2^^)z#deA zJsRND2cW5KjKBs4@@-aDR@K2iQ#{lFXsOJfKY#8b2loH>A3k)*Dk{z$P1#f~Hdt5~ zo;-Qd3v2K(LdQlp-oAeQRY*jH;lqayqoG6vARr*X@b1kU24PWAF(CIVs0Yac?Z5vu zx3Cb|zh}>LVAqlrH1Y>3QbxzTNl(e3MKPdJK+q6~simb717tAjF9Xu#DrlMkH1f@{ zZ`ZD11qFp%pa$L1;3FLX6YAwVckfPh^Yq-r02yNa0j2*U52bagCBs%v{X$RKus~%(3TUR$up=A%LkjSJut*pk)22=8#yXx25TKp&S7{guqxg+! zYE7}3DrR+Z671++C!s~C4jMjt5&O)>ng**bQe}!K~#{W zua})+7z4M`9$z8(@j^xO4kCh>N1G{bI5$`Z;M@S>24E?~&4;M~2zxU*m$<2*->7S+ z*jyfSG7yDk(luf>_#I6ZHx=}4x6?UNlSxP1C{I9`U7Kwrv)XN9S=L?PHN+oF%K2O_ zc~L6eZ|M5gY9iqz9is9-A>jYOM9tD9J*v;wX7l;5P}qB@)!6XH+v3EAI5xj!-zz#IjQF9F0rB$=wj?;X z>JRrjCubr}Dp3TX%bdF--~$$c7mTvWcq+{k^pN-owV5fk74DFQbMc`7;I{Q0+iV6#Mn(>R0Ad8v?7#o~`N6`>%rMx&pTB<@SXo#^fXsIQ0R(b5 z2(tl0=LZ`b8w2wY@W4<3e}Mu0`}c1KV5$QJ_7@=j1rR`>z-D>!;K6TENl6A)R#s5* z84W2a0ARTR4(!*@pEJlPDDZ-^J=18g&<_9v7_2A(l^@K&6#hdz_dU8&rye@MuXg3WhBJ0Bd|h{c|}+LI3~& M07*qoM6N<$f>%a)J^%m! diff --git a/ui/2.1/images/overlay_moretop.png b/ui/2.1/images/overlay_moretop.png deleted file mode 100644 index e5865389f40bbcd850e4de2f515804cf90916e29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 970 zcmV;*12z1KP)3>zU5i=VFR zeqiG>8*f(E*4{2IEj9RsZ`<200U@|PI(n)1DHmP)vblLn)3jG+G@3J_QDVoWMIu5@ zNWE60dc97^)hbnwj^0%&l_$3|nNRGJ3%P?Kweq!8nrD&ug_BI0G251Eat;p;sIt5J zqgJauzcD_(+!ot~*z!uvg)Ug}_<|jeH>0zRG#U*$+~23l-rn-)*w`XF^$TLlA+_ok zy1cdZ$h545xZ_Yb9F}&1_-Av5hRAlD`H$=CkK1#hu!&QkkJxynR#;J}vy>yxa%lFK z{P&g>zhuQ?6tk?CGt<*1#FkL%JCl=BhH2guwHWLN-7vV=>8CR@4?9x#D4>BLQa5iR zi_-TsT@TzO=%z`AVcetEQl;9?-ypUGk(xQJ-j%g5yod<6B85t2o3~~)ZGYFD9+8z@g+Gb z7K>Camrq72m7@dSj5|;8PDJ7xPDAXb9uKEd&7B~8i&LnzBLve5 zu9RLa}^V zyI3roCAJjLQ-ff^TgKUr!|R}~mT?_x5vhTY@LG?z$Md(0;{!Q05L0Tmm22y!d8%a` zqy~ao-Fo5OwfrsPuucucq@5mzG|k^K&PAjKB0JsbuGQ5t4yzwP==6gZjQ*B!c=QyA s?6jBOg(6n;z(A)T?wOu9$8P}!00I%>pK3{%2mk;807*qoM6N<$f)MJ(0RR91 diff --git a/ui/2.1/images/pagination_bg.gif b/ui/2.1/images/pagination_bg.gif deleted file mode 100644 index 9405e827930ae0575c1e40a6581ebf97ebc5abf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmZ?wbhEHbWM+_J*v!E2|NsBjuU|iZ{`~FRw{PCOdGh4Rt5>gHym;~W@#A;z-aUKv z?B&asPoF+zfC0syEMTS%hy({R;Dk|aO;eY=8;o#t~u&|JpmS$jJ z5EB#A)6@I-@uQB8&XFTW`1tsK{r+|S{P}HLw;385mXwt6^YcG`{MgLQ?D_L&OP4O? z;^In8O+9`3w2+XHq?F{|J$u>M*fcdY%gf6jK76=i`wnGgWg{aa4GoRYpFeYQa-KPJ z=H|_tH?H4kZEa;?VM$C(^z-vePEPLX>f+(y`S{_ZjEqcCQPHPQpA;1pXUv#kV`HPB zpdcqFXKiiG$jCTx;zTV?tyQa5wY0P}Ha4oOtN;Anp|2FJLX^=E*5%8(|Q{rz-2^ z=j15HC(r5bYA?sh{n^mRSW_~X@$+X^q)Y_{YXH>WzuW)- diff --git a/ui/2.1/images/pagination_lasticon.gif b/ui/2.1/images/pagination_lasticon.gif deleted file mode 100644 index 41c48de8c3608435fef32a3526992f17fc78986d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 636 zcmZ?wbhEHb6lD-&c*el+|NsBjuU|iZ{`}ReS8v|DdGX@K%a({R;Dk|aO;eY=8;o#t~u&|JpmS$jJ z5EB#A)6@I-@uQB8&XFTW`1tsK{r+|S{P}HLw;385mXwt6^YcG`{MgLQ?D_L&OP4O? z;^In8O+9`3w2+XHq?F{|J$u>M*fcdY%gf6jK76=i`wnGgWg{aa4GoRYpFeYQa-KPJ z=H|_tH?H4kZEa;?VM$C(^z-vePEPLX>f+(y`S{_ZjEqcCQPHPQpA;1pXUv#kV`HPB zpdcqFXKiiG$jCTx;zTV?tyQa5wY0P}Ha4oOtN;Anr|)Z9{E!h=)J-qoE`o=?ot z$+qZAuy?gim{re9eKCrT~ zs;Q|dDJd~9Fc=#fb8~a^@$vEU@_zmL_4)JX92^`fDk`$Fvf<(3Qc_ZX{`@&|^baZq+fByXQ*Uw+Se<>;|Zri#|K|!Ihv5}39O+!ONPEJl! zQZ@*49=bA)zy8&M-1E0zEh&K=CIF*j^nF35pX2_9G1p zP0cN>ZS5VMUEMvseQm)){mp&?hJBLCk^#KDZo(ZxYPPb{9s)dqT;W_cN-Zj;3S3;8 z`Xc;-auO19LHwTV_6Fj*3Swf?>O7)W+}xrjTA?D&G9eZ&+=_hSP7d0tvR-^f)_TS= zOg#SPzAT&{IT`KbeRKl7KZR)sbNpxcpULr2(Y>L8nNK6;#09sB3Ou4xGdwmv666)t w=DTrX<6`%IMyDS-o}R diff --git a/ui/2.1/images/pagination_previcon.gif b/ui/2.1/images/pagination_previcon.gif deleted file mode 100644 index 01de674a88348f7645915de79feffc16270f9e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ?wbhEHb6k!l!c*el+|NsBjuV24<_3F)=H!ohic=__>+qZAuy?gim{re9eKCrT~ zs;Q|dDJd~9Fc=#fb8~a^@$vEU@_zmL_4)JX92^`fDk`$Fvf<(3Qc_ZX{`@&|^baZq+fByXQ*Uw+Se<>;|Zri#|K|!Ihv5}39O+!ONPEJl! zQZ@*49=bA)zy8&M-1E0zEh&K=CIF*j^nF35pX2_Tvo< zP0cN>ZS5VMUEMvseN95a{Y{1fe*MC3yu1OD%9345HeBIcf;<8q(z3Q{LM`l`{6TUO z5^{q4BKn$KTneTtP0k{rS|+00+*YDI>e6Cj3cBJ3_A>!=@!CCu;<+GSOVH^z?LtM6ns3o0s{{W+{4g=j7yc1qN#Xf0VaZ diff --git a/ui/2.1/images/pagination_refresh.gif b/ui/2.1/images/pagination_refresh.gif deleted file mode 100644 index 3d95bc0472bf1d630fdc3986fe6557048f350788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1147 zcmZ?wbhEHb6k!l!_|Cxa|Ns9NFJ8QS`SSVm=dWJ9dj0zKhYueC-1& zU0p9PuN^yf7#bQ@S66FlYD!2*T)%$Z(b4hHp+jnFYHQZ4IdkUBiWMuaUcI_@?b@WI zBo!4ERaI3J6O;S*@AL5RynXxj#EBE1KYuPSFK1w2`1$kazkmPq_4V!T>~G(`ZEI`0 zY}vAF*RIvo)$#K1{Q2|8#MI>I(W4I^K0I{r5HByUzrX+U=g$NL1a928@%#60PA)E8 z9o;WqzC=bwT3T98n>I~dU4848tvh$_OixP}7Z;C@kC&8`Jay`nva+(dxp`4hQDITx zv17*q0|O5pJXls%CM6|hXka*R-aHWz5k^MFlP6C~OGzI%aNyRhTU=aRHa0fCzP`tg zA6HUVe(>NySa{f@M~^OCxF9Yee(dPc*|TTo=jG`e==b*aHZ?VwnwTzFus}veCO9P6 z&dzSqq)E@7J=4 zHg#H9SlHsli(Q;uR<2yh&CP9OWc1_5kG8fp0|SHg>(>LrY7~$f0*XIbz*=-bBq&cX zaQtUrXtW_~DG&?{b6w?)8cap$BKa{-G-!Ha#mMNKpW zloSuT9c0#0I#@A5k-3GPSIVb}@ew~;lc$A9l7J#Nw-~qBoSDUqJ`-hC*uts~Hv5Xm zBo(lHnvl%O$`!5gQ<1@;Ig&-_!y3*{99+wU8Ce)MHL&(5GP8e>vj}M55VweBI^nUQ zeElMQF`gv{6BcY_WSS7bA@$j@kLfroheF2VWG4nz4j~Q?!R5^Df~77EZUVn}d2OeC zE16)l^dh^Ka!ia=$|CnB7Q-Zq1ffIC)6~noLOK|d4z~#j{+c1N$ib1(#chJa4uMBp z&F{IjLLznusGVQP^n!bd!^RUwo3sR^QZhEU^opB^U0N=_!1)lTvC)bN9=v%5N={WQ zDk~l|u~>X)5anapuz*1%EMp;qut(FuRwkAQ58D;mBpxxS@D;dpYAlOLa$v9q0QZez A#{d8T diff --git a/ui/2.1/images/password_nonselectedicon.gif b/ui/2.1/images/password_nonselectedicon.gif deleted file mode 100644 index d051c44a22b85d037a5f01160613ff6c6b9d5393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1014 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 diff --git a/ui/2.1/images/primestoragetitle_icons.gif b/ui/2.1/images/primestoragetitle_icons.gif deleted file mode 100644 index 342771d672b6d688dbac171c19ae85f65103c3c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1704 zcmV;Z23PqyKtMnuA|k=T!Q9;3;Nak(prBh@Tju8G zadL6W%gX5J=v8L`k|_b?(XhxZf?-f&{0uQ%*@Q<;^NcN)B5@Ps;a7gi$fh9 z9y~|@A}JwC_>V<}de3k&aySpeVD0Opn+S=MJD=lSgX4KTwNl8hKs{o#!p0%~L zm6n!KVgT~+^8Wn(TW$cXtgJFJGk}`_>gekF`1-iGxTvV8ii(PplatBG$?)#*uCJ~# zEiPbTVC?GbV08fC-r&;E(mXsoeSLlQ_V&WU!aqMhy}P})x3>ib2bGhR+1lCK*xKLS z-x3uRMny*A;Nslc+$JU_S84$8@$l;F>S}-hFEB6Tlq;?d#Un)`Eh9 zh@}9juZsBi_<4DGwYIg@)78(-&(6-yjhR%kva-y|%*4XP^Yrrt00W$woT;j*zreqj zrc|4}0K~+^Vq{|F5if@>gwo7NJ!e)*zoS| zjf;&(Nl5XHF6HCn=;!Gb5E0+s-xU%TuduK1^YE~)uroaXU}$fncX6VjqOh>9V`F9| zEGlPcXA%z*rNtF&Yix6KbpO&Zb#-*x+}q*d;pgY)acOQjI5|E$If0Ex91|7k=jZS5 z?{I?|s>z$pQq^pCeuY!Ddc>@p@Xnp{*<^T_)00O1PvjG4`nqUiL?DFLYiHN?7I(T6~g-j4K zXho431pqN(08fN8j?r#RA6`Oa$dctDhlx0(7zEk#=>-4>RQ7BuEfs(h0ESioP;*IE zni1N((b|APjy(}Q@Vy{%1%Rj^FDh04JPp9uKxIV$oC@?OhKFnzROrCr2;7S+gqi># zcb@=FhyVzofItH%f)Ncd6oAAZJuL#qJ{C~o4j~Cxl0XwpymC=Q04M?m09`Z#KzlK) z0EI1?bWp?-XcTckC&z>nO9ITyVgNx?L?jFj07#(1fjcZ=1pqc!0EQY&pkM|tRZOzP z1Swbmfk5L$^p0v3e7Hai+5j*B1VV(+h!cEN5yBP?k;Vg+!>ia_-=AdokI zbVWa4eyN3PNC!!7-eC0|5jXa3P|jh`k{V09nv51|TDh0LKM6 zEI>mGE&PFj4U?#0K`O<*A?TZl0Wib@UC02#PMV~ogBKQrpv4o%@Q}d)Y<#1DxZfy) zix@iqz=A-Sw3F;WD@Y-P2b;(d2PZaoQA7zHfPsiS^weX4GZ5Ucfuj-Ca)Sb)K)^#0 z9r!ZM2AOQI0SI-Ju)+o=Y|>9T@R$otE^`RP;SCd5fzBNj_#nXy2%LR(+GsaWiaDsb z(ZJjl{IZPK0zF`aDizR$Q40kF3~)x^fe$V?A7O-%OfRMs)4)8fAW$#>Oc?RN9ds~3 z_!@){z`5sE@Ik^kpgf~XKGpznw?K`m;zl(S@DX|hNf<#p?Y7r0fdtshF-`;iG~h!d yo_H;Y3F-_o$O&j1a>x-J)Brv7(nqgMHzz1T4Kep1BaSm|$iPn-5|uwtKma>c-xs0) diff --git a/ui/2.1/images/public_nonselectedicon.gif b/ui/2.1/images/public_nonselectedicon.gif deleted file mode 100644 index 17c95c9bfa5d338e6bb1ccfb1125ddab8c01e2ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 906 zcmZ?wbhEHbv}X`xc*el+|NsAs7cahh_wMD(m#<&H{_x?$-@kwV{rmUr+qWM-eth}z z<@fL3pFVy1_3KwqP|!98-nzQFHEY&fzka>GzJBG(m1obMjg5`1t*u?Xdi9ehPZ}B; z&YU@O>C&YYD^{F5dGh)5=kFdpK6UEU^5x4jGBTb$dv@W%h4=5@7Znxl5|BA}?%eU? z$M4;{_weDvg$oznxpQax_U)$wqc(5ee5JVR#fujoPM@1Qcka)hKRY@)o*X#5TTu4? z{rk_h?Y!OAvv%#;t5>gHxpL+F`SVANY#wjkcJt=Vlg_>mH*B6ZZQ9qDuU_uhb9cd# z2M-=xE3LVE_wJM_Q}!w7>{ryiURHbg^5vgz-`%)zW9rnYU0q!zB_-?Dt=qYCC&NGh z#h)x-Yjr>*C{7sI|2Hu3YBRRBwRd!Ob@%kPYV$I%2{AKFn?7Uatl4ws&YQ+8#3rvY zf7$XCb5-Pp%vP?S&(3ZVv}yCUS!O~qY}>Yl^Bok6*tbnpYTt2oDb=Ir*xA@DT`mUj zU)+0?O@{HtJzLw0Dq<@4E;>lvd-3eeJ#KCrej5*d@AuqqTfhGn6#Oo%8MmjxJkgO$ zTUbUybHbv8ZbfdTh=L1A_xG|%G(V{jdctvxP3*qtFApQ8sa&EevtG1cbZqA0)0(kD zXyKt2HeoFv$%%^0{*xqxIqrUZaFB1IQ)7}&%NETxK>-Dmi4z!@*%tB%1?W@PGDeSuxA*t=506jx>o3^%_xGFovpXIsG5`C|z^3t_f#ufpMsBVG17=1ZvlkDV z1>7_qwul&6Ftc+p2yk)B^E`OiuF$6Os6%C%$0K%~fTB(&s~-JY=-{_X;c!r3 Gum%85dV}-; diff --git a/ui/2.1/images/public_selectedicon.gif b/ui/2.1/images/public_selectedicon.gif deleted file mode 100644 index 156b79339fd4454656e63f712e8b8972e295459c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 901 zcmZ?wbhEHbv}X`xc*el+|NsAs7cahi`SSJa*YDoF`|#nz-@kwV{rmUr+qW-YzI^)h z>G$v7KYsl9_3Kwu2V+oBP+eW!nl)>#U%!6#?AetoSJv0pKY8+`p`l^*>eaQiwXw0W z%a<=db?VfmOP5xxSaI^?$unopJb(T?BO~M4vuE$$zdv{G+`W7Eii(PkA3uKK!iAVl zmMd4T+_`h-;lqbluU_rw=-9q}`^&eFUc7iQckbNt=g;52e}C=TwLgFUT)1#yLJ!yG z&6_V@zFam(H?EsKdy4e?PcL?yp7i(MpD9zOl$4Z|&DQB%6F7foZuctxr>}1p&QQ5@ zf7j37-*)cYxoA&8#azQ>d#k#-x^6u_@%qh+2M-?HxN+mbvuk(n-kr5AIj)O+-Qkuq zH@2lu6ix2qzy0Lo)0g)%CW+mDe*WT}J=3O5d-Uv9@l4G}&#&(}JNw)BFNwXp>(;Hy zpRPE4bHdcAQ$K!wbMxlS*YBS&kO&livVe8yfJjiBFtGn`VBl3_Y;9}r=1|cx zWndFxVwg64#>`o>=ggfqjY)`2QF;Ed*Hvn`y0 zCKGl{|LEAv$*(q{K`7Cwl}%JFKrrzj)7f6>`V^bR$6_aGSQv{XIc(8j=222`5Kwxk z!M2EBqM^Z|)|PB(Wy=W$Cm!`3pS{kNTQTCa7$YlJ?xVYhTt6@{vU6m= zzvs%(c=-0#;73Xvj}PCSC6OT`(5W~hcOlCJW%Uma96vn~=Pa@D`0(%`JEOi$&4~#L zhucM!d^ju?9xh@sj*(fR@hHJt^7 zN7@aWAMdnM?j&AJvaM(kW#Q_O_useY=jRs}s|z1J@T~f%Qnq1(!-9Q(fB*RW`u_R) zGlH6buBJ0`bCxI^X5dg;@t}#v?8Sp-0VNG*c1{KXFK$JS1rOU~%3eHdS7_r%;?NB! Y@?I_ObQC3@iBM@HdUDkDo7v_P=-j7A>X>K6xxz%$j`gm@s%Mc<(Z8@X_T|GbVT@*mjvUSh3l3cx~}T@>8=b zd111zm^9dO`KHLlDJZ@wP6IX^eke`?4ir0*1E24T1&bq1-eX)))XbS2`xJeSHERy@ z7CFI7lXZu;7rM`h=KosyZ{#Yt<&u}55F4Gm-<(LKQsHn#xVs_<8XG;Yv{VS+ud3>; zuYVAUbPlA`uB%imW*F7gjx*FBkGBri)MT^CWM!q+Wo1&@c1g+Yu1v->Yipy|TcQn3 i4IK|}-fHI$cdnh??YY-iS7%wFP+RE6aC!L@eg6RdZ$qB| diff --git a/ui/2.1/images/register_box.gif b/ui/2.1/images/register_box.gif deleted file mode 100644 index b03f541bc2223d863e64eb09698d67d151106dd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2016 zcmbV}=~q(+0>xhz5(pq+F<=x05sH9LTv`7Lhix{U6|o?;6$@;F5i@MlTag7br1=;j1VU_D zE21((%OGrqkwp+*w!jlw3uLpsTQ;lBQ1`rHL<4rt>A_Fq$gIISZ-TTIq-Vhh+w7wn zaL#CzEEtt0XmHsqUo?GuR+yln6|>d?t4z?O&hlKLR~R8Zgv^_vmrBFHl6h1ME}CHw zL6$7A#tJKpR-4T(o;RpL_|2l}?UGpyLNAmCy%iqTfEL&$UN9PAq*rYk(^_7uO%poH zoWZ&XLMtGwG+LELXj*5{SdbZmby{yxo8iF~@RiaqrMC>Pm^&4EnaZe#V1>!rr7#$* zh*V`9(}Hs*>-!aOTxVIfKw2xj1i}Ug5zXoCc02G_bpnHBKXpqgm21YZiIZ>(^NfB z#VDtj(EqG?_aNa9#Z87M4RbNzNM&N`)VN=fUbQ8dk3-$X6YO4ze5!x`_>*+KYFzrb zezJpuab6$S(lFh{^$bmtwKRU{<^>!ojca{0Cq1{2#DxG?^ydyFZs3#9^$jOo{DcL} zKu3bxnN!lz!%v!*Mq7SXPxL-{yfP`ua^CRe(-!Rq@r}^$UO#QsE9K>fCi71n%yV{& zIKbo-E`AeI3S@S`9??^{G0)cw&z2j1Q1qy+po1=$*4vtP_P&>a;zZJ(cU16FkG+bSq`%a&V<^=1Q1{2ip4tLqp9T zYy93HKvCr!f-hA*bDfIYJj;tDrOp<_kR54u{4T+^04$1;5OdrqjGsdyuj9?$N<6zT zSH#TOTv>omq2L@+gpB~b-LDV@km<}U^!J0Q%93!VzLR3NlX*b}x7E1_B_t`2JVb*yuR1cd5 zS?b#BUo*2XsR9X*&aR8fa5+B1T5J>tJxIF}k?yy@f)&sE8mJ3lc9NyZ50;w8&aRy# zZxM`$(B8>H9N8<5Q~P+aS-t$EqV5fb??}}sDhVzb2k{z{dZh!%ZGGkBndldMtu6w1 zLGTrmHC@E$ux*!n2~&XGAv1{4*-GItpTF?S4bzFi+LPNHJY0?g=&y!}7zw32Y=7u??VR1&Y*}l@1wk^pVb=r#dr6KF1x^2PXj-6XF z4*fg1B#69;?P_|TQspZcwiSQXJi_kYvWuHmzYj}D?yEIVTo~pGr$TZ+=@ws0=A61m?%>dR>mn{pzfiTg)t^l~kVPiZk zQq?rH{*gSD)uwY;D`==&65%&Ay-bbaM>*BjXgLlTcq^=zp9yW!4lLLGXc#_yanZnP z`6kd+y0;#&gR@!T4H$2MOIooP_d6S;S!sRc?cmIcNq?Kv{>oWvUb$HEw}b-(4xi(= zIs~IQFY-v#bl}3-hqkh5u3-!+=?6k|=qSp4-XL0azTqGNz^n&IX*slU6h>&M4MSQPg@G1rF=+-5p#zD*?y+dw}qd6aKkc0|oD39Pwav=jnyi%;B1&MLlmT!;RI9{F?YG`af$m9K6Th#jIoPkK78g`+YWm zn;CPR+!(J9>n)Cwh=}Kd&27e7cK(AzC4H!E#8{W!tNzFEQGle0#|Q1%pMW7c0(<`l DsvjV( diff --git a/ui/2.1/images/rev_wizbot.gif b/ui/2.1/images/rev_wizbot.gif deleted file mode 100644 index 8a5e4bcc2d16f9e033e695f37e3d9a5aa9966bb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 661 zcmZ?wbhEHbT*xfUaFv1K|Ns910Re%5f$8b#Q>IJ_2??1xb?W=~@7vqkj~_q&>({S^ z3m4wFaU(M`v$(kU!Gi~T_Uw81@L_Xv^U0GZqoSgoKYzY+=gyRrl)}Qof`Wnx6DAZD z6}7guo<4p0$B!QqCr+F^d2&QV#J6wXUc7k0Km(xolLc(54u}N#iGl6E17m`Rj#U4N zB}FH5tma=>QR1~WYW^WUca~CXJw0OzVWy@D&O9XogJ-m`b|{Cx)x9X@jO*m17|Cr+O^d+z*&9!3$Ri`TB-xOwY#xSS%d z=$%K8pFDkbP??v5^ZDC%?>~H;%E`gZ_UXsZU%&rkvN1DAev$Uru;5^`vqTJoMMDEq zi-5A%90^}Wjy7I#nFS{{E&SL>-S8B3Oi%+1=m%5?RWwLYvBwOnC3 z*EhQ#H4Dw&rV+M1e!bMvSt8kYcjO&krFy#b?cKHY7tg)rHrEZ=9ejG-)?F4kw~ps8 zcADn%Jtz9Ww9k+3>Qv;U9jeleU#B%=Q`-7QX>mK5iqbo$7P5Qm{k7D-dvS}Xdu{cM slEj-kmsdUGF)J+G7uz`5?d~t_yhBAF-RfdyncsTGWZ=Od#lm0>09k7-f&c&j diff --git a/ui/2.1/images/rev_wizmid.gif b/ui/2.1/images/rev_wizmid.gif deleted file mode 100644 index ee96e49222aea68a219dacc8f65839e6c1cde57d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmV;G0BZk7Nk%w1VW9&D0FeLy|Ns9`P*71(Q2+n{A^8LV00000EC2ui0HFg10007J z434SG?GK}zwAzca-n{z{hT=$;=82~2%C_#?1p-Xh_KoNI&iDQg3<`(DfPsiiDwoWr z^9hYgr%%C*ip^@b+^+Wv4nK|JviXcotJm!Ii|mfe=k&V$j;F!%{J#GW7$`^;Pyhfs D8_q{8 diff --git a/ui/2.1/images/rev_wiztop.jpg b/ui/2.1/images/rev_wiztop.jpg deleted file mode 100644 index bbba6d0e5cc0525552de238270ca2bb5eac540d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22700 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 MqTMTJ;``Zu0RU4TtN;K2 diff --git a/ui/2.1/images/revwiz_backbutton.gif b/ui/2.1/images/revwiz_backbutton.gif deleted file mode 100644 index 3b2629021380ca7ff9cc2e1aaeb61cca50e86ca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1383 zcmdUs{W}u~0LMo|Nm6=ZIG5_2x0Snu6Ftn^$jhY1ylup6I5}?_!_1bGx2$p3v={Og zo4hQiSvav2>t;{xrp04D%40Km`B z&)3&CB_$;^G&C(OEjl_H4u=N^2cyyGfPerZk%+}&Gcq!uP$&w8!r^duJU%-+J1i_L zHa2#5cQ-CBE<8N^(xprB@$rFyfd~ZR;>C+OIXQ`miJ6(1K|w*q#l=ZUNqKpB1qB5W z5fL#lF;}i!fx%!T5@}~=r@6T~IXPJ%5OBHN@$qquMnfi($HvB{rlw>vSx898^z`)S z&!5$5bzfhfQmLGqn2U5$erC)ZZHd&51W6WzReL5CgbR7Zn| z@!~0c?%6~&<mL z$}QYAYvDqL06nSPs%n~~yQmRn(EHYGU6`>CBk(HgPhEH~WRZ8)9^QfM##QV0v!i;W z2Us2gXK$iG`mV&9tUh{5%*&L|Gh*PUC4=e9ON*5zjtCxBZ6^~@Go^fxp~bdi)MlB0 z0>&%_4Q$G$=;yGyjQpInskVUH@lKG_E3KZ(4cCJo_OCDWVGfGG<_}a$zvVwUijQ&K zm_2+l4Js`BSDRq?V?uTYuD&vF@x~6vs^2MRe|J%xA9BxAEr27r8D2x5wiL_v%T&yw zoo&VXLUCO2F8;&Ep}Ug8^*{6)@tZo-M#4HsDkT~D*}S}V#19H7HGxoHUIXQ>N=wZH zSMO+9K_Wf(>9piERXFsoChW5rHf^qSn&BR=wh<;bSDbkbT?Trl0#?XA`W+=?W7GVT zyOaRSdKB5$a1B)ljfh&I1VL<*$U*2e)UD72*dwax^(eGX0;RsKKAAZnqoSHXnEI5_ zeRpYSPJo<|wK?%E1GChDVVY{BBX_>CU?uC7A7`yLlifr%E#)Dv+gop(pKNcrnQFGy zRu#>&ZKWJ`1Zuapu~PT8b1DezE*9@KySHsJ^&Usa`mw8f%g(-YaK=nwXty_B+56O* zt>ip&Rw#Sz-51jOoD!^LS)VKGzixl-bSAP3K*MPjA4SqO3`F8Y> zrDJ^e(BCr!s-aIfk!sjLvp-`*^M-wTSl3vrdbGzy={UA!wxO+a)@Q_v4?G%ExG`>m zsoHn~!iqDWS|+-4CXUgbX+5zmcE}QdYYMXjXAPbc_wHZmd?$2Oh_k28>m7J6+;4!$ z5&6qC+0T7kz(Jqu6P20Mg#(Oso-7pgQcPm2ehRn#+KVJe>O*QB_wsxwxrx!>TTF>kl=mL{n(um k86ErPqnz0caFaLL!+2{AxA31<8QnrRxtquXdJJ&xAFH}=e*gdg diff --git a/ui/2.1/images/revwiz_closebutton.gif b/ui/2.1/images/revwiz_closebutton.gif deleted file mode 100644 index 99b127343a1f15bdd039e98454cceecad12eefda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1295 zcmeH`=}+5r0LH(i?PzC#AFPlH6W9uj>6EhI1a+eahXmJQGz!{iXE2I!0TU0<*|cRX zOa>XK5oR)5#x*yf8%!5e_?4BdfRq9~D3sE>rFToqedzoneC6}vdHZ?tNuI)@g6y30 z1n?wS2Ox?>g-F!>{r%nD-MziN?d|RL^>v@mx3jZzv_Z1AwiXNqx3;!C9?!L@a1e9P1p)z`PN&!F$7QoG&>2Rf(QdcfY&MI#wPA?&`m1Hk-X(Z&U_#X=%x1GRc+dGi{S!)i*CM zFMn`r=6O2fhll#w-!)dZU#V1fi|#EfEZiL$A+DGy|E_v>?Nm%PVMQ4~C9)&_Ntxy|R+?~Ax9k&O(Uf;^fO7YKA zx%7^PdB2e#?NWF}IYho&K90+ZkNd1gEMX&}$r1vG zD&avf?_QHL}UyGWq5!|KK_M^P%Gwvq8YSPo=)n)?L{2qT{L%iAI5!{svP4 B?2rHe 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 7e528887e00ba1e5d021b12ee773dfa43c0bbe21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1297 zcmeH`+fP$>0LOo)+=^By6idMit$15xSXda71wBO&7)h;c*(E~*8zZ=Eu`@)hZcVvK zMK_DO1@%GVs7S^TK@I5CQ-%Y%)KhHf1x|ZTPYb2@miv8k|HIz)efT_n9zMx8E9dZg z`wLkh8q5I@#!aVl)7RG4R#sM4S67#omgeT>78Vw~UhmAzjKkqrUS6J`pI=;DoSK?4 z8jWtZ+wb>JPfwf8W}nZ8<2bVmo1LAt+wC@+E$-kEtJUgqxtva?$Kx3vAAhMFPT}W| zjg5_tj_UP#k|ZZ4CM*_34(q|s<}I$czk5!Gl-CX>ANfvBd=U@)AO))53TIXTJf#7+&GmBX55y|uBWBkmxd z&OH=&fRByaE}}$3bF0lamEMgzT(06l>+Rp#KI$c(;P$r8rzgc1M6V}bDpg{o`P2~E zuT-)BFsjw+*eBSXdk+RMbDzPKgy2nWk6x*@?hK@_i>w*My88w)dkDhrbbEZSUXT2&cO2<4 zz01!p8n9eanP2n|kuDEPPDFKKWz|2KEmqu2Hfb##kDuG8W(`gs_<#Rd0nS3;zwY=q zeDeuFT?3Z^m0rN+Re*^0J@wv#?s7WkYbh@-MD9F!y=DAq86eB(hN#O!Cf!hBi+2`8=WpsQ3;|sFh!S$C~6oCX^g8p zGP5=kj%iF}NqQ+Etfc(6kMep0qCU^*Oa87Ph!^)24Hn3ls_1>6#SY$QWK~h45>h27 zz%!wBRCX!C&Axb@u~R%v_^pb7t((Nz4HUQ<3X!D=1@I1P!-fyyW!K@Gr$d8|0a}*~ zBvZo9Revh{lIXA5u$j*`c{#a~l;AVDQW!e3jmx~T1G=KfDDytDi*XgK?iSQqJ{qiL&5`NBeG@4<-eK_Jp!Xiz7;PJ@- diff --git a/ui/2.1/images/revwiz_nextbutton.gif b/ui/2.1/images/revwiz_nextbutton.gif deleted file mode 100644 index d5f63570d08fb1f816ac966426f52b92275c0871..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2733 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 MJF)^ONg&|zKfX753jhEB 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 a79472954531e363482fc8e846d09fe9f749a1a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4481 zcmZXRX*iS()W>J;`<^jFJlbuQmZwMgTmtE&Sr7J#}rsQnM9X$Rq)K&`Woo-2fP1a;3rr(F;xeh4FPP}c!rb`d;f3u+Mn zRTId-4La=%p0Yuh`a^gx@T4`MW`;1n02#OgYNnu$J%sm!u;&4cC2+zRGIWOwJrKse zkO2|Uu!i)UK@BVLqz$C+ia6tgGz&x+c_GjEAj|@grv3;cPe8*8!h0Z1{6LH)(mW7Q zHG}kt2qPbai7(>J1>mGLh&_)q@ddO9poR@_!UV*ggRtj-lQu}>3&=CxNb>+d)f77I z1nM||7%NE61yD1G{+#%uU;8YmYmYR&2v;>l7`P)0+yEU1q=`SEX@|gj0NVcmCv5?( zvnYocP{R_$IRSroPue2Q0^lc%!9Rxl5wGh2XxhS6O~6yupw2%?V_$?m5!5Ci3_Tzt zPsAB-@Q-80evrN!pkWDDGXpeiVE-=;Zb1LnJMq8ue}4iK6D2@kQWBJ!mYPCJPR_{8 z$OcIT`MLRpnI+_`!gOj?86~AUFE_8ayqsFvP+G)fH-WIWHlU*o4(n>?boOxhuzT&j zeUI9C1A_y6_`~jh`-c1PKYKAT^6$vl@Wj8VGd*L#)a#eRIquT};oZ5O z{G%Iv;oKd!2X7wR=O0qEqk<9NpWG*}^sM4+p$JzeLC-iMteW6k@{WbiWBq`wp&jO` z`wTswX#aTp=v0mItur~YZn#sWgxgxBHy<+97e=xbM8^5Hyg~Mp5Ja_pcMZYQI2*&7 zXG;h?pB1QY7po+$F3t(O7h1Maiu@;;Fje)P4|fOoclqVC9G3a&<4esPs`GH&wZJPJ z84tSm!v_DJT$$JSyBynKU+}7YH7=xCR--x#-q45RFW5)hrV+=Y9l!K)mqI{L@8h)q z_M%`|Tg5We{ms#8^NaVM#=IX%JN4tWTt(elGdJ|Ljh^%Ernl3bZ>QaHc@J^}+A1D7 zy6?U5w#dYLGAYxL`{~)N4!hmd5u2@Fc#G(`-AqB->zvHo1?(87LiK30=5G84Q-+WB zhvx4dK0WTm6%m?4k=qg{ht>|b12P?6nh&W(z9OQ{qM0@Mr#{0uNoV}szxliEYM*Mq z@;*F}&&rD25$Yb)=AdRP$$G1McQ>@xgZIhd%@zCJ_5(I1Ls1pvb;;{q9y%oDLt!CL z19K~j&M)3hS@rX!B}P&D6*4H^|Iwm^>ydL9+3W8P2WVVkJq`5SpT0=gpljuZRRvLe z1Go{pZe7c(k#){i>odbMX=N^%;f~)IFQ$tJE)eru1Y_Z~$k>&^djMBZx0j^yVy z+q2m-r$WoWO7TK#mP`EaYQMLAJH|OS z{kMDiCGD<>4)8&mQtZHqVui9x5hVw`5B*kl(*f%QoXiqSzIlN9>`zwhf zv$0BmnTz{`=520Ocb&|sE_K&ga68o)6)jN+d)_}tvq2mSxF*m%{E5+P&f_WTBta8b zJLzSECj(9$`gxhpXABbh#Mnsf>i)mmPfU6jvkyAHDk)H%3cOoz_$4ZP=-cU}bf*hr zv1^~!W{{WNGxC=0HpeLF10n4R&eRZXXm@7$3B*<%vpRTZNmx` zAAH5~Vcp-J6mS0}@zikU=hs1}_?tf_f`@O4zD;F#-uwP6X@HEGs!=$Zj6?5@tkF3Mc`-FG&Z_Xx3 zy?QRWkABSXTj_Azo?U3zZl=+9EP;f(RwZStWP+X|q^kW_1+NG&+AB9gS#qe}_ddW( zA7`I;XtYwSP|0%N)Ke)7l9<}8(Ka9P#M0hTgjNkp!c96!MzE{aAd6*tu<3c_Z|WVh zEakI>Q_tx@A=5%X$UYG_c5BZV>mQNd(z)WY^L0KEweIhi9PdAND0S6pFsKN0rQy<# zaCZaJCE&JvSQ7UPy)lff;{N9Giz6$Accc4)JrNR4J$s6pq$id=L_rhxfA4N0n}%HY zYs@n>=4ck|QFpw7UO#)D?tpQOIT+n-a@cBf)fmustMuYF+ z16ZL=YD+<6!#gFg6S}g#n$J>rC$py8cSSl`?8I!MMvOqp&!BamFeFihu_5leKfHYC z)x6H5Nx(NXymXbnpf_{l$^Mbn@*%wdqt?kGKW$Cgmcj?am!(fBasSbGe)?egt@8=h zU-Q`9GfxUG8OTy@B{QY_-$soOq&9Rp2S`AmSmfZ%s z#=DBXv%T5DuAJzJ-X9TnZ-{P&_=&}c4f%JlD^!DA*5oFHsn^?$-Gd}7eBgJGYf{sg z&wJXu;1arP@=q#4ueZv-p7#)Rz4;Ux{XqWpVn^h?wSAZ4W_YiERO$$R4Sk7z%bWSE z&Am6HzY_gLaTYC#ym#R9XQLAWxJ;y=PrdOVty9NfHAnsDyt-)ZNlx6Vdr$1EFL9gQYrmEypC%ki$3tcTu=SqH$zS4oQ18`y zP$QnuYOCnyVp{yx&~V(Uy!Y>~9MSrV`1sXt2Sg&V_${aS4fFV4=5dIUgeCI?Fe+hw zE#c>j1Q;`J_9A4ah_W4l$xgtwk3id{;R?*eLnx9YJyEd)@plyIurulC1Wd`9wEqL? z#5zfJopi)G3BweTuu4g?QArx>Bts#|NJ!GZ&Q<|gVZCF3lTbtYgW7;p{- zY{w&xqiesqQjx&wvzP-PG;5sRy{J0TZc?QK`YGv~Z==%j=2G z0jXXVX@OB`!Afa2ozvpEX+Eg*SZ?aMgp?Zr={^(b0TwAqVX%A@P+&nWvLL&M!4z}J z1xn-!C2}d3TxmhBTqoB!Qy9ABawhps38nf2`4*SbD5S8RDJ@ZyHWcM9Dubs>xio@o zkjdy~l6!-gqbgt$RkS7I4Wx*J!?2BYvzL} z>xnRHRyX_2de$&AYb+{zNjLi)D(iJg_GhJ>?*Z9!GC707>~)!(WntDQCA2sl=72$f zXfX(zE8dywDaZvUb0uW+#9?`mW!^63JQ>SeBr8{bBiC~zPl24fS2k}~XPzWFUy=N0 zG7r_6cf2$gp`0%hn2#>aQ)I#N6JWSb1da>~8Y#d}78rIG7)=&jz*9{p3-rh^^HS=C zCMtmpvmT%l!>G2hR0mn=1q>C>LOPKP-LZwlCWITB>NHU3ho)XY7nyDp>SIyn82D8z z+(WV0T)Nm7Qyk$^d<6@?8CbkCw>W&UI0;)4X;~7zh=`voj+7M@XId6V1eSzv6em~~ zo8yr;l}oOc7E>)t3tUR7ZWL2oO3Y^wdF0Ya<&si#SqZu%k5!V|1eZ~y8Logb1X_p} zt&G|m96SDDs3KzkTS6S8QAiZppI8h--}87c2Wm&*u{eUs&F$`$?CiecsQ zfyHuxW%(;?W&2|JR406HpyG)OZOWx`v=jbRwwxbWA%j5~=K||k=tNkRa#+3IQ}1 zXUK;!tX&zVQw)^^WI#ftojAiPy2cR4(8AQ%STQWSYP1q+tdBEXT^SZuHP&*qhFuJM zT&?$JZ77Zr9K<-|%CM&(uLjka;O@9ARhv*4?qxMWn~Y#rFckx&Q^0f_V21&8N0=E) zkjgAX=>iHVpvo+h{Fs?VVNvRs)J>;o~}X8LOg;l~Y%j z9bIQK#iUNLs5qc>slI5cuI+e3SsgPwsG&NjUeLv?qBPudZAcGdT3LWyz%e~`%@YFT^D;Ln!VzBceRT>Z^h2{ zf+1mu-*Qa^SQDJsBnoOmCWwi|o3>>%No_Sr6PqCUW++2!r%Ll*r<+jq&B&N$V6b`n zauc-Nyf33ENdUJNz;Rv(g^?CDUW^Lt2X(tyL?g)nuzxn+MtOTGePRSd}*O`nFTFb`4_diRE?`i9aiCj`c0R z86C%o9X8hO{-;p~2=D_K&Taxc*ozZMgj-`c;XLFOYfc1_6RW~WFSEIQ3C;&H9RIB8p)%nU9yqqF`rH!*|T zXw5l*K^?(ECIsFQ0=$C=Z?}g0>AX&Bh_AvwLf~^__ z;k~g2mR$t)NujC-PQ%h+B!P1SO+}gjCgFVJt{;0+<*6;``vSHZe9*0RUQMx0&f8T z2;NYpYXpLcc~vH^wt;7C=BO=@(10T`3Y4|-23w`YiYGC|=C&eL9kbFPFtuh#^aTnt zR3sydben}*NNfUWWiXXfvSQ2;f?KPR5sAr#LWr+ZG}^&@sjAsgs6*-kg zs!+qM(8E>R;ELKzkrvDrKxOLn8Tpv>LXgE5ncHx>4ydpa%HSl6^suT4EZ5SddMH-} z70ck1!XjlYTv-Px8x@V6)h!Nn%Z{{_5JnkAqDO`$z_NNEhzLncDMAgDEue|DManuV zUxhPT(*^1Z%XXo;wOCarscVPTEy^bQX0buO&8BYY;v1WRkXVoHOYweHy)=UDpe$l4aq{CCtH{z(q>8ZcoNf#QSOz*MkQoIB?>6L7?PTyidx(zdge;K zge)*F4a^q8+IEk4dJ4Z9%#)xJ87Oi#Oevy@bWmXhT-^dO%eU&bd9(PKERLtd1Q*FX z1uF|^J?LCdo;HZgg37g6t`bXPZPnDHqc*Er9O>n(}jAf|xjnv&{z+!i*rs50UmdgTNF5cjA2`3V5K3Ikw3OX+cc(&7r(?XF5)tD)$QBAiPv_J`h1annEv6%Jwra#ysyF%O*mA>R4`uaI-FvP>_opLoO$$($$f68 zci@xo?l5@i`Uxvddd0%VhZh}(>D0!TvDcl;HrWMgGy93?WnP)4|Rh7EU^GImFc!&2`Aj0*uQP=#lFPTtXSV-K?LF@hceI=z*{r0Bh+`? ziSST5ZHNy?*pa(pPfh&1i!d#y+8rHCDh-0uZHgdO`oJ+14f$>dirFELa;n;v(7p78 zLy923Jg2pfTf70WUqEpE(kH6^HhRC9+&2xNhDgu*l?P5%e_nlhk#JZG-^F{S&K*K| zSq7aqyc$oBGYG_2KgJxj1)O8JQkBRBFF;c}4acMhFAg~~$1e{b%ygX`KBVhe9PVXM zdjp3~GfoAL#3f$$Ehyu9jcRzRC=-d>0?LyLE&D!?4r#&0pyr*NZ zpG|IB|K#H9o}`Z7>Cnc}H?>zL`TbR-DZcYoPtyA{gZ7I^to2UDm9kN6;2K4tHzsuV z{L;1X?Y9##XUzlGZ%E>XZr-#4zCE`F99%kvJtwITrp$*H1gAZcd=+g=Dhxuz)MyjLtlYQ z_K+IOlKpYb?Uy+Z1SQKKex>>iJWif7OOV&_+w`sp4>D}Y&&kbU8< zPe~=P)AQim*u=AhiSh2lEp96_ta;Ae61F>z`^S7Rb~ZbZP*?bOe}{TXEDaB`0372*c${JeeM|p(`mNi(4)xZr(2By2gv?JfnBdfe z_n6^GK`jH|7g3@);c*IAE0rpIqyQh-RJf|`d~Y*)8YJAR`3@$BKjc*wz*Jv>s@-| zLRG+OpXsD!!d*w;kQrrhUG~nH+=U7a_w8*O^gFh|+SUYg)wxg}DZpNye`KH^Wgv~n zUS%NN+qLS%PE6c5hJ1QyuNYWG`Do24o^!(2h>onEWOnRnj%OVOh~*$)a#&{|XMv6b z@7Y<5fxwegWg}l6@LC69K1Bpm1Da4@DW_-A_XM z!#=s@XT6w-^N3_*vvo_XuiszJ+hg}R9Yp`x{;P%4u{##?3*WecQznP~j#zh_u@UP6 zD2}+&Z*N9XrhNt}sIc!R_mu9bKl04NN^EvwG-nZkvld3uk;%^X@W_yUT6E$*v&^H; z{S-2-xk~Dx-L(b0fd(h-#L>TgT01WL{6@cx6`j8)BYb|{tl2?}i(oOP9LX|2ti0Fez)u2*BlimV?g7gxQ4ho7$mtZI%2!enKy_bXz5+H#P z(4YYnEJzg*rCT2nDN0`N`vLAJxckS>?3_J2bI#0J3oCPNlusAP0`v<6;&F`Ua5&tK z@!Sq^WHOmTp+Jz9Py=^B+YvZ-0cPqCIc)*eaR#(50UCC|Sz9RTGE~nEqGk$cUWA_a zf|>dO8un0qH{h%dMAZa1gNB?khw8b&%mQHMK`+q^h8QTy z5vu13GxmiU`#{vp;ii6YlPi$F%YVl+Xqd?r0BH?5W5ewb4^cCN{^g$cgd6(;>NZe) z4~VKM+$;d1VGlPCf}FAdbX{R4esI$On4T-3X$Mv_gIfdvS{LEw!Eh5lKphR}I79x* zH}rz)yF+!I0hANuj4edN4*XZ6x)q>l4?FJ#H}wb3q9NyOfit!+0}q&q|K#K(Sj`lo zZUr^+h8cJQS`Lu2wh?#kK{PMEe*GHIacXUC4Zo8G(Q^3k;e+Ibu!QX5rKP3tcn-_S{(J8DR{e`Ivn+8jAxA^IdgJ)xhl(DCT%b60 z^0GEW$&+BOL`_eMhSG~hyXY_Sn9i%95}QZ2`rR&Ho9T6Lhb&t;ufJ`LPqHqcrbsTBiw^C%!j*A0(&#Ygc zS{@0f(-@F(6I+EiR1emT76=M$;;tHKybOc0Cu zHZY;Uzx2XjLHbN0x>j7y*Xe|UoA<$yi5?ya|EtVy5HKORN{0$6}}PKVsN?m)`{n_Q;xXYjm6?f zvQDjU)rGaS)W~p2E}6|zdg2<}?@tQ~V<@nY*RD|aSDBul-NOU! zdm_F+5#en@4#*8}cHCq!mJjzS-}#MfYp^1JyT0`0gulzd0(vVb`wnH2{d&e_&9~*C zuJ(p(H1`8?HDx>Uu{W-`+TqP-%Pw~qrmx^d&_I9iyl;U%;%!iHad&j|9LJO7Mt$?= zR(|AHF^TtO$FAO7+*W4zU+gZ9w4^gQ^<9s3wz(fN?u{oU{jP8C zOXBRY%V&%a%Y7DJw@w=&LQtvkZw@0a0kW9~2 zixAcn*(jeq`GTR2&%@!?u|E9ARwP94=bZMAuWY_K-H*Kt6U|n1s^us|*9+W#p0Ly@ zzDrAad?6}A+iWI9b`M(&sWDSMJUa2E=%?(1UCY~Ux*`&VcvfG~MeiRfSC(|l+Zv|> zRWf#PC*=pJGP_7+t)au%tr+C=_ZML_VY{QD{puPLTa+ZZ&dAnVnf1DF!(vba>m~Ztr){B ze$nTDE^pn|FHW?mOFl&wGMdJw#&0jZD(AcoG~89P zzq2jM2i8~Q|2NhS_vLIk?-4~)(LMX5*~ltnM7{ozq8HJ}UsoSx-Lc%#R_(pCQhD+m~CTmQ^snbf)PC1uf}nVZNehmq+57ZMdjM9v_O*`Yyfih_E%0 zUQu>^LNn^jZ3ATSj>#|UDjzz0GYY<#={D)a>>{f*hpGt8O>wAB)b85mP#^l-jOMSibqmH&p5)+m;*2?sGF`;@t-LmaA9yJvMlW)ZlN)5!H0=7YiS`PV5W{rGXaI z@++Vp&B9~H8y7@K#Qycf@c3oKyPcuv{!e13Z;$We{;iv0tiq5O3iSxNWJw4o>?QG*GCOE@B8t^Zd0cJ@e zlf*)5ekUY0;q`BlEFD&igbbK~YyxJ?PcyP`d~8MIo)qWVwQHS)?@CsX7~))`6tA4Rp(95HI3HLEU3e; zxM?~=Lm=f@sNX;PQ;(gfZF!$V1IDGfrn5Du?QcUQO5*0`vZI=mgz=}VpTbln!F+G@ zAyJLGZ$I7oMV~AEB3waV*csO9|6%(z@z>nK4SaOJryQ5Wj{D-l1FgZYr4cck@e8~b z+RQ@&-;*U|-X7M{?o;}5?N(>pTmIE{4YguNN@cgmf~Ami=XGF; zET}>X2JTfpIAtQV-FENDr@*818CLc!YSPKlo80*uQr6UD^vA zW2??CarI(S+*qJ2|5cF5irUvbAYXR-82%5~uQgWqUmku55b*7^5O~RZafhXK`+MF% z!iRsncgMpSKPtx)){d6%J+))}DE3ZVcRs&2wQ9iG={kLTlXxD&<^uL!wccK|0PTG7 zHrT@@fvwF9d9@~z46#_2ZTbX;JXYdB-e6hk~t1CKK!rJQ#G^q!^|ucer*;f!KZYGF6lS%>Cr*yF%9X7J?TEo z^c#}+MD6tWAbg}HJ~aj(i^nH%Ncc?dj3`Tdasxg#hs!4?BZE7=KoWjc5uzkSs8EDd zyAYHN3H6HbIz@L%q~enizT6PEt57)7*Hfo zxigtPcYCx6qicjg5(NM4ZaxJ3h8v8+W=)Z@P|U2UhOC*Mtc9MeSgf-i>1`IbBd zRx^1vz4`jF`OdES?!EbLg#{kLc}7+cKdJmn?0mD>eBao7${Fw>B>0*X(RBh8ZbiJ| zN{n8A5Q8FK-+hpfL5$}iiGCyAS|>(X5wTLFL=-9Am6VAh5~K?6uanZq#B3#EG?Em7 z0!L4PB4-LCGDtZyX%WF-yKhi&47fIqS(h;)mp7N?~y) zxmc80#ON&^uqtMtN*-C2w4jRFJS7jwMg18?%#5NTRIzx4vH%7q&{jG}E)_6@&li>o za3bLE*`*7vWh?=?C+DzFxPuZ+h`F3nMm{z*z zTJd(bEKshT(_6m3UcSjwzA9BdH5mJLy`>ks8;y8uyV}K_uM1s5T5#XK!71#jw^TuEvkI)`3!M zQB>y?S98IwCJa*(x>w_6T^F@ccU`*Pqo^j#P)V`^Y>Wk`DMRrTxUpeF8ixXx#x&q4 za2%~6-L0V@gq%9kAi3C3wAb(;u0gtjoU=jBBs664k{gOB)kTzhdkyIXu(2FDbA#Nb zOm3r4?(UJ(C}3(xW6B=6a*t9-YhdhAx@Xf)e}gDiG@WjPvI!70s96!&{Cu|QIj!lX zPV+PC=27Y9X+kqQr1=@8X_VGHMQI+FZf3`|j9a(N?lq5FH-DrwZAiDimu_BAZds$X zpd(sdSvOC*wJdM6a7LO|H=1Wgnocjq!$45!#WtZ)nBZocAOetP!VC@Dr7`W22tbw( zD$ds-M{ie`YZp{$7Z`<|&}}!wwpYfrBZ@ozK>+_Wwo7p4+RyEG$Ra4>hz^g%4heL- z_7)Y=-pAHT~|lDeE512+^IJjsn1*37aQ7rZNDdLvkO<;UDT)y$AGS5Kmj>4 z@*J&YpVqER@8qLDRG~LD(%M7mw0JsWlhzmtQp=$|+NbxT>4Twt?e2ZUeDuD?zOMbg zPPEcRAsAmo{}dfOP4Ayve2jMp#!4t-ZM1)?k@11vk67&gyw8~B zV{Fqw+oApcjxx6P83)A!d=<*h6M%)#fPNd8>n;-rW9sKH;Z02L1gOO#^ZPy%5djms zI|wulBJ7!B9)pK|4<70pg!K(_&ku6R4Ds49`R4&i8zzvzw1|Mo>J1(ZW6G8c9a4QH zH$MpDfAn2tkShTunefQy?vUBokXV!QNjb2{#N(3@5DOue#p2@&^N;ORSq?HRyAqZw zKg(sF<*YjFCBwqZvt0POobC=^X&Uy?8@}|L<@0;kDQs8-#O3k(@#Q|&rBB1R`i7mu zo&?-wId}}m={=271z)a9fJ9U%OD#UW=K+_RfJ(`+r6SlQes+EWyEuU@GQqxY!?vAZ z7yM?I*|7a5pd#O%-fJ2mjg7S0j1Wsk8pqgqpB_IbVbhvMT7I+Z#zy_^M@v<~{y8J9 zVhPJOX*fM6K#?^jx+2h zx1p7ZuxXvWH3vOJw^o2iRSI$pgb&iEJi{d|TTwDUy?K+PHqB06nFKMN4I3RQCVDhs zq$wM1-|p1J!j%a~!v=?z>C`Ztrq&gJ=0yq#8Euvc>zD*Tn(+Ls$k{Cz;W9bnp9()+In$qn$K7t8c z3h@wAhW!W#lcQ4e7X4VCY1cBRbs|I?4Qry1)?BBChmd(|v;w#x%b{S{+X|f3DM;mN z7zpB)gRowTRI_K)X^$#dGo_&Q1jA92WyGaJ1&4C3I_5G6F@zE!$9S9Aad@ZrO|;rdtD9YoY=V zxzLvr!lgJyWH_~C8MSEt7k{Q*$$(W%M=j@#Nly>HvtglfM}fmXqSal zC?o^CPKx4oM1F8sCNF{JS@<=P{M%^VZC{>asOi5xoJm7HE9JECA8&`2?Tu=jeKKE^ zBW^oe{u9Rwx89U0Ruz9V7>w)AtkxBeH9kBYDL+dfwojc8x}I<>wD86Fm6NW$!+{mU zyJ)+!4m{8K#ez;ehuqhnyU}#a`TBW5vF(}0<3q*^_pz{w24C|+UGO7*sQm5`vD>gQ zM4nK<=l(RHQs;W=^b=ewyTyNZRvG^6M_?ls{m_}lo_peDmh zuX5Y3e+BvMd!Bq%roIN>*RxX+WG#y-;!7NpXL3&5EEsE;xz{3_yQJ)c7KALBOu3Zr zxKa5b_Sx+ZMgJyOeE5CC=tiZU(pB!0DY~t|`ugW6iYF>OyZQH2CAB8w z{u_0Pi+u8Xix|OcdtH}%aEI=UGQ4vyk8POkD)woXXADm)9q}5OSp3-AEu@H27wJXr zDAJB~lyoOeO84gtKPW5g)`h0%@`qz&n=g&A%49M9tX5v;nw7T3sY3xxdphsqgZvLD zF+18ShFo`tD5IY3luF*?n=&ttOSWAcbZ3_Y&Aq$&)K7R|$i=h&KjwM5xXIM1%D$hk zVoX~^?{$vQP59`DkaHyMH>?Uq;0Xl^7hI zraaAw_wS>M=2-v$(%+f~a73Yn<_i2C3w=)n0Fo>adqtPKr(WrHeHrNz0C;A4ng5_o zDU6&hFF-knF)45{D8_vbA8x?lA~eR?A(sueT;%=T>ZLLZJ#|zXLag&+C=|Xlkv6f= z%a|Apgk?P;%Fkj*A?2O8(!!z8GB50v9A$L8XoP=Rge%Co6?8(TqN`~0XbR~9Mvez) z$(#SgLibw@kbL_rWUgGvpdZyGCD*%h2f%=SnX1H0!_jy)0EjRw5?Q>iP?R8dF_iVD z(?g)&9(wSST0qEkH5FjOX9?QFisiVA79E9_PTp|A+_V){`88*&;|ID=-Ro6yZ%n#w zB6fLjEqAymMHM@l>jymE+_cp7tqC@t-6p*>@bbSj@h~l4ew+I&V*ROKS5N`L F{{dEH#oqt` diff --git a/ui/2.1/images/routerstitle_icons.gif b/ui/2.1/images/routerstitle_icons.gif deleted file mode 100644 index 77bf1b4de3695d9f716dcc2e70e2dac4c1a728fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1582 zcmV+}2GRLPNk%w1VIlw?0QUd@|NsC0{{Q~|{`K|s?(OgU`}^SG;o#!o^z`)o{r%I_ z*6!}^?d|QPq^7H^uJZEos;jN~{r&m*`S$kq=jZ3``TGC={_pPatE{iX!^H6L@cR1t zwzj&yzrp_f{o>=~<>lo7e97wS>d)`??d|UV{r=z|*Y{r&sY)z#6_(bVz#@9*#0+S=UQ+@GMM+uYrckCNo%{{8p&_w@Sxy1Tsf^!2Q+uo}+wQx(zgfcQyTPyW^Yr22;q2<|y1cvU>g>F{zv}Mp^z`+e-SUEh zgocKQhlq*d;^FxA_yCa98j{ZdmD#Vbvw7F_(9zW4;Ni{A(B0nMxVN~Jm6!ed{g;=R zoSmQh`ufn&&*R|jb;|18+}#L})SjNB8JgA|o!P#=#;?VTaMbVN;^6_Oxn_%FET;Ns+efP$u^ zrs3n}y3MDzw!g8lx3sgjprNGx|Nr^>`uY0!p`xUtqo$mmpq-wezQeTs{`~&`{eRQ% zx9ax0==%Qt`~Uv?|Nr_4u<8E&|L*SZxw*T^)5p%#%q_d@&CSis&CllK_F$Zi+pbqyYqYfH6bTK>$$NRY(9*B-fBM6Ze3T!UCLe zoz$hcBCoRHtwlw`z?7hfkV6X;z=;r{NL<86KR$#ZphSr;)_@;{(;$x~-^zl3 zg5^moC%i2k0E-{WW{%X&y{24=xqdwVzirt&$GC|F77)*|y?dJi7A6^Rht57M2oPWy zz<)Znnw-M0Gs_Rrm>`~3K(!cTpk8GD-=?C{^} z?%b-tX|>97$=0Kaswb1LKYgDWuETA)&Ul=+OP8}l%h#vw^WdJeU81*O|Ns9000000 z00000A^8LW002AyEC2ui07L*3000L6K%S8EaTt#gMW$h>41ejE#;YG6j;8l$Dm2 z6_pj4mz|!LHwmJnqzMzJsHLi_suQfQuMD!Yvc7v=;7|q)$!Ts*5~x;?D+5R^~?R_ z`SShyw~wE{c>(PSoJX)=IBo+KO1wvL-Ma=DGiq!QU}Hy&)i{F8`0=C2lO|JkG`Ufu zg#j>Q%A85Frp=o-1K=EBLC1kd!IKsfN@%oRV?VqQg`o8$$&wUU6Y`^t$-r4WHN53t(@O{e3@2jr- zn0@Bkj8orcpZ(Ex=Qker>$*d(PP(tFQiIzy=h5 zvVetkKqSac23Ds8g+9l`d8`Z8H9XqKrF6a{@&2(z@3|lU=V>g^D3DM;-dt4aVKKk6 iEu<=wXWb3Qrw5PbC?{|oO=@&dNjFJ6tJcE6U=09V5?;js diff --git a/ui/2.1/images/search_closearrow.gif b/ui/2.1/images/search_closearrow.gif deleted file mode 100644 index cf7b1ac78da9b982327a61621756952174649e55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmZ?wbhEHb%oHuhYlTj|Ni~=@83Uu{P^zOyZ`_HA3JvJ{{8z5L;%H~EMQeSAQEIJ1FMIE0#j3f z1`DT1lTjyAq>c}lz9WNxs?ih8#(aYni~{VB-dCLX%fxrMpTkFD(oTlPgxai1eoj*% X=8{qa$HhC9r%JJ1eZ|7b$Y2csJI7F9 diff --git a/ui/2.1/images/search_closeicon.gif b/ui/2.1/images/search_closeicon.gif deleted file mode 100644 index c6148ab69d06858c7f3762c0fd91939f23d6828c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmZ?wbhEHbebJmKmYmj z=i|qZ&!0bk_3G8*$B)mQJNM(q4+c_z;!hT^avcx}vXg<;EkS_CMUjKmu){Hlp&&=) zvGjd5PJOOV4vZ0;$2er9+-7KQ6Zo32T*B!|$HF9bbtg{+sfp|lA6&hY#<+7Due LAC0LREDY8F>A*?f 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 f011186d669d2b02fb39a561ba615b6221b3eaa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmZ?wbhEHb LAC0LREDY8FCU!-w diff --git a/ui/2.1/images/search_resulticon.gif b/ui/2.1/images/search_resulticon.gif deleted file mode 100644 index 1f9873991150cadcdda4ba09e3388997ad3aab80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1166 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 diff --git a/ui/2.1/images/secondstoragetitle_icons.gif b/ui/2.1/images/secondstoragetitle_icons.gif deleted file mode 100644 index a81097d385947378e3aa2fe8cc35a7957d0c6d40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1699 zcmV;U23+|^Nk%w1VIlw?0QUd@|NsC0{{Q~|{xLBz!^xum{r``cX2r(E6ciO?bQPth zrLMVo?Ck6S002TlLQYOjKtMp6nwl*wEg2aZ3=0e*A|k=T!Q9;3adL6KzP?*qTj1c} z*Vos|%gUgjpy=r6MpXdh0MpXb`uX~*s;cVh z>VJzv9UUIx;^HDHCWVHDySuy0%*@o()RmT&+S=MmS^zC8Em2|sb#rx|o}RU}wO(=n zC@LsPNl9gFX5il7@b2*P@bWS(F6!v&ft&#B>g-@)VA9aieSLkx!ovRi{*#lFJUl!< zKR<7V0E&u=tgNiAude#|`nb5b_V)IusHn-w$=21@;^5*21qSf(@Za6v<>lqv+T6Xn zy?J?gx3{;<%FJ7D07gYd+1lCK*xKCQ+!7TO?d|RA>*`Zv0PF4RjhR#?CMJS{f~l{H zf0_XJ`1rN9wbj$rm6Mg@*?#;+S>pC4MRgihok_}&(WiIaRCJd&CtyS00YFr z#GIO%oSK|AG&c0}^y1>-91|7u^z*Q=uj%RONJ&WQ>gYQ+L)zHbm!?$c=jrh7?u?%_ z6%Y~s(lPM!@Q$J~!@Y5)ca1d^}>9T*^EV`c*o7Gh*#XJ}{TE_HQu;o;$*qM+N{+v(@$IXF2-NJl<9IaE_rh=+*y_W04!(N13g0s;c=?C$5V zrOnOFot>SetAnbsfqZy*Y-?<4dl|R1wgCeJ<>TX`p`!2a@0p}!acOS-{rz`&cfY{D zu&%IbfB11?-FNs?rVw}=G-NCnVJ&Y?sAcvNfQCff{nArfsMxiaYz00MG=SVG|9)DUz8 zqT$Nm6}%11R+Lz?W{0&OE_wj~ktA&rKmi0!-G&1|3^ckJ%pgZk4-yW38Ff&Tz)rm< zpap>N6AnP)!~mT5aGWAtmPECD%y{+cLl6{sNF|WbPK+1;F6_u~WO^!qCIAZ60MKRL zD>Ng_af&5k!<$YVez?=21Hd&uGQ`mTs)!muxq-xp0EqO5Pl^xEHmulDq)s;-gb2#e zL4YPi06r)n&?k#vWJ3xCAi+mZjNlQ91?!vxN+Y0PK?orWToe%ii!QbE8g7li!r+xK#&&^u~P&96Rcn$4{Hnn01g(E(M1#|Y;g=3$QVI^ z3Km2l5P1=8vRVZmGLV8f0Q?hy4;d)Z!~i{HkcI+jWYEAG7M!410UN3#P&^F?#0ei< zt}{X_tz>Y(Iz1==LlHnkaRC_*v;aUlXgNj=09>Y0CjeBu!iOzuOk&DB>!_fB2P!x) zK?$h5qXjQhMzn?p0JM+-09v&F(LoI#RL8+K2b^(F6CNlqjRuE!07DOze6i?%XBYy2 zDpbq>00%>KfL01{;9O&id7?YRU>Kmj}Kvd2Eb1gz{KOauEg07NOiY`q2w t`UoP330%xE2NM|Fz&!KLH%|;DCP;x!KlTLkO(k^9kk1qng+EY006Roe3G@H} diff --git a/ui/2.1/images/select_ipbg.gif b/ui/2.1/images/select_ipbg.gif deleted file mode 100644 index ee63b746a3c9b3d3329a7dde1edd86f12d37147f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7263 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 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 c6d9ce15629801687c2013b25a6180a6be46c587..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11051 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 F06YI)elGw3 diff --git a/ui/2.1/images/sgtitle_icons.gif b/ui/2.1/images/sgtitle_icons.gif deleted file mode 100644 index a3e9d9e6b0f9082457babbb131953ac1627721c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1418 zcmV;51$FvINk%w1VIlw?0QUd@|NsB~{{G(H-r?cl;^N}x=jZ$T`<|SgxV5(5-{1QB z`snEB{QUgf+}!N!?D_fm&CJZYy1L!n-TnRj?(XiSqod;BFMd}>gwj^=JoaU z_V)JW<>jZQrsU-0&d$!Yw6yN%^7#1py12U5*4Ct?qxAFi+uGam^75OQn(^`R(b3WE z?d{am)c*bcotvE1)z#YC+^MIi^X~N7+1agek2>+PhZ zrQ_n`y1BXc^!cHmq2S=)o}Hbot*yJdy5;8Nq@tt2zrwPzva+zUzP!Kk?(+8Z_ot<& z+T7af>+9+0>C4N^udlE4^z`-g^{A<+%F4=}nw!DF!T0y~<>Te6tE)L_7P+>#%gf87 zprOpo&Aht1tgEb_ot^LQ@7&zm_44;EZVT`4@13uQ?(gm;S_+1+U7@d+q_mZhk&(pB zzMh_)K5HP^+1TIU-^0Dc{QLYNQwhYw#BHKI;NaoR%*@Tq&Gqs2+uYo_wYIXcvfJC+ z@9go*%FBweXX4@E^Yin;!N8oGo3pdC)6>(yz`(}D#+;j-?e6aE?C!9wuJG^gt*oo* z>gmnN(Dn89>*??H_VxGp_gaiH>g?(#Q53Amkl)_lvbwJG^7Q=s`;E3{&CJg6=kmF@ zxw*Qz(9h5%Qwh1aw{w_Nm6DYI{{NS9fJ4 z7flGU#i8@^^WNFv-`(Jxnwy}Yp>~IAqN1X+va{gg;L_64|NZ~d($mn;(DCi@o|~Po zsjkMx#+;j+A^8LV00000EC2ui03rY$000R8009UbNU)&6g9r<@5{Pdg0|h7C8DOwQ z0f0*ztR&nBz`z1kDsE7EwBv!r5#uy*MEIZqF(5!f0JEXXABqVp6HXAIB_EY37bu8Z z0;12S067m%5<|el2!c_HNYJ+-slj3efDka~2UU#(Rtdg%cEQL&1A2Pc2s;puk_Aw0u|+!=hCk ztO^}kk$}LF0tK*nJH+grr5rP?2FP;DT7v}%7W6og$;=TErPi%cCPelDB9M6uS^jT2*7a0o*j5i+~k5q0}Fz0CX5p~ zWg&>V9}>_o3OB2S0!TOrJaJx90n7nI5^}V&%sxSQl7=xBU{VJufh4nFP5~Tn01$+@ zBFrY)1k(l_Xh4Gk1PI{p;Yu$Y5KlGD%z_I$=6FE|H9rjSVvI9#6u>`7Gy;eeRz#CZ z9&b1yfsiobXVnYkgkg#RmGH5`HJz~Wg8&1_0HX)_F(^+KkYO;$AE3;0i3AA@00oTX z_#j&jLfo*66b(o~2n}_TSxg~g%m71J!<<6`0UTtY!2kj@K!66EL;{W^wkR@zUApu@of41ijY0$Zfe0tO!l&`k_1fB*&-(xBo( zF_vl&#RXM7U_e3!JWz!i4irFu05z1r2n#IS;{q=Y4AB7w6r{j`0t_S+fT$yEkOE~G Y6wpBjA9SF>0vWV$0V22NT2Md$J51Ru`2YX_ diff --git a/ui/2.1/images/small_ppbot.png b/ui/2.1/images/small_ppbot.png deleted file mode 100644 index b87ca543930f075ac41ad0052300640ef8ad385b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2866 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 QasU7T07*qoM6N<$g8CC+4FCWD diff --git a/ui/2.1/images/small_ppmid.png b/ui/2.1/images/small_ppmid.png deleted file mode 100644 index d0425860decb5ac321dd1b286d28bf12f963987f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 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 diff --git a/ui/2.1/images/smenu_selectedbg.gif b/ui/2.1/images/smenu_selectedbg.gif deleted file mode 100644 index 849c8dc17970bc1b673568a076e9da4e0db2d259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 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 diff --git a/ui/2.1/images/sprite1.gif b/ui/2.1/images/sprite1.gif deleted file mode 100644 index b18c9836db2f26323cff86a131424cd0db08d30c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65239 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 z 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
    D_VU@^q;GZ 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

    )FjDO};*7(Jt^(9wP=F7P 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 diff --git a/ui/2.1/images/srow_loading.png b/ui/2.1/images/srow_loading.png deleted file mode 100644 index 316ae7b022322d1795b8ec764fb4070de8a1c36e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&D!3HG7cJ^C?I3=zTCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xq&!_5Ln>}1r6eSHBs(zq@MI)}Bm{6Uut+dmdciQGc2Q^= PP!)rxtDnm{r-UW|i5VZD diff --git a/ui/2.1/images/step1.png b/ui/2.1/images/step1.png deleted file mode 100644 index 723a4164e255f0076359666357fa994bb863ccdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1190 zcmV;X1X=ruP)dt5RrfI#I+VSr4+a)GdnLc!##~Lj^v!-9#!>v zLGK;A=bU&15Xd5s9#*&|$Q-z>pFVwJ`2YVu*hVIhEi5c74FCT91KWsU8w<#E5CGW( z0ssL7vgHGi=4ZeIn1B}WgDipJw{PEq-H0p(_bv!9Gcz*?3JQYR$l`GOVStN^3rr)# zfhK{BMh577pc)32M~@yc0-4K!SOSN;3jhKL1c<1SST; zK%WUYJV01PLI;Y;5*B+XU{+m*^fiP zJ0K1Q2p~}0*#H@b8OR6!f$_`4M4=%J&|uq7Od0^^$FE<%;#I>0%AdIKlP6CYBqSt2 z1rIoP;8KS*N?`G(udmM_E-udS?b|m7K0ZFIDT83Nfs)mwOP9cGc6N5Kt6)V9PJ{5- z0*(@BHUQChU4$)3A_I_%KmZgL_|y_iksm&MU^sg8D8ZN|=rv*i3owcqB_$>QlWPF5 zB) z311_C0Ueu}nK4L9OEcWKaRcrmZ0g{R1Z*~doc{RnW0XP)pG&YBf-Mm78iF@={$mzc z*a|Whd^Ql{5S zg;E1PfBwwy?%g{E4h{}*)&gZQP!&d&V+d98=miaOsRinS16zR%IyySw#w@4{{P5vJ z24c-bub@aSsa^pc0IIY>EdV_|Jq8{g9#9hs#b9zvKcYkC%a;O=& z1%yF-fcjlepFRb5=3t`~GBPsY)*8hjL##%S&+p&Ak0B0f?V*PR&7+B& zV5fNkCS)-=(S*Y>L^L@lXgA?1GT@G(wCjm2WJoo0C`1!=z<@dC{rmR}r%#`zO6XE2 zYg3r+;R97b#up&XLlp;+3I0M;JPWX7^#rmHGte3QM~Wk0)dCt>y9gQ#0u7@w3JVL* z1GY&bfg!~XlxL)6ECJ2`1#$zhl6?ZKfI%Y%vw?US0JF7j=EtCJB>(^b07*qoM6N<$ Ef^_ER^#A|> diff --git a/ui/2.1/images/step2.png b/ui/2.1/images/step2.png deleted file mode 100644 index 748be16e098d00a1f4a3658804511067b4c00662..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1483 zcmV;+1vL7JP)Hq)#{6NeA!jB$30-FzVBTNj0;ob#dadB~m zXV0F2eTgg%wjTz#xw#pbSy&jZUcHKB*?$HWkkQDYi2;BSzyfp!Bapcqh$V2iy8s}7 zK)&+_GB)5)un8EW{!DljfPfzmPheso4D^|h!-ECrGeJQ?hBt5Cz{S9U`SQZ7{|LP;vqe@SO#iG(d5;ABTc>KpYGZfRrj$ zVHgCWHU>m-5JzX%{6W8|KiS18qhs|KR9usK2Pqk(Y0?LxDEIW;AxtO5CTa!=V%XTqnvY}XzzdxQc4m+K*K>T0mc{{ zU`9&m`Le-9T5EK)_a4c6G2It!1WGAltwr<9^ZZ?-&60b-jnFEfON^0}Qa)#(8Ds4C z)SPqOebDDrYG*MvA#bhg*Q*5WSAVtX@fLv9Dp+k02%?)H{(&HfV6W-L+ZOvDx%5+d zYJaCc(O!BHDtPo>1feR4$JTb<)|D-+j!QEzBq7Ul+?n^@>?VW4k1I!vcgj1W$BSn= zoMS|k&tVuoT3yj4h!LOr|6VMOg}1*%hgLx##~>@)X07;UK*wQ(aU3g$fI(MPC88+W z4uUa&KvHn*}Y?cM^9U#g_*Iwe%N2P|ZZ z2DJooKA(h?Qgx*$3XVH=aXK8Xl^YDhpoUGK!O-E=*h(OSK@iNglBVgOOP=&+9Ry-+ z?h&kMYY=T-w)Ic!7(MwKe_OoPW={9U?~xxiF6a(>EQU|!a_ExiTGKRdUR~Em0=%Vs zfKNFV@=AICBS14|j}svjMd9aU5(_0*5E2?F2@Olo+9kLGOP679WnyCKMqI%xfP!E# z79`d-dcT`oL&z}v&B(mu1qK*6@BW_itYtjQymt!>iM=Nw{0}BRkRms3!672-OBl`d zYH1)0A%9nLcwD*D85gGn#;qshpR4Oyiy%dhNoC=>Np))6F77y~#dj5&&+XPlQKX$4 z=}Sd!mN*Ixm6_gARh0?==8$?hs4d#S5_z609R~nbfK40erJ=`htRR^|5U8M_o$eA3 zU0Vjdm5ttvMSR~^Anb<}MWG+EX8^@DKpRa7!%(mHz26Kn$TGMC-qYqjZ5Nvow|o5N zzeBA*yP=qx!dmRFc%JtsAklY63E(aeSc_Om(^P|%#StrAiuE7?+y=qQ4FvL;7qZ(m z)*5@j^ivK%!0NLsQxL|jEpSHzX@VIlJxOKaft?_Za4%eeO8|)UXuF(+Lhjm(aF&}$ zVI)bCB$~2~2B$&WwIJe&9mc+Ii~>Vxr_MBiSjsc^Eut+>W`n^6U7BJ{fcAo!liFjb zcAqpc%a8__2LUv_UTM&+rPtib`Mdk)@zd~;WF;}MQ9_QH%CdZw0KJp*bGd(ZOfSj% lzri3aDMmFcbg)002ovPDHLkV1g%pnt%WR diff --git a/ui/2.1/images/step3.png b/ui/2.1/images/step3.png deleted file mode 100644 index f7b14579176ff47ef51da435d0ffdcbf2001d1e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1537 zcmV+c2LAbpP)F^p{hi^_djf|%)}8R;)rF8fh99z|KjfVD_UzX=nL9aW)LKzW!Fz80t{5XO?HSBotRVrx%EmS4w90Fb^aIw`8rKhH`^dfD z0tnfIu;d8}SP)xE zN{RtloaOiL-(Uuawy>}OC!iB2PQV?F;wBI{dh{sPFu*a>-_hk=fi?2%;| z^?m<&gLJJm)pbqdIL6V|Gz|kogTpYeU@up63~Mc)ZQD{=mfRkk@CCF>@)%WBQBf2O zf=b}8G);L<*dC!j!PYPzBuolxVJ#VB&RIKaZCMu1OY}SEZc3>&R*imPzWwps1R%BA zRVxI7=)`DYW2InW6I;O_Na0_kxu23M`JH@4nv^NU9|-tB6a=eWk~yn;5%<9r7Y>*8 z4#VusoH_Hb3KT9+2Yvi7E=-S4t)Lw_{F?XEPM8tD&PkGz<2deVCsJyyrM`#h?sj;} zGtV=^q$Ej1$2LtP*luLF&I!l|HcOcg!;tE_rg0qg&w=3;S zbIDlR+v7>v#Fk}AS(Z^z6e0@W_eEmS$%@{ZoS-uiMHEHi-uJz+yf-JyKB%6yX%|Jd z&6DfevAQnY?vYj}TtREI-E%l+Bbx2Q)^IkUQf=FQySxg&u)}A@8{_d{AYY8ve*u~? zgOrAWC=5@V0T+6P97We2!4tUj81B0&6kK`^!4t%N$i`&^mqjS`|AxLWNZMr5#B^Xt zOPkD}_ul;P|HoR!T3;UB3`6v?l9qom^YNzZottr}j=xpox68SKFeGNsRnJRzIpg}0 zz&M|JgEa!KkfQg#>4DHPhRN7A8O%v`iAg|v_^Ymi)}(VoqFI*3@+SbK;b5=ON^lT4XrLycq@1z_B}2xEE92>+`$&=dq7+q||@tQ^8>n$MFm4kQZ^ogCcdM-xpJ6 nNzeZQgE;9^t%Fm8jppkwpz3GlCk~;`00000NkvXXu0mjfTo}MZ diff --git a/ui/2.1/images/step4.png b/ui/2.1/images/step4.png deleted file mode 100644 index da0f54ac53c010027970db44ba0ac4a09f608b0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1395 zcmV-(1&sQMP)q zi z3@kr>{D4awIdTNkK|ots9zA-*2xKk?VhJ4XE&vE1knj9~j14#xYy!rpKNB7WAm9hY z6POqX1AP|c@Bo3&pFcA&Gcz-Aad9ES>F?ja3^4rZ(P2%I@W4L_zGB^#u6v0gb34(yUygV3#fRK<7C@~`<`1kMMV8-#|$H6ox z5#6|P102b4MaXu8z_n}FFp~<*Iy~Sz%d=xT!Nx1}e^*pER7cKj`a zKN&-j_Esqcj4{+c*bG}fo05!%(2XrN<8vrmYYnWmfN;bZL2FIqV2}}vRca&MxNzz? z=V%%rQ5ckSPR>FI$T`D&XNBZAZ@l+(#-5_r*jtlYD@Z9}zVj)O5JEWg*)8@rc1+}>I?ARlSo8Tnav5kFS z+CZ#{8uYx<~XHxcPJLqPed zhRX2-du?Y%k@8=09J45jWa2hWVg)Xt!6!U;~>w$di_&Bk`t=zLIZk|grQ zs;UMzF|`p6>;X#za!?oQVmN@2Wf?2WlJ%k=>^3GS7(9ZLrYYl`OGw?blMaW1#`6b76D7a8(7(=&k=HhlsQKFRDnRsoFkAEr0@V@*v4WbSOr2d-@}m? z2Bqm&N@FOFwS}^L+wt3bf>}&0&}Q4w+oHiQBc|6Ns>6e@0)wu?bdYi-nQ%C4X#wS zdAc9%Gm4^yo@?9K*GB*C8GGRgBs0nk7txg|`L>>K0Ex*8m3? z2m=Xg69=xbTUC`g>n%$N#1hH4*>^^IpLIs20U8o9pe3|~uJujKmGIr93pVk8NV2zz4~#Dv=o zg5XKE=(Tw2Oul#LjFQ;@1cMaRcPWf))kis=e*mCSH?tA7&szWh002ovPDHLkV1l&G BjMV@D diff --git a/ui/2.1/images/stepbox_slected.gif b/ui/2.1/images/stepbox_slected.gif deleted file mode 100644 index cc9fd88f4360bdc8a3e5b89a7d5ef0e9043af0e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmZ?wbhEHbWMybzIKsg2{{8!B&z`+{_3HKO*DqeYc>46|%a<=7KYsl7?c3+ipFer> zH*X$1cyRyzeFjp1;!hT^avcx}vXgZ`jGV`MymhUTdRPcCINq{Wg#J!G;POy&30UY>`@< zvHSjq9eZk5+mVx2_|NqAs7>+P7>}6)&$H1_ek#PqT(`g2VvkVLe85j<+ zu$*9Jy$Iy8vTk5t*uuhcMp5ygkkFUgx4+%KeNs{Js<-#W=;%9vfv@Jzza%SrE+XQ` z{rgAw`L6~BKAkh?2~bd4`ssoN2ZV(Fe*1PkB;dTiUVy+=-++Ie=%q1}6qUpYSc^rZ{8Zr!+j{`S>} zo6p~UdU4OLyN|9OxpVXWhnvqIygqs2-KB$Pem?*Gh@XL(i={$$fl3oQr=7=+f<%VK z$qIHg78@QhbFdj@-8r#w@o@%O$0`}mNy;s}>_MwyPHtLynn5>l*BsBuPg^;aIbPg3 zxq10{=lKrJT)bM1hj_$f#WZ41ZCQDFdB9??+Fg&1P7zU)$hdoI>+0+46ApL1?P@wa eMN>&Yj1BaczkNEbvSd6M0zs=gEatWHUfeG diff --git a/ui/2.1/images/stopped_vm.gif b/ui/2.1/images/stopped_vm.gif deleted file mode 100644 index 0dce0b1e83035b44f86b334878dcffa0e01e83fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3400 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 A%>V!Z diff --git a/ui/2.1/images/storagetitle_icons.gif b/ui/2.1/images/storagetitle_icons.gif deleted file mode 100644 index a55e557d7e31deca7a4eb421a818754e4cec8914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1777 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 OkrA=d9=Ztzg#8CtBy$Y_ diff --git a/ui/2.1/images/temp_centosicon.gif b/ui/2.1/images/temp_centosicon.gif deleted file mode 100644 index 48805d3e4d809b68b5503cc5b5ad8a2e1f8df1d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmeH``A?E@9LGPEF;Gjo*R?KdwYhR@rLNmtYHg{_wVG{-`a^58n7LNX$P6^m%xR)& z+2Mg;9xXXkLZ0w|G!!{A3QV4-U^pKU5vld<_&a+21Mlti-YYi#L}V0$4s@8~140Pk zT!%*dVgyx(4P5scr->#klRQNnGCEyVv2grv?UCQqt7vwu-&F zH!Tu5NnqkXqc6bRjsv7iGaG;Ysz5#&Bdgg|^hgVB_Y$|JyMPDbD z==~((sF&6?jkIL%SFgR6)Af0vqA^!>Uk1i}>`SkK z=>3XBFfrBbuZ8+zk3GEv*2sTm)@4YNe6u|D*xid?Sx9pSvPioR(dk{VLvRpKAcQPcMZ{kJDK;i5p* zG5rp+&b&iEo^@MU69T?kKm5_I;6VmCNN9Mya9fHoCohyp-n2GV`je>)J+*FWp;P}nd?Y?U zE?sDQF-|=ea;AamhP0jBpe5mPK0$lzVr=Vz{D5xPn`(b(IVrn85YrQPA=e2JHakDtla+}r2v(%0IMoTrJG zqs-FTe~FXI&)EO}{{R30000000000000000000000000000000A^8LW004FXEC2ui z01E&P000M%fOdj{I&gz_04{YIM=V1CYc~J@NH9)O18#3mUQ>1kDH2%>f&yFtPzGaUaRkvMN=*w_ zL{$@l0cRs+2oWLDI As{jB1 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 676b2227d940647761a516cf7f2c1db510915e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 562 zcmbV}$#T+Q0Dym5+EUTFRO@n3>%Jb`sdd*@>%Q+xaji>cd;}+b03X1kGafrS<7h_; zg(QR|5V8_N(y)a>3WTy))bW7rEBM{N%lDlg=y&uu?Vtl>A<$?vxTuB@OsP`yQw&OR zf~*NKtzeb|w180TI7TM)Y&@O)@ac28T4y3LN|3Q2C&Us{W|?9oEEI_>VpHy%bv?wiMtQv9S*9P<&3C}j=9 zgAqO=Ofiy=V9i<`CAmZa*-v$3KoLeMC|&SnJv zMfV@81po-_n6u}efVTJVAQ--}au@=ahOYHHj)F()0O;zty=VEky<2+DLQgNOc-8&v z<{dkHqGi$fhgX|-9fJ=&ao(H%^2Ope@Y?py2m3en?Op|2jvu(Pz}kGj1#W9Iz^Arte|=>0!qr=?ZU^riws&n9 Ld^^->1HJzMf44jB diff --git a/ui/2.1/images/temp_editicon.gif b/ui/2.1/images/temp_editicon.gif deleted file mode 100644 index 10e6a71991c02a34bc3e2e743c2a4320d2c2cc70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmZ?wbhEHb6k*_Jc;?RV|NsAq6DQ{6$l#1{rT;D)~8K&|F;PJ zdUfu}k;8YdZ+&;=^1pw7|NnabZ>8>?hi9(8dUNOI`9+JD{Qdps<7SutTZMo8{rBwI zvwvT2y}q&G-wE6Qe?C9ky0x$%>;B;*e}Dfzdw%z;PbM@-K zLprz5%=mlA;NQE0|Cg!$`~LLH$H$*OfBE<6;*VdSH?Nue<6PAHFQ0*)Vi+Po@h1x- z1A{w*4#>TrIALIKX>f09ZeidtYU%89XAlxGQR`&v?$Oke(U)UrncT(TY^rQ&$UVDx zZmX@Ul7*PtvgKV)R#NK5;u|)$Xmhf$*h%l))nsqO&Y{S9=&%Amo1porDeiOiblF+B y_)gDpmzU7s5N5tJhrz*G((K9Q<)SXKI=oLOsT!y_ewie|^!Fdr+ZC)#4AuaeUfB!) 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 c5b95ca416a9164b3d7f5e187b8c19976ff3a8b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 zcmdUsNmJ8s7>EB|v>+<735p0PJBTbUAfU1YhL7PlVcH%j+f2iDfMJFMa^Zk8bU+Ut z^rT#b)`6A*8Zt?RG}MNsY4T6r7x)52^s%Jnph)T7}>&hDVber|X8Lil~YZngsnHC#S^NA*B?9bD8k+u@wKa zvy;?K8rwk7kzYcppcY3%4*&g?K0TF%Z7QzG{{>UiASGyqesOdp$72{|5g~1u)Y2&+ zTAFZnwzatd>1ZO6z=-c$ie&be3{_PW1)}pQo;NZ{DWxirNP^>3X%9{oAUb=MLvGY6 zb*GIGhBRGUUw=Yeo)O0F@she*Uf&o)-Zl1&dTrwqtzEevs|Y(zTAqAp@4dU=nf8&_ zHMK>L8&*D#6%O2g^zh~S7w@w>j@vnTU%$C4x*bke){mcU{f>f?-!shW)AH}G`t8N$ pvbWBA*#|6nU)}j4pJ$7ocl1?CZ0W0}2MYVfPEC8zZL`}**Civ6=u7|r diff --git a/ui/2.1/images/temp_linuxicon.gif b/ui/2.1/images/temp_linuxicon.gif deleted file mode 100644 index 6308da3f8a070119dda19d6e922544363599a430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552 zcmZ?wbhEHbx1njb%X{r&rQ z9UWbHd86OIe!O}6Zsx4{lk*w=-(q;Nj^XQz!|&HH?Ao>a$B!R3CNuo{_3OiKhTi@O zM~)mmw{Ov#H*c1M%DlCzR0zow4f5K?TaqF2)(DA6^Fk8IH`)46?D+?tU!Erc9shYG#uIn|g8*hT-J-w)! zg2UEghmCg-dZ)5+eT&-Y^4ecgst-a-#|39yrRBIt{Lr-ygoWmACOLjt{zAy0=#088 zat3k!qIg5wMnhRFkb+UXI(6U3XKw4YBE@7z%am0!VG+dSwH~OX2&~4PVaAf4S8kFP zsw9l8`eSnOWYLpFy>iL8Yte6T+DCbY0Y`|3*ybS3J)nn?r*6KiWjks{3zj2+!DQCW z5}B**$`Y62e$K8Kcj{Nfqv@59(!tv#gj&A|u|3SvTe3|1nSc7pydRiS-IZT8d13&>h%d&gC=MFym1ovF>4eXf)*zd3y&$N$U!JPv0`2qRtJ3faB zU>$JJ^}EQ3912Aeb~wK8+v!pI+1X9!k4`w1pwZrF_&!J4k5_QInJJ%C!e<+WFV0ar zWBi?>l{>Ak>oUiY>8Jo~Qbc&?r$NP>nuH_RpVtWr2b_=3K1#*N5pQn9QTu6LakEKlXU0Pk9^8f{P wn*FBXWE2B+yauW9|+4%obW{Mr}h=H=O~ zh}f+u{_d{NyQUHn5@Lb)=JVH2EEJ}wng3Y^|9L7fLD!R;_T}Ey0s;a%Q{sNDQD&+l zsnv0l003dK12{N0|H@_U?d>ZlC;05*dA%zE2g622MoCxe>FMbFmPygy!2Oz4{_>IC z+}-}zxXjGV|MsM=Ag12br0fMr`}_vS9qol`L2Qi);Y*SQY+= zI;+S3{?aV_+gkr+7*m59)#L8=w@TsR;p*er)#v!;ze#FoXGw2&GF^G||I}yv+Kf790165U_xSin zmjIQj_vyMkD_QyX^605175??&8yp<)>EHj^m;dn~|HxYY{{H=mPK2TT(b3TV{`BtZ z<~Kb<{Or?;rvCrGbLCPP{QUgpjD8QvY0MPRu_J`uO@K9~qo}6$u3Znv!gqI#IuN&Wu+ zIAHd+hyecl{piSl|NZ~?#&YM%Aoj^6|H?F9UtW^5|LW@O^YZflbr|W+nVi*(yRWId zwyYW$7`wN&9z_6&k(ybJDq~q%n|S~b5D^6h1~M-tN`6RBr4lAs6`M#PH(N^6A<7#jpCwvzUxm+rL~~UuNINbc&$& zkEi>!>wdc^0Hp;0{%;_SUk>5x|EPEX>F)cqb}{+-`{3EtQBzV(bq*67(5sCf`oYrZ zCjkFE0J4!JA^8LV00000EC2ui03rY$000R8009UbNU)&6g9sBUTv%|>pn;f1xLD!F zoWX|-4~~dJB?XlU{VHK2$Sb44L$xNzSV2L^ojqm@sW6Gq4?HR|Qo!pWr31fXh%`XJ zqYFa2B{Ts=Ss}xRkRFdZ0C46dOc)OwBuH?C!elv>gs8Z5X9mEIAsa|=m~pACg8>Y0 zxhdB4$^X$@WY^3`)|1F_gzi*c)0nnEdbq0nw7Qwj`)x5#-mTbPEsR!a;zY zsRtRVSO7p|$kkMO7T7Sr;#xF33J;P0VMpN2lPwuaV1jnQk02yOq77q^=9Ut|hY~I# zLx2DuMc`y|N*pxskjofcoP)*y0<>@e9MXKz6+(){LVy_0y;6b&EYR=|ETo|G1r}fg z5CAm+d?3vSmK@XuE`0n@$9X4IQOGtt^r6id(C%{0%KB6oz%^ZKo(Zroi za5D@RCP)*2L6BhL2LOZc(ncQgKtY3!Nz_mS3T51L!K89DpvN2w(o_u(^OT|k16_pU z$}ATgaYQG*L?S{FbkHPFH#ykU;Q|cxNYlv~x1P&Rv2LfHN%8J z%m9|)!5KpKfI&#oBM%f106R8r1DF5+ diff --git a/ui/2.1/images/test_icon.gif b/ui/2.1/images/test_icon.gif deleted file mode 100644 index 43d77f9b28e5f8087bbc5c2501c8137bb88bc6be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048 zcmeH`$!il~0L8zgsg0nu)_p+|v;{X%Y0)Z5)vBorROq21XoVg;iXf<{M60EiDlT9Z zi`pt;#Y0^V;zlBEx|oD6sA;yDNxxaYnQ4}pCY?#kYW z;I{z6aTM2$7wgn#{ z2=yt96piNuy?vRSGO~L1k;|p1DV}4KiDck+KosSPRC4&u8^p6c5*xY!glQxe#WNUx z0$s1p5z&aM;Y=nIPbPDB08K-In=X+S(`kW-5F{yzBFFJk8bccH-Mt?C*S`zcr!0Si z4KqIT31C%$smBFwR5n`Yws=k8nc2C0YqWV;k*%`Pd}U!pLx2DM#rczpbpv;c!>E&94@L%nN7ZwU(Qk zFYc*354wPJdA(uXa%T6w!s?T&+B25Q10|(}-iA-Ms@g|8XP0iMAL^KIE2x`u`0P8b z-@c>GT3yra&YM>Jbiz0*$KxTl+0ubx`tT|epP@82s9o;r5z&dhBGx178f-ad2tnah{% zKRI*zLC&;gD#=y7>vkniSn%P?x1w1q4YC{eUbw#N+|_SCf7zFH9k_Heq;>ke=dZQW z>*nk@+_ieg^t~an*6C7Bcac$|t9=ElCltHe@NN klilgWBUqs>vfoK@l>vj+F=y^WdS_cCdoNwP?#N&b0FgA482|tP diff --git a/ui/2.1/images/total_vm.gif b/ui/2.1/images/total_vm.gif deleted file mode 100644 index 170348e38149f467c6612e2c7b9c252119538b36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3066 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 F06TA905t#r diff --git a/ui/2.1/images/tree_eventicon.gif b/ui/2.1/images/tree_eventicon.gif deleted file mode 100644 index 7dcbb0c636d7122787f2edcf59e7c59987481aab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 zcmchU$x_pB0Ed&9Eee2gO|w#{~qe;=YXQ!6(osa2#hG?TwQU;8n&4uw|wb zX=oanw)UUUgl?uu(=^T22-D6ujp9T2JA9Y#@Ev|rfyv>Kml))SDiGv2P9m93&?&<( z63G;uOjA_cG_6bqP!yF&(EM_~)oKyM0*>P>%g%+uf*>v~QVat`N#b(_S+3TqDoMu0 zih|?c7l^1*(+GmFOsh~V&4s@G^`az4qcNxL004B;WEdtAi7YK;(?5W&>m@-di&DL= z&3>8XINmfH)v98c4LU`$ER)GFx?ytsvQU<7`&UI)MNw=vn_Rx2D78>HT>2@t+ik!w zBuVD-MccMBfB}HzvRRJL)iqU=m8w#=>=iObN>W8ul%h~hrIMPa%d(S1! zVKr!)UR_x&3uWlPtiOf+>kO`O?GwoJ`7MmN(04El1tDbO-j$8lkGRp`0NmBRZ@8!H z@C76YU-a)ezIDV8J^YB=d~|BZ=&kOd?Uz5?eX;jwU(eI&!QJogY`c1U%b`u!^YbXW zd1q(mvnS&L?@1RjdCpVt9J|zifhaqRVk@6A|WV0!+QFhBkq>xg-W{Ltth^I98X 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 e5103e46f592764438f56728924929cc9121da52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 728 zcmV;}0w?{6P)R z00G4C_|;)B4d!k>!SEj-fEYo%rF$9w1646FGBPl*FaUw9Bm*1(1Q19m!^Xqb|Bqj( z2kT{AvInFX2tdk#m|@FFi18q>31sNOt56j{Ak5Xk01!Z6TMk{w{D0^946rT#p|*kO zB+vhhjJwZR{{QgpI0IN8$V?aw#6ZU}u!sw~G5ljX&cFl}gg6bV4y@=u#LDA08UHgf zLDc*M3h}eoGib>-FaiV+*dHK#>~h`z`P&%&gZ%XPB_uq+{sIy6cQF1(cpPH1vSbE> zo&I!2#^rk%{{Q`t6f{tWf~Y9x|BNiGYzz#n|KV;!0ej9`{%7G}Wnd5!2xl-=UjdhR z`|&)`(MAlv|D9l9+nSxbf_-uQ zVZ;AVzZxOBp&@9l_8%N<009OMC=fVxz48CGM-2>r{xV>=8pLD;CI>Cq1_m>&dPcaX zK?a-#YP|lq0TB{NZbb$l@qhmq7?^-Dq9NPJV5(8a$m|=*@c-V6Mh0ePV8lW(6O?9! zvOzYp05LOABMZ=PAhqv4A7J?To3Vj$({YCX|DcgC%wx`=DK``7&Ht#0hY{l94_~e_ zTz(i0k1tRHViDvvXZZZ@MSAd0~1i=KcFJ0QU4(!_xtyK22i}gQXLPQ zIV24BUxuU=nBQUP1;hXU5h)e~G^GwBlIz8L>Hoj{o`tIUKLe@`s8@N}(irrWW@1Jo z2)ulEKm!0af(nNw*%K zc=Y`G>-SIA9d0>v=uq#Pz@VU@-@ku<`t<47uV3H3ef#m_$Coc({{8#+;lqb_@7}$B z{rd0Uzb{|Dym;~A|Ns9PNC%2PS-_ffKqM$m7})cbLP&Qo5PmPEIohO@)dJ+-DXNNvnj3Iw0WL|r1?xGHs0*?ed(GBhYoA* zKX&|B@QD)%r_b3ln4HMw&CR}kG zkHdFY10y4o?F_ZKUL`B~l@(S^dD*1LK7E}t_r%E4WowyOb3PtiQ|oX*H^xXyO(ek4 zZCw*5Ka=wd>FsZCX@p(iOl)L5AS%{&Tg=FLr%@^+lUDOWnMTIhEIceKKMow@={z%A zS;QmZne(&DX)HP0d?dSg86@{H6l`iWd+U_c#Le&5*i>L}NV~ys;?W&N21aZhhK(*~ z1nOm%@V{Vi`}yIa@w^3(9iQy}X(o7SLFD;;dw+lb@c49n{1a9N+0Pdv3Jf1P%=*v3 zrtzSGMJz+1(NRb6aAT&7L6anJ!h&NhB4HU1TP4y~JZzIny3in**CKR?A!ka)qfU)w jD;{;}Z0mT$pcqipDXHr4;6$&*vl|>NstqsP6d0@lZ+5^I diff --git a/ui/2.1/images/unknown_icon.gif b/ui/2.1/images/unknown_icon.gif deleted file mode 100644 index c08f3c0df2ee78b402a684d2aac59902d7095995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885 zcmZ?wbhEHbbYl=?c*el6X3d(|*x2XKpRZW4qOPv)$&)7w7cRVh{rbIo_g1c4xq9{L z+S=Op@856VzWvgrOQ%kq%E-vLa^=e0xpSvXnR4~&)sm8u8#iuDojP^-^5r*g-n?+( z!u|XA&z?Qo(a~||&YjPnKc6{s=HbJK`}glJDk^&M;>D38Mv}x0di;L6K)7#tI4;?zRZr!?r2M?Y*ckc4#%abNe>gwv+v}x0W z2M>P#{{8FMuTP&o{rK_Y+qZ9DzI^%j?_W?*(BHp*U%!6+;lqcQFJHcU_wM4wi~s-s zXBhNA@h1z|jXEF_6ekSq{~J7QI6PY0+B-VCx_f$iIBYzf+1)&+O`kDy*6cZR=goCv zcV^O>zij!6m7ZEm>^iG9Y@9CNDnCbuozK~EkE4{+frCeC(Lh$s@W4opet+ z^LaR5yM9eWdGOF#(}_`4Rn$rIUaR$oj~^HqKI(}wO0s?6<+bKzY}s)m z(cy$$1KY#Yh{S-7J?++93@aGdC)jqhR%F~+G4Y<8q7hd?#6>{{enlRM7>xwS4pwea zt`9pBgxWnBoGe~FSs^6RKG%lpr-WC@3MN*URvuQz0~$e00%{Est3nuAm{{UWLcO-G zxW0(x+{GVOTQ2l(&N#2;(GYgxCOgZeE1Ui*COI((+TT%|@nL~}>z>@pTz=d>#}l@+ zHfY4HsW{MZ)Jep>A%TUlg^|NYg7MPB!Y3Sz0t|*9cNkA#oG7_EZcoC&tYfWJC+6u& zGq>GzO7j*ldUWjVU8f|D7lur3{W6T=JmMQ1PUPLXkjdQbC+*py?7AuY{<*!ozrTNQ zc)kVWyhdJr*1i?-=lAXX{r$t^)AQpGFblA&biBBKe*b=8vSQOnXi%|Wa1mPAqR=47 pWA@@fvw)k%!xj-c4F`@XF-%9;L@XXXY*#RII>^SZCdk2H4FHAnYy|)S diff --git a/ui/2.1/images/unsafebar_bg.gif b/ui/2.1/images/unsafebar_bg.gif deleted file mode 100644 index 2cea63a528d82ca5f56a672e16284e0f1d4c1402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmZ?wbhEHbWMU9vIKsd%hmmoEiOFFGhP@07iy0YrFfc5YkeJWNxXH?DEhFPfW#zSc zdRy%6*Jx^PVq{z{E4!SLk%1JT_>%>!Tn9vg>||h-RbVjSX<|9J$)tCYO@Cs?aYq4x QDJp%zBF&8s0!$3n06lmd7XSbN diff --git a/ui/2.1/images/untrusted_icon.gif b/ui/2.1/images/untrusted_icon.gif deleted file mode 100644 index de285df6370979f5f09cde8f14638f0825eaeef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 955 zcmZ?wbhEHbbYl=?c*el+@#DueYu0@J{CUNS70;hPudAzzjg7s2{rby?d7~T{?B@)KM9pjEs!!+qW-YzWm0G8&|Jhoib(0#}_Y-N^`$||NhUP zKXd2K{rdIm_wV1YT)EQG(edicxfd^9+`oUnq@?7+g$t7>PcAAdTDx}bojZ4qNOPZ1 zRoTCP|IM2>k4p2rIdW|3)TyV`)y|wbQ(s>{ZQ8Wj+S-Q?A3l5b?CjaIPd9G9;Nf$| z)bh*K>koP+e7<`9<-x=2)~$Ood)|xv2d_rO-|Ot%v}x1hS#vL6zWnakiIZw7*E4e4 z+uJ8insl$D=hdOZzdnBa{_fpHPoJ)?uJrWuLx&C(7Z;y3w|>yw|LMicYZ*B~K|#NM z{rd9d%coDDzJ2@l`}gl3KYo1p@ZsOTfA8MC`}_Cr>({SezI=J{;>G{}|1(etDE?#t zo1_CGL2<&s{=XqTiZ`vbt-YhOtGlPShc_xcnLRaq+VmMSXU(27ci!Ao_GA{b`OB8C zSeb6d!p^a3!>Yt|Yrpi(wu!qo&){I^OWvKR5_$BP%Au2|675f)j6AhH*}y3|*+wAo z+QCD~d}+5ICabGIdiFdy^2Nhf4|hpPxoSGNYlg-Bh&9ao!mt)q}i}n#>s|Cn+B8 zW)ayGu)sj6ahkZ%;uAa*SeJ^`sK;)}c*xW!#uCt*rTJy)s;jGbBqGiRnYuBqiQ;zI zAh1{~oK28RWWlGYt8cE3|L+r(+QfKBU`GXa>CMyS>zP<K|-eN#lv=mHjPIeGC>gwTZEYel9)7d9y)NO9MO2(V{$Fyaj(U* zj${tLoI*DZQ-OeE6I{eHpG@>nTlqv{lABNfv+DF5MJLw2kj$r3dqWhO`qNpM7_0#? C8O0F* diff --git a/ui/2.1/images/userlinks_bgleft.gif b/ui/2.1/images/userlinks_bgleft.gif deleted file mode 100644 index c77f366ed37c597e85e71d8d03366aa56bc8ca7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 640 zcmZ?wbhEHb!N7nDW~ryukWT};v=i$EU)h_ zrRAt-=qan~s$}e?Xym16;31>qET``(Z{Q(s;4Y`@q6}22=c-`fu4w3?Y~-nA0Mw=JB&+8lr|0S%nlGd6>>QS-Y~nkT2{qG0GDqw8WD zkm(vxVB?>m=Mbr35uj@qCa>q_6qYBeF5$(Ag$x9Z0x0C>LYL9 zCaLM*6qax360Kn9&M?$~;!hT^lXXBOC{7sI?>2CI)AO`0@8 z+>T#{X%-Vd)9kqm=kw2FVqC7Jv|O5T)f&e2j4Ri$3Gm7YY~y9yvu)cRUV%MqQi4YX zd5@hE5z$pvK6Cbhi>RoiJv!R739y-JRmjl$_&B4%x05(HA%n-^>Q&500fZfjWV&dkVQ F4FJLQd{F=Z diff --git a/ui/2.1/images/userlinks_bgmid.gif b/ui/2.1/images/userlinks_bgmid.gif deleted file mode 100644 index 0b85c36ab18875f937fb1182c976bb2d1113f961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmZ?wbhEHbWM+_JxXQpFt?eYI?=qaP)qGar)VCXKd?msY`st8nO!N7nDW~ryukWT};v=i$EU)h_ zrRAt-=qan~s$}e?Xym16;31>qET``(Z{Q(s;4Y`@q6}22=c-`fu4w3?Y~-nA0Mw=JB&+8lr|0S%nlGd6>>QS-Y~nkT2{qG0GDqw8WD zkm(vxVB?>m=Mbr35uj@qCa>q_6qYBeF5$(Ag$x9Z0x0C>LYL9 zCaLM*6qax360Kn9&M?$~;!hT^lXXBOC{7sI?=-M*+RJltva~j_G_|*P%d?12l2e>A zWs(dN6aTE4GW>S4_~$H|&BUn0D9yM+Yt0&IrF9!Nux;bz6%dfwxow*O@Ad-%f>K8X zc?FM4i74xeTu?rDK~z%GLG-HRO&4Znj(g19-1oR2+<)?z+mxIA9fvSGhuR1BkHQ?^ zK7Qhm75lGdwc*3@LriSqs$2;g515$Sgd}7d3KTXz;$^qu5(!XnT-?;lT9h+I!IAO! zB(4;Oh|VNcZ%+M~bt;SvYJ3t#spkX^H8-A@b(Hubk)-U(HQ$c)LdV8OM><6t85pbq Dj$3;H diff --git a/ui/2.1/images/userlogin_mid.gif b/ui/2.1/images/userlogin_mid.gif deleted file mode 100644 index 880f6f807b1d5a70210569f4dca15e8e28fa4cd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55 zcmZ?wbhEHbWM`0KXkcJ)baWIJ7FPVp!T5{)M6qmQV`Z=g E027r9l>h($ diff --git a/ui/2.1/images/v1_logo.gif b/ui/2.1/images/v1_logo.gif deleted file mode 100644 index 81fada98ed1f98d49720a3c6d21675af9e3e2600..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8453 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 diff --git a/ui/2.1/images/v1_popupbuttonbg.gif b/ui/2.1/images/v1_popupbuttonbg.gif deleted file mode 100644 index 3e6a8a72fcdc64c8a6a8688275e238014077cd81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmZ?wbhEHbWM`Pb_>6&J#wPi+D$cIODt*h9Tj#2!R2x=I(5jrM6_RBhoM9f8W7fY? zDWirfs=y?v!YIDfxV&GxeSzxK^$I0DI%R#@(>5qfSfw;|okCtS@8q?LX|)FFbq4uu zx{b5cvzzpCTlA)_SIBGC>t3Q9lx|+!ty42avtyx3=OUH3662x{zSeoFJxi4f+I1(d zm2I9a*0DgMtVf_~l2*%HwZ7#_31vnBsTP507SV+!$(4qo*=7@0DNb6WIDLcsv<-3% zGu5Z8Q%J2b%xcsx?bU9ZuUgol8ys(4V+kv3jy*Y_UmEr%v5;jmUh{>WM-%Q#G4rt7q49*H05^o})H-jpBrr($hD} zGtd|){$v5$paUX7al*jJQO8y^q7R^$y1sJXU`dg zU%V6^ef3(j-pyNj`giZ?`#gN)6ZiC4obJn4y0&lM*>3&#>GPMb-@gC&`RjL&$G`s` z`#5BNw6-5?w$ajviC}Cw+^(SFF-PNJ)6s76x{NzNl$($DOYZ8BxtZF2ao z?Wd<(>71C8nb>%CHusblcUGpfou6;a#vyBUpyT3Vw=j*^T}~~Rmn*S&%=Mc3s&jRO z|BM@_uDZ0WPf+HO^e*e@+ME$85OI21L(letuc-wyy{CIm+g-7_KR#jE5^>JvNc-~(_7yYy?mAC+eWTgo z<~i9@6W>4R&yn!2Yi|4e!jvKMyqrhl_Yd3;X86muH~;=2t8?>wJ!kKKhD#p~G_cq; z9BSlPWN@^J$FJ~kv%tLz2U6(UY{3!Jxd+8k8;trkn9Vz6GGn*d{KLkRw;6S>)vup#GHr)m z0mF_}I(fa?SsjL*tL2I(noQfNmC~e@)~pd*sgvKQ zUpG%Psa~gWf@VUkRz{m)+j8yPZqwQOO{VWMnYzQMf1~lNy{0qw>XuE@E1#}hJ4ZXa zOTS@(Vb>bHNt-o0Rv0ubGM==>sArvS=~UC1dyFS+GH6e&V@OHF6()l8^UYg(icUt>IJtKqbrI(a?f8O?eXGxTfbXeKvk#8vASO*Cj-X3)Gu zr?B5-%67e~Sw_9$ zG&Q%hwzYS3c6Imk_VrJgIBD{fsne#maka3YW146>(+1B zxM}m2X-wO9?A*26ZSOv}u!D!ftdAbE7CU)LEcooXVC{>Sv>mTrb2PYl%OL#jy>R`9 zkMv!hK66oj`AVJf?K{S;A3uHm^7Y&IA3uNnp3L^|KLewXgvW-2gXJ88ZV@L8nEKlV zDtl&l6tXmTOGy5?apEI;SHD8w6$#HxZjF;Qf|scr+@#vcZIB!n;IMgFlaNL6w2DKU zpHF6XXyy{NTC(DzqR}L+sf-I(26LD#^4glXXjP~%^QNr3yG*;TuMbS?khNxRyt$bp zW<~7lMNPN2i{4f_F;{zG*WKNrB`@x-R&Ke!UvUP9+?gZo4-ebT(ulkBr0wx>^CXXX zGR<92PlrTh+`FUH`20MlMTgv3#_pGwBPOhf>s`|R`nv6c6Z3de8{gjM?t5{s)}{6R zeXSr4`FTxkA0L}YX~f?<(D?Z|-!zZ;`;Ih!eJwX92 zUcagJ_jjFw6Z89f`|54-r|NKuB9yC~{Bs^%8Ojz)sNy6jdgXSO=#fL4P nB?%8(Wf>MeY;&l2@UUH;L-A3ElSbmBPOppwkGiB-m>8@9yp?d_ diff --git a/ui/2.1/images/v1_popupheaderbg.gif b/ui/2.1/images/v1_popupheaderbg.gif deleted file mode 100644 index 92d02281d22ed8ea464488fe61148b3ac762a0c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmV-W0G)G@CLtHsbWj0A+IZI?PLt7;`PdH0s zI7(wWOl2-WSv^l^FF{&2Nn$KNS2RapATvubL|i{oYBNP%JWgjkPiHnrVKPNtCpuC$ zN@6ZRSTsgoHc4VFKv+9XW->)xHArDSP-r?$Why*XA~a1NF-adXNh&>6Av8@QHBBr( zSO5S3A^8LV00000EC2ui00#h&0RRU7K!9*aEEyuH4^z`?@9#KmC&$jQpf z%+1csxwrz;)YaD4*e2TBCIjBz;NjxqwX_E3=;`X~HSO*-AMx@Z3-$K*_bK}ODJcH` zC}Ig5I8cVcgEA&4T*#22jfW6zbeKr7gN2J2GiGGPv6X_4AVY%OK(gcp4k%M{h`_R? zOP4KT%4`v$rp*vAa_WSE>XeFYpFma67)q2zgQG~3CLO`F=?Dr?qe_+fqN>#wq_So` z!L{p&6=1`zm_fGe3<+q{s#RN}t=ke6;>w*nH-p`~pgif_djNvpzkmUQ7)%(%gTsgu eC-%U&u?H8BBfE$}xpIt6m@{h%@GQKLqwn2B*TI?QrxLSl;YYJ}3DwJB;Gv&X8I7R5n~wv>bz zQ7MX2E2tW+RH6drC$cj;PiQ!}73na`6 zwn%ji_d%6Zt6u^RyP(>sxUfHpEW>v1WI8FX-NZ@ppOtWU`IM+w(!evbSj`056$ zduH=wsj~W)zCgF(=7X=^bMv4j2}C$^ljFZQ2DR@7cMpP`q9o%@{PE#Xh_A=Gh=qKy z!fPfRwqpa&e9J{g6I6mz|F&U>DI(gPHxR#}o)ZnT>U58o|Iw-9zmxU|(7sf$LY)Y2L`dyCTLHO(FD z#_bopTB*aIrd#m(QJNm=RM1aSy)`wfJgc%8p$zdt7;{@I)%xVZ9v)T98CtaU7vcR+(!z$M_n9@($l|FW78)v)O9^p z38LfU?ARh=!ChPKzD5$uq7jV+FrhOKz7JCBX%l{*)ZW1*C@IUWyT7f+B+bV~Puw}$ zWTP11KaTsb&)@&EyYuA7uh;&c93l>L$alxs;g7bCIpmn|{rB+~=YIg6O@kG`ja}ZI zi5J(srcf}it<+?_>Z#)U{&loy1~Z1VU?qs+eYg4oqmU^(R`{m+$OuGLYKLYR|L|yn zZ|msGD-J{lEI!5LqGfGOGFFj+2aZx!7@DS8b5sRZy*O`D+PBjAhNMK>MDyrwy+3hn z==^p}hyEF{Y-@IAwV!`p{O>;JFwv*p&P&u)^CSYrOU*26syNdhUtHhAVmPkBO|7LV zhNpG+<-yhz8l_7z;#>c96xhAz+@@?t3endtS4I0#Dqih-;|Z^xfbI5?ifU$wUhMv$ zoza@(Q;Oq;qZh-?%WwStY*1CMy^CVmp7emWIS9EDU-1cLM{b;n7!(>Qme!oPWk<)0 ze;0PWM`((;5+U|H?Kf9kV5nTuQ|m&!);M`e@ryiEBUVQ;+@yT;dczc%C&A#dD9>ns zdeX9nkK%CMbSpp*?*2$WWm}QBa_o~e0BEo`*kZ2=V(c=h0qQ?n z=mBMAJwhv!_?WaBbk(~mCGOdy7mA|EzMGKLu_z zyKKnsrz{bimt(qA=)HAdLYLu}kE=M?_m@^N$i1ghB_kH0cBX57Kf39CAQ!4Ncwoon z{AcIa-Pq0Jn;LWM2pbK?>mwbuxC6~r`BaTA#O7;7) zdDCAlwK&$MhLNL{6UQs5wwd+0ZV&UmLSz^?NDPCZ1=SrP(>L~G1W`Uxi8xnJJ{mwP zk2zGxI81d?DDcn_H>Yx}!u}Ep;Th3R-Y=C*1?MCs^CzblrI}jbid30liK1-Tc+OX; ixDg4SJHrViheL2O&yrru!-IiE z;BZFAWy>RsOdWzACz>OA7BIL^luqq2dU1?lsk5~JvqHlGR|er71`@jLZk-Qw4_U_rw1J7xsBkO~4FD&-wel^L?`Pm+)XEhC_$$?e7 z85nPEO_pJBlwfG+Ufnr){wHsn8;vLVR~Q5ayKT=tzopr05Q9h1ONa4 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 3b067b184dbcc9a7f37d6841b463764bb8a8abb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2905 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 Tp;8Hde`NrVyR2KK;~e`h@XY^X diff --git a/ui/2.1/images/v1adddiskoff_button.gif b/ui/2.1/images/v1adddiskoff_button.gif deleted file mode 100644 index 4d5506665f80c0416e2bf3d3b1f4c46d42658bd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1798 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 J4}t^&06U`b?=S!W diff --git a/ui/2.1/images/v1addiso_button.gif b/ui/2.1/images/v1addiso_button.gif deleted file mode 100644 index 93cee78fbe653e5f0d1a1012420cd16c53b9094f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1387 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 diff --git a/ui/2.1/images/v1addloadbalncer_button.gif b/ui/2.1/images/v1addloadbalncer_button.gif deleted file mode 100644 index fbd857fbbe418c2450ec048c5c34d9c637c72409..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2822 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 QcCvR|;x*^O1Oov8J2vKXQ~&?~ diff --git a/ui/2.1/images/v1addnewvm_button.gif b/ui/2.1/images/v1addnewvm_button.gif deleted file mode 100644 index 3a32a1d917bfb2d9150aea50a554f831c357cae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1755 zcmV<11|<1MNk%w1VP^mq0OkMykD>sZtpM`$<g?8>tO2dOM)~^k z@$=-))|<%Ci^|fCvcFi^->tO4Sf;c;m!}S@xI@?8tgyf|vA$QNwiSt;0F0jinXCYl zrT~kc0Fk5srnvx$o&cDv0F|f!qqYEun*gZ00G_b`jGzFPssNp_0H3n}jiCUhxB%qn z$eFDGj-dd?&WiZ?@$2r_xsq_ixUsQ~fvgeV6^ZDo8^7iOo21M{-z-M5=g9sBERLHO(L4pep zLTngOqD6`q8BQ!%CB>ePAV2Qdvm_+Qkt0clOlfitN|z>Co`gwLWXqdNQp&7pbH|R7 zds5IDdgF$Up+s-cQF_#9QKd|Nw?)!Ieow+Pn$VjYMh72+x;QYCAhH>J>ihulA z?07R7EHXAbzD!!QV#}N@v)F7pH0H!^*o01u#YB}qAubE}gL$-L&UWnN2rehMogq{# z*r6g|c#h)Fi_3X#r+9D?SEgGZZXNpe>cVqypB_ED@!;a+$g%Lpg8Cdo-iTl#pg4lv z@6}H~FC2aUH$zCboCO*Tu)!1-5b*~Q8mwo8AXL~f1qBD#;RXd1L-`cvob@ z1Ojqsz{DRWSa5(F>MV221qc+ubo*??zVb_M9 z0(8*=1rD@;f)5M$(83=Xh+3(pls53fw%op8g&Ev7(8K~(AhGQqR-|ji3myoN1sH#L zo4^ZAD1bt`TySdz1sybz#Jb$ZOK%Ynm;nIy2Azl{eEJP;s-APJ1X!_PqAF+v4@a4-TMPzdoy0YXF&fe=#g5QO0cybS~p5vcJ; z1v%3__aArw5kwG#bMOZe1k7zl0fY-d01th?%>xpR!u>NILHsc|=Y7LHIoxosumT>x z`|djqD-e$Z9ylBiJn+i*K78`O10Ox{#UG!%^u%NTJM_Lg-#qieD}Vj}@!OYQz4W}V zpoa@F#NfjF?yvto`+CH`e*5ghU;qB~yHCIS0Ca);V$eSU>Y;$}YhV2I2S5cj@PO+Z z;QQ`pKlr&|1%B`Y1pS}_J!nu59SmUyHK>9Ts(^$L>|hE(XhId95QG_Q;Q>QPLK3Qw zg*e=x2|WnH9-eT7EJUFT*3bt(6fuK-s6ii&Xv7RI@rXxM;u4KGMJGb>i8W9n6^l5< zD;80UTclzV$Jj(JBGHOsp_JN7{f xtJnerNPtI3>XD6h6s0F&S;a&4L5gRr;vL!8$v^rska1+95=j7oEeIkI06Q=XJxBlm 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 f8b4af87412918fa3a2512e64ba17574076e3925..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1903 zcmV-#2axzjNk%w1VP^mq0OkMyzTobh*6g(2?v2agkXgpok<8-B=JA8a;HlW^yx{HG?)9+S>+kpaj?3bo)8~rH;iA*# z&gk;T%rsisn_V^^7x$6<-+6enbGCMGHha?U>Kw#^mpT#@}?m+J?#Dh|1!b)arr8-gdy-j?LwI!rX<(;f&1Wk6+E*nbhfo$l!^~Vo`J>e5i_7EE z>hy%j;o$K1@b~-H>+`+f?W5J_m(%E@*z0t^*uLQHkIdx3;q8>t=%dxnva@`mYk8Bl#hpL0$hTB z5j8+RKdv=fur)QcK)JcMKeV>5wz0uKy1-jNw#mrKzgxV^udlGg(!a6D&cU+Cu)q<6 zXmxc*;^g8!;^#g`}Mb z_88*kA)O%+={&@UQKQ9)5h zJb26*DpV-Yp+|!vCCYT^Qln0Z7Ht~!Xi}g-p+ZHP^{G;>LqXWFg9FFdCS&b1F-z90 zTeV~V*{)@)R<7H!ZONh~3pZ_CzIgAJ-Rl>vS;KGXrX5UnkK@OXAMXIO!|{&GlPh1| zvpKS5&XqZf4o$lA9x#$EhZg~bnBp?)HagFj)illjBF`ElA+W@OQ!qsxpL zI%X&s!Dhw?Dl>GEpMCV@mmhvQ%trzj2i}L@eOUxZ--8I^7vX*MML3~@6yC?iA8Z_` zfCUqfK?Qv%Q1M5C6&{#h5HLyrV-ONpFa?b=VlhAl5vZU52C7(*fdm6oAjk+3D4;_B z0}?c#f(lsBC}ji%_!fj1F>=wtA5?%4L$M zd?SX85=elhltILRgbjfHi3Ao{*zl(fG1$OB0S`RjK?5-~;DHSeRA7S%f5d==0uPv= zfCd^UU;>~vJm3YWR2<-E3^Dvss0UcY5P}IYw19=DF)$E92R3jJD-tm{;02-`bP&S< zT67R=1?MG-D4>ZZiUb^n`WYyp&$4R60b>~Y#~27$@du(NV8Ow-2Oyy71zKovL9Eq2 zfJFxd9DpdRnGTA@0R>p0g#uQ@;DrgwDiA{f8Xy5I60;usz_DXEpoI;8fRX9{y??T* z@fBAj;V~0QT=B*VS3L2=6#zIO1p*%bA%zqN9KZw?A($b;A4$By@){gSafTESFmVMF zQWVgE8B<7+1jtO_{KOgn9H77fFQagU833#RK?ovvz{J;2Fwp@F4otzs6K5>+Fc zu(roZm~1l0OGiNj5k}mNHxW~qkwp|{6p+Oi2;^M`1w^!M!~!BjLBStHY=A%%FI>Pz z7E^3s#O7vv5XBb-e6hC?e{4>H8AcQ!1rZ#WK?DXSY*5fBvMfe4!u9z_{_ zlb&}Jo8L|R-8tl-gz`BUpo9_$d?3gIFDS9W0?EIyz#kV>PePR`6o3K$1_gYegbUy& zpF9Q^{ILMz%P;>&@-DcL0}1Ufkbv?lq;P)$`%_=?wwHkAT`vbN_(S#nu)O3wPk=ed zg8}kT1Or$w4;Y*v1|?Vo3>Kk+8k8UfDcHdZjci(TRA7!xEQx#3Cwjh)_7<74Z;6 zE*cSuM(ko2uSmo!Hc^ROY)#?e5EU2*#|wyk`JtuB`DPhN>0LZleA3bFF%>eRYCv(YT#upNmnLF0&1*SilAn;81Ha)01lS pB`!&+%W1B1p&mtLD^EGnO^&pl=p1M|HHlAi`XK?56GR{Y06UHMy`umC diff --git a/ui/2.1/images/v1addpstorage_button.gif b/ui/2.1/images/v1addpstorage_button.gif deleted file mode 100644 index c3c101a73e68f0b0536db80e16eb540ce1ab25d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1987 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 S&_kZ_R_KEOVBpL^0028M&uGm6 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 44387df6d58510954bf82b48320c95563575953f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2946 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 sr`LM}=zso~e9@FDJ75W~K>z>% diff --git a/ui/2.1/images/v1addsstorage_button.gif b/ui/2.1/images/v1addsstorage_button.gif deleted file mode 100644 index b71a663fe79cf745eb658d1fe905af7e3c60d3a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2126 zcmV-U2(kA^Nk%w1VSxY^0OkMy(Ab^A%zT`#0I|MVjGzF#$ZWpIdAr7IwZdAav_InJ z$DOSs)!eJ{^yQDD0Qvdy>+aX)>dd3G6s)*Wm8Sss`tr=xn$+5<$k2zgO_`hE? z0En9ap0NOyssNR!0H3n}@$=-SxB!l!0OaV%$IptOvjCZ`0P*zXBz^>i@`=#m|@e=f~{t*UQqE%hZpjwm+%2LB-CBp|3Ny!f1@2 z0GX@+ji3OfxB!=`0GqA=r@H{8w*ZQr0H3k|qO|~soB)ZO0RR90A^8LV00000EC2ui z0D%A&000O7fPa4x1tWMmh*nFhH}D_5gZ%F4OINRQyTatzXaL=wX&C zTd-{Z%ZgnqHtpNGU+1pf%U3JguxI6-oohGn->qW@a~+%)vEMra1l*b2WHMyPku6Kk z%$aiJ&67V%Zj!mOWz(NAUj{8%b!W~3DyMEj`m*iYwp*{Zta)^30dwZ~@F85d4=rDU zD;cgt$rl90=V)Ow+=r48Y6NwV5S)1M=-#`FpQFUMcLZOWNB>?u{PN`hD*S0sAUK=# z;oWzyF5WwF{=wNngB^ARA)tT|%&-9s0}4n(6$ms)gBDs0$lwwI1R+8P9UN#NfesQF z#D@$r7z7O`9%u&wQy7?HiUX49pn(BEAOZ~tV6osI1%5apiXVy?B9J8-$RLO!`Y53P zfdv3?001a%_{S6wAYjJ}4>UkUg(6lk0)rxqV221({DFp;BUCZp2tjCp1r}P2I0ZQk zY!Ji&OFYoQ6f|J>#{&h>06+(SXmG%Z8WfPC1~Z5_f(Yb5iRT|3h+sztYUmi>lmou- z2NoR!&}RdbTIwK*LZqsy5EM|+g%Ay-ssR-&c=3l9T@V2U6b)#=YN`P|P=y9vP#^>q z0Z%50Re~2N(1Kv{M>mLW~ss;-zSUc^my;4BLs~z~7Dg_YNAo0XCKv6;e2_--f zKn+KvAaNNfU@Wo76xR@P11Qw+#}O?5VS>vOlPvNdBbSiE5hj>?gv1Awz%s`ko3QW! z5R_a42LUip0S7AUEb+}vOUywDC{z$~2{osH16GD zkp%`wfQ^I|H<)mP8w`XE!yh;N0YVm8r0{as9AJQf+;Q`LgV|Y>0d^K?Gr@!vR-~ae z+lw>6fB|-cjRFW^Tafq-klPJ;-;ZN~f)fycU`5S2!@n2M&-R#S;dk;Q$#j}ga;1% z!MhXTSKt8*BzXVF3NSE`#uI6P!21<{EOEu|yfeV?9I%29#Ni2l*c}!;a0N0zPkm2t z0s|c20rxG>d`@tH`y9XkDfBLQMxcWTjbH==v|xlr;KCV!pyEI^1VD54aw5QZBX;SVHy0~dfu1T35(4Mvc{A1Yu0 zBG4fXF%01aPDnx=fAq{EBNltSAk(vbMAt@9Wn%6WYF@w2)7;M3r!lY(8v02P^Qj?k44Cgj& zV9qUU!34ovCNZNKOgZR54}Q?Y4hH(q9r(cy1Kj~Y7b;MJD)gTM4QN9ViqMAw)Sw2f zXhbDi(1I#-paBJ`K><1e6Lhqp|KzAeBbrf&YLuXUn7{;B+R%h9)CO?yLmv*h(}Vi7 z4?X=UP=Wdbo$eH<2Q4a3mx@%L26d=M)u~f`D%GMkRjN{}MQT&G`cpsr;HoZupV^{ zuQGb!d0-CHEnCFx?9R7b*Q_ADpu**ShpG$w07lfUg5e}z#6v?G8h14{}2cO EI}%XTtN;K2 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 9209f1adadf36cb9bd57466d2bd6e75638a972b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2239 zcmV;w2tfBoNk%w1VSxY^0OkMyw%+aE@b;tB=CIo8$ma0(`}~g0<$S~4-tYFh-tDE< z=;rhIuG;F6&gG=l=e*$Uq0;5p?DVSH>W|Ff==AxR)acOZ^Nq{me8k<8&EwAK^1$Km zpVQ}f!Q9sD^p?)zipt@@;_rIG+?mkj#^vyw(&dE4-T3?chRERW`1+X7YUc>gvj8Q(&>fB;g-|skIvF#-gv;< zdcoY8)#`=F;B~;-e#G72@%Qid`iRQogU8^V*X-f(_wM)l@Avz?;O&dcWd`|$VszTocX^!UEu?Ud5!*6Z|~*X-c%_k+gWquA@6(d6Rs_rv7yfW+K@#omj_ z-?Ly?h?c#V#VifN0EiJhB>k(!l>jhKsBlb%DR zq>_$}qM)9#sB8dkf`0@;LUVJxzQ4b~!NE~;$Hl>^Y8HX?(RiL@caDv^a9eG$8TRef%^UdG|i) z>YE4=AjO9F{xu|6(BY8^ZY22d5oCwSAVEm(NV#&y8I&ehres-i$H|6GL7s`7sj3buJ^R z6WQ@*%$YZHhMbwR>B)*IQ)Wy$GwIK&9glu(di3edjbYE`j6{zf9>0O>@$%bu@!!OG z0ADV=I1ew%p*v^J+_-S%&3!k=Zr!-|?8B8G@19+}ckSJSgU7)n348ZUaM;jt#eEVc z?X^fq0{_h$9PC};00n|r&;Wc%Tmj&M>@|2Fg9`6G=q>R6+VI!amOk5bTagBC>sX{D4>pg`l52~aSB5jPYt0v&%`d1aS! z&PgMkC`h5D5n0kn#1}+hLByX}3_yUPfSbT8-rWa^2 z2nR%P5XK*3fEt1eE>KED80(Bd0}%s=;erKPgi4?b17Jab1%HH)D;B;E`e+2ga&W;q z1bi{T7=KuB0TC8ZPyh@b{-MU8A^cH*1qoom0T<0aE9{_600Be~=JwD;1SRxf#kopE z;DrN!C{RKQ8NgtL66f~N0{{h7p+pJiMgTw)07S5^5tz%aV$qT2+z=w?uW5*tteKo3%HF4RsqK}G9JEI~#DU68Q?0!|>{z!FX%ZiX34 zV9-Suty3|A2C-9t!XHcg;eZ1I2tdUj7_^?j@J(4_5-W7kJO%>bzC`{`{L#Gt1t38e%HRMq*v|=FP=Wx;5IqNsUO@018s@1TwJT0!GjU51>E*e-OY3xG;eUjG+q$sNeyt&;=A6V1Nfe0}5jh01S9w zhE`Ak2~8+~15ob(4|u=<3LpR}cpv~ioPZ28fJF4APzHanf(t2lfEX-51qYZw86@Dt z6cSMeH^jgnD);~m;O_(iP=OUn$ig8C00S)$q6#Yr1rgZMjxj*P9Yw%`7IdHne?Y(j zARvMmoL~!RV1XU$r~)(y;sq*zf(j7u2QH{U1Q(#>79z=l0uQ-I zEkFPiSfH&MY(WGFfB+Qg*aAJ)v5q2mz!v_n1w}$(0b78=4R+arHHbizm;@IB5D)`C zdJ+MOyn!;;FiR2O@(FvuW(Ty1&1~-Bo8bIr2f_)?aqhvK<3uMp(}~S)n)96S6z4a) zNzQm8U;y-VXFanyPJM#2o7nsS3$odQ1cZ~FPcUa5z>tTAI`p9sh3FF+I?;$ml%W>Q zXdWu6(S<@(4hvYoMmw5Ojy4pd4-IKZ;qXv~nslQ&;DZigI#ZeQfe%xd!c28Ag`3{A zraS#G*}o(`3!I<@IfWg1kP{?w>No#_mTdl@EH&YhLI2*1p=+t!h1N zT^D=Tx(0TyZB49S7rR)*A{MW9(Cc9{t5?Trwhx@0KmhJ4SHf~OvzfhVW&HqH!m>5B ztz~Ro2iw`U+TpgZEiGvO>RR4<7PNaMty)cMhuF$>u#}x`TjhFJ!17^K8;EOd2}|0_ zy0x>oeQR7Bn^@`owYiVgEMPmUTf4G$v2fLEV<(GV?b`OdpuKHlwd+>osyDK2-9Rn^ z0D(1-7P5bp?^=i3Ue3-pv&r=>YfpP!<<|DPs(ou5YinEF<-V4_e-&?oBg|R|cbKx8 NH30+yAc#N!06UBxVU_>@ diff --git a/ui/2.1/images/v1addtemplate_button.gif b/ui/2.1/images/v1addtemplate_button.gif deleted file mode 100644 index 287192b615d98b38756f1b29290b56db64b825e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1649 zcmV-%29EhhNk%w1VO#(f0OkMy>+RO^^yRU=RqO88m8Srqu_^KMgsk0GO-*h?@YG zssNp_0F0mjqqYE!p#Yz=0GX`-ptAtT(Tk?I0Fa{q%F~XdwgBYl$egYO#?Fez(2K~? zjN|CYtGPqR&x)+NMBd}N`1$ddr~r?n0F9vl@$}@Uwm{|S$@%*7$k2<&&x^9ZShmAk z+~K*<*`4L;$=&0+-{iZ+&56a%ilnqFv%p!((w4r;YR1otw82`n!dk$~d(70C?C;m) z=*r5|jpgae=IYJR*qqVXot~~F@blx(*POP&XQ8h%w8B-k#8|MrT+`aAi=F_HqyU_* z0G+S^jGq9Ps{og(0F9skr@H{3vH+yF0E(ReqO|~soB)ZO0RR90A^8LV00000EC2ui z09*hT000O7fPa5vS{5dFh=n2Mc~pO$zQT4aKMWg#IW zBQ~n5t0S+huQsf*vLUXjt**ATzp=2nt+d6lxvsLoxXrVwWq)IO)G#@EFx1uB*w@#3 z-`LtP+2i8W*W}#h+}Y&m<>Bby>+RHJY|m4XZZo z*RpB<512hGH?3Q;W%1^H3-+sAxo;2Dt$P+MU^z2Zte7D}1Y;36#xz!(c*U3}B35MP zfWxuo#-JCk;BZP%=NXI{E2az@wCc=KFn^xhIrHSjwi_q5Q>Tud7A<<)89*h2Z{c;6 zaH-Scw-_9DqVwi0Ji72dyn!EQ{(HLb=)s$Rm(s;|aO!`0_YTh8dUoK_o3}_%CV`pW z8y@_TGGIA`B>_+&26c8+5WpWuWMG|q*hyD`14}?>hY~pa0Y(={{DDJq5d0B<5Xo_| z!4QH#&_Wb{L{Z=p4oIjTbH1S&du4SWj9C!Ys+QG)?K?D;4Ne>_@406OSk zKn)FK3WB4UVtN3dnH~xP5H;wBDhQKy8UUl0J{rfZ4cr<>4^sre1O-3D@q+-j4$DLk zxAxG3t{pglKoAcstLv?Q=-LAU0%Ti29M#6r1hS!Wt82Bx_7DIQ40Ky<5ZG!v?X)-C zaKgMs+~7bF^PT`e5WF5fT8f#k}&)`-i+YB!Ptg1VsR# zfDwP3V8j*(-_Y?NO`OmK6eld8zyb^y!9&Le;>a3-;eKp>mQUKzW6G{kA3&-@85p-DuBZp#OH@T6p(-gWWfOoXg~uZ(18j( zU>_#9K=C;cf)r$611)$#7Hn{WA4H%9J;*>mtRW04P@n-x$U#3uP=gK>VF@cp!x@SY zgD_m-0|_`m55{nZ<1M(~F%?86a3*h3-`F^N7@VhpFKK?{oSh$SrI2K|tQ vQ-r|{7qH?CGk8HQUhs+=RN)AJNJ0v_v4u1|qY8`Y!UA5v4Pg*OAOHY6&{Q7{ 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 a320ee12d483665c981950cb7112a376751191a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1725 zcmV;u215BqNk%w1VO#(f0OkMyc){F{%;Kuq>W^Y@!0M4k<8+a%i)H|;l$(bz~S%S@Amim{m$s} zgU8_S`1 z&*qfT=z+%Hn$_x=)ar=J;*8AXk4eDOoYw4_)ai-J z3+rDe#G8@#@>3t+z>&gFQ(+nmznzTobB!`yek+u`x| zh|1%m)aLN``<>V9g~;HU)#~8!_xJq$&FAri$l;XI=$X*u;PCd}@b~BR_`~Gzqtxej zz}mjx?TgFecE8%z>+{y@^q0}+;qdpq;qI8!=#5k6joYw1hz}k4h+l$QObidhizSwiV+5i9lA^8LV00000EC2ui z09*hT000O7fPa5z1u1xkh=@E>hf_Q}iI9hjlZla!i;j4ho0XD^l#`!|q=zX5PlA6E zF)%%?FfcJOJ+HDou`yM*xUI0Ry}G%uRaLgRvb4dkx~;FZuCdItv(nDa5`$_&cHKJO z-*(?RLfqxz-$LZ!>D}({;NI%u=i=`3=IHX>+&cc@_P(hhA;5);94>GqG>D@ijvNpn zYEft~$3u$_4QhPIkR!r`3K2pK=}?Qsjv6cGml2LfM^*dzI=wVS_W;}pueaRbfNZVA3s#f5dQhMXVk5Q z10VebIPl@YjgS68$HI;4bm&}PFab{X8`LJ>v0u!59De6Yj|QcQ`#2M#FkhXN{eu*Mo41hK-ID=cv32SF5p=9GUt`N9$l zjNyQqFZ^NV2Mai`M4W%jQ3M7PtYAe5BTO)7oPRDsr=4m}d8U*vxGAZeYiJNe5DO5n z0v8ILd1w$ANV#bdZoKe<0|W$NK%1(ny22l-77>ILTyRllo^EbhDWDF(X{Z8o22r7^ zaR$)=7gp?Q>6EGtF~kwl5^;nHW-!4-99<02MHEC3@vR9=NGk>t4}?pH1|l#af*41H zOT-XF{4wnVOl%NE8*NZ9#2@pTkj4>5*b8vDe;n~`8U`?dg1!G9k#8GOL=gc0!PF8w zFAzXH&~XzFXkdZI4=k`n10PTU#vfp8VL$)@7?8#TO#lIg7iRBkx)Q9T4uBr7pDsJ>w6Bi(?X%+^`|Gc(4#4lQ z1Mr9K#LND>>Pp0(d+e;|;k*rbkdcQI&_n;c^G-OAeIC`@P`&otPj7wy_SSFj{r5IV z@BAOnTaP~X-Cu7*_TY0L1|KZ2zy}if92tKOCSsQw?F*xZ-E8$ z9|Hxb0wg%le+Y~q10je(3Ffi?v`k@acJmCrX&<7Nzu!VhKp&v--!ak5N zg(b8h4Eb=vI=GOAB6Oh&W0=Dkq7a5NRACWOctbzD0RaWHVGx;!LlxGc4m`}F4|O;~ zB?>WzKBOTKTgXErei4j1JmL{q$ipkfu!bT`1qNi;!W&|-iZE=U602CkEb38+Tl8TL zf5<``UU7+UtRo-QIK>q50RyVQ90bycLlTbAje@M95Rte?Jr>d$g=HL}9(zbcAmVV8 TJdB|zdniH(FaQC92m}B-t%86; diff --git a/ui/2.1/images/v1addvolume_button.gif b/ui/2.1/images/v1addvolume_button.gif deleted file mode 100644 index ae4f0ceb09cdaa411c290b251e32d98132b954ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1442 zcmV;T1zq|_Nk%w1VM+iN0OkMy!p(h@rvRn60Oje-sVs{ov?0F0jiqqYEy zpa7k*0GO-*m8bxgssO0F0En9aj-ddau>hd60H3n}o2>xk=*XF^0F9vlrnmr*qX49~ z0P*zX$IpuR`truli?za9$Ipx2+aX(>B;5l%Co>($kB_+(~aZk$mQzE z#?FeTwm|aq<<8cd>+jd1V0wN-%B0M~) zrUI_6r>w82v#+MNr#z*ws;Q{4r@OGY8iROvEG&3F$j8db$H>pg)XmY+%FI5>$IRT- z(#+T6*a8D(eCg`z>l5sJ?(g#L?-TL!`0HjMHhMRD{qzVNDDZ|28~+C0_!p3%KY<4c z_Dd+S;y;4`FFFJ<$HknEAUoCo>2c0TkuE&e80li9%akiWdYoCZ(GqC$lRU1~I`3LHm^28~Lzs#FzKmqMMo6{}M_FHDGi5%z_S4NA!B5W7~% z6%%CtUl`e7VyzpxVok6C0N1Qow{gSf&8tH#+_7up)`ffLPK*>W9;dj2q=;}0A0$J5`~j^%eTE3NYs-!SqkaGw z_hA&d5THVU00|T!#u9%laYh9aNFYT5_|>O@2Ka?BMgT=50ALOQC@Wz=8 zyg>mF3(x@s5oyv<1sPLJapoUr66(YoZ#Z$L6Bf`xsGfW}`UVmYJn+T^eWHoNrknPF z0t8raT16B>Xn}f0D1tGw}fe@Xd&;tSo1QEifTEGeg11K=yfCE2Z5d{Pe^zetQ zM8Jx|u@F3ff)#Pd$|Sxcf&PWK{460|B(_ZnxOh(Lx<7NQ~|O#1%`t zLJJvl+``8icU&>Y7O$`|#U`H|GQ}5vTye@9Z#*%{E9^nS%_WeKv(6=yVDla}`;2qX zKj-Xo&?Ep&w9Y&m&2-K|_dImcJwuK2%_N)vG|+x*y@%FYpCI8_7nIP9_K4!i1( wmmd4?u1nsxxPlPCMF)U89{A;x5C3}eqGL|D^N=t8yzsIE-T@Z`2oeYYJ7?g;W&i*H 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 460a83c98ca49276e5fa664653ef1dd7a491c946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1488 zcmV;>1uyzXNk%w1VM+iN0OkMye8b(T+3DHs^`X<{-tYFM*65hj>Ac|WgvQ>m+v|M9 z-N@$gwchRM^!eZL_V4%l_xt^y)8~W7;H}!~j?3Z3Ws|fk4eDOfX3c_#on3K>W|Llzv1qQ%Hw{--Qn@~g~;HP(&&1@+~Dx`oYLi^)aKyv_np`5 zqt)kt#oqAv{B^+EhRETR&g9nX^t|8gqSWTT;O>aZ1^wsL~*6j1}`1_E{;J)DPtJ>_~@b&on z{o?ZYv)k(E^ZDWM_m0lxm(%HZ!P|?><95K>bidhizSwiV+5i9lA^8LV00000EC2ui z07?KB000O7fPa5s3?wWoh+>Bj3f+Uf`1D# ztT!?@H$tzhLasuxuCK8&xUIRZv%avjti{B@ytTv&e|82tJ9v1|($YTF(bm`4(bqoN z)zi}1&_3SLJJ;#qc;4pJcm_uSI5G7xHaPV-HvRZ9`108Rm=B=AeFFjFNa9all6wpj z>fZosZyp-?~JMXG%L}nTCp-OGAV?9=VSIQg z5q`i|BO$^O_W3PwMg$9>w?G6E9HGG<4V>}79~$&0#UB<>Al`WTdGW#vEp!M(hXODG z1PCp>K!gAx6z~TJOgz9v6(A7NVTTn|&|w1;v>b5*!rZz=lq60K^|YnL=;f~QH2~p zFwsVbe_Z*(A1^pj00&?Y$-$mkg2~~E5IEsL151?1;iEwCAgK|O1~I}0S-eq!14a-4 zg`@;DF~SHzSV}~xK~S2;1T_Z1!yh~-@M@<`G(iBR4nPsa9|{DK#RxnY@dp$iKv8Q3 zl*U@BqyPY*fV0g)Kn1iPWN-i*NMP{?8CyJn0R|6@;H(1A(!mA<7&yy@xFa|KfCB?y z@ci)<2+!sV0T}>TaKN+BLW{z|N*qjw6$c-Dg#{>x@CN}O41fav9S}UQ z#sLkZpacRCeBdz(TM#gD2`CU?u@w`mjKUuYU%~OqC^$GV8VPrN@CAAF+%wNU_W<+- zLi?Nt(MJ#6bJ0lmkcZPw8}0K2Ku67U4^e0R^wt;b;q}*GhYfZQV~cGz*o zz4i$w@FBO{aPtxO-E`Z{#}shijkn%*$4xiig3lfI6nYmPc;I!{%|{Ou@Zrbge)Lhf zdg`6~AvfomR~~!jsJlUc+^F}_dhVuM{(0q{ z>u&nzyu(g<@GcNvIqar4FZ}AR$MHu8sV|Q@?Ux77$Lhoz-@EXX7hk6 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 2b757c1c53124cd7e6baf82ce47c2ad9f5c5ccf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1611 zcmcJMXIGO407l=SEgA#Tf`}9kL~J3*5G(}HDh3%X#iDo$iXsYvtdb5|6v_yD2`b8v zjYiI1dmfMP-5s571Oldj5CE`PEDnd` z@pyPVzOS#3PN%b2tl{BdnM@{;NQ6S+{QNwHLYbVLoSB(XDwP8R10s=#NF=VTtPltU zDwWD)GC3TMLZRStxqLo|)SGE6o5LRaMd*g0P3dt!Sy{R^LpA1Z!$(=gHKUv=fM?Ez}B zRuJVE16zHI%jjGE_pTjtXu8r8v%@P($LLEhciv{vtO7b@SKF=~Ip^PsK=Mc^-D81K zamR0TW$$H&N1PArHTWz*yGYx;_ zGhWufWgJ5MzJ>1+;7HE<`}2(afHkC$S^@v*L-|IuuBCp+b>cOQTFRpQ9tOh4-%%{! zp7<36o{CpXm^L~tRq4Ryifn;1Vw{wy+)#8>C9Qt+;Qp-%Mst%iHi}89E8mr*0AIR0 z)}-kO{h;Xw5suKz!-2PJvP>e(Z)O;w;^s09LXo6gb8Ot%Ji8uGQ}DL~j;47I>^{?b z_Mh*4ntxKf7F^&iE(zYb?`Fv5KlE{j35qWL9R94x+`m-t$lp0U1srt6L|7b>^MYIw zmRK5E8eDcLv?RI=R$m^@a0)ArM!hgA3wyOU6r$Y)pm(L|gGDvz-x!K&a~zz_>k7e! z=%*QW8|c~xr|&L4OLH)B-Bq0kjzHJlvxs)@nXlUu&XsB;*aE?UV6;?ND z9+h`SHWN0$md*IPK~c@UN4%O^yEGajTL!*~w|qU~?q$`6u^Ws6&HgEoc5pKWUw$$7 zIP$}LQLPt3bLmeX1ZD{zK*oNc1;pT#ow+gCb$nwCev2)!A#T47kdv16qmX<3jkt1( zj)$e9OV97ruRCDgL?t4PoPW#F0@amYiuXJ@X$hcxR zD5N-AHGRAOrD`UsG1`rZtka@s8Yc&Juwqkv;H-psZ#64Pjq6}1Z{pOvG>&&1J7+on z9S;RR4+lZ0K2Ezzc9PeH<=2Pb3o26CcLdeBr&C2$@x$xdbscyoNnOCJwB7BK+bHQ9 zFC^vzhMpKN>s+wjl9LX~PRe^^+nb63LUn>1H{wD9^e)AG1g3&xKB^{s&-|@s`pR%< z^<+}a_6ong`Sb=SGAVI=+INQxfJTjpAEzg)&Zt(^BS~ApY}K|Xi~wjCCap0!J9?hP zO)Yt{98GA3>kn`;)Y9j;5MGpr3(s&hGn7j`Aur0UY8Gx;ZTXGx6yPx{~GPT_5g-*d8P}bRwq^DYPg2X^tgKC%STyVP;p_#`Mg@~V)Jg}i?%u5 QT;73{xO0XO6CL2>Kil;|&;S4c 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 f0b9f6aa366c1665571fa42333eff975fd9d8b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1589 zcmb`E>pRm60DylkWzAwOj$0*0L{Y3oTXTS_iebv6=!0}}uc8yky8qnnzV zYHMp-TU+Dfynwlz?w+jRUzCd^)`~sWJzJ8sFMx!{jHxp8DI$+z44jx%KBy(E? zIyN>gA+5N$*uoZ(o13e<);{=HL~v-NKqyR4PY3=dY!>zZD{cGfpHBdTl^n0UJpWM3 zLW-q}OA)=0Mx&GzmtUrqQt4II*RE7jj)X_}c=`B5dn1E`oSm(#MB+wqlSC?Mk&1+O z+S}XY9jeyG&f6l`F(lHv_cR;^Lm-|G4h%jWdNKU+#jBCmV{gXCp8fUuq_6Lx!zc7L z`i|OJ?cAK>*ZI$j-!%)%pMhbkso>X&oTa5+c!)pcit9#D8pW}R<3}}f=;*(ja?X!# zz4ekw_0D&P@LQajU7pY2^3?}a12Mi*ZtpeE*glNdy*`-fkvT4~LB#ZNd}CoYa9<^b z8^pSd2k&wkF3gL^(lHBDj;;7?TWsVfi(L&T!tT=$g&zr z9Bs$H!)VG;o3HA=R_w=3k7tJXK#vRx2n3u}T=o3bnUS$2g>cC=`nilNG!TQj` zpgrDcGb1c_V@-t5{1=PERox|#d%n+WhaQ{>W-SvIG@p8c|5PZl7Xb;HmAx?Lq09ws zx%DOwvb+0@vC(eOS(1r=x3T~N$r;Nv$4%WJTjzl|g?6aBXNw%Ux5f+LZc$1DYdHu` zbG3|$rtN-&kESEW@o#C~eW3HS0~5DuOZP52o?p4_2a`pc?!FY2V{j}e-~uDmcI$h_ zQIzaG!=GqjU*#1RFmWXeWpSYzeM!bOSl?ygV2FL@m0Oekh&Rb3Ob0kHv5(foFbU%i zRX0d5?-&lw>CIGai9h(m+A=5K*t*I{Cmxr9qw?z6ry2l5lZv=F-u9~D{SCaM%4y!M z2B&zwP(_Us-eyvrg|hojd>%Llstf7@$74Y1ErB!Q9=FVGl6&Bf7|G-Pd_nV*-%bl8 z-MGL{ErYngnRRx_QHin*>_AoP2hqpGwu$@BNv&V6@Lk#$`uHwwvmC=l#pG(AB)MJA zXJx0`2AWoHjq`|D4RM~)s$s`5O)Fh)A%v!TmS;wiRco-x%5J+#%o*PgeQw}L zee&Gkk-&&uLnqTCE)GRS3tI-x`LVwZ$19Y#UnU-edb~{S{|EOfPO)Qt1oxKiF`A`W zn?7oKA~|mr1y00|Q>}@rx3q(O3*$ux67P;P&_NmRuf@N{PnI7ic1}5!h`OfCDlU6Z zJ5`95rg`NZmp)3Qk;oa5dXwLDgMx{iZX5k|$->A)13-3cV97r}aMuvNJlU%u%=Wmt zW_^8pIy>uIzm>6`35evnT(P2ni8RGYe!eGUckqLWc`NzCw zWd(q2UV)1D>i(k4F)(54noa?Lr#2T#W9vJZcWw&N=9xccueOfa2eOUI2ei8SNRSG4 zRZBAS^991XRi^jZ1v_XrAbQYz%V%1$J7&xf+pXRxc~a=JO=+BQsLOU5T6k#226`O7 L3ch+L6hQt9#T4?5 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 c56118ce4aa24c8cbb17657a906614ba2115cd62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250 zcmV$B>@d20t_Vq3L~wrwfy}2{r&y2wYeZE zJTyE@>g(+I`1t_}B8rWb(9+d5K28A)BlGn2G(1f`MpSryh>Vbz`}_Or?Ct01>N7k{ zlb4?0;p4u*!~g&QA^8LV00000EC2ui0A2ti000GdpfC)g#Qi8%+&+q&HfPsR8goTEOh>41ejE#Lr^ijSfI`1$hk^yQeT0L|5!sJj5AwJf8u zI_vJ%*4(S)=*yC&0J_C$psy{hyhF6WS+KoT!_Iy2^W@0Ui?6&@>h0FDzgWJ=c--Q- zo2>w~!&cYbtjp4uz{`8K!&{uL1hKwX6-wZdB5;ko7N%G27Z$Ipx9=*i{j$-BpF`TFv=!f4RgoV&+jc=rvRk1E9vdk-Qv27o&cAt z0F0jinXCY(y8xG}0GqA=ji3OZvH*&m0Hn77qO|~soB)ZO0RR90A^8LV00000EC2ui z09gPQ000O7fPa4gC1D742#1JujEjqjkd2Iyj)#_slZuUyl#ZK^nv;lOB>;kdUM?uB zJgY9Rs;jOjs;xY)x3IIaF1fd~v97l~t*^kcz_GQzyuGnrgL~4`(l*rAHr9Jl+Shy8 z)zsnJ+TG&f)=|^g=ilYu(*PZO^!4`l`1$(#^+o*o{`mL{c#ojH4kq&G$fHn44u%XD zGJKdPheL%JC01NWv7$$c9U*QMDKR8Qk{?foG?9V^jT9+hyo5pXrA-<%Vd9LL6K2bt zFks3Q8Z@R*ojzr{)TuP+%bzWY4wVTs#ht4hu4=u*g2mOYUc<7;s?{skvRk*B1$&2s z*s*8-*Mc>h)ok3ia_Q)$LuAI@G*+pSsW_Wgp&A1$q^ zFwxx`ckST1W&gQ7-8U2uylMOPt)2H4CtsGZCgb4`0Sa~~a3PS!iJT=7 zLl0AkQ9}hm1aZU^B0RuG4P0a(0vtlrfWs3tJRw97LP#J15N;%JgaW z9+t;pdF7bLAw%Vwd#?G>p39(z>8O9cIp~&S4!Y@{UoLy+rH6j{=Aq|a`RBBMKF8%N z%)WvjD-^E>@xl9{$MAZnpg{1;4=?@kvjbl|^vfR){q@*K?+5b5D-S-X@XIToJ?0Sf zq5k*lukS}6-^b5>4Di42zWw#zuYUdS%YQ%pF`!@n{0G1N6_9=XQ(p`e(0~=}4}bQH zAp7`NzzP;H1_+#>1QRGfKhW=h1I!-*zZXFGVGx6T(1R&Hpg{~G@PYYrp9N*u2NxRf zg(M`Q{&FZl6SnVuA@rahK5&W#oZ$o#gdqfL=)n)V4}}wSVhdqt!4AUkgjIZC{7#^T J1_&Y$06Wo6EMEWs 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 3dd879a574f8cc0979a02afc672f3fc6a8180f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1717 zcmV;m21@xyNk%w1VOanc0OkMyj?Lxw`~8#6A>Oc(CPAq$l$cz?wHi*dcxez=kea|_2TmQ-tYFm;qHpc;P3bP zyx{Gg(&pIh^@GRYu-og%=JC$x^62#Wj?3Yo(&e+;>i7Kpq}lA3(dU@YV%nbqp0 z*5{$q=GN=<;_>&7%;CM@?VQ)_cfi_qzuJ(`<;mvp*6j1f2|={hRNZJ%;R{$+jGC!bidhizSwiV+5i9lA^8LV00000EC2ui z09gPQ000O7fPa5v5-3bKh%bpRFNcSWOiYZ7IE|H-l!=#@l9gwil#`o?q>84MsAr5Q z5@dpZYcsMnw6wA_HMqI7V70Tpwzv%R`AV9T|_#ml%eA%9mBLp*lcc6LMF z+u7aS-#pyr+~eQi-{s-pOsHcELxKsn z=-6Q}#>0UV1v(Un5TQbg2`OUCm=PmLkrsETELb1~9XdaL^!V`-rpz8QW74EE(GuAF%BVH!Yapk5tB!4)7tf&@`5o5t+gG^p5C4Fn)+*sxU#*InRGhu8%! z1fh}|b&%$&b>FuA2lcBz7k)^OP6ZDhDBhDK@jk)>9Pi=LtB>Fv{C7O;)uV?pemtJy zQ}84ya7F(22;$8r-yh@sf!-Prj0XjK;Mwqj4G=zP0|;wS2q6g&{BgnnTnuo+2@kCC z!5SUd(7_irka%JMRiyaG93Vglp#xW3F@Oy;I=IG*AbcPNgadr>AOszJz=aKeIGE)B zj6WVJqYXF6AZ3(F+~5HLGGrmc4H!69NQaMFLCQ@Bjo#bfD!53)~>Z1{!n`z?3rlp+ux%z&Sz&H$<7KlvP%_ zX`dNnFv0+6CNO0fZOX7f6E`%WCZMgtDTNG5OfkX|QUnmj4U@uJX9BY>F~Ss0jJbdZ zR%8Le0uOw#sS|JZURma zfq}XR#G7urMj+vY83^ z5vZ_11SSJ*zyVtP(S!jUu;GHy5g1TG6)lue#ReoVZNMKSgI%)MOP_221r!v4b`d6w zu{H%9R8T|(e*|Cx1x5!@0R|M55C9emSU>>=Vu*o(+6>T*#ocK4ZGqZz^PTt~ix*Ku z3x6;`fg2n&p7tMT|6zIKYI|OU9(o*sx*iRnu6hGUwBEYwtCxVm?5H<@JM6jZeuV0* zr=I)j!xPWC>c|_fJn^sVamVv__yGMA(LX`G^w38yeFqpw?}PNzKmWx4_s^3b{rTZP zpGNlQoBw?p;e+oz`|M+n1`PP~0Yen|^Pj)|e9#{Z^k)PC1aN==JYWD1h(P>BVSx%1 zp#KJlKmh`fe-C`11sMoH7@&a!edvQ9{18GBj*x^S451(Pu!j}y!Gt1I;R#3BLKv!h(=uD2>C$7 zKC}>tRrF#JzZgRk-cW=ujG_sPNJJ_8;Q>MPVG85e!Y!7ui!6L$8he;T6nZg LTEKuH0s#O!%JFVp diff --git a/ui/2.1/images/v1grid_morebutton.gif b/ui/2.1/images/v1grid_morebutton.gif deleted file mode 100644 index 3d8997942567253304a3b08c9bd49c5a3aac0dee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1754 zcmeH`>o=PR0Eb^8ahYq`QQ{I)Z5p>!6>Wky2yu(J)Gcl$MG{hVi}AL7lMn=@af#D& zO59poYh`m#w?$cXYo~N=*Nb-5T1Qf(rnD$K-T$y}`+aymJ|CWQet!PGZbwfX1NH(N z0ANZ?4olb$i|mVjDZL-P)ts3e7>Z#wlz9iOkoI*Gx>rVX)sfS^XHV+w>wg^ ziP1%oEJ0j>L?~{FD`uqtc=IKixnNOnnZ%Gs2>%DB9` z`qtj)95JJ?q3PQj7%-L2ZD_taL`@Yq26E!^B^dA|j>1+fDKpQA-!894F!`z6^Hi3I zo>P6PbKp=A2d-+e@MQ3+nj=^xN5Z+GtnwhHC@58kB{Q99xltUEpjw)kCnm%cQ5Yrk z>o7HouB(s%q-M`+|^Wx5NfU%zbYGl7conF3KGXyBv((E|W*d!`cHIarJU% z)}yvB&YC?uJYR`+1OWZA78iR!m7~&~7bvrz?M1ELI!@nMem;;jfi-p7H&x$z#=uaC zwnokVl=c2q7d^`1dH-q6^haC9vKCjC^6ApE8}`qKEB=anba!L*#bAc9^{p^e&r)B< z(u*!T(;s374n=Og37(aiJK329(Uzqji~l^Q=9bh0@d3GEr)}a3=ve-npT|9Sxzy1? zRc~!d)=L@ezO}xH)F^Ol=6zaQ^zS{;^2bi0?q<)GM6^;fy}5Adv{Y5i0k1K}$AS7S zx~u*Re8|BE+YI0qvaHk)Adp=0mFTe)h^M3{7vmTMQcW`L1RtSwm(o^+z}B<@`{z5Y ztBy@!Evpc;(243Judu*g@M2OM!tWy93+2ba+h|!!Ye=YAEtn6OXyEyh#8{KmhNS$j zed?3WzkJhxX7M^2=!4}53xj!+F-=>g$(R=0gpp|>d}s?&VUsegMYzmd5DIX(Z=kaI zmd-YbFJ4`zSlO+jMF|y$;4-7bhes%TK$mTB_p#J(4TgCW;MJ0YzurEX1{OE(4 zaij1DG*yFx?X)XTYlZqgX@L3vXf1H-C@m|HT}QPhx4Gum0C~=lp;Gpxmxh51Q0Ywo0i=;^Q{|c-Sfo%j%7T|w=chIm zBP(ZR@`;s%BE^uQrEICYe{_3wWMg@F>6)$OmU8BvL($(;1U+cu#_R8(jp3->!ncFo zA;W8nAuENOeHGQ)?;rj)x}_Mu?l7_<3v@iY^PZltQ&;M~{lp=^j{xo@_YcAVK==n{ C=WPc7 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 65ebfad406aaadd8f0a599b84109203452110726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1313 zcmbu6=~EL20L6DV!9<9Jqd*V@L?j|m6Hw7oYXre+ZA+z6??$E-L}47oQ3u2&%MlM5Q#uSAR!PFP(aY>RK=9GjvcwA0tG8I)&2{8AKr&I^ZR{yyLKmT*?RmF zfC9V#fPHECd__B7p>sGK$!YllR4-BYCa1H+s-EODmO!Bs)*D2PCSgM-hmQ)d4pE~~ zfa*$kilS;+jmA<`B@-*ne1%?s=}WkBiK>Ug$4a;g@p}X_25GmiwjYU;;qJ}Q9x|fgYM9S{sYFQZ{6@FNH_Mc>lR6TrD zU*BpIYkF&%EJCb9Sl?A%s}N;)e`KyIh@`8%G zj6B}J!)KSuZVDT_OSsr|nHH|Z*gT9ax?NBupZja^s#wEAJLl#XQcfX4RL{)joIymG z)>1A~bJ0#N)>X*Y%+4=Z2cHZ)vhUA81|QkQN)vKTnx0b){O_!Oga6MF@u5F_0uUUq ztDh^C#X|h3(XJfVvchtt(9bWLT5>g-&E^+ys1-<&uZOR{uP+0Y`+F!f9{#t{=37n8 z^%^xpgQ^wECbinr)641=>1DA*Mp>ioTRn&G-nB(qhWmcHXB!&nf9$z)&%PuOatB{d zIztfX{0f?Lo|;@-nE!KX=G~hoD=x+1zjWUKKI}$fn(Q69Z{JxacF}*^c4=}v;i6An z?Wf@h^5WG5CBui`YKX z0vKHO5+VxMGl7RUzHT~p`EM=k20BTzYV_YSDxh?ib?hWK6O2rE5J>9)T=5b8$)~b% z7?)UJ%ycBe?tSv_g=kqdK98OPc=ncVEi~#>yn)p1gR?qaQ8nN z`^Go=5J?ee%ag_x5=UACFH&ZhFwt(v8G7;0)3#Eu_1X}xGY9Z}rr$QoyPT6hKM~-4 z(Ux`DH0@-sM2w$F-?GSKI=<01WWY7TOc9>==qQ)_LN;l3iSuQ?t zjNgIO=cYQ&W)>s9aJvcsU3Ny@f^dn)(#?+2(2OmnN?g#J)m69yHdAR_;?@v6NsyG_ z>J=OoiVs&YA>w!04|X_bX!>ALn4HFNrjyPj5^$=6*pbv1kEu84+3*h}(sStvQW(t* zla@q{A!P3$nC0ZX_YedT4^#jc0{V>z8r-a6SjGACF&|47)>4OVf;Q;+h$kGemG!iMTqw3a6Qz zCQKWg@X5Cjb8N^`LLTMt&&+rT$R+_G5MrVO1h)zkxb|EwY{kR5QGLPH{;#c($o;cc zfAJ)JARut&b$_tY(DESQnqhWeRg)pgw(gt+9{i&C^sMbO>WbTgtJ;>d{juM#y3@b* p=4i`ENZS&9FbzA}+DG+t+w>&!%4EyE&E%sOMp907o(%$G{{@O;R^I>s diff --git a/ui/2.1/images/v1gridheader_bg.gif b/ui/2.1/images/v1gridheader_bg.gif deleted file mode 100644 index b15522f007dbfe8a2100dbe5e12d6bb64dd0fb5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357 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 diff --git a/ui/2.1/images/v1menutab_on.gif b/ui/2.1/images/v1menutab_on.gif deleted file mode 100644 index c82b1de6ee2a0b5d341d0b46038d5847620d2e9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmZ?wbhEHboWr2XaFv1K|NsBY0vb&G>P-AA@#6=xfEpvO z%C~RdZr;9g=kEPod-mVFbvq<7ZTYJ8OgyR|K78~KP5k%o-_M^v1HzNPfB*jb_wT=d z|Hh}}GxDh(Jba9iNA=gQUpsg2fA;K!v5n8a|Nj}N4HSQ}fQ{4vksv=Yu+4ICOwgDh zz;I$o(a9XE`4?7{>{3aQxRMjrqQJ$~#i+JWclP;=7piCds<@gD9y)My%ljXD{@r^a zVW+H6-Q3dJ#-J$7F3{fF*B_!HDmY>4wCQ~O(`V0V6%(1ea8a(*;$_QMtX#Ev&DwSA zH*DOrdCS&q+js2TwR_Lreftj_JaqWT(PPI?oIG{<%-M72FI>EI`O4L6*KYs=?atkM K_is8fSOWmPewz;f diff --git a/ui/2.1/images/v1stepbox_slected.gif b/ui/2.1/images/v1stepbox_slected.gif deleted file mode 100644 index 2617ff7be1a6a68654029cdd876bb70a1bca9779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 791 zcmZ{hYeD=_4 zo4UPo+v{|i+RA3>bek?WClzHz1r?Dd6=fDtbX)Yf^X+hcJcs9b;^Je&BaRRjk2T3+ zaVz1X1X`UWTLj8}G>nnl8j#<_!Unh`1)c&5|Hw2cyR2R2(txel2-MAn0CF48_msOwnYgH;C16+^WFugE|*Os-In zM?ro)RJNjanABZEX*Xt9fk2CjUR0Ryf*2|otnJ2}YA9~Pq9!P%vF0ikD=}XNqBi7; zfHGoHBZyj2HGn!hF}R3!h)BEK-%)l0=|RHSi9myOMpT)xx*aR^Sgr%Ll?Yp~sSkw= zYHUakxL0WG!@18t*jUm)&)Nk!E zzu5nfq{f4iQRh64)Gtx0jw*Bf4)`%T#&3IId!V5+opX(IHo7M|q_=l%UtjF$Sc|Xk zKAU|wz!8w-a3vjMv(Mju$lkHz_(aN?loJ`-Uc5+r#ZAPiH`B?<``<12@Nvd__VbtZ zU%zhn{@wHEuirr)bALpM(A@f`Ire ze!Mg-OrI=IdMyn;n69Xgkd`DgL}pF;Sf#;2)n;{G;YzO4Cp6BGT)0O!SK+_wbo6vo z_Udu(-5HtVPVJgSVLsNfjv&ffV$8hjl+&6sPv-Wn?9$oPkEhku$Jv&hbh2MQK? z1@25Od}$N-hNQW2OOM{!v@$Moi#)4hRJJ$s(KFgOb$9+&VPF$|efq(iBtzQR6W-g2 zF3t#*pvigfWjg=XY-zYz@_ew^#*WP6&Ab{Z2ubm#duONaX*jCH{!3q?SR4NU|KC%= diff --git a/ui/2.1/images/v1stepcontainer_bg.gif b/ui/2.1/images/v1stepcontainer_bg.gif deleted file mode 100644 index 3ef5214786d7e0c9e742b21efb221fc9faf84ffc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 741 zcmZ?wbhEHbWMyb#c*els7?SH0n&%x`Qrs{xzqZdOuC%CrLTqlMb69>%PJ?SiflGLP zLVmMHR8dq`y=QcBUQKUF17>$3FQHa6=@~yZV`o<6acr5%X{E%EtHiG?k3c}<0N{eejp?vaIV5d}$wExFY_ z!6{Wk(qT_6>nD^nPKwB=V;CTy_>%=}vkr&^#R&uZ{|1Ssrm)sl!H&)@=APcZ zpa~P$CQq3fI(@p=tXWob=Nc?n5WILX%d+JwJXWm|Si5e$_r{I(TegU7-?39@_ny5v z`}g}EI;45@sLY8I&Zkd{pF5{=@uKOKD|*+jtKYh%b@#5xg9nO_A8S8*X87`@@tZex z@84T|`egR?E68Fx>GHe6qyFu6lidP&Yr_KeG`at}_+ZQfqs^w?>p z_4M}G-EyCvxgMOJ-@m_Jlta!(q9yS#w~%&R&w`DQk1Hv;zjK&b)Np!+aW>n5otvMZ UU*Oy==eujm%gZb5*_jxu0pYq9!2kdN diff --git a/ui/2.1/images/vm_actionbg.gif b/ui/2.1/images/vm_actionbg.gif deleted file mode 100644 index b94e3e1b019527cce9ba41062ea86140f5c985d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmZ?wbhEHbTNM{P^+q?c3+ipMU%I z?dQ**U%q_#_wV0>2M=Dnc=7k|-wz)?ynp}x<;$1fzkmP#|NpaR&;I=R^ZE1VckkZ) z`t|Ge>(>lOK=CIFn5P3GL3T2*CNFr*k@C_+^wyderH%zPq9w8Vw-&v>^-z9_e1PK; zfleMawUb8#<^^Q92+a&zF3F;_`l{5vHr^Ws8ne$%KCV1BEL!Np4{L|@>^db4b^IsZ bGuPHvHPkdVHnh}sl(y9>sj4U|GFSru0_A>5 diff --git a/ui/2.1/images/vm_continuebutton.gif b/ui/2.1/images/vm_continuebutton.gif deleted file mode 100644 index 2f9585ae7189146c44fd4dd250468a35d7dfe7e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 zcmZ?wbhEHbv|$irc*elc+1Z(ynOR?7KXc~Hj*gDv;^Lm3o}{Ft|Ns9dCMK4YlyrA@ zKYaLb_3G6(Z{D0ZapHst6Am9f+|balXwjlclO{DbHqMwaBQG!S^y$+ZH*Wm+@#BUK z8%~`%m64J01nf`Wp}moGnh^yu5S zZ|l~rd;0Y0{rmTOdwZ8IU3&HE)w;U6W57&aYr7cCS-g7M%vFolFE)}iwwOO})zn=ZXRlefQPfjee)>#dg(e-5{R;#c z{CUo7m^+6>RKV`YEJG<(1`$ikebYGBURum@mEro$XACkD(?wkG>u^Y!GN?*OaR{== z2o%gXz{tSHCuj5IumR(NmI}7_GZ$Rza+t!d98z)V;sVJIc3zu+js=ZPqWpYv^9lQS;Q(p_$F;o-u?7fJ}mg?aC9D5_fV-glEyc-5fc zHbH>BU`0TH17qbU)>Dh)>-X)c{`&Iz^7;Pz?P^)Iw3f`c>(tTkpUFePv4Mpt<3S^b zTEv5TW;u<72A_h3t_-0b3tgOrs5)#6& zX3ZL~H6SsTXV0E7{QC8a;o-xF4Ey%&L(vHkKwx{jy1M>LN=h;q7#J{Y-@Y9#X=P=_ zaO~JIT(&|SU0huJpNWYHY!zIBkrBlM*Z@EPF|J#;?*H!HyBSCY)22;hWbEwh1RGmc zRt9oDiULp|+`W4jtL7g+elRe>ILI17euX&~6fv*}N=Qh6^TEzeN=o`KC@6^HM|8h} z- zV_`3M>_{XWatF5%X4veq+1U-$=DwdQ|1wnnBkwqlORut}yvR+{0K2Xu@BMwpL*ZCP zr4;;a+tM%$;Jj;ma(vD$A1j2o3NOn-DJ38eBF0G8THtw}G))t&>q@-k&N=wm_I(GR z=b1tX$d^)*)*8I7YZ}K9xg3}4@GpVXec!)~F;rF6qm-YLmc#!hd+96rwr%tlfVV1E zQ5XoKFL$R{D5MD51i{WC*rgCsnpUy%4^kvmN{ev6VCTRtK9 zeN!_^?Hrhe!u@-uh+$x=;Y)}k_5JGBg-;`VTj#s2UcY? z8i9!tJe^Jl$Kz4JI2;afI2_RH^~5RB%$+~5-|w;AZtoJRR4Sk2hncimts*lbm4P^x z=&)9+VLqS3aU8^PEQ|KdW)rj7OlP=7w3MaMhpxi1zAL{U`uS3#Mi=6PPuev)%#z5H%& zKK{isLfb~8fj2%(x~|JXQR-RlKEvy>J3i^c<7L)_*3Y|P;%81Hu%k6e^=kwW3CXC<2x~U9M96H@VjppO_7Mf z7TLR4%fQR#;*aTzBT*RRULSc9h0*LcLu)h|x#e={8jXgO>~uP*!oM&diiUu|^OP_Q z#nsfoVBq%qy<$0L%+bbiEK3AP0BwAa)glH^jsF3JmN~4~Y&KII>X^r#)Ox-COxPwQ zk=0Zr-FCYbvJaOc`K25V2REP31=4gnb-i9s0I=|Sz1HR|79(lJ`Uo8=yI3r=mdxg( zMW5)?vKNxs?RHqfRH1F2b-UfJEC3*EHk%ZHqR)j-Ql!O&j%yi`PSSbDB9EZ{qZA2p zUcA3&fC+-&nJ|T4?l~L|E1ywL1N6ZQ;vE10 N002ovPDHLkV1iZKif8}; 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 48aea0b94ea80ee740ef2b562c6d3db31a6c62a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1390 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 diff --git a/ui/2.1/images/vm_greyarrow.gif b/ui/2.1/images/vm_greyarrow.gif deleted file mode 100644 index f7c73f6bcf96c2816e75d09902d050303770aee9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122 zcmZ?wbhEHbWM|-G*v!E2|NsB$>gtx3mYSNHXV0Gf`0-=btXWT=KAkyp=J)U47cE-E zfC?0UvVaA2KqSZv1{U=X4W6w_6gZlipH2SWde9)^rb6DL6;qUg4m8fGbaRqo75y+n KhE0Hx!5RS3(JdqZ diff --git a/ui/2.1/images/vm_redarrow.gif b/ui/2.1/images/vm_redarrow.gif deleted file mode 100644 index dd4dd90df24493893611966d111cc53a63ebc71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmZ?wbhEHbd8Ls%bpH|`f{rU6ft5-f>xpG>C_p-0spU%=p>wrj*84N6X0w*;2=N^d>n6S)gLZD-3L{P?}g#to6;pe!o ab2%%vcPgFT>8ZI;n6GAvW3n(KgEatbvM_Q0 diff --git a/ui/2.1/images/vmbot_loader.gif b/ui/2.1/images/vmbot_loader.gif deleted file mode 100644 index 5b33f7e54f4e55b6b8774d86d96895db9af044b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw diff --git a/ui/2.1/images/vmdropdown_closebutt.gif b/ui/2.1/images/vmdropdown_closebutt.gif deleted file mode 100644 index cadd5eb5837d09a2faabf4617657430db12b6af7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 510 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 N=<6C|tF)bB{slaojynJV diff --git a/ui/2.1/images/vmopoup_mid.png b/ui/2.1/images/vmopoup_mid.png deleted file mode 100644 index 6e4aeb4abc9fc90bafc05e4ef51e1e4611add302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 691 zcmeAS@N?(olHy`uVBq!ia0vp^KsJ*P2O9$ehL8YB`$Ex6Y_aJlkigU%Ty9c#s78#Zq??z#4MaZlhe zjbsgT>H7cwcoYBp`pSK1N6AZ}mV<{6H%ECLik`y2$dbfiw16>S{0I?(Szd0 z_W8zY2B!UcH_vcd*{QyiXZ7v(+7AUkTzbxDKeKZ~*;|3uMu`rl4CdBVPNDi&tJnMX z1qO0V`Fh*5RC!-lRioiULr<}=znbQ!^J}izw)TtI3E$Y3YpoQaD)98;-tXR53eU|f zU1QWK6lQr;DPpPO)77h6RQ^dLI|U2-!~Ro&Z(TRc`Wwgmxbn_x31#bDTc;hYy}#Ld q-q$Xxd0+h=s<+<%(zl)EAH(CqyXQNePpbo_LIzJ)KbLh*2~7ZA<06~@ diff --git a/ui/2.1/images/vmopoup_right.png b/ui/2.1/images/vmopoup_right.png deleted file mode 100644 index 91d9f8dcc8175f538275f0ea4208e65d383aef91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2962 zcmc(gX*d*)7RJYJq9Lv=+YHrTh?GCscV?7r?Aa%SOxBRK?E8oi1~azojWL#CtSOB! zNU6r!Lb97|AS^C<%ew^5}3d<(cAR)O&oKqn(|diteg(W9u=?rIq^tR`)(`xG;O1jBh$v zAzki$56r%&Ug(>erfyRjSCODnR&Q))==W7v#n_z zo?pKsSX6?(ku^=In6~WVR3m<$ms_4qiWObLqm}%U3su}v8*fu&oabf_t*JW!p3A zZr?dpHuE)wU51YVzMTg|d1c3gd6PaFztjjxSGm*^+q%c>QZ5>r-Hz?&Pc-V_lydgO z?Em^?rp11WJHAYa8?>*aO^Ij3oHdV=SWT$RNU>%QBrfGmZ>RU@;Wklq^}e}CT6(of z@8}?yJnUpx{!CIbAs53?3nWa=e0W!@9ih7t7L70JegJ@GYeZmOe(t&TUQ$=T>O*H z!334(-t;$gj5$4xixGByDaRG#lNz{0NQwP?D9_!jH0u*XH z*aYsC1yZ%(@E{(4cQ+|Na;w9T9+A)wd`!O^_SvHc0>;G7Ln}k2wn%-ZRYjx>p|L%J z&Bby>+}gnrU?7PlXBhovb$Ufly1%TxK5W4k++4EUSv0=P1A8<}1BN%}bWOkfj46{z zx1$taK0rF|9}TU990AW#=zG3xkv9Cvz}a;~2$2nt!v~r>ePx6|#?NdX)<;DX!Hsh$ z+-+l?Dk(vSFlMnLZy?doDlzHW#!pts4ffJR-rb?gy99#LF1syc+)}pKuRT(Xx>Lm8 z&o!F83hGvp!l`MA&>lwW5A~&VSl!akVwyZTiUA(lef|2L(U-`p&k6Z&_|5^oY1?jb zJ!nY3b4VYR+bZjGrFR(7I2WI32F8B`E+`g^lwPAwcZsw*%}5tsBgh!&8MS8KP0JXp zu)ls=7gK%UHQ~Qe`mOIsFM{Tu zPdhCF;%22jRG+!?k7np!sYcAQ&*b^ifB_|>h#fJsVZ70=q-XA7z2c!_#j1=|@w$|3 zi#ZsBDj_KDEgS>}tTs#Ai5R2+Tgx(i=A%^O8>q=4g58z()@{6(RxerRE=5?-3 zHTUg$Wj#x`4-)z~oGFFKq72{lgJUMkhAE$GV%kR$(n+xj0^j2kBsWNTq6t&J`KC|c zAY0jdcE6D`5#vfiruawt<+|io67C9_B~-5nWVu@={+mYbBsvy#CShz+_+r6`GH(2D z%kR$%f?s5Kx_LW_cJx{^8HMg`;5~atPV-zVqYs?}P=c%Rt^^ic^|dpFgAR&Viai`N z_4B|s@AY|x&BsNzrUjc^tOx6ZqYKQxQvwjn;DDyD;C{9;{n`GP3KZ)I7( z^1tPG#}2+|?%Qs??TN^BSm(UqHJNB)h@=LH7BvYG{NMZZ=3K$ou)r4 zN7N2Mqjbylhgd+XlY>Er}wo1m8D)w`HgDd4dMKr1t2C~cL_@K3Xa>M%P6J;iNWfWntBYW6gF|6=$ zu-=5-D&ySRCisJnj`s1u_Yd}QK$~yHmc5yFy~o{0WRLK_KPIGc@D4wp0`A^qm@U4O zOMS(>R)8l|Vue-3?ZtjXe0H>o6xQojxXkUp70om3Quf20Y;D!r*?Cyo=At+-Gc&U_ zS=Z;anM!_%v(UFQq? zM)8G2{@Qgxbu~2_b!iEY-3*G3zEeN7N=Zs$>#Cp5e}r86KhUn#|n_71JLMTa2}`oXOceO@=r%xK+ykJQY*7xWB0W-X;O z>WE<2I_hZAyiQeg8qKk#ua5yn&^%h2R?hjx0KRy6j*N_b9eL-~bUxPwU^R^DCLzd< zb9dNO^ombJXyjpv@Tc+EFGq z<$!6#@3Xw-exn?^G+F-*F~IJ_5gYwhDpHkhXk=o-lB@fiN9s~4j?GOS2FPR0zA&+! paI{nuuD0kDIML;9`Im%P9{__^zY&ofh5hp^VMgYLczyTye*&|bU3>rl diff --git a/ui/2.1/images/windowsconsole_icon.gif b/ui/2.1/images/windowsconsole_icon.gif deleted file mode 100644 index df33ac35d5792b494203c86c6938a558cb45b2f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1422 zcmchW{WsGK0LH(%!y3D`M#fdf&~&7j&d7-|FD0DW6)NQ=YRTP^)}@= zBaujdfB(;)KZ8IZI2`Wj=@}Xt>gwuBp-^->-PYDtOiT=sNc8dXSzljAp->nMhR^5Q z+1UvM0{c% zILPDi6^dD*aAIuit1Aq7!kwC$mdWHFdK1^y)@NoE3BsAru7nz6UHSIhXqn*4rpk@J~i#EoYM3lnzdRKM41R}2jeL?Ut2<&cV(J>A{i zXVV|cg8)|cwUHze)){rg&-V7sFpXLxkw`+5y;-cj>(5P-$z)|S+}hgmr^NGWwPq;I zD>^#bexKEB!gr&iW4s5(p{4))9Ov8C)~0I!QsPd_Yr#3S%-~qc@bHKxAK2!?0|NsQ z=Eg-I9Y;pTT3cIFDN!&J2$@VC7#PrK7QcwXzH}S6x3@1d5!><%udG+;8JSN{1uKH;tEu35qFR{ZkuXo)0fIaT*(9zM^)z#J4*N^kSIeXyWrp9tO zoc#Le$jC?t1R@fNdV70;|0OmXp#OH9zV)|H0N^h`%TB9fjpfX2LqkkBxV&PAzR~Vz zAWo`h7~t>Mh@$VvbubU{?IDI`<>7Mz3f$^Q`tkQsrq)!+p*F(bcL|yJ*@`#_!YnAI z%u3Q8*lvM6=Y-FyiocDpNUDx4N&pu?oPQB1syh;Jx!;>%$`qzaxyZe)zaGn~(T{-I zq+csuO(2iZ&G&n`Go^KV;gw!ULPfEmu-;yIQ=d^!mv!GqpKzuJ#S$oEu9rpq@30ps z{LE7qGElTxel21yDW&|iYPkMgQBz&!6Tsl@Rh5JPiA=Sa@!QpG#Bm9MVql4hX%Hg* z3>x;ecoh0^lS&a7_{wt`v^BLTf6o^c_EL$ZFPQftW-!EH9}WJ_pMh`n%JohR)+04n zM^q*!B=2Hof&v)O?}Hg>dN^3HM3RkYYRhpN1ZDTzU!uD9pkY*n4M-@r$;KnDAQ*Qr ze>@7_^E^-5ZxxpwXJmV!D$f>2lHe=#g{BhOJ$;mhW!C8SD#YpxRgY~G0c@agyJFEq ze_`_ZsfXh*Yym36loaAjE2%U>M#c9+p(L<26LzxH(a>ii} zq(SZcD%v3!9Y8P&CDNI1%)%vkJ3X~2K~Oq51*Go*2GutSPUp{?P*PL}-bx?iolV{d SIJe%rHRW>{AZt??;Q23_*q=H8 diff --git a/ui/2.1/images/windowsconsole_iconhover.gif b/ui/2.1/images/windowsconsole_iconhover.gif deleted file mode 100644 index 983ec3588dbaf1f6058182dfce6197037e0c7047..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1373 zcmds$>sOKo0LEWUOU;#LwWZF~Y^{wt9Z&19)(1qFMD5h6&a$)SG^?{}m$uXPVQmMH zi!d+{5;2UM2pA&z;)P)rRvKy-lV#>Kxhbz)Uv45^SNk*ee0aV-zvnsUDLix#`Dtl3 zkOqVSU~zGAW@d&?r!OolNF)*hfk35FZ{4~jlgZ}i=Q}z&yk4(bt)82ki$o%Fx!mD! zFqurB&nFUzAPB0es^V}sv$M0|a5xYMOixdHy|Be%al74Ct2Gn~`Tc=lFle{iO(v7s zY@V8$nw*@RpI?AspZ}>ChGD2$f>9@!Jf+xI4D zCJ+dQ`Y1jlu|_)*9HVk;>zK;^7EoopOZQ1};W0d$Nnh|iTCtKVs1;6^%h!lwG8z3w zWvxU}%Vjop4+w>VuI_t%Mk&O?t#}ktA^SxaL))Q@MCQAn)i|Bbs;WwxZK|Szv-b9^A)n8$=H1k_h-3q=BPN=%T_$T6_O<@G?CaKOG?3zYotULkslG60UP1Lq)G>$HTw;o3#k$paY2iW>h-z;D=RQ+D#?Yu09@X6Wn|9x5 znsCqFA0EHmEpAYEINKCF9&c%BNvTwlNTlWEWsk>$!{KZ;8}NTuRwU-Xiio%V_7gzd z3UDz#9n&J}A+9Ogc}6i*oqr0*UWX~^%_FYenu{qK>WPhgCj-e#Qoy}y$vclD8OiyU z0{VA*F4^J;==k+H2ZxUr)l<-E`_czkQ6+kON<8AMcIfPdikqq5PUZB&Sp_v1&c33t zt5zekZJZ$*gG(Pu3R7|_H6e6dQd%jhp|{lavl6k@S514wdAvaQ9&%_oZOhk(y%rQF%HU`}K-07xN-x zEoA(PwH=MzMFq1@@{ZmsPtB<&*=R8keP`Zp1(_y%vLU+gWLrTF9Z1|~Fl}LvXJOwx z{b3aL0}jbjLIjUxmZK6cV0m$1N98D&y-O!6O?o>eJ_Jlb;{pKlpM(wS|BQ&-~x!^kK`Gd4G8?#n#y|x)EM_n?Xh9oC|*7!~Nh}(8? zTTX*Q%DaGVT($1Z%^CT%AI9+CNV&RGz%RqY`Y#W+!g+DXbNhk&2^%o@@`N;-P9IG( xp!3&Ue2kBcNs75bL^TzgK57D+VX8{&&|NOxtH1Ivad*;X1bX~e`Y{yn*}t^?n_2(> diff --git a/ui/2.1/images/wizard_contentbg.gif b/ui/2.1/images/wizard_contentbg.gif deleted file mode 100644 index 0d402d79b3de2a853665a572e25ffef8b1b9a7bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmZ?wbhEHbWM!~p+|0mGTwGjGP>`9KnV+9uT3VW(o}QSPSXEV3QBhG@Sy^6QUR_;X zR#sM1Q&U@8%fP^(_>%=lGBD_X2#^^JEM*rwG_zzSn)h~o_tEG}$()z5YE91TeFZwo zCAs%2*1h+9|Np>(0uLLB{u4`zPUh&%yRf3fYi*SDjWuPb-&XB^ur}F8Z}#~YTdL0H z?Y{qEM~&b5+wXtusXPDv_y2~*rskH`w)T$BuI`@RzWxal>w@$cr%hv>Ia83q8UUvJ BT9*I- diff --git a/ui/2.1/images/working_vm.gif b/ui/2.1/images/working_vm.gif deleted file mode 100644 index 8a2913b8230e34c2a762b6894b709f83c677feaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3112 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 C5~_Uw diff --git a/ui/2.1/images/yellow_statusbar.gif b/ui/2.1/images/yellow_statusbar.gif deleted file mode 100644 index 9a78eb5d256d9131a0a0ac06f17d6c7684306f86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 529 zcmdUsw^9O807W0LfFdAZK*^YMPJpS>@iY7Zzd>hg?Ck9Xvw}M6fH^B>v9xB{WiwV* zSMe{r#p%w>nYrT=V*`OnH3<@$5M-8-dq-v!$_vCx@JCRd!EAxuL3R)F1JYq|hhR1! z-Qw#5=?J)eWY&;b2Y&))6Y?XZYlt_4m;3!Xo#s=c U3AtRVHkGPV)mv9t%*~L{4{)==s{jB1 diff --git a/ui/2.1/images/zone_addicon.png b/ui/2.1/images/zone_addicon.png deleted file mode 100644 index da0dadb7f4b7f1f116825b239aec2b7d9c1d8062..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 880 zcmV-$1CRWPP)^(5#mvkMF$`$n=Pw3D79jzK<3I%#AOTt700w=f zGKMW@tRO1>Gu&qZN*)v7XRrYJhk=LZ9|H>uBZCk>0|U@i42(cArdMwmiXT2o&e+58-wQqO%V-a!2r~)=V!1()D{qS(2x=Z={SfO3YdF|SPqu0>A%kk^n}ZF zI$nWS`np~*Ksh^w!(hZk#u(0Y8EU1L3ox7;S}X5#L0?>N@HGRM=IbhKYV*f*IHE0f zdvwkhh6s1Pk95$KxUDuwsiltq1IH)W3ZQp^j>-XsM>^0B9%xWAAbB4IzWn>gFcXNU z0NwR~0cHRz8$%D!)Z+ip;AepP8qS96M~MFdri5R=7)n^UxEOjl*%^x9mO)j^i3BkC zn6GDe`t}6F#uJusN5Iqp{aE~i1!&fsT?`+9PUi;+it<@77%TUKm9ew(GYIi&0d4xk z@b2?9u%l{KT*mm?m~1#|i-XM-ztm3nl*m0000-TK0ZA?y}P@+sHkXWW(EYo@$vEg z{{FtczQV%7`T6)jg5`f)zy`i6@@~vyu94d(4bT*c|6|I z($fC^KJdQ>_X+-Aqr(?}c>*B!X=E}HeVUY!;gdzm^2y9$&ifrS8bt*6cRz@QqPQHXj=d`2}t# z@$$m;34S$V39nK@>90_RRA&~piq;D?(v`85wKRD4mOdg4fV?2)@w6maB8mweMh;U{ z1N3KD7%b8ThowBGXTWrAABu=iUqRso=Ae@L{>)`veQ(?1FbEln@V!Q17W-MM_&d&_lNDgC5!w!s09enWkLDewDMkwWFC*<7{FIygch4gZ zdPS7T2Qt zjHgYy$1YgivXuCz-seUV>#kT1Fl4w((8Cvd2fyE(Q%t}{Fn-gIZmY^i*KDYYpPGKI zY*VPNDx4uhWBT$Q<8aYe96k_eSOmb2;26bNL8kiPdAW}$ghsBqK#4}^vS|L&+3Oen zP`p6qU-Q`orC9{d0v(O^P!eEgb0h)`{+^NsGph>uI@|6BM}WXqp}GLy>V=MdxU(mX z$i(=Iq%f0E79{(elo6Iqel2{?K8#&ULm#mPr2rv}B`7$55<7=6b7MiY@KD^@Lbulu zG8|!Z@mOwBE}!@pAw(OF)Ze8F0JJca4kbj)zNmb(C!oJy^R`RL;oG5S{KimF3VKo?3cj8A}ZhTOdWPPR$#10aB4nLCgr z0qV6v3}_H@T@Zpq!d56`c8GZD^=elr=<-1^((%}#vR)b+{eyVJMY z0~%(cdiB(L2mCl*?-RI5--xeS#L@w86wzCj|3hG-j2-l(QC=L}=00DNa-?bgdExC( z3y;#CoKjR>Zo9WwgQ0tApTb_ztnlVvYgSv-tD28|q~orVhskT!vx3LMbD@-;ta>V?fKxC&nj7XjK`MWE6SjQhm4Sh@kFuC zeBMLD26%u_1fKw$WTogXTR;uX_*&;hDcS`Rh$D}`zlhPYtRkL( z6B(wQRO6>k-P(9aW&kzyz@HH~n@}DjkS9tn265;g&vlygP||aL4|ZT1pn%i=0tgJd AJOBUy 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 1b217051c4f7bc29070ec515585f32598a4faf4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1581 zcmb`E>swL>0EZ7ZAtl2s(Q*ZujkYW+GkwYl-ey@&d$w|#W@fHwmRZlbxY`jjP0cQv zmbFB!bapc@lhhQF3Y!D0?W+PFXTwspw?(KTIS}F={XUEREl(($(cUgq{wKwAyf}( zk@_(MS80AFhi?yP9*VS`a(GB%)SJw#_u5w<^wlD$s87=*(Y49o-rioRRNB_oRxQ%D zN%c4S)H=i@5C~X<+9zU2s4~E&@vg3}R;ivV(>)#0btw()?d^SPqd);Sj_PJ-XQg_R z%4k-=i14#CXbr}vVo0e}S}Ycc4(a}=o1UI7AJnwAwn`)tKA*2pC`2L=kH=FQOpT+E zSS)Um=x1hTdX=zBr5YX{R_WjlDWq1bIZ}xK5oQf)IyySW^hm=fq|s<5CML$m#|;Jp z48srv>Gk^N=4J#z*le~=r?XnE!2dVuKiL0b>pt`ICjj0GCMCsDqY`s+67mxB5-u0y z7GAz_J-4W+_-aAnm1|eZSvT&Ml;62pm0wnUvowDbHIA9I$|EMAp8cYwwe4kl2Z#Hr zvo$=1wkj*ppV!m-x3I6rKXCyqrhiyGGTQ#Vhnu(Lqe98^c1u+0^f0r~U^0u5@hQuz zg6Y}0mKhF-fKcF>u(#h% zOAbNpK;wdvJOD;D1-JV!mGraIKAug8)y^xzr})wBDyDc(-E!}TtmlrlU*R$U_k)C0 zWLFUCFYP*jr_kug1n1rTBaYrjQdIOvOz}x58Ym5T(~5JY)P*h~$Mw~3{|J4Z3n;s7 zjxGu&HKD@M3)Af=p1zPgKJUU>aK!h-kK(FIzFGQ{(1is8;SRZU%nE958HIb<;ap*Wo4W9|D ztIcINZsV{L$aHy)+)Dg{#|H@RXKrSU*Oeyj{p-dne#|8+SipH?qiD;vg@#NLlUk+%^jD0`<+;cI-# zr?oXU=%cKx2RCiSS@xx6!ffnnLNs&1QtZy;{1n?{P5Ek1fJXdduMk6C7SR=q%P)+E z@GDPU55_vv95NphgIL^0pm#Gf{UzSPNq9XZ4;gTWo1JiF*1PS(H=fjzn8 z17|9J5g%#zeQG47;mVZw3;E2WmzJ?}ox4wuWxY*3En)16%wBQ zwQBbp0_LJA*tz7;y|b#)1BEZtcYb^7tEtEeZ_!p&Kb=w4q{Ox8o;3IR>TCb9w{f6( zM!qq$Sq!sA4t~QN!XqD_Gx06+9-0|N$wVRm*lJ3D)NdfH?%rKF_n@9&R{j7&{U z<>uy!#p2r9TJXQe`!Cdgje#Hh;R(PTaRI>j5s*lfKv+~HK$VEaLJ=%^CV5(10+&_8 z1V0=EJUxO#>YL=v3T4ZWEg``kp1ku>Dot0nHU#NLbk_D6`av5l?Dg=7B8-N7^L7j# zn;aIrGxZg9hk7Va%RSFFdAe9#E*{gIZC6ce&bhlQPsvFxP55X$3GW(YvDqn!?KfSi z3B*q_qR?34IznYe#GoG4li^cgOe7aWrf^-4a5eI<^%M zvI6jhCms&4u8$V>E6FrgCcFLKJD*H-+6mNath+x!WzN)Hg>4l1T4s8L@=%aU#h)`}?V!Z 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 ba6ba9c09b5a7e2da42403263f37508493c45c57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1137 zcmV-%1djVhNk%w1VMhQO0OkMy|NsBExVZ4}@a^sG>+9>cx3}~2^XlsA^78WW@$vNZ z^y%s8?Ck95=;-e5?&9+J@9*!d-0rO0?Y!gh+wb?Z-|vgg=FI5yeTG^ zsoCnhyu6gs>FW0Tq1Nj0`TV5V>#f}G&d$z^&*#kP^yla2`27CK$;sc}-^$9$#OCtU z?Dd@0>6Fsw+3N75+3UC7?D+frrP=K5@$=K{^^4Bu>Gk@P(dgOf@7nJ6*x1f7)3yyEc1;_i#j=j7z%zrVl5;_bk|z|7_E z#OCwJ$jJEo{o(ELyW;Sy+wHlzxuMqR-rnAu)ad2q<&)9p>Gk`|==0L&@66@y#Kgq# z`25=1+Qs4RwBYaP@AJOCzQ*J4)93H(@bbRk?W)=9)9dxP-t67o-Kf~=z2NMk*XrZ) z`2YX_000000000000000000000000000000000000000000000A^8LV00000EC2ui z07n2C000O7fB*mxBuoVb0f>r-0ga4~hm4Pjiiwt$l985;o19K04uSwGDDND%2)GVJ)j~;gcJY^1%)U9U;-OK8~BNO;G)X~6B5V(K+;01 zh7be)1-W?Y%G;|6E+RyD(KdrpL0nb-4EjLBg$&>X2?qQiqaX=%TSaX}6T<@x8}4N= z2Vh3N3P%J{sG`v^stP* zXjvx%c-A>Uo_6Z#=bd}*sb`;o;u)x*hbFqEp?4n8K?-6JAnBx(R%+>`mmYxWrkqmB z!wOd}alojgmTKy$q!N&7sgkaWs;a88it4CK1OUM(QMds_0}Jrl0I$9Jy1=l*{z`1I zzzQpDufZ})?61Z`Yb>)`@BjuDqBuZ;8Js}U?IM?S>xj3IM52kfhiqc*BTRrINFV?^ D{sUkX diff --git a/ui/2.1/images/zone_addpubIP.gif b/ui/2.1/images/zone_addpubIP.gif deleted file mode 100644 index ccae60e4695fadaa39facc85f57324cc63cedf8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1547 zcmdUs`!~}I0KmU{4`Hax${21@Vm;hcta)BVEIM3~M|73b@~q?0V>XUwMy5NDqHrl< ztvam9HuHWzN-~e?GR<>L=CRs6_x>06^TX%o&pDsp&Ny422&MrTKnwt@tE>I}{VOXg z%gf6WiDYeU&CS(yX=y1wE{>6x7a0*TJ3A{B3QJ2$L?Tf|MMYX_YG_Ev<>279wl*Jc z@85lVh6V@!s;FphZ=aZ$Ad|^cQ&Ts{Qr5X5@1DOBSoVynJJ0qwML^(a}+{SUfZ|M5ogWn9NU~KD7viWo2d4 z)6)utVtad=o}GO=F|oS3`rEf}b8~Z2sdRpRzM-L^zP?^2lPxYTDwRs${{wCl`d_U1 zzy9|LfKXDLogw-L_6`pAscGpMshOE+^j!Lb2YK1)5AWa4C@guL{iN(s)}yk5rxjVx zGY#}1ROdZL1PgWp=PkGKT@#NlXcjhD5RCRXBTNsr^z{!64mBUNhwLK^kBP=7xN1hY z6O+?3V!=tA!|cN1V#dqE*DC9C^fEzItOFT|3FE#!_F%}Eh!yo#6WfZz0%|{q`VK$WLZ}=OKR46Xb@zuy=37x2Uwd#t%GSFn ze45<=5bL{&+3LMYO9malqdkL7oEiz1_EtxrRIO*uL2x{PBaU`pT(zH3Jncw!p_f!M z@Feexc8=O6EHm_SI93&nufm7MXwt9g4>WDY|49h29XS+PVE6@vRg23GP*{U{;Je`V z4{OFuk!cRAb0GkhG77;W{6I#>Oz%fsjs=#ei!NW znnCTub_H+R!ihCHF2rQm$XS5eFbvPwr!qp7l50QSQafk_07S=k^0A`j{Ea1U1P>6Y zv3NfwyX%^e`+F<}KQaFJCe8Uoyq2CDDMAVVYF{Jervo?ug{7JE+p&2z>`s%+tmv*^ zDs9+Z=Jh++UHJan>|V>iuSfSDsoo2L9eZtPr)DJckM7Rsu>m?`qa z;3<@^N&pdpxIW==Z!<4&>jD6Qn>e5lrce`iLAnbQypxGafmuBfxG{}r*wEGk7Qq5i WPR_2!=wO&-RhmyrGcpMPPW=PHvz&?m 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 879ff71040a09997b549c3d8b85a3893bc658584..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1552 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 diff --git a/ui/2.1/images/zone_deletebutton.gif b/ui/2.1/images/zone_deletebutton.gif deleted file mode 100644 index 596550b79b46f38c12989f54fe3baf03ce08b27a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1017 zcmZ?wbhEHbv|*59c*el+|Ns9TJ9d2d@Zs&-x36En{`~p#_U+qWy?XWO)2Ej&Uw--W z<=wk?A3uJ4@#4jsH*b8ry_=ev-oJnE?d5g#%9Yu(XZv`0Wu&KX-n8k;l`Cnfsr&cs zi;Rf4fB*je{rgXzJbC)`>F?jaA3Sj2>C>lc)~tz&j4UcDnl)?IzP)?TojZ5xhJI0xpU{C zg9kTn-t^$XgVdCiXV0GP-o5+!wQDzS+^DOotFNm&a^%R}yLZ#m()#-PzJC3B=FFKj zt5@H=dGp7Q9}I&PDE?#tJ52{fg5rdM{eJ@k1Gk1OV|zOrTSr%KXJ2el#EFxq zu*qt0H!;ZQ=qk)#x@`H1m8(|z@ao7kGcH-ZW$U&T3YLO$yxaHf-=Zt0t$*Oy@g{w3 z#uH}`Og?vUTl=M}tGc!d+!9a|UL~+f^Td@cLc-70RUWMnS}F11_>nEMWD|*<B~yad|GfRa|Nod|j1Dkx z>o`1UWEZno(8!^7LZOLG%i=+cu$Y8mBac|d0WNk6gN5yKd;*I)MEG7Xbci%bJnB?h zcj8fp`Z|jPjP?};%#0S#Ry^*rc~;@j@4$BRv5=0AKm!N6%E~8UlYG=X9VUC(om?`- z&n+``Dtm{30}I1}2abYvDi<1Na89sXHZ!&F=7CwMi!`6j%$=vXd{&m4f|G#Dfe$B{ gOiLP0&YvD*#Hln>C+Wq4_NY(lN^=T09TXU>0Y0Cs(EtDd 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 3c97cc04531c05c5761f2239ebc25ecb407a61e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmb`ETTfF50Dw;~jG|y@%b?SY9)t;OD2j0+5QBsvI7pbwZg>eeA+qcN+=FCeqm+^s zT3r>YjA1CqSX(edH=u+9hajP4q?8sIMQ**G)6?teMao*%#r=kT58vbW@?9({$UIk( z0~`j-01yg=TrSt>=%`dGwOXxqyWQjQxZQ3PMI8*J80C2x7C@xJt9r>EtcK zdbfXY!@*U;G6UARj4U8trBd0og1Y=cg+j4x^R+F(2KV0l{Jcyid%EEm8ymy+f?Hc# zFP*zu)HS$a?^;FGX2-1FF*!LoV|GIjH2BhPGMPFx2n@si;6Hs@D|ZoIKs+)%hWUej zzyFVIXCM$Tc=j|l--5-vySocJJ$B54z6!K0A?qln)oQo5w|iDCk5|!IgQH!IJXnGk zOiq7be{*xwY&I|3Udi+>qtU3b`YgV`dsk6^a9?M~#>dAcTI>4y`Y&4Bjtv{vyVS5# z4Lf@OLfh2H+S(fIbkEGph}O_qoxN+t;&6L_|A~Y>;(w*I*M9v32oEs;AcA%r&n9pP zTpqrq_1-;ROFR2vJD2m2eVi7-1d`}cnZo{GMPkW-B=gjf51Nji9~>STm7FI;ABmDq zLBpr$VAk}UoS6mU70PMuqI$GNvpT>YNv2XyyiXaR4!omS8Yah6D3{BP;ur}f*+dv2 z_kUc)q@1JXFn0kSBSXiG1m4W30cxJ)aSj%X&Sc-Y^dTQC%CvRV;vfR>Nyb%vX~p%t z_>597XknI3l+jB{T&21eFzT%w{0>pa(pLeSTv%Ni^AF!W~-)>l>`1h z3xsJ>%S(q;vp_U0HnQ$n^mJb9vb-cc3kotC&8qIxXYKXh`poL5U$T|gvc35S@F_HU zZm`a+TYMBZwN=08GVA6(>yH27dyI|Gy*1U{5OD9~r13=DflRP5{|iJu7i|Cl diff --git a/ui/2.1/images/zone_detailsboxleft.gif b/ui/2.1/images/zone_detailsboxleft.gif deleted file mode 100644 index 2ce6fe5a896028bbc77f030b96028f3bbd4ebdf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 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 H0A~LH_bp}w diff --git a/ui/2.1/images/zone_directipbutton.gif b/ui/2.1/images/zone_directipbutton.gif deleted file mode 100644 index 33b6921677a3d65521be7d89fe87fd1b2a33de32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1530 zcmd6k`&W_&06;(F1Hs1xD`(DGPG+e1%9^H~!bd)k%9WMJT9R9x=5dpSrb{v?70nl+ z^L0$ojMTZrbRnYnq1f?F%}(MIG{v{#YogTHX@AA;5BKML&J76i_c(Tq0aySk09amL z-q_d>3We+I>+|#T91dq_XecTws-vT$p`n3BqxJXqmz0zY3=B+8PV#uXw6wI<)z!wv z#+;m-*w|Pumz$K7#OL!{T3WWYwq!C{c6N4od3j1oN?~DPO-+qlE`RmvRcB|XLZK)q zDCq0!qtof#-Q7JsJ=@#cQ&Uq~tyU}+r>3TgM539Qnd<6lrBXRKIM~+Kw!6DqUtd2l zG11!EIz2tD(P)N;hsVaoW@l%+y1G;<)%f_hR4N@A8QI+2Tw7b4o10r%Sy@V z2n1@ix~ZvYadAgY=?S2(W01+GjNM2qR^UU@!@%^+wCr@wqqN-I zyqwJJEOu5Ims66FQCgZ;RPtLv2Eq8$eXaQ2YSd~ zZpHF(*57)&7lmdOU1SI4o!32f`hgQC3G=?~m3pd6S?k0W7oHeVu~b4xKqT7^*}&0P_l7&C%-PcYUQ zhU_)C!!M{nFvwPZSA)G8BRNupW6@p97^I5q?@a#D`UMlNGzlq;0))5V4R36n2P!@H zfXCze2d~3?+Tnn&=&3ya7)_LS`T{XQd7Wi=d*mq&B0n?!yv)}qj7p4;seTqg8^)%E zJ7uCKCs|exU6@E*lA4LJO2$lqK6rjI>i`aj)H7vtF+mGHo|%cSnJb4oit&DM`@oPV z7+69AL&x&BoiER|QfaOkx+mPc589)yRpyb9>-{|w)&ZNnLK3t)p4c>BN(B7kj z4O!-17!e!d`>}EG+@;fTZ_l6oDem3nfV)SBA})__$-`O8N8}fKsS<=&=pRP`>Pch4 zAc;bRuz+Q``$Xd6<9NkAt)pgwX>!IxnR;kodoshlRHI<}W^1NX1H=NXQwc_DS`xpq zGs|T;?aoye{Jc9~Rd$s(>&XpCHg%SU^Ol08;fc#Hdru^;G`tsUmmBpJ+LbnKw%4rm zfI_s^?I!b5w~QufO+7+vf=y0ph#(fEwtd`I#wc1ZZI2fmII%N9i}**gAUF$Y-*@Of zYL#^{y4~4^h_+o#Mof~{8GvEf)+ir7W#8|ZPFunwG%_-hSxi*gl3XPQXZU-nh$*&* TZyE%KwLeIQAO{eO0=)hO_&BeD 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 89ae721c238145e3ee3fccb0833a5750e0def825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1540 zcmcJMYgdv70DxcM6--bO=kl~NwepfBtZZ3Y15K-G&B}_5jBJ%>S=wc0W)3Q|6wTCS zw-sGX>zGrsv>tbR3CBEEW$83`|Z=N>v&Tha;EE`BIq2D&3-8=1zj6DIio(@_N$2PxB_()D!~=svO`A!JR}GKLl}gw$(<3Iqj7 zeU+90L+7ty@bM+qT1oBir2UH$*kov9l`E;5wSD_`^D1zb%xN z{KTRgJ4!Z|Z*%+^3YM+lQz@Ad7h|fWHK8S(Z=rVlC+Gqg73^XShM>gTSNKcLhDbAz zE}nR6;!7*}KoMwvw1-2F>M1)p-&?a}s~N;$<|G39y^UapJ7J-BSDXhCf&Sa&*Sd-n zCkB1ay5zWs#+1@_r={1=&Lv_d>9NH4U4AA6O6nSaJsWswLOl}&5ZxZF_68$Qz5lR% zj1q+cqB)h~YpYIh$~VQ3v!n;|v6+LF3!(Tb*V%WYT@vZ!Q|XVZ_MRB&Wr0N0`!vS=AsSRTu^Mkno7dM?zKAAfenhxU%sgo_UMwvkU?dc3TJm=R6aFU4x?| zP&k^94+PWb4BQeby~YV_sA~fPA`dg4^Fj}kF+;J30aV{jVNE^y0=BlkHS>(t31xv8 zh%K}XCYSdj0&;)18vC>nO)H72d*h$8VfN0jcciwRCyjM&p6k<$jt;Ll*0DF<+qlQx z;-l@y1oPI%H+10NCd9PIh56MB{8#4GFCg~Y8&E&U(#+ivaL)3cH42r_8H~6JV%0z8$9?J_14IeKc=4Q!C+;z?J^5~=C;}t*Fo|aw5 z-f{9El8qh8hZRR{s_Lp*o4Te+XM<}G?aRiKQpfUKcgerR=o;Wrj-IP`v+G(Nn{y0; zsa(6E1N);*|0YBdY3V`D|7_uVI$}Kj5tM>nQFLa^K7_0={mb-t+1|C&ng_hxY1y;C za_yGcbe?VMR=Q)_G)3gim}PtIUn*KYiF(lF1mrT1;ykY=#p}NK!lGs0Q{p!yc)Aa- f3l0-dTr-hg)k4sD6Jl0eImu&jR-P{s0Yv-@C#(Cb diff --git a/ui/2.1/images/zone_directipicon.png b/ui/2.1/images/zone_directipicon.png deleted file mode 100644 index 384b7fc9cf2b882a016afcc97c7be36186bba53c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmV+b1poVqP)13&=5bu7H`8?KrOX87c@9~tIe`vNu_Z0l{HMc=-CW#H!KX5ixD zW?- z!N1?%FueH(3^&$)3~!l0hKMrYRO}?h%OJz^o8j%-w+y@jg6IJSamL4wAOF96`I3PN zYU#^YuNXu{#TY=`e}DflsB3CLWNJ?T{=e|V{r|7N{{wrh?%bdMCvQFe|K<1J|5x7r z{oio*&;Q3Ce*6c9{R&3y8DIYkaj-MI`tq0IMm8Ix<@~?@S(*PcD2p*LMC<=%XxYsU z47Pv3aR0xO2L8F~9_I`n(x6;m7`3ru4g@vDBl!|El0V{hFUm*|^ zML>b&Auv1R1z!k(!kbJc^SJlUoOA9S&_=HvrP_KwDG{YCmX9Ge%^(DWNw6HO8wgvR z4f8cH!p7iY)-qs&^dvPNUKG7XA?IqWg*0|nO#CZw<1L5hN(~;jp%qmQV~`}b*SbR6 z3lH!+K;H=aIc!y36pDGwEkr*zl%i4?4h8RBWbSVIv#{^svmGX-`rYdbn!Zi_@nvV} zR(3DxMIuuIexYEI)CpD`ZWx%iIorHw==&!Qo5-6qH5EKVJO=Ep`q<@TOK+Weh|UO% zGYu!eyYu$4I5D_a0oN@^=|`D#RUr(EHI20EP+%Xpm!teaNcvm8?V&D#>r#grI+HF0 zYm!$0Rjp8KXte3w=UD@+SbIOtmKz}<$Wwg*OP3ad7A7n+epe_b>eQAxGEfF diff --git a/ui/2.1/images/zone_editpodbutton.gif b/ui/2.1/images/zone_editpodbutton.gif deleted file mode 100644 index 0485cc0c72e167bf541aea47e904033c1877b401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1090 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 OyQBExXMjb4EB^uk^yx(a 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 4d5e314218e2f78e202272b716904d2c6dda270e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1137 zcmcJM>o?nX0LFh2n$$JIL7gIvwn(B&bvkM@q1AHM9jB*pbnQA!H*?HkYdfdgi!4Hj zB5p0(5qCkAS?794Q9>u}T5OStTaf#eT=AXmf7s{6^Wu5&dGS0KW1>SslP*G@&?W={ z0Q&p;)oQgup^(XBeSLjWsZ^)aX|-C7Mzg)WEf$OAa=AnzQ7V;XTcAe?R4UcF5tNAm zZyS^zGz!4efprt$Xn=MXu;rjjwzr@MA`{S9K#c^{OM!78@OV6_8H{Sck^#)j%+yIh zzZz_9Z4C?zOixeG?||jyL zlSm{Q9v-fj0fWIHvw$gud1z>8VFwJ#EdqgnqXh!BVPj+CmC7s>3g=XYR_XqVT5s3` zJe7&3G)+uQ^sB(q(vr*!o-53CV$dSp7i)LsRK}5!5w6nA)qz!weqL?b+&mcRf8?0S z`ae72UB3GSLI4T`Is2Z5(djn%444h0_NY zt9{2u$*z+yR2D3<;I_|aRTN?_4RbgEQ}uoDt9cq38*zi!Q*TAFb0^Y_{jse`66(q& z7DUZMpguodfrL@4^BvJ=Z)B2Z$+?IGd;;_un}c!K^^b!RNp(0+4E3j5IR7Yw{l_3$ zga0!*a6Yxm$Q}!DrzB9k?uApgbPNHPJUJ?ym}VRSotA|VBOnT zob7cXdA!Zu)!uM9DS7Tfe37Gn)#XQexXrIwcxF~}9u?a+z=_LTFU+ust2z3xC^_5V zXb>}#_0cK?O}OUDsR|GKKoNx)EA%M|*3Nq&eq*&IHlK4khM;|zkFAZ$tP^lJF=FfSoyF?b z+BD}X=VV&I^>~(q1 uWb}`O-q(6oj_WgIB-gDp@k)$e?eRB(e$~X}3~U+mQ3i}9vW>t%VgCY$n>9fI diff --git a/ui/2.1/images/zone_enablefirewallbutton.gif b/ui/2.1/images/zone_enablefirewallbutton.gif deleted file mode 100644 index f84482a97b371fa47cd890044e413da7aa0ced89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1382 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 diff --git a/ui/2.1/images/zone_ipicon.png b/ui/2.1/images/zone_ipicon.png deleted file mode 100644 index cb54d2e05ff0a6ec7d03ba59f8f50208a34ec6db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1023 zcmVjq>v%qG9ZM_M!=$rxRKN{T|3BY70on0ioc$Gpz^_{jqB=$l+|sIy zf45itzrSbx|G%GJ{AYZych$R}TdM_uo??(nn#XW`Necu2ue%KYet%}rob;0MY$D@- z9wB9*C;l=31Q0wNz+rL!*#E!#I{zb!A!8*+ML1Bi!UtTh>rru}#x6}xzg_VJUTb1FLLL39ftwx4_zkW0P z7cp7Ma{b&R1}=V}$A7+N&;Z(W>(p}wMiw3hc9~xcETVrIzMg!^016gft^b?=0UD`# zmIi_#`gS*$EB6b!E7O7PHmKXvC zjd-W=&Ukmbj>a5`A;GsS!|pP(JM-R7n>L!^AFL?6G z=Zk@5bI6M+V@vm@SGo+kvm;1A#@Yw t(CDo5W^L6T3gDd4dA+KVMl6v!`~t``4cgtP@k0`Z-!tDNLq7+6Icuha@iD>MY0 zaboi^xa#ph(1TfciekTt2LGmR)<_1I!!is42@2K@VsZ>SyBO^mGRqR0cKONORMFv@ y+VDtW_4~~WJWnvMWxZJ^001Q-Bsn%Z2nGWG|NjBJzrfPa(Ea`W zHa9vA3km`Nd;o+00qg7Q^7HbgrKbf11pxv8^6>IwZdCd92Mq-d_xbk$|NsA3T3akD zD-8(?2MY)Q008jo>h$#Y;o{??rlSGf+}`c+^5Wp)0RI2|0R8^`{Tv(~009991_Sc* z@&pD51tSt4$-=?@0s;R1{`~p)Ej}^<{0ATt5!%|^0#HCED-AoN#>Gxu0j2Dpbi7k^;hnRA7ow z3jAa6)VY~9>$U0(RE#K`#*n z27ty|2-UD{z=#5^nkGD4U!7c>Gm9-cPHncHa_$GCag^+B@05c)&$AelMIp6nxraSI z$Vch=#v0w++Kr;PY@!AbkWyunU!k+txBj01os&&VLQxQg&)j=GCZxA3(WZrcY?AhU zu0(NRv-p^)jp=ujM&3W07P Ze*i>dGTY>Pc*y_&002ovPDHLkV1msj0sQ~~ diff --git a/ui/2.1/images/zone_sidearrow.png b/ui/2.1/images/zone_sidearrow.png deleted file mode 100644 index cc699f5f9babac940a41f5a679a30b3d8d3b8952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283 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 diff --git a/ui/2.1/images/zonedetails_mid.gif b/ui/2.1/images/zonedetails_mid.gif deleted file mode 100644 index ba91d7f2a7522d4b6f9a64e0264d3b064277e2ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476 zcmZ?wbhEHbWM*h#yvo3ko12@Lm-pw-pTB?q{{H>@$&)9KA3y&8|9?(SPDVz?)2C0L zKY#w{(WC6_?4+cm^z`(Yn3!kJo@HicCMPGy#l_vabt^3`Ej2YYGBPqgKK}OY+gVvz zDJdyIK|zU$iD6-3(b3VbUcGwx@?}CoLTG4cY;5eqhYy2;gBhp<6o0aSP0|68AU`p% z{XEd+rYynJ<-VkFrij2Srt}go1)s&Ct2eVWrfAHZc>M7UAH5gtRtKl;kS=JEaae!* z{f`>E4cC7&*3>suG?p~B*0eV_ly-La)-iT;v`y$QZ=E`Q(yXpoJ=1F^F0OB%IlE!z z^8VFx=TGZgy|HI`U(?!o%{ykS-`+N5!tQl@7cDH?+P(I8)u|)9S{9x?fBNK_rROf~ zS$t~S?Q;tbZ$5VA!OEvcpPV>z{OsLnFOIx>{Bgmn&j&C3EGy#Rm6pyCijX*w$i&Xh zq1n*Lz{JwlE^jyC#f671jI4?-5(xZ M4QFRNGB8*J0G4CQa{vGU diff --git a/ui/2.1/images/zonedetails_right.gif b/ui/2.1/images/zonedetails_right.gif deleted file mode 100644 index c2ffdae5ab005cf5def10e904de28ae3e838ab83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5046 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 K{Bl770RTJrLQxq2 diff --git a/ui/2.1/images/zonetree_addbutton.jpg b/ui/2.1/images/zonetree_addbutton.jpg deleted file mode 100644 index 3077137c8e27d3aac9feeba949da31691b51f119..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2679 zcma)%c|6qlAIHDnnK9U+nTe1i5ppcKM_4&>vu<+aUbiyZ3<~9F8X4qnwbqq8*JvDr zk$Xl8iD;8sj=|(i@|)d9yTASY@q0Y>{rP+zpU>m{e7s(t*ZXMv=mUT-);H1zKnMVM zF&A*O3Ly1<_6!IIKmZ2((FBg@0H?OsH4ksVi^A-HN0UGt0RH=e{I{Tg*Ecx?1euh1 z{s#Z{aYO--Y`{6-ArwRc5F`jif=69IGcz{R41h9&ek+g-0*A7)!&trpK>*6!e*xyr z0%rxGFg64LKv|%0R(957+<#IK2?3xm7Wi3tR&7gn)G3}jA}6^=GwnlC^Q}C%Bvg4j zHWhRfRnQwlqSi{vwmv0>YPFcV4+}iciFwBti`)HlGhvMFysr^68TjWwu)lr58*b@-GBsZ$lSFokea4XTic&=sk)#s{W~_kykNaH+G9xye>SEorJ;>!BgKvy_O#diEjM=2*K2Uo1tY-P922CHrk{h<2tDqZ4uy(WE|mf zhT)T%ioNRJp48zSB;)vZJ^k%I&e)^^h*OY?^<#+WXV$JRZ8TR=C_}L5u>aE}?I3M8 z6Egf^DPd`&lI0TEg6E$_d>PN!)l;0H_+#hqr(Hyuh^3DR;NI9)_J1iiIEh+AUKn;j z^IkT1DTOYz-4sPi#lrGOQV}NOjrSy75jMkQb69BI=_c2^-_`AIxwdcQfO8teJ+fhC zL^SE9le>#mL1od{?TP~WglTatud7Ho+()(C+bQxwhRLiyd)HUeEj<1r>N^(Uor^!M z%}xL4Z2Y^fn42)2eezy#ng;^lxM^K~pLddEay>U4g)eqmB07#uE&nv!-IOQ!zO6WF zPIyt$jP5VLB1hB9h`2206|AHgqS(>6?`5Mg=p&erI>L9OEx%+zku4`zS&c*K{?8zX z)rjRu)>@?1_?18#Vw(r0VI&09@g^D+@#z!%BdBvk< z%_XgeL!Y+MiBa>bgg{)zbFxIRO_q5IWE+5pdMseoyyxHcbv^E*_mi6C#|wkmt?Wfg z8*F}Tt6H+w@EORD@12`w*sb<=!gu;#&ZV!v3$AHUwR=W=s(C8av7luXnH`J6XJ6`S z)w?T!bnPz-|NgAe<-z zRZLdhB5hy1U|}+-oY-P3wx-i?e9*pczt6F@c>p7;qs851=7cwv&k&j0D!^n!K8v&@ zUXwZC|3!ADQfGZ^UZpd+LVsA60z)5`_sM|NdNMEDgh6JAKv-F%dJr5aJynYLs08|TOS$>~Q&4Yr3p{JX=v2CxgH^0)PL3Mow z1*Rr=ZliP8z!R8I-XrL0Cc`)n%s$j`6uROUwK`nlt~#VK3GNoF0Kj0-dfX&@$7UMq z=+Yg+(-usknq#prB{t25a6Y{X^?i>e=+)uv+|zp9&QAefQ{R2%r@N^?PrUD}3{6}B@3?E~J#!HJLf;)I@{J2!3kFvl+cag+QnmA)WS7Ex)O`IB)?U3cq zRVFNTkJEM{WfLf>f@HKfY8xRe0MeuGw^v&DYtjqR%}<&O-_UwVS;-m!ui|NniB=Dq zl@5)y)hXoLu{i89zN}^w6N0T)O{n@%qPVwY4-t{XEc?hLmP~2!7@>@3tPzYg@AE4LSYM%p;)3_OWK#(4qg$1k`k5bCb)(a;f6mx#DP3Y9e`%mxu#MM~2HrdsH49WIG4%47>91$)0Lx z0f`hAKSSJg<)GpAWSuRNHKW)(3Uj=??Vzo-sp9U;)E%LJ^3@+Sy0Ek~w#l<&KFjvyE0aKk#i$&qxex?|Ks5rmy zY;`6OnoF$sk^k-|H-Q-_HYtl0469;3Au70xj*z6z+-y#R5bCYX$&yROtyrSE4(c@3 z>Wy%EjI+3uCE({KeYHAl>j7howg0egJ&i$@Vf7!_>3z}4v&z{K{$(VaR7QOFtOVU1 zzR(jGz1h>dPjAl&pE{W;r}~wnujcgLdTCc{Ze3orKu5TPK_sv>?Ck0zN4v9!9;-R| zv9xL@^utur4%RHDcf>L(_)He3ptv4IQ`u_=(|478O&x6%lR9MQfzj+Rua;T{vN;uVo-wPZIQ?74^r&Oqt~wsIP9%Zu5gb zJi;8P`EAd5g=2EkfUVcsTOlGdpEng{4_9FkesV8*j)30e4!O}?2VlLZatAX#MYulg zCiE!rQ|NFcqg_93+D(CDD|$@2U5LkTm~y)->-MiV9=lMNmkDjXL2t$|5rx!1`i52o jdA>hSjJBzaTUCM1NB6#5HyDVXf7u?rQnFPK9=-h!!1JI* diff --git a/ui/2.1/images/zonetree_blankbutton.jpg b/ui/2.1/images/zonetree_blankbutton.jpg deleted file mode 100644 index 027ece40675999568b9babc3ff74bd37bab83078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1678 zcma)$dpy%?9LJyEW*ataL!@YuTURY5B2z46A(u|+RA!bMmE5}9oTU-vlAqM>|OM2efLr1Iao78$iD=*#Cn6)Q|5l2$FZ@_h;jGAF^tI zQv{1Z5*)$-7!HEtAlVa;E)NFaa=1L`4?!qJB_u-mSL=HR3jhp(Qb6LB@TmVBIY{45 z0kP8E7luS>1+(B9>We(*XqzNvl|F35FI?r3Y_7S6?0wNn%m4MZy-KFIUlM#@Cu;{7I3$k>#{pZ=X)E@ay23}l;LnSgbGG9O z`9tR6@)6EXqMGtK`z%STN8HM(uE(UokAp*FTZ_-zYwAjU;d+H7XWh(dkwalkW9*s)dN=}%@CzbJ46xB5jqU#3ydt8F5bV=0st~GCcY^@A}z6?-c zr+Y=%BQt^1z43`k?8?Dj`KVgm0KH0-DyFnEpU#`*BuxjL!`4Y^vD(}tE_a0g7>?wv zZJX#L>~!bpk4W1vv2R_18OireXVFW#$IJFlHtVE<$YrxN@vRS$sFt!)&_Ysy$!o1M zLcz<_j&1iT0T_24VdPueRP+3r`<{d!yVTcvk_Dd|4a|`yBCSgkFC&%xLQkxQVlCJm zCj+PZ&Y9cVq`>>_h6~3DIAcei(de=pIS$V$+~)h%UgaaPAGl2c1Bhd{ql#1dAK2*^ zVn~B~$91Yy1*+pNZ}WYczPNs~Y^mCJa;!5m7(XW3P}D8bbzg-JVQd`OzJP-~inU%} zp`PBPVz{VR-6tW^id21W9$j?BIIU5!^^ki z*j;mn4TK$Ce6cWRZh}s$@+)#944DXPfK8w^zb1C~kQmWRaH-oo#VH(>KvTqp+jjR1 zF$ME#${O^z$E~wI(UW$#Sqe^6j4tju-cs1dZLsuitQ0xi3vU$Osanx~s%I!mNiwD+MgDP0TI%Y-1@A3j&5hj}} z8jKb`i&)3bINen>&m7HZj2EaSms)2K*K6s+sOG+QHy#Tlu5iNENg^EQw=U!HZQi## z8^FOiX4C^i_;BNB{MRB!j6>YDkh|geF;BRzwWh&30xm{BU)lCU<#;BCzI`h5PXYLEOm~t_R#B=6f2(q=GN-)OfNw@|w5L17_!6|c>A-PzC*8C`>z6NV^ zlKBqB@70_BvSpaTSA8=fEcvkKb@+}e%WFjORZXG!LLp1~QU(Nq&PeYCqX#!G=-(Yn HlC}K{a(J+} diff --git a/ui/2.1/images/zonetree_left.gif b/ui/2.1/images/zonetree_left.gif deleted file mode 100644 index 45e920ec1241635a997ea93952c816ebf026a6c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2547 zcmVl6S{r&y>`}_F#`1$$y{{H^@`uhC*{Qv*|-QC^y_xJYp z_VxAk-rnBy^z`%d^YHNS<>lqgww6@9*pD>+S9B z@$vEL>FMt7?%?3yA^8LV00000EC2ui01yCb0ssa7;30~HbX5qWuHzw8(Dpcsvee2L zQ5b#WibO($xjY&-MNlamJ|K<;G8t?N4xh~QmZ&BK;Ku~nuz7`o!C(^k)tcV{xL`TH zt6;UdKyfIUUuk*;1qf7Vc?D_#1q^?If`kK%0gixa0+Ionm6wqNgqsEkOnIQ71)K(s zXnTaIq5!0jpqv2)1^}Z?a<8elxw~L05Au^+K&*EV7lv@++y zd=^I@EG9DLOamuthRY`^mrk35nj(vN%Hq?du4rDZNK=xHfqAHH|w2ESJoa?RP}@g8i%WG-ia;e{GU(#zDW2HbA9HVGkJT@#Wr<%K%nk| z8?#aC8jXAO!tx~NSW*O(Gaf-s88}$~Pu{2(i9XKR*B5;FsDx8`+%b3$Zilf$9Z*^s z=$3N8oj2EX_37u^Nf8Q&lWo1dm!5=|?qbq8jOJ6>4ecV6Zg4Fe_BD4LFZ z5oIHq1HBmJdH^B^qA_!_+0l^{Vnw2ZVm?M^qSnM0l37W*6x37^g(sV#tHI}9Pl2|! z7-o1HhaaM520BkBb_QhRad^JfBX-vDCZts&GLz#@+ITeTcnq%Dnw{RHhAMBm2{?_XMl4}YSS)-wnw`-ig09az3wrJ`pt?E^IWP8#gRS>1g zYS$mE$2w@?eA#liU$eE|H)m>DJ;P*m5Eh8$v$Re|6foJU2yJ{S)mE&Sa9t#=yh(~v zW1-MZN@j-`W~eNs%yC*IS{`dVVZ&)^HEeD^tuzT zXd}?iGJUk17I*CO(I(@qYuMes6gH_t(pUCs(Y6fe%Lm5B&ZZ;dDr4bPx91;vEJr@D z#s#>GWUGrA6K%Z50j{k7qb5v>h-94!!f*ePE7sNnXKX%n0`#W#qMmyMwJk%w{(9e35*_^iCv$({iPgRC{ zm4pWLwgnDJQ>$W8;ii$a^94n0@tct{>Qt~Wx$Pbn92wm1r6|Ywt#$_zn%d}=vwdOB zVJci-=!%m+z}2jP`!b&B*hjGW{BBVE;o$|Nw=}jvEl~uTTkM{goyXwMI#!#|@xBx+ z9o|o5!x5jJhL(u`@N7pwPkR%V00p@w76yXka#;$JYjHoo_DD82Pa@v?+#;E{}C|1Jaq9vI%DjIo4OG~lPi9{H|JN+t$ zp#;nur{cXGW)FqbYh3EqC^KPsi+n_T+}tR~ygj7vas~{My-=Y!435ZBF#MBuCYMC) zSSmm$i`~aqD8xfzi;BJ4rPP4PK*XhKE}(*y+<*qMdw@}3l@k?(np7`Jj?RN&+|mKD znX*|4)14UOqtqZaKwu)WMSKcpD)Tl??#V8g<{O;mI)xR3Hj;MckqIGrh(1;wl8Z1D z#}Xr{&IYmnbDO{V;Vf12BA!u?X{2)!-vW7}GtN#;^yH5%mzYJ`JtvO*>Yd*}S<3nq z&6Pc6K_%t!$tNy}iK|QJ z+Ey9UyV`NETN+>G_E$k6S#^+^<@}#UdC575 z7Lc0%Jykw}>?xFsaGfQVzI@>}gu_%nCbvg*9dY z5oeZe>MGWWworr7nl|Ghyuj(zej4;69T#U!2pg7ekHlnvCA_T8MAeVC{Ok+s`Y2PX z2v}RI6inT^&z|{GEl^r5>ul9sAM;a`^0U9(t>BA5J8=~-oM=T=^8Gt|oyv~I)fPnxO@PHJk z@CdgY;0aOK!UDPg2N87O0uq=z4uCL(`e=X$YhOSafRKX`Bmf2xI6~8t(1Q9%U;-6b Jf#yR106V+3?WF(! diff --git a/ui/2.1/images/zonetree_mid.gif b/ui/2.1/images/zonetree_mid.gif deleted file mode 100644 index 958dde53abbaf3b21bd8f825383c940372513167..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmV-}0et>PNk%w1VGICj0{Qmy_`uh6$`T6(v_xt<%`1ttU-QD)~ z_TJv!000000000000000A^8LV00000EC2ui01Nau7-$i%$P^(*hhanwK`aQF-Me8?nHAUHIcPv;X#Wd;O+tTlVxcDYwD)`}gN z!GQrs;jK6uCK7Mva__cwzs&sy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=% z($mz{*4NnC+S}aS-rwNi;^XAy=I7|?>g(+7?(guybZ~Eb^mlN2_xfpPY-?QHfbpm1 z9~LfN5Q+)&r3(}>RiH>=GBKi$CQ345#E68*kdGiRKMLsqk_L_&E^O?$VIzi)6enW1 h3=!hO2of}FZrIsjrvU{(g9iPnAi;tK6(~di06X)B(K!GB diff --git a/ui/2.1/images/zonetree_nonselectedbutton.jpg b/ui/2.1/images/zonetree_nonselectedbutton.jpg deleted file mode 100644 index cc4a8aba03f270f4d038d3ba1b768c69119d14e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2328 zcma)7c{mhW8$UB+m?1IDShG!KE7vyGi7~R)FesJ8%|6O-C0VkM3Wc#{FxizRgo;#B z%%D&9RF-HYnu@q-;nIB5eeT!y?|sj6&hwt%?_GZH^PJ~7{FnUKKysg*qaA=i0q_?r z!2bwPHj#cOV*msQfuA7YFM+K@|1jSG;QvT~K=_j&6+r&ILH}>CU-nNr6ao>jg8hs5 zw+{aiKq0^mkPCyL02Bp*p&)!VxFrwFS zrG<$;X#ND)0uuzGU?@NUPc5Y$Xy_!2>YP8D!CAPT!=W+z<<51fNiwFKRkobFYduqP z7k|I)K7LQ_4RzleTez@n))5Eut*cbAuC*sHE-6A~;hL&KxvX6xQl&)xOIb z7MH;6e7Np+R^&q`oOe|A!soI9#_S z>)H*aig)k^ItujJ!)x8+b)Z;Q7Voy9rGR#Du^qx9zl1;6|k;|zr0ZueG-tl@MiD!JkxR3MePiX~wZ7Nw&%@mOl^#Q(A|q%<>8(QA$ z?WGzTBvW^VQ~4fxQ@0+-Yc>^P4joym%$0Cko`k;6KCXv!_KLpsWGi|B_mqB?P&loQ zjAwSCvilej!$MTJy-wDBsQzkS5Rzy+;WS1ZRF8<}|Z7opFwV=QA_w?{?c zaCYQ<#(T4DXFjO*d}zPFC!VnQMDEANm#*y61P|T8mK-)Yg1x??6tx@qIW6Wv$ne*v zf&2ZN+NcvQ%pKnXs`Pue$-4xIFpk#|GqOKu&kZ-%9V3( zUr31%($FbPlXTjxZIu#y7zvkc6qU$#x6?C_5`x451^dg_NBrncnwFLB)!eic-tp6i ziJW5^j>~jh;~a*Bya`EDzpMypW;qR3CrSA9YJbddqN&05i<0{=HsKLwHnRJzYS2|U zE$QPB)ueCP#Vox)k?@frCf4#+ZZ1NC=*qzaW_rpw7?y-`_`t4ZeQzNdM?3bl&(ikT zV#3%J`NmToCH2*Vzdhxgp>lj&QwP!h3kprE;aFcvnpQ)wTNI^oCte$&sylV(s0txP5$Za*eR-ZR;Hq+?iHtR$NwleO7C= z-;0`)MlEsS`qHx1J@@dfQLWvHSy3Tp8Ww#wWOYzXuEkSB+HLiH#Zx6DX{P->)ZNMG zWp;A^*xC(@ykRtjL&?qh2;`Gs>ifVD)^u}|6}mVRq`W&?E7VeM*0*35Yo1>8zf)!OEHWh|PQ_fuwC7)Z zzTyXaxum@Mxyf@Hi;Ql%GAN*;S*g6!lAfGPp-~dCF^kOtJagc+#(VPi!iHYii*nK% zN{{SU$Qn%{|}`j&v_v_(&yVPki%$uJ|dIDjU^Y?4iCPi-mmfDF!Ns%^&HXyLK zG5Hb6A1MM-NQPUk%bzEms&jmxOc0I@g;!pUvmhjG6@Ss3VsK8l8um% zkQFV+E$qsh)NN4FP9@ym^mY2O5yp=Tx$r`FzkhL=|;LM*)aN$OJ-9r0L^R z$>NHMT!UMPkarVEXdbha$Qy7;ws_d^T6dpjW!lTy*X+K5}20#{qOkK{r4 z4!KUjV^$2L=p++Szz&ln&+=10L#&jOX z5kzX6Djwa_N=mG=@^s4&ul^zJXSSIsqFQm?u_se`|5dX*XE%`?@<=W#v_yF?BSpBz z@r_;FVRCA)g^dK3b*HND^g_9KRxWt&zAEtN4T5`#aTzC`U+Oi<2zk(nP!I^(sbw+h z65dO+cgwq=K;{z4GZ4zQn#Q-!Z;r~1Ns_TFfu01d&$S#65d*prbmp{JLhL|T7&&UG tB_|4Rcd^xQ(s*DlF*=YMWa;Z*5yS@zpEeXPYOE8|%f6{Rp(pak{|iaG&n5r> diff --git a/ui/2.1/images/zonetree_right.gif b/ui/2.1/images/zonetree_right.gif deleted file mode 100644 index f115a3cd3f580ec12a17af4b3b263ced000d6afb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2864 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 O1V@krS%3gR0028gwt#E^ diff --git a/ui/2.1/images/zonetree_selectedbutton.jpg b/ui/2.1/images/zonetree_selectedbutton.jpg deleted file mode 100644 index a3a0c5c2992b592ba4d9d5e66480533159f9798a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2505 zcma)&dpy(oAIHDDx!*Pnsq;J9hNVQAPD~`mim{owgxu0lp-~ehvUG7dW@(jjnOt&B zBRTZQtd3mDij&A-GA+<%9B3Kx;dROadTK z00;*UAfE=1P6=Vri2wwE1ItZ7{u|=D1crpj#Xv6@3;@-@oIeVJP=vu1lvO}S015+NKMMjw zK;a6CN?PDgDJUZpRgmi6rVs#WWC?|BrG~(D5V{KJxYXi}VY#RcG;M77*lI4u3P&(z z=*?YgmpF!QJ1%%c_daV)Qrsl-x*pFf6^i?veIDzZA^`xZr~rd0!8N}-LXaU)6ii#E zShAYy1vj#!ZjD2vUfVzmE!n8Mji7*@JCKGEJi=PhONIT$dM5HAKn(_FM#7MQJ+R0w zV7PrAw~b4h6`XGzuZdnTugYx-u&s`GA9nTL>9Esfl@}>bl4W&OS0Ar$?=D-l;og(5 zHTr}R6J6rQFCKrRiDJr} zPsSh#Vm?OZR`1fD?`IBA^DFJ?S>y*z3hvm}A{S0nzK=Mw_H5D!^X5=%eB_6ry}Qkh zs|NIcypr%&>@0%L-{Kk%aO;w43~hbVvzjg%Y#$XZ5Prc2CJ0&y zP}bkjr_Zpp4b)MU@!FZ1U8H{tu*NE^25gi9E=OZ8TK zn_eY-<$Ql&470BcObLDUv=1Den^$LKzH{`RB?$J|-pOs6T9`(rB>9kR2JQ_%=ItN2$8VYC1L?}Y;{Z3{jyrD#nhY$8?pJNj*B>4r6| zWNypDLnp48BGPbw7(PHhXmTZy)*=TS2B=3X5|w@0{yKB1N>unYE33J} zyubIA_Jv!5t5KEX#R`+}IUbf52MD}@QCvozzo_<*^=0?V^?g9YBlU(pCEy(Th9N)m z58bBW;7@s^c@rs#YmZm^{d@-0$a$F8Tz!FD7AxFgd`iLPX;`Bipd6Y0M75bKJnv2) zZb|7pTv#(qnRaO+;R*|^RsrNFq!ANpGhM0gvK3e1lP1}dxfvD5!R8mEAiilDX7A^3lS50_DFid! zu33~@$6_0yjuQC$CvaRQSL~X925%d50n-V7PBUe!P0j9m{al|yj)HTFRGw*YcfdI% zJ&80Nj(@r&a8A`dng zFL%Wuhbhp_S?I@D^raL91k-%6%nMF}k2Bq0Xx&F=-zlx&otqEKFKcCG=(^L#E<5?L z7(Id4Zz+h~!~>52mffzMsC$M{9n_1_Iq01GS_@Qz6Wv&+wD2=G%GsS+FAApNk`43Y zjLKzF${UOv`5?4PR zq%gaeeEVB2vlun%X22`+n5O2U-!j>-97{Z(mz0Lt-Dnbp$6-`eIxnd##}83d^ti^h ztZNc&2UEl?r!XxLX=u;v9C-{Vn-2PVi(fFL#-;_;_x0|?#3zOPXqlUWVbL9|rq`$} z4kw(#*(XE1C@A-2XU8bjZHlfHVf7ni}!q>zv z?rCka*T9q$E?K>fwmxVA3F$6#g2Um6b9+OWFjjGWG#gfJ*?r%#79rxH>WF^fpzfSJ@3bFbR5l!szd_Dsd zLu?AsoWhwP&SWu8>%3sTjSi)7n;FJi#Qwi}eNePoSyv=B0o5^Grd|jCqpZJ{?==Kc z1xtbo_38%&e5bor4v`}(Uv3fht%Xk|P?)-N lSJkc=O=`lWP{Qq^K^{C8x-r{1+b^GpYap 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