From 5d00edb31bd665388642998da35fb22a20b1e944 Mon Sep 17 00:00:00 2001 From: Nitin Mehta Date: Fri, 23 Dec 2011 16:28:22 +0530 Subject: [PATCH 01/17] bug 11602: Account id logged in the events table should belong to the caller. Reviewed by : Kishan. --- api/src/com/cloud/api/commands/DeleteAccountCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 api/src/com/cloud/api/commands/DeleteAccountCmd.java diff --git a/api/src/com/cloud/api/commands/DeleteAccountCmd.java b/api/src/com/cloud/api/commands/DeleteAccountCmd.java old mode 100644 new mode 100755 index 7e35858b24b..e24495726af --- a/api/src/com/cloud/api/commands/DeleteAccountCmd.java +++ b/api/src/com/cloud/api/commands/DeleteAccountCmd.java @@ -72,7 +72,7 @@ public class DeleteAccountCmd extends BaseAsyncCmd { @Override public long getEntityOwnerId() { - Account account = _entityMgr.findById(Account.class, getId()); + Account account = UserContext.current().getCaller();// Let's give the caller here for event logging. if (account != null) { return account.getAccountId(); } From 51d77c259d543b74d2e273c670036a070c84d660 Mon Sep 17 00:00:00 2001 From: kishan Date: Fri, 23 Dec 2011 17:37:59 +0530 Subject: [PATCH 02/17] bug 5412: Use same search criteria for listing pending events instead of creating a new one status 5412: resolved fixed reviewed-by: Nitin --- core/src/com/cloud/event/dao/EventDao.java | 2 - .../src/com/cloud/event/dao/EventDaoImpl.java | 17 ------ .../com/cloud/server/ManagementServer.java | 2 - .../cloud/server/ManagementServerImpl.java | 58 ++++++++++--------- 4 files changed, 30 insertions(+), 49 deletions(-) diff --git a/core/src/com/cloud/event/dao/EventDao.java b/core/src/com/cloud/event/dao/EventDao.java index 58390bb58ff..ce834e1b00d 100644 --- a/core/src/com/cloud/event/dao/EventDao.java +++ b/core/src/com/cloud/event/dao/EventDao.java @@ -31,7 +31,5 @@ public interface EventDao extends GenericDao { public List listOlderEvents(Date oldTime); - List listStartedEvents(Date minTime, Date maxTime); - EventVO findCompletedEvent(long startId); } diff --git a/core/src/com/cloud/event/dao/EventDaoImpl.java b/core/src/com/cloud/event/dao/EventDaoImpl.java index c508a003249..de6f64b5449 100644 --- a/core/src/com/cloud/event/dao/EventDaoImpl.java +++ b/core/src/com/cloud/event/dao/EventDaoImpl.java @@ -35,16 +35,9 @@ import com.cloud.utils.db.SearchCriteria; @Local(value={EventDao.class}) public class EventDaoImpl extends GenericDaoBase implements EventDao { public static final Logger s_logger = Logger.getLogger(EventDaoImpl.class.getName()); - protected final SearchBuilder StartedEventsSearch; protected final SearchBuilder CompletedEventSearch; public EventDaoImpl () { - StartedEventsSearch = createSearchBuilder(); - StartedEventsSearch.and("state",StartedEventsSearch.entity().getState(),SearchCriteria.Op.NEQ); - StartedEventsSearch.and("startId", StartedEventsSearch.entity().getStartId(), SearchCriteria.Op.EQ); - StartedEventsSearch.and("createDate", StartedEventsSearch.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); - StartedEventsSearch.done(); - CompletedEventSearch = createSearchBuilder(); CompletedEventSearch.and("state",CompletedEventSearch.entity().getState(),SearchCriteria.Op.EQ); CompletedEventSearch.and("startId", CompletedEventSearch.entity().getStartId(), SearchCriteria.Op.EQ); @@ -65,16 +58,6 @@ public class EventDaoImpl extends GenericDaoBase implements Event } - @Override - public List listStartedEvents(Date minTime, Date maxTime) { - if (minTime == null || maxTime == null) return null; - SearchCriteria sc = StartedEventsSearch.create(); - sc.setParameters("state", State.Completed); - sc.setParameters("startId", 0); - sc.setParameters("createDate", minTime, maxTime); - return listIncludingRemovedBy(sc, null); - } - @Override public EventVO findCompletedEvent(long startId) { SearchCriteria sc = CompletedEventSearch.create(); diff --git a/server/src/com/cloud/server/ManagementServer.java b/server/src/com/cloud/server/ManagementServer.java index c623685e8e8..2a6de5c7251 100755 --- a/server/src/com/cloud/server/ManagementServer.java +++ b/server/src/com/cloud/server/ManagementServer.java @@ -78,8 +78,6 @@ public interface ManagementServer extends ManagementService { */ List getEvents(long userId, long accountId, Long domainId, String type, String level, Date startDate, Date endDate); - List listPendingEvents(int entryTime, int duration); - //FIXME - move all console proxy related commands to corresponding managers ConsoleProxyInfo getConsoleProxyForVm(long dataCenterId, long userVmId); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 3ffab2f58d3..33095a7f800 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1500,13 +1500,6 @@ public class ManagementServerImpl implements ManagementServer { Integer entryTime = cmd.getEntryTime(); Integer duration = cmd.getDuration(); - if ((entryTime != null) && (duration != null)) { - if (entryTime <= duration) { - throw new InvalidParameterValueException("Entry time must be greater than duration"); - } - return listPendingEvents(entryTime, duration); - } - SearchBuilder sb = _eventDao.createSearchBuilder(); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("levelL", sb.entity().getLevel(), SearchCriteria.Op.LIKE); @@ -1519,6 +1512,9 @@ public class ManagementServerImpl implements ManagementServer { sb.and("createDateG", sb.entity().getCreateDate(), SearchCriteria.Op.GTEQ); sb.and("createDateL", sb.entity().getCreateDate(), SearchCriteria.Op.LTEQ); sb.and("accountType", sb.entity().getAccountType(), SearchCriteria.Op.NEQ); + sb.and("state", sb.entity().getState(),SearchCriteria.Op.NEQ); + sb.and("startId", sb.entity().getStartId(), SearchCriteria.Op.EQ); + sb.and("createDate", sb.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); if (isAdmin && permittedAccounts.isEmpty() && domainId != null) { // if accountId isn't specified, we can do a domain match for the admin case @@ -1565,8 +1561,33 @@ public class ManagementServerImpl implements ManagementServer { } else if (endDate != null) { sc.setParameters("createDateL", endDate); } - - return _eventDao.searchAllEvents(sc, searchFilter); + + if ((entryTime != null) && (duration != null)) { + if (entryTime <= duration) { + throw new InvalidParameterValueException("Entry time must be greater than duration"); + } + Calendar calMin = Calendar.getInstance(); + Calendar calMax = Calendar.getInstance(); + calMin.add(Calendar.SECOND, -entryTime); + calMax.add(Calendar.SECOND, -duration); + Date minTime = calMin.getTime(); + Date maxTime = calMax.getTime(); + + sc.setParameters("state", com.cloud.event.Event.State.Completed); + sc.setParameters("startId", 0); + sc.setParameters("createDate", minTime, maxTime); + List startedEvents = _eventDao.searchAllEvents(sc, searchFilter); + List pendingEvents = new ArrayList(); + for (EventVO event : startedEvents) { + EventVO completedEvent = _eventDao.findCompletedEvent(event.getId()); + if (completedEvent == null) { + pendingEvents.add(event); + } + } + return _eventDao.searchAllEvents(sc, searchFilter); + } else { + return _eventDao.searchAllEvents(sc, searchFilter); + } } @@ -3072,25 +3093,6 @@ public class ManagementServerImpl implements ManagementServer { return cloudParams; } - @Override - public List listPendingEvents(int entryTime, int duration) { - Calendar calMin = Calendar.getInstance(); - Calendar calMax = Calendar.getInstance(); - calMin.add(Calendar.SECOND, -entryTime); - calMax.add(Calendar.SECOND, -duration); - Date minTime = calMin.getTime(); - Date maxTime = calMax.getTime(); - List startedEvents = _eventDao.listStartedEvents(minTime, maxTime); - List pendingEvents = new ArrayList(); - for (EventVO event : startedEvents) { - EventVO completedEvent = _eventDao.findCompletedEvent(event.getId()); - if (completedEvent == null) { - pendingEvents.add(event); - } - } - return pendingEvents; - } - @Override public Map listCapabilities(ListCapabilitiesCmd cmd) { Map capabilities = new HashMap(); From 37a8d83b6ae310da2273973c1647f2672611165b Mon Sep 17 00:00:00 2001 From: kishan Date: Fri, 23 Dec 2011 17:41:30 +0530 Subject: [PATCH 03/17] bug 5412: Use same search criteria for listing pending events instead of creating a new one status 5412: resolved fixed reviewed-by: Nitin --- server/src/com/cloud/server/ManagementServerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 33095a7f800..67630053992 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -1584,7 +1584,7 @@ public class ManagementServerImpl implements ManagementServer { pendingEvents.add(event); } } - return _eventDao.searchAllEvents(sc, searchFilter); + return pendingEvents; } else { return _eventDao.searchAllEvents(sc, searchFilter); } From f259fec4712271c63358b3820783c3a4cecfb35a Mon Sep 17 00:00:00 2001 From: Murali reddy Date: Fri, 23 Dec 2011 18:05:58 +0530 Subject: [PATCH 04/17] bug 12742:Static NAT IP address is being programmed as Source NAT Ip address on the Virtual Router reviewed-by:Abhinandan.Prateek@citrix.com janardhan.reddynaredula@citrix.com --- .../com/cloud/network/NetworkManagerImpl.java | 247 +++++++++++------- 1 file changed, 153 insertions(+), 94 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 1be3b72c696..01796b1b1ea 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -269,6 +269,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Inject FirewallRulesDao _firewallDao; @Inject + PortForwardingRulesDao _portForwardingDao; + @Inject ResourceLimitService _resourceLimitMgr; @Inject DomainRouterDao _routerDao; @Inject DomainManager _domainMgr; @@ -576,7 +578,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } - boolean success = applyIpAssociations(network, continueOnError, publicIps); + boolean success = applyIpAssociations(network, false, continueOnError, publicIps); if (success) { for (IPAddressVO addr : userIps) { @@ -601,87 +603,81 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return success; } - protected boolean applyProviderIpAssociations(Network network, Purpose purpose, boolean continueOnError, List rules) throws ResourceUnavailableException { + protected boolean applyIpAssociations(Network network, boolean rulesRevoked, boolean continueOnError, List publicIps) throws ResourceUnavailableException { boolean success = true; + List firewallPublicIps = new ArrayList(); + List loadbalncerPublicIps = new ArrayList(); - List publicIps = new ArrayList(); - for (FirewallRule rule : rules) { - IPAddressVO lbIp = _ipAddressDao.findById(rule.getSourceIpAddressId()); - PublicIp publicIp = new PublicIp(lbIp, _vlanDao.findById(lbIp.getVlanId()), NetUtils.createSequenceBasedMacAddress(lbIp.getMacAddress())); - publicIps.add(publicIp); - } - - for (NetworkElement ne : _networkElements) { - try { - boolean handled; - switch (purpose) { - case LoadBalancing: - if (!(ne instanceof LoadBalancingServiceProvider)) { - continue; - } - LoadBalancingServiceProvider lbProvider = (LoadBalancingServiceProvider) ne; - s_logger.trace("Asking " + ne + " to apply ip associations for " + purpose.toString() + " purpose"); - handled = lbProvider.applyLoadBalancerIp(network, publicIps); - break; - - case PortForwarding: - if (!(ne instanceof PortForwardingServiceProvider)) { - continue; - } - PortForwardingServiceProvider pfProvider = (PortForwardingServiceProvider) ne; - s_logger.trace("Asking " + ne + " to apply ip associations for " + purpose.toString() + " purpose"); - handled = pfProvider.applyIps(network, publicIps); - break; - - case StaticNat: - case Firewall: - if (!(ne instanceof FirewallServiceProvider)) { - continue; - } - s_logger.trace("Asking " + ne + " to apply ip associations for " + purpose.toString() + " purpose"); - FirewallServiceProvider fwProvider = (FirewallServiceProvider) ne; - handled = fwProvider.applyIps(network, publicIps); - break; - - default: - s_logger.debug("Unable to handle IP association for purpose: " + purpose.toString()); - handled = false; - } - s_logger.debug("Network Rules for network " + network.getId() + " were " + (handled ? "" : " not") + " handled by " + ne.getName()); - } catch (ResourceUnavailableException e) { - success = false; - if (!continueOnError) { - throw e; + if (publicIps != null && !publicIps.isEmpty()) { + for (PublicIp ip : publicIps) { + if (ip.isSourceNat()) { + // Source nat ip address should always be sent first + firewallPublicIps.add(0, ip); + } else if (ip.isOneToOneNat()) { + firewallPublicIps.add(ip); } else { - s_logger.debug("Resource is not available: " + ne.getName(), e); + //if IP in allocating state then it will not have any rules attached so skip IPAssoc to network service provider + if (ip.getState() == State.Allocating) { + continue; + } + + // check if any active rules are applied on the public IP + Purpose purpose = getPublicIpPurpose(ip, false); + if (purpose == null) { + // since no active rules are there check if any rules are applied on the public IP but are in revoking state + purpose = getPublicIpPurpose(ip, true); + if (purpose == null) { + // IP is not being used for any purpose so skip IPAssoc to network service provider + continue; + } else { + if (rulesRevoked) { + // no active rules/revoked rules are associated with this public IP, so remove the association with the provider + ip.setState(State.Releasing); + } else { + if (ip.getState() == State.Releasing) { + // rules are not revoked yet, so don't let the network service provider revoke the IP association + // mark IP is allocated so that IP association will not be removed from the provider + ip.setState(State.Allocated); + } + } + } + } + + switch(purpose) { + case LoadBalancing: + loadbalncerPublicIps.add(ip); + break; + + case PortForwarding: + case StaticNat: + case Firewall: + firewallPublicIps.add(ip); + break; + default: + } } } } - return success; - } - - protected boolean applyIpAssociations(Network network, boolean continueOnError, List publicIps) throws ResourceUnavailableException { - boolean success = true; - List srcNatpublicIps = new ArrayList(); - - // apply IP only for source NAT public IP at this point. Depending on the network service for which - // public IP will be used do IP Association to respective network service provider before apply rules - if (publicIps != null && !publicIps.isEmpty()) { - for (PublicIp ip : publicIps) { - if (ip.isSourceNat()) { - srcNatpublicIps.add(ip); - } - } - } - + for (NetworkElement element : _networkElements) { try { - if (!(element instanceof FirewallServiceProvider)) { - continue; + if (element instanceof FirewallServiceProvider && element instanceof LoadBalancingServiceProvider) { + List allIps = new ArrayList(); + allIps.addAll(firewallPublicIps); + allIps.addAll(loadbalncerPublicIps); + FirewallServiceProvider fwProvider = (FirewallServiceProvider)element; + fwProvider.applyIps(network, allIps); + } else if (element instanceof FirewallServiceProvider) { + FirewallServiceProvider fwProvider = (FirewallServiceProvider)element; + fwProvider.applyIps(network, firewallPublicIps); + } else if (element instanceof LoadBalancingServiceProvider) { + LoadBalancingServiceProvider lbProvider = (LoadBalancingServiceProvider) element; + if (loadbalncerPublicIps != null && !loadbalncerPublicIps.isEmpty()) { + lbProvider.applyLoadBalancerIp(network, publicIps); + } + } else { + continue; } - FirewallServiceProvider e = (FirewallServiceProvider)element; - s_logger.trace("Asking " + element + " to apply ip associations"); - e.applyIps(network, srcNatpublicIps); } catch (ResourceUnavailableException e) { success = false; if (!continueOnError) { @@ -691,10 +687,56 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } } + return success; } + Purpose getPublicIpPurpose(PublicIp ip, boolean includeRevoked) { + if (includeRevoked) { + List loadBalancingRules = _firewallDao.listByIpAndPurpose(ip.getId(), Purpose.LoadBalancing); + if (loadBalancingRules != null && !loadBalancingRules.isEmpty()) { + return Purpose.LoadBalancing; + } + List firewall_rules = _firewallDao.listByIpAndPurpose(ip.getId(), Purpose.Firewall); + if (firewall_rules != null && !firewall_rules.isEmpty()) { + return Purpose.Firewall; + } + + List staticNatRules = _firewallDao.listByIpAndPurpose(ip.getId(), Purpose.StaticNat); + if (staticNatRules != null && !staticNatRules.isEmpty()) { + return Purpose.StaticNat; + } + + List pfRules = _portForwardingDao.listByIp(ip.getId()); + if (pfRules != null && !pfRules.isEmpty()) { + return Purpose.PortForwarding; + } + } else { + List loadBalancingRules = _firewallDao.listByIpAndPurposeAndNotRevoked(ip.getId(), Purpose.LoadBalancing); + if (loadBalancingRules != null && !loadBalancingRules.isEmpty()) { + return Purpose.LoadBalancing; + } + + List firewall_rules = _firewallDao.listByIpAndPurposeAndNotRevoked(ip.getId(), Purpose.Firewall); + if (firewall_rules != null && !firewall_rules.isEmpty()) { + return Purpose.Firewall; + } + + List staticNatRules = _firewallDao.listByIpAndPurposeAndNotRevoked(ip.getId(), Purpose.StaticNat); + if (staticNatRules != null && !staticNatRules.isEmpty()) { + return Purpose.StaticNat; + } + + List pfRules = _portForwardingDao.listByIpAndNotRevoked(ip.getId()); + if (pfRules != null && !pfRules.isEmpty()) { + return Purpose.PortForwarding; + } + } + + // we are here means, public IP has no active/revoked rules to know the purpose + return null; + } @Override public List getIsolatedNetworksOwnedByAccountInZone(long zoneId, Account owner) { @@ -2655,8 +2697,19 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag Network network = _networksDao.findById(rules.get(0).getNetworkId()); Purpose purpose = rules.get(0).getPurpose(); - // associate the IP with corresponding network service provider - applyProviderIpAssociations(network, purpose, continueOnError, rules); + // get the list of public ip's owned by the network + List userIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), null); + List publicIps = new ArrayList(); + if (userIps != null && !userIps.isEmpty()) { + for (IPAddressVO userIp : userIps) { + PublicIp publicIp = new PublicIp(userIp, _vlanDao.findById(userIp.getVlanId()), NetUtils.createSequenceBasedMacAddress(userIp.getMacAddress())); + publicIps.add(publicIp); + } + } + + // rules can not programmed unless IP is associated with network service provider, so run IP assoication for + // the network so as to ensure IP is associated before applying rules (in add state) + applyIpAssociations(network, false, continueOnError, publicIps); for (NetworkElement ne : _networkElements) { try { @@ -2697,6 +2750,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } + // if all the rules configured on public IP are revoked then dis-associate IP with network service provider + applyIpAssociations(network, true, continueOnError, publicIps); + return success; } @@ -3701,35 +3757,35 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Override public boolean applyStaticNats(List staticNats, boolean continueOnError) throws ResourceUnavailableException { - if (staticNats == null || staticNats.size() == 0) { + Network network = _networksDao.findById(staticNats.get(0).getNetworkId()); + boolean success = true; + + if (staticNats == null || staticNats.size() == 0) { s_logger.debug("There are no static nat rules for the network elements"); return true; } - List staticNatIps = new ArrayList(); - for (StaticNat rule : staticNats) { - IPAddressVO staticNatIP = _ipAddressDao.findById(rule.getSourceIpAddressId()); - PublicIp publicIp = new PublicIp(staticNatIP, _vlanDao.findById(staticNatIP.getVlanId()), NetUtils.createSequenceBasedMacAddress(staticNatIP.getMacAddress())); - staticNatIps.add(publicIp); + // get the list of public ip's owned by the network + List userIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), null); + List publicIps = new ArrayList(); + if (userIps != null && !userIps.isEmpty()) { + for (IPAddressVO userIp : userIps) { + PublicIp publicIp = new PublicIp(userIp, _vlanDao.findById(userIp.getVlanId()), NetUtils.createSequenceBasedMacAddress(userIp.getMacAddress())); + publicIps.add(publicIp); + } } - - boolean success = true; - boolean handled = false; - Network network = _networksDao.findById(staticNats.get(0).getNetworkId()); + + // static NAT rules can not programmed unless IP is associated with network service provider, so run IP association for + // the network so as to ensure IP is associated before applying rules (in add state) + applyIpAssociations(network, false, continueOnError, publicIps); + for (NetworkElement ne : _networkElements) { try { if (!(ne instanceof StaticNatServiceProvider)) { continue; } - // associate the IP's with StaticNatServiceProvider for the network - handled = ((StaticNatServiceProvider)ne).applyIps(network, staticNatIps); - if(!handled) { - s_logger.debug(ne.getName() +" did not assocate IP with source Nat service provider for the network " + network.getId() + "so skippg apply static nats"); - continue; - } - - handled = ((StaticNatServiceProvider)ne).applyStaticNats(network, staticNats); + boolean handled = ((StaticNatServiceProvider)ne).applyStaticNats(network, staticNats); s_logger.debug("Static Nat for network " + network.getId() + " were " + (handled ? "" : " not") + " handled by " + ne.getName()); } catch (ResourceUnavailableException e) { if (!continueOnError) { @@ -3740,6 +3796,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } } + // if all the rules configured on public IP are revoked then, dis-associate IP with network service provider + applyIpAssociations(network, true, continueOnError, publicIps); + return success; } @@ -4770,7 +4829,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } try { - if (!applyIpAssociations(network, true, publicIpsToRelease)) { + if (!applyIpAssociations(network, true, true, publicIpsToRelease)) { s_logger.warn("Unable to apply ip address associations for " + network + " as a part of shutdownNetworkRules"); success = false; } From df21338b08592bb7a2acac92809b2e7ee531ae98 Mon Sep 17 00:00:00 2001 From: Murali reddy Date: Fri, 23 Dec 2011 23:11:45 +0530 Subject: [PATCH 05/17] bug 12719:When restartNetwork() is called ,IpAssocCommand() is called for the public ipaddresses that are owned by Netscaler --- .../com/cloud/network/NetworkManagerImpl.java | 27 ++++++++++++++++--- .../VirtualNetworkApplianceManagerImpl.java | 5 ---- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 01796b1b1ea..e67c0f7a606 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -662,11 +662,32 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag for (NetworkElement element : _networkElements) { try { if (element instanceof FirewallServiceProvider && element instanceof LoadBalancingServiceProvider) { - List allIps = new ArrayList(); + List allIps = new ArrayList(); + NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId()); + + //get the Provider for the LB Service for the offering of the network + //FIXME - in post 3.0 we are going to support multiple providers for the same service per network offering + List providers = _ntwkOfferingSrvcDao.listProvidersForServiceForNetworkOffering(offering.getId(), Service.Lb); + String lbProvider = providers.get(0); + + //get the Provider for the LB Service for the offering of the network + //FIXME - in post 3.0 we are going to support multiple providers for the same service per network offering + providers = _ntwkOfferingSrvcDao.listProvidersForServiceForNetworkOffering(offering.getId(), Service.Firewall); + String fwProvider = providers.get(0); + + if (lbProvider.equalsIgnoreCase(element.getProvider().getName()) && fwProvider.equalsIgnoreCase(element.getProvider().getName())) { allIps.addAll(firewallPublicIps); allIps.addAll(loadbalncerPublicIps); - FirewallServiceProvider fwProvider = (FirewallServiceProvider)element; - fwProvider.applyIps(network, allIps); + } else if (fwProvider.equalsIgnoreCase(element.getProvider().getName())) { + allIps.addAll(firewallPublicIps); + } else if (lbProvider.equalsIgnoreCase(element.getProvider().getName())) { + allIps.addAll(loadbalncerPublicIps); + } else { + continue; + } + + FirewallServiceProvider fwElement = (FirewallServiceProvider)element; + fwElement.applyIps(network, allIps); } else if (element instanceof FirewallServiceProvider) { FirewallServiceProvider fwProvider = (FirewallServiceProvider)element; fwProvider.applyIps(network, firewallPublicIps); diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 225d8e43221..d384d2e0198 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -1758,11 +1758,6 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian if (!publicIps.isEmpty()) { - // Re-apply public ip addresses - should come before PF/LB/VPN - if (_networkMgr.isProviderSupportServiceInNetwork(router.getNetworkId(), Service.Firewall, provider)) { - createAssociateIPCommands(router, publicIps, cmds, 0); - } - List vpns = new ArrayList(); List pfRules = new ArrayList(); List staticNatFirewallRules = new ArrayList(); From 2004af88e72268932d5da1460d9bb32b26068de7 Mon Sep 17 00:00:00 2001 From: bfederle Date: Fri, 23 Dec 2011 12:57:16 -0500 Subject: [PATCH 06/17] Update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 784ca1b1ba3..7d89223ac65 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ deps/cloud.userlibraries .DS_Store .idea *.iml +*.swp From c2c0d091544889a361515bd86207edc00039a7a4 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 23 Dec 2011 10:44:11 -0800 Subject: [PATCH 07/17] bug 12744: cloudStack 3.0 new UI - VM Wizard - step 5 - fix data passed to args.response.success() --- ui/scripts/instances.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ui/scripts/instances.js b/ui/scripts/instances.js index 3bf0f01dc34..cc53d22849f 100644 --- a/ui/scripts/instances.js +++ b/ui/scripts/instances.js @@ -305,9 +305,10 @@ args.response.success({ type: 'select-security-group', data: { - defaultNetworks: [], - optionalNetworks: [], - securityGroups: securityGroupArray + myNetworks: [], //not used any more + sharedNetworks: [], + securityGroups: securityGroupArray, + networkOfferings: [] } }); } @@ -316,9 +317,10 @@ args.response.success({ type: 'nothing-to-select', data: { - defaultNetworks: [], - optionalNetworks: [], - securityGroups: [] + myNetworks: [], //not used any more + sharedNetworks: [], + securityGroups: [], + networkOfferings: [] } }); } From 678ea310d8eb0280f82be97d43ec02ed6b34c3ff Mon Sep 17 00:00:00 2001 From: bfederle Date: Fri, 23 Dec 2011 14:39:13 -0500 Subject: [PATCH 08/17] Fix error on login --Should be 'listSwifts' not 'listSwift' --- ui/scripts/cloudStack.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/scripts/cloudStack.js b/ui/scripts/cloudStack.js index 465485e2c3b..cee84e025a8 100644 --- a/ui/scripts/cloudStack.js +++ b/ui/scripts/cloudStack.js @@ -236,7 +236,7 @@ }); $.ajax({ - url: createURL("listSwift"), + url: createURL("listSwifts"), dataType: "json", async: false, success: function(json) { From 5346a61917f0ff4a4017aded6c6c89ea6d7c38f5 Mon Sep 17 00:00:00 2001 From: anthony Date: Fri, 23 Dec 2011 11:40:33 -0800 Subject: [PATCH 09/17] SWIFT : API refine --- .../com/cloud/api/commands/ListSwiftsCmd.java | 16 ++++++---------- .../cloud/storage/swift/SwiftManagerImpl.java | 15 ++++++++------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/api/src/com/cloud/api/commands/ListSwiftsCmd.java b/api/src/com/cloud/api/commands/ListSwiftsCmd.java index 42cde414e17..04edb1b318f 100644 --- a/api/src/com/cloud/api/commands/ListSwiftsCmd.java +++ b/api/src/com/cloud/api/commands/ListSwiftsCmd.java @@ -24,10 +24,9 @@ import java.util.List; import org.apache.log4j.Logger; import com.cloud.api.ApiConstants; -import com.cloud.api.BaseCmd; +import com.cloud.api.BaseListCmd; import com.cloud.api.Implementation; import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; import com.cloud.api.response.HostResponse; import com.cloud.api.response.ListResponse; import com.cloud.api.response.SwiftResponse; @@ -35,9 +34,9 @@ import com.cloud.storage.Swift; import com.cloud.user.Account; @Implementation(description = "List Swift.", responseObject = HostResponse.class) -public class ListSwiftsCmd extends BaseCmd { +public class ListSwiftsCmd extends BaseListCmd { public static final Logger s_logger = Logger.getLogger(ListSwiftsCmd.class.getName()); - private static final String s_name = "listswiftresponse"; + private static final String s_name = "listswiftsresponse"; ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// @@ -79,12 +78,9 @@ public class ListSwiftsCmd extends BaseCmd { swiftResponse.setObjectName("swift"); swiftResponses.add(swiftResponse); } - response.setResponses(swiftResponses); - response.setResponseName(getCommandName()); - this.setResponseObject(response); - - } else { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to add Swift"); } + response.setResponses(swiftResponses); + response.setResponseName(getCommandName()); + this.setResponseObject(response); } } diff --git a/server/src/com/cloud/storage/swift/SwiftManagerImpl.java b/server/src/com/cloud/storage/swift/SwiftManagerImpl.java index 5a4782fc42f..415dfb11e88 100644 --- a/server/src/com/cloud/storage/swift/SwiftManagerImpl.java +++ b/server/src/com/cloud/storage/swift/SwiftManagerImpl.java @@ -59,6 +59,8 @@ import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VMTemplateSwiftDao; import com.cloud.storage.dao.VMTemplateZoneDao; import com.cloud.utils.component.Inject; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.SearchCriteria2; import com.cloud.utils.db.SearchCriteriaService; @@ -267,14 +269,13 @@ public class SwiftManagerImpl implements SwiftManager { @Override public List listSwifts(ListSwiftsCmd cmd) { - if (cmd.getId() == null) { - return _swiftDao.listAll(); - } else { - List list = new ArrayList(); - SwiftVO swift = _swiftDao.findById(cmd.getId()); - list.add(swift); - return list; + Filter searchFilter = new Filter(SwiftVO.class, "id", Boolean.TRUE, cmd.getStartIndex(), cmd.getPageSizeVal()); + SearchCriteria sc = _swiftDao.createSearchCriteria(); + if (cmd.getId() != null) { + sc.addAnd("id", SearchCriteria.Op.EQ, cmd.getId()); } + return _swiftDao.search(sc, searchFilter); + } From bab60829eaff9684f5dc38d25cf77895e7080d9e Mon Sep 17 00:00:00 2001 From: bfederle Date: Fri, 23 Dec 2011 15:06:38 -0500 Subject: [PATCH 10/17] Add project resource management to new project wizard --- ui/css/cloudstack3.css | 32 +++- ui/scripts/ui-custom/projects.js | 287 ++++++++++++++++--------------- 2 files changed, 184 insertions(+), 135 deletions(-) diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css index 932692cb6a8..ecd22a23cf2 100644 --- a/ui/css/cloudstack3.css +++ b/ui/css/cloudstack3.css @@ -7121,6 +7121,22 @@ div.panel.ui-dialog div.list-view div.fixed-header { margin: -2px 0 -4px auto; } +#new-project-review-tabs-resouces { + background: #D2D2D2; +} + +.new-project .resources .ui-widget-content { + background: #FFFFFF; +} + +.new-project .resources .field { + height: 39px; + padding: 0; +} + +.new-project .resources .field input { +} + .new-project .field span.value { color: #475765; /*+placement:shift 21px 20px;*/ @@ -7140,6 +7156,12 @@ div.panel.ui-dialog div.list-view div.fixed-header { padding: 20px 24px 0 0; } +.new-project .resources .field label { + font-size: 14px; + height: auto; + padding: 10px 14px 14px 40px; +} + .new-project .field label.error { color: #FF0000; font-size: 9px; @@ -7167,12 +7189,16 @@ div.panel.ui-dialog div.list-view div.fixed-header { -o-box-shadow: inset 0px 1px 0px #A1A1A1; box-shadow: inset 0px 1px 0px #A1A1A1; width: 506px; - height: 21px; + height: 20px; margin: 17px 25px 0 0; float: right; border: 1px solid #C7C7C7; } +.new-project .resources .field input[type=text] { + margin: 6px 9px 0 0; +} + .new-project .button.cancel { color: #808080; background: none; @@ -7377,6 +7403,10 @@ div.panel.ui-dialog div.list-view div.fixed-header { background-position: -3px -369px; } +.new-project .resources input[type=submit] { + display: none; +} + .new-project .multi-edit { width: 671px; } diff --git a/ui/scripts/ui-custom/projects.js b/ui/scripts/ui-custom/projects.js index 3905a547ce6..822d510edeb 100644 --- a/ui/scripts/ui-custom/projects.js +++ b/ui/scripts/ui-custom/projects.js @@ -13,75 +13,150 @@ })); }, + dashboardTabs: { + overview: function() { + var $dashboard = $('#template').find('.project-dashboard-view').clone(); + $dashboard.data('tab-title', 'Dashboard'); + + var getData = function() { + // Populate data + $dashboard.find('[data-item]').hide(); + var $loading = $('
').addClass('loading-overlay').prependTo($dashboard); + cloudStack.projects.dashboard({ + response: { + success: function(args) { + $loading.remove(); + var data = args.data; + + // Iterate over data; populate corresponding DOM elements + $.each(data, function(key, value) { + var $elem = $dashboard.find('[data-item=' + key + ']'); + + // This assumes an array of data + if ($elem.is('ul')) { + $elem.show(); + var $liTmpl = $elem.find('li').remove(); + $(value).each(function() { + var item = this; + var $li = $liTmpl.clone().appendTo($elem).hide(); + + $.each(item, function(arrayKey, arrayValue) { + var $arrayElem = $li.find('[data-list-item=' + arrayKey + ']'); + + $arrayElem.html(arrayValue); + }); + + $li.attr({ title: item.description }); + + $li.fadeIn(); + }); + } else { + $elem.each(function() { + var $item = $(this); + if ($item.hasClass('chart-line')) { + $item.show().animate({ width: value + '%' }); + } else { + $item.hide().html(value).fadeIn(); + } + }); + } + }); + } + } + }); + }; + + getData(); + + $dashboard.find('.button.manage-resources').click(function() { + $('.navigation-item.network').click(); + }); + + $dashboard.find('.info-box.events .button').click(function() { + $('.navigation-item.events').click(); + }); + + return $dashboard; + }, + + users: function() { + return $('
').addClass('management').data('tab-title', 'Users'); + }, + + invitations: function() { + return $('
').addClass('management-invite').data('tab-title', 'Invitations'); + }, + + resources: function() { + var $resources = $('
').addClass('resources').data('tab-title', 'Resources'); + var $form = $('
'); + var $submit = $('').attr({ + type: 'submit' + }).val('Apply'); + + cloudStack.projects.resourceManagement.dataProvider({ + response: { + success: function(args) { + $(args.data).each(function() { + var resource = this; + var $field = $('
').addClass('field'); + var $label = $('