Merge branch 'master' into api_refactoring

Conflicts:
	api/src/com/cloud/api/commands/ListS3sCmd.java
	server/src/com/cloud/configuration/ConfigurationManagerImpl.java
	setup/db/db/schema-40to410.sql

Signed-off-by: Rohit Yadav <bhaisaab@apache.org>
This commit is contained in:
Rohit Yadav 2013-01-02 13:57:55 -08:00
commit d8d87adc22
15 changed files with 345 additions and 107 deletions

View File

@ -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;
}
}

View File

@ -217,6 +217,10 @@
<include name="discovery-*.jar" />
<include name="wsdl4j-*.jar" />
<include name="ejb-api-3.0.jar" />
<include name="aws-java-sdk-1.3.21.1.jar" />
<include name="httpclient-4.1.jar" />
<include name="httpcore-4.1.jar" />
<include name="commons-lang-2.1.jar" />
</zipfileset>
<zipfileset dir="${jar.dir}">
<include name="${agent.jar}" />

View File

@ -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 {

View File

@ -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<Long, Long>(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<Pair<Long, Long>> templateZonePairSet2 = new HashSet<Pair<Long, Long>>();
templateZonePairSet2 = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers,
bootable, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr,
permittedAccounts, caller, listProjectResourcesCriteria, tags);
for (Pair<Long, Long> tmpltPair : templateZonePairSet2) {
if (!templateZonePairSet.contains(new Pair<Long, Long>(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<Long, Long>(template.getId(), zoneId));
}
} else {
if (template == null) {
templateZonePairSet = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers, bootable, domain, pageSize,

View File

@ -58,6 +58,10 @@ public interface VMTemplateDao extends GenericDao<VMTemplateVO, Long> {
boolean isIso, List<HypervisorType> hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex,
Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List<Account> permittedAccounts, Account caller, Map<String, String> tags);
public Set<Pair<Long, Long>> searchS3Templates(String name, String keyword, TemplateFilter templateFilter,
boolean isIso, List<HypervisorType> hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex,
Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List<Account> permittedAccounts, Account caller, Map<String, String> tags);
public long addTemplateToZone(VMTemplateVO tmplt, long zoneId);
public List<VMTemplateVO> listAllInZone(long dataCenterId);

View File

@ -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<VMTemplateVO, Long> 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<VMTemplateVO, Long> implem
return executeList(SELECT_S3_CANDIDATE_TEMPLATES, new Object[] {});
}
@Override
public Set<Pair<Long, Long>> searchS3Templates(final String name,
final String keyword, final TemplateFilter templateFilter,
final boolean isIso, final List<HypervisorType> 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<Account> permittedAccounts,
final Account caller, final Map<String, String> tags) {
final String permittedAccountsStr = join(",", permittedAccounts);
final Transaction txn = Transaction.currentTxn();
txn.start();
Set<Pair<Long, Long>> templateZonePairList = new HashSet<Pair<Long, Long>>();
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<Long, Long> templateZonePair = new Pair<Long, Long>(
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;
}
}

View File

@ -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<S3VO> criteria = this.s3Dao.createSearchCriteria();
if (cmd.getId() != null) {
criteria.addAnd(ID_COLUMN_NAME, EQ, cmd.getId());
}
return this.s3Dao.search(criteria, filter);
}

View File

@ -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);

View File

@ -46,7 +46,6 @@ class cloudConnection(object):
self.auth = False
else:
self.auth = True
self.retries = 5
self.asyncTimeout = asyncTimeout

View File

@ -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

View File

@ -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):

View File

@ -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;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -914,6 +914,8 @@
$('<span></span>').html(_s(content))
);
}
$td.attr('title', _s(content));
});
$tr.find('td:first').addClass('first');

View File

@ -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);
}
}
}