diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops index 4bffbef164f..2c45006d2f7 100755 --- a/scripts/vm/hypervisor/xenserver/vmops +++ b/scripts/vm/hypervisor/xenserver/vmops @@ -394,7 +394,7 @@ def checkIscsi(session, args): rdevpath = rdevpath.replace(".", "") rdevpath = rdevpath.replace("/", "") rdevpath = "/block/" + rdevpath - cmd = ["scsi_id", "-g", "-s", rdevpath ] + cmd = ["scsi_id", "-g", "-u", "-s", rdevpath ] txt = util.pread2(cmd) txt = txt.replace("\n", "") if scsiid == txt: diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 75d3cca01dd..d4e89e7f60e 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -961,6 +961,7 @@ public class NetworkManagerImpl implements NetworkManager { instanceIds.add(instanceIdParam); } + // FIXME: We should probably lock the load balancer here to prevent multiple updates... LoadBalancerVO loadBalancer = _loadBalancerDao.findById(loadBalancerId); if (loadBalancer == null) { throw new InvalidParameterValueException("Failed to assign to load balancer " + loadBalancerId + ", the load balancer was not found."); @@ -995,9 +996,12 @@ public class NetworkManagerImpl implements NetworkManager { } } + List finalInstanceIds = new ArrayList(); for (Long instanceId : instanceIds) { if (mappedInstanceIds.contains(instanceId)) { continue; + } else { + finalInstanceIds.add(instanceId); } UserVmVO userVm = _vmDao.findById(instanceId); @@ -1125,6 +1129,14 @@ public class NetworkManagerImpl implements NetworkManager { } if ((updatedRules != null) && (updatedRules.size() == firewallRulesToApply.size())) { // flag the instances as mapped to the load balancer + for (Long addedInstanceId : finalInstanceIds) { + LoadBalancerVMMapVO mappedVM = new LoadBalancerVMMapVO(loadBalancerId, addedInstanceId); + _loadBalancerVMMapDao.persist(mappedVM); + } + + /* We used to add these instances as pending when the API command is received on the server, and once they were applied, + * the pending status was removed. In the 2.2 API framework, this is no longer done and instead the new mappings just + * need to be persisted List pendingMappedVMs = _loadBalancerVMMapDao.listByLoadBalancerId(loadBalancerId, true); for (LoadBalancerVMMapVO pendingMappedVM : pendingMappedVMs) { if (instanceIds.contains(pendingMappedVM.getInstanceId())) { @@ -1133,6 +1145,7 @@ public class NetworkManagerImpl implements NetworkManager { _loadBalancerVMMapDao.update(pendingMappedVM.getId(), pendingMappedVMForUpdate); } } + */ for (FirewallRuleVO updatedRule : updatedRules) { if (updatedRule.getId() == null) { diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 9ab36f851b9..92f124b5c16 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -5115,27 +5115,46 @@ public class ManagementServerImpl implements ManagementServer { accountId = account.getId(); } - Filter searchFilter = new Filter(SnapshotVO.class, "created", false, cmd.getStartIndex(), cmd.getPageSizeVal()); - SearchCriteria sc = _snapshotDao.createSearchCriteria(); - Object name = cmd.getSnapshotName(); Object id = cmd.getId(); Object keyword = cmd.getKeyword(); Object snapshotTypeStr = cmd.getSnapshotType(); String interval = cmd.getIntervalType(); - sc.addAnd("status", SearchCriteria.Op.EQ, Snapshot.Status.BackedUp); + Filter searchFilter = new Filter(SnapshotVO.class, "created", false, cmd.getStartIndex(), cmd.getPageSizeVal()); + SearchBuilder sb = _snapshotDao.createSearchBuilder(); + sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ); + sb.and("volumeId", sb.entity().getVolumeId(), SearchCriteria.Op.EQ); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ); + sb.and("snapshotTypeEQ", sb.entity().getSnapshotType(), SearchCriteria.Op.EQ); + sb.and("snapshotTypeNEQ", sb.entity().getSnapshotType(), SearchCriteria.Op.NEQ); + + if ((accountId == null) && (domainId != null)) { + // if accountId isn't specified, we can do a domain match for the admin case + SearchBuilder accountSearch = _accountDao.createSearchBuilder(); + 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); + accountSearch.join("domainSearch", domainSearch, accountSearch.entity().getDomainId(), domainSearch.entity().getId(), JoinType.INNER); + } + + SearchCriteria sc = sb.create(); + + sc.setParameters("status", Snapshot.Status.BackedUp); if (volumeId != null) { - sc.addAnd("volumeId", SearchCriteria.Op.EQ, volumeId); + sc.setParameters("volumeId", volumeId); } - + if (name != null) { - sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + name + "%"); + sc.setParameters("name", "%" + name + "%"); } if (id != null) { - sc.addAnd("id", SearchCriteria.Op.EQ, id); + sc.setParameters("id", SearchCriteria.Op.EQ, id); } if (keyword != null) { @@ -5144,9 +5163,13 @@ public class ManagementServerImpl implements ManagementServer { sc.addAnd("name", SearchCriteria.Op.SC, ssc); } - + if (accountId != null) { - sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); + sc.setParameters("accountId", accountId); + } else if (domainId != null) { + DomainVO domain = _domainDao.findById((Long)domainId); + SearchCriteria joinSearch = sc.getJoin("accountSearch"); + joinSearch.setJoinParameters("domainSearch", "path", domain.getPath() + "%"); } if (snapshotTypeStr != null) { @@ -5154,10 +5177,10 @@ public class ManagementServerImpl implements ManagementServer { if (snapshotType == null) { throw new InvalidParameterValueException("Unsupported snapshot type " + snapshotTypeStr); } - sc.addAnd("snapshotType", SearchCriteria.Op.EQ, snapshotType.ordinal()); + sc.setParameters("snapshotTypeEQ", snapshotType.ordinal()); } else { // Show only MANUAL and RECURRING snapshot types - sc.addAnd("snapshotType", SearchCriteria.Op.NEQ, Snapshot.SnapshotType.TEMPLATE.ordinal()); + sc.setParameters("snapshotTypeNEQ", Snapshot.SnapshotType.TEMPLATE.ordinal()); } return _snapshotDao.search(sc, searchFilter); diff --git a/ui/new/css/main.css b/ui/new/css/main.css index 6d1875d42f7..c773017fcdb 100644 --- a/ui/new/css/main.css +++ b/ui/new/css/main.css @@ -42,7 +42,7 @@ a:link, a:visited { } -a:visited { +a:hover { text-decoration:underline; } @@ -1479,11 +1479,11 @@ a:visited { } .leftmenu_arrows_firstlevel_open { - width:9px; - height:9px; + width:14px; + height:12px; float:right; - margin:2px 4px 0 0; - background:url(../images/leftmenu_openarrow.png) no-repeat top left; + margin:0 4px 0 0; + background:url(../images/leftmenu_maindownarrow.png) no-repeat top left; padding:0; } @@ -3324,7 +3324,7 @@ a:hover.search_button { border:1px solid #999; position:absolute; top:5px; - left:8px; + left:20px; margin:0; padding:0 0 10px 0; } @@ -3338,6 +3338,34 @@ a:hover.search_button { padding:0; } +.networkswitch_infodropdown_actionbox { + width:192px; + height:auto; + float:left; + margin:5px 0 0 0; + display:inline; + padding:0; +} + +.networkswitch_infodropdown_actionbox a { + float:right; + color:#2c8bbc; + font-size:10px; + font-weight:normal; + text-align:left; + margin:0 7px 0 0; + padding:0; + text-decoration:none; +} + +.networkswitch_infodropdown_actionbox a:link, .networkswitch_infodropdown_actionbox a:visited { + text-decoration:none; + +} + +.networkswitch_infodropdown_actionbox a:hover { + text-decoration:underline; +} .networkswitch_infodropdown_textbox li{ width:180px; height:auto; @@ -3365,7 +3393,7 @@ a:hover.search_button { height:15px; float:left; background:url(../images/networkswitch_infoicon.gif) no-repeat top left; - margin:-12px 0 0 20px; + margin:-12px 0 0 10px; display:inline; padding:0; cursor:pointer; @@ -3431,7 +3459,7 @@ a:hover.search_button { width:45px; height:21px; float:left; - margin:-22px 0 0 38px; + margin:-22px 0 0 29px; padding:0; } @@ -3447,15 +3475,15 @@ a:hover.search_button { width:12px; height:12px; float:left; - background:url(../images/search_closeicon.gif) no-repeat top left; - margin:-22px 0 0 10px; + background:url(../images/search_closeicon_hover.gif) no-repeat top left; + margin:0 0 0 0; padding:0; cursor:hand; cursor:pointer; } -.networkswitch_closeicon{ - background:url(../images/search_closeicon_hover.gif) no-repeat top left; +.networkswitch_closeicon:hover{ + background:url(../images/search_closeicon.gif) no-repeat top left; } diff --git a/ui/new/images/leftmenu_maindownarrow.png b/ui/new/images/leftmenu_maindownarrow.png new file mode 100644 index 00000000000..328ea8abeec Binary files /dev/null and b/ui/new/images/leftmenu_maindownarrow.png differ diff --git a/ui/new/images/vlan_barbg.gif b/ui/new/images/vlan_barbg.gif index c1a6ea19cb7..2e2e0ac27b0 100644 Binary files a/ui/new/images/vlan_barbg.gif and b/ui/new/images/vlan_barbg.gif differ diff --git a/ui/new/images/vlan_connect.gif b/ui/new/images/vlan_connect.gif index 6643983aedc..8156fcd1add 100644 Binary files a/ui/new/images/vlan_connect.gif and b/ui/new/images/vlan_connect.gif differ diff --git a/ui/new/index.jsp b/ui/new/index.jsp index 3a97d8081c8..c570080bbfc 100644 --- a/ui/new/index.jsp +++ b/ui/new/index.jsp @@ -686,9 +686,9 @@ long milliseconds = new Date().getTime();
@@ -752,9 +752,9 @@ long milliseconds = new Date().getTime();
@@ -762,18 +762,18 @@ long milliseconds = new Date().getTime(); diff --git a/ui/new/jsp/resource.jsp b/ui/new/jsp/resource.jsp index 72578a0d81f..13ee11c17f2 100644 --- a/ui/new/jsp/resource.jsp +++ b/ui/new/jsp/resource.jsp @@ -982,10 +982,14 @@