diff --git a/api/src/com/cloud/api/commands/ListS3sCmd.java b/api/src/com/cloud/api/commands/ListS3sCmd.java index 43a37b584e8..89da5151ab5 100644 --- a/api/src/com/cloud/api/commands/ListS3sCmd.java +++ b/api/src/com/cloud/api/commands/ListS3sCmd.java @@ -18,15 +18,11 @@ */ package com.cloud.api.commands; -import static org.apache.cloudstack.api.ApiConstants.ID; -import static org.apache.cloudstack.api.BaseCmd.CommandType.LONG; - import java.util.ArrayList; import java.util.List; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.BaseListCmd; -import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.ListResponse; import com.cloud.api.response.S3Response; @@ -42,9 +38,6 @@ public final class ListS3sCmd extends BaseListCmd { private static final String COMMAND_NAME = "lists3sresponse"; - @Parameter(name = ID, type = LONG, required = true, description = "The ID of the S3") - private Long id; - @Override public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, @@ -74,39 +67,9 @@ public final class ListS3sCmd extends BaseListCmd { } - @Override - public boolean equals(final Object thatObject) { - - if (this == thatObject) { - return true; - } - - if (thatObject == null || getClass() != thatObject.getClass()) { - return false; - } - - final ListS3sCmd thatListS3sCmd = (ListS3sCmd) thatObject; - - if (this.id != null ? !this.id.equals(thatListS3sCmd.id) : thatListS3sCmd.id != null) { - return false; - } - - return true; - - } - - @Override - public int hashCode() { - return this.id != null ? this.id.hashCode() : 0; - } - @Override public String getCommandName() { return COMMAND_NAME; } - public Long getId() { - return this.id; - } - } diff --git a/build/package.xml b/build/package.xml index 09ed939c6d7..3efdd7dda05 100755 --- a/build/package.xml +++ b/build/package.xml @@ -217,6 +217,10 @@ + + + + diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index f3403c3a6c0..617faaa73a9 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -53,39 +53,71 @@ import org.apache.cloudstack.api.command.admin.zone.CreateZoneCmd; import org.apache.cloudstack.api.command.admin.zone.DeleteZoneCmd; import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd; import org.apache.cloudstack.api.command.admin.offering.CreateServiceOfferingCmd; +import org.apache.cloudstack.api.command.admin.offering.DeleteServiceOfferingCmd; +import org.apache.cloudstack.api.command.admin.vlan.DeleteVlanIpRangeCmd; +import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd; import org.apache.log4j.Logger; import com.cloud.acl.SecurityChecker; import com.cloud.alert.AlertManager; import org.apache.cloudstack.api.ApiConstants.LDAPParams; import com.cloud.api.ApiDBUtils; -import org.apache.cloudstack.api.command.admin.offering.DeleteServiceOfferingCmd; -import org.apache.cloudstack.api.command.admin.vlan.DeleteVlanIpRangeCmd; -import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd; import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.Resource.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.*; +import com.cloud.dc.AccountVlanMapVO; +import com.cloud.dc.ClusterVO; +import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.dc.DataCenterIpAddressVO; +import com.cloud.dc.DataCenterLinkLocalIpAddressVO; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.Pod; +import com.cloud.dc.PodVlanMapVO; +import com.cloud.dc.Vlan; import com.cloud.dc.Vlan.VlanType; -import com.cloud.dc.dao.*; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.AccountVlanMapDao; +import com.cloud.dc.dao.ClusterDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.DataCenterIpAddressDao; +import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDaoImpl; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.dc.dao.PodVlanMapDao; +import com.cloud.dc.dao.VlanDao; import com.cloud.deploy.DataCenterDeployment; import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.event.ActionEvent; import com.cloud.event.EventTypes; -import com.cloud.exception.*; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.HostVO; import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.network.*; +import com.cloud.network.IPAddressVO; +import com.cloud.network.Network; import com.cloud.network.Network.Capability; import com.cloud.network.Network.GuestType; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; +import com.cloud.network.NetworkManager; +import com.cloud.network.NetworkVO; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.TrafficType; -import com.cloud.network.dao.*; +import com.cloud.network.PhysicalNetwork; +import com.cloud.network.PhysicalNetworkVO; +import com.cloud.network.dao.FirewallRulesDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao; +import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO; import com.cloud.network.vpc.VpcManager; import com.cloud.offering.DiskOffering; import com.cloud.offering.NetworkOffering; @@ -110,7 +142,12 @@ import com.cloud.storage.s3.S3Manager; import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.storage.swift.SwiftManager; import com.cloud.test.IPRangeConfig; -import com.cloud.user.*; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.AccountVO; +import com.cloud.user.ResourceLimitService; +import com.cloud.user.User; +import com.cloud.user.UserContext; import com.cloud.user.dao.AccountDao; import com.cloud.utils.NumbersUtil; import com.cloud.utils.StringUtils; @@ -126,20 +163,8 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.NicDao; -import edu.emory.mathcs.backport.java.util.Arrays; -import org.apache.log4j.Logger; -import javax.ejb.Local; -import javax.naming.ConfigurationException; -import javax.naming.Context; -import javax.naming.NamingException; -import javax.naming.directory.DirContext; -import javax.naming.directory.InitialDirContext; -import java.net.URI; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.*; +import edu.emory.mathcs.backport.java.util.Arrays; @Local(value = { ConfigurationManager.class, ConfigurationService.class }) public class ConfigurationManagerImpl implements ConfigurationManager, ConfigurationService { diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 79a325c8957..c3e5f8f1b0f 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -210,6 +210,7 @@ import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.UploadDao; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.s3.S3Manager; import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.storage.snapshot.SnapshotManager; import com.cloud.storage.swift.SwiftManager; @@ -300,6 +301,7 @@ public class ManagementServerImpl implements ManagementServer { private final ConsoleProxyManager _consoleProxyMgr; private final SecondaryStorageVmManager _secStorageVmMgr; private final SwiftManager _swiftMgr; + private final S3Manager _s3Mgr; private final ServiceOfferingDao _offeringsDao; private final DiskOfferingDao _diskOfferingDao; private final VMTemplateDao _templateDao; @@ -381,6 +383,7 @@ public class ManagementServerImpl implements ManagementServer { _consoleProxyMgr = locator.getManager(ConsoleProxyManager.class); _secStorageVmMgr = locator.getManager(SecondaryStorageVmManager.class); _swiftMgr = locator.getManager(SwiftManager.class); + _s3Mgr = locator.getManager(S3Manager.class); _storageMgr = locator.getManager(StorageManager.class); _publicIpAddressDao = locator.getDao(IPAddressDao.class); _consoleProxyDao = locator.getDao(ConsoleProxyDao.class); @@ -1421,6 +1424,29 @@ public class ManagementServerImpl implements ManagementServer { } templateZonePairSet.add(new Pair(template.getId(), zoneId)); } + } else if (_s3Mgr.isS3Enabled()) { + if (template == null) { + templateZonePairSet = _templateDao.searchSwiftTemplates(name, keyword, templateFilter, isIso, + hypers, bootable, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr, + permittedAccounts, caller, tags); + Set> templateZonePairSet2 = new HashSet>(); + templateZonePairSet2 = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers, + bootable, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr, + permittedAccounts, caller, listProjectResourcesCriteria, tags); + + for (Pair tmpltPair : templateZonePairSet2) { + if (!templateZonePairSet.contains(new Pair(tmpltPair.first(), -1L))) { + templateZonePairSet.add(tmpltPair); + } + } + } else { + // if template is not public, perform permission check here + if (!template.isPublicTemplate() && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { + Account owner = _accountMgr.getAccount(template.getAccountId()); + _accountMgr.checkAccess(caller, null, true, owner); + } + templateZonePairSet.add(new Pair(template.getId(), zoneId)); + } } else { if (template == null) { templateZonePairSet = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers, bootable, domain, pageSize, diff --git a/server/src/com/cloud/storage/dao/VMTemplateDao.java b/server/src/com/cloud/storage/dao/VMTemplateDao.java index 1284ba103cf..a043a2c6079 100755 --- a/server/src/com/cloud/storage/dao/VMTemplateDao.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDao.java @@ -58,6 +58,10 @@ public interface VMTemplateDao extends GenericDao { boolean isIso, List hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List permittedAccounts, Account caller, Map tags); + public Set> searchS3Templates(String name, String keyword, TemplateFilter templateFilter, + boolean isIso, List hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex, + Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List permittedAccounts, Account caller, Map tags); + public long addTemplateToZone(VMTemplateVO tmplt, long zoneId); public List listAllInZone(long dataCenterId); diff --git a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index 008922af45e..02db43bd756 100755 --- a/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/server/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -16,6 +16,9 @@ // under the License. package com.cloud.storage.dao; +import static com.cloud.utils.StringUtils.*; +import static com.cloud.utils.db.DbUtil.*; + import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -93,6 +96,9 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem private final String SELECT_TEMPLATE_SWIFT_REF = "SELECT t.id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t"; + private final String SELECT_TEMPLATE_S3_REF = "SELECT t.id, t.unique_name, t.name, t.public, t.featured, t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, " + + "t.checksum, t.display_text, t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type FROM vm_template t"; + private static final String SELECT_S3_CANDIDATE_TEMPLATES = "SELECT t.id, t.unique_name, t.name, t.public, t.featured, " + "t.type, t.hvm, t.bits, t.url, t.format, t.created, t.account_id, t.checksum, t.display_text, " + "t.enable_password, t.guest_os_id, t.bootable, t.prepopulate, t.cross_zones, t.hypervisor_type " + @@ -931,4 +937,138 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem return executeList(SELECT_S3_CANDIDATE_TEMPLATES, new Object[] {}); } + @Override + public Set> searchS3Templates(final String name, + final String keyword, final TemplateFilter templateFilter, + final boolean isIso, final List hypers, + final Boolean bootable, final DomainVO domain, final Long pageSize, + final Long startIndex, final Long zoneId, + final HypervisorType hyperType, final boolean onlyReady, + final boolean showDomr, final List permittedAccounts, + final Account caller, final Map tags) { + + final String permittedAccountsStr = join(",", permittedAccounts); + + final Transaction txn = Transaction.currentTxn(); + txn.start(); + + Set> templateZonePairList = new HashSet>(); + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + + final StringBuilder joinClause = new StringBuilder(); + final StringBuilder whereClause = new StringBuilder(" WHERE t.removed IS NULL"); + + if (isIso) { + whereClause.append(" AND t.format = 'ISO'"); + if (!hyperType.equals(HypervisorType.None)) { + joinClause.append(" INNER JOIN guest_os guestOS on (guestOS.id = t.guest_os_id) INNER JOIN guest_os_hypervisor goh on ( goh.guest_os_id = guestOS.id) "); + whereClause.append(" AND goh.hypervisor_type = '"); + whereClause.append(hyperType); + whereClause.append("'"); + } + } else { + whereClause.append(" AND t.format <> 'ISO'"); + if (hypers.isEmpty()) { + return templateZonePairList; + } else { + final StringBuilder relatedHypers = new StringBuilder(); + for (HypervisorType hyper : hypers) { + relatedHypers.append("'"); + relatedHypers.append(hyper.toString()); + relatedHypers.append("'"); + relatedHypers.append(","); + } + relatedHypers.setLength(relatedHypers.length() - 1); + whereClause.append(" AND t.hypervisor_type IN ("); + whereClause.append(relatedHypers); + whereClause.append(")"); + } + } + + joinClause.append(" INNER JOIN template_s3_ref tsr on (t.id = tsr.template_id)"); + + whereClause.append("AND t.name LIKE \"%"); + whereClause.append(keyword == null ? keyword : name); + whereClause.append("%\""); + + if (bootable != null) { + whereClause.append(" AND t.bootable = "); + whereClause.append(bootable); + } + + if (!showDomr) { + whereClause.append(" AND t.type != '"); + whereClause.append(Storage.TemplateType.SYSTEM); + whereClause.append("'"); + } + + if (templateFilter == TemplateFilter.featured) { + whereClause.append(" AND t.public = 1 AND t.featured = 1"); + } else if ((templateFilter == TemplateFilter.self || templateFilter == TemplateFilter.selfexecutable) + && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { + if (caller.getType() == Account.ACCOUNT_TYPE_DOMAIN_ADMIN + || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) { + joinClause.append(" INNER JOIN account a on (t.account_id = a.id) INNER JOIN domain d on (a.domain_id = d.id)"); + whereClause.append(" AND d.path LIKE '"); + whereClause.append(domain.getPath()); + whereClause.append("%'"); + } else { + whereClause.append(" AND t.account_id IN ("); + whereClause.append(permittedAccountsStr); + whereClause.append(")"); + } + } else if (templateFilter == TemplateFilter.sharedexecutable + && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { + if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) { + joinClause.append(" LEFT JOIN launch_permission lp ON t.id = lp.template_id WHERE (t.account_id IN ("); + joinClause.append(permittedAccountsStr); + joinClause.append(") OR lp.account_id IN ("); + joinClause.append(permittedAccountsStr); + joinClause.append("))"); + } else { + joinClause.append(" INNER JOIN account a on (t.account_id = a.id) "); + } + } else if (templateFilter == TemplateFilter.executable + && !permittedAccounts.isEmpty()) { + whereClause.append(" AND (t.public = 1 OR t.account_id IN ("); + whereClause.append(permittedAccountsStr); + whereClause.append("))"); + } else if (templateFilter == TemplateFilter.community) { + whereClause.append(" AND t.public = 1 AND t.featured = 0"); + } else if (templateFilter == TemplateFilter.all + && caller.getType() == Account.ACCOUNT_TYPE_ADMIN) { + } else if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { + return templateZonePairList; + } + + final StringBuilder sql = new StringBuilder(SELECT_TEMPLATE_S3_REF); + sql.append(joinClause); + sql.append(whereClause); + sql.append(getOrderByLimit(pageSize, startIndex)); + + pstmt = txn.prepareStatement(sql.toString()); + rs = pstmt.executeQuery(); + while (rs.next()) { + final Pair templateZonePair = new Pair( + rs.getLong(1), -1L); + templateZonePairList.add(templateZonePair); + } + txn.commit(); + } catch (Exception e) { + s_logger.warn("Error listing S3 templates", e); + if (txn != null) { + txn.rollback(); + } + } finally { + closeResources(pstmt, rs); + if (txn != null) { + txn.close(); + } + } + + return templateZonePairList; + } + } diff --git a/server/src/com/cloud/storage/s3/S3ManagerImpl.java b/server/src/com/cloud/storage/s3/S3ManagerImpl.java index 6b072540c66..0da11ffa590 100644 --- a/server/src/com/cloud/storage/s3/S3ManagerImpl.java +++ b/server/src/com/cloud/storage/s3/S3ManagerImpl.java @@ -27,7 +27,6 @@ import static com.cloud.utils.S3Utils.checkClientOptions; import static com.cloud.utils.S3Utils.doesBucketExist; import static com.cloud.utils.StringUtils.join; import static com.cloud.utils.db.GlobalLock.executeWithNoWaitLock; -import static com.cloud.utils.db.SearchCriteria.Op.EQ; import static java.lang.Boolean.TRUE; import static java.lang.String.format; import static java.util.Arrays.asList; @@ -433,10 +432,6 @@ public class S3ManagerImpl implements S3Manager { cmd.getStartIndex(), cmd.getPageSizeVal()); final SearchCriteria criteria = this.s3Dao.createSearchCriteria(); - if (cmd.getId() != null) { - criteria.addAnd(ID_COLUMN_NAME, EQ, cmd.getId()); - } - return this.s3Dao.search(criteria, filter); } diff --git a/setup/db/db/schema-40to410.sql b/setup/db/db/schema-40to410.sql index 04df535ff20..fc3ab6f182a 100644 --- a/setup/db/db/schema-40to410.sql +++ b/setup/db/db/schema-40to410.sql @@ -60,6 +60,12 @@ ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `eip_associate_public_ip` int INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network','DEFAULT','NetworkManager','network.dhcp.nondefaultnetwork.setgateway.guestos','Windows','The guest OS\'s name start with this fields would result in DHCP server response gateway information even when the network it\'s on is not default network. Names are separated by comma.'); +ALTER TABLE `sync_queue` ADD `queue_size` SMALLINT NOT NULL DEFAULT '0' COMMENT 'number of items being processed by the queue'; + +ALTER TABLE `sync_queue` ADD `queue_size_limit` SMALLINT NOT NULL DEFAULT '1' COMMENT 'max number of items the queue can process concurrently'; + +ALTER TABLE `sync_queue_item` ADD `queue_proc_time` DATETIME NOT NULL COMMENT 'when processing started for the item' AFTER `queue_proc_number`; + ALTER TABLE upload ADD uuid VARCHAR(40); ALTER TABLE async_job modify job_cmd VARCHAR(255); diff --git a/tools/marvin/marvin/cloudstackConnection.py b/tools/marvin/marvin/cloudstackConnection.py index 8c4e3251690..e8b861eedb2 100644 --- a/tools/marvin/marvin/cloudstackConnection.py +++ b/tools/marvin/marvin/cloudstackConnection.py @@ -46,7 +46,6 @@ class cloudConnection(object): self.auth = False else: self.auth = True - self.retries = 5 self.asyncTimeout = asyncTimeout diff --git a/tools/marvin/marvin/configGenerator.py b/tools/marvin/marvin/configGenerator.py index 11fbce997dd..d494beb6444 100644 --- a/tools/marvin/marvin/configGenerator.py +++ b/tools/marvin/marvin/configGenerator.py @@ -180,6 +180,17 @@ class secondaryStorage(): def __init__(self): self.url = None +class s3(): + def __init__(self): + self.accesskey = None + self.secretkey = None + self.bucket = None + self.endpoint = None + self.sockettimeout = None + self.connectiontimeout = None + self.maxerrorrety = None + self.usehttps = None + class netscaler(): def __init__(self, hostname=None, username='nsroot', password='nsroot'): self.hostname = hostname diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py index ba124cbced4..0d5f3bdc659 100644 --- a/tools/marvin/marvin/deployDataCenter.py +++ b/tools/marvin/marvin/deployDataCenter.py @@ -399,9 +399,11 @@ class deployDataCenters(): logging=self.testClientLogger) """config database""" - #dbSvr = self.config.dbSvr - #self.testClient.dbConfigure(dbSvr.dbSvr, dbSvr.port, dbSvr.user, \ - # dbSvr.passwd, dbSvr.db) + dbSvr = self.config.dbSvr + if dbSvr is not None: + self.testClient.dbConfigure(dbSvr.dbSvr, dbSvr.port, dbSvr.user, \ + dbSvr.passwd, dbSvr.db) + self.apiClient = self.testClient.getApiClient() def updateConfiguration(self, globalCfg): diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css index 68817e40a29..6156f47be3a 100644 --- a/ui/css/cloudstack3.css +++ b/ui/css/cloudstack3.css @@ -441,7 +441,7 @@ body.login { div.list-view table tbody td span { display: block; float: left; - max-width: 100px; + max-width: 160px; word-wrap: break-word; text-indent: 0; margin-left: 12px; @@ -450,13 +450,11 @@ div.list-view table tbody td span { overflow-x: hidden; text-overflow: ellipsis; white-space: nowrap; - } div.list-view table tbody td span:hover { - -overflow:auto; - + overflow: auto; + margin-top: 4px; } div.list-view div.toolbar div.section-switcher div.section-select label { @@ -3432,7 +3430,6 @@ Dialogs*/ display: inline; padding: 0; float: right; - text-decoration: underline; color: #516374; /*+text-shadow:0px -1px 1px #FFFFFF;*/ -moz-text-shadow: 0px -1px 1px #FFFFFF; @@ -3529,6 +3526,11 @@ Dialogs*/ -webkit-text-shadow: 0px -1px 1px #495968; -o-text-shadow: 0px -1px 1px #495968; text-shadow: 0px -1px 1px #495968; + background: url(../images/icons.png) no-repeat 0px -255px; +} + +.notice .ui-dialog-title { + background-position: 0px -288px; } .ui-dialog.confirm .ui-dialog-title { @@ -7221,19 +7223,18 @@ div.container div.panel div#details-tab-addloadBalancer.detail-group div.loadBal min-width: 100px; } -div.ui-dialog div.multi-edit-add-list div.view div.data-table table.body tbody tr.even td - { - border-right: 1px solid #BFBFBF; - clear: none; - color: #495A76; - font-size: 10px; - margin-right: 25px; - min-width: -moz-available; - max-width:90px; - overflow: hidden; - padding: 9px 5px 8px 0; - position: relative; - vertical-align: middle; +div.ui-dialog div.multi-edit-add-list div.view div.data-table table.body tbody tr.even td { + border-right: 1px solid #BFBFBF; + clear: none; + color: #495A76; + font-size: 10px; + margin-right: 25px; + min-width: -moz-available; + max-width: 90px; + overflow: hidden; + padding: 9px 5px 8px 0; + position: relative; + vertical-align: middle; } .multi-edit { @@ -7472,11 +7473,12 @@ div.ui-dialog div.multi-edit-add-list div.view div.data-table table.body tbody t } .multi-edit .data .data-body .data-item > table tbody tr td span { - overflow-x: auto; - overflow-y: hidden; - max-width: 88px; + overflow: hidden; + max-width: 78px; display: block; float: left; + text-overflow: ellipsis; + white-space: nowrap; } .multi-edit .data .data-body .data-item table tbody tr td.blank { @@ -8796,6 +8798,7 @@ div.ui-dialog div.multi-edit-add-list div.view div.data-table table.body tbody t .project-selector .listing .data ul li { padding: 10px 0 10px 7px; cursor: pointer; + font-size: 12px; } .project-selector .listing .data ul li.odd { @@ -8819,8 +8822,8 @@ div.ui-dialog div.multi-edit-add-list div.view div.data-table table.body tbody t text-shadow: 0px 1px 1px #FFFFFF; text-align: left; color: #4F6171; - font-size: 12px; - padding: 2px 2px 3px 7px; + font-size: 11px; + padding: 3px 2px 3px 7px; border-bottom: 1px solid #FFFFFF; position: absolute; left: 0; @@ -8833,17 +8836,14 @@ div.ui-dialog div.multi-edit-add-list div.view div.data-table table.body tbody t border-radius: 4px 4px 4px 4px; font-size: 13px; font-weight: bold; + padding: 8px 20px; float: none; cursor: pointer; color: #838181; - /*+placement:shift 488px 9px;*/ - position: relative; - left: 488px; - top: 9px; left: 170px; top: -8px; - margin: 19px 0 0 0px; width: 54px; + margin: auto auto 17px; } .project-selector .button.cancel:hover { @@ -9208,9 +9208,9 @@ div.ui-dialog div.multi-edit-add-list div.view div.data-table table.body tbody t } .info-boxes .info-box ul li .date { - font-size: 13px; + font-size: 11px; text-align: center; - margin: 0; + margin: 1px 0 0; } .info-boxes .info-box ul li .date span { @@ -9229,7 +9229,10 @@ div.ui-dialog div.multi-edit-add-list div.view div.data-table table.body tbody t top: 8px; display: inline-block; padding-bottom: 13px; - max-width: 171px; + max-width: 153px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .info-boxes .info-box ul li .total span { @@ -10689,10 +10692,9 @@ div.ui-dialog div.autoscaler div.field-group div.form-container form div.form-it } div.container div.panel div#details-tab-network.detail-group div div.multi-edit table.multi-edit tbody tr td, - div.container div.panel div#details-tab-network.detail-group div div.multi-edit table.multi-edit thead tr th - { - min-width:72px; - font-size:10px; +div.container div.panel div#details-tab-network.detail-group div div.multi-edit table.multi-edit thead tr th { + min-width: 72px; + font-size: 10px; } .ui-dialog div.autoscaler .detail-actions { @@ -11178,8 +11180,8 @@ div.ui-dialog div.autoscaler div.field-group div.form-container form div.form-it background-position: -168px -31px; } -.reset .icon{ -background-position: -168px -31px; +.reset .icon { + background-position: -168px -31px; } .restoreVM:hover .icon, @@ -11187,7 +11189,6 @@ background-position: -168px -31px; background-position: -168px -613px; } - .reset:hover .icon { background-position: -168px -613px; } @@ -11316,3 +11317,4 @@ background-position: -168px -31px; cursor: pointer; color: #0000FF !important; } + diff --git a/ui/images/icons.png b/ui/images/icons.png index 63c10b02631..ea1a39cdf7f 100644 Binary files a/ui/images/icons.png and b/ui/images/icons.png differ diff --git a/ui/scripts/ui/widgets/listView.js b/ui/scripts/ui/widgets/listView.js index 60f8e02c041..85523ea5e7a 100644 --- a/ui/scripts/ui/widgets/listView.js +++ b/ui/scripts/ui/widgets/listView.js @@ -914,6 +914,8 @@ $('').html(_s(content)) ); } + + $td.attr('title', _s(content)); }); $tr.find('td:first').addClass('first'); diff --git a/utils/src/com/cloud/utils/db/DbUtil.java b/utils/src/com/cloud/utils/db/DbUtil.java index feef7b3b236..da0efbbe8cb 100755 --- a/utils/src/com/cloud/utils/db/DbUtil.java +++ b/utils/src/com/cloud/utils/db/DbUtil.java @@ -23,6 +23,7 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import java.util.HashMap; import java.util.Map; @@ -280,4 +281,62 @@ public class DbUtil { } return false; } + + public static void closeResources(final Connection connection, + final Statement statement, final ResultSet resultSet) { + + closeResultSet(resultSet); + closeStatement(statement); + closeConnection(connection); + + } + + public static void closeResources(final Statement statement, final ResultSet resultSet) { + + closeResources(null, statement, resultSet); + + } + + public static void closeResultSet(final ResultSet resultSet) { + + try { + + if (resultSet != null) { + resultSet.close(); + } + + } catch (Exception e) { + s_logger.warn("Ignored exception while closing result set.",e); + } + + } + + public static void closeStatement(final Statement statement) { + + try { + + if (statement != null) { + statement.close(); + } + + } catch (Exception e) { + s_logger.warn("Ignored exception while closing statement.",e); + } + + } + + public static void closeConnection(final Connection connection) { + + try { + + if (connection != null) { + connection.close(); + } + + } catch (Exception e) { + s_logger.warn("Ignored exception while close connection.",e); + } + + } + }