You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mu...@apache.org on 2014/03/14 11:37:14 UTC

[01/54] [abbrv] Merge branch 'master' into rbac.

Repository: cloudstack
Updated Branches:
  refs/heads/distributedrouter a8d43ba4b -> 42b553e30 (forced update)


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/as/AutoScaleManagerImpl.java
index c8cc5b3,208b4a4..e07e502
--- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
+++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
@@@ -447,9 -454,9 +456,10 @@@ public class AutoScaleManagerImpl<Type
          String otherDeployParams = cmd.getOtherDeployParams();
          Long serviceOffId = cmd.getServiceOfferingId();
          Long zoneId = cmd.getZoneId();
+         Boolean display = cmd.getDisplay();
  
 -        SearchWrapper<AutoScaleVmProfileVO> searchWrapper = new SearchWrapper<AutoScaleVmProfileVO>(_autoScaleVmProfileDao, AutoScaleVmProfileVO.class, cmd, cmd.getId());
 +        SearchWrapper<AutoScaleVmProfileVO> searchWrapper = new SearchWrapper<AutoScaleVmProfileVO>(_autoScaleVmProfileDao, AutoScaleVmProfileVO.class, cmd, cmd.getId(),
 +                "listAutoScaleVmProfiles");
          SearchBuilder<AutoScaleVmProfileVO> sb = searchWrapper.getSearchBuilder();
  
          sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
@@@ -859,9 -870,9 +879,10 @@@
          Long loadBalancerId = cmd.getLoadBalancerId();
          Long profileId = cmd.getProfileId();
          Long zoneId = cmd.getZoneId();
+         Boolean forDisplay = cmd.getDisplay();
  
 -        SearchWrapper<AutoScaleVmGroupVO> searchWrapper = new SearchWrapper<AutoScaleVmGroupVO>(_autoScaleVmGroupDao, AutoScaleVmGroupVO.class, cmd, cmd.getId());
 +        SearchWrapper<AutoScaleVmGroupVO> searchWrapper = new SearchWrapper<AutoScaleVmGroupVO>(_autoScaleVmGroupDao, AutoScaleVmGroupVO.class, cmd, cmd.getId(),
 +                "listAutoScaleVmGroups");
          SearchBuilder<AutoScaleVmGroupVO> sb = searchWrapper.getSearchBuilder();
  
          sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/firewall/FirewallManagerImpl.java
index b5374e7d,ca474d6..c312d3d
--- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
+++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
@@@ -232,19 -233,22 +233,22 @@@ public class FirewallManagerImpl extend
                  FirewallRuleVO newRule =
                      new FirewallRuleVO(xId, ipAddrId, portStart, portEnd, protocol.toLowerCase(), networkId, accountIdFinal, domainIdFinal, Purpose.Firewall,
                          sourceCidrList, icmpCode, icmpType, relatedRuleId, trafficType);
 -                newRule.setType(type);
 +        newRule.setType(type);
+                 if (forDisplay != null) {
+                     newRule.setDisplay(forDisplay);
+                 }
 -                newRule = _firewallDao.persist(newRule);
 +        newRule = _firewallDao.persist(newRule);
  
 -                if (type == FirewallRuleType.User)
 -                    detectRulesConflict(newRule);
 +        if (type == FirewallRuleType.User)
 +            detectRulesConflict(newRule);
  
 -                if (!_firewallDao.setStateToAdd(newRule)) {
 -                    throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
 -                }
 -                CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
 +        if (!_firewallDao.setStateToAdd(newRule)) {
 +            throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
 +        }
 +        CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
  
 -                return newRule;
 -            }
 +        return newRule;
 +    }
          });
      }
  
@@@ -255,11 -259,10 +259,12 @@@
          Long networkId = cmd.getNetworkId();
          Map<String, String> tags = cmd.getTags();
          FirewallRule.TrafficType trafficType = cmd.getTrafficType();
+         Boolean display = cmd.getDisplay();
  
          Account caller = CallContext.current().getCallingAccount();
 +        List<Long> permittedDomains = new ArrayList<Long>();
          List<Long> permittedAccounts = new ArrayList<Long>();
 +        List<Long> permittedResources = new ArrayList<Long>();
  
          if (ipId != null) {
              IPAddressVO ipAddressVO = _ipAddressDao.findById(ipId);
@@@ -280,9 -285,10 +285,10 @@@
  
          sb.and("id", sb.entity().getId(), Op.EQ);
          sb.and("trafficType", sb.entity().getTrafficType(), Op.EQ);
 -        sb.and("networkId", sb.entity().getNetworkId(), Op.EQ);
 +            sb.and("networkId", sb.entity().getNetworkId(), Op.EQ);
          sb.and("ip", sb.entity().getSourceIpAddressId(), Op.EQ);
          sb.and("purpose", sb.entity().getPurpose(), Op.EQ);
+         sb.and("display", sb.entity().isDisplay(), Op.EQ);
  
          if (tags != null && !tags.isEmpty()) {
              SearchBuilder<ResourceTagVO> tagSearch = _resourceTagDao.createSearchBuilder();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
index e08b76c,6f0c1e9..9f280ef
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@@ -1498,8 -1497,9 +1497,9 @@@ public class LoadBalancingRulesManagerI
      @DB
      @Override
      public LoadBalancer createPublicLoadBalancer(final String xId, final String name, final String description, final int srcPort, final int destPort,
-         final long sourceIpId, final String protocol, final String algorithm, final boolean openFirewall, final CallContext caller, final String lbProtocol)
+  final long sourceIpId,
+             final String protocol, final String algorithm, final boolean openFirewall, final CallContext caller, final String lbProtocol, final Boolean forDisplay)
 -        throws NetworkRuleConflictException {
 +            throws NetworkRuleConflictException {
  
          if (!NetUtils.isValidPort(destPort)) {
              throw new InvalidParameterValueException("privatePort is an invalid value: " + destPort);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/network/rules/RulesManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/rules/RulesManagerImpl.java
index 4a75d40,ad977a2..9a76219
--- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@@ -201,8 -201,8 +201,8 @@@ public class RulesManagerImpl extends M
      @Override
      @DB
      @ActionEvent(eventType = EventTypes.EVENT_NET_RULE_ADD, eventDescription = "creating forwarding rule", create = true)
-     public PortForwardingRule createPortForwardingRule(final PortForwardingRule rule, final Long vmId, Ip vmIp, final boolean openFirewall)
+     public PortForwardingRule createPortForwardingRule(final PortForwardingRule rule, final Long vmId, Ip vmIp, final boolean openFirewall, final Boolean forDisplay)
 -        throws NetworkRuleConflictException {
 +            throws NetworkRuleConflictException {
          CallContext ctx = CallContext.current();
          final Account caller = ctx.getCallingAccount();
  
@@@ -775,11 -779,10 +779,12 @@@
          Long id = cmd.getId();
          Map<String, String> tags = cmd.getTags();
          Long networkId = cmd.getNetworkId();
+         Boolean display = cmd.getDisplay();
  
          Account caller = CallContext.current().getCallingAccount();
 +        List<Long> permittedDomains = new ArrayList<Long>();
          List<Long> permittedAccounts = new ArrayList<Long>();
 +        List<Long> permittedResources = new ArrayList<Long>();
  
          if (ipId != null) {
              IPAddressVO ipAddressVO = _ipAddressDao.findById(ipId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/network/vpc/NetworkACLServiceImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 39fb19e,403b95e..08381e2
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@@ -658,13 -658,16 +658,16 @@@ public class VpcManagerImpl extends Man
              @Override
              public VpcVO doInTransaction(TransactionStatus status) {
                  VpcVO vpc = new VpcVO(zoneId, vpcName, displayText, vpcOwner.getId(), vpcOwner.getDomainId(), vpcOffId, cidr, networkDomain);
+                 if (displayVpc != null) {
+                     vpc.setDisplay(displayVpc);
+                 }
 -                vpc = _vpcDao.persist(vpc, finalizeServicesAndProvidersForVpc(zoneId, vpcOffId));
 -                _resourceLimitMgr.incrementResourceCount(vpcOwner.getId(), ResourceType.vpc);
 +        vpc = _vpcDao.persist(vpc, finalizeServicesAndProvidersForVpc(zoneId, vpcOffId));
 +        _resourceLimitMgr.incrementResourceCount(vpcOwner.getId(), ResourceType.vpc);
  
 -                s_logger.debug("Created VPC " + vpc);
 +        s_logger.debug("Created VPC " + vpc);
  
 -                return vpc;
 -            }
 +        return vpc;
 +    }
          });
      }
  
@@@ -806,16 -813,14 +813,16 @@@
      @Override
      public List<? extends Vpc> listVpcs(Long id, String vpcName, String displayText, List<String> supportedServicesStr, String cidr, Long vpcOffId, String state,
          String accountName, Long domainId, String keyword, Long startIndex, Long pageSizeVal, Long zoneId, Boolean isRecursive, Boolean listAll, Boolean restartRequired,
-         Map<String, String> tags, Long projectId) {
+         Map<String, String> tags, Long projectId, Boolean display) {
          Account caller = CallContext.current().getCallingAccount();
 +        List<Long> permittedDomains = new ArrayList<Long>();
          List<Long> permittedAccounts = new ArrayList<Long>();
 +        List<Long> permittedResources = new ArrayList<Long>();
  
 -        Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject =
 -            new Ternary<Long, Boolean, ListProjectResourcesCriteria>(domainId, isRecursive, null);
 -        _accountMgr.buildACLSearchParameters(caller, id, accountName, projectId, permittedAccounts, domainIdRecursiveListProject, listAll, false);
 -        domainId = domainIdRecursiveListProject.first();
 +        Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<Long, Boolean,
 +                ListProjectResourcesCriteria>(domainId, isRecursive, null);
 +        _accountMgr.buildACLSearchParameters(caller, id, accountName, projectId, permittedDomains, permittedAccounts, permittedResources, domainIdRecursiveListProject, listAll,
 +                false, "listVPCs");
          isRecursive = domainIdRecursiveListProject.second();
          ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third();
          Filter searchFilter = new Filter(VpcVO.class, "created", false, startIndex, pageSizeVal);
@@@ -871,8 -877,12 +879,12 @@@
                  sc.setJoinParameters("tagSearch", "value" + String.valueOf(count), tags.get(key));
                  count++;
              }
 -        }
 +       }
  
+         if (display != null) {
+             sc.setParameters("display", display);
+         }
+ 
          if (id != null) {
              sc.addAnd("id", SearchCriteria.Op.EQ, id);
          }
@@@ -1401,37 -1411,38 +1413,38 @@@
                          s_logger.info("found and using existing network for vpc " + vpc + ": " + broadcastUri);
                          DataCenterVO dc = _dcDao.lockRow(physNetFinal.getDataCenterId(), true);
  
 -                        //add entry to private_ip_address table
 -                        PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkId(privateNtwk.getId(), ipAddress);
 -                        if (privateIp != null) {
 +            //add entry to private_ip_address table
 +            PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkId(privateNtwk.getId(), ipAddress);
 +            if (privateIp != null) {
                              throw new InvalidParameterValueException("Private ip address " + ipAddress + " already used for private gateway" + " in zone " +
                                  _entityMgr.findById(DataCenter.class, dcId).getName());
 -                        }
 +            }
  
 -                        Long mac = dc.getMacAddress();
 -                        Long nextMac = mac + 1;
 -                        dc.setMacAddress(nextMac);
 +            Long mac = dc.getMacAddress();
 +            Long nextMac = mac + 1;
 +            dc.setMacAddress(nextMac);
  
-             privateIp = new PrivateIpVO(ipAddress, privateNtwk.getId(), nextMac, vpcId, true);
+                         s_logger.info("creating private ip adress for vpc (" + ipAddress + ", " + privateNtwk.getId() + ", " + nextMac + ", " + vpcId + ", " + isSourceNat + ")");
+                         privateIp = new PrivateIpVO(ipAddress, privateNtwk.getId(), nextMac, vpcId, isSourceNat);
 -                        _privateIpDao.persist(privateIp);
 +            _privateIpDao.persist(privateIp);
  
 -                        _dcDao.update(dc.getId(), dc);
 -                    }
 +            _dcDao.update(dc.getId(), dc);
 +        }
  
 -                    long networkAclId = NetworkACL.DEFAULT_DENY;
 -                    if (aclId != null) {
 -                        NetworkACLVO aclVO = _networkAclDao.findById(aclId);
 +        long networkAclId = NetworkACL.DEFAULT_DENY;
 +        if (aclId != null) {
 +            NetworkACLVO aclVO = _networkAclDao.findById(aclId);
                          if (aclVO == null) {
 -                            throw new InvalidParameterValueException("Invalid network acl id passed ");
 -                        }
 -                        if ((aclVO.getVpcId() != vpcId) && !(aclId == NetworkACL.DEFAULT_DENY || aclId == NetworkACL.DEFAULT_ALLOW)) {
 -                            throw new InvalidParameterValueException("Private gateway and network acl are not in the same vpc");
 -                        }
 +                throw new InvalidParameterValueException("Invalid network acl id passed ");
 +            }
 +            if ((aclVO.getVpcId() != vpcId) && !(aclId == NetworkACL.DEFAULT_DENY || aclId == NetworkACL.DEFAULT_ALLOW)) {
 +                throw new InvalidParameterValueException("Private gateway and network acl are not in the same vpc");
 +            }
  
 -                        networkAclId = aclId;
 -                    }
 +            networkAclId = aclId;
 +        }
  
 -                    //2) create gateway entry
 +        //2) create gateway entry
                      VpcGatewayVO gatewayVO =
                          new VpcGatewayVO(ipAddress, VpcGateway.Type.Private, vpcId, privateNtwk.getDataCenterId(), privateNtwk.getId(), broadcastUri, gateway, netmask,
                              vpc.getAccountId(), vpc.getDomainId(), isSourceNat, networkAclId);
@@@ -2022,14 -2028,15 +2035,15 @@@
          Transaction.execute(new TransactionCallbackNoReturn() {
              @Override
              public void doInTransactionWithoutResult(TransactionStatus status) {
 -                IPAddressVO ip = _ipAddressDao.findById(ipId);
 -                //update ip address with networkId
 -                ip.setVpcId(vpcId);
 +        IPAddressVO ip = _ipAddressDao.findById(ipId);
 +        //update ip address with networkId
 +        ip.setVpcId(vpcId);
                  ip.setSourceNat(isSourceNatFinal);
+ 
 -                _ipAddressDao.update(ipId, ip);
 +        _ipAddressDao.update(ipId, ip);
  
 -                //mark ip as allocated
 -                _ipAddrMgr.markPublicIpAsAllocated(ip);
 +        //mark ip as allocated
 +        _ipAddrMgr.markPublicIpAsAllocated(ip);
              }
          });
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
index a8505a7,0306fad..531adad
--- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
+++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
@@@ -650,9 -649,10 +654,10 @@@ public class RemoteAccessVpnManagerImp
          sb.and("id", sb.entity().getId(), Op.EQ);
          sb.and("networkId", sb.entity().getNetworkId(), Op.EQ);
          sb.and("state", sb.entity().getState(), Op.EQ);
+         sb.and("display", sb.entity().isDisplay(), Op.EQ);
  
          SearchCriteria<RemoteAccessVpnVO> sc = sb.create();
 -        _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
 +        _accountMgr.buildACLSearchCriteria(sc, isRecursive, permittedDomains, permittedAccounts, permittedResources, listProjectResourcesCriteria);
  
          sc.setParameters("state", RemoteAccessVpn.State.Running);
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java
index 03a13c3,66a2b58..fdb5bbf
--- a/server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java
+++ b/server/src/com/cloud/network/vpn/Site2SiteVpnManagerImpl.java
@@@ -632,9 -636,10 +642,10 @@@ public class Site2SiteVpnManagerImpl ex
  
          sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
          sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ);
+         sb.and("display", sb.entity().isDisplay(), SearchCriteria.Op.EQ);
  
          SearchCriteria<Site2SiteVpnGatewayVO> sc = sb.create();
 -        _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
 +        _accountMgr.buildACLSearchCriteria(sc, isRecursive, permittedDomains, permittedAccounts, permittedResources, listProjectResourcesCriteria);
  
          if (id != null) {
              sc.addAnd("id", SearchCriteria.Op.EQ, id);
@@@ -675,9 -682,10 +691,10 @@@
          Filter searchFilter = new Filter(Site2SiteVpnConnectionVO.class, "id", false, startIndex, pageSizeVal);
  
          SearchBuilder<Site2SiteVpnConnectionVO> sb = _vpnConnectionDao.createSearchBuilder();
 -        _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
 +        _accountMgr.buildACLSearchBuilder(sb, isRecursive, permittedDomains, permittedAccounts, permittedResources, listProjectResourcesCriteria);
  
          sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
+         sb.and("display", sb.entity().isDisplay(), SearchCriteria.Op.EQ);
  
          if (vpcId != null) {
              SearchBuilder<Site2SiteVpnGatewayVO> gwSearch = _vpnGatewayDao.createSearchBuilder();
@@@ -686,8 -694,11 +703,11 @@@
          }
  
          SearchCriteria<Site2SiteVpnConnectionVO> sc = sb.create();
 -        _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
 +        _accountMgr.buildACLSearchCriteria(sc, isRecursive, permittedDomains, permittedAccounts, permittedResources, listProjectResourcesCriteria);
  
+         if (display != null) {
+             sc.setParameters("display", display);
+         }
          if (id != null) {
              sc.addAnd("id", SearchCriteria.Op.EQ, id);
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/resource/ResourceManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/VolumeApiServiceImpl.java
index ad8a4ba,50aa87e..3ef8e13
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@@ -563,43 -564,43 +564,43 @@@ public class VolumeApiServiceImpl exten
          return Transaction.execute(new TransactionCallback<VolumeVO>() {
              @Override
              public VolumeVO doInTransaction(TransactionStatus status) {
 -                VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
 -                volume.setPoolId(null);
 +        VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
 +        volume.setPoolId(null);
                  volume.setUuid(uuid);
 -                volume.setDataCenterId(zoneId);
 -                volume.setPodId(null);
 -                volume.setAccountId(ownerId);
 -                volume.setDomainId(((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId()));
 -                volume.setDiskOfferingId(diskOfferingId);
 -                volume.setSize(size);
 -                volume.setMinIops(minIops);
 -                volume.setMaxIops(maxIops);
 -                volume.setInstanceId(null);
 -                volume.setUpdated(new Date());
 -                volume.setDomainId((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId());
 +        volume.setDataCenterId(zoneId);
 +        volume.setPodId(null);
 +        volume.setAccountId(ownerId);
 +        volume.setDomainId(((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId()));
 +        volume.setDiskOfferingId(diskOfferingId);
 +        volume.setSize(size);
 +        volume.setMinIops(minIops);
 +        volume.setMaxIops(maxIops);
 +        volume.setInstanceId(null);
 +        volume.setUpdated(new Date());
 +        volume.setDomainId((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId());
-         volume.setDisplayVolume(displayVolumeEnabled);
+                 volume.setDisplayVolume(displayVolume);
 -                if (parentVolume != null) {
 -                    volume.setTemplateId(parentVolume.getTemplateId());
 -                    volume.setFormat(parentVolume.getFormat());
 -                } else {
 -                    volume.setTemplateId(null);
 -                }
 +        if (parentVolume != null) {
 +            volume.setTemplateId(parentVolume.getTemplateId());
 +            volume.setFormat(parentVolume.getFormat());
 +        } else {
 +            volume.setTemplateId(null);
 +        }
  
 -                volume = _volsDao.persist(volume);
 -                if (cmd.getSnapshotId() == null) {
 -                    // for volume created from snapshot, create usage event after volume creation
 +        volume = _volsDao.persist(volume);
 +        if (cmd.getSnapshotId() == null) {
 +            // for volume created from snapshot, create usage event after volume creation
                      UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
                              diskOfferingId, null, size, Volume.class.getName(), volume.getUuid());
 -                }
 +        }
  
 -                CallContext.current().setEventDetails("Volume Id: " + volume.getId());
 +        CallContext.current().setEventDetails("Volume Id: " + volume.getId());
  
 -                // Increment resource count during allocation; if actual creation fails,
 -                // decrement it
 +        // Increment resource count during allocation; if actual creation fails,
 +        // decrement it
-                 _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume, displayVolumeEnabled);
-                 _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, displayVolumeEnabled, new Long(volume.getSize()));
+                 _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume, displayVolume);
+                 _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, displayVolume, new Long(volume.getSize()));
 -                return volume;
 -            }
 +        return volume;
 +    }
          });
      }
  
@@@ -2124,30 -2138,34 +2138,34 @@@
              public Object[] doInTransaction(TransactionStatus status) {
                  VmWorkJobVO workJob = null;
  
-                 _vmInstanceDao.lockRow(vm.getId(), true);
+                 _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+                 try {
 -                    workJob = new VmWorkJobVO(context.getContextId());
 +                workJob = new VmWorkJobVO(context.getContextId());
  
 -                    workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 -                    workJob.setCmd(VmWorkAttachVolume.class.getName());
 +                workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 +                workJob.setCmd(VmWorkAttachVolume.class.getName());
  
 -                    workJob.setAccountId(callingAccount.getId());
 -                    workJob.setUserId(callingUser.getId());
 -                    workJob.setStep(VmWorkJobVO.Step.Starting);
 -                    workJob.setVmType(VirtualMachine.Type.Instance);
 -                    workJob.setVmInstanceId(vm.getId());
 +                workJob.setAccountId(callingAccount.getId());
 +                workJob.setUserId(callingUser.getId());
 +                workJob.setStep(VmWorkJobVO.Step.Starting);
 +                workJob.setVmType(VirtualMachine.Type.Instance);
 +                workJob.setVmInstanceId(vm.getId());
-                 workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+                     workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
  
 -                    // save work context info (there are some duplications)
 +                // save work context info (there are some duplications)
-                 VmWorkAttachVolume workInfo = new VmWorkAttachVolume(callingUser.getId(), callingAccount.getId(), vm.getId(), VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId,
-                         deviceId);
+                     VmWorkAttachVolume workInfo = new VmWorkAttachVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
+                             VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, deviceId);
 -                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 +                workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
  
 -                    _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 +                _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
  
 -                    AsyncJobVO jobVo = _jobMgr.getAsyncJob(workJob.getId());
 -                    s_logger.debug("New job " + workJob.getId() + ", result field: " + jobVo.getResult());
 +                AsyncJobVO jobVo = _jobMgr.getAsyncJob(workJob.getId());
 +                s_logger.debug("New job " + workJob.getId() + ", result field: " + jobVo.getResult());
  
 -                    return new Object[] {workJob, new Long(workJob.getId())};
 +                return new Object[] {workJob, new Long(workJob.getId())};
+                 } finally {
+                     _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+                 }
              }
          });
  
@@@ -2171,26 -2189,31 +2189,31 @@@
              public Object[] doInTransaction(TransactionStatus status) {
                  VmWorkJobVO workJob = null;
  
-                 _vmInstanceDao.lockRow(vm.getId(), true);
+                 _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+                 try {
 -                    workJob = new VmWorkJobVO(context.getContextId());
 +                workJob = new VmWorkJobVO(context.getContextId());
  
 -                    workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 -                    workJob.setCmd(VmWorkDetachVolume.class.getName());
 +                workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 +                workJob.setCmd(VmWorkDetachVolume.class.getName());
  
 -                    workJob.setAccountId(callingAccount.getId());
 -                    workJob.setUserId(callingUser.getId());
 -                    workJob.setStep(VmWorkJobVO.Step.Starting);
 -                    workJob.setVmType(VirtualMachine.Type.Instance);
 -                    workJob.setVmInstanceId(vm.getId());
 +                workJob.setAccountId(callingAccount.getId());
 +                workJob.setUserId(callingUser.getId());
 +                workJob.setStep(VmWorkJobVO.Step.Starting);
 +                workJob.setVmType(VirtualMachine.Type.Instance);
 +                workJob.setVmInstanceId(vm.getId());
-                 workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+                     workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
  
 -                    // save work context info (there are some duplications)
 +                // save work context info (there are some duplications)
-                 VmWorkDetachVolume workInfo = new VmWorkDetachVolume(callingUser.getId(), callingAccount.getId(), vm.getId(), VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId);
+                     VmWorkDetachVolume workInfo = new VmWorkDetachVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
+                             VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId);
 -                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 +                workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
  
 -                    _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 +                _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
  
 -                    return new Object[] {workJob, new Long(workJob.getId())};
 +                return new Object[] {workJob, new Long(workJob.getId())};
+                 } finally {
+                     _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+                 }
              }
          });
  
@@@ -2215,27 -2238,32 +2238,32 @@@
              public Object[] doInTransaction(TransactionStatus status) {
                  VmWorkJobVO workJob = null;
  
-                 _vmInstanceDao.lockRow(vm.getId(), true);
+                 _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ 
+                 try {
 -                    workJob = new VmWorkJobVO(context.getContextId());
 +                workJob = new VmWorkJobVO(context.getContextId());
  
 -                    workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 -                    workJob.setCmd(VmWorkResizeVolume.class.getName());
 +                workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 +                workJob.setCmd(VmWorkResizeVolume.class.getName());
  
 -                    workJob.setAccountId(callingAccount.getId());
 -                    workJob.setUserId(callingUser.getId());
 -                    workJob.setStep(VmWorkJobVO.Step.Starting);
 -                    workJob.setVmType(VirtualMachine.Type.Instance);
 -                    workJob.setVmInstanceId(vm.getId());
 +                workJob.setAccountId(callingAccount.getId());
 +                workJob.setUserId(callingUser.getId());
 +                workJob.setStep(VmWorkJobVO.Step.Starting);
 +                workJob.setVmType(VirtualMachine.Type.Instance);
 +                workJob.setVmInstanceId(vm.getId());
-                 workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+                     workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
  
 -                    // save work context info (there are some duplications)
 -                    VmWorkResizeVolume workInfo = new VmWorkResizeVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
 -                            VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, currentSize, newSize, newServiceOfferingId, shrinkOk);
 -                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 +                // save work context info (there are some duplications)
 +                VmWorkResizeVolume workInfo = new VmWorkResizeVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
 +                        VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, currentSize, newSize, newServiceOfferingId, shrinkOk);
 +                workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
  
 -                    _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 +                _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
  
 -                    return new Object[] {workJob, new Long(workJob.getId())};
 +                return new Object[] {workJob, new Long(workJob.getId())};
+                 } finally {
+                     _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+                 }
              }
          });
  
@@@ -2260,27 -2288,31 +2288,31 @@@
              public Object[] doInTransaction(TransactionStatus status) {
                  VmWorkJobVO workJob = null;
  
-                 _vmInstanceDao.lockRow(vm.getId(), true);
+                 _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+                 try {
 -                    workJob = new VmWorkJobVO(context.getContextId());
 +                workJob = new VmWorkJobVO(context.getContextId());
  
 -                    workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 -                    workJob.setCmd(VmWorkMigrateVolume.class.getName());
 +                workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 +                workJob.setCmd(VmWorkMigrateVolume.class.getName());
  
 -                    workJob.setAccountId(callingAccount.getId());
 -                    workJob.setUserId(callingUser.getId());
 -                    workJob.setStep(VmWorkJobVO.Step.Starting);
 -                    workJob.setVmType(VirtualMachine.Type.Instance);
 -                    workJob.setVmInstanceId(vm.getId());
 +                workJob.setAccountId(callingAccount.getId());
 +                workJob.setUserId(callingUser.getId());
 +                workJob.setStep(VmWorkJobVO.Step.Starting);
 +                workJob.setVmType(VirtualMachine.Type.Instance);
 +                workJob.setVmInstanceId(vm.getId());
-                 workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+                     workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
  
 -                    // save work context info (there are some duplications)
 -                    VmWorkMigrateVolume workInfo = new VmWorkMigrateVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
 -                            VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, destPoolId, liveMigrate);
 -                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 +                // save work context info (there are some duplications)
 +                VmWorkMigrateVolume workInfo = new VmWorkMigrateVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
 +                        VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, destPoolId, liveMigrate);
 +                workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
  
 -                    _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 +                _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
  
 -                    return new Object[] {workJob, new Long(workJob.getId())};
 +                return new Object[] {workJob, new Long(workJob.getId())};
+                 } finally {
+                     _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+                 }
              }
          });
  
@@@ -2305,28 -2337,32 +2337,32 @@@
              public Object[] doInTransaction(TransactionStatus status) {
                  VmWorkJobVO workJob = null;
  
-                 _vmInstanceDao.lockRow(vm.getId(), true);
+                 _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+                 try {
 -                    workJob = new VmWorkJobVO(context.getContextId());
 +                workJob = new VmWorkJobVO(context.getContextId());
  
 -                    workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 -                    workJob.setCmd(VmWorkTakeVolumeSnapshot.class.getName());
 +                workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 +                workJob.setCmd(VmWorkTakeVolumeSnapshot.class.getName());
  
 -                    workJob.setAccountId(callingAccount.getId());
 -                    workJob.setUserId(callingUser.getId());
 -                    workJob.setStep(VmWorkJobVO.Step.Starting);
 -                    workJob.setVmType(VirtualMachine.Type.Instance);
 -                    workJob.setVmInstanceId(vm.getId());
 +                workJob.setAccountId(callingAccount.getId());
 +                workJob.setUserId(callingUser.getId());
 +                workJob.setStep(VmWorkJobVO.Step.Starting);
 +                workJob.setVmType(VirtualMachine.Type.Instance);
 +                workJob.setVmInstanceId(vm.getId());
-                 workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+                     workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
  
 -                    // save work context info (there are some duplications)
 -                    VmWorkTakeVolumeSnapshot workInfo = new VmWorkTakeVolumeSnapshot(
 -                            callingUser.getId(), accountId != null ? accountId : callingAccount.getId(), vm.getId(),
 -                            VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, policyId, snapshotId, quiesceVm);
 -                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 +                // save work context info (there are some duplications)
 +                VmWorkTakeVolumeSnapshot workInfo = new VmWorkTakeVolumeSnapshot(
 +                        callingUser.getId(), accountId != null ? accountId : callingAccount.getId(), vm.getId(),
 +                        VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, policyId, snapshotId, quiesceVm);
 +                workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
  
 -                    _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 +                _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
  
 -                    return new Object[] {workJob, new Long(workJob.getId())};
 +                return new Object[] {workJob, new Long(workJob.getId())};
+                 } finally {
+                     _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+                 }
              }
          });
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/template/HypervisorTemplateAdapter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/template/TemplateManagerImpl.java
index f27fb74,7466670..34123cd
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@@ -1744,17 -1753,12 +1778,12 @@@ public class TemplateManagerImpl extend
              throw ex;
          }
  
-         // Don't allow to modify system template
-         if (id == Long.valueOf(1)) {
-             InvalidParameterValueException ex = new InvalidParameterValueException("Unable to update template/iso of specified id");
-             ex.addProxyObject(String.valueOf(id), "templateId");
-             throw ex;
-         }
+         verifyTemplateId(id);
  
          // do a permission check
 -        _accountMgr.checkAccess(account, AccessType.ModifyEntry, true, template);
 +        _accountMgr.checkAccess(account, AccessType.OperateEntry, true, template);
          if (cmd.isRoutingType() != null) {
 -            if (!_accountService.isRootAdmin(account.getType())) {
 +            if (!_accountService.isRootAdmin(account.getId())) {
                  throw new PermissionDeniedException("Parameter isrouting can only be specified by a Root Admin, permission denied");
              }
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/vm/UserVmManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/vm/UserVmManagerImpl.java
index 2957bac,9874dc3..ca734c2
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@@ -34,6 -35,6 +35,9 @@@ import javax.ejb.Local
  import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
++import org.apache.commons.codec.binary.Base64;
++import org.apache.log4j.Logger;
++
  import org.apache.cloudstack.acl.ControlledEntity.ACLType;
  import org.apache.cloudstack.acl.SecurityChecker.AccessType;
  import org.apache.cloudstack.affinity.AffinityGroupService;
@@@ -79,9 -79,8 +82,6 @@@ import org.apache.cloudstack.framework.
  import org.apache.cloudstack.managed.context.ManagedContextRunnable;
  import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
  import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
- import org.apache.cloudstack.storage.to.TemplateObjectTO;
--import org.apache.commons.codec.binary.Base64;
--import org.apache.log4j.Logger;
  
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.api.Answer;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
index e9d10b8,9d7a952..37cdf86
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@@ -865,27 -863,31 +865,31 @@@ public class VMSnapshotManagerImpl exte
              public Object[] doInTransaction(TransactionStatus status) {
                  VmWorkJobVO workJob = null;
  
-                 _vmInstanceDao.lockRow(vm.getId(), true);
+                 _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+                 try {
 -                    workJob = new VmWorkJobVO(context.getContextId());
 +                workJob = new VmWorkJobVO(context.getContextId());
  
 -                    workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 -                    workJob.setCmd(VmWorkCreateVMSnapshot.class.getName());
 +                workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 +                workJob.setCmd(VmWorkCreateVMSnapshot.class.getName());
  
 -                    workJob.setAccountId(callingAccount.getId());
 -                    workJob.setUserId(callingUser.getId());
 -                    workJob.setStep(VmWorkJobVO.Step.Starting);
 -                    workJob.setVmType(VirtualMachine.Type.Instance);
 -                    workJob.setVmInstanceId(vm.getId());
 +                workJob.setAccountId(callingAccount.getId());
 +                workJob.setUserId(callingUser.getId());
 +                workJob.setStep(VmWorkJobVO.Step.Starting);
 +                workJob.setVmType(VirtualMachine.Type.Instance);
 +                workJob.setVmInstanceId(vm.getId());
-                 workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+                     workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
  
 -                    // save work context info (there are some duplications)
 -                    VmWorkCreateVMSnapshot workInfo = new VmWorkCreateVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
 -                            VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId, quiesceVm);
 -                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 +                // save work context info (there are some duplications)
 +                VmWorkCreateVMSnapshot workInfo = new VmWorkCreateVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
 +                        VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId, quiesceVm);
 +                workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
  
 -                    _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 +                _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
  
 -                    return new Object[] {workJob, new Long(workJob.getId())};
 +                return new Object[] {workJob, new Long(workJob.getId())};
+                 } finally {
+                     _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+                 }
              }
          });
  
@@@ -909,27 -911,31 +913,31 @@@
              public Object[] doInTransaction(TransactionStatus status) {
                  VmWorkJobVO workJob = null;
  
-                 _vmInstanceDao.lockRow(vm.getId(), true);
+                 _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+                 try {
 -                    workJob = new VmWorkJobVO(context.getContextId());
 +                workJob = new VmWorkJobVO(context.getContextId());
  
 -                    workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 -                    workJob.setCmd(VmWorkDeleteVMSnapshot.class.getName());
 +                workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 +                workJob.setCmd(VmWorkDeleteVMSnapshot.class.getName());
  
 -                    workJob.setAccountId(callingAccount.getId());
 -                    workJob.setUserId(callingUser.getId());
 -                    workJob.setStep(VmWorkJobVO.Step.Starting);
 -                    workJob.setVmType(VirtualMachine.Type.Instance);
 -                    workJob.setVmInstanceId(vm.getId());
 +                workJob.setAccountId(callingAccount.getId());
 +                workJob.setUserId(callingUser.getId());
 +                workJob.setStep(VmWorkJobVO.Step.Starting);
 +                workJob.setVmType(VirtualMachine.Type.Instance);
 +                workJob.setVmInstanceId(vm.getId());
-                 workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+                     workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
  
 -                    // save work context info (there are some duplications)
 -                    VmWorkDeleteVMSnapshot workInfo = new VmWorkDeleteVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
 -                            VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId);
 -                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 +                // save work context info (there are some duplications)
 +                VmWorkDeleteVMSnapshot workInfo = new VmWorkDeleteVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
 +                        VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId);
 +                workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
  
 -                    _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 +                _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
  
 -                    return new Object[] {workJob, new Long(workJob.getId())};
 +                return new Object[] {workJob, new Long(workJob.getId())};
+                 } finally {
+                     _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+                 }
              }
          });
  
@@@ -953,27 -959,31 +961,31 @@@
              public Object[] doInTransaction(TransactionStatus status) {
                  VmWorkJobVO workJob = null;
  
-                 _vmInstanceDao.lockRow(vm.getId(), true);
+                 _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+                 try {
 -                    workJob = new VmWorkJobVO(context.getContextId());
 +                workJob = new VmWorkJobVO(context.getContextId());
  
 -                    workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 -                    workJob.setCmd(VmWorkRevertToVMSnapshot.class.getName());
 +                workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 +                workJob.setCmd(VmWorkRevertToVMSnapshot.class.getName());
  
 -                    workJob.setAccountId(callingAccount.getId());
 -                    workJob.setUserId(callingUser.getId());
 -                    workJob.setStep(VmWorkJobVO.Step.Starting);
 -                    workJob.setVmType(VirtualMachine.Type.Instance);
 -                    workJob.setVmInstanceId(vm.getId());
 +                workJob.setAccountId(callingAccount.getId());
 +                workJob.setUserId(callingUser.getId());
 +                workJob.setStep(VmWorkJobVO.Step.Starting);
 +                workJob.setVmType(VirtualMachine.Type.Instance);
 +                workJob.setVmInstanceId(vm.getId());
-                 workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+                     workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
  
 -                    // save work context info (there are some duplications)
 -                    VmWorkRevertToVMSnapshot workInfo = new VmWorkRevertToVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
 -                            VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId);
 -                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 +                // save work context info (there are some duplications)
 +                VmWorkRevertToVMSnapshot workInfo = new VmWorkRevertToVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
 +                        VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId);
 +                workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
  
 -                    _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 +                _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
  
 -                    return new Object[] {workJob, new Long(workJob.getId())};
 +                return new Object[] {workJob, new Long(workJob.getId())};
+                 } finally {
+                     _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+                 }
              }
          });
  
@@@ -997,27 -1007,31 +1009,31 @@@
              public Object[] doInTransaction(TransactionStatus status) {
                  VmWorkJobVO workJob = null;
  
-                 _vmInstanceDao.lockRow(vm.getId(), true);
+                 _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+                 try {
 -                    workJob = new VmWorkJobVO(context.getContextId());
 +                workJob = new VmWorkJobVO(context.getContextId());
  
 -                    workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 -                    workJob.setCmd(VmWorkDeleteAllVMSnapshots.class.getName());
 +                workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 +                workJob.setCmd(VmWorkDeleteAllVMSnapshots.class.getName());
  
 -                    workJob.setAccountId(callingAccount.getId());
 -                    workJob.setUserId(callingUser.getId());
 -                    workJob.setStep(VmWorkJobVO.Step.Starting);
 -                    workJob.setVmType(VirtualMachine.Type.Instance);
 -                    workJob.setVmInstanceId(vm.getId());
 +                workJob.setAccountId(callingAccount.getId());
 +                workJob.setUserId(callingUser.getId());
 +                workJob.setStep(VmWorkJobVO.Step.Starting);
 +                workJob.setVmType(VirtualMachine.Type.Instance);
 +                workJob.setVmInstanceId(vm.getId());
-                 workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+                     workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
  
 -                    // save work context info (there are some duplications)
 -                    VmWorkDeleteAllVMSnapshots workInfo = new VmWorkDeleteAllVMSnapshots(callingUser.getId(), callingAccount.getId(), vm.getId(),
 -                            VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, type);
 -                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 +                // save work context info (there are some duplications)
 +                VmWorkDeleteAllVMSnapshots workInfo = new VmWorkDeleteAllVMSnapshots(callingUser.getId(), callingAccount.getId(), vm.getId(),
 +                        VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, type);
 +                workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
  
 -                    _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 +                _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
  
 -                    return new Object[] {workJob, new Long(workJob.getId())};
 +                return new Object[] {workJob, new Long(workJob.getId())};
+                 } finally {
+                     _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+                 }
              }
          });
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/services/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/setup/db/db/schema-430to440.sql
----------------------------------------------------------------------
diff --cc setup/db/db/schema-430to440.sql
index 917a954,f755a08..52f6c67
--- a/setup/db/db/schema-430to440.sql
+++ b/setup/db/db/schema-430to440.sql
@@@ -122,9 -122,10 +122,10 @@@ CREATE VIEW `cloud`.`volume_view` A
          volumes.attached,
          volumes.removed,
          volumes.pod_id,
 -        volumes.display_volume,
 +    volumes.display_volume,
          volumes.format,
 -        volumes.path,
 +    volumes.path,
+         volumes.chain_info,
          account.id account_id,
          account.uuid account_uuid,
          account.account_name account_name,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/tools/marvin/marvin/integration/lib/base.py
----------------------------------------------------------------------
diff --cc tools/marvin/marvin/integration/lib/base.py
index d281f7b,0a7ad94..4d968d1
--- a/tools/marvin/marvin/integration/lib/base.py
+++ b/tools/marvin/marvin/integration/lib/base.py
@@@ -3623,131 -3630,32 +3630,160 @@@ class Resources
          cmd = updateResourceCount.updateResourceCountCmd()
          [setattr(cmd, k, v) for k, v in kwargs.items()]
          return(apiclient.updateResourceCount(cmd))
-     
 -
++   
+ class NIC:
+     """NIC related API"""
+     def __init__(self, items):
+         self.__dict__.update(items)
+ 
+     @classmethod
+     def addIp(cls, apiclient, id, ipaddress=None):
+         """Add Ip (secondary) to NIC"""
+         cmd = addIpToNic.addIpToNicCmd()
+         cmd.nicid = id
+         if ipaddress:
+             cmd.ipaddress = ipaddress
+         return(apiclient.addIpToNic(cmd))
+ 
+     @classmethod
+     def removeIp(cls,apiclient,ipaddressid):
+         """Remove secondary Ip from NIC"""
+         cmd = removeIpFromNic.removeIpFromNicCmd()
+         cmd.id = ipaddressid
+         return(apiclient.addIpToNic(cmd))
+ 
+     @classmethod
+     def list(cls, apiclient, **kwargs):
+         """List NICs belonging to a virtual machine"""
+ 
+         cmd = listNics.listNicsCmd()
+         [setattr(cmd, k, v) for k, v in kwargs.items()]
+         return(apiclient.listNics(cmd))
++        
 +class IAMGroup:
 +    def __init__(self, items):
 +        self.__dict__.update(items)
 +
 +    @classmethod
 +    def create(cls, apiclient, iam_grp, account=None, domainid=None):
 +        cmd = createIAMGroup.createIAMGroupCmd()
 +        cmd.name = iam_grp['name']
 +        cmd.description = iam_grp['description']
 +        if account:
 +            cmd.account = account
 +        if domainid:
 +            cmd.domainid = domainid
 +        return IAMGroup(apiclient.createIAMGroup(cmd).__dict__)
 +
 +    def update(self, apiclient):
 +        pass
 +
 +    def delete(self, apiclient):
 +        cmd = deleteIAMGroup.deleteIAMGroupCmd()
 +        cmd.id = self.id
 +        return apiclient.deleteIAMGroup(cmd)
 +
 +    @classmethod
 +    def list(cls, apiclient, **kwargs):
 +        cmd = listIAMGroups.listIAMGroupsCmd()
 +        [setattr(cmd, k, v) for k, v in kwargs.items()]
 +        return apiclient.listIAMGroupsCmd(cmd)  
 +    
 +    def addAccount(self, apiclient, accts):
 +        """Add accounts to iam group"""
 +        cmd = addAccountToIAMGroup.addAccountToIAMGroupCmd()
 +        cmd.id = self.id
 +        cmd.accounts = [str(acct.id) for acct in accts]
 +        apiclient.addAccountToIAMGroup(cmd)
 +        return  
 +
 +    def removeAccount(self, apiclient, accts):
 +        """ Remove accounts from iam group"""
 +        cmd = removeAccountFromIAMGroup.removeAccountFromIAMGroupCmd()
 +        cmd.id = self.id
 +        cmd.accounts = [str(acct.id) for acct in accts]
 +        apiclient.removeAccountFromIAMGroup(cmd)
 +        return  
 +    
 +    def attachPolicy(self, apiclient, policies):
 +        """Add policies to iam group"""
 +        cmd = attachIAMPolicyToIAMGroup.attachIAMPolicyToIAMGroupCmd()
 +        cmd.id = self.id
 +        cmd.policies = [str(policy.id) for policy in policies]
 +        apiclient.attachIAMPolicyToIAMGroup(cmd)
 +        return   
 +    
 +    def detachPolicy(self, apiclient, policies):
 +        """Remove policies from iam group"""
 +        cmd = removeIAMPolicyFromIAMGroup.removeIAMPolicyFromIAMGroupCmd()
 +        cmd.id = self.id
 +        cmd.policies = [str(policy.id) for policy in policies]
 +        apiclient.removeIAMPolicyFromIAMGroup(cmd)
 +        return         
 +    
 +class IAMPolicy:
 +    def __init__(self, items):
 +        self.__dict__.update(items)
 +
 +    @classmethod
 +    def create(cls, apiclient, iam_policy, account=None, domainid=None):
 +        cmd = createIAMPolicy.createIAMPolicyCmd()
 +        cmd.name = iam_policy['name']
 +        cmd.description = iam_policy['description']
 +        if account:
 +            cmd.account = account
 +        if domainid:
 +            cmd.domainid = domainid
 +        return IAMPolicy(apiclient.createIAMPolicy(cmd).__dict__)
 +
 +    def update(self, apiclient):
 +        pass
 +
 +    def delete(self, apiclient):
 +        cmd = deleteIAMPolicy.deleteIAMPolicyCmd()
 +        cmd.id = self.id
 +        return apiclient.deleteIAMPolicy(cmd)
 +
 +    @classmethod
 +    def list(cls, apiclient, **kwargs):
 +        cmd = listIAMPolicies.listIAMPoliciesCmd()
 +        [setattr(cmd, k, v) for k, v in kwargs.items()]
 +        return apiclient.listIAMPoliciesCmd(cmd)  
 +
 +    def addPermission(self, apiclient, permission):
 +        """Add permission to iam policy"""
 +        cmd = addIAMPermissionToIAMPolicy.addIAMPermissionToIAMPolicyCmd()
 +        cmd.id = self.id
 +        cmd.action = permission['action']
 +        cmd.entitytype = permission['entitytype']
 +        cmd.scope = permission['scope']
 +        cmd.scopeid = permission['scopeid']
 +        apiclient.addIAMPermissionToIAMPolicy(cmd)
 +        return       
 +
 +    def removePermission(self, apiclient, permission):
 +        """Remove permission from iam policy"""
 +        cmd = removeIAMPermissionFromIAMPolicy.removeIAMPermissionFromIAMPolicyCmd()
 +        cmd.id = self.id
 +        cmd.action = permission['action']
 +        cmd.entitytype = permission['entitytype']
 +        cmd.scope = permission['scope']
 +        cmd.scopeid = permission['scopeid']
 +        apiclient.removeIAMPermissionFromIAMPolicy(cmd)
 +        return  
 +    
 +    def attachAccount(self, apiclient, accts):
 +        """Attach iam policy to accounts"""
 +        cmd = attachIAMPolicyToAccount.attachIAMPolicyToAccountCmd()
 +        cmd.id = self.id
 +        cmd.accounts = [str(acct.id) for acct in accts]
 +        apiclient.attachIAMPolicyToAccount(cmd)
 +        return  
 +    
 +    def detachAccount(self, apiclient, accts):
 +        """Detach iam policy from accounts"""
 +        cmd = removeIAMPolicyFromAccount.removeIAMPolicyFromAccountCmd()
 +        cmd.id = self.id
 +        cmd.accounts = [str(acct.id) for acct in accts]
 +        apiclient.removeIAMPolicyFromAccount(cmd)
-         return           
++        return           


[28/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Seperate job executor pools to avoid thread starvation situation.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/8e27120b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/8e27120b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/8e27120b

Branch: refs/heads/distributedrouter
Commit: 8e27120be40725c7e89db8a69b6a976cade8e917
Parents: 6ad245e
Author: Kelven Yang <ke...@gmail.com>
Authored: Thu Mar 6 10:36:39 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Mar 13 16:59:56 2014 -0700

----------------------------------------------------------------------
 .../framework/jobs/AsyncJobManager.java         |  3 ++-
 .../jobs/impl/AsyncJobManagerImpl.java          | 21 ++++++++++++++------
 .../framework/jobs/impl/AsyncJobMonitor.java    |  2 +-
 3 files changed, 18 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8e27120b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobManager.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobManager.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobManager.java
index 67733ed..fe5c067 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobManager.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobManager.java
@@ -27,7 +27,8 @@ import com.cloud.utils.component.Manager;
 
 public interface AsyncJobManager extends Manager {
 
-    public static final String JOB_POOL_THREAD_PREFIX = "Job-Executor";
+    public static final String API_JOB_POOL_THREAD_PREFIX = "API-Job-Executor";
+    public static final String WORK_JOB_POOL_THREAD_PREFIX = "Work-Job-Executor";
 
     AsyncJobVO getAsyncJob(long jobId);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8e27120b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index b9246aa..9b9460c 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -117,7 +117,8 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
     private volatile long _executionRunNumber = 1;
 
     private final ScheduledExecutorService _heartbeatScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("AsyncJobMgr-Heartbeat"));
-    private ExecutorService _executor;
+    private ExecutorService _apiJobExecutor;
+    private ExecutorService _workerJobExecutor;
 
     @Override
     public String getConfigComponentName() {
@@ -390,7 +391,10 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
         if (executeInContext) {
             runnable.run();
         } else {
-            _executor.submit(runnable);
+            if (job.getDispatcher() == null || job.getDispatcher().equalsIgnoreCase("ApiAsyncJobDispatcher"))
+                _apiJobExecutor.submit(runnable);
+            else
+                _workerJobExecutor.submit(runnable);
         }
     }
 
@@ -855,10 +859,14 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
             final Properties dbProps = DbProperties.getDbProperties();
             final int cloudMaxActive = Integer.parseInt(dbProps.getProperty("db.cloud.maxActive"));
 
-            int poolSize = (cloudMaxActive * 2) / 3;
+            int apiPoolSize = cloudMaxActive / 2;
+            int workPoolSize = (cloudMaxActive * 2) / 3;
 
-            s_logger.info("Start AsyncJobManager thread pool in size " + poolSize);
-            _executor = Executors.newFixedThreadPool(poolSize, new NamedThreadFactory(AsyncJobManager.JOB_POOL_THREAD_PREFIX));
+            s_logger.info("Start AsyncJobManager API executor thread pool in size " + apiPoolSize);
+            _apiJobExecutor = Executors.newFixedThreadPool(apiPoolSize, new NamedThreadFactory(AsyncJobManager.API_JOB_POOL_THREAD_PREFIX));
+
+            s_logger.info("Start AsyncJobManager Work executor thread pool in size " + workPoolSize);
+            _workerJobExecutor = Executors.newFixedThreadPool(workPoolSize, new NamedThreadFactory(AsyncJobManager.WORK_JOB_POOL_THREAD_PREFIX));
         } catch (final Exception e) {
             throw new ConfigurationException("Unable to load db.properties to configure AsyncJobManagerImpl");
         }
@@ -941,7 +949,8 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
     @Override
     public boolean stop() {
         _heartbeatScheduler.shutdown();
-        _executor.shutdown();
+        _apiJobExecutor.shutdown();
+        _workerJobExecutor.shutdown();
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8e27120b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java
index 0b6f7a5..b1cac3e 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java
@@ -115,7 +115,7 @@ public class AsyncJobMonitor extends ManagerBase {
             assert (_activeTasks.get(runNumber) == null);
 
             long threadId = Thread.currentThread().getId();
-            boolean fromPoolThread = Thread.currentThread().getName().contains(AsyncJobManager.JOB_POOL_THREAD_PREFIX);
+            boolean fromPoolThread = Thread.currentThread().getName().contains(AsyncJobManager.API_JOB_POOL_THREAD_PREFIX);
             ActiveTaskRecord record = new ActiveTaskRecord(jobId, threadId, fromPoolThread);
             _activeTasks.put(runNumber, record);
             if (fromPoolThread)


[38/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
CLOUDSTACK-6052: List VM enhancement to support querying with multiple VM IDs
Annotated the 'ids' parameter with "since = 4.4"


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/16ddc341
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/16ddc341
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/16ddc341

Branch: refs/heads/distributedrouter
Commit: 16ddc3414ae0269ecb8903f670496e45f68d6ef6
Parents: 4399e24
Author: Koushik Das <ko...@apache.org>
Authored: Fri Mar 14 11:04:42 2014 +0530
Committer: Koushik Das <ko...@apache.org>
Committed: Fri Mar 14 11:04:42 2014 +0530

----------------------------------------------------------------------
 api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/16ddc341/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
index e5576e7..6c95a12 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
@@ -68,8 +68,7 @@ public class ListVMsCmd extends BaseListTaggedResourcesCmd {
     @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = UserVmResponse.class, description = "the ID of the virtual machine")
     private Long id;
 
-    @Parameter(name=ApiConstants.IDS, type=CommandType.LIST, collectionType=CommandType.UUID, entityType=UserVmResponse.class,
-               description="the IDs of the virtual machines, mutually exclusive with id")
+    @Parameter(name=ApiConstants.IDS, type=CommandType.LIST, collectionType=CommandType.UUID, entityType=UserVmResponse.class, description="the IDs of the virtual machines, mutually exclusive with id", since = "4.4")
     private List<Long> ids;
 
     @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "name of the virtual machine")


[42/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
CLOUDSTACK-6090: Virtual Router Service Failure Alerting
Fixed a missing license header


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f293c94b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f293c94b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f293c94b

Branch: refs/heads/distributedrouter
Commit: f293c94bc0198f162c80ff807ca81459150354a5
Parents: f733752
Author: Koushik Das <ko...@apache.org>
Authored: Fri Mar 14 15:45:54 2014 +0530
Committer: Koushik Das <ko...@apache.org>
Committed: Fri Mar 14 15:45:54 2014 +0530

----------------------------------------------------------------------
 .../network/dao/OpRouterMonitorServiceVO.java      | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f293c94b/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceVO.java b/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceVO.java
index c70bba3..c2882fc 100644
--- a/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceVO.java
+++ b/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceVO.java
@@ -1,3 +1,20 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
 package com.cloud.network.dao;
 
 import org.apache.cloudstack.api.InternalIdentity;


[02/54] [abbrv] Merge branch 'master' into rbac.

Posted by mu...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnConnectionCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnConnectionCmd.java
index e28e4ab,96adf5f..d405c17
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnConnectionCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnConnectionCmd.java
@@@ -16,9 -16,7 +16,10 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vpn;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
@@@ -37,7 -36,8 +38,9 @@@ import com.cloud.network.Site2SiteVpnCo
  import com.cloud.network.Site2SiteVpnGateway;
  import com.cloud.network.vpc.Vpc;
  
- @APICommand(name = "createVpnConnection", description = "Create site to site vpn connection", responseObject = Site2SiteVpnConnectionResponse.class, entityType = { IAMEntityType.Site2SiteVpnConnection })
 -@APICommand(name = "createVpnConnection", description = "Create site to site vpn connection", responseObject = Site2SiteVpnConnectionResponse.class,
++
++@APICommand(name = "createVpnConnection", description = "Create site to site vpn connection", responseObject = Site2SiteVpnConnectionResponse.class, entityType = { IAMEntityType.Site2SiteVpnConnection },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateVpnConnectionCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(CreateVpnConnectionCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java
index 3cc6e17,1894835..b8de6e0
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java
@@@ -32,7 -31,8 +32,8 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.event.EventTypes;
  import com.cloud.network.Site2SiteCustomerGateway;
  
- @APICommand(name = "createVpnCustomerGateway", description = "Creates site to site vpn customer gateway", responseObject = Site2SiteCustomerGatewayResponse.class, entityType = { IAMEntityType.Site2SiteCustomerGateway })
 -@APICommand(name = "createVpnCustomerGateway", description = "Creates site to site vpn customer gateway", responseObject = Site2SiteCustomerGatewayResponse.class,
++@APICommand(name = "createVpnCustomerGateway", description = "Creates site to site vpn customer gateway", responseObject = Site2SiteCustomerGatewayResponse.class, entityType = {IAMEntityType.Site2SiteCustomerGateway},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateVpnCustomerGatewayCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(CreateVpnCustomerGatewayCmd.class.getName());
  
@@@ -166,7 -166,7 +167,7 @@@
          if (result != null) {
              Site2SiteCustomerGatewayResponse response = _responseGenerator.createSite2SiteCustomerGatewayResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create customer VPN gateway");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnGatewayCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnGatewayCmd.java
index 19be21b,03fa9c4..12abfb6
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnGatewayCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnGatewayCmd.java
@@@ -16,9 -16,7 +16,10 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vpn;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
@@@ -32,7 -31,8 +33,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.Site2SiteVpnGateway;
  import com.cloud.network.vpc.Vpc;
  
- @APICommand(name = "createVpnGateway", description = "Creates site to site vpn local gateway", responseObject = Site2SiteVpnGatewayResponse.class, entityType = { IAMEntityType.Site2SiteVpnGateway })
 -@APICommand(name = "createVpnGateway", description = "Creates site to site vpn local gateway", responseObject = Site2SiteVpnGatewayResponse.class,
++@APICommand(name = "createVpnGateway", description = "Creates site to site vpn local gateway", responseObject = Site2SiteVpnGatewayResponse.class, entityType = { IAMEntityType.Site2SiteVpnGateway },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateVpnGatewayCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(CreateVpnGatewayCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java
index d3eacf5,c9464e0..7d0c5aa
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java
@@@ -33,7 -32,8 +33,8 @@@ import com.cloud.exception.InvalidParam
  import com.cloud.exception.ResourceUnavailableException;
  import com.cloud.network.RemoteAccessVpn;
  
- @APICommand(name = "deleteRemoteAccessVpn", description = "Destroys a l2tp/ipsec remote access vpn", responseObject = SuccessResponse.class, entityType = { IAMEntityType.RemoteAccessVpn })
 -@APICommand(name = "deleteRemoteAccessVpn", description = "Destroys a l2tp/ipsec remote access vpn", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteRemoteAccessVpn", description = "Destroys a l2tp/ipsec remote access vpn", responseObject = SuccessResponse.class, entityType = {IAMEntityType.RemoteAccessVpn},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteRemoteAccessVpnCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteRemoteAccessVpnCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnConnectionCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnConnectionCmd.java
index 6fe8820,7014ed7..6034bcb
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnConnectionCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnConnectionCmd.java
@@@ -33,7 -32,8 +33,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.network.Site2SiteVpnConnection;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteVpnConnection", description = "Delete site to site vpn connection", responseObject = SuccessResponse.class, entityType = { IAMEntityType.Site2SiteVpnConnection })
 -@APICommand(name = "deleteVpnConnection", description = "Delete site to site vpn connection", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteVpnConnection", description = "Delete site to site vpn connection", responseObject = SuccessResponse.class, entityType = {IAMEntityType.Site2SiteVpnConnection},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteVpnConnectionCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteVpnConnectionCmd.class.getName());
  
@@@ -87,7 -87,7 +88,7 @@@
              boolean result = _s2sVpnService.deleteVpnConnection(this);
              if (result) {
                  SuccessResponse response = new SuccessResponse(getCommandName());
--                this.setResponseObject(response);
++                setResponseObject(response);
              } else {
                  throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete site to site VPN connection");
              }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnCustomerGatewayCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnCustomerGatewayCmd.java
index e24f231,4ba5b43..3faf5fd
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnCustomerGatewayCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnCustomerGatewayCmd.java
@@@ -34,7 -31,8 +34,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.Site2SiteCustomerGateway;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteVpnCustomerGateway", description = "Delete site to site vpn customer gateway", responseObject = SuccessResponse.class, entityType = { IAMEntityType.Site2SiteCustomerGateway })
 -@APICommand(name = "deleteVpnCustomerGateway", description = "Delete site to site vpn customer gateway", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteVpnCustomerGateway", description = "Delete site to site vpn customer gateway", responseObject = SuccessResponse.class, entityType = {IAMEntityType.Site2SiteCustomerGateway},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteVpnCustomerGatewayCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteVpnCustomerGatewayCmd.class.getName());
  
@@@ -92,7 -89,7 +93,7 @@@
          boolean result = _s2sVpnService.deleteCustomerGateway(this);
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete customer VPN gateway");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnGatewayCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnGatewayCmd.java
index 6f28037,41b78d9..66fd55b
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnGatewayCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteVpnGatewayCmd.java
@@@ -32,7 -31,8 +32,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.Site2SiteVpnGateway;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteVpnGateway", description = "Delete site to site vpn gateway", responseObject = SuccessResponse.class, entityType = { IAMEntityType.Site2SiteVpnGateway })
 -@APICommand(name = "deleteVpnGateway", description = "Delete site to site vpn gateway", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteVpnGateway", description = "Delete site to site vpn gateway", responseObject = SuccessResponse.class, entityType = {IAMEntityType.Site2SiteVpnGateway},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteVpnGatewayCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteVpnGatewayCmd.class.getName());
  
@@@ -86,7 -86,7 +87,7 @@@
          result = _s2sVpnService.deleteVpnGateway(this);
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete customer VPN gateway");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/ListRemoteAccessVpnsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/ListRemoteAccessVpnsCmd.java
index fde143c,bcf00d9..61a3a29
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/ListRemoteAccessVpnsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/ListRemoteAccessVpnsCmd.java
@@@ -19,9 -19,7 +19,10 @@@ package org.apache.cloudstack.api.comma
  import java.util.ArrayList;
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
@@@ -34,7 -33,8 +35,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.RemoteAccessVpn;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listRemoteAccessVpns", description = "Lists remote access vpns", responseObject = RemoteAccessVpnResponse.class, entityType = { IAMEntityType.RemoteAccessVpn })
 -@APICommand(name = "listRemoteAccessVpns", description = "Lists remote access vpns", responseObject = RemoteAccessVpnResponse.class,
++@APICommand(name = "listRemoteAccessVpns", description = "Lists remote access vpns", responseObject = RemoteAccessVpnResponse.class, entityType = { IAMEntityType.RemoteAccessVpn },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListRemoteAccessVpnsCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListRemoteAccessVpnsCmd.class.getName());
  
@@@ -97,6 -108,6 +110,6 @@@
          }
          response.setResponses(vpnResponses, vpns.second());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnConnectionsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnConnectionsCmd.java
index ed93741,1da2166..f8e81c2
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnConnectionsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnConnectionsCmd.java
@@@ -19,9 -19,7 +19,10 @@@ package org.apache.cloudstack.api.comma
  import java.util.ArrayList;
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
@@@ -33,7 -32,8 +34,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.Site2SiteVpnConnection;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listVpnConnections", description = "Lists site to site vpn connection gateways", responseObject = Site2SiteVpnConnectionResponse.class, entityType = { IAMEntityType.Site2SiteVpnConnection })
 -@APICommand(name = "listVpnConnections", description = "Lists site to site vpn connection gateways", responseObject = Site2SiteVpnConnectionResponse.class,
++@APICommand(name = "listVpnConnections", description = "Lists site to site vpn connection gateways", responseObject = Site2SiteVpnConnectionResponse.class, entityType = { IAMEntityType.Site2SiteVpnConnection },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListVpnConnectionsCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListVpnConnectionsCmd.class.getName());
  
@@@ -85,6 -96,6 +98,6 @@@
  
          response.setResponses(connResponses, conns.second());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnCustomerGatewaysCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnCustomerGatewaysCmd.java
index 2304964,e5bc1dc..fed96a7
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnCustomerGatewaysCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnCustomerGatewaysCmd.java
@@@ -32,7 -31,8 +32,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.Site2SiteCustomerGateway;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listVpnCustomerGateways", description = "Lists site to site vpn customer gateways", responseObject = Site2SiteCustomerGatewayResponse.class, entityType = { IAMEntityType.Site2SiteCustomerGateway })
 -@APICommand(name = "listVpnCustomerGateways", description = "Lists site to site vpn customer gateways", responseObject = Site2SiteCustomerGatewayResponse.class,
++@APICommand(name = "listVpnCustomerGateways", description = "Lists site to site vpn customer gateways", responseObject = Site2SiteCustomerGatewayResponse.class, entityType = {IAMEntityType.Site2SiteCustomerGateway},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListVpnCustomerGatewaysCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListVpnCustomerGatewaysCmd.class.getName());
  
@@@ -78,6 -78,6 +79,6 @@@
  
          response.setResponses(gwResponses, gws.second());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnGatewaysCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnGatewaysCmd.java
index 7f8a33f,359360b..1770225
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnGatewaysCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnGatewaysCmd.java
@@@ -19,9 -19,7 +19,10 @@@ package org.apache.cloudstack.api.comma
  import java.util.ArrayList;
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
@@@ -33,7 -32,8 +34,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.Site2SiteVpnGateway;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listVpnGateways", description = "Lists site 2 site vpn gateways", responseObject = Site2SiteVpnGatewayResponse.class, entityType = { IAMEntityType.Site2SiteVpnGateway })
 -@APICommand(name = "listVpnGateways", description = "Lists site 2 site vpn gateways", responseObject = Site2SiteVpnGatewayResponse.class,
++@APICommand(name = "listVpnGateways", description = "Lists site 2 site vpn gateways", responseObject = Site2SiteVpnGatewayResponse.class, entityType = { IAMEntityType.Site2SiteVpnGateway },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListVpnGatewaysCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListVpnGatewaysCmd.class.getName());
  
@@@ -86,6 -97,6 +99,6 @@@
  
          response.setResponses(gwResponses, gws.second());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnUsersCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnUsersCmd.java
index 6efdaa1,16b7ced..1d8ea85
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnUsersCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/ListVpnUsersCmd.java
@@@ -32,7 -31,8 +32,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.VpnUser;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listVpnUsers", description = "Lists vpn users", responseObject = VpnUsersResponse.class, entityType = { IAMEntityType.VpnUser })
 -@APICommand(name = "listVpnUsers", description = "Lists vpn users", responseObject = VpnUsersResponse.class,
++@APICommand(name = "listVpnUsers", description = "Lists vpn users", responseObject = VpnUsersResponse.class, entityType = {IAMEntityType.VpnUser},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListVpnUsersCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListVpnUsersCmd.class.getName());
  
@@@ -80,6 -80,6 +81,6 @@@
  
          response.setResponses(vpnResponses, vpnUsers.second());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java
index d39c1a4,d49a208..ed39c90
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java
@@@ -33,7 -32,8 +33,8 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.event.EventTypes;
  import com.cloud.user.Account;
  
- @APICommand(name = "removeVpnUser", description = "Removes vpn user", responseObject = SuccessResponse.class, entityType = { IAMEntityType.VpnUser })
 -@APICommand(name = "removeVpnUser", description = "Removes vpn user", responseObject = SuccessResponse.class,
++@APICommand(name = "removeVpnUser", description = "Removes vpn user", responseObject = SuccessResponse.class, entityType = {IAMEntityType.VpnUser},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class RemoveVpnUserCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RemoveVpnUserCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/ResetVpnConnectionCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/ResetVpnConnectionCmd.java
index 025cc86,8c3f1d6..dcd60a4
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/ResetVpnConnectionCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/ResetVpnConnectionCmd.java
@@@ -34,7 -33,8 +34,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.network.Site2SiteVpnConnection;
  import com.cloud.user.Account;
  
- @APICommand(name = "resetVpnConnection", description = "Reset site to site vpn connection", responseObject = Site2SiteVpnConnectionResponse.class, entityType = { IAMEntityType.Site2SiteVpnConnection })
 -@APICommand(name = "resetVpnConnection", description = "Reset site to site vpn connection", responseObject = Site2SiteVpnConnectionResponse.class,
++@APICommand(name = "resetVpnConnection", description = "Reset site to site vpn connection", responseObject = Site2SiteVpnConnectionResponse.class, entityType = {IAMEntityType.Site2SiteVpnConnection},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ResetVpnConnectionCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(ResetVpnConnectionCmd.class.getName());
  
@@@ -106,7 -106,7 +107,7 @@@
              if (result != null) {
                  Site2SiteVpnConnectionResponse response = _responseGenerator.createSite2SiteVpnConnectionResponse(result);
                  response.setResponseName(getCommandName());
--                this.setResponseObject(response);
++                setResponseObject(response);
              } else {
                  throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to reset site to site VPN connection");
              }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java
index f88fa30,e0cafed..8425964
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java
@@@ -32,7 -31,8 +32,8 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.event.EventTypes;
  import com.cloud.network.Site2SiteCustomerGateway;
  
- @APICommand(name = "updateVpnCustomerGateway", description = "Update site to site vpn customer gateway", responseObject = Site2SiteCustomerGatewayResponse.class, entityType = { IAMEntityType.Site2SiteCustomerGateway })
 -@APICommand(name = "updateVpnCustomerGateway", description = "Update site to site vpn customer gateway", responseObject = Site2SiteCustomerGatewayResponse.class,
++@APICommand(name = "updateVpnCustomerGateway", description = "Update site to site vpn customer gateway", responseObject = Site2SiteCustomerGatewayResponse.class, entityType = {IAMEntityType.Site2SiteCustomerGateway},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdateVpnCustomerGatewayCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateVpnCustomerGatewayCmd.class.getName());
  
@@@ -169,7 -169,7 +170,7 @@@
          if (result != null) {
              Site2SiteCustomerGatewayResponse response = _responseGenerator.createSite2SiteCustomerGatewayResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update customer VPN gateway");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/zone/ListZonesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/zone/ListZonesCmd.java
index 1b2969d,0000000..34a5440
mode 100644,000000..100644
--- a/api/src/org/apache/cloudstack/api/command/user/zone/ListZonesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/zone/ListZonesCmd.java
@@@ -1,132 -1,0 +1,134 @@@
 +// Licensed to the Apache Software Foundation (ASF) under one
 +// or more contributor license agreements.  See the NOTICE file
 +// distributed with this work for additional information
 +// regarding copyright ownership.  The ASF licenses this file
 +// to you under the Apache License, Version 2.0 (the
 +// "License"); you may not use this file except in compliance
 +// with the License.  You may obtain a copy of the License at
 +//
 +//   http://www.apache.org/licenses/LICENSE-2.0
 +//
 +// Unless required by applicable law or agreed to in writing,
 +// software distributed under the License is distributed on an
 +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 +// KIND, either express or implied.  See the License for the
 +// specific language governing permissions and limitations
 +// under the License.
 +package org.apache.cloudstack.api.command.user.zone;
 +
 +import java.util.Collection;
 +import java.util.HashMap;
 +import java.util.Iterator;
 +import java.util.Map;
 +
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.api.APICommand;
 +import org.apache.cloudstack.api.ApiConstants;
 +import org.apache.cloudstack.api.BaseListCmd;
 +import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
 +import org.apache.cloudstack.api.response.DomainResponse;
 +import org.apache.cloudstack.api.response.ListResponse;
 +import org.apache.cloudstack.api.response.ZoneResponse;
 +
 +import com.cloud.exception.InvalidParameterValueException;
 +
- @APICommand(name = "listZones", description = "Lists zones", responseObject = ZoneResponse.class, responseView = ResponseView.Restricted)
++@APICommand(name = "listZones", description = "Lists zones", responseObject = ZoneResponse.class, responseView = ResponseView.Restricted,
++        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
 +public class ListZonesCmd extends BaseListCmd {
 +    public static final Logger s_logger = Logger.getLogger(ListZonesCmd.class.getName());
++
 +    private static final String s_name = "listzonesresponse";
 +
 +    /////////////////////////////////////////////////////
 +    //////////////// API parameters /////////////////////
 +    /////////////////////////////////////////////////////
 +    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of the zone")
 +    private Long id;
 +
 +    @Parameter(name = ApiConstants.AVAILABLE,
 +               type = CommandType.BOOLEAN,
 +               description = "true if you want to retrieve all available Zones. False if you only want to return the Zones"
 +                   + " from which you have at least one VM. Default is false.")
 +    private Boolean available;
 +
 +    @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "the ID of the domain associated with the zone")
 +    private Long domainId;
 +
 +    @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "the name of the zone")
 +    private String name;
 +
 +    @Parameter(name = ApiConstants.NETWORK_TYPE, type = CommandType.STRING, description = "the network type of the zone that the virtual machine belongs to")
 +    private String networkType;
 +
 +    @Parameter(name = ApiConstants.SHOW_CAPACITIES, type = CommandType.BOOLEAN, description = "flag to display the capacity of the zones")
 +    private Boolean showCapacities;
 +
 +    @Parameter(name = ApiConstants.TAGS, type = CommandType.MAP, description = "List zones by resource tags (key/value pairs)", since = "4.3")
 +    private Map tags;
 +
 +    /////////////////////////////////////////////////////
 +    /////////////////// Accessors ///////////////////////
 +    /////////////////////////////////////////////////////
 +
 +    public Long getId() {
 +        return id;
 +    }
 +
 +    public Boolean isAvailable() {
 +        return available;
 +    }
 +
 +    public Long getDomainId() {
 +        return domainId;
 +    }
 +
 +    public String getName() {
 +        return name;
 +    }
 +
 +    public String getNetworkType() {
 +        return networkType;
 +    }
 +
 +    public Boolean getShowCapacities() {
 +        return showCapacities;
 +    }
 +
 +    public Map<String, String> getTags() {
 +        Map<String, String> tagsMap = null;
 +        if (tags != null && !tags.isEmpty()) {
 +            tagsMap = new HashMap<String, String>();
 +            Collection<?> servicesCollection = tags.values();
 +            Iterator<?> iter = servicesCollection.iterator();
 +            while (iter.hasNext()) {
 +                HashMap<String, String> services = (HashMap<String, String>)iter.next();
 +                String key = services.get("key");
 +                String value = services.get("value");
 +                if (value == null) {
 +                    throw new InvalidParameterValueException("No value is passed in for key " + key);
 +                }
 +                tagsMap.put(key, value);
 +            }
 +        }
 +        return tagsMap;
 +    }
 +
 +    /////////////////////////////////////////////////////
 +    /////////////// API Implementation///////////////////
 +    /////////////////////////////////////////////////////
 +
 +    @Override
 +    public String getCommandName() {
 +        return s_name;
 +    }
 +
 +    @Override
 +    public void execute() {
 +
 +        ListResponse<ZoneResponse> response = _queryService.listDataCenters(this);
 +        response.setResponseName(getCommandName());
 +        setResponseObject(response);
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/client/pom.xml
----------------------------------------------------------------------
diff --cc client/pom.xml
index cf2dab3,af724b1..eadd6e9
--- a/client/pom.xml
+++ b/client/pom.xml
@@@ -220,23 -220,8 +220,18 @@@
        <groupId>org.apache.cloudstack</groupId>
        <artifactId>cloud-mom-inmemory</artifactId>
        <version>${project.version}</version>
 -    </dependency>
 +    </dependency>    
 +    <dependency>
 +      <groupId>org.apache.cloudstack</groupId>
 +      <artifactId>cloud-plugin-iam</artifactId>
 +      <version>${project.version}</version>
 +    </dependency>   
 +    <dependency>
 +      <groupId>org.apache.cloudstack</groupId>
 +      <artifactId>cloud-iam</artifactId>
 +      <version>${project.version}</version>
 +    </dependency>         
      <dependency>
-       <groupId>mysql</groupId>
-       <artifactId>mysql-connector-java</artifactId>
-       <scope>runtime</scope>
-     </dependency>
-     <dependency>
        <groupId>org.apache.cloudstack</groupId>
        <artifactId>cloud-framework-ipc</artifactId>
        <version>${project.version}</version>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/components-api/src/com/cloud/network/addr/PublicIp.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
----------------------------------------------------------------------
diff --cc engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index 0005983,7853c3b..6e55bd2
--- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@@ -706,60 -692,75 +706,75 @@@ public class NetworkOrchestrator extend
              @Override
              public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientCapacityException {
                  int deviceId = 0;
+                 int size = 0;
+                 for (Network ntwk : networks.keySet()) {
+                     List<? extends NicProfile> profiles = networks.get(ntwk);
+                     if (profiles != null && !profiles.isEmpty()) {
+                         size = size + profiles.size();
+                     } else {
+                         size = size + 1;
+                     }
+                 }
  
-                 boolean[] deviceIds = new boolean[networks.size()];
+                 boolean[] deviceIds = new boolean[size];
                  Arrays.fill(deviceIds, false);
  
-                 List<NicProfile> nics = new ArrayList<NicProfile>(networks.size());
+                 List<NicProfile> nics = new ArrayList<NicProfile>(size);
                  NicProfile defaultNic = null;
  
-                 for (Map.Entry<? extends Network, ? extends NicProfile> network : networks.entrySet()) {
+                 for (Map.Entry<? extends Network, List<? extends NicProfile>> network : networks.entrySet()) {
                      Network config = network.getKey();
-                     NicProfile requested = network.getValue();
+                     List<? extends NicProfile> requestedProfiles = network.getValue();
+                     if (requestedProfiles == null) {
+                         requestedProfiles = new ArrayList<NicProfile>();
+                     }
+                     if (requestedProfiles.isEmpty()) {
+                         requestedProfiles.add(null);
+                     }
  
+                     for (NicProfile requested : requestedProfiles) {
 -                        Boolean isDefaultNic = false;
 -                        if (vm != null && (requested != null && requested.isDefaultNic())) {
 -                            isDefaultNic = true;
 -                        }
 +                    Boolean isDefaultNic = false;
 +                    if (vm != null && (requested != null && requested.isDefaultNic())) {
 +                        isDefaultNic = true;
 +                    }
  
 -                        while (deviceIds[deviceId] && deviceId < deviceIds.length) {
 -                            deviceId++;
 -                        }
 +                    while (deviceIds[deviceId] && deviceId < deviceIds.length) {
 +                        deviceId++;
 +                    }
  
 -                        Pair<NicProfile, Integer> vmNicPair = allocateNic(requested, config, isDefaultNic, deviceId, vm);
 +                    Pair<NicProfile, Integer> vmNicPair = allocateNic(requested, config, isDefaultNic, deviceId, vm);
  
 -                        NicProfile vmNic = vmNicPair.first();
 -                        if (vmNic == null) {
 -                            continue;
 -                        }
 +                    NicProfile vmNic = vmNicPair.first();
 +                    if (vmNic == null) {
 +                        continue;
 +                    }
  
 -                        deviceId = vmNicPair.second();
 +                    deviceId = vmNicPair.second();
  
 -                        int devId = vmNic.getDeviceId();
 -                        if (devId > deviceIds.length) {
 -                            throw new IllegalArgumentException("Device id for nic is too large: " + vmNic);
 -                        }
 -                        if (deviceIds[devId]) {
 -                            throw new IllegalArgumentException("Conflicting device id for two different nics: " + vmNic);
 -                        }
 +                    int devId = vmNic.getDeviceId();
 +                    if (devId > deviceIds.length) {
 +                        throw new IllegalArgumentException("Device id for nic is too large: " + vmNic);
 +                    }
 +                    if (deviceIds[devId]) {
 +                        throw new IllegalArgumentException("Conflicting device id for two different nics: " + vmNic);
 +                    }
  
 -                        deviceIds[devId] = true;
 +                    deviceIds[devId] = true;
  
 -                        if (vmNic.isDefaultNic()) {
 -                            if (defaultNic != null) {
 -                                throw new IllegalArgumentException("You cannot specify two nics as default nics: nic 1 = " + defaultNic + "; nic 2 = " + vmNic);
 -                            }
 -                            defaultNic = vmNic;
 +                    if (vmNic.isDefaultNic()) {
 +                        if (defaultNic != null) {
 +                            throw new IllegalArgumentException("You cannot specify two nics as default nics: nic 1 = " + defaultNic + "; nic 2 = " + vmNic);
                          }
 -
 -                        nics.add(vmNic);
 -                        vm.addNic(vmNic);
 +                        defaultNic = vmNic;
                      }
 +
 +                    nics.add(vmNic);
 +                    vm.addNic(vmNic);
- 
 +                }
- 
-                 if (nics.size() != networks.size()) {
-                     s_logger.warn("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
-                     throw new CloudRuntimeException("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
+                 }
+                 if (nics.size() != size) {
+                     s_logger.warn("Number of nics " + nics.size() + " doesn't match number of requested nics " + size);
+                     throw new CloudRuntimeException("Number of nics " + nics.size() + " doesn't match number of requested networks " + size);
                  }
  
                  if (nics.size() == 1) {
@@@ -1552,16 -1548,19 +1562,19 @@@
              }
          }
  
+         if (vm.getType() == Type.User
+                 && _networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp)
+                 && network.getTrafficType() == TrafficType.Guest
+                 && network.getGuestType() == GuestType.Shared
+                 && isLastNicInSubnet(nic)) {
 -            // remove the dhcpservice ip if this is the last nic in subnet.
 -            DhcpServiceProvider dhcpServiceProvider = getDhcpServiceProvider(network);
 -            if (dhcpServiceProvider != null
 +        // remove the dhcpservice ip if this is the last nic in subnet.
 +        DhcpServiceProvider dhcpServiceProvider = getDhcpServiceProvider(network);
 +        if (dhcpServiceProvider != null
-                 && vm.getType() == Type.User
-                 && isDhcpAccrossMultipleSubnetsSupported(dhcpServiceProvider)
-                 && isLastNicInSubnet(nic)
-                 && network.getTrafficType() == TrafficType.Guest
-                 && network.getGuestType() == GuestType.Shared) {
+                     && isDhcpAccrossMultipleSubnetsSupported(dhcpServiceProvider)) {
 -                removeDhcpServiceInSubnet(nic);
 -            }
 +            removeDhcpServiceInSubnet(nic);
 +        }
+         }
+ 
          NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, network.getGuruName());
          guru.deallocate(network, profile, vm);
          _nicDao.remove(nic.getId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/event/EventVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/network/as/AutoScaleVmGroupVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/network/dao/RemoteAccessVpnVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/network/dao/Site2SiteVpnConnectionVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/network/dao/Site2SiteVpnGatewayVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java
----------------------------------------------------------------------
diff --cc engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java
index 7d0ca79,0acc24a..5e22dd4
--- a/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java
+++ b/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java
@@@ -271,6 -274,15 +274,16 @@@ public class FirewallRuleVO implements 
          return trafficType;
      }
  
++
+     public void setDisplay(boolean display) {
+         this.display = display;
+     }
+ 
+     @Override
+     public boolean isDisplay() {
+         return display;
+     }
+ 
      @Override
      public IAMEntityType getEntityType() {
          return IAMEntityType.FirewallRule;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/network/vpc/VpcVO.java
----------------------------------------------------------------------
diff --cc engine/schema/src/com/cloud/network/vpc/VpcVO.java
index edd984a,d1cfd7c..39bea77
--- a/engine/schema/src/com/cloud/network/vpc/VpcVO.java
+++ b/engine/schema/src/com/cloud/network/vpc/VpcVO.java
@@@ -185,6 -188,15 +188,16 @@@ public class VpcVO implements Vpc 
          this.uuid = uuid;
      }
  
++
+     public void setDisplay(boolean display) {
+         this.display = display;
+     }
+ 
+     @Override
+     public boolean isDisplay() {
+         return display;
+     }
+ 
      @Override
      public IAMEntityType getEntityType() {
          return IAMEntityType.Vpc;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/storage/VMTemplateVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/storage/VolumeVO.java
----------------------------------------------------------------------
diff --cc engine/schema/src/com/cloud/storage/VolumeVO.java
index af80af8,82f47d4..af99a16
--- a/engine/schema/src/com/cloud/storage/VolumeVO.java
+++ b/engine/schema/src/com/cloud/storage/VolumeVO.java
@@@ -601,6 -597,10 +597,11 @@@ public class VolumeVO implements Volum
      @Override
      public Integer getHypervisorSnapshotReserve() {
          return hypervisorSnapshotReserve;
 +
      }
+ 
+     @Override
+     public IAMEntityType getEntityType() {
+         return IAMEntityType.Volume;
+     }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/upgrade/dao/Upgrade430to440.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/vm/VMInstanceVO.java
----------------------------------------------------------------------
diff --cc engine/schema/src/com/cloud/vm/VMInstanceVO.java
index a09c34f,437db54..ddeebfe
--- a/engine/schema/src/com/cloud/vm/VMInstanceVO.java
+++ b/engine/schema/src/com/cloud/vm/VMInstanceVO.java
@@@ -537,5 -536,9 +541,4 @@@ public class VMInstanceVO implements Vi
      public void setPowerHostId(Long hostId) {
          powerHostId = hostId;
      }
--
 -    @Override
 -    public IAMEntityType getEntityType() {
 -        return IAMEntityType.VirtualMachine;
 -    }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/engine/schema/src/com/cloud/vm/dao/NicIpAliasVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/framework/db/src/com/cloud/utils/db/SearchBase.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/plugins/network-elements/f5/src/com/cloud/api/commands/ListF5LoadBalancerNetworksCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/plugins/network-elements/juniper-srx/src/com/cloud/api/commands/ListSrxFirewallNetworksCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/plugins/network-elements/netscaler/src/com/cloud/api/commands/ListNetscalerLoadBalancerNetworksCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/ListNiciraNvpDeviceNetworksCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/plugins/network-elements/palo-alto/src/com/cloud/api/commands/ListPaloAltoFirewallNetworksCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/plugins/user-authenticators/ldap/src/org/apache/cloudstack/api/command/LdapCreateAccountCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/api/ApiDispatcher.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiServer.java
index 158a897,05fe6e8..5ab65f4
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@@ -379,7 -382,13 +386,13 @@@ public class ApiServer extends ManagerB
  
                      // This is where the command is either serialized, or directly dispatched
                      response = queueCommand(cmdObj, paramMap);
+                     if (annotation.responseHasSensitiveInfo())
+                     {
+                         buildAuditTrail(auditTrailSb, command[0],
+                                 StringUtils.cleanString(response));
+                     }
+                     else
 -                        buildAuditTrail(auditTrailSb, command[0], response);
 +                    buildAuditTrail(auditTrailSb, command[0], response);
                  } else {
                      if (!command[0].equalsIgnoreCase("login") && !command[0].equalsIgnoreCase("logout")) {
                          String errorString = "Unknown API command: " + command[0];

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/query/QueryManagerImpl.java
index e46e0f4,66794c0..564bf4e
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@@ -514,10 -508,15 +515,15 @@@ public class QueryManagerImpl extends M
          sb.and("archived", sb.entity().getArchived(), SearchCriteria.Op.EQ);
  
          SearchCriteria<EventJoinVO> sc = sb.create();
 +        SearchCriteria<EventJoinVO> aclSc = _eventJoinDao.createSearchCriteria();
 +        // building ACL search criteria
 +        _accountMgr.buildACLViewSearchCriteria(sc, aclSc, isRecursive, permittedDomains, permittedAccounts, permittedResources, listProjectResourcesCriteria);
  
+         // For end users display only enabled events
+         if(!_accountMgr.isRootAdmin(caller.getType())){
+             sc.setParameters("displayEvent", true);
+         }
+ 
 -        // building ACL condition
 -        _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
 -
          if (id != null) {
              sc.setParameters("id", id);
          }
@@@ -736,54 -719,90 +742,56 @@@
          boolean listAll = cmd.listAll();
          Long id = cmd.getId();
          Map<String, String> tags = cmd.getTags();
+         Boolean display = cmd.getDisplay();
 -
 -        Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject =
 -            new Ternary<Long, Boolean, ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
 -        _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, listAll, false);
 -        Long domainId = domainIdRecursiveListProject.first();
 +        Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<Long, Boolean, ListProjectResourcesCriteria>(
 +                cmd.getDomainId(), cmd.isRecursive(), null);
 +        _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedDomains, permittedAccounts, permittedResources,
 +                domainIdRecursiveListProject, listAll, false, "listVirtualMachines");
 +        //Long domainId = domainIdRecursiveListProject.first();
          Boolean isRecursive = domainIdRecursiveListProject.second();
          ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third();
  
 -        Criteria c = new Criteria("id", Boolean.TRUE, cmd.getStartIndex(), cmd.getPageSizeVal());
 -        // Criteria c = new Criteria(null, Boolean.FALSE, cmd.getStartIndex(),
 -        // cmd.getPageSizeVal()); //version without default sorting
 -        c.addCriteria(Criteria.KEYWORD, cmd.getKeyword());
 -        c.addCriteria(Criteria.ID, cmd.getId());
 -        c.addCriteria(Criteria.NAME, cmd.getName());
 -        c.addCriteria(Criteria.STATE, cmd.getState());
 -        c.addCriteria(Criteria.DATACENTERID, cmd.getZoneId());
 -        c.addCriteria(Criteria.GROUPID, cmd.getGroupId());
 -        c.addCriteria(Criteria.FOR_VIRTUAL_NETWORK, cmd.getForVirtualNetwork());
 -        c.addCriteria(Criteria.NETWORKID, cmd.getNetworkId());
 -        c.addCriteria(Criteria.TEMPLATE_ID, cmd.getTemplateId());
 -        c.addCriteria(Criteria.ISO_ID, cmd.getIsoId());
 -        c.addCriteria(Criteria.VPC_ID, cmd.getVpcId());
 -        c.addCriteria(Criteria.AFFINITY_GROUP_ID, cmd.getAffinityGroupId());
 -        c.addCriteria(Criteria.SERVICE_OFFERING_ID, cmd.getServiceOfferingId());
 -        c.addCriteria(Criteria.DISPLAY, cmd.getDisplay());
 -
 -        if (domainId != null) {
 -            c.addCriteria(Criteria.DOMAINID, domainId);
 -        }
 +        Filter searchFilter = new Filter(UserVmJoinVO.class, "id", true, cmd.getStartIndex(),
 +                cmd.getPageSizeVal());
  
 -        if (HypervisorType.getType(hypervisor) != HypervisorType.None) {
 -            c.addCriteria(Criteria.HYPERVISOR, hypervisor);
 -        } else if (hypervisor != null) {
 -            throw new InvalidParameterValueException("Invalid HypervisorType " + hypervisor);
 -        }
 +        // first search distinct vm id by using query criteria and pagination
 +        SearchBuilder<UserVmJoinVO> sb = _userVmJoinDao.createSearchBuilder();
 +        sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct ids
  
 -        // ignore these search requests if it's not an admin
 +        String hypervisor = cmd.getHypervisor();
 +        Object name = cmd.getName();
 +        Object state = cmd.getState();
 +        Object zoneId = cmd.getZoneId();
 +        Object keyword = cmd.getKeyword();
 +        boolean isAdmin = false;
 +        boolean isRootAdmin = false;
          if (_accountMgr.isAdmin(caller.getType())) {
 -            c.addCriteria(Criteria.PODID, cmd.getPodId());
 -            c.addCriteria(Criteria.HOSTID, cmd.getHostId());
 -            c.addCriteria(Criteria.STORAGE_ID, cmd.getStorageId());
 +            isAdmin = true;
          }
 -
 -        if (!permittedAccounts.isEmpty()) {
 -            c.addCriteria(Criteria.ACCOUNTID, permittedAccounts.toArray());
 +        if (_accountMgr.isRootAdmin(caller.getId())) {
 +            isRootAdmin = true;
          }
 -        c.addCriteria(Criteria.ISADMIN, _accountMgr.isAdmin(caller.getType()));
  
 -        return searchForUserVMsByCriteria(c, caller, domainId, isRecursive, permittedAccounts, listAll, listProjectResourcesCriteria, tags);
 -    }
 -
 -    private Pair<List<UserVmJoinVO>, Integer> searchForUserVMsByCriteria(Criteria c, Account caller, Long domainId, boolean isRecursive, List<Long> permittedAccounts,
 -        boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags) {
 -        Filter searchFilter = new Filter(UserVmJoinVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit());
 -        boolean isRootAdmin = _accountMgr.isRootAdmin(caller.getType());
 -
 -        // first search distinct vm id by using query criteria and pagination
 -        SearchBuilder<UserVmJoinVO> sb = _userVmJoinDao.createSearchBuilder();
 -        sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct
 -        // ids
 -        _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
 -
 -        Object id = c.getCriteria(Criteria.ID);
 -        Object name = c.getCriteria(Criteria.NAME);
 -        Object state = c.getCriteria(Criteria.STATE);
 -        Object notState = c.getCriteria(Criteria.NOTSTATE);
 -        Object zoneId = c.getCriteria(Criteria.DATACENTERID);
 -        Object pod = c.getCriteria(Criteria.PODID);
 -        Object hostId = c.getCriteria(Criteria.HOSTID);
 -        Object hostName = c.getCriteria(Criteria.HOSTNAME);
 -        Object keyword = c.getCriteria(Criteria.KEYWORD);
 -        Object isAdmin = c.getCriteria(Criteria.ISADMIN);
 -        assert c.getCriteria(Criteria.IPADDRESS) == null : "We don't support search by ip address on VM any more.  If you see this assert, it means we have to find a different way to search by the nic table.";
 -        Object groupId = c.getCriteria(Criteria.GROUPID);
 -        Object networkId = c.getCriteria(Criteria.NETWORKID);
 -        Object hypervisor = c.getCriteria(Criteria.HYPERVISOR);
 -        Object storageId = c.getCriteria(Criteria.STORAGE_ID);
 -        Object templateId = c.getCriteria(Criteria.TEMPLATE_ID);
 -        Object isoId = c.getCriteria(Criteria.ISO_ID);
 -        Object vpcId = c.getCriteria(Criteria.VPC_ID);
 -        Object affinityGroupId = c.getCriteria(Criteria.AFFINITY_GROUP_ID);
 -        Object serviceOffId = c.getCriteria(Criteria.SERVICE_OFFERING_ID);
 -        Object display = c.getCriteria(Criteria.DISPLAY);
 +        Object groupId = cmd.getGroupId();
 +        Object networkId = cmd.getNetworkId();
 +        if (HypervisorType.getType(hypervisor) == HypervisorType.None && hypervisor != null) {
 +            // invalid hypervisor type input
 +            throw new InvalidParameterValueException("Invalid HypervisorType " + hypervisor);
 +        }
 +        Object templateId = cmd.getTemplateId();
 +        Object isoId = cmd.getIsoId();
 +        Object vpcId = cmd.getVpcId();
 +        Object affinityGroupId = cmd.getAffinityGroupId();
++        Object serviceOffId = cmd.getServiceOfferingId();
 +        Object pod = null;
 +        Object hostId = null;
 +        Object storageId = null;
 +        if (cmd instanceof ListVMsCmdByAdmin) {
 +            ListVMsCmdByAdmin adCmd = (ListVMsCmdByAdmin)cmd;
 +            pod = adCmd.getPodId();
 +            hostId = adCmd.getHostId();
 +            storageId = adCmd.getStorageId();
 +        }
  
          sb.and("displayName", sb.entity().getDisplayName(), SearchCriteria.Op.LIKE);
          sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
@@@ -1624,16 -1636,21 +1646,18 @@@
          String keyword = cmd.getKeyword();
          String type = cmd.getType();
          Map<String, String> tags = cmd.getTags();
 -        boolean isRootAdmin = _accountMgr.isRootAdmin(caller.getType());
          Long storageId = cmd.getStorageId();
+         Long diskOffId = cmd.getDiskOfferingId();
+         Boolean display = cmd.getDisplay();
  
          Long zoneId = cmd.getZoneId();
 -        Long podId = null;
 -        if (_accountMgr.isAdmin(caller.getType())) {
 -            podId = cmd.getPodId();
 -        }
 +        Long podId = cmd.getPodId();
  
 -        Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject =
 -            new Ternary<Long, Boolean, ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
 -        _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false);
 -        Long domainId = domainIdRecursiveListProject.first();
 +        Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<Long, Boolean, ListProjectResourcesCriteria>(
 +                cmd.getDomainId(), cmd.isRecursive(), null);
 +        _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedDomains, permittedAccounts, permittedResources,
 +                domainIdRecursiveListProject, cmd.listAll(), false, "listVolumes");
 +//        Long domainId = domainIdRecursiveListProject.first();
          Boolean isRecursive = domainIdRecursiveListProject.second();
          ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third();
          Filter searchFilter = new Filter(VolumeJoinVO.class, "created", false, cmd.getStartIndex(), cmd.getPageSizeVal());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/api/query/vo/EventJoinVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/api/query/vo/VolumeJoinVO.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/query/vo/VolumeJoinVO.java
index 9685d02,ce26c1f..289b0b8
--- a/server/src/com/cloud/api/query/vo/VolumeJoinVO.java
+++ b/server/src/com/cloud/api/query/vo/VolumeJoinVO.java
@@@ -569,6 -572,10 +572,11 @@@ public class VolumeJoinVO extends BaseV
          return path;
      }
  
++
+     public String getChainInfo() {
+         return chainInfo;
+     }
+ 
      @Override
      public IAMEntityType getEntityType() {
          return IAMEntityType.Volume;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/api/response/ApiResponseSerializer.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/response/ApiResponseSerializer.java
index c254520,e9633a7..482834a
--- a/server/src/com/cloud/api/response/ApiResponseSerializer.java
+++ b/server/src/com/cloud/api/response/ApiResponseSerializer.java
@@@ -26,11 -26,7 +26,12 @@@ import java.util.List
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
 +import org.apache.log4j.Logger;
 +
 +import com.google.gson.Gson;
 +import com.google.gson.annotations.SerializedName;
 +
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseCmd;
  import org.apache.cloudstack.api.ResponseObject;
@@@ -39,6 -35,8 +40,7 @@@ import org.apache.cloudstack.api.respon
  import org.apache.cloudstack.api.response.ExceptionResponse;
  import org.apache.cloudstack.api.response.ListResponse;
  import org.apache.cloudstack.api.response.SuccessResponse;
+ import org.apache.cloudstack.context.CallContext;
 -import org.apache.log4j.Logger;
  
  import com.cloud.api.ApiDBUtils;
  import com.cloud.api.ApiResponseGsonHelper;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/network/IpAddressManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/IpAddressManagerImpl.java
index dbec06f,8903d1d..5905fd3
--- a/server/src/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/com/cloud/network/IpAddressManagerImpl.java
@@@ -638,14 -643,14 +643,14 @@@ public class IpAddressManagerImpl exten
  
      @Override
      public PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp, boolean isSystem)
 -            throws InsufficientAddressCapacityException {
 +        throws InsufficientAddressCapacityException {
-         return fetchNewPublicIp(dcId, podId, null, owner, type, networkId, false, true, requestedIp, isSystem, null);
+         return fetchNewPublicIp(dcId, podId, null, owner, type, networkId, false, true, requestedIp, isSystem, null, null);
      }
  
      @Override
      public PublicIp assignPublicIpAddressFromVlans(long dcId, Long podId, Account owner, VlanType type, List<Long> vlanDbIds, Long networkId, String requestedIp, boolean isSystem)
 -            throws InsufficientAddressCapacityException {
 +        throws InsufficientAddressCapacityException {
-         return fetchNewPublicIp(dcId, podId, vlanDbIds, owner, type, networkId, false, true, requestedIp, isSystem, null);
+         return fetchNewPublicIp(dcId, podId, vlanDbIds, owner, type, networkId, false, true, requestedIp, isSystem, null, null);
      }
  
      @DB
@@@ -654,129 -660,132 +660,132 @@@
          IPAddressVO addr = Transaction.execute(new TransactionCallbackWithException<IPAddressVO, InsufficientAddressCapacityException>() {
              @Override
              public IPAddressVO doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
 -                StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in ");
 -                boolean fetchFromDedicatedRange = false;
 -                List<Long> dedicatedVlanDbIds = new ArrayList<Long>();
 -                List<Long> nonDedicatedVlanDbIds = new ArrayList<Long>();
 -
 -                SearchCriteria<IPAddressVO> sc = null;
 -                if (podId != null) {
 -                    sc = AssignIpAddressFromPodVlanSearch.create();
 -                    sc.setJoinParameters("podVlanMapSB", "podId", podId);
 -                    errorMessage.append(" pod id=" + podId);
 -                } else {
 -                    sc = AssignIpAddressSearch.create();
 -                    errorMessage.append(" zone id=" + dcId);
 -                }
 +        StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in ");
 +        boolean fetchFromDedicatedRange = false;
 +        List<Long> dedicatedVlanDbIds = new ArrayList<Long>();
 +        List<Long> nonDedicatedVlanDbIds = new ArrayList<Long>();
 +
 +        SearchCriteria<IPAddressVO> sc = null;
 +        if (podId != null) {
 +            sc = AssignIpAddressFromPodVlanSearch.create();
 +            sc.setJoinParameters("podVlanMapSB", "podId", podId);
 +            errorMessage.append(" pod id=" + podId);
 +        } else {
 +            sc = AssignIpAddressSearch.create();
 +            errorMessage.append(" zone id=" + dcId);
 +        }
  
 -                // If owner has dedicated Public IP ranges, fetch IP from the dedicated range
 -                // Otherwise fetch IP from the system pool
 -                List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(owner.getId());
 -                for (AccountVlanMapVO map : maps) {
 -                    if (vlanDbIds == null || vlanDbIds.contains(map.getVlanDbId()))
 -                        dedicatedVlanDbIds.add(map.getVlanDbId());
 -                }
 -                List<VlanVO> nonDedicatedVlans = _vlanDao.listZoneWideNonDedicatedVlans(dcId);
 -                for (VlanVO nonDedicatedVlan : nonDedicatedVlans) {
 -                    if (vlanDbIds == null || vlanDbIds.contains(nonDedicatedVlan.getId()))
 -                        nonDedicatedVlanDbIds.add(nonDedicatedVlan.getId());
 -                }
 -                if (dedicatedVlanDbIds != null && !dedicatedVlanDbIds.isEmpty()) {
 -                    fetchFromDedicatedRange = true;
 -                    sc.setParameters("vlanId", dedicatedVlanDbIds.toArray());
 +        // If owner has dedicated Public IP ranges, fetch IP from the dedicated range
 +        // Otherwise fetch IP from the system pool
 +        List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(owner.getId());
 +        for (AccountVlanMapVO map : maps) {
 +            if (vlanDbIds == null || vlanDbIds.contains(map.getVlanDbId()))
 +                dedicatedVlanDbIds.add(map.getVlanDbId());
 +        }
 +        List<VlanVO> nonDedicatedVlans = _vlanDao.listZoneWideNonDedicatedVlans(dcId);
 +        for (VlanVO nonDedicatedVlan : nonDedicatedVlans) {
 +            if (vlanDbIds == null || vlanDbIds.contains(nonDedicatedVlan.getId()))
 +                nonDedicatedVlanDbIds.add(nonDedicatedVlan.getId());
 +        }
 +        if (dedicatedVlanDbIds != null && !dedicatedVlanDbIds.isEmpty()) {
 +            fetchFromDedicatedRange = true;
 +            sc.setParameters("vlanId", dedicatedVlanDbIds.toArray());
-                     errorMessage.append(", vlanId id=" + dedicatedVlanDbIds.toArray());
+                     errorMessage.append(", vlanId id=" + Arrays.toString(dedicatedVlanDbIds.toArray()));
 -                } else if (nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
 -                    sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
 +        } else if (nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
 +            sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
                      errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
 -                } else {
 -                    if (podId != null) {
 -                        InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
 -                        ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
 -                        throw ex;
 -                    }
 -                    s_logger.warn(errorMessage.toString());
 -                    InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
 -                    ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
 -                    throw ex;
 -                }
 +        } else {
 +            if (podId != null) {
 +                InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
 +                ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
 +                throw ex;
 +            }
 +            s_logger.warn(errorMessage.toString());
 +            InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
 +            ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
 +            throw ex;
 +        }
  
 -                sc.setParameters("dc", dcId);
 +        sc.setParameters("dc", dcId);
  
 -                DataCenter zone = _entityMgr.findById(DataCenter.class, dcId);
 +        DataCenter zone = _entityMgr.findById(DataCenter.class, dcId);
  
 -                // for direct network take ip addresses only from the vlans belonging to the network
 -                if (vlanUse == VlanType.DirectAttached) {
 -                    sc.setJoinParameters("vlan", "networkId", guestNetworkId);
 -                    errorMessage.append(", network id=" + guestNetworkId);
 -                }
 -                sc.setJoinParameters("vlan", "type", vlanUse);
 +        // for direct network take ip addresses only from the vlans belonging to the network
 +        if (vlanUse == VlanType.DirectAttached) {
 +            sc.setJoinParameters("vlan", "networkId", guestNetworkId);
 +            errorMessage.append(", network id=" + guestNetworkId);
 +        }
 +        sc.setJoinParameters("vlan", "type", vlanUse);
  
 -                if (requestedIp != null) {
 -                    sc.addAnd("address", SearchCriteria.Op.EQ, requestedIp);
 -                    errorMessage.append(": requested ip " + requestedIp + " is not available");
 -                }
 +        if (requestedIp != null) {
 +            sc.addAnd("address", SearchCriteria.Op.EQ, requestedIp);
 +            errorMessage.append(": requested ip " + requestedIp + " is not available");
 +        }
  
 -                Filter filter = new Filter(IPAddressVO.class, "vlanId", true, 0l, 1l);
 +        Filter filter = new Filter(IPAddressVO.class, "vlanId", true, 0l, 1l);
  
 -                List<IPAddressVO> addrs = _ipAddressDao.lockRows(sc, filter, true);
 +        List<IPAddressVO> addrs = _ipAddressDao.lockRows(sc, filter, true);
  
 -                // If all the dedicated IPs of the owner are in use fetch an IP from the system pool
 -                if (addrs.size() == 0 && fetchFromDedicatedRange) {
 -                    // Verify if account is allowed to acquire IPs from the system
 -                    boolean useSystemIps = UseSystemPublicIps.valueIn(owner.getId());
 -                    if (useSystemIps && nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
 -                        fetchFromDedicatedRange = false;
 -                        sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
 +        // If all the dedicated IPs of the owner are in use fetch an IP from the system pool
 +        if (addrs.size() == 0 && fetchFromDedicatedRange) {
 +            // Verify if account is allowed to acquire IPs from the system
 +            boolean useSystemIps = UseSystemPublicIps.valueIn(owner.getId());
 +            if (useSystemIps && nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
 +                fetchFromDedicatedRange = false;
 +                sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
                          errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
 -                        addrs = _ipAddressDao.lockRows(sc, filter, true);
 -                    }
 -                }
 +                addrs = _ipAddressDao.lockRows(sc, filter, true);
 +            }
 +        }
  
 -                if (addrs.size() == 0) {
 -                    if (podId != null) {
 -                        InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
 -                        // for now, we hardcode the table names, but we should ideally do a lookup for the tablename from the VO object.
 -                        ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
 -                        throw ex;
 -                    }
 -                    s_logger.warn(errorMessage.toString());
 -                    InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
 -                    ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
 -                    throw ex;
 -                }
 +        if (addrs.size() == 0) {
 +            if (podId != null) {
 +                InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
 +                // for now, we hardcode the table names, but we should ideally do a lookup for the tablename from the VO object.
 +                ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
 +                throw ex;
 +            }
 +            s_logger.warn(errorMessage.toString());
 +            InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
 +            ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
 +            throw ex;
 +        }
  
 -                assert (addrs.size() == 1) : "Return size is incorrect: " + addrs.size();
 +        assert (addrs.size() == 1) : "Return size is incorrect: " + addrs.size();
  
 -                if (!fetchFromDedicatedRange) {
 -                    // Check that the maximum number of public IPs for the given accountId will not be exceeded
 -                    try {
 -                        _resourceLimitMgr.checkResourceLimit(owner, ResourceType.public_ip);
 -                    } catch (ResourceAllocationException ex) {
 -                        s_logger.warn("Failed to allocate resource of type " + ex.getResourceType() + " for account " + owner);
 -                        throw new AccountLimitException("Maximum number of public IP addresses for account: " + owner.getAccountName() + " has been exceeded.");
 -                    }
 -                }
 +        if (!fetchFromDedicatedRange) {
 +            // Check that the maximum number of public IPs for the given accountId will not be exceeded
 +            try {
 +                _resourceLimitMgr.checkResourceLimit(owner, ResourceType.public_ip);
 +            } catch (ResourceAllocationException ex) {
 +                s_logger.warn("Failed to allocate resource of type " + ex.getResourceType() + " for account " + owner);
 +                throw new AccountLimitException("Maximum number of public IP addresses for account: " + owner.getAccountName() + " has been exceeded.");
 +            }
 +        }
  
 -                IPAddressVO addr = addrs.get(0);
 -                addr.setSourceNat(sourceNat);
 -                addr.setAllocatedTime(new Date());
 -                addr.setAllocatedInDomainId(owner.getDomainId());
 -                addr.setAllocatedToAccountId(owner.getId());
 -                addr.setSystem(isSystem);
 +        IPAddressVO addr = addrs.get(0);
 +        addr.setSourceNat(sourceNat);
 +        addr.setAllocatedTime(new Date());
 +        addr.setAllocatedInDomainId(owner.getDomainId());
 +        addr.setAllocatedToAccountId(owner.getId());
 +        addr.setSystem(isSystem);
+                 if (displayIp != null) {
+                     addr.setDisplay(displayIp);
+                 }
  
 -                if (assign) {
 -                    markPublicIpAsAllocated(addr);
 -                } else {
 -                    addr.setState(IpAddress.State.Allocating);
 -                }
 -                addr.setState(assign ? IpAddress.State.Allocated : IpAddress.State.Allocating);
 +        if (assign) {
 +            markPublicIpAsAllocated(addr);
 +        } else {
 +            addr.setState(IpAddress.State.Allocating);
 +        }
 +        addr.setState(assign ? IpAddress.State.Allocated : IpAddress.State.Allocating);
  
 -                if (vlanUse != VlanType.DirectAttached) {
 -                    addr.setAssociatedWithNetworkId(guestNetworkId);
 -                    addr.setVpcId(vpcId);
 -                }
 +        if (vlanUse != VlanType.DirectAttached) {
 +            addr.setAssociatedWithNetworkId(guestNetworkId);
 +            addr.setVpcId(vpcId);
 +        }
  
 -                _ipAddressDao.update(addr.getId(), addr);
 +        _ipAddressDao.update(addr.getId(), addr);
  
                  return addr;
              }
@@@ -861,21 -870,29 +870,29 @@@
                  public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
                      Account owner = _accountDao.acquireInLockTable(ownerId);
  
 -                    if (owner == null) {
 -                        // this ownerId comes from owner or type Account. See the class "AccountVO" and the annotations in that class
 -                        // to get the table name and field name that is queried to fill this ownerid.
 -                        ConcurrentOperationException ex = new ConcurrentOperationException("Unable to lock account");
 -                        throw ex;
 -                    }
 -                    if (s_logger.isDebugEnabled()) {
 -                        s_logger.debug("lock account " + ownerId + " is acquired");
 -                    }
 +            if (owner == null) {
 +                // this ownerId comes from owner or type Account. See the class "AccountVO" and the annotations in that class
 +                // to get the table name and field name that is queried to fill this ownerid.
 +                ConcurrentOperationException ex = new ConcurrentOperationException("Unable to lock account");
 +                throw ex;
 +            }
 +            if (s_logger.isDebugEnabled()) {
 +                s_logger.debug("lock account " + ownerId + " is acquired");
 +            }
+                     boolean displayIp = true;
+                     if (guestNtwkId != null) {
+                         Network ntwk = _networksDao.findById(guestNtwkId);
+                         displayIp = ntwk.getDisplayNetwork();
+                     } else if (vpcId != null) {
+                         VpcVO vpc = _vpcDao.findById(vpcId);
+                         displayIp = vpc.isDisplay();
+                     }
  
-                     PublicIp ip = fetchNewPublicIp(dcId, null, null, owner, VlanType.VirtualNetwork, guestNtwkId, isSourceNat, false, null, false, vpcId);
+                     PublicIp ip = fetchNewPublicIp(dcId, null, null, owner, VlanType.VirtualNetwork, guestNtwkId, isSourceNat, false, null, false, vpcId, displayIp);
 -                    IPAddressVO publicIp = ip.ip();
 +            IPAddressVO publicIp = ip.ip();
  
 -                    markPublicIpAsAllocated(publicIp);
 -                    _ipAddressDao.update(publicIp.getId(), publicIp);
 +            markPublicIpAsAllocated(publicIp);
 +            _ipAddressDao.update(publicIp.getId(), publicIp);
  
                      return ip;
                  }
@@@ -973,8 -990,9 +990,9 @@@
  
      @DB
      @Override
-     public IpAddress allocateIp(final Account ipOwner, final boolean isSystem, Account caller, long callerUserId, final DataCenter zone) throws ConcurrentOperationException,
+     public IpAddress allocateIp(final Account ipOwner, final boolean isSystem, Account caller, long callerUserId, final DataCenter zone, final Boolean displayIp)
+             throws ConcurrentOperationException,
 -            ResourceAllocationException, InsufficientAddressCapacityException {
 +        ResourceAllocationException, InsufficientAddressCapacityException {
  
          final VlanType vlanType = VlanType.VirtualNetwork;
          final boolean assign = false;
@@@ -1006,18 -1024,18 +1024,18 @@@
              ip = Transaction.execute(new TransactionCallbackWithException<PublicIp, InsufficientAddressCapacityException>() {
                  @Override
                  public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
-                     PublicIp ip = fetchNewPublicIp(zone.getId(), null, null, ipOwner, vlanType, null, false, assign, null, isSystem, null);
+                     PublicIp ip = fetchNewPublicIp(zone.getId(), null, null, ipOwner, vlanType, null, false, assign, null, isSystem, null, displayIp);
  
 -                    if (ip == null) {
 +            if (ip == null) {
                          InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Unable to find available public IP addresses", DataCenter.class, zone
                                  .getId());
 -                        ex.addProxyObject(ApiDBUtils.findZoneById(zone.getId()).getUuid());
 -                        throw ex;
 -                    }
 -                    CallContext.current().setEventDetails("Ip Id: " + ip.getId());
 -                    Ip ipAddress = ip.getAddress();
 +                ex.addProxyObject(ApiDBUtils.findZoneById(zone.getId()).getUuid());
 +                throw ex;
 +            }
 +            CallContext.current().setEventDetails("Ip Id: " + ip.getId());
 +            Ip ipAddress = ip.getAddress();
  
 -                    s_logger.debug("Got " + ipAddress + " to assign for account " + ipOwner.getId() + " in zone " + zone.getId());
 +            s_logger.debug("Got " + ipAddress + " to assign for account " + ipOwner.getId() + " in zone " + zone.getId());
  
                      return ip;
                  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/NetworkServiceImpl.java
index 41cc2ed,ebeb31a..828e6bb
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@@ -3601,17 -3593,19 +3598,19 @@@ public class NetworkServiceImpl extend
  
              // For public traffic, get isolation method of physical network and update the public network accordingly
              // each broadcast type will individually need to be qualified for support of public traffic
+             if (TrafficType.Public.equals(trafficType)){
 -                List<String> isolationMethods = network.getIsolationMethods();
 -                if ((isolationMethods.size() == 1 && isolationMethods.get(0).toLowerCase().equals("vxlan"))
 -                        || (isolationMethod != null && isolationMethods.contains(isolationMethod) && isolationMethod.toLowerCase().equals("vxlan"))) {
 -                    // find row in networks table that is defined as 'Public', created when zone was deployed
 -                    NetworkVO publicNetwork = _networksDao.listByZoneAndTrafficType(network.getDataCenterId(),TrafficType.Public).get(0);
 -                    if (publicNetwork != null) {
 -                        s_logger.debug("setting public network " + publicNetwork + " to broadcast type vxlan");
 -                        publicNetwork.setBroadcastDomainType(BroadcastDomainType.Vxlan);
 -                        _networksDao.persist(publicNetwork);
 -                    }
 +            List<String> isolationMethods = network.getIsolationMethods();
 +            if ((isolationMethods.size() == 1 && isolationMethods.get(0).toLowerCase().equals("vxlan"))
 +                || (isolationMethod != null && isolationMethods.contains(isolationMethod) && isolationMethod.toLowerCase().equals("vxlan"))) {
 +                // find row in networks table that is defined as 'Public', created when zone was deployed
 +                NetworkVO publicNetwork = _networksDao.listByZoneAndTrafficType(network.getDataCenterId(),TrafficType.Public).get(0);
 +                if (publicNetwork != null) {
 +                    s_logger.debug("setting public network " + publicNetwork + " to broadcast type vxlan");
 +                    publicNetwork.setBroadcastDomainType(BroadcastDomainType.Vxlan);
 +                    _networksDao.persist(publicNetwork);
                  }
              }
++            }
  
              return pNetworktrafficType;
          } catch (Exception ex) {
@@@ -4018,14 -4012,14 +4017,14 @@@
          Long nicId = cmd.getNicId();
          long vmId = cmd.getVmId();
          Long networkId = cmd.getNetworkId();
- 
 -        UserVmVO userVm = _userVmDao.findById(vmId);
 +        UserVmVO  userVm = _userVmDao.findById(vmId);
  
-         if (userVm == null) {
+         if (userVm == null || (!userVm.isDisplayVm() && caller.getType() == Account.ACCOUNT_TYPE_NORMAL)) {
 -            InvalidParameterValueException ex = new InvalidParameterValueException("Virtual mahine id does not exist");
 +                InvalidParameterValueException ex = new InvalidParameterValueException("Virtual mahine id does not exist");
              ex.addProxyObject(Long.valueOf(vmId).toString(), "vmId");
 -            throw ex;
 -        }
 +                throw ex;
 +            }
+ 
          _accountMgr.checkAccess(caller, null, true, userVm);
          return _networkMgr.listVmNics(vmId, nicId, networkId);
      }


[37/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
A typo that leads to opposite decision on determine whether or not to notify out-of-band VM state changes.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/4399e245
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/4399e245
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/4399e245

Branch: refs/heads/distributedrouter
Commit: 4399e245f4761a6936e3635881db939857850247
Parents: 42d6373
Author: Kelven Yang <ke...@gmail.com>
Authored: Thu Mar 13 16:55:12 2014 -0700
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Mar 13 17:17:15 2014 -0700

----------------------------------------------------------------------
 .../orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4399e245/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index e344001..e9d2fd2 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -4100,7 +4100,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
                 VirtualMachine.Type.Instance, vmId);
-        if (pendingWorkJobs.size() == 0 || _haMgr.hasPendingHaWork(vmId)) {
+        if (pendingWorkJobs.size() == 0 || !_haMgr.hasPendingHaWork(vmId)) {
             // there is no pending operation job
             VMInstanceVO vm = _vmDao.findById(vmId);
             if (vm != null) {


[10/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Use IAMService to populate group-account association for system/admin
account to solve unit test failure.

Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f2d4b4d6
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f2d4b4d6
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f2d4b4d6

Branch: refs/heads/distributedrouter
Commit: f2d4b4d60e46a9c847947c758e490365f2008ee8
Parents: b554d4a
Author: Min Chen <mi...@citrix.com>
Authored: Tue Mar 11 16:31:03 2014 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Tue Mar 11 16:31:03 2014 -0700

----------------------------------------------------------------------
 .../cloudstack/iam/IAMApiServiceImpl.java       | 102 +++----------------
 1 file changed, 13 insertions(+), 89 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f2d4b4d6/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java b/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
index 9e941f2..69f669c 100644
--- a/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
+++ b/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
@@ -16,9 +16,6 @@
 // under the License.
 package org.apache.cloudstack.iam;
 
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -114,11 +111,6 @@ import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
-import com.cloud.utils.db.Transaction;
-import com.cloud.utils.db.TransactionCallbackNoReturn;
-import com.cloud.utils.db.TransactionLegacy;
-import com.cloud.utils.db.TransactionStatus;
-import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.InstanceGroupVO;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.dao.NicIpAliasVO;
@@ -199,10 +191,6 @@ public class IAMApiServiceImpl extends ManagerBase implements IAMApiService, Man
     @Override
     public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
 
-        // populate group <-> account association if not present for CS admin
-        // and system accounts
-        populateIAMGroupAdminAccountMap();
-
         _messageBus.subscribe(AccountManager.MESSAGE_ADD_ACCOUNT_EVENT, new MessageSubscriber() {
             @Override
             public void onPublishMessage(String senderAddress, String subject, Object obj) {
@@ -351,86 +339,22 @@ public class IAMApiServiceImpl extends ManagerBase implements IAMApiService, Man
         return super.configure(name, params);
     }
 
-    private void populateIAMGroupAdminAccountMap() {
-
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
-                TransactionLegacy txn = TransactionLegacy.currentTxn();
-
-                String searchQuery = "Select id from `cloud`.`iam_group_account_map` where account_id = ? and removed is null";
-                ResultSet rs = null;
-                PreparedStatement acctQuery = null;
-                PreparedStatement acctInsert = null;
-                // find if the system account is present in the map
-                try {
-                    acctQuery = txn.prepareAutoCloseStatement(searchQuery);
-                    acctQuery.setLong(1, Account.ACCOUNT_ID_SYSTEM);
-
-                    rs = acctQuery.executeQuery();
-                    if (!rs.next()) {
-                        acctInsert = txn
-                                .prepareAutoCloseStatement("INSERT INTO `cloud`.`iam_group_account_map` (group_id, account_id, created) values(?, ?, Now())");
-                        // insert entry in iam_group_account_map table
-                        acctInsert.setLong(1, Account.ACCOUNT_TYPE_ADMIN + 1);
-                        acctInsert.setLong(2, Account.ACCOUNT_ID_SYSTEM);
-                        acctInsert.executeUpdate();
-                    }
-                } catch (SQLException ex) {
-                    String msg = "Unable to populate iam_group_account_map for SYSTEM account." + ex.getMessage();
-                    s_logger.error(msg);
-                    throw new CloudRuntimeException(msg, ex);
-                } finally {
-                    try {
-                        if (acctInsert != null) {
-                            acctInsert.close();
-                        }
-                        if (rs != null) {
-                            rs.close();
-                        }
-                        if (acctQuery != null) {
-                            acctQuery.close();
-                        }
-                    } catch (SQLException e) {
-                    }
-                }
+    @Override
+    public boolean start() {
+        s_logger.info("Populating IAM group and account association for default accounts...");
 
-                // find if the admin account is present in the map
-                try {
-                    acctQuery = txn.prepareAutoCloseStatement(searchQuery);
-                    acctQuery.setLong(1, Account.ACCOUNT_ID_SYSTEM + 1);
-
-                    rs = acctQuery.executeQuery();
-                    if (!rs.next()) {
-                        acctInsert = txn
-                                .prepareAutoCloseStatement("INSERT INTO `cloud`.`iam_group_account_map` (group_id, account_id, created) values(?, ?, Now())");
-                        // insert entry in iam_group_account_map table
-                        acctInsert.setLong(1, Account.ACCOUNT_TYPE_ADMIN + 1);
-                        acctInsert.setLong(2, Account.ACCOUNT_ID_SYSTEM + 1);
-                        acctInsert.executeUpdate();
-                    }
-                } catch (SQLException ex) {
-                    String msg = "Unable to populate iam_group_account_map for Admin account." + ex.getMessage();
-                    s_logger.error(msg);
-                    throw new CloudRuntimeException(msg, ex);
-                } finally {
-                    try {
-                        if (acctInsert != null) {
-                            acctInsert.close();
-                        }
-                        if (rs != null) {
-                            rs.close();
-                        }
-                        if (acctQuery != null) {
-                            acctQuery.close();
-                        }
-                    } catch (SQLException e) {
-                    }
-                }
+        // populate group <-> account association if not present for CS admin
+        // and system accounts
+        populateIAMGroupAdminAccountMap();
 
-            }
-        });
+        return true;
+    }
 
+    private void populateIAMGroupAdminAccountMap() {
+        List<Long> sysAccts = new ArrayList<Long>();
+        sysAccts.add(Account.ACCOUNT_ID_SYSTEM);
+        sysAccts.add(Account.ACCOUNT_ID_SYSTEM + 1);
+        _iamSrv.addAccountsToGroup(sysAccts, new Long(Account.ACCOUNT_TYPE_ADMIN + 1));
     }
 
     private void addDomainWideResourceAccess(Map<String, Object> params) {


[06/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Merge branch 'master' into rbac.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/48e08fe6
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/48e08fe6
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/48e08fe6

Branch: refs/heads/distributedrouter
Commit: 48e08fe676c40c968bccc417efe393ef254b4478
Parents: 695d689 63e3eea
Author: Min Chen <mi...@citrix.com>
Authored: Thu Mar 6 14:02:20 2014 -0800
Committer: Min Chen <mi...@citrix.com>
Committed: Thu Mar 6 14:02:20 2014 -0800

----------------------------------------------------------------------
 .../SYSCONFDIR/rc.d/init.d/cloud-agent.in       |     8 +-
 .../SYSCONFDIR/rc.d/init.d/cloud-agent.in       |     8 +-
 .../sles/SYSCONFDIR/init.d/cloud-agent.in       |     8 +-
 .../rhel/SYSCONFDIR/rc.d/init.d/cloud-agent.in  |     8 +-
 .../sles/SYSCONFDIR/init.d/cloud-agent.in       |     8 +-
 api/src/com/cloud/event/EventTypes.java         |     1 +
 api/src/com/cloud/network/IpAddress.java        |     2 +
 api/src/com/cloud/network/NetworkService.java   |     4 +-
 api/src/com/cloud/network/RemoteAccessVpn.java  |     2 +
 .../cloud/network/Site2SiteVpnConnection.java   |     2 +
 .../com/cloud/network/Site2SiteVpnGateway.java  |     5 +-
 .../com/cloud/network/as/AutoScaleVmGroup.java  |     2 +
 .../cloud/network/as/AutoScaleVmProfile.java    |     2 +
 .../cloud/network/firewall/FirewallService.java |     2 +-
 .../network/lb/LoadBalancingRulesService.java   |     5 +-
 .../com/cloud/network/rules/FirewallRule.java   |     2 +
 .../com/cloud/network/rules/RulesService.java   |     5 +-
 api/src/com/cloud/network/vpc/NetworkACL.java   |     2 +
 .../com/cloud/network/vpc/NetworkACLItem.java   |     2 +
 .../cloud/network/vpc/NetworkACLService.java    |     8 +-
 .../cloud/network/vpc/StaticRouteProfile.java   |     1 -
 api/src/com/cloud/network/vpc/Vpc.java          |     1 +
 api/src/com/cloud/network/vpc/VpcService.java   |     9 +-
 .../network/vpn/RemoteAccessVpnService.java     |     4 +-
 .../cloud/network/vpn/Site2SiteVpnService.java  |     4 +-
 api/src/com/cloud/serializer/Param.java         |     4 +
 api/src/com/cloud/server/ManagementService.java |     4 +-
 .../cloud/server/ResourceMetaDataService.java   |     3 +-
 api/src/com/cloud/storage/Storage.java          |     3 +-
 api/src/com/cloud/storage/Volume.java           |     2 +
 api/src/com/cloud/storage/VolumeApiService.java |     2 +-
 api/src/com/cloud/uservm/UserVm.java            |     1 +
 api/src/com/cloud/vm/VirtualMachine.java        |     5 +-
 .../apache/cloudstack/acl/SecurityChecker.java  |     1 +
 .../org/apache/cloudstack/api/APICommand.java   |     6 +-
 .../org/apache/cloudstack/api/ApiConstants.java |     2 +
 .../org/apache/cloudstack/api/BaseAsyncCmd.java |     6 +-
 api/src/org/apache/cloudstack/api/BaseCmd.java  |     8 +
 .../api/BaseListAccountResourcesCmd.java        |    12 +
 .../command/admin/account/CreateAccountCmd.java |     4 +-
 .../command/admin/account/DeleteAccountCmd.java |     5 +-
 .../admin/account/DisableAccountCmd.java        |     3 +-
 .../command/admin/account/EnableAccountCmd.java |     3 +-
 .../command/admin/account/LockAccountCmd.java   |     3 +-
 .../command/admin/account/UpdateAccountCmd.java |     3 +-
 .../command/admin/alert/GenerateAlertCmd.java   |     3 +-
 .../admin/autoscale/CreateCounterCmd.java       |     3 +-
 .../admin/autoscale/DeleteCounterCmd.java       |     3 +-
 .../command/admin/cluster/AddClusterCmd.java    |     3 +-
 .../command/admin/cluster/DeleteClusterCmd.java |     3 +-
 .../command/admin/cluster/ListClustersCmd.java  |     3 +-
 .../command/admin/cluster/UpdateClusterCmd.java |     3 +-
 .../api/command/admin/config/ListCfgsByCmd.java |     3 +-
 .../admin/config/ListDeploymentPlannersCmd.java |     3 +-
 .../config/ListHypervisorCapabilitiesCmd.java   |     4 +-
 .../api/command/admin/config/UpdateCfgCmd.java  |     3 +-
 .../config/UpdateHypervisorCapabilitiesCmd.java |     4 +-
 .../command/admin/domain/CreateDomainCmd.java   |     3 +-
 .../command/admin/domain/DeleteDomainCmd.java   |     3 +-
 .../admin/domain/ListDomainChildrenCmd.java     |     3 +-
 .../command/admin/domain/ListDomainsCmd.java    |     3 +-
 .../command/admin/domain/UpdateDomainCmd.java   |     3 +-
 .../api/command/admin/host/AddHostCmd.java      |     3 +-
 .../admin/host/AddSecondaryStorageCmd.java      |     3 +-
 .../admin/host/CancelMaintenanceCmd.java        |     3 +-
 .../api/command/admin/host/DeleteHostCmd.java   |     3 +-
 .../admin/host/FindHostsForMigrationCmd.java    |     3 +-
 .../api/command/admin/host/ListHostsCmd.java    |     3 +-
 .../admin/host/PrepareForMaintenanceCmd.java    |     3 +-
 .../command/admin/host/ReconnectHostCmd.java    |     3 +-
 .../admin/host/ReleaseHostReservationCmd.java   |     3 +-
 .../api/command/admin/host/UpdateHostCmd.java   |     3 +-
 .../admin/host/UpdateHostPasswordCmd.java       |     3 +-
 ...ConfigureInternalLoadBalancerElementCmd.java |     4 +-
 .../CreateInternalLoadBalancerElementCmd.java   |     4 +-
 .../admin/internallb/ListInternalLBVMsCmd.java  |     5 +-
 .../ListInternalLoadBalancerElementsCmd.java    |     4 +-
 .../admin/internallb/StartInternalLBVMCmd.java  |     5 +-
 .../admin/internallb/StopInternalLBVMCmd.java   |     5 +-
 .../admin/network/AddNetworkDeviceCmd.java      |     3 +-
 .../network/AddNetworkServiceProviderCmd.java   |     4 +-
 .../admin/network/CreateNetworkOfferingCmd.java |     3 +-
 .../admin/network/CreatePhysicalNetworkCmd.java |     3 +-
 .../network/CreateStorageNetworkIpRangeCmd.java |     4 +-
 .../network/DedicateGuestVlanRangeCmd.java      |     3 +-
 .../admin/network/DeleteNetworkDeviceCmd.java   |     3 +-
 .../admin/network/DeleteNetworkOfferingCmd.java |     3 +-
 .../DeleteNetworkServiceProviderCmd.java        |     3 +-
 .../admin/network/DeletePhysicalNetworkCmd.java |     3 +-
 .../network/DeleteStorageNetworkIpRangeCmd.java |     3 +-
 .../ListDedicatedGuestVlanRangesCmd.java        |     3 +-
 .../admin/network/ListNetworkDeviceCmd.java     |     3 +-
 .../network/ListNetworkIsolationMethodsCmd.java |     4 +-
 .../network/ListNetworkServiceProvidersCmd.java |     4 +-
 .../admin/network/ListPhysicalNetworksCmd.java  |     3 +-
 .../network/ListStorageNetworkIpRangeCmd.java   |     3 +-
 .../ListSupportedNetworkServicesCmd.java        |     4 +-
 .../ReleaseDedicatedGuestVlanRangeCmd.java      |     3 +-
 .../admin/network/UpdateNetworkOfferingCmd.java |     3 +-
 .../UpdateNetworkServiceProviderCmd.java        |     4 +-
 .../admin/network/UpdatePhysicalNetworkCmd.java |     3 +-
 .../network/UpdateStorageNetworkIpRangeCmd.java |     4 +-
 .../admin/offering/CreateDiskOfferingCmd.java   |     3 +-
 .../offering/CreateServiceOfferingCmd.java      |     3 +-
 .../admin/offering/DeleteDiskOfferingCmd.java   |     3 +-
 .../offering/DeleteServiceOfferingCmd.java      |     3 +-
 .../admin/offering/UpdateDiskOfferingCmd.java   |     3 +-
 .../offering/UpdateServiceOfferingCmd.java      |     3 +-
 .../api/command/admin/pod/CreatePodCmd.java     |     3 +-
 .../api/command/admin/pod/DeletePodCmd.java     |     3 +-
 .../api/command/admin/pod/ListPodsByCmd.java    |     3 +-
 .../api/command/admin/pod/UpdatePodCmd.java     |     3 +-
 .../api/command/admin/region/AddRegionCmd.java  |     3 +-
 .../admin/region/CreatePortableIpRangeCmd.java  |     4 +-
 .../admin/region/DeletePortableIpRangeCmd.java  |     3 +-
 .../admin/region/ListPortableIpRangesCmd.java   |     3 +-
 .../command/admin/region/RemoveRegionCmd.java   |     3 +-
 .../command/admin/region/UpdateRegionCmd.java   |     3 +-
 .../admin/resource/ArchiveAlertsCmd.java        |     3 +-
 .../admin/resource/CleanVMReservationsCmd.java  |     3 +-
 .../command/admin/resource/DeleteAlertsCmd.java |     3 +-
 .../command/admin/resource/ListAlertsCmd.java   |     3 +-
 .../command/admin/resource/ListCapacityCmd.java |     3 +-
 .../resource/UploadCustomCertificateCmd.java    |     3 +-
 .../admin/router/ConfigureOvsElementCmd.java    |     3 +-
 .../ConfigureVirtualRouterElementCmd.java       |     3 +-
 .../router/CreateVirtualRouterElementCmd.java   |     3 +-
 .../command/admin/router/DestroyRouterCmd.java  |     5 +-
 .../admin/router/ListOvsElementsCmd.java        |     3 +-
 .../command/admin/router/ListRoutersCmd.java    |     5 +-
 .../router/ListVirtualRouterElementsCmd.java    |     3 +-
 .../command/admin/router/RebootRouterCmd.java   |     7 +-
 .../command/admin/router/StartRouterCmd.java    |     5 +-
 .../api/command/admin/router/StopRouterCmd.java |     5 +-
 .../command/admin/router/UpgradeRouterCmd.java  |     5 +-
 .../admin/router/UpgradeRouterTemplateCmd.java  |     3 +-
 .../command/admin/storage/AddImageStoreCmd.java |     3 +-
 .../api/command/admin/storage/AddS3Cmd.java     |     3 +-
 .../CancelPrimaryStorageMaintenanceCmd.java     |     3 +-
 .../storage/CreateSecondaryStagingStoreCmd.java |     3 +-
 .../admin/storage/CreateStoragePoolCmd.java     |     3 +-
 .../admin/storage/DeleteImageStoreCmd.java      |     3 +-
 .../command/admin/storage/DeletePoolCmd.java    |     3 +-
 .../storage/DeleteSecondaryStagingStoreCmd.java |     3 +-
 .../FindStoragePoolsForMigrationCmd.java        |     3 +-
 .../admin/storage/ListImageStoresCmd.java       |     3 +-
 .../api/command/admin/storage/ListS3sCmd.java   |     3 +-
 .../storage/ListSecondaryStagingStoresCmd.java  |     3 +-
 .../admin/storage/ListStoragePoolsCmd.java      |     3 +-
 .../admin/storage/ListStorageProvidersCmd.java  |     3 +-
 .../PreparePrimaryStorageForMaintenanceCmd.java |     3 +-
 .../storage/UpdateCloudToUseObjectStoreCmd.java |     3 +-
 .../admin/storage/UpdateStoragePoolCmd.java     |     3 +-
 .../api/command/admin/swift/AddSwiftCmd.java    |     3 +-
 .../api/command/admin/swift/ListSwiftsCmd.java  |     3 +-
 .../admin/systemvm/DestroySystemVmCmd.java      |     5 +-
 .../admin/systemvm/ListSystemVMsCmd.java        |     5 +-
 .../admin/systemvm/MigrateSystemVMCmd.java      |     5 +-
 .../admin/systemvm/RebootSystemVmCmd.java       |     5 +-
 .../admin/systemvm/ScaleSystemVMCmd.java        |     6 +-
 .../admin/systemvm/StartSystemVMCmd.java        |     5 +-
 .../command/admin/systemvm/StopSystemVmCmd.java |     5 +-
 .../admin/systemvm/UpgradeSystemVMCmd.java      |     6 +-
 .../admin/template/PrepareTemplateCmd.java      |     3 +-
 .../admin/usage/AddTrafficMonitorCmd.java       |     3 +-
 .../command/admin/usage/AddTrafficTypeCmd.java  |     3 +-
 .../admin/usage/DeleteTrafficMonitorCmd.java    |     3 +-
 .../admin/usage/DeleteTrafficTypeCmd.java       |     3 +-
 .../admin/usage/GenerateUsageRecordsCmd.java    |     4 +-
 .../command/admin/usage/GetUsageRecordsCmd.java |     3 +-
 .../admin/usage/ListTrafficMonitorsCmd.java     |     3 +-
 .../usage/ListTrafficTypeImplementorsCmd.java   |     4 +-
 .../admin/usage/ListTrafficTypesCmd.java        |     3 +-
 .../command/admin/usage/ListUsageTypesCmd.java  |     3 +-
 .../admin/usage/UpdateTrafficTypeCmd.java       |     3 +-
 .../api/command/admin/user/CreateUserCmd.java   |     3 +-
 .../api/command/admin/user/DeleteUserCmd.java   |     3 +-
 .../api/command/admin/user/DisableUserCmd.java  |     3 +-
 .../api/command/admin/user/EnableUserCmd.java   |     3 +-
 .../api/command/admin/user/GetUserCmd.java      |     3 +-
 .../api/command/admin/user/ListUsersCmd.java    |     3 +-
 .../api/command/admin/user/LockUserCmd.java     |     3 +-
 .../api/command/admin/user/RegisterCmd.java     |     3 +-
 .../api/command/admin/user/UpdateUserCmd.java   |     3 +-
 .../admin/vlan/CreateVlanIpRangeCmd.java        |     3 +-
 .../admin/vlan/DedicatePublicIpRangeCmd.java    |     3 +-
 .../admin/vlan/DeleteVlanIpRangeCmd.java        |     3 +-
 .../command/admin/vlan/ListVlanIpRangesCmd.java |     3 +-
 .../admin/vlan/ReleasePublicIpRangeCmd.java     |     3 +-
 .../api/command/admin/vm/AssignVMCmd.java       |     4 +-
 .../api/command/admin/vm/ExpungeVMCmd.java      |     5 +-
 .../api/command/admin/vm/GetVMUserDataCmd.java  |     3 +-
 .../api/command/admin/vm/MigrateVMCmd.java      |     4 +-
 .../vm/MigrateVirtualMachineWithVolumeCmd.java  |     4 +-
 .../api/command/admin/vm/RecoverVMCmd.java      |     3 +-
 .../admin/volume/UpdateVolumeCmdByAdmin.java    |     3 +-
 .../admin/vpc/CreatePrivateGatewayCmd.java      |     3 +-
 .../command/admin/vpc/CreateVPCOfferingCmd.java |     3 +-
 .../admin/vpc/DeletePrivateGatewayCmd.java      |     5 +-
 .../command/admin/vpc/DeleteVPCOfferingCmd.java |     3 +-
 .../command/admin/vpc/ListVPCsCmdByAdmin.java   |     8 +-
 .../command/admin/vpc/UpdateVPCCmdByAdmin.java  |     2 +-
 .../command/admin/vpc/UpdateVPCOfferingCmd.java |     3 +-
 .../api/command/admin/zone/CreateZoneCmd.java   |     3 +-
 .../api/command/admin/zone/DeleteZoneCmd.java   |     3 +-
 .../zone/MarkDefaultZoneForAccountCmd.java      |     3 +-
 .../api/command/admin/zone/UpdateZoneCmd.java   |     3 +-
 .../user/account/AddAccountToProjectCmd.java    |     3 +-
 .../account/DeleteAccountFromProjectCmd.java    |     3 +-
 .../command/user/account/ListAccountsCmd.java   |     3 +-
 .../user/account/ListProjectAccountsCmd.java    |     3 +-
 .../user/address/AssociateIPAddrCmd.java        |    13 +-
 .../user/address/DisassociateIPAddrCmd.java     |     3 +-
 .../user/address/ListPublicIpAddressesCmd.java  |    15 +-
 .../command/user/address/UpdateIPAddrCmd.java   |    14 +-
 .../affinitygroup/CreateAffinityGroupCmd.java   |     5 +-
 .../affinitygroup/DeleteAffinityGroupCmd.java   |     5 +-
 .../ListAffinityGroupTypesCmd.java              |     3 +-
 .../affinitygroup/ListAffinityGroupsCmd.java    |    10 +-
 .../affinitygroup/UpdateVMAffinityGroupCmd.java |    10 +-
 .../autoscale/CreateAutoScalePolicyCmd.java     |    10 +-
 .../autoscale/CreateAutoScaleVmGroupCmd.java    |    16 +-
 .../autoscale/CreateAutoScaleVmProfileCmd.java  |    18 +-
 .../user/autoscale/CreateConditionCmd.java      |     9 +-
 .../autoscale/DeleteAutoScalePolicyCmd.java     |     5 +-
 .../autoscale/DeleteAutoScaleVmGroupCmd.java    |     5 +-
 .../autoscale/DeleteAutoScaleVmProfileCmd.java  |     5 +-
 .../user/autoscale/DeleteConditionCmd.java      |     5 +-
 .../autoscale/DisableAutoScaleVmGroupCmd.java   |     5 +-
 .../autoscale/EnableAutoScaleVmGroupCmd.java    |     5 +-
 .../autoscale/ListAutoScalePoliciesCmd.java     |     5 +-
 .../autoscale/ListAutoScaleVmGroupsCmd.java     |    17 +-
 .../autoscale/ListAutoScaleVmProfilesCmd.java   |    22 +-
 .../user/autoscale/ListConditionsCmd.java       |     3 +-
 .../command/user/autoscale/ListCountersCmd.java |     3 +-
 .../autoscale/UpdateAutoScalePolicyCmd.java     |     5 +-
 .../autoscale/UpdateAutoScaleVmGroupCmd.java    |    11 +-
 .../autoscale/UpdateAutoScaleVmProfileCmd.java  |    11 +-
 .../user/config/ListCapabilitiesCmd.java        |     3 +-
 .../command/user/event/ArchiveEventsCmd.java    |     5 +-
 .../api/command/user/event/DeleteEventsCmd.java |     5 +-
 .../command/user/event/ListEventTypesCmd.java   |     3 +-
 .../api/command/user/event/ListEventsCmd.java   |     5 +-
 .../firewall/CreateEgressFirewallRuleCmd.java   |    18 +-
 .../user/firewall/CreateFirewallRuleCmd.java    |    17 +-
 .../firewall/CreatePortForwardingRuleCmd.java   |    21 +-
 .../firewall/DeleteEgressFirewallRuleCmd.java   |     5 +-
 .../user/firewall/DeleteFirewallRuleCmd.java    |     5 +-
 .../firewall/DeletePortForwardingRuleCmd.java   |     3 +-
 .../firewall/ListEgressFirewallRulesCmd.java    |     5 +-
 .../user/firewall/ListFirewallRulesCmd.java     |    17 +-
 .../firewall/ListPortForwardingRulesCmd.java    |    17 +-
 .../firewall/UpdateEgressFirewallRuleCmd.java   |    13 +-
 .../user/firewall/UpdateFirewallRuleCmd.java    |    13 +-
 .../firewall/UpdatePortForwardingRuleCmd.java   |    13 +-
 .../user/guest/ListGuestOsCategoriesCmd.java    |     3 +-
 .../api/command/user/guest/ListGuestOsCmd.java  |     3 +-
 .../api/command/user/iso/AttachIsoCmd.java      |     3 +-
 .../api/command/user/iso/CopyIsoCmd.java        |     3 +-
 .../api/command/user/iso/DeleteIsoCmd.java      |     3 +-
 .../api/command/user/iso/DetachIsoCmd.java      |     3 +-
 .../api/command/user/iso/ExtractIsoCmd.java     |     3 +-
 .../command/user/iso/ListIsoPermissionsCmd.java |     4 +-
 .../api/command/user/iso/ListIsosCmd.java       |     3 +-
 .../api/command/user/iso/RegisterIsoCmd.java    |     3 +-
 .../api/command/user/iso/UpdateIsoCmd.java      |     3 +-
 .../user/iso/UpdateIsoPermissionsCmd.java       |     3 +-
 .../api/command/user/job/ListAsyncJobsCmd.java  |     3 +-
 .../user/job/QueryAsyncJobResultCmd.java        |     3 +-
 .../AssignCertToLoadBalancerCmd.java            |     3 +-
 .../AssignToLoadBalancerRuleCmd.java            |     4 +-
 .../CreateApplicationLoadBalancerCmd.java       |    15 +-
 .../CreateLBHealthCheckPolicyCmd.java           |     4 +-
 .../CreateLBStickinessPolicyCmd.java            |     3 +-
 .../loadbalancer/CreateLoadBalancerRuleCmd.java |    16 +-
 .../DeleteApplicationLoadBalancerCmd.java       |     3 +-
 .../DeleteLBHealthCheckPolicyCmd.java           |     3 +-
 .../DeleteLBStickinessPolicyCmd.java            |     3 +-
 .../loadbalancer/DeleteLoadBalancerRuleCmd.java |     3 +-
 .../user/loadbalancer/DeleteSslCertCmd.java     |     3 +-
 .../ListApplicationLoadBalancersCmd.java        |    18 +-
 .../ListLBHealthCheckPoliciesCmd.java           |     3 +-
 .../ListLBStickinessPoliciesCmd.java            |     3 +-
 .../ListLoadBalancerRuleInstancesCmd.java       |     4 +-
 .../loadbalancer/ListLoadBalancerRulesCmd.java  |     3 +-
 .../user/loadbalancer/ListSslCertsCmd.java      |     3 +-
 .../RemoveCertFromLoadBalancerCmd.java          |     3 +-
 .../RemoveFromLoadBalancerRuleCmd.java          |     4 +-
 .../UpdateApplicationLoadBalancerCmd.java       |    13 +-
 .../loadbalancer/UpdateLoadBalancerRuleCmd.java |    11 +-
 .../user/loadbalancer/UploadSslCertCmd.java     |     3 +-
 .../user/nat/CreateIpForwardingRuleCmd.java     |     8 +-
 .../user/nat/DeleteIpForwardingRuleCmd.java     |     3 +-
 .../command/user/nat/DisableStaticNatCmd.java   |     3 +-
 .../command/user/nat/EnableStaticNatCmd.java    |     3 +-
 .../user/nat/ListIpForwardingRulesCmd.java      |     3 +-
 .../user/network/CreateNetworkACLCmd.java       |    16 +-
 .../user/network/CreateNetworkACLListCmd.java   |    16 +-
 .../command/user/network/CreateNetworkCmd.java  |     6 +-
 .../user/network/DeleteNetworkACLCmd.java       |     3 +-
 .../user/network/DeleteNetworkACLListCmd.java   |     3 +-
 .../command/user/network/DeleteNetworkCmd.java  |     5 +-
 .../user/network/ListNetworkACLListsCmd.java    |    17 +-
 .../user/network/ListNetworkACLsCmd.java        |    18 +-
 .../user/network/ListNetworkOfferingsCmd.java   |     3 +-
 .../command/user/network/ListNetworksCmd.java   |    14 +-
 .../user/network/ReplaceNetworkACLListCmd.java  |     3 +-
 .../command/user/network/RestartNetworkCmd.java |     6 +-
 .../user/network/UpdateNetworkACLItemCmd.java   |    12 +-
 .../user/network/UpdateNetworkACLListCmd.java   |    13 +-
 .../command/user/network/UpdateNetworkCmd.java  |     6 +-
 .../user/offering/ListDiskOfferingsCmd.java     |     3 +-
 .../user/offering/ListServiceOfferingsCmd.java  |     3 +-
 .../user/project/ActivateProjectCmd.java        |     3 +-
 .../command/user/project/CreateProjectCmd.java  |     3 +-
 .../command/user/project/DeleteProjectCmd.java  |     3 +-
 .../project/DeleteProjectInvitationCmd.java     |     3 +-
 .../user/project/ListProjectInvitationsCmd.java |     4 +-
 .../command/user/project/ListProjectsCmd.java   |     4 +-
 .../command/user/project/SuspendProjectCmd.java |     3 +-
 .../command/user/project/UpdateProjectCmd.java  |     3 +-
 .../project/UpdateProjectInvitationCmd.java     |     3 +-
 .../api/command/user/region/ListRegionsCmd.java |     3 +-
 .../gslb/AssignToGlobalLoadBalancerRuleCmd.java |     4 +-
 .../gslb/CreateGlobalLoadBalancerRuleCmd.java   |     3 +-
 .../gslb/DeleteGlobalLoadBalancerRuleCmd.java   |     3 +-
 .../ha/gslb/ListGlobalLoadBalancerRuleCmd.java  |     3 +-
 .../RemoveFromGlobalLoadBalancerRuleCmd.java    |     4 +-
 .../gslb/UpdateGlobalLoadBalancerRuleCmd.java   |     3 +-
 .../user/resource/GetCloudIdentifierCmd.java    |     3 +-
 .../user/resource/ListHypervisorsCmd.java       |     3 +-
 .../user/resource/ListResourceLimitsCmd.java    |     3 +-
 .../user/resource/UpdateResourceCountCmd.java   |     3 +-
 .../user/resource/UpdateResourceLimitCmd.java   |     3 +-
 .../AuthorizeSecurityGroupEgressCmd.java        |     4 +-
 .../AuthorizeSecurityGroupIngressCmd.java       |     4 +-
 .../securitygroup/CreateSecurityGroupCmd.java   |     3 +-
 .../securitygroup/DeleteSecurityGroupCmd.java   |     3 +-
 .../securitygroup/ListSecurityGroupsCmd.java    |     5 +-
 .../RevokeSecurityGroupEgressCmd.java           |     4 +-
 .../RevokeSecurityGroupIngressCmd.java          |     3 +-
 .../user/snapshot/CreateSnapshotCmd.java        |     3 +-
 .../user/snapshot/CreateSnapshotPolicyCmd.java  |     3 +-
 .../user/snapshot/DeleteSnapshotCmd.java        |     3 +-
 .../snapshot/DeleteSnapshotPoliciesCmd.java     |     3 +-
 .../user/snapshot/ListSnapshotPoliciesCmd.java  |     3 +-
 .../command/user/snapshot/ListSnapshotsCmd.java |     3 +-
 .../user/snapshot/RevertSnapshotCmd.java        |     3 +-
 .../command/user/ssh/CreateSSHKeyPairCmd.java   |     5 +-
 .../command/user/ssh/DeleteSSHKeyPairCmd.java   |     5 +-
 .../command/user/ssh/ListSSHKeyPairsCmd.java    |     5 +-
 .../command/user/ssh/RegisterSSHKeyPairCmd.java |     5 +-
 .../api/command/user/tag/CreateTagsCmd.java     |     5 +-
 .../api/command/user/tag/DeleteTagsCmd.java     |     5 +-
 .../api/command/user/tag/ListTagsCmd.java       |     5 +-
 .../command/user/template/CopyTemplateCmd.java  |     3 +-
 .../user/template/CreateTemplateCmd.java        |     5 +-
 .../user/template/DeleteTemplateCmd.java        |     3 +-
 .../user/template/ExtractTemplateCmd.java       |     3 +-
 .../template/ListTemplatePermissionsCmd.java    |     4 +-
 .../command/user/template/ListTemplatesCmd.java |     3 +-
 .../user/template/RegisterTemplateCmd.java      |     3 +-
 .../user/template/UpdateTemplateCmd.java        |     3 +-
 .../template/UpdateTemplatePermissionsCmd.java  |     3 +-
 .../api/command/user/vm/AddIpToVmNicCmd.java    |     3 +-
 .../api/command/user/vm/AddNicToVMCmd.java      |     3 +-
 .../api/command/user/vm/DeployVMCmd.java        |     6 +-
 .../api/command/user/vm/DestroyVMCmd.java       |     4 +-
 .../api/command/user/vm/GetVMPasswordCmd.java   |     3 +-
 .../api/command/user/vm/ListNicsCmd.java        |    16 +-
 .../api/command/user/vm/ListVMsCmd.java         |    22 +-
 .../api/command/user/vm/RebootVMCmd.java        |     3 +-
 .../command/user/vm/RemoveIpFromVmNicCmd.java   |     4 +-
 .../api/command/user/vm/RemoveNicFromVMCmd.java |     3 +-
 .../api/command/user/vm/ResetVMPasswordCmd.java |     3 +-
 .../api/command/user/vm/ResetVMSSHKeyCmd.java   |     3 +-
 .../api/command/user/vm/RestoreVMCmd.java       |     4 +-
 .../api/command/user/vm/ScaleVMCmd.java         |     3 +-
 .../api/command/user/vm/StartVMCmd.java         |     3 +-
 .../api/command/user/vm/StopVMCmd.java          |     3 +-
 .../user/vm/UpdateDefaultNicForVMCmd.java       |     4 +-
 .../api/command/user/vm/UpdateVMCmd.java        |    24 +-
 .../api/command/user/vm/UpgradeVMCmd.java       |     3 +-
 .../command/user/vmgroup/CreateVMGroupCmd.java  |     5 +-
 .../command/user/vmgroup/DeleteVMGroupCmd.java  |     5 +-
 .../command/user/vmgroup/ListVMGroupsCmd.java   |     5 +-
 .../command/user/vmgroup/UpdateVMGroupCmd.java  |     5 +-
 .../user/vmsnapshot/CreateVMSnapshotCmd.java    |     7 +-
 .../user/vmsnapshot/DeleteVMSnapshotCmd.java    |     5 +-
 .../user/vmsnapshot/ListVMSnapshotCmd.java      |     5 +-
 .../user/vmsnapshot/RevertToVMSnapshotCmd.java  |     3 +-
 .../user/volume/AddResourceDetailCmd.java       |    16 +-
 .../command/user/volume/AttachVolumeCmd.java    |    12 +-
 .../command/user/volume/CreateVolumeCmd.java    |    16 +-
 .../command/user/volume/DeleteVolumeCmd.java    |     3 +-
 .../command/user/volume/DetachVolumeCmd.java    |     3 +-
 .../command/user/volume/ExtractVolumeCmd.java   |     3 +-
 .../user/volume/ListResourceDetailsCmd.java     |     5 +-
 .../api/command/user/volume/ListVolumesCmd.java |    25 +-
 .../command/user/volume/MigrateVolumeCmd.java   |     4 +-
 .../user/volume/RemoveResourceDetailCmd.java    |     3 +-
 .../command/user/volume/ResizeVolumeCmd.java    |     5 +-
 .../command/user/volume/UpdateVolumeCmd.java    |    17 +-
 .../command/user/volume/UploadVolumeCmd.java    |     3 +-
 .../command/user/vpc/CreateStaticRouteCmd.java  |     3 +-
 .../api/command/user/vpc/CreateVPCCmd.java      |    15 +-
 .../command/user/vpc/DeleteStaticRouteCmd.java  |     5 +-
 .../api/command/user/vpc/DeleteVPCCmd.java      |     5 +-
 .../user/vpc/ListPrivateGatewaysCmd.java        |     5 +-
 .../command/user/vpc/ListStaticRoutesCmd.java   |     5 +-
 .../command/user/vpc/ListVPCOfferingsCmd.java   |     3 +-
 .../api/command/user/vpc/ListVPCsCmd.java       |    25 +-
 .../api/command/user/vpc/RestartVPCCmd.java     |     5 +-
 .../api/command/user/vpc/UpdateVPCCmd.java      |    13 +-
 .../api/command/user/vpn/AddVpnUserCmd.java     |     5 +-
 .../user/vpn/CreateRemoteAccessVpnCmd.java      |    20 +-
 .../user/vpn/CreateVpnConnectionCmd.java        |    12 +-
 .../user/vpn/CreateVpnCustomerGatewayCmd.java   |     5 +-
 .../command/user/vpn/CreateVpnGatewayCmd.java   |    11 +-
 .../user/vpn/DeleteRemoteAccessVpnCmd.java      |     3 +-
 .../user/vpn/DeleteVpnConnectionCmd.java        |     5 +-
 .../user/vpn/DeleteVpnCustomerGatewayCmd.java   |     5 +-
 .../command/user/vpn/DeleteVpnGatewayCmd.java   |     5 +-
 .../user/vpn/ListRemoteAccessVpnsCmd.java       |    17 +-
 .../command/user/vpn/ListVpnConnectionsCmd.java |    17 +-
 .../user/vpn/ListVpnCustomerGatewaysCmd.java    |     5 +-
 .../command/user/vpn/ListVpnGatewaysCmd.java    |    17 +-
 .../api/command/user/vpn/ListVpnUsersCmd.java   |     5 +-
 .../api/command/user/vpn/RemoveVpnUserCmd.java  |     3 +-
 .../command/user/vpn/ResetVpnConnectionCmd.java |     5 +-
 .../user/vpn/UpdateRemoteAccessVpnCmd.java      |    13 +-
 .../user/vpn/UpdateVpnConnectionCmd.java        |    13 +-
 .../user/vpn/UpdateVpnCustomerGatewayCmd.java   |     5 +-
 .../command/user/vpn/UpdateVpnGatewayCmd.java   |    13 +-
 .../api/command/user/zone/ListZonesCmd.java     |     4 +-
 ...ApplicationLoadBalancerInstanceResponse.java |     3 +-
 .../ApplicationLoadBalancerResponse.java        |    12 +-
 .../api/response/AutoScaleVmGroupResponse.java  |    12 +-
 .../response/AutoScaleVmProfileResponse.java    |    13 +-
 .../api/response/FirewallResponse.java          |    12 +-
 .../api/response/FirewallRuleResponse.java      |    12 +-
 .../api/response/IPAddressResponse.java         |    12 +-
 .../api/response/LoadBalancerResponse.java      |    12 +-
 .../api/response/NetworkACLItemResponse.java    |    12 +-
 .../api/response/NetworkACLResponse.java        |    12 +-
 .../api/response/NetworkResponse.java           |     6 +-
 .../api/response/RemoteAccessVpnResponse.java   |    11 +-
 .../api/response/ResourceTagResponse.java       |    31 +
 .../Site2SiteVpnConnectionResponse.java         |     9 +
 .../response/Site2SiteVpnGatewayResponse.java   |    11 +-
 .../cloudstack/api/response/UserVmResponse.java |     3 +-
 .../cloudstack/api/response/VolumeResponse.java |    30 +-
 .../cloudstack/api/response/VpcResponse.java    |    12 +-
 .../apache/cloudstack/context/CallContext.java  |    28 +-
 .../cloudstack/context/CallContextListener.java |     3 +-
 .../lb/ApplicationLoadBalancerService.java      |     4 +-
 awsapi/pom.xml                                  |     5 -
 .../classes/resources/messages.properties       |    86 +-
 .../classes/resources/messages_es.properties    |     3 -
 .../classes/resources/messages_ja_JP.properties |   122 +-
 .../classes/resources/messages_nl_NL.properties |    50 +-
 .../classes/resources/messages_pl.properties    |    12 +-
 .../classes/resources/messages_pt_BR.properties |    11 +-
 .../classes/resources/messages_zh_CN.properties |   116 +-
 client/pom.xml                                  |    39 +-
 client/tomcatconf/catalina.properties.in        |     2 +-
 .../com/cloud/agent/api/CheckRouterCommand.java |     5 +
 .../api/CheckS2SVpnConnectionsCommand.java      |     9 +-
 .../com/cloud/agent/api/GetDomRVersionCmd.java  |     5 +
 .../agent/api/SetupGuestNetworkAnswer.java      |    26 -
 .../cloud/agent/api/routing/GroupAnswer.java    |    40 +
 .../cloud/agent/api/routing/IpAssocCommand.java |     4 +
 .../agent/api/routing/IpAssocVpcCommand.java    |     6 +
 .../api/routing/NetworkElementCommand.java      |     9 +
 .../api/routing/SetFirewallRulesCommand.java    |     9 +-
 .../agent/api/routing/SetNetworkACLCommand.java |    11 +-
 .../routing/SetPortForwardingRulesCommand.java  |    10 +-
 .../SetPortForwardingRulesVpcCommand.java       |     4 +-
 .../api/routing/SetStaticNatRulesCommand.java   |     9 +-
 .../agent/api/routing/SetStaticRouteAnswer.java |    13 +-
 .../api/routing/SetStaticRouteCommand.java      |    13 +-
 .../virtualnetwork/VirtualRoutingResource.java  |   801 +-
 .../VirtualRoutingResourceTest.java             |   799 ++
 deps/XenServerJava/Makefile                     |    44 -
 deps/XenServerJava/pom.xml                      |     2 +-
 deps/XenServerJava/src/LICENSE.Apache-2.0.txt   |   201 +
 deps/XenServerJava/src/LICENSE.txt              |    26 +
 deps/XenServerJava/src/README.txt               |    57 +
 .../src/com/xensource/xenapi/APIVersion.java    |    73 +-
 .../src/com/xensource/xenapi/Auth.java          |    34 +-
 .../src/com/xensource/xenapi/Blob.java          |   149 +-
 .../src/com/xensource/xenapi/Bond.java          |   191 +-
 .../src/com/xensource/xenapi/Connection.java    |   118 +-
 .../src/com/xensource/xenapi/Console.java       |   135 +-
 .../src/com/xensource/xenapi/Crashdump.java     |   113 +-
 .../src/com/xensource/xenapi/DRTask.java        |    93 +-
 .../src/com/xensource/xenapi/DataSource.java    |    19 +-
 .../src/com/xensource/xenapi/Event.java         |    87 +-
 .../src/com/xensource/xenapi/GPUGroup.java      |   338 +-
 .../src/com/xensource/xenapi/Host.java          |  1208 +-
 .../src/com/xensource/xenapi/HostCpu.java       |   182 +-
 .../src/com/xensource/xenapi/HostCrashdump.java |   133 +-
 .../src/com/xensource/xenapi/HostMetrics.java   |   120 +-
 .../src/com/xensource/xenapi/HostPatch.java     |   195 +-
 .../src/com/xensource/xenapi/Marshalling.java   |    60 +-
 .../src/com/xensource/xenapi/Message.java       |   110 +-
 .../src/com/xensource/xenapi/Network.java       |   275 +-
 .../src/com/xensource/xenapi/PBD.java           |   183 +-
 .../src/com/xensource/xenapi/PCI.java           |   133 +-
 .../src/com/xensource/xenapi/PGPU.java          |   373 +-
 .../src/com/xensource/xenapi/PIF.java           |   636 +-
 .../src/com/xensource/xenapi/PIFMetrics.java    |   173 +-
 .../src/com/xensource/xenapi/Pool.java          |   942 +-
 .../src/com/xensource/xenapi/PoolPatch.java     |   237 +-
 .../src/com/xensource/xenapi/Role.java          |   123 +-
 .../src/com/xensource/xenapi/SM.java            |   199 +-
 .../src/com/xensource/xenapi/SR.java            |   767 +-
 .../src/com/xensource/xenapi/Secret.java        |   125 +-
 .../src/com/xensource/xenapi/Session.java       |   227 +-
 .../src/com/xensource/xenapi/Subject.java       |   129 +-
 .../src/com/xensource/xenapi/Task.java          |   235 +-
 .../src/com/xensource/xenapi/Tunnel.java        |   165 +-
 .../src/com/xensource/xenapi/Types.java         | 10869 +++++++++--------
 .../src/com/xensource/xenapi/User.java          |   135 +-
 .../src/com/xensource/xenapi/VBD.java           |   421 +-
 .../src/com/xensource/xenapi/VBDMetrics.java    |   109 +-
 .../src/com/xensource/xenapi/VDI.java           |   853 +-
 .../src/com/xensource/xenapi/VGPU.java          |   225 +-
 .../src/com/xensource/xenapi/VGPUType.java      |   461 +
 .../src/com/xensource/xenapi/VIF.java           |   409 +-
 .../src/com/xensource/xenapi/VIFMetrics.java    |   109 +-
 .../src/com/xensource/xenapi/VLAN.java          |   135 +-
 .../src/com/xensource/xenapi/VM.java            |  2182 ++--
 .../src/com/xensource/xenapi/VMAppliance.java   |   241 +-
 .../com/xensource/xenapi/VMGuestMetrics.java    |   157 +-
 .../src/com/xensource/xenapi/VMMetrics.java     |   165 +-
 .../src/com/xensource/xenapi/VMPP.java          |   437 +-
 .../src/com/xensource/xenapi/VTPM.java          |    85 +-
 .../src/com/xensource/xenapi/XenAPIObject.java  |    44 +-
 developer/pom.xml                               |    23 +-
 .../src/com/cloud/vm/VirtualMachineManager.java |     7 +-
 .../service/NetworkOrchestrationService.java    |     2 +-
 .../api/storage/type/VolumeTypeBase.java        |    39 +-
 .../api/storage/type/VolumeTypeHelper.java      |    25 +-
 .../api/storage/type/VolumeTypeHelperTest.java  |   101 +
 .../com/cloud/ha/HighAvailabilityManager.java   |     3 +
 .../src/com/cloud/network/IpAddressManager.java |     2 +-
 .../src/com/cloud/network/addr/PublicIp.java    |     5 +
 .../network/lb/LoadBalancingRulesManager.java   |     2 +-
 .../cloud/network/rules/StaticNatRuleImpl.java  |     8 +-
 .../cloud/network/vpc/NetworkACLManager.java    |     9 +-
 .../src/com/cloud/template/TemplateManager.java |    10 +
 .../com/cloud/agent/manager/AgentAttache.java   |    40 +-
 .../cloud/agent/manager/AgentManagerImpl.java   |    65 +-
 .../agent/manager/ClusteredAgentAttache.java    |    18 +-
 .../agent/manager/ConnectedAgentAttache.java    |    33 +-
 .../cloud/agent/manager/DirectAgentAttache.java |     2 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java |  1229 +-
 .../vm/VirtualMachinePowerStateSyncImpl.java    |    31 +
 .../src/com/cloud/vm/VmWorkJobDispatcher.java   |    12 +-
 .../src/com/cloud/vm/VmWorkMigrateAway.java     |    36 +
 .../com/cloud/vm/VmWorkStorageMigration.java    |    12 +-
 .../engine/orchestration/CloudOrchestrator.java |    16 +-
 .../orchestration/NetworkOrchestrator.java      |    67 +-
 .../orchestration/VolumeOrchestrator.java       |    17 +-
 .../service/api/ProvisioningServiceImpl.java    |    34 +-
 .../manager/ConnectedAgentAttacheTest.java      |    82 +
 .../cloud/vm/VirtualMachineManagerImplTest.java |    71 +-
 .../orchestration/NetworkOrchestratorTest.java  |   164 +
 engine/pom.xml                                  |    13 +
 .../src/com/cloud/dc/DataCenterDetailVO.java    |     5 +-
 .../src/com/cloud/dc/dao/DataCenterDaoImpl.java |     2 +-
 .../cloud/dc/dao/DataCenterDetailsDaoImpl.java  |     4 +-
 engine/schema/src/com/cloud/event/EventVO.java  |    11 +
 .../com/cloud/network/as/AutoScalePolicyVO.java |     6 +-
 .../cloud/network/as/AutoScaleVmGroupVO.java    |    12 +
 .../cloud/network/as/AutoScaleVmProfileVO.java  |    12 +
 .../src/com/cloud/network/as/ConditionVO.java   |     5 +-
 .../network/dao/FirewallRulesCidrsDaoImpl.java  |     1 -
 .../com/cloud/network/dao/IPAddressDaoImpl.java |     1 +
 .../src/com/cloud/network/dao/IPAddressVO.java  |    12 +
 .../cloud/network/dao/MonitoringServiceVO.java  |     1 -
 .../com/cloud/network/dao/NetworkDetailVO.java  |     5 +-
 .../network/dao/NetworkDetailsDaoImpl.java      |     4 +-
 .../src/com/cloud/network/dao/NetworkVO.java    |     2 +-
 .../cloud/network/dao/RemoteAccessVpnVO.java    |    12 +
 .../network/dao/Site2SiteVpnConnectionVO.java   |    12 +
 .../network/dao/Site2SiteVpnGatewayVO.java      |    12 +
 .../com/cloud/network/rules/FirewallRuleVO.java |    29 +-
 .../com/cloud/network/vpc/NetworkACLItemVO.java |    12 +
 .../src/com/cloud/network/vpc/NetworkACLVO.java |    12 +
 .../src/com/cloud/network/vpc/VpcGatewayVO.java |    10 +-
 .../schema/src/com/cloud/network/vpc/VpcVO.java |    13 +
 .../cloud/service/ServiceOfferingDetailsVO.java |     5 +-
 .../service/dao/ServiceOfferingDaoImpl.java     |     2 +-
 .../dao/ServiceOfferingDetailsDaoImpl.java      |     4 +-
 .../com/cloud/storage/VMTemplateDetailVO.java   |     5 +-
 .../src/com/cloud/storage/VMTemplateVO.java     |     1 -
 .../src/com/cloud/storage/VolumeDetailVO.java   |     5 +-
 .../schema/src/com/cloud/storage/VolumeVO.java  |    11 +-
 .../storage/dao/SnapshotDetailsDaoImpl.java     |     4 +-
 .../cloud/storage/dao/SnapshotDetailsVO.java    |     9 +-
 .../storage/dao/StoragePoolDetailsDaoImpl.java  |     4 +-
 .../cloud/storage/dao/VMTemplateDaoImpl.java    |    11 +-
 .../storage/dao/VMTemplateDetailsDaoImpl.java   |     4 +-
 .../src/com/cloud/storage/dao/VolumeDao.java    |     8 +
 .../com/cloud/storage/dao/VolumeDaoImpl.java    |    20 +
 .../cloud/storage/dao/VolumeDetailsDaoImpl.java |     4 +-
 .../com/cloud/upgrade/dao/Upgrade430to440.java  |     2 +-
 .../schema/src/com/cloud/user/SSHKeyPairVO.java |     1 -
 engine/schema/src/com/cloud/vm/NicDetailVO.java |     5 +-
 .../schema/src/com/cloud/vm/UserVmDetailVO.java |     5 +-
 .../schema/src/com/cloud/vm/VMInstanceVO.java   |     7 +-
 .../schema/src/com/cloud/vm/dao/NicDaoImpl.java |     1 -
 .../src/com/cloud/vm/dao/NicDetailsDaoImpl.java |     4 +-
 .../src/com/cloud/vm/dao/NicIpAliasVO.java      |     1 -
 .../src/com/cloud/vm/dao/NicSecondaryIpVO.java  |     4 -
 .../schema/src/com/cloud/vm/dao/UserVmDao.java  |     3 +-
 .../src/com/cloud/vm/dao/UserVmDaoImpl.java     |     7 +-
 .../com/cloud/vm/dao/UserVmDetailsDaoImpl.java  |     4 +-
 .../cloud/vm/snapshot/VMSnapshotDetailsVO.java  |     9 +-
 .../snapshot/dao/VMSnapshotDetailsDaoImpl.java  |     4 +-
 .../cloudstack/affinity/AffinityGroupVO.java    |     2 +-
 .../engine/cloud/entity/api/db/VMEntityVO.java  |     1 -
 .../AutoScaleVmGroupDetailVO.java               |     5 +-
 .../AutoScaleVmProfileDetailVO.java             |     5 +-
 .../resourcedetail/DiskOfferingDetailVO.java    |     3 +-
 .../resourcedetail/FirewallRuleDetailVO.java    |     5 +-
 .../resourcedetail/NetworkACLItemDetailVO.java  |     5 +-
 .../resourcedetail/NetworkACLListDetailVO.java  |     5 +-
 .../resourcedetail/RemoteAccessVpnDetailVO.java |     5 +-
 .../resourcedetail/ResourceDetailsDao.java      |     2 +-
 .../Site2SiteCustomerGatewayDetailVO.java       |     5 +-
 .../Site2SiteVpnConnectionDetailVO.java         |     5 +-
 .../Site2SiteVpnGatewayDetailVO.java            |     5 +-
 .../cloudstack/resourcedetail/UserDetailVO.java |     2 +-
 .../resourcedetail/UserIpAddressDetailVO.java   |     5 +-
 .../cloudstack/resourcedetail/VpcDetailVO.java  |     5 +-
 .../resourcedetail/VpcGatewayDetailVO.java      |     5 +-
 .../dao/AutoScaleVmGroupDetailsDaoImpl.java     |     4 +-
 .../dao/AutoScaleVmProfileDetailsDaoImpl.java   |     4 +-
 .../dao/DiskOfferingDetailsDaoImpl.java         |     4 +-
 .../dao/FirewallRuleDetailsDaoImpl.java         |     4 +-
 .../dao/NetworkACLItemDetailsDaoImpl.java       |     4 +-
 .../dao/NetworkACLListDetailsDaoImpl.java       |     4 +-
 .../dao/RemoteAccessVpnDetailsDaoImpl.java      |     4 +-
 .../Site2SiteCustomerGatewayDetailsDaoImpl.java |     4 +-
 .../Site2SiteVpnConnectionDetailsDaoImpl.java   |     4 +-
 .../dao/Site2SiteVpnGatewayDetailsDaoImpl.java  |     4 +-
 .../resourcedetail/dao/UserDetailsDaoImpl.java  |     2 +-
 .../dao/UserIpAddressDetailsDaoImpl.java        |     4 +-
 .../resourcedetail/dao/VpcDetailsDaoImpl.java   |     4 +-
 .../dao/VpcGatewayDetailsDaoImpl.java           |     4 +-
 .../storage/datastore/db/ImageStoreVO.java      |     3 -
 .../datastore/db/PrimaryDataStoreDaoImpl.java   |     4 +-
 .../datastore/db/PrimaryDataStoreDetailVO.java  |     5 +-
 .../datastore/db/StoragePoolDetailVO.java       |     5 +-
 .../storage/datastore/db/StoragePoolVO.java     |     3 -
 .../storage/image/store/TemplateObject.java     |     1 -
 engine/storage/integration-test/pom.xml         |     5 -
 .../vm/snapshot/dao/VmSnapshotDaoTest.java      |     2 +-
 .../storage/allocator/StorageAllocatorTest.java |     4 +-
 .../storage/image/TemplateEntityImpl.java       |     4 +-
 .../image/datastore/ImageStoreHelper.java       |    26 +
 .../storage/snapshot/SnapshotEntityImpl.java    |     1 -
 .../datastore/PrimaryDataStoreHelper.java       |    28 +
 .../db/PrimaryDataStoreDetailsDaoImpl.java      |     4 +-
 .../cloudstack/storage/volume/VolumeObject.java |     5 +
 .../storage/volume/VolumeServiceImpl.java       |     1 +
 framework/db/pom.xml                            |     5 -
 .../db/src/com/cloud/dao/EntityManagerImpl.java |     1 +
 framework/db/src/com/cloud/utils/db/Filter.java |     2 +-
 .../src/com/cloud/utils/db/GenericDaoBase.java  |    59 +-
 .../db/src/com/cloud/utils/db/GroupBy.java      |    31 +-
 .../db/src/com/cloud/utils/db/SearchBase.java   |    87 +-
 .../src/com/cloud/utils/db/StaticStrategy.java  |   131 -
 .../db/test/com/cloud/utils/db/GroupByTest.java |    81 +
 .../jobs/AsyncJobExecutionContext.java          |    21 +-
 .../framework/jobs/dao/SyncQueueItemDao.java    |     1 +
 .../jobs/dao/SyncQueueItemDaoImpl.java          |    35 +-
 .../jobs/impl/AsyncJobManagerImpl.java          |    54 +-
 .../framework/jobs/impl/AsyncJobMonitor.java    |    30 +-
 .../framework/jobs/impl/AsyncJobVO.java         |     2 +-
 .../jobs/impl/SyncQueueManagerImpl.java         |    21 +-
 .../managed/context/ManagedContextRunnable.java |     2 +-
 framework/pom.xml                               |    13 +
 packaging/centos63/cloud-agent.rc               |     8 +-
 packaging/centos63/cloud-ipallocator.rc         |     8 +-
 packaging/centos63/package.sh                   |   170 +-
 .../api/command/user/discovery/ListApisCmd.java |     4 +-
 .../admin/ratelimit/ResetApiLimitCmd.java       |     3 +-
 .../command/user/ratelimit/GetApiLimitCmd.java  |     3 +-
 plugins/database/mysql-ha/pom.xml               |    28 +
 .../src/com/cloud/utils/db/StaticStrategy.java  |   131 +
 .../api/commands/DedicateClusterCmd.java        |     3 +-
 .../api/commands/DedicateHostCmd.java           |     3 +-
 .../cloudstack/api/commands/DedicatePodCmd.java |     3 +-
 .../api/commands/DedicateZoneCmd.java           |     3 +-
 .../api/commands/ListDedicatedClustersCmd.java  |     3 +-
 .../api/commands/ListDedicatedHostsCmd.java     |     3 +-
 .../api/commands/ListDedicatedPodsCmd.java      |     3 +-
 .../api/commands/ListDedicatedZonesCmd.java     |     3 +-
 .../commands/ReleaseDedicatedClusterCmd.java    |     3 +-
 .../api/commands/ReleaseDedicatedHostCmd.java   |     3 +-
 .../api/commands/ReleaseDedicatedPodCmd.java    |     3 +-
 .../api/commands/ReleaseDedicatedZoneCmd.java   |     3 +-
 .../dedicated/DedicatedResourceManagerImpl.java |    38 +-
 .../mom/inmemory/InMemoryEventBus.java          |    53 +-
 .../mom/inmemory/InMemoryEventBusTest.java      |   162 +
 .../api/commands/netapp/AssociateLunCmd.java    |     3 +-
 .../cloud/api/commands/netapp/CreateLunCmd.java |     3 +-
 .../commands/netapp/CreateVolumeOnFilerCmd.java |     3 +-
 .../commands/netapp/CreateVolumePoolCmd.java    |     3 +-
 .../commands/netapp/DeleteVolumePoolCmd.java    |     3 +-
 .../api/commands/netapp/DestroyLunCmd.java      |     3 +-
 .../netapp/DestroyVolumeOnFilerCmd.java         |     3 +-
 .../api/commands/netapp/DissociateLunCmd.java   |     3 +-
 .../cloud/api/commands/netapp/ListLunsCmd.java  |     3 +-
 .../api/commands/netapp/ListVolumePoolsCmd.java |     3 +-
 .../commands/netapp/ListVolumesOnFilerCmd.java  |     3 +-
 .../commands/netapp/ModifyVolumePoolCmd.java    |     3 +-
 .../cloudstack/api/AddBaremetalDhcpCmd.java     |     3 +-
 .../cloudstack/api/AddBaremetalHostCmd.java     |     3 +-
 .../api/AddBaremetalKickStartPxeCmd.java        |     3 +-
 .../api/AddBaremetalPxePingServerCmd.java       |     3 +-
 .../cloudstack/api/ListBaremetalDhcpCmd.java    |     3 +-
 .../api/ListBaremetalPxeServersCmd.java         |     3 +-
 .../HypervResource/CloudStackTypes.cs           |    17 +-
 .../HypervResource/HypervResourceController.cs  |    86 +-
 .../HypervResource/IWmiCallsV2.cs               |     1 +
 .../ServerResource/HypervResource/WmiCallsV2.cs |    25 +
 .../resource/HypervDirectConnectResource.java   |    51 +-
 .../kvm/resource/KVMGuestOsMapper.java          |     2 +
 .../hypervisor/kvm/resource/KVMHABase.java      |    13 +-
 .../kvm/resource/LibvirtComputingResource.java  |   190 +-
 .../kvm/resource/LibvirtDomainXMLParser.java    |    12 +-
 .../kvm/resource/LibvirtStoragePoolDef.java     |    29 +-
 .../resource/LibvirtStoragePoolXMLParser.java   |    20 +-
 .../hypervisor/kvm/resource/LibvirtVMDef.java   |    18 +-
 .../kvm/storage/KVMStorageProcessor.java        |    27 +-
 .../kvm/storage/LibvirtStorageAdaptor.java      |    60 +-
 .../apache/cloudstack/utils/qemu/QemuImg.java   |     6 +-
 .../cloudstack/utils/qemu/QemuImgFile.java      |     1 -
 .../resource/LibvirtComputingResourceTest.java  |     7 +
 .../cloud/agent/manager/MockNetworkManager.java |     3 +-
 .../agent/manager/MockNetworkManagerImpl.java   |     9 +-
 .../agent/manager/SimulatorManagerImpl.java     |     6 +-
 .../api/commands/ConfigureSimulatorCmd.java     |     3 +-
 .../driver/SimulatorImageStoreDriverImpl.java   |     6 +
 .../apache/cloudstack/api/AddUcsManagerCmd.java |     3 +-
 .../api/AssociateUcsProfileToBladeCmd.java      |     3 +-
 .../cloudstack/api/DeleteUcsManagerCmd.java     |     3 +-
 .../apache/cloudstack/api/ListUcsBladeCmd.java  |     3 +-
 .../cloudstack/api/ListUcsManagerCmd.java       |     3 +-
 .../cloudstack/api/ListUcsProfileCmd.java       |     3 +-
 .../api/commands/DeleteCiscoNexusVSMCmd.java    |     3 +-
 .../api/commands/DisableCiscoNexusVSMCmd.java   |     3 +-
 .../api/commands/EnableCiscoNexusVSMCmd.java    |     3 +-
 .../api/commands/ListCiscoNexusVSMsCmd.java     |     3 +-
 .../com/cloud/hypervisor/guru/VMwareGuru.java   |    25 +-
 .../vmware/VmwareServerDiscoverer.java          |     6 -
 .../vmware/manager/VmwareManagerImpl.java       |     6 +-
 .../vmware/resource/VmwareResource.java         |   176 +-
 .../resource/VmwareStorageProcessor.java        |    72 +-
 .../api/command/admin/zone/AddVmwareDcCmd.java  |     3 +-
 .../command/admin/zone/ListVmwareDcsCmd.java    |     3 +-
 .../command/admin/zone/RemoveVmwareDcCmd.java   |     3 +-
 .../motion/VmwareStorageMotionStrategy.java     |    36 +-
 .../xen/src/com/cloud/ha/XenServerFencer.java   |     1 -
 .../xen/discoverer/XcpServerDiscoverer.java     |    35 +-
 .../hypervisor/xen/resource/CitrixHelper.java   |   339 +
 .../xen/resource/CitrixResourceBase.java        |    67 +-
 .../xen/resource/Xenserver625Resource.java      |    15 +-
 .../xenserver/XenServerResourceNewBase.java     |    27 +-
 .../test/com/cloud/ha/XenServerFencerTest.java  |    39 +
 .../xen/resource/CitrixResourceBaseTest.java    |    16 +
 .../api/commands/AddBigSwitchVnsDeviceCmd.java  |     3 +-
 .../commands/DeleteBigSwitchVnsDeviceCmd.java   |     3 +-
 .../commands/ListBigSwitchVnsDevicesCmd.java    |     3 +-
 .../commands/AddCiscoAsa1000vResourceCmd.java   |     3 +-
 .../api/commands/AddCiscoVnmcResourceCmd.java   |     3 +-
 .../DeleteCiscoAsa1000vResourceCmd.java         |     3 +-
 .../commands/DeleteCiscoVnmcResourceCmd.java    |     3 +-
 .../commands/ListCiscoAsa1000vResourcesCmd.java |     3 +-
 .../api/commands/ListCiscoVnmcResourcesCmd.java |     3 +-
 .../cloud/network/element/CiscoVnmcElement.java |     5 +-
 .../network/cisco/CiscoVnmcConnectionTest.java  |   209 +-
 .../lb/ElasticLoadBalancerManagerImpl.java      |   486 +-
 .../network/lb/LoadBalanceRuleHandler.java      |   467 +
 .../lb/ElasticLoadBalancerManagerImplTest.java  |   101 +
 .../network/lb/LoadBalanceRuleHandlerTest.java  |   215 +
 .../commands/AddExternalLoadBalancerCmd.java    |     3 +-
 .../api/commands/AddF5LoadBalancerCmd.java      |     3 +-
 .../commands/ConfigureF5LoadBalancerCmd.java    |     3 +-
 .../commands/DeleteExternalLoadBalancerCmd.java |     3 +-
 .../api/commands/DeleteF5LoadBalancerCmd.java   |     3 +-
 .../commands/ListExternalLoadBalancersCmd.java  |     3 +-
 .../commands/ListF5LoadBalancerNetworksCmd.java |     3 +-
 .../api/commands/ListF5LoadBalancersCmd.java    |     3 +-
 .../lb/InternalLoadBalancerVMManagerImpl.java   |    18 +-
 ...ring-contrail-system-context-inheritable.xml |    41 +
 .../api/command/CreateServiceInstanceCmd.java   |     4 +-
 .../management/ContrailManagerImpl.java         |    68 +-
 .../network/contrail/management/EventUtils.java |    56 +-
 .../contrail/management/ServiceManagerImpl.java |    16 +-
 .../network/contrail/model/ModelObject.java     |    10 +-
 .../contrail/model/ServiceInstanceModel.java    |    21 +-
 .../contrail/model/VirtualMachineModel.java     |    78 +-
 .../contrail/model/VirtualNetworkModel.java     |   171 +-
 .../contrail/model/VirtualMachineModelTest.java |     9 +-
 .../contrail/model/VirtualNetworkModelTest.java |   143 +-
 .../test/resources/log4j.properties             |     2 +-
 .../api/commands/AddExternalFirewallCmd.java    |     3 +-
 .../cloud/api/commands/AddSrxFirewallCmd.java   |     3 +-
 .../api/commands/ConfigureSrxFirewallCmd.java   |     3 +-
 .../api/commands/DeleteExternalFirewallCmd.java |     3 +-
 .../api/commands/DeleteSrxFirewallCmd.java      |     3 +-
 .../api/commands/ListExternalFirewallsCmd.java  |     3 +-
 .../commands/ListSrxFirewallNetworksCmd.java    |     3 +-
 .../cloud/api/commands/ListSrxFirewallsCmd.java |     3 +-
 .../commands/AddNetscalerLoadBalancerCmd.java   |     3 +-
 .../ConfigureNetscalerLoadBalancerCmd.java      |     3 +-
 .../DeleteNetscalerLoadBalancerCmd.java         |     3 +-
 .../ListNetscalerLoadBalancerNetworksCmd.java   |     3 +-
 .../commands/ListNetscalerLoadBalancersCmd.java |     3 +-
 .../api/commands/AddNiciraNvpDeviceCmd.java     |     3 +-
 .../api/commands/DeleteNiciraNvpDeviceCmd.java  |     3 +-
 .../ListNiciraNvpDeviceNetworksCmd.java         |     3 +-
 .../api/commands/ListNiciraNvpDevicesCmd.java   |     3 +-
 .../network/nicira/AccessConfiguration.java     |    90 +-
 .../src/com/cloud/network/nicira/Acl.java       |     1 -
 .../cloud/network/nicira/BaseNiciraEntity.java  |    85 +
 .../network/nicira/BaseNiciraNamedEntity.java   |    44 +
 .../com/cloud/network/nicira/LogicalRouter.java |    71 +
 .../network/nicira/LogicalRouterConfig.java     |    65 -
 .../cloud/network/nicira/LogicalRouterPort.java |    41 +-
 .../com/cloud/network/nicira/LogicalSwitch.java |    68 +-
 .../cloud/network/nicira/LogicalSwitchPort.java |    50 +-
 .../com/cloud/network/nicira/NiciraNvpApi.java  |   750 +-
 .../nicira/RoutingTableRoutingConfig.java       |    30 +
 ...SingleDefaultRouteImplicitRoutingConfig.java |    40 +
 .../SingleDefaultRouteImplictRoutingConfig.java |    40 -
 .../com/cloud/network/nicira/VifAttachment.java |    35 +-
 .../network/resource/NiciraNvpResource.java     |    20 +-
 .../network/element/NiciraNvpElementTest.java   |    42 +-
 .../guru/NiciraNvpGuestNetworkGuruTest.java     |   154 +-
 .../com/cloud/network/nicira/NatRuleTest.java   |    12 +-
 .../cloud/network/nicira/NiciraNvpApiIT.java    |   200 +-
 .../cloud/network/nicira/NiciraNvpApiTest.java  |   367 +-
 .../com/cloud/network/nicira/NiciraTagTest.java |     8 +-
 .../network/resource/NiciraNvpResourceTest.java |   258 +-
 .../commands/AddOpenDaylightControllerCmd.java  |     3 +-
 .../DeleteOpenDaylightControllerCmd.java        |     3 +-
 .../ListOpenDaylightControllersCmd.java         |     3 +-
 .../com/cloud/network/element/OvsElement.java   |   283 +-
 .../cloud/network/guru/OvsGuestNetworkGuru.java |     4 -
 .../com/cloud/network/ovs/OvsTunnelManager.java |     4 +-
 .../cloud/network/ovs/OvsTunnelManagerImpl.java |   148 +-
 .../api/commands/AddPaloAltoFirewallCmd.java    |     3 +-
 .../commands/ConfigurePaloAltoFirewallCmd.java  |     3 +-
 .../api/commands/DeletePaloAltoFirewallCmd.java |     3 +-
 .../ListPaloAltoFirewallNetworksCmd.java        |     3 +-
 .../api/commands/ListPaloAltoFirewallsCmd.java  |     3 +-
 .../cloudstack/api/commands/AddSspCmd.java      |     3 +-
 .../cloudstack/api/commands/DeleteSspCmd.java   |     3 +-
 plugins/pom.xml                                 |    24 +
 ...CloudStackPrimaryDataStoreLifeCycleImpl.java |    30 +-
 .../CloudStackPrimaryDataStoreProviderImpl.java |     9 +-
 .../cloudstack/api/command/LDAPConfigCmd.java   |     4 +-
 .../cloudstack/api/command/LDAPRemoveCmd.java   |     3 +-
 .../api/command/LdapAddConfigurationCmd.java    |     3 +-
 .../api/command/LdapCreateAccountCmd.java       |     3 +-
 .../api/command/LdapDeleteConfigurationCmd.java |     3 +-
 .../api/command/LdapImportUsersCmd.java         |     3 +-
 .../api/command/LdapListConfigurationCmd.java   |     3 +-
 .../api/command/LdapListUsersCmd.java           |     3 +-
 .../api/command/LdapUserSearchCmd.java          |     3 +-
 pom.xml                                         |    39 +-
 .../SYSCONFDIR/rc.d/init.d/cloud-ipallocator.in |     8 +-
 .../SYSCONFDIR/rc.d/init.d/cloud-ipallocator.in |     8 +-
 .../SYSCONFDIR/init.d/cloud-ipallocator.in      |     8 +-
 .../SYSCONFDIR/rc.d/init.d/cloud-ipallocator.in |     8 +-
 .../sles/SYSCONFDIR/init.d/cloud-ipallocator.in |     8 +-
 .../SYSCONFDIR/init.d/cloud-ipallocator.in      |     8 +-
 scripts/vm/systemvm/injectkeys.sh               |     2 +-
 .../com/cloud/api/ApiAsyncJobDispatcher.java    |    14 +-
 server/src/com/cloud/api/ApiDispatcher.java     |     3 +-
 server/src/com/cloud/api/ApiGsonHelper.java     |     4 +-
 .../com/cloud/api/ApiResponseGsonHelper.java    |    39 +-
 server/src/com/cloud/api/ApiResponseHelper.java |    18 +-
 server/src/com/cloud/api/ApiServer.java         |    22 +-
 .../cloud/api/ResponseObjectTypeAdapter.java    |     7 +-
 .../com/cloud/api/query/QueryManagerImpl.java   |    39 +-
 .../api/query/dao/ImageStoreJoinDaoImpl.java    |     4 +-
 .../cloud/api/query/dao/VolumeJoinDaoImpl.java  |     3 +-
 .../cloud/api/query/vo/AffinityGroupJoinVO.java |     2 +-
 .../src/com/cloud/api/query/vo/EventJoinVO.java |     7 +
 .../com/cloud/api/query/vo/VolumeJoinVO.java    |     8 +
 .../api/response/ApiResponseSerializer.java     |    24 +
 .../api/response/SecurityGroupResultObject.java |     2 +-
 server/src/com/cloud/configuration/Config.java  |     6 +
 .../configuration/ConfigurationManagerImpl.java |    11 +-
 .../consoleproxy/ConsoleProxyManagerImpl.java   |     7 +-
 .../com/cloud/event/ActionEventInterceptor.java |    19 +-
 .../src/com/cloud/event/ActionEventUtils.java   |    34 +-
 .../cloud/ha/HighAvailabilityManagerImpl.java   |    48 +-
 .../metadata/ResourceMetaDataManagerImpl.java   |     8 +-
 .../com/cloud/network/IpAddressManagerImpl.java |    37 +-
 .../src/com/cloud/network/NetworkModelImpl.java |     2 +-
 .../com/cloud/network/NetworkServiceImpl.java   |    48 +-
 .../cloud/network/as/AutoScaleManagerImpl.java  |    30 +
 .../network/firewall/FirewallManagerImpl.java   |    34 +-
 .../cloud/network/guru/ControlNetworkGuru.java  |     4 +-
 .../cloud/network/guru/GuestNetworkGuru.java    |     4 +-
 .../lb/LoadBalancingRulesManagerImpl.java       |    19 +-
 .../router/VirtualNetworkApplianceManager.java  |     4 +
 .../VirtualNetworkApplianceManagerImpl.java     |   137 +-
 .../VpcVirtualNetworkApplianceManagerImpl.java  |    33 +-
 .../cloud/network/rules/RulesManagerImpl.java   |    19 +-
 .../network/vpc/NetworkACLManagerImpl.java      |    20 +-
 .../network/vpc/NetworkACLServiceImpl.java      |    31 +-
 .../com/cloud/network/vpc/VpcManagerImpl.java   |    26 +-
 .../network/vpn/RemoteAccessVpnManagerImpl.java |    12 +-
 .../network/vpn/Site2SiteVpnManagerImpl.java    |    33 +-
 .../com/cloud/resource/ResourceManagerImpl.java |     3 +-
 server/src/com/cloud/server/Criteria.java       |     2 +
 .../com/cloud/server/ManagementServerImpl.java  |    14 +-
 .../com/cloud/storage/VolumeApiServiceImpl.java |   108 +-
 .../storage/snapshot/SnapshotSchedulerImpl.java |    10 +-
 .../template/HypervisorTemplateAdapter.java     |    25 +-
 .../com/cloud/template/TemplateManagerImpl.java |    50 +-
 server/src/com/cloud/user/DomainManager.java    |     1 -
 server/src/com/cloud/vm/UserVmManager.java      |     2 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java  |   267 +-
 .../vm/snapshot/VMSnapshotManagerImpl.java      |    34 +-
 .../lb/ApplicationLoadBalancerManagerImpl.java  |    24 +-
 .../metadata/ResourceMetaDataManagerTest.java   |     2 +-
 .../cloud/network/MockFirewallManagerImpl.java  |     2 +-
 .../cloud/template/TemplateManagerImplTest.java |    37 +
 .../com/cloud/vpc/MockNetworkManagerImpl.java   |     9 +-
 .../cloud/vpc/MockSite2SiteVpnManagerImpl.java  |     4 +-
 .../com/cloud/vpc/NetworkACLManagerTest.java    |     4 +-
 .../com/cloud/vpc/NetworkACLServiceTest.java    |    16 +-
 .../network/lb/ApplicationLoadBalancerTest.java |    14 +-
 services/console-proxy-rdp/rdpconsole/pom.xml   |     2 +-
 .../rdpconsole/src/main/java/common/Client.java |    92 +-
 .../src/main/java/streamer/ByteBuffer.java      |   122 +-
 .../src/test/java/common/ClientTest.java        |    43 +
 .../src/test/java/rdpclient/MockServerTest.java |     5 +
 .../src/test/java/streamer/ByteBufferTest.java  |   152 +
 .../consoleproxy/ConsoleProxyRdpClient.java     |    12 +-
 .../consoleproxy/ConsoleProxyVncClient.java     |    89 +-
 .../consoleproxy/ConsoleProxyRdpClientTest.java |    62 +
 services/pom.xml                                |    16 +
 .../PremiumSecondaryStorageManagerImpl.java     |    28 +-
 .../SecondaryStorageManagerImpl.java            |    12 +-
 setup/db/db/schema-421to430.sql                 |     3 +
 setup/db/db/schema-430to440.sql                 |   127 +-
 setup/db/templates.sql                          |     5 +
 .../rc.d/init.d/cloud-console-proxy.in          |     8 +-
 .../rc.d/init.d/cloud-console-proxy.in          |     8 +-
 .../rc.d/init.d/cloud-console-proxy.in          |     8 +-
 .../SYSCONFDIR/init.d/cloud-console-proxy.in    |     8 +-
 .../patches/debian/config/etc/dnsmasq.conf.tmpl |     4 +-
 .../patches/debian/config/opt/cloud/bin/ilb.sh  |    12 +-
 .../debian/config/opt/cloud/bin/loadbalancer.sh |     7 +-
 .../config/opt/cloud/bin/monitor_service.sh     |    27 +-
 .../debian/config/opt/cloud/bin/vpc_acl.sh      |    19 +-
 .../debian/config/opt/cloud/bin/vpc_guestnw.sh  |    44 +-
 .../config/opt/cloud/bin/vpc_loadbalancer.sh    |    13 +-
 .../patches/debian/config/root/reconfigLB.sh    |     7 +-
 .../component/test_multiple_ips_per_nic.py      |   853 ++
 .../component/test_persistent_networks.py       |  2045 +++-
 test/integration/component/test_portable_ip.py  |   132 +-
 test/integration/smoke/test_vm_life_cycle.py    |    84 +-
 test/selenium/browser/__init__.py               |    16 +
 test/selenium/browser/firefox.py                |    56 +
 test/selenium/common/Global_Locators.py         |   230 +
 test/selenium/common/__init__.py                |    18 +
 test/selenium/common/shared.py                  |   151 +
 test/selenium/cspages/__init__.py               |    18 +
 test/selenium/cspages/dashboard/__init__.py     |    18 +
 .../selenium/cspages/dashboard/dashboardpage.py |    73 +
 test/selenium/cspages/login/__init__.py         |    18 +
 test/selenium/cspages/login/loginpage.py        |   106 +
 test/selenium/cstests/__init__.py               |    17 +
 .../cstests/regressiontests/__init__.py         |    17 +
 test/selenium/cstests/smoketests/__init__.py    |    17 +
 .../cstests/smoketests/global_settings_test.py  |    69 +
 .../cstests/smoketests/login_logout_test.py     |   190 +
 .../cstests/smoketests/navigation_test.py       |    79 +
 test/selenium/cstests/smoketests/smokecfg.py    |    40 +
 tools/appliance/build.sh                        |    52 +-
 .../systemvm64template/definition.rb            |     6 +-
 .../definitions/systemvmtemplate/definition.rb  |     6 +-
 .../devcloud-kvm-advanced-fusion.cfg            |   139 +
 tools/devcloud-kvm/devcloud-kvm-advanced.cfg    |     4 +-
 tools/devcloud-kvm/pom.xml                      |     2 +-
 tools/devcloud/pom.xml                          |     2 +-
 tools/marvin/marvin/codes.py                    |     4 +
 tools/marvin/marvin/config/config.cfg           |   235 +-
 tools/marvin/marvin/integration/lib/base.py     |    40 +-
 tools/marvin/marvin/integration/lib/common.py   |   107 +-
 ui/css/cloudstack3.css                          |   231 +-
 ui/css/cloudstack3.ja.css                       |    66 -
 ui/css/cloudstack3.ja_JP.css                    |    76 +
 ui/dictionary.jsp                               |    89 +-
 ui/images/icons.png                             |   Bin 50052 -> 61164 bytes
 ui/images/infrastructure-icons.png              |   Bin 62059 -> 66823 bytes
 ui/images/sprites.png                           |   Bin 207810 -> 212515 bytes
 ui/index.jsp                                    |    20 +-
 ui/lib/jquery.validate.js                       |    34 +-
 ui/scripts/accounts.js                          |     2 +-
 ui/scripts/autoscaler.js                        |    26 +-
 ui/scripts/cloudStack.js                        |     8 +-
 ui/scripts/configuration.js                     |    10 +-
 ui/scripts/domains.js                           |     2 +-
 ui/scripts/installWizard.js                     |     4 +-
 ui/scripts/instanceWizard.js                    |    78 +-
 ui/scripts/instances.js                         |    71 +-
 ui/scripts/network.js                           |   145 +-
 ui/scripts/regions.js                           |    78 +-
 ui/scripts/sharedFunctions.js                   |    14 +-
 ui/scripts/system.js                            |   234 +-
 ui/scripts/templates.js                         |    91 +-
 ui/scripts/ui-custom/accountsWizard.js          |    33 +-
 ui/scripts/ui-custom/instanceWizard.js          |    34 +
 ui/scripts/ui/dialog.js                         |    14 +
 ui/scripts/ui/widgets/listView.js               |    29 +-
 ui/scripts/zoneWizard.js                        |    68 +-
 usage/pom.xml                                   |     5 -
 utils/conf/db.properties                        |     6 +-
 utils/conf/log4j-vmops.xml                      |    34 +-
 utils/pom.xml                                   |    70 +-
 utils/src/com/cloud/maint/Version.java          |     3 +
 utils/src/com/cloud/utils/ActionDelegate.java   |     7 +-
 .../com/cloud/utils/CloudResourceBundle.java    |     7 +-
 utils/src/com/cloud/utils/DateUtil.java         |     7 +-
 utils/src/com/cloud/utils/EnumUtils.java        |     7 +-
 utils/src/com/cloud/utils/ExecutionResult.java  |     2 +
 utils/src/com/cloud/utils/FileUtil.java         |     7 +-
 utils/src/com/cloud/utils/IteratorUtil.java     |     7 +-
 utils/src/com/cloud/utils/Journal.java          |     7 +-
 utils/src/com/cloud/utils/LogUtils.java         |     7 +-
 utils/src/com/cloud/utils/MethodCapturer.java   |     7 +-
 utils/src/com/cloud/utils/NumbersUtil.java      |     7 +-
 utils/src/com/cloud/utils/Pair.java             |     7 +-
 .../src/com/cloud/utils/PasswordGenerator.java  |     7 +-
 utils/src/com/cloud/utils/Predicate.java        |     7 +-
 utils/src/com/cloud/utils/ProcessUtil.java      |     7 +-
 utils/src/com/cloud/utils/Profiler.java         |     7 +-
 utils/src/com/cloud/utils/PropertiesUtil.java   |     7 +-
 utils/src/com/cloud/utils/ReflectUtil.java      |     7 +-
 utils/src/com/cloud/utils/S3Utils.java          |    37 +-
 utils/src/com/cloud/utils/SerialVersionUID.java |     7 +-
 utils/src/com/cloud/utils/StringUtils.java      |    15 +-
 utils/src/com/cloud/utils/SwiftUtil.java        |    41 +-
 utils/src/com/cloud/utils/Ternary.java          |     7 +-
 utils/src/com/cloud/utils/UriUtils.java         |    52 +-
 .../cloud/utils/UsernamePasswordValidator.java  |     7 +-
 utils/src/com/cloud/utils/UuidUtils.java        |    13 +-
 .../cloud/utils/backoff/BackoffAlgorithm.java   |     7 +-
 .../utils/backoff/impl/ConstantTimeBackoff.java |     7 +-
 .../backoff/impl/ConstantTimeBackoffMBean.java  |     7 +-
 .../utils/cisco/n1kv/vsm/NetconfHelper.java     |     7 +-
 .../cloud/utils/cisco/n1kv/vsm/PolicyMap.java   |     7 +-
 .../cloud/utils/cisco/n1kv/vsm/PortProfile.java |     7 +-
 .../cloud/utils/cisco/n1kv/vsm/VsmCommand.java  |     7 +-
 .../utils/cisco/n1kv/vsm/VsmOkResponse.java     |     7 +-
 .../cisco/n1kv/vsm/VsmPolicyMapResponse.java    |     7 +-
 .../cisco/n1kv/vsm/VsmPortProfileResponse.java  |     7 +-
 .../cloud/utils/cisco/n1kv/vsm/VsmResponse.java |     7 +-
 .../src/com/cloud/utils/component/Adapter.java  |     7 +-
 .../com/cloud/utils/component/AdapterBase.java  |     7 +-
 .../com/cloud/utils/component/AdapterList.java  |     7 +-
 .../cloud/utils/component/ComponentContext.java |     6 +-
 .../ComponentInstantiationPostProcessor.java    |     7 +-
 .../utils/component/ComponentLifecycle.java     |     7 +-
 .../utils/component/ComponentLifecycleBase.java |     7 +-
 .../component/ComponentMethodInterceptable.java |     7 +-
 .../component/ComponentMethodInterceptor.java   |     7 +-
 .../utils/component/ComponentNamingPolicy.java  |     7 +-
 .../src/com/cloud/utils/component/Manager.java  |     7 +-
 .../com/cloud/utils/component/ManagerBase.java  |     7 +-
 utils/src/com/cloud/utils/component/Named.java  |    37 +-
 .../cloud/utils/component/PluggableService.java |     7 +-
 .../src/com/cloud/utils/component/Registry.java |    37 +-
 .../utils/component/SystemIntegrityChecker.java |     7 +-
 .../utils/concurrency/NamedThreadFactory.java   |     7 +-
 .../com/cloud/utils/concurrency/Scheduler.java  |     7 +-
 .../utils/concurrency/SynchronizationEvent.java |     7 +-
 .../com/cloud/utils/concurrency/TestClock.java  |     7 +-
 .../com/cloud/utils/crypt/DBEncryptionUtil.java |     9 +-
 .../utils/crypt/EncryptionSecretKeyChecker.java |     7 +-
 .../utils/crypt/EncryptionSecretKeySender.java  |     7 +-
 utils/src/com/cloud/utils/crypt/RSAHelper.java  |     7 +-
 utils/src/com/cloud/utils/db/DbProperties.java  |    37 +-
 utils/src/com/cloud/utils/db/EntityManager.java |     5 +
 utils/src/com/cloud/utils/db/UUIDManager.java   |     3 +
 .../com/cloud/utils/encoding/URLEncoder.java    |    33 +-
 utils/src/com/cloud/utils/events/EventArgs.java |     7 +-
 .../com/cloud/utils/events/SubscriptionMgr.java |     7 +-
 .../utils/exception/CSExceptionErrorCode.java   |     6 +-
 .../utils/exception/CloudRuntimeException.java  |     7 +-
 .../com/cloud/utils/exception/ErrorContext.java |     3 +
 .../utils/exception/ExceptionProxyObject.java   |     7 +-
 .../cloud/utils/exception/ExceptionUtil.java    |     7 +-
 .../utils/exception/ExecutionException.java     |     7 +-
 .../HypervisorVersionChangedException.java      |     7 +-
 utils/src/com/cloud/utils/fsm/ChangeEvent.java  |    37 +-
 utils/src/com/cloud/utils/fsm/FiniteState.java  |     7 +-
 utils/src/com/cloud/utils/fsm/FiniteState2.java |    37 +-
 .../com/cloud/utils/fsm/FiniteStateObject.java  |     7 +-
 .../cloud/utils/fsm/NoTransitionException.java  |     7 +-
 utils/src/com/cloud/utils/fsm/State.java        |    37 +-
 utils/src/com/cloud/utils/fsm/StateDao.java     |     7 +-
 .../src/com/cloud/utils/fsm/StateListener.java  |     7 +-
 utils/src/com/cloud/utils/fsm/StateMachine.java |     7 +-
 .../src/com/cloud/utils/fsm/StateMachine2.java  |     7 +-
 utils/src/com/cloud/utils/fsm/StateObject.java  |     7 +-
 .../cloud/utils/log/CglibThrowableRenderer.java |     7 +-
 utils/src/com/cloud/utils/mgmt/JmxUtil.java     |     7 +-
 .../com/cloud/utils/mgmt/ManagementBean.java    |     7 +-
 .../utils/mgmt/PropertyMapDynamicBean.java      |     7 +-
 utils/src/com/cloud/utils/net/Ip.java           |     7 +-
 utils/src/com/cloud/utils/net/Ip4Address.java   |     7 +-
 utils/src/com/cloud/utils/net/MacAddress.java   |     7 +-
 utils/src/com/cloud/utils/net/NetUtils.java     |    22 +-
 utils/src/com/cloud/utils/net/NfsUtils.java     |     7 +-
 utils/src/com/cloud/utils/net/UrlUtil.java      |     7 +-
 .../src/com/cloud/utils/nio/HandlerFactory.java |     7 +-
 utils/src/com/cloud/utils/nio/Link.java         |     7 +-
 utils/src/com/cloud/utils/nio/NioClient.java    |     7 +-
 .../src/com/cloud/utils/nio/NioConnection.java  |     7 +-
 utils/src/com/cloud/utils/nio/NioServer.java    |     7 +-
 utils/src/com/cloud/utils/nio/Task.java         |     7 +-
 .../com/cloud/utils/nio/TrustAllManager.java    |     7 +-
 .../BasicEncodedRESTValidationStrategy.java     |    66 +
 .../utils/rest/CloudstackRESTException.java     |    39 +
 .../cloud/utils/rest/RESTServiceConnector.java  |   377 +
 .../utils/rest/RESTValidationStrategy.java      |   165 +
 .../cloud/utils/script/OutputInterpreter.java   |     7 +-
 utils/src/com/cloud/utils/script/Script.java    |     7 +-
 utils/src/com/cloud/utils/script/Script2.java   |     7 +-
 .../cloud/utils/security/CertificateHelper.java |     7 +-
 utils/src/com/cloud/utils/ssh/SSHCmdHelper.java |     7 +-
 .../src/com/cloud/utils/ssh/SSHKeysHelper.java  |     7 +-
 utils/src/com/cloud/utils/ssh/SshException.java |     7 +-
 utils/src/com/cloud/utils/ssh/SshHelper.java    |     2 +
 .../storage/encoding/DecodedDataObject.java     |    47 +-
 .../storage/encoding/DecodedDataStore.java      |    51 +-
 .../cloud/utils/storage/encoding/Decoder.java   |    37 +-
 .../utils/storage/encoding/EncodingType.java    |    37 +-
 .../com/cloud/utils/time/InaccurateClock.java   |     7 +-
 .../cloud/utils/time/InaccurateClockMBean.java  |     7 +-
 .../com/cloud/utils/xmlobject/XmlObject.java    |     3 +
 .../cloud/utils/xmlobject/XmlObjectParser.java  |     3 +
 .../utils/identity/ManagementServerNode.java    |     3 +
 .../ssl/EasySSLProtocolSocketFactory.java       |    53 +-
 .../contrib/ssl/EasyX509TrustManager.java       |    43 +-
 utils/test/com/cloud/utils/DummyImpl.java       |     7 +-
 utils/test/com/cloud/utils/DummyInterface.java  |     7 +-
 .../test/com/cloud/utils/DummyPremiumImpl.java  |     7 +-
 utils/test/com/cloud/utils/NumbersUtilTest.java |    10 +-
 .../com/cloud/utils/PasswordGeneratorTest.java  |     7 +-
 utils/test/com/cloud/utils/ProcessUtilTest.java |    33 +-
 .../com/cloud/utils/PropertiesUtilsTest.java    |     3 +
 utils/test/com/cloud/utils/ReflectUtilTest.java |     9 +-
 utils/test/com/cloud/utils/ScriptTest.java      |     7 +-
 utils/test/com/cloud/utils/StringUtilsTest.java |    18 +-
 utils/test/com/cloud/utils/TernaryTest.java     |     6 +-
 utils/test/com/cloud/utils/TestProfiler.java    |     7 +-
 utils/test/com/cloud/utils/UriUtilsTest.java    |    60 +
 utils/test/com/cloud/utils/UuidUtilsTest.java   |    42 +
 .../backoff/impl/ConstantTimeBackoffTest.java   |     7 +-
 .../com/cloud/utils/crypto/RSAHelperTest.java   |     3 +
 .../cloud/utils/encoding/UrlEncoderTest.java    |    37 +-
 .../utils/exception/ExceptionUtilTest.java      |    37 +-
 utils/test/com/cloud/utils/net/IpTest.java      |     7 +-
 .../test/com/cloud/utils/net/NetUtilsTest.java  |   234 +-
 .../utils/rest/RESTServiceConnectorTest.java    |   395 +
 .../com/cloud/utils/ssh/SSHKeysHelperTest.java  |     3 +
 .../utils/testcase/Log4jEnabledTestCase.java    |     7 +-
 .../test/com/cloud/utils/testcase/NioTest.java  |     7 +-
 .../cloud/utils/xmlobject/TestXmlObject.java    |     3 +
 .../cloud/utils/xmlobject/TestXmlObject2.java   |     3 +
 .../com/cloud/utils/QualifierTestContext.xml    |    30 +-
 .../utils/db/transactionContextBuilderTest.xml  |    30 +-
 utils/test/resources/log4j.xml                  |    30 +-
 utils/test/resources/testContext.xml            |    34 +-
 .../cloud/hypervisor/vmware/mo/ClusterMO.java   |    12 +-
 .../com/cloud/hypervisor/vmware/mo/HostMO.java  |    16 +
 .../hypervisor/vmware/mo/VirtualMachineMO.java  |    88 +-
 .../vmware/util/VmwareGuestOsMapper.java        |     1 +
 1194 files changed, 33829 insertions(+), 19413 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/com/cloud/event/EventTypes.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/com/cloud/network/vpc/StaticRouteProfile.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/com/cloud/storage/VolumeApiService.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/acl/SecurityChecker.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/APICommand.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/APICommand.java
index 690dd9a,6211afc..9b4dfaf
--- a/api/src/org/apache/cloudstack/api/APICommand.java
+++ b/api/src/org/apache/cloudstack/api/APICommand.java
@@@ -22,9 -22,8 +22,9 @@@ import java.lang.annotation.Retention
  import java.lang.annotation.RetentionPolicy;
  import java.lang.annotation.Target;
  
+ import org.apache.cloudstack.acl.IAMEntityType;
  import org.apache.cloudstack.acl.RoleType;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
- import org.apache.cloudstack.acl.IAMEntityType;
  
  @Retention(RetentionPolicy.RUNTIME)
  @Target({TYPE})
@@@ -41,8 -40,10 +41,12 @@@ public @interface APICommand 
  
      String since() default "";
  
 +    ResponseView responseView() default ResponseView.Full;
 +
+     boolean requestHasSensitiveInfo() default true;
+ 
+     boolean responseHasSensitiveInfo() default true;
+ 
      RoleType[] authorized() default {};
  
      IAMEntityType[] entityType() default {};

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/ApiConstants.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/BaseCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java
index a2399cf,1a319d8..0c46d50
--- a/api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java
@@@ -36,7 -34,8 +36,9 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.user.Account;
  import com.cloud.user.UserAccount;
  
- @APICommand(name = "createAccount", description = "Creates an account", responseObject = AccountResponse.class, entityType = { IAMEntityType.Account })
 -@APICommand(name = "createAccount", description = "Creates an account", responseObject = AccountResponse.class,
++
++@APICommand(name = "createAccount", description = "Creates an account", responseObject = AccountResponse.class, entityType = {IAMEntityType.Account},
+         requestHasSensitiveInfo = true, responseHasSensitiveInfo = true)
  public class CreateAccountCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(CreateAccountCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java
index f1547a4,9a7417a..8cc87c2
--- a/api/src/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/account/DeleteAccountCmd.java
@@@ -39,7 -36,8 +39,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.user.Account;
  import com.cloud.user.User;
  
- @APICommand(name = "deleteAccount", description = "Deletes a account, and all users associated with this account", responseObject = SuccessResponse.class, entityType = { IAMEntityType.Account })
 -@APICommand(name = "deleteAccount", description = "Deletes a account, and all users associated with this account", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteAccount", description = "Deletes a account, and all users associated with this account", responseObject = SuccessResponse.class, entityType = {IAMEntityType.Account},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteAccountCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteAccountCmd.class.getName());
      private static final String s_name = "deleteaccountresponse";
@@@ -104,7 -102,7 +105,7 @@@
          boolean result = _regionService.deleteUserAccount(this);
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete user account and all corresponding users");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/account/DisableAccountCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/account/DisableAccountCmd.java
index 028481c,642b748..1e81009
--- a/api/src/org/apache/cloudstack/api/command/admin/account/DisableAccountCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/account/DisableAccountCmd.java
@@@ -41,7 -37,8 +41,8 @@@ import com.cloud.exception.ConcurrentOp
  import com.cloud.exception.ResourceUnavailableException;
  import com.cloud.user.Account;
  
- @APICommand(name = "disableAccount", description = "Disables an account", responseObject = AccountResponse.class, entityType = { IAMEntityType.Account })
 -@APICommand(name = "disableAccount", description = "Disables an account", responseObject = AccountResponse.class,
++@APICommand(name = "disableAccount", description = "Disables an account", responseObject = AccountResponse.class, entityType = {IAMEntityType.Account},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class DisableAccountCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DisableAccountCmd.class.getName());
      private static final String s_name = "disableaccountresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/account/EnableAccountCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/account/EnableAccountCmd.java
index 9e38d3a,97913f5..1bfd71c
--- a/api/src/org/apache/cloudstack/api/command/admin/account/EnableAccountCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/account/EnableAccountCmd.java
@@@ -36,7 -32,8 +36,8 @@@ import org.apache.cloudstack.region.Reg
  
  import com.cloud.user.Account;
  
- @APICommand(name = "enableAccount", description = "Enables an account", responseObject = AccountResponse.class, entityType = { IAMEntityType.Account })
 -@APICommand(name = "enableAccount", description = "Enables an account", responseObject = AccountResponse.class,
++@APICommand(name = "enableAccount", description = "Enables an account", responseObject = AccountResponse.class, entityType = {IAMEntityType.Account},
+     requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class EnableAccountCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(EnableAccountCmd.class.getName());
      private static final String s_name = "enableaccountresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/account/LockAccountCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/account/LockAccountCmd.java
index ddc1628,1fd3d7e..780dac1
--- a/api/src/org/apache/cloudstack/api/command/admin/account/LockAccountCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/account/LockAccountCmd.java
@@@ -28,7 -27,8 +28,8 @@@ import org.apache.cloudstack.api.respon
  
  import com.cloud.user.Account;
  
- @APICommand(name = "lockAccount", description = "Locks an account", responseObject = AccountResponse.class, entityType = { IAMEntityType.Account })
 -@APICommand(name = "lockAccount", description = "Locks an account", responseObject = AccountResponse.class,
++@APICommand(name = "lockAccount", description = "Locks an account", responseObject = AccountResponse.class, entityType = {IAMEntityType.Account},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class LockAccountCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(LockAccountCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/account/UpdateAccountCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/account/UpdateAccountCmd.java
index d423848,61b1b31..8d9fe26
--- a/api/src/org/apache/cloudstack/api/command/admin/account/UpdateAccountCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/account/UpdateAccountCmd.java
@@@ -39,7 -35,8 +39,8 @@@ import org.apache.cloudstack.region.Reg
  
  import com.cloud.user.Account;
  
- @APICommand(name = "updateAccount", description = "Updates account information for the authenticated user", responseObject = AccountResponse.class, entityType = { IAMEntityType.Account })
 -@APICommand(name = "updateAccount", description = "Updates account information for the authenticated user", responseObject = AccountResponse.class,
++@APICommand(name = "updateAccount", description = "Updates account information for the authenticated user", responseObject = AccountResponse.class, entityType = {IAMEntityType.Account},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class UpdateAccountCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateAccountCmd.class.getName());
      private static final String s_name = "updateaccountresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java
index 1cec188,43b18ee..e6ea519
--- a/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java
@@@ -35,7 -34,8 +35,8 @@@ import org.apache.cloudstack.api.respon
  
  import com.cloud.network.router.VirtualRouter.Role;
  
- @APICommand(name = "listInternalLoadBalancerVMs", description = "List internal LB VMs.", responseObject = DomainRouterResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "listInternalLoadBalancerVMs", description = "List internal LB VMs.", responseObject = DomainRouterResponse.class,
++@APICommand(name = "listInternalLoadBalancerVMs", description = "List internal LB VMs.", responseObject = DomainRouterResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListInternalLBVMsCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListInternalLBVMsCmd.class.getName());
  
@@@ -134,6 -134,6 +135,6 @@@
      public void execute() {
          ListResponse<DomainRouterResponse> response = _queryService.searchForInternalLbVms(this);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java
index b747c30,a5b2bf7..54d7621
--- a/api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java
@@@ -39,7 -36,8 +39,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.network.router.VirtualRouter;
  import com.cloud.network.router.VirtualRouter.Role;
  
- @APICommand(name = "startInternalLoadBalancerVM", responseObject = DomainRouterResponse.class, description = "Starts an existing internal lb vm.", entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "startInternalLoadBalancerVM", responseObject = DomainRouterResponse.class, description = "Starts an existing internal lb vm.",
++@APICommand(name = "startInternalLoadBalancerVM", responseObject = DomainRouterResponse.class, description = "Starts an existing internal lb vm.", entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class StartInternalLBVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(StartInternalLBVMCmd.class.getName());
      private static final String s_name = "startinternallbvmresponse";
@@@ -116,7 -114,7 +117,7 @@@
          if (result != null) {
              DomainRouterResponse routerResponse = _responseGenerator.createDomainRouterResponse(result);
              routerResponse.setResponseName(getCommandName());
--            this.setResponseObject(routerResponse);
++            setResponseObject(routerResponse);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to start internal lb vm");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java
index f8a8b7b,88d864b..aa946be
--- a/api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java
@@@ -38,7 -35,8 +38,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.network.router.VirtualRouter;
  import com.cloud.network.router.VirtualRouter.Role;
  
- @APICommand(name = "stopInternalLoadBalancerVM", description = "Stops an Internal LB vm.", responseObject = DomainRouterResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "stopInternalLoadBalancerVM", description = "Stops an Internal LB vm.", responseObject = DomainRouterResponse.class,
++@APICommand(name = "stopInternalLoadBalancerVM", description = "Stops an Internal LB vm.", responseObject = DomainRouterResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class StopInternalLBVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(StopInternalLBVMCmd.class.getName());
      private static final String s_name = "stopinternallbvmresponse";
@@@ -118,7 -116,7 +119,7 @@@
          if (result != null) {
              DomainRouterResponse response = _responseGenerator.createDomainRouterResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to stop internal lb vm");
          }


[46/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
make Ovs as VPC provider


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a067ccb0
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a067ccb0
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a067ccb0

Branch: refs/heads/distributedrouter
Commit: a067ccb0f36807d184e0c74e0960e569d54e519d
Parents: d7ea69f
Author: Murali Reddy <mu...@gmail.com>
Authored: Wed Mar 5 01:26:53 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:58:18 2014 +0530

----------------------------------------------------------------------
 server/src/com/cloud/network/vpc/VpcManagerImpl.java | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a067ccb0/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 6da1a55..c5a048c 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -205,7 +205,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
     private final ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("VpcChecker"));
     private List<VpcProvider> vpcElements = null;
     private final List<Service> nonSupportedServices = Arrays.asList(Service.SecurityGroup, Service.Firewall);
-    private final List<Provider> supportedProviders = Arrays.asList(Provider.VPCVirtualRouter, Provider.NiciraNvp, Provider.InternalLbVm, Provider.Netscaler, Provider.JuniperContrailVpcRouter);
+    private final List<Provider> supportedProviders = Arrays.asList(Provider.VPCVirtualRouter,
+            Provider.NiciraNvp, Provider.InternalLbVm, Provider.Netscaler, Provider.JuniperContrailVpcRouter,
+            Provider.Ovs);
 
     int _cleanupInterval;
     int _maxNetworks;


[13/54] [abbrv] Merge branch 'master' into rbac.

Posted by mu...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/as/AutoScaleManagerImpl.java
index e07e502,2fa3821..755fc54
--- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
+++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
@@@ -59,8 -54,11 +59,9 @@@ import org.apache.cloudstack.config.Api
  import org.apache.cloudstack.context.CallContext;
  import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
  
 -import org.apache.log4j.Logger;
 -
  import com.cloud.api.ApiDBUtils;
- import com.cloud.api.ApiDispatcher;
+ import com.cloud.api.dispatch.DispatchChainFactory;
+ import com.cloud.api.dispatch.DispatchTask;
  import com.cloud.configuration.ConfigurationManager;
  import com.cloud.dc.DataCenter;
  import com.cloud.dc.DataCenter.NetworkType;
@@@ -126,9 -124,14 +127,11 @@@ import com.cloud.vm.UserVmService
  @Local(value = {AutoScaleService.class, AutoScaleManager.class})
  public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScaleManager, AutoScaleService {
      private static final Logger s_logger = Logger.getLogger(AutoScaleManagerImpl.class);
 -    private final ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1);
 +    private ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1);
  
 -    @Inject()
 +    @Inject
+     protected DispatchChainFactory dispatchChainFactory = null;
+     @Inject
      EntityManager _entityMgr;
      @Inject
      AccountDao _accountDao;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/resource/ResourceManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/resource/ResourceManagerImpl.java
index 689a0d7,2625885..f9a59ba
--- a/server/src/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/com/cloud/resource/ResourceManagerImpl.java
@@@ -821,70 -836,73 +836,73 @@@ public class ResourceManagerImpl extend
              @Override
              public void doInTransactionWithoutResult(TransactionStatus status) {
  
 -                _dcDao.releasePrivateIpAddress(host.getPrivateIpAddress(), host.getDataCenterId(), null);
 -                _agentMgr.disconnectWithoutInvestigation(hostId, Status.Event.Remove);
 +        _dcDao.releasePrivateIpAddress(host.getPrivateIpAddress(), host.getDataCenterId(), null);
 +        _agentMgr.disconnectWithoutInvestigation(hostId, Status.Event.Remove);
  
 -                // delete host details
 -                _hostDetailsDao.deleteDetails(hostId);
 +        // delete host details
 +        _hostDetailsDao.deleteDetails(hostId);
  
+                 // if host is GPU enabled, delete GPU entries
+                 _hostGpuGroupsDao.deleteGpuEntries(hostId);
+ 
 -                host.setGuid(null);
 -                Long clusterId = host.getClusterId();
 -                host.setClusterId(null);
 -                _hostDao.update(host.getId(), host);
 +        host.setGuid(null);
 +        Long clusterId = host.getClusterId();
 +        host.setClusterId(null);
 +        _hostDao.update(host.getId(), host);
  
 -                _hostDao.remove(hostId);
 -                if (clusterId != null) {
 -                    List<HostVO> hosts = listAllHostsInCluster(clusterId);
 -                    if (hosts.size() == 0) {
 -                        ClusterVO cluster = _clusterDao.findById(clusterId);
 -                        cluster.setGuid(null);
 -                        _clusterDao.update(clusterId, cluster);
 -                    }
 -                }
 -
 -                try {
 -                    resourceStateTransitTo(host, ResourceState.Event.DeleteHost, _nodeId);
 -                } catch (NoTransitionException e) {
 -                    s_logger.debug("Cannot transmit host " + host.getId() + "to Enabled state", e);
 -                }
 +        _hostDao.remove(hostId);
 +        if (clusterId != null) {
 +            List<HostVO> hosts = listAllHostsInCluster(clusterId);
 +            if (hosts.size() == 0) {
 +                ClusterVO cluster = _clusterDao.findById(clusterId);
 +                cluster.setGuid(null);
 +                _clusterDao.update(clusterId, cluster);
 +            }
 +        }
  
 -                // Delete the associated entries in host ref table
 -                _storagePoolHostDao.deletePrimaryRecordsForHost(hostId);
 +        try {
 +            resourceStateTransitTo(host, ResourceState.Event.DeleteHost, _nodeId);
 +        } catch (NoTransitionException e) {
 +            s_logger.debug("Cannot transmit host " + host.getId() + "to Enabled state", e);
 +        }
  
 -                // Make sure any VMs that were marked as being on this host are cleaned up
 -                List<VMInstanceVO> vms = _vmDao.listByHostId(hostId);
 -                for (VMInstanceVO vm : vms) {
 -                    // this is how VirtualMachineManagerImpl does it when it syncs VM states
 -                    vm.setState(State.Stopped);
 -                    vm.setHostId(null);
 -                    _vmDao.persist(vm);
 -                }
 +        // Delete the associated entries in host ref table
 +        _storagePoolHostDao.deletePrimaryRecordsForHost(hostId);
  
 -                // For pool ids you got, delete local storage host entries in pool table
 -                // where
 -                for (StoragePoolHostVO pool : pools) {
 -                    Long poolId = pool.getPoolId();
 -                    StoragePoolVO storagePool = _storagePoolDao.findById(poolId);
 -                    if (storagePool.isLocal() && isForceDeleteStorage) {
 -                        storagePool.setUuid(null);
 -                        storagePool.setClusterId(null);
 -                        _storagePoolDao.update(poolId, storagePool);
 -                        _storagePoolDao.remove(poolId);
 -                        s_logger.debug("Local storage id=" + poolId + " is removed as a part of host removal id=" + hostId);
 -                    }
 -                }
 -
 -                // delete the op_host_capacity entry
 -                Object[] capacityTypes = {Capacity.CAPACITY_TYPE_CPU, Capacity.CAPACITY_TYPE_MEMORY};
 -                SearchCriteria<CapacityVO> hostCapacitySC = _capacityDao.createSearchCriteria();
 -                hostCapacitySC.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, hostId);
 -                hostCapacitySC.addAnd("capacityType", SearchCriteria.Op.IN, capacityTypes);
 -                _capacityDao.remove(hostCapacitySC);
 -                // remove from dedicated resources
 -                DedicatedResourceVO dr = _dedicatedDao.findByHostId(hostId);
 -                if (dr != null) {
 -                    _dedicatedDao.remove(dr.getId());
 -                }
 +        // Make sure any VMs that were marked as being on this host are cleaned up
 +        List<VMInstanceVO> vms = _vmDao.listByHostId(hostId);
 +        for (VMInstanceVO vm : vms) {
 +            // this is how VirtualMachineManagerImpl does it when it syncs VM states
 +            vm.setState(State.Stopped);
 +            vm.setHostId(null);
 +            _vmDao.persist(vm);
 +        }
 +
 +        // For pool ids you got, delete local storage host entries in pool table
 +        // where
 +        for (StoragePoolHostVO pool : pools) {
 +            Long poolId = pool.getPoolId();
 +            StoragePoolVO storagePool = _storagePoolDao.findById(poolId);
 +            if (storagePool.isLocal() && isForceDeleteStorage) {
 +                storagePool.setUuid(null);
 +                storagePool.setClusterId(null);
 +                _storagePoolDao.update(poolId, storagePool);
 +                _storagePoolDao.remove(poolId);
 +                s_logger.debug("Local storage id=" + poolId + " is removed as a part of host removal id=" + hostId);
 +            }
 +        }
 +
 +        // delete the op_host_capacity entry
 +        Object[] capacityTypes = {Capacity.CAPACITY_TYPE_CPU, Capacity.CAPACITY_TYPE_MEMORY};
 +        SearchCriteria<CapacityVO> hostCapacitySC = _capacityDao.createSearchCriteria();
 +        hostCapacitySC.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, hostId);
 +        hostCapacitySC.addAnd("capacityType", SearchCriteria.Op.IN, capacityTypes);
 +        _capacityDao.remove(hostCapacitySC);
 +        // remove from dedicated resources
 +        DedicatedResourceVO dr = _dedicatedDao.findByHostId(hostId);
 +        if (dr != null) {
 +            _dedicatedDao.remove(dr.getId());
 +        }
              }
          });
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/user/AccountManagerImpl.java
index d5e4afc,c48e9b5..04d3e23
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@@ -2433,51 -2323,55 +2433,97 @@@ public class AccountManagerImpl extend
      }
  
      @Override
 -    public UserAccount getUserByApiKey(String apiKey) {
 -        return _userAccountDao.getUserByApiKey(apiKey);
 +    public void buildACLViewSearchCriteria(SearchCriteria<? extends ControlledEntity> sc, SearchCriteria<? extends ControlledEntity> aclSc, boolean isRecursive,
 +            List<Long> permittedDomains,
 +            List<Long> permittedAccounts, List<Long> permittedResources, ListProjectResourcesCriteria listProjectResourcesCriteria) {
 +
 +        if (listProjectResourcesCriteria != null) {
 +            // add criteria for project or not
 +            if (listProjectResourcesCriteria == ListProjectResourcesCriteria.SkipProjectResources) {
 +                sc.addAnd("accountType", SearchCriteria.Op.NEQ, Account.ACCOUNT_TYPE_PROJECT);
 +            } else if (listProjectResourcesCriteria == ListProjectResourcesCriteria.ListProjectResourcesOnly) {
 +                sc.addAnd("accountType", SearchCriteria.Op.EQ, Account.ACCOUNT_TYPE_PROJECT);
 +            }
 +        }
 +
 +        if (permittedDomains.isEmpty() && permittedAccounts.isEmpty() && permittedResources.isEmpty())
 +            // can access everything
 +            return;
 +
 +        // Note that this may have limitations on number of permitted domains, accounts, or resource ids are allowed due to sql package size limitation
 +        if (!permittedDomains.isEmpty()) {
 +            if (isRecursive) {
 +                for (int i = 0; i < permittedDomains.size(); i++) {
 +                    Domain domain = _domainDao.findById(permittedDomains.get(i));
 +                    aclSc.addOr("domainPath", SearchCriteria.Op.LIKE, domain.getPath() + "%");
 +                }
 +            } else {
 +                aclSc.addOr("domainId", SearchCriteria.Op.IN, permittedDomains.toArray());
 +            }
 +        }
 +        if (!permittedAccounts.isEmpty()) {
 +            aclSc.addOr("accountId", SearchCriteria.Op.IN, permittedAccounts.toArray());
 +        }
 +        if (!permittedResources.isEmpty()) {
 +            aclSc.addOr("id", SearchCriteria.Op.IN, permittedResources.toArray());
 +        }
 +
 +        sc.addAnd("accountId", SearchCriteria.Op.SC, aclSc);
 +    }
 +
 +    @Override
 +    public List<String> listAclGroupsByAccount(Long accountId) {
 +        if (_querySelectors == null || _querySelectors.size() == 0)
 +            return new ArrayList<String>();
 +
 +        QuerySelector qs = _querySelectors.get(0);
 +        return qs.listAclGroupsByAccount(accountId);
      }
  
+     @Override
+     public Long finalyzeAccountId(final String accountName, final Long domainId, final Long projectId, final boolean enabledOnly) {
+         if (accountName != null) {
+             if (domainId == null) {
+                 throw new InvalidParameterValueException("Account must be specified with domainId parameter");
+             }
+ 
+             final Domain domain = _domainMgr.getDomain(domainId);
+             if (domain == null) {
+                 throw new InvalidParameterValueException("Unable to find domain by id");
+             }
+ 
+             final Account account = getActiveAccountByName(accountName, domainId);
+             if (account != null && account.getType() != Account.ACCOUNT_TYPE_PROJECT) {
+                 if (!enabledOnly || account.getState() == Account.State.enabled) {
+                     return account.getId();
+                 } else {
+                     throw new PermissionDeniedException("Can't add resources to the account id=" + account.getId() + " in state=" + account.getState() +
+                             " as it's no longer active");
+                 }
+             } else {
+                 // idList is not used anywhere, so removed it now
+                 // List<IdentityProxy> idList = new ArrayList<IdentityProxy>();
+                 // idList.add(new IdentityProxy("domain", domainId, "domainId"));
+                 throw new InvalidParameterValueException("Unable to find account by name " + accountName + " in domain with specified id");
+             }
+         }
+ 
+         if (projectId != null) {
+             final Project project = _projectMgr.getProject(projectId);
+             if (project != null) {
+                 if (!enabledOnly || project.getState() == Project.State.Active) {
+                     return project.getProjectAccountId();
+                 } else {
+                     final PermissionDeniedException ex =
+                             new PermissionDeniedException("Can't add resources to the project with specified projectId in state=" + project.getState() +
+                                     " as it's no longer active");
+                     ex.addProxyObject(project.getUuid(), "projectId");
+                     throw ex;
+                 }
+             } else {
+                 throw new InvalidParameterValueException("Unable to find project by id");
+             }
+         }
+         return null;
+     }
 -
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/test/com/cloud/user/MockAccountManagerImpl.java
----------------------------------------------------------------------
diff --cc server/test/com/cloud/user/MockAccountManagerImpl.java
index fa786bf,5a44800..b411b18
--- a/server/test/com/cloud/user/MockAccountManagerImpl.java
+++ b/server/test/com/cloud/user/MockAccountManagerImpl.java
@@@ -345,10 -322,9 +345,15 @@@ public class MockAccountManagerImpl ext
      }
  
      @Override
 +    public void checkAccess(Account account, AccessType accessType, boolean sameOwner, String apiName,
 +            ControlledEntity... entities) throws PermissionDeniedException {
 +        // TODO Auto-generated method stub
++    }
 +
++    @Override
+     public Long finalyzeAccountId(String accountName, Long domainId, Long projectId, boolean enabledOnly) {
+         // TODO Auto-generated method stub
+         return null;
      }
  
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/setup/db/db/schema-430to440.sql
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/tools/marvin/marvin/integration/lib/base.py
----------------------------------------------------------------------


[07/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Fix unapproved licens issue.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/748c090b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/748c090b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/748c090b

Branch: refs/heads/distributedrouter
Commit: 748c090b2988bc4c4f8b2f647c31ac1d655cc784
Parents: 48e08fe
Author: Min Chen <mi...@citrix.com>
Authored: Wed Mar 5 14:28:06 2014 -0800
Committer: Min Chen <mi...@citrix.com>
Committed: Mon Mar 10 11:27:10 2014 -0700

----------------------------------------------------------------------
 .../org/apache/cloudstack/acl/IAMEntityType.java   | 16 ++++++++++++++++
 .../org/apache/cloudstack/acl/PermissionScope.java | 16 ++++++++++++++++
 .../cloudstack/iam/test/IAMApiServiceTest.java     | 16 ++++++++++++++++
 .../iam/server/dao/IAMAccountPolicyMapDao.java     | 16 ++++++++++++++++
 .../iam/server/dao/IAMAccountPolicyMapDaoImpl.java | 16 ++++++++++++++++
 .../iam/server/dao/IAMGroupPolicyMapDao.java       | 17 +++++++++++++++++
 .../iam/server/dao/IAMGroupPolicyMapDaoImpl.java   | 16 ++++++++++++++++
 7 files changed, 113 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/748c090b/api/src/org/apache/cloudstack/acl/IAMEntityType.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/acl/IAMEntityType.java b/api/src/org/apache/cloudstack/acl/IAMEntityType.java
index 9299ae9..c1703ea 100644
--- a/api/src/org/apache/cloudstack/acl/IAMEntityType.java
+++ b/api/src/org/apache/cloudstack/acl/IAMEntityType.java
@@ -1,3 +1,19 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
 package org.apache.cloudstack.acl;
 
 public enum IAMEntityType {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/748c090b/api/src/org/apache/cloudstack/acl/PermissionScope.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/acl/PermissionScope.java b/api/src/org/apache/cloudstack/acl/PermissionScope.java
index 03dbc10..6647440 100644
--- a/api/src/org/apache/cloudstack/acl/PermissionScope.java
+++ b/api/src/org/apache/cloudstack/acl/PermissionScope.java
@@ -1,3 +1,19 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
 package org.apache.cloudstack.acl;
 
 public enum PermissionScope {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/748c090b/services/iam/plugin/test/org/apache/cloudstack/iam/test/IAMApiServiceTest.java
----------------------------------------------------------------------
diff --git a/services/iam/plugin/test/org/apache/cloudstack/iam/test/IAMApiServiceTest.java b/services/iam/plugin/test/org/apache/cloudstack/iam/test/IAMApiServiceTest.java
index dc5c168..b825ab2 100644
--- a/services/iam/plugin/test/org/apache/cloudstack/iam/test/IAMApiServiceTest.java
+++ b/services/iam/plugin/test/org/apache/cloudstack/iam/test/IAMApiServiceTest.java
@@ -1,3 +1,19 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
 package org.apache.cloudstack.iam.test;
 
 import static org.junit.Assert.assertEquals;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/748c090b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMAccountPolicyMapDao.java
----------------------------------------------------------------------
diff --git a/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMAccountPolicyMapDao.java b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMAccountPolicyMapDao.java
index 4caf659..0162589 100644
--- a/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMAccountPolicyMapDao.java
+++ b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMAccountPolicyMapDao.java
@@ -1,3 +1,19 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
 package org.apache.cloudstack.iam.server.dao;
 
 import java.util.List;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/748c090b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMAccountPolicyMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMAccountPolicyMapDaoImpl.java b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMAccountPolicyMapDaoImpl.java
index 3ecca3b..d74e86f 100644
--- a/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMAccountPolicyMapDaoImpl.java
+++ b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMAccountPolicyMapDaoImpl.java
@@ -1,3 +1,19 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
 package org.apache.cloudstack.iam.server.dao;
 
 import java.util.List;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/748c090b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMGroupPolicyMapDao.java
----------------------------------------------------------------------
diff --git a/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMGroupPolicyMapDao.java b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMGroupPolicyMapDao.java
index 6a2df89..3f5f232 100644
--- a/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMGroupPolicyMapDao.java
+++ b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMGroupPolicyMapDao.java
@@ -1,8 +1,25 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
 package org.apache.cloudstack.iam.server.dao;
 
 import java.util.List;
 
 import org.apache.cloudstack.iam.server.IAMGroupPolicyMapVO;
+
 import com.cloud.utils.db.GenericDao;
 
 public interface IAMGroupPolicyMapDao extends GenericDao<IAMGroupPolicyMapVO, Long> {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/748c090b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMGroupPolicyMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMGroupPolicyMapDaoImpl.java b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMGroupPolicyMapDaoImpl.java
index 95b6bac..ac42f04 100644
--- a/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMGroupPolicyMapDaoImpl.java
+++ b/services/iam/server/src/org/apache/cloudstack/iam/server/dao/IAMGroupPolicyMapDaoImpl.java
@@ -1,3 +1,19 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
 package org.apache.cloudstack.iam.server.dao;
 
 import java.util.List;


[21/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Removing the copy task that is not needed any more.

We do not need to copy commands.properties to utils anymore since the IAM permissions are no longer loaded during Upgrade


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/fa80c63c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/fa80c63c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/fa80c63c

Branch: refs/heads/distributedrouter
Commit: fa80c63c339aceba11064ca649d44516b9a421af
Parents: 1f6263d
Author: Prachi Damle <pr...@cloud.com>
Authored: Thu Mar 13 14:14:12 2014 -0700
Committer: Prachi Damle <pr...@cloud.com>
Committed: Thu Mar 13 14:14:12 2014 -0700

----------------------------------------------------------------------
 client/pom.xml | 6 ------
 1 file changed, 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fa80c63c/client/pom.xml
----------------------------------------------------------------------
diff --git a/client/pom.xml b/client/pom.xml
index eadd6e9..74c459e 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -510,12 +510,6 @@
                     <exclude name="*.in"/>
                   </fileset>
                 </copy>
-                <copy overwrite="true" todir="${basedir}/../utils/conf/">
-                  <fileset dir="${basedir}/tomcatconf">
-                    <include name="commands.properties.in" />
-                  </fileset>
-                  <globmapper from="*.in" to="*" />
-                </copy>
               </target>
             </configuration>
           </execution>


[04/54] [abbrv] Merge branch 'master' into rbac.

Posted by mu...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmProfilesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmProfilesCmd.java
index 8a4a522,782ccae..94f0eee
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmProfilesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmProfilesCmd.java
@@@ -18,7 -18,8 +18,11 @@@ package org.apache.cloudstack.api.comma
  
  import java.util.ArrayList;
  import java.util.List;
+ 
++import org.apache.log4j.Logger;
++
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
@@@ -28,11 -29,12 +32,11 @@@ import org.apache.cloudstack.api.respon
  import org.apache.cloudstack.api.response.ServiceOfferingResponse;
  import org.apache.cloudstack.api.response.TemplateResponse;
  import org.apache.cloudstack.api.response.ZoneResponse;
  
  import com.cloud.network.as.AutoScaleVmProfile;
  
- @APICommand(name = "listAutoScaleVmProfiles", description = "Lists autoscale vm profiles.", responseObject = AutoScaleVmProfileResponse.class, entityType = { IAMEntityType.AutoScaleVmProfile })
 -@APICommand(name = "listAutoScaleVmProfiles", description = "Lists autoscale vm profiles.", responseObject = AutoScaleVmProfileResponse.class,
++@APICommand(name = "listAutoScaleVmProfiles", description = "Lists autoscale vm profiles.", responseObject = AutoScaleVmProfileResponse.class, entityType = { IAMEntityType.AutoScaleVmProfile },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListAutoScaleVmProfilesCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListAutoScaleVmProfilesCmd.class.getName());
  
@@@ -104,7 -118,7 +120,7 @@@
          }
          response.setResponses(responses);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScalePolicyCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScalePolicyCmd.java
index 26f06bd,d0be35d..8cd7211
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScalePolicyCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScalePolicyCmd.java
@@@ -39,7 -36,8 +39,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.as.AutoScalePolicy;
  import com.cloud.user.Account;
  
- @APICommand(name = "updateAutoScalePolicy", description = "Updates an existing autoscale policy.", responseObject = AutoScalePolicyResponse.class, entityType = { IAMEntityType.AutoScalePolicy })
 -@APICommand(name = "updateAutoScalePolicy", description = "Updates an existing autoscale policy.", responseObject = AutoScalePolicyResponse.class,
++@APICommand(name = "updateAutoScalePolicy", description = "Updates an existing autoscale policy.", responseObject = AutoScalePolicyResponse.class, entityType = {IAMEntityType.AutoScalePolicy},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdateAutoScalePolicyCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateAutoScalePolicyCmd.class.getName());
  
@@@ -79,7 -76,7 +80,7 @@@
          if (result != null) {
              AutoScalePolicyResponse response = _responseGenerator.createAutoScalePolicyResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update autoscale policy");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmGroupCmd.java
index 1dbdf34,c350b10..60ea51e
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmGroupCmd.java
@@@ -19,11 -19,7 +19,12 @@@ package org.apache.cloudstack.api.comma
  
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
@@@ -39,7 -36,8 +40,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.as.AutoScaleVmGroup;
  import com.cloud.user.Account;
  
- @APICommand(name = "updateAutoScaleVmGroup", description = "Updates an existing autoscale vm group.", responseObject = AutoScaleVmGroupResponse.class, entityType = { IAMEntityType.AutoScaleVmGroup })
 -@APICommand(name = "updateAutoScaleVmGroup", description = "Updates an existing autoscale vm group.", responseObject = AutoScaleVmGroupResponse.class,
++@APICommand(name = "updateAutoScaleVmGroup", description = "Updates an existing autoscale vm group.", responseObject = AutoScaleVmGroupResponse.class, entityType = { IAMEntityType.AutoScaleVmGroup },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdateAutoScaleVmGroupCmd extends BaseAsyncCustomIdCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateAutoScaleVmGroupCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmProfileCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmProfileCmd.java
index 87b936d,31f7329..54e34da
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmProfileCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/UpdateAutoScaleVmProfileCmd.java
@@@ -19,11 -19,7 +19,12 @@@ package org.apache.cloudstack.api.comma
  
  import java.util.Map;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
@@@ -40,7 -37,8 +41,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.as.AutoScaleVmProfile;
  import com.cloud.user.Account;
  
- @APICommand(name = "updateAutoScaleVmProfile", description = "Updates an existing autoscale vm profile.", responseObject = AutoScaleVmProfileResponse.class, entityType = { IAMEntityType.AutoScaleVmProfile })
 -@APICommand(name = "updateAutoScaleVmProfile", description = "Updates an existing autoscale vm profile.", responseObject = AutoScaleVmProfileResponse.class,
++@APICommand(name = "updateAutoScaleVmProfile", description = "Updates an existing autoscale vm profile.", responseObject = AutoScaleVmProfileResponse.class, entityType = { IAMEntityType.AutoScaleVmProfile },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdateAutoScaleVmProfileCmd extends BaseAsyncCustomIdCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateAutoScaleVmProfileCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/event/ArchiveEventsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/event/ArchiveEventsCmd.java
index 22eae05,5b0b94a..8ff2c3e
--- a/api/src/org/apache/cloudstack/api/command/user/event/ArchiveEventsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/event/ArchiveEventsCmd.java
@@@ -35,7 -34,8 +35,8 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.user.Account;
  
- @APICommand(name = "archiveEvents", description = "Archive one or more events.", responseObject = SuccessResponse.class, entityType = { IAMEntityType.Event })
 -@APICommand(name = "archiveEvents", description = "Archive one or more events.", responseObject = SuccessResponse.class,
++@APICommand(name = "archiveEvents", description = "Archive one or more events.", responseObject = SuccessResponse.class, entityType = {IAMEntityType.Event},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ArchiveEventsCmd extends BaseCmd {
  
      public static final Logger s_logger = Logger.getLogger(ArchiveEventsCmd.class.getName());
@@@ -112,7 -112,7 +113,7 @@@
          boolean result = _mgr.archiveEvents(this);
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Unable to archive Events, one or more parameters has invalid values");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/event/DeleteEventsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/event/DeleteEventsCmd.java
index ca802a4,ccb6127..10c1c0c
--- a/api/src/org/apache/cloudstack/api/command/user/event/DeleteEventsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/event/DeleteEventsCmd.java
@@@ -35,7 -34,8 +35,8 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteEvents", description = "Delete one or more events.", responseObject = SuccessResponse.class, entityType = { IAMEntityType.Event })
 -@APICommand(name = "deleteEvents", description = "Delete one or more events.", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteEvents", description = "Delete one or more events.", responseObject = SuccessResponse.class, entityType = {IAMEntityType.Event},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteEventsCmd extends BaseCmd {
  
      public static final Logger s_logger = Logger.getLogger(DeleteEventsCmd.class.getName());
@@@ -112,7 -112,7 +113,7 @@@
          boolean result = _mgr.deleteEvents(this);
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Unable to delete Events, one or more parameters has invalid values");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java
index 620bd86,b3525c3..b420cf1
--- a/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java
@@@ -28,7 -27,8 +28,8 @@@ import org.apache.cloudstack.api.Parame
  import org.apache.cloudstack.api.response.EventResponse;
  import org.apache.cloudstack.api.response.ListResponse;
  
- @APICommand(name = "listEvents", description = "A command to list events.", responseObject = EventResponse.class, entityType = { IAMEntityType.Event })
 -@APICommand(name = "listEvents", description = "A command to list events.", responseObject = EventResponse.class,
++@APICommand(name = "listEvents", description = "A command to list events.", responseObject = EventResponse.class, entityType = {IAMEntityType.Event},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListEventsCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListEventsCmd.class.getName());
  
@@@ -109,6 -109,6 +110,6 @@@
  
          ListResponse<EventResponse> response = _queryService.searchForEvents(this);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java
index 20029bc,d15ea4b..8ef1b89
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java
@@@ -44,7 -45,8 +45,8 @@@ import com.cloud.network.rules.Firewall
  import com.cloud.user.Account;
  import com.cloud.utils.net.NetUtils;
  
- @APICommand(name = "createEgressFirewallRule", description = "Creates a egress firewall rule for a given network ", responseObject = FirewallResponse.class, entityType = { IAMEntityType.FirewallRule })
 -@APICommand(name = "createEgressFirewallRule", description = "Creates a egress firewall rule for a given network ", responseObject = FirewallResponse.class,
++@APICommand(name = "createEgressFirewallRule", description = "Creates a egress firewall rule for a given network ", responseObject = FirewallResponse.class, entityType = { IAMEntityType.FirewallRule },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateEgressFirewallRuleCmd extends BaseAsyncCreateCmd implements FirewallRule {
      public static final Logger s_logger = Logger.getLogger(CreateEgressFirewallRuleCmd.class.getName());
  
@@@ -271,8 -276,8 +276,8 @@@
  
      @Override
      public String getEventDescription() {
 -        Network network = _networkService.getNetwork(networkId);
 +         Network network = _networkService.getNetwork(networkId);
-          return ("Creating firewall rule for network: " + network + " for protocol:" + this.getProtocol());
+         return ("Creating firewall rule for network: " + network + " for protocol:" + getProtocol());
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java
index e2fd492,76c6e74..21e680a
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java
@@@ -43,7 -44,8 +44,8 @@@ import com.cloud.network.rules.Firewall
  import com.cloud.user.Account;
  import com.cloud.utils.net.NetUtils;
  
- @APICommand(name = "createFirewallRule", description = "Creates a firewall rule for a given ip address", responseObject = FirewallResponse.class, entityType = { IAMEntityType.FirewallRule })
 -@APICommand(name = "createFirewallRule", description = "Creates a firewall rule for a given ip address", responseObject = FirewallResponse.class,
++@APICommand(name = "createFirewallRule", description = "Creates a firewall rule for a given ip address", responseObject = FirewallResponse.class, entityType = { IAMEntityType.FirewallRule },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateFirewallRuleCmd extends BaseAsyncCreateCmd implements FirewallRule {
      public static final Logger s_logger = Logger.getLogger(CreateFirewallRuleCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java
index a072d90,53945a6..7328374
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java
@@@ -43,8 -44,10 +44,10 @@@ import com.cloud.network.IpAddress
  import com.cloud.network.rules.PortForwardingRule;
  import com.cloud.user.Account;
  import com.cloud.utils.net.Ip;
+ import com.cloud.utils.net.NetUtils;
  
- @APICommand(name = "createPortForwardingRule", description = "Creates a port forwarding rule", responseObject = FirewallRuleResponse.class, entityType = { IAMEntityType.PortForwardingRule })
 -@APICommand(name = "createPortForwardingRule", description = "Creates a port forwarding rule", responseObject = FirewallRuleResponse.class,
++@APICommand(name = "createPortForwardingRule", description = "Creates a port forwarding rule", responseObject = FirewallRuleResponse.class, entityType = { IAMEntityType.PortForwardingRule },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreatePortForwardingRuleCmd extends BaseAsyncCreateCmd implements PortForwardingRule {
      public static final Logger s_logger = Logger.getLogger(CreatePortForwardingRuleCmd.class.getName());
  
@@@ -115,9 -118,12 +118,12 @@@
      @Parameter(name = ApiConstants.VM_GUEST_IP,
                 type = CommandType.STRING,
                 required = false,
 -               description = "VM guest nic Secondary ip address for the port forwarding rule")
 +    description = "VM guest nic Secondary ip address for the port forwarding rule")
      private String vmSecondaryIp;
  
+     @Parameter(name = ApiConstants.FOR_DISPLAY, type = CommandType.BOOLEAN, description = "an optional field, whether to the display the rule to the end user or not", since = "4.4", authorized = {RoleType.Admin})
+     private Boolean display;
+ 
      // ///////////////////////////////////////////////////
      // ///////////////// Accessors ///////////////////////
      // ///////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/firewall/DeleteEgressFirewallRuleCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/firewall/DeleteEgressFirewallRuleCmd.java
index 7048826,5ce2245..ebed335
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/DeleteEgressFirewallRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/DeleteEgressFirewallRuleCmd.java
@@@ -39,7 -36,8 +39,8 @@@ import com.cloud.exception.InvalidParam
  import com.cloud.exception.ResourceUnavailableException;
  import com.cloud.network.rules.FirewallRule;
  
- @APICommand(name = "deleteEgressFirewallRule", description = "Deletes an ggress firewall rule", responseObject = SuccessResponse.class, entityType = { IAMEntityType.FirewallRule })
 -@APICommand(name = "deleteEgressFirewallRule", description = "Deletes an ggress firewall rule", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteEgressFirewallRule", description = "Deletes an ggress firewall rule", responseObject = SuccessResponse.class, entityType = {IAMEntityType.FirewallRule},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteEgressFirewallRuleCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteEgressFirewallRuleCmd.class.getName());
      private static final String s_name = "deleteegressfirewallruleresponse";
@@@ -102,7 -99,7 +103,7 @@@
  
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete egress firewall rule");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/firewall/DeleteFirewallRuleCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/firewall/DeleteFirewallRuleCmd.java
index 59612e9,7b10299..3f61e64
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/DeleteFirewallRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/DeleteFirewallRuleCmd.java
@@@ -38,7 -35,8 +38,8 @@@ import com.cloud.exception.InvalidParam
  import com.cloud.exception.ResourceUnavailableException;
  import com.cloud.network.rules.FirewallRule;
  
- @APICommand(name = "deleteFirewallRule", description = "Deletes a firewall rule", responseObject = SuccessResponse.class, entityType = { IAMEntityType.FirewallRule })
 -@APICommand(name = "deleteFirewallRule", description = "Deletes a firewall rule", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteFirewallRule", description = "Deletes a firewall rule", responseObject = SuccessResponse.class, entityType = {IAMEntityType.FirewallRule},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteFirewallRuleCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteFirewallRuleCmd.class.getName());
      private static final String s_name = "deletefirewallruleresponse";
@@@ -100,7 -98,7 +101,7 @@@
  
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete firewall rule");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/firewall/DeletePortForwardingRuleCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/firewall/DeletePortForwardingRuleCmd.java
index 1457a32,1e6e592..551885d
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/DeletePortForwardingRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/DeletePortForwardingRuleCmd.java
@@@ -37,7 -34,8 +37,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.network.rules.PortForwardingRule;
  
- @APICommand(name = "deletePortForwardingRule", description = "Deletes a port forwarding rule", responseObject = SuccessResponse.class, entityType = { IAMEntityType.PortForwardingRule })
 -@APICommand(name = "deletePortForwardingRule", description = "Deletes a port forwarding rule", responseObject = SuccessResponse.class,
++@APICommand(name = "deletePortForwardingRule", description = "Deletes a port forwarding rule", responseObject = SuccessResponse.class, entityType = {IAMEntityType.PortForwardingRule},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeletePortForwardingRuleCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeletePortForwardingRuleCmd.class.getName());
      private static final String s_name = "deleteportforwardingruleresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/firewall/ListEgressFirewallRulesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/firewall/ListEgressFirewallRulesCmd.java
index 8307a9e,9585256..ece2201
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/ListEgressFirewallRulesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/ListEgressFirewallRulesCmd.java
@@@ -34,7 -32,8 +34,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.rules.FirewallRule;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listEgressFirewallRules", description = "Lists all egress firewall rules for network id.", responseObject = FirewallResponse.class, entityType = { IAMEntityType.FirewallRule })
 -@APICommand(name = "listEgressFirewallRules", description = "Lists all egress firewall rules for network id.", responseObject = FirewallResponse.class,
++@APICommand(name = "listEgressFirewallRules", description = "Lists all egress firewall rules for network id.", responseObject = FirewallResponse.class, entityType = { IAMEntityType.FirewallRule },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListEgressFirewallRulesCmd extends ListFirewallRulesCmd {
      public static final Logger s_logger = Logger.getLogger(ListEgressFirewallRulesCmd.class.getName());
      private static final String s_name = "listegressfirewallrulesresponse";
@@@ -92,6 -91,6 +93,6 @@@
          }
          response.setResponses(fwResponses, result.second());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/firewall/ListFirewallRulesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/firewall/ListFirewallRulesCmd.java
index e1e83cd,01fc436..870f81d
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/ListFirewallRulesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/ListFirewallRulesCmd.java
@@@ -19,9 -19,7 +19,10 @@@ package org.apache.cloudstack.api.comma
  import java.util.ArrayList;
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
@@@ -35,7 -34,8 +36,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.rules.FirewallRule;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listFirewallRules", description = "Lists all firewall rules for an IP address.", responseObject = FirewallResponse.class, entityType = { IAMEntityType.FirewallRule })
 -@APICommand(name = "listFirewallRules", description = "Lists all firewall rules for an IP address.", responseObject = FirewallResponse.class,
++@APICommand(name = "listFirewallRules", description = "Lists all firewall rules for an IP address.", responseObject = FirewallResponse.class, entityType = {IAMEntityType.FirewallRule},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListFirewallRulesCmd extends BaseListTaggedResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListFirewallRulesCmd.class.getName());
      private static final String s_name = "listfirewallrulesresponse";
@@@ -101,6 -112,6 +114,6 @@@
          }
          response.setResponses(fwResponses, result.second());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/firewall/ListPortForwardingRulesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/firewall/ListPortForwardingRulesCmd.java
index 11f6592,63b6ea7..681da33
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/ListPortForwardingRulesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/ListPortForwardingRulesCmd.java
@@@ -19,9 -19,7 +19,10 @@@ package org.apache.cloudstack.api.comma
  import java.util.ArrayList;
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
@@@ -34,7 -33,8 +35,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.rules.PortForwardingRule;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listPortForwardingRules", description = "Lists all port forwarding rules for an IP address.", responseObject = FirewallRuleResponse.class, entityType = { IAMEntityType.PortForwardingRule })
 -@APICommand(name = "listPortForwardingRules", description = "Lists all port forwarding rules for an IP address.", responseObject = FirewallRuleResponse.class,
++@APICommand(name = "listPortForwardingRules", description = "Lists all port forwarding rules for an IP address.", responseObject = FirewallRuleResponse.class, entityType = {IAMEntityType.PortForwardingRule},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListPortForwardingRulesCmd extends BaseListTaggedResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListPortForwardingRulesCmd.class.getName());
  
@@@ -98,6 -109,6 +111,6 @@@
          }
          response.setResponses(fwResponses, result.second());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java
index fec9ba2,b47247d..55b378a
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java
@@@ -16,9 -16,7 +16,10 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.firewall;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseAsyncCmd;
@@@ -37,7 -36,8 +38,8 @@@ import com.cloud.user.Account
  
  @APICommand(name = "updatePortForwardingRule",
              responseObject = FirewallRuleResponse.class,
-         description = "Updates a port forwarding rule.  Only the private port and the virtual machine can be updated.", entityType = {IAMEntityType.PortForwardingRule})
 - description = "Updates a port forwarding rule",
 - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
++        description = "Updates a port forwarding rule.  Only the private port and the virtual machine can be updated.", entityType = {IAMEntityType.PortForwardingRule},
++        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdatePortForwardingRuleCmd extends BaseAsyncCustomIdCmd {
      public static final Logger s_logger = Logger.getLogger(UpdatePortForwardingRuleCmd.class.getName());
      private static final String s_name = "updateportforwardingruleresponse";
@@@ -141,7 -148,7 +150,7 @@@
  
      @Override
      public void execute() {
-         PortForwardingRule rule = _rulesService.updatePortForwardingRule(id, getCustomId());
 -        PortForwardingRule rule = _rulesService.updatePortForwardingRule(id, this.getCustomId(), getDisplay());
++        PortForwardingRule rule = _rulesService.updatePortForwardingRule(id, getCustomId(), getDisplay());
          FirewallRuleResponse fwResponse = new FirewallRuleResponse();
          if (rule != null) {
              fwResponse = _responseGenerator.createPortForwardingRuleResponse(rule);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/iso/AttachIsoCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/iso/AttachIsoCmd.java
index d5e53a1,c7bd5b1..1b8087b
--- a/api/src/org/apache/cloudstack/api/command/user/iso/AttachIsoCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/iso/AttachIsoCmd.java
@@@ -34,7 -33,8 +34,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "attachIso", description = "Attaches an ISO to a virtual machine.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "attachIso", description = "Attaches an ISO to a virtual machine.", responseObject = UserVmResponse.class,
++@APICommand(name = "attachIso", description = "Attaches an ISO to a virtual machine.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class AttachIsoCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(AttachIsoCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/iso/DetachIsoCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/iso/DetachIsoCmd.java
index 1376c10,d398009..97db2f3
--- a/api/src/org/apache/cloudstack/api/command/user/iso/DetachIsoCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/iso/DetachIsoCmd.java
@@@ -32,7 -31,8 +32,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "detachIso", description = "Detaches any ISO file (if any) currently attached to a virtual machine.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "detachIso", description = "Detaches any ISO file (if any) currently attached to a virtual machine.", responseObject = UserVmResponse.class,
++@APICommand(name = "detachIso", description = "Detaches any ISO file (if any) currently attached to a virtual machine.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class DetachIsoCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DetachIsoCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/iso/ListIsoPermissionsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/iso/ListIsoPermissionsCmd.java
index 2f2c216,a54adfc..f8863d1
--- a/api/src/org/apache/cloudstack/api/command/user/iso/ListIsoPermissionsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/iso/ListIsoPermissionsCmd.java
@@@ -26,7 -25,11 +26,9 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.storage.Storage.ImageFormat;
  import com.cloud.template.VirtualMachineTemplate;
  
- @APICommand(name = "listIsoPermissions", description = "List iso visibility and all accounts that have permissions to view this iso.", responseObject = TemplatePermissionsResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "listIsoPermissions",
 -            description = "List iso visibility and all accounts that have permissions to view this iso.",
 -            responseObject = TemplatePermissionsResponse.class,
++@APICommand(name = "listIsoPermissions", description = "List iso visibility and all accounts that have permissions to view this iso.", responseObject = TemplatePermissionsResponse.class, responseView = ResponseView.Restricted,
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = false)
  public class ListIsoPermissionsCmd extends BaseListTemplateOrIsoPermissionsCmd {
      protected String getResponseName() {
          return "listisopermissionsresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
index af674eb,8c3e218..5f5c61f
--- a/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
@@@ -32,7 -31,8 +32,8 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.template.VirtualMachineTemplate.TemplateFilter;
  import com.cloud.user.Account;
  
- @APICommand(name = "listIsos", description = "Lists all available ISO files.", responseObject = TemplateResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "listIsos", description = "Lists all available ISO files.", responseObject = TemplateResponse.class,
++@APICommand(name = "listIsos", description = "Lists all available ISO files.", responseObject = TemplateResponse.class, responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListIsosCmd extends BaseListTaggedResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListIsosCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
index b78eeb6,af18057..fa1a29e
--- a/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
@@@ -38,7 -37,8 +38,8 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.exception.ResourceAllocationException;
  import com.cloud.template.VirtualMachineTemplate;
  
- @APICommand(name = "registerIso", responseObject = TemplateResponse.class, description = "Registers an existing ISO into the CloudStack Cloud.", responseView = ResponseView.Restricted)
 -@APICommand(name = "registerIso", responseObject = TemplateResponse.class, description = "Registers an existing ISO into the CloudStack Cloud.",
++@APICommand(name = "registerIso", responseObject = TemplateResponse.class, description = "Registers an existing ISO into the CloudStack Cloud.", responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class RegisterIsoCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(RegisterIsoCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java
index b77a913,5f24e6a..b569d65
--- a/api/src/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/iso/UpdateIsoCmd.java
@@@ -28,7 -27,8 +28,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.template.VirtualMachineTemplate;
  import com.cloud.user.Account;
  
- @APICommand(name = "updateIso", description = "Updates an ISO file.", responseObject = TemplateResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "updateIso", description = "Updates an ISO file.", responseObject = TemplateResponse.class,
++@APICommand(name = "updateIso", description = "Updates an ISO file.", responseObject = TemplateResponse.class, responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdateIsoCmd extends BaseUpdateTemplateOrIsoCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateIsoCmd.class.getName());
      private static final String s_name = "updateisoresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java
index ec9801b,4412d51..2d458a7
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java
@@@ -33,7 -32,11 +33,9 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.uservm.UserVm;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listLoadBalancerRuleInstances", description = "List all virtual machine instances that are assigned to a load balancer rule.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "listLoadBalancerRuleInstances",
 -            description = "List all virtual machine instances that are assigned to a load balancer rule.",
 -            responseObject = UserVmResponse.class,
++@APICommand(name = "listLoadBalancerRuleInstances", description = "List all virtual machine instances that are assigned to a load balancer rule.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted,
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = true)
  public class ListLoadBalancerRuleInstancesCmd extends BaseListCmd {
      public static final Logger s_logger = Logger.getLogger(ListLoadBalancerRuleInstancesCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
index db3d2cb,2f9220f..172b4c6
--- a/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
@@@ -16,9 -16,7 +16,10 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.network;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
@@@ -44,7 -42,8 +45,8 @@@ import com.cloud.network.Network
  import com.cloud.network.Network.GuestType;
  import com.cloud.offering.NetworkOffering;
  
- @APICommand(name = "createNetwork", description = "Creates a network", responseObject = NetworkResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Network })
 -@APICommand(name = "createNetwork", description = "Creates a network", responseObject = NetworkResponse.class,
++@APICommand(name = "createNetwork", description = "Creates a network", responseObject = NetworkResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.Network},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateNetworkCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(CreateNetworkCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/network/DeleteNetworkCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/network/DeleteNetworkCmd.java
index 4f6e9b6,224eec0..50bc94a
--- a/api/src/org/apache/cloudstack/api/command/user/network/DeleteNetworkCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/network/DeleteNetworkCmd.java
@@@ -36,7 -33,8 +36,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.network.Network;
  
- @APICommand(name = "deleteNetwork", description = "Deletes a network", responseObject = SuccessResponse.class, entityType = { IAMEntityType.Network })
 -@APICommand(name = "deleteNetwork", description = "Deletes a network", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteNetwork", description = "Deletes a network", responseObject = SuccessResponse.class, entityType = {IAMEntityType.Network},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteNetworkCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteNetworkOfferingCmd.class.getName());
      private static final String s_name = "deletenetworkresponse";
@@@ -79,7 -77,7 +80,7 @@@
          boolean result = _networkService.deleteNetwork(id, isForced());
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete network");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
index c64031e,2e54a07..455d8dc
--- a/api/src/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
@@@ -19,9 -19,7 +19,10 @@@ package org.apache.cloudstack.api.comma
  import java.util.ArrayList;
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
@@@ -36,7 -34,8 +37,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.Network;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listNetworks", description = "Lists all available networks.", responseObject = NetworkResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Network })
 -@APICommand(name = "listNetworks", description = "Lists all available networks.", responseObject = NetworkResponse.class,
++@APICommand(name = "listNetworks", description = "Lists all available networks.", responseObject = NetworkResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Network },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListNetworksCmd extends BaseListTaggedResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListNetworksCmd.class.getName());
      private static final String Name = "listnetworksresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java
index ce0df8c,db7b721..6baafda
--- a/api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java
@@@ -41,7 -38,9 +41,9 @@@ import com.cloud.network.Network
  
  @APICommand(name = "restartNetwork",
              description = "Restarts the network; includes 1) restarting network elements - virtual routers, dhcp servers 2) reapplying all public ips 3) reapplying loadBalancing/portForwarding rules",
-             responseObject = IPAddressResponse.class, entityType = { IAMEntityType.Network })
 -            responseObject = IPAddressResponse.class,
++        responseObject = IPAddressResponse.class, entityType = {IAMEntityType.Network},
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = false)
  public class RestartNetworkCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RestartNetworkCmd.class.getName());
      private static final String s_name = "restartnetworkresponse";
@@@ -94,7 -93,7 +96,7 @@@
          boolean result = _networkService.restartNetwork(this, getCleanup());
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to restart network");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java
index 2d7643c,d6eae94..aea7448
--- a/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java
@@@ -16,11 -16,7 +16,12 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.network;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
@@@ -42,7 -38,8 +43,8 @@@ import com.cloud.offering.NetworkOfferi
  import com.cloud.user.Account;
  import com.cloud.user.User;
  
- @APICommand(name = "updateNetwork", description = "Updates a network", responseObject = NetworkResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Network })
 -@APICommand(name = "updateNetwork", description = "Updates a network", responseObject = NetworkResponse.class,
++@APICommand(name = "updateNetwork", description = "Updates a network", responseObject = NetworkResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.Network},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdateNetworkCmd extends BaseAsyncCustomIdCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateNetworkCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/resource/UpdateResourceCountCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java
index 0650362,748f60c..4eca10f
--- a/api/src/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java
@@@ -45,7 -42,12 +45,9 @@@ import com.cloud.exception.InvalidParam
  import com.cloud.network.security.SecurityRule;
  import com.cloud.utils.StringUtils;
  
- @APICommand(name = "authorizeSecurityGroupEgress", responseObject = SecurityGroupRuleResponse.class, description = "Authorizes a particular egress rule for this security group", since = "3.0.0", entityType = { IAMEntityType.SecurityGroup })
 -@APICommand(name = "authorizeSecurityGroupEgress",
 -            responseObject = SecurityGroupRuleResponse.class,
 -            description = "Authorizes a particular egress rule for this security group",
 -            since = "3.0.0",
++@APICommand(name = "authorizeSecurityGroupEgress", responseObject = SecurityGroupRuleResponse.class, description = "Authorizes a particular egress rule for this security group", since = "3.0.0", entityType = {IAMEntityType.SecurityGroup},
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = false)
  @SuppressWarnings("rawtypes")
  public class AuthorizeSecurityGroupEgressCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(AuthorizeSecurityGroupIngressCmd.class.getName());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java
index 13de69c,d93a57c..41cea41
--- a/api/src/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java
@@@ -45,7 -42,11 +45,9 @@@ import com.cloud.exception.InvalidParam
  import com.cloud.network.security.SecurityRule;
  import com.cloud.utils.StringUtils;
  
- @APICommand(name = "authorizeSecurityGroupIngress", responseObject = SecurityGroupRuleResponse.class, description = "Authorizes a particular ingress rule for this security group", entityType = { IAMEntityType.SecurityGroup })
 -@APICommand(name = "authorizeSecurityGroupIngress",
 -            responseObject = SecurityGroupRuleResponse.class,
 -            description = "Authorizes a particular ingress rule for this security group",
++@APICommand(name = "authorizeSecurityGroupIngress", responseObject = SecurityGroupRuleResponse.class, description = "Authorizes a particular ingress rule for this security group", entityType = {IAMEntityType.SecurityGroup},
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = false)
  @SuppressWarnings("rawtypes")
  public class AuthorizeSecurityGroupIngressCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(AuthorizeSecurityGroupIngressCmd.class.getName());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/securitygroup/CreateSecurityGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/securitygroup/CreateSecurityGroupCmd.java
index 824db25,9e1bae3..1f7f872
--- a/api/src/org/apache/cloudstack/api/command/user/securitygroup/CreateSecurityGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/securitygroup/CreateSecurityGroupCmd.java
@@@ -33,7 -32,8 +33,8 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.network.security.SecurityGroup;
  import com.cloud.user.Account;
  
- @APICommand(name = "createSecurityGroup", responseObject = SecurityGroupResponse.class, description = "Creates a security group", entityType = { IAMEntityType.SecurityGroup })
 -@APICommand(name = "createSecurityGroup", responseObject = SecurityGroupResponse.class, description = "Creates a security group",
++@APICommand(name = "createSecurityGroup", responseObject = SecurityGroupResponse.class, description = "Creates a security group", entityType = {IAMEntityType.SecurityGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateSecurityGroupCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(CreateSecurityGroupCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/securitygroup/DeleteSecurityGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/securitygroup/DeleteSecurityGroupCmd.java
index 03634ad,2b23ac0..8e08254
--- a/api/src/org/apache/cloudstack/api/command/user/securitygroup/DeleteSecurityGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/securitygroup/DeleteSecurityGroupCmd.java
@@@ -36,7 -33,8 +36,8 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.exception.ResourceInUseException;
  
- @APICommand(name = "deleteSecurityGroup", description = "Deletes security group", responseObject = SuccessResponse.class, entityType = { IAMEntityType.SecurityGroup })
 -@APICommand(name = "deleteSecurityGroup", description = "Deletes security group", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteSecurityGroup", description = "Deletes security group", responseObject = SuccessResponse.class, entityType = {IAMEntityType.SecurityGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteSecurityGroupCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteSecurityGroupCmd.class.getName());
      private static final String s_name = "deletesecuritygroupresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java
index 23a8ad0,aa0c01b..02be63d
--- a/api/src/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/securitygroup/ListSecurityGroupsCmd.java
@@@ -28,7 -27,8 +28,8 @@@ import org.apache.cloudstack.api.respon
  import org.apache.cloudstack.api.response.SecurityGroupResponse;
  import org.apache.cloudstack.api.response.UserVmResponse;
  
- @APICommand(name = "listSecurityGroups", description = "Lists security groups", responseObject = SecurityGroupResponse.class, entityType = { IAMEntityType.SecurityGroup })
 -@APICommand(name = "listSecurityGroups", description = "Lists security groups", responseObject = SecurityGroupResponse.class,
++@APICommand(name = "listSecurityGroups", description = "Lists security groups", responseObject = SecurityGroupResponse.class, entityType = {IAMEntityType.SecurityGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListSecurityGroupsCmd extends BaseListTaggedResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListSecurityGroupsCmd.class.getName());
  
@@@ -78,7 -78,7 +79,7 @@@
      public void execute() {
          ListResponse<SecurityGroupResponse> response = _queryService.searchForSecurityGroups(this);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupEgressCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupEgressCmd.java
index a93bee5,db341a3..d1ffc1e
--- a/api/src/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupEgressCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupEgressCmd.java
@@@ -34,8 -33,12 +34,10 @@@ import com.cloud.network.security.Secur
  import com.cloud.network.security.SecurityRule;
  import com.cloud.user.Account;
  
 -@APICommand(name = "revokeSecurityGroupEgress",
 -            responseObject = SuccessResponse.class,
 -            description = "Deletes a particular egress rule from this security group",
 -            since = "3.0.0",
 +
- @APICommand(name = "revokeSecurityGroupEgress", responseObject = SuccessResponse.class, description = "Deletes a particular egress rule from this security group", since = "3.0.0", entityType = { IAMEntityType.SecurityGroup })
++@APICommand(name = "revokeSecurityGroupEgress", responseObject = SuccessResponse.class, description = "Deletes a particular egress rule from this security group", since = "3.0.0", entityType = {IAMEntityType.SecurityGroup},
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = false)
  public class RevokeSecurityGroupEgressCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RevokeSecurityGroupEgressCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupIngressCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupIngressCmd.java
index 3a39ced,708277c..8543e0e
--- a/api/src/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupIngressCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/securitygroup/RevokeSecurityGroupIngressCmd.java
@@@ -36,7 -33,8 +36,8 @@@ import com.cloud.network.security.Secur
  import com.cloud.network.security.SecurityRule;
  import com.cloud.user.Account;
  
- @APICommand(name = "revokeSecurityGroupIngress", responseObject = SuccessResponse.class, description = "Deletes a particular ingress rule from this security group", entityType = { IAMEntityType.SecurityGroup })
 -@APICommand(name = "revokeSecurityGroupIngress", responseObject = SuccessResponse.class, description = "Deletes a particular ingress rule from this security group",
++@APICommand(name = "revokeSecurityGroupIngress", responseObject = SuccessResponse.class, description = "Deletes a particular ingress rule from this security group", entityType = {IAMEntityType.SecurityGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class RevokeSecurityGroupIngressCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RevokeSecurityGroupIngressCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
index 9097586,b764a41..2020518
--- a/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
@@@ -42,7 -41,8 +42,8 @@@ import com.cloud.storage.Snapshot
  import com.cloud.storage.Volume;
  import com.cloud.user.Account;
  
- @APICommand(name = "createSnapshot", description = "Creates an instant snapshot of a volume.", responseObject = SnapshotResponse.class, entityType = { IAMEntityType.Snapshot })
 -@APICommand(name = "createSnapshot", description = "Creates an instant snapshot of a volume.", responseObject = SnapshotResponse.class,
++@APICommand(name = "createSnapshot", description = "Creates an instant snapshot of a volume.", responseObject = SnapshotResponse.class, entityType = {IAMEntityType.Snapshot},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateSnapshotCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(CreateSnapshotCmd.class.getName());
      private static final String s_name = "createsnapshotresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/snapshot/DeleteSnapshotCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/snapshot/DeleteSnapshotCmd.java
index 3771300,deeeb78..7d57c21
--- a/api/src/org/apache/cloudstack/api/command/user/snapshot/DeleteSnapshotCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/DeleteSnapshotCmd.java
@@@ -36,7 -33,8 +36,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.storage.Snapshot;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteSnapshot", description = "Deletes a snapshot of a disk volume.", responseObject = SuccessResponse.class, entityType = { IAMEntityType.Snapshot })
 -@APICommand(name = "deleteSnapshot", description = "Deletes a snapshot of a disk volume.", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteSnapshot", description = "Deletes a snapshot of a disk volume.", responseObject = SuccessResponse.class, entityType = {IAMEntityType.Snapshot},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteSnapshotCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteSnapshotCmd.class.getName());
      private static final String s_name = "deletesnapshotresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
index b44e11f,320ed63..ed26e7f
--- a/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
@@@ -35,7 -34,8 +35,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.storage.Snapshot;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listSnapshots", description = "Lists all available snapshots for the account.", responseObject = SnapshotResponse.class, entityType = { IAMEntityType.Snapshot })
 -@APICommand(name = "listSnapshots", description = "Lists all available snapshots for the account.", responseObject = SnapshotResponse.class,
++@APICommand(name = "listSnapshots", description = "Lists all available snapshots for the account.", responseObject = SnapshotResponse.class, entityType = {IAMEntityType.Snapshot},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListSnapshotsCmd extends BaseListTaggedResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListSnapshotsCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/snapshot/RevertSnapshotCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/snapshot/RevertSnapshotCmd.java
index 0b91084,5608215..ab83812
--- a/api/src/org/apache/cloudstack/api/command/user/snapshot/RevertSnapshotCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/RevertSnapshotCmd.java
@@@ -37,13 -34,11 +37,14 @@@ import com.cloud.event.EventTypes
  import com.cloud.storage.Snapshot;
  import com.cloud.user.Account;
  
- @APICommand(name = "revertSnapshot", description = "revert a volume snapshot.", responseObject = SnapshotResponse.class, entityType = { IAMEntityType.Snapshot })
 -@APICommand(name = "revertSnapshot", description = "revert a volume snapshot.", responseObject = SnapshotResponse.class,
++@APICommand(name = "revertSnapshot", description = "revert a volume snapshot.", responseObject = SnapshotResponse.class, entityType = {IAMEntityType.Snapshot},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class RevertSnapshotCmd extends BaseAsyncCmd {
      private static final String s_name = "revertsnapshotresponse";
 -    @Parameter(name = ApiConstants.ID, type = BaseCmd.CommandType.UUID, entityType = SnapshotResponse.class, required = true, description = "The ID of the snapshot")
 +
 +    @ACL(accessType = AccessType.OperateEntry)
 +    @Parameter(name= ApiConstants.ID, type= BaseCmd.CommandType.UUID, entityType = SnapshotResponse.class,
 +            required=true, description="The ID of the snapshot")
      private Long id;
  
      public Long getId() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/ssh/CreateSSHKeyPairCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/ssh/CreateSSHKeyPairCmd.java
index a56fe80,3da6dc1..05eddbe
--- a/api/src/org/apache/cloudstack/api/command/user/ssh/CreateSSHKeyPairCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/ssh/CreateSSHKeyPairCmd.java
@@@ -30,7 -29,8 +30,8 @@@ import org.apache.cloudstack.context.Ca
  
  import com.cloud.user.SSHKeyPair;
  
- @APICommand(name = "createSSHKeyPair", description = "Create a new keypair and returns the private key", responseObject = CreateSSHKeyPairResponse.class, entityType = { IAMEntityType.SSHKeyPair })
 -@APICommand(name = "createSSHKeyPair", description = "Create a new keypair and returns the private key", responseObject = CreateSSHKeyPairResponse.class,
++@APICommand(name = "createSSHKeyPair", description = "Create a new keypair and returns the private key", responseObject = CreateSSHKeyPairResponse.class, entityType = {IAMEntityType.SSHKeyPair},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class CreateSSHKeyPairCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(CreateSSHKeyPairCmd.class.getName());
      private static final String s_name = "createsshkeypairresponse";
@@@ -94,7 -94,7 +95,7 @@@
          CreateSSHKeyPairResponse response = new CreateSSHKeyPairResponse(r.getName(), r.getFingerprint(), r.getPrivateKey());
          response.setResponseName(getCommandName());
          response.setObjectName("keypair");
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/ssh/DeleteSSHKeyPairCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/ssh/DeleteSSHKeyPairCmd.java
index 7e45ae5,cddf199..19b29bd
--- a/api/src/org/apache/cloudstack/api/command/user/ssh/DeleteSSHKeyPairCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/ssh/DeleteSSHKeyPairCmd.java
@@@ -30,7 -29,8 +30,8 @@@ import org.apache.cloudstack.context.Ca
  
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteSSHKeyPair", description = "Deletes a keypair by name", responseObject = SuccessResponse.class, entityType = { IAMEntityType.SSHKeyPair })
 -@APICommand(name = "deleteSSHKeyPair", description = "Deletes a keypair by name", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteSSHKeyPair", description = "Deletes a keypair by name", responseObject = SuccessResponse.class, entityType = {IAMEntityType.SSHKeyPair},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteSSHKeyPairCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(CreateSSHKeyPairCmd.class.getName());
      private static final String s_name = "deletesshkeypairresponse";
@@@ -80,7 -80,7 +81,7 @@@
          boolean result = _mgr.deleteSSHKeyPair(this);
          SuccessResponse response = new SuccessResponse(getCommandName());
          response.setSuccess(result);
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/ssh/ListSSHKeyPairsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/ssh/ListSSHKeyPairsCmd.java
index 2551865,98f5937..f02bf9f
--- a/api/src/org/apache/cloudstack/api/command/user/ssh/ListSSHKeyPairsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/ssh/ListSSHKeyPairsCmd.java
@@@ -32,7 -31,8 +32,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.user.SSHKeyPair;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listSSHKeyPairs", description = "List registered keypairs", responseObject = SSHKeyPairResponse.class, entityType = { IAMEntityType.SSHKeyPair })
 -@APICommand(name = "listSSHKeyPairs", description = "List registered keypairs", responseObject = SSHKeyPairResponse.class,
++@APICommand(name = "listSSHKeyPairs", description = "List registered keypairs", responseObject = SSHKeyPairResponse.class, entityType = {IAMEntityType.SSHKeyPair},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListSSHKeyPairsCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListSSHKeyPairsCmd.class.getName());
      private static final String s_name = "listsshkeypairsresponse";
@@@ -76,7 -76,7 +77,7 @@@
          ListResponse<SSHKeyPairResponse> response = new ListResponse<SSHKeyPairResponse>();
          response.setResponses(responses, resultList.second());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/ssh/RegisterSSHKeyPairCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/ssh/RegisterSSHKeyPairCmd.java
index 07fc2f5,5b330f3..5fd0492
--- a/api/src/org/apache/cloudstack/api/command/user/ssh/RegisterSSHKeyPairCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/ssh/RegisterSSHKeyPairCmd.java
@@@ -30,7 -29,8 +30,8 @@@ import org.apache.cloudstack.context.Ca
  
  import com.cloud.user.SSHKeyPair;
  
- @APICommand(name = "registerSSHKeyPair", description = "Register a public key in a keypair under a certain name", responseObject = SSHKeyPairResponse.class, entityType = { IAMEntityType.SSHKeyPair })
 -@APICommand(name = "registerSSHKeyPair", description = "Register a public key in a keypair under a certain name", responseObject = SSHKeyPairResponse.class,
++@APICommand(name = "registerSSHKeyPair", description = "Register a public key in a keypair under a certain name", responseObject = SSHKeyPairResponse.class, entityType = {IAMEntityType.SSHKeyPair},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class RegisterSSHKeyPairCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(RegisterSSHKeyPairCmd.class.getName());
      private static final String s_name = "registersshkeypairresponse";
@@@ -102,7 -102,7 +103,7 @@@
          SSHKeyPairResponse response = new SSHKeyPairResponse(result.getName(), result.getFingerprint());
          response.setResponseName(getCommandName());
          response.setObjectName("keypair");
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/tag/CreateTagsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/tag/CreateTagsCmd.java
index 4dc8ad1,4fcc9cb..eab114f
--- a/api/src/org/apache/cloudstack/api/command/user/tag/CreateTagsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/tag/CreateTagsCmd.java
@@@ -38,7 -37,8 +38,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.server.ResourceTag;
  import com.cloud.server.ResourceTag.ResourceObjectType;
  
- @APICommand(name = "createTags", description = "Creates resource tag(s)", responseObject = SuccessResponse.class, since = "4.0.0", entityType = { IAMEntityType.ResourceTag })
 -@APICommand(name = "createTags", description = "Creates resource tag(s)", responseObject = SuccessResponse.class, since = "4.0.0",
++@APICommand(name = "createTags", description = "Creates resource tag(s)", responseObject = SuccessResponse.class, since = "4.0.0", entityType = {IAMEntityType.ResourceTag},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateTagsCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(CreateTagsCmd.class.getName());
  
@@@ -118,7 -118,7 +119,7 @@@
  
          if (tags != null && !tags.isEmpty()) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create tags");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/tag/DeleteTagsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/tag/DeleteTagsCmd.java
index 8aeea34,da6249f..39b6630
--- a/api/src/org/apache/cloudstack/api/command/user/tag/DeleteTagsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/tag/DeleteTagsCmd.java
@@@ -37,7 -36,8 +37,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.event.EventTypes;
  import com.cloud.server.ResourceTag.ResourceObjectType;
  
- @APICommand(name = "deleteTags", description = "Deleting resource tag(s)", responseObject = SuccessResponse.class, since = "4.0.0", entityType = { IAMEntityType.ResourceTag })
 -@APICommand(name = "deleteTags", description = "Deleting resource tag(s)", responseObject = SuccessResponse.class, since = "4.0.0",
++@APICommand(name = "deleteTags", description = "Deleting resource tag(s)", responseObject = SuccessResponse.class, since = "4.0.0", entityType = {IAMEntityType.ResourceTag},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteTagsCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteTagsCmd.class.getName());
  
@@@ -109,7 -109,7 +110,7 @@@
  
          if (success) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete tags");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/tag/ListTagsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/tag/ListTagsCmd.java
index dc025d7,9ff3a74..b224910
--- a/api/src/org/apache/cloudstack/api/command/user/tag/ListTagsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/tag/ListTagsCmd.java
@@@ -25,7 -24,8 +25,8 @@@ import org.apache.cloudstack.api.Parame
  import org.apache.cloudstack.api.response.ListResponse;
  import org.apache.cloudstack.api.response.ResourceTagResponse;
  
- @APICommand(name = "listTags", description = "List resource tag(s)", responseObject = ResourceTagResponse.class, since = "4.0.0", entityType = { IAMEntityType.ResourceTag })
 -@APICommand(name = "listTags", description = "List resource tag(s)", responseObject = ResourceTagResponse.class, since = "4.0.0",
++@APICommand(name = "listTags", description = "List resource tag(s)", responseObject = ResourceTagResponse.class, since = "4.0.0", entityType = {IAMEntityType.ResourceTag},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListTagsCmd extends BaseListProjectAndAccountResourcesCmd {
      private static final String s_name = "listtagsresponse";
  
@@@ -53,7 -53,7 +54,7 @@@
  
          ListResponse<ResourceTagResponse> response = _queryService.listTags(this);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
      public String getResourceType() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java
index 4127c27,feceed5..fdbdafd
--- a/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java
@@@ -38,7 -37,8 +38,8 @@@ import com.cloud.exception.StorageUnava
  import com.cloud.template.VirtualMachineTemplate;
  import com.cloud.user.Account;
  
- @APICommand(name = "copyTemplate", description = "Copies a template from one zone to another.", responseObject = TemplateResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "copyTemplate", description = "Copies a template from one zone to another.", responseObject = TemplateResponse.class,
++@APICommand(name = "copyTemplate", description = "Copies a template from one zone to another.", responseObject = TemplateResponse.class, responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CopyTemplateCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(CopyTemplateCmd.class.getName());
      private static final String s_name = "copytemplateresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java
index d203fd4,62d9ff6..10b150d
--- a/api/src/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/CreateTemplateCmd.java
@@@ -47,9 -46,11 +47,10 @@@ import com.cloud.storage.Volume
  import com.cloud.template.VirtualMachineTemplate;
  import com.cloud.user.Account;
  
 -@APICommand(name = "createTemplate", responseObject = TemplateResponse.class, description = "Creates a template of a virtual machine. "
 -    + "The virtual machine must be in a STOPPED state. "
 -    + "A template created from this command is automatically designated as a private template visible to the account that created it.",
 +@APICommand(name = "createTemplate", responseObject = TemplateResponse.class, description = "Creates a template of a virtual machine. " + "The virtual machine must be in a STOPPED state. "
-         + "A template created from this command is automatically designated as a private template visible to the account that created it.", responseView = ResponseView.Restricted)
-         public class CreateTemplateCmd extends BaseAsyncCreateCmd {
++        + "A template created from this command is automatically designated as a private template visible to the account that created it.", responseView = ResponseView.Restricted,
+     requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+ public class CreateTemplateCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(CreateTemplateCmd.class.getName());
      private static final String s_name = "createtemplateresponse";
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatePermissionsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/template/ListTemplatePermissionsCmd.java
index 76204bc,3576704..48f8fff
--- a/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatePermissionsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatePermissionsCmd.java
@@@ -26,7 -25,11 +26,9 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.storage.Storage.ImageFormat;
  import com.cloud.template.VirtualMachineTemplate;
  
- @APICommand(name = "listTemplatePermissions", description = "List template visibility and all accounts that have permissions to view this template.", responseObject = TemplatePermissionsResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "listTemplatePermissions",
 -            description = "List template visibility and all accounts that have permissions to view this template.",
 -            responseObject = TemplatePermissionsResponse.class,
++@APICommand(name = "listTemplatePermissions", description = "List template visibility and all accounts that have permissions to view this template.", responseObject = TemplatePermissionsResponse.class, responseView = ResponseView.Restricted,
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = false)
  public class ListTemplatePermissionsCmd extends BaseListTemplateOrIsoPermissionsCmd {
      protected String getResponseName() {
          return "listtemplatepermissionsresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
index 9ef1e10,9e95cf6..c7a2285
--- a/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
@@@ -33,7 -31,8 +33,8 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.template.VirtualMachineTemplate.TemplateFilter;
  import com.cloud.user.Account;
  
- @APICommand(name = "listTemplates", description = "List all public, private, and privileged templates.", responseObject = TemplateResponse.class, entityType = {IAMEntityType.VirtualMachineTemplate}, responseView = ResponseView.Restricted)
 -@APICommand(name = "listTemplates", description = "List all public, private, and privileged templates.", responseObject = TemplateResponse.class,
++@APICommand(name = "listTemplates", description = "List all public, private, and privileged templates.", responseObject = TemplateResponse.class, entityType = {IAMEntityType.VirtualMachineTemplate}, responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListTemplatesCmd extends BaseListTaggedResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListTemplatesCmd.class.getName());
  


[18/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
After merge, fix isRootAdmin() calls to use accountId instead of type


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/d9696b26
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/d9696b26
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/d9696b26

Branch: refs/heads/distributedrouter
Commit: d9696b26e101af6596b60bc3d22b01acf9e88677
Parents: 99bdc8d
Author: Prachi Damle <pr...@cloud.com>
Authored: Thu Mar 13 13:27:04 2014 -0700
Committer: Prachi Damle <pr...@cloud.com>
Committed: Thu Mar 13 13:28:40 2014 -0700

----------------------------------------------------------------------
 api/src/com/cloud/user/AccountService.java      |  4 +-
 .../com/cloud/api/query/QueryManagerImpl.java   |  2 +-
 .../deploy/DeploymentPlanningManagerImpl.java   |  2 +-
 .../com/cloud/network/NetworkServiceImpl.java   |  2 +-
 .../com/cloud/storage/VolumeApiServiceImpl.java |  2 +-
 .../src/com/cloud/user/AccountManagerImpl.java  | 45 +++++++++++---------
 .../com/cloud/uuididentity/UUIDManagerImpl.java |  2 +-
 .../com/cloud/user/MockAccountManagerImpl.java  |  5 ++-
 .../iam/RoleBasedEntityAccessChecker.java       |  3 ++
 9 files changed, 37 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d9696b26/api/src/com/cloud/user/AccountService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/user/AccountService.java b/api/src/com/cloud/user/AccountService.java
index 85c71ca..7e37b38 100755
--- a/api/src/com/cloud/user/AccountService.java
+++ b/api/src/com/cloud/user/AccountService.java
@@ -88,9 +88,9 @@ public interface AccountService {
 
     User getUserIncludingRemoved(long userId);
 
-    boolean isRootAdmin(long accountId);
+    boolean isRootAdmin(Long accountId);
 
-    boolean isDomainAdmin(long accountId);
+    boolean isDomainAdmin(Long accountId);
 
     boolean isNormalUser(long accountId);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d9696b26/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java
index 0554e3a..b932d42 100644
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@ -520,7 +520,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
         _accountMgr.buildACLViewSearchCriteria(sc, aclSc, isRecursive, permittedDomains, permittedAccounts, permittedResources, listProjectResourcesCriteria);
 
         // For end users display only enabled events
-        if(!_accountMgr.isRootAdmin(caller.getType())){
+        if (!_accountMgr.isRootAdmin(caller.getId())) {
             sc.setParameters("displayEvent", true);
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d9696b26/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
index 74c141e..c1f336c 100644
--- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
+++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
@@ -508,7 +508,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
 
         // check if zone is dedicated. if yes check if vm owner has acess to it.
         DedicatedResourceVO dedicatedZone = _dedicatedDao.findByZoneId(dc.getId());
-        if (dedicatedZone != null && !_accountMgr.isRootAdmin(vmProfile.getOwner().getType())) {
+        if (dedicatedZone != null && !_accountMgr.isRootAdmin(vmProfile.getOwner().getId())) {
             long accountDomainId = vmProfile.getOwner().getDomainId();
             long accountId = vmProfile.getOwner().getAccountId();
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d9696b26/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index be95a36..9185d84 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -1805,7 +1805,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
         // Perform permission check
         _accountMgr.checkAccess(caller, null, true, network);
 
-        if (forced && !_accountMgr.isRootAdmin(caller.getType())) {
+        if (forced && !_accountMgr.isRootAdmin(caller.getId())) {
             throw new InvalidParameterValueException("Delete network with 'forced' option can only be called by root admins");
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d9696b26/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
index 5ce07f0..30b5479 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -386,7 +386,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
         if (displayVolume == null) {
             displayVolume = true;
         } else {
-            if (!_accountMgr.isRootAdmin(caller.getType())) {
+            if (!_accountMgr.isRootAdmin(caller.getId())) {
                 throw new PermissionDeniedException("Cannot update parameter displayvolume, only admin permitted ");
             }
         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d9696b26/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java
index 04d3e23..1b68b0c 100755
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@ -366,37 +366,40 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
     }
 
     @Override
-    public boolean isRootAdmin(long accountId) {
-        AccountVO acct = _accountDao.findById(accountId);
-        for (SecurityChecker checker : _securityCheckers) {
-            try {
-                if (checker.checkAccess(acct, null, null, "SystemCapability")) {
-                    if (s_logger.isDebugEnabled()) {
-                        s_logger.debug("Root Access granted to " + acct + " by " + checker.getName());
+    public boolean isRootAdmin(Long accountId) {
+        if (accountId != null) {
+            AccountVO acct = _accountDao.findById(accountId);
+            for (SecurityChecker checker : _securityCheckers) {
+                try {
+                    if (checker.checkAccess(acct, null, null, "SystemCapability")) {
+                        if (s_logger.isDebugEnabled()) {
+                            s_logger.debug("Root Access granted to " + acct + " by " + checker.getName());
+                        }
+                        return true;
                     }
-                    return true;
+                } catch (PermissionDeniedException ex) {
+                    return false;
                 }
-            } catch (PermissionDeniedException ex) {
-                return false;
             }
         }
-
         return false;
     }
 
     @Override
-    public boolean isDomainAdmin(long accountId) {
-        AccountVO acct = _accountDao.findById(accountId);
-        for (SecurityChecker checker : _securityCheckers) {
-            try {
-                if (checker.checkAccess(acct, null, null, "DomainCapability")) {
-                    if (s_logger.isDebugEnabled()) {
-                        s_logger.debug("Root Access granted to " + acct + " by " + checker.getName());
+    public boolean isDomainAdmin(Long accountId) {
+        if (accountId != null) {
+            AccountVO acct = _accountDao.findById(accountId);
+            for (SecurityChecker checker : _securityCheckers) {
+                try {
+                    if (checker.checkAccess(acct, null, null, "DomainCapability")) {
+                        if (s_logger.isDebugEnabled()) {
+                            s_logger.debug("Root Access granted to " + acct + " by " + checker.getName());
+                        }
+                        return true;
                     }
-                    return true;
+                } catch (PermissionDeniedException ex) {
+                    return false;
                 }
-            } catch (PermissionDeniedException ex) {
-                return false;
             }
         }
         return false;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d9696b26/server/src/com/cloud/uuididentity/UUIDManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/uuididentity/UUIDManagerImpl.java b/server/src/com/cloud/uuididentity/UUIDManagerImpl.java
index c514746..a1d1452 100644
--- a/server/src/com/cloud/uuididentity/UUIDManagerImpl.java
+++ b/server/src/com/cloud/uuididentity/UUIDManagerImpl.java
@@ -50,7 +50,7 @@ public class UUIDManagerImpl implements UUIDManager {
         Account caller = CallContext.current().getCallingAccount();
 
         // Only admin and system allowed to do this
-        if (!(caller.getId() == Account.ACCOUNT_ID_SYSTEM || _accountMgr.isRootAdmin(caller.getType()))) {
+        if (!(caller.getId() == Account.ACCOUNT_ID_SYSTEM || _accountMgr.isRootAdmin(caller.getId()))) {
             throw new PermissionDeniedException("Please check your permissions, you are not allowed to create/update custom id");
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d9696b26/server/test/com/cloud/user/MockAccountManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/user/MockAccountManagerImpl.java b/server/test/com/cloud/user/MockAccountManagerImpl.java
index b411b18..f373cba 100644
--- a/server/test/com/cloud/user/MockAccountManagerImpl.java
+++ b/server/test/com/cloud/user/MockAccountManagerImpl.java
@@ -162,7 +162,7 @@ public class MockAccountManagerImpl extends ManagerBase implements Manager, Acco
     }
 
     @Override
-    public boolean isRootAdmin(long accountId) {
+    public boolean isRootAdmin(Long accountId) {
         // TODO Auto-generated method stub
         return false;
     }
@@ -298,7 +298,7 @@ public class MockAccountManagerImpl extends ManagerBase implements Manager, Acco
     }
 
     @Override
-    public boolean isDomainAdmin(long accountId) {
+    public boolean isDomainAdmin(Long accountId) {
         // TODO Auto-generated method stub
         return false;
     }
@@ -356,4 +356,5 @@ public class MockAccountManagerImpl extends ManagerBase implements Manager, Acco
         return null;
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d9696b26/services/iam/plugin/src/org/apache/cloudstack/iam/RoleBasedEntityAccessChecker.java
----------------------------------------------------------------------
diff --git a/services/iam/plugin/src/org/apache/cloudstack/iam/RoleBasedEntityAccessChecker.java b/services/iam/plugin/src/org/apache/cloudstack/iam/RoleBasedEntityAccessChecker.java
index 02bb702..3fe854a 100644
--- a/services/iam/plugin/src/org/apache/cloudstack/iam/RoleBasedEntityAccessChecker.java
+++ b/services/iam/plugin/src/org/apache/cloudstack/iam/RoleBasedEntityAccessChecker.java
@@ -63,6 +63,9 @@ public class RoleBasedEntityAccessChecker extends DomainChecker implements Secur
     public boolean checkAccess(Account caller, ControlledEntity entity, AccessType accessType, String action)
             throws PermissionDeniedException {
 
+        if (caller == null) {
+            throw new InvalidParameterValueException("Caller cannot be passed as NULL to IAM!");
+        }
         if (entity == null && action != null) {
             // check if caller can do this action
             List<IAMPolicy> policies = _iamSrv.listIAMPolicies(caller.getAccountId());


[16/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Removed unused imports and instance vars from FirstFitAllocator


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/df852119
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/df852119
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/df852119

Branch: refs/heads/distributedrouter
Commit: df8521194569668a923443767e783cd87ab5ea0c
Parents: 39e5b76
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Thu Mar 13 11:05:37 2014 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Thu Mar 13 11:05:37 2014 -0700

----------------------------------------------------------------------
 .../allocator/impl/FirstFitAllocator.java       | 29 ++++----------------
 1 file changed, 6 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/df852119/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
index 8abb5cd..3736884 100755
--- a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
+++ b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
@@ -48,7 +48,6 @@ import com.cloud.offering.ServiceOffering;
 import com.cloud.org.Cluster;
 import com.cloud.resource.ResourceManager;
 import com.cloud.service.ServiceOfferingDetailsVO;
-import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.service.dao.ServiceOfferingDetailsDao;
 import com.cloud.storage.GuestOSCategoryVO;
 import com.cloud.storage.GuestOSVO;
@@ -56,14 +55,9 @@ import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.dao.GuestOSCategoryDao;
 import com.cloud.storage.dao.GuestOSDao;
 import com.cloud.user.Account;
-import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
-import com.cloud.vm.dao.ConsoleProxyDao;
-import com.cloud.vm.dao.DomainRouterDao;
-import com.cloud.vm.dao.SecondaryStorageVmDao;
-import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
 
 /**
@@ -74,20 +68,10 @@ import com.cloud.vm.dao.VMInstanceDao;
 public class FirstFitAllocator extends AdapterBase implements HostAllocator {
     private static final Logger s_logger = Logger.getLogger(FirstFitAllocator.class);
     @Inject
-    HostDao _hostDao = null;
+    protected HostDao _hostDao = null;
     @Inject
     HostDetailsDao _hostDetailsDao = null;
     @Inject
-    UserVmDao _vmDao = null;
-    @Inject
-    ServiceOfferingDao _offeringDao = null;
-    @Inject
-    DomainRouterDao _routerDao = null;
-    @Inject
-    ConsoleProxyDao _consoleProxyDao = null;
-    @Inject
-    SecondaryStorageVmDao _secStorgaeVmDao = null;
-    @Inject
     ConfigurationDao _configDao = null;
     @Inject
     GuestOSDao _guestOSDao = null;
@@ -96,19 +80,20 @@ public class FirstFitAllocator extends AdapterBase implements HostAllocator {
     @Inject
     VMInstanceDao _vmInstanceDao = null;
     @Inject
-    ResourceManager _resourceMgr;
+    protected ResourceManager _resourceMgr;
     @Inject
     ClusterDao _clusterDao;
     @Inject
     ClusterDetailsDao _clusterDetailsDao;
     @Inject
     ServiceOfferingDetailsDao _serviceOfferingDetailsDao;
-    float _factor = 1;
-    boolean _checkHvm = true;
-    protected String _allocationAlgorithm = "random";
     @Inject
     CapacityManager _capacityMgr;
 
+    boolean _checkHvm = true;
+    protected String _allocationAlgorithm = "random";
+
+
     @Override
     public List<Host> allocateTo(VirtualMachineProfile vmProfile, DeploymentPlan plan, Type type, ExcludeList avoid, int returnUpTo) {
         return allocateTo(vmProfile, plan, type, avoid, returnUpTo, true);
@@ -489,8 +474,6 @@ public class FirstFitAllocator extends AdapterBase implements HostAllocator {
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
         if (_configDao != null) {
             Map<String, String> configs = _configDao.getConfiguration(params);
-            String opFactor = configs.get("cpu.overprovisioning.factor");
-            _factor = NumbersUtil.parseFloat(opFactor, 1);
 
             String allocationAlgorithm = configs.get("vm.allocation.algorithm");
             if (allocationAlgorithm != null) {


[51/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
integration tests for VPC's enabled for distributed routing


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/07c85d53
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/07c85d53
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/07c85d53

Branch: refs/heads/distributedrouter
Commit: 07c85d53c72b04a4e7873665048b13c8f636cd53
Parents: 20e08d5
Author: Murali Reddy <mu...@gmail.com>
Authored: Tue Mar 11 18:29:36 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:59:04 2014 +0530

----------------------------------------------------------------------
 build/simulator.properties                      |  28 -
 .../test_vpc_distributed_routing_offering.py    | 512 +++++++++++++++++++
 tools/marvin/marvin/integration/lib/base.py     |  15 +
 3 files changed, 527 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07c85d53/build/simulator.properties
----------------------------------------------------------------------
diff --git a/build/simulator.properties b/build/simulator.properties
deleted file mode 100644
index d65d05c..0000000
--- a/build/simulator.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-# 
-#   http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-DBUSER=cloud
-DBPW=cloud
-MSLOG=vmops.log
-APISERVERLOG=api.log
-DBHOST=localhost
-DBROOTPW=
-AGENTLOGDIR=logs
-AGENTLOG=logs/agent.log
-MSMNTDIR=/mnt
-COMPONENTS-SPEC=components-simulator.xml
-AWSAPILOG=awsapi.log

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07c85d53/test/integration/component/test_vpc_distributed_routing_offering.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_vpc_distributed_routing_offering.py b/test/integration/component/test_vpc_distributed_routing_offering.py
new file mode 100644
index 0000000..0fa7de7
--- /dev/null
+++ b/test/integration/component/test_vpc_distributed_routing_offering.py
@@ -0,0 +1,512 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+import unittest
+
+""" Component tests for inter VLAN functionality
+"""
+#Import Local Modules
+import marvin
+from nose.plugins.attrib import attr
+from marvin.cloudstackTestCase import *
+from marvin.cloudstackAPI import *
+from marvin.integration.lib.utils import *
+from marvin.integration.lib.base import *
+from marvin.integration.lib.common import *
+from marvin.sshClient import SshClient
+import datetime
+
+
+class Services:
+    """Test inter VLAN services
+    """
+
+    def __init__(self):
+        self.services = {
+                         "account": {
+                                    "email": "test@test.com",
+                                    "firstname": "Test",
+                                    "lastname": "User",
+                                    "username": "test",
+                                    # Random characters are appended for unique
+                                    # username
+                                    "password": "password",
+                                    },
+                         "service_offering": {
+                                    "name": "Tiny Instance",
+                                    "displaytext": "Tiny Instance",
+                                    "cpunumber": 1,
+                                    "cpuspeed": 100,
+                                    "memory": 128,
+                                    },
+                         "network_offering": {
+                                    "name": 'VPC Network offering',
+                                    "displaytext": 'VPC Network off',
+                                    "guestiptype": 'Isolated',
+                                    "supportedservices": 'Vpn,Dhcp,Dns,SourceNat,PortForwarding,Lb,UserData,StaticNat,NetworkACL, Connectivity',
+                                    "traffictype": 'GUEST',
+                                    "availability": 'Optional',
+                                    "useVpc": 'on',
+                                    "serviceProviderList": {
+                                            "Vpn": 'VpcVirtualRouter',
+                                            "Dhcp": 'VpcVirtualRouter',
+                                            "Dns": 'VpcVirtualRouter',
+                                            "SourceNat": 'VpcVirtualRouter',
+                                            "PortForwarding": 'VpcVirtualRouter',
+                                            "Lb": 'VpcVirtualRouter',
+                                            "UserData": 'VpcVirtualRouter',
+                                            "StaticNat": 'VpcVirtualRouter',
+                                            "NetworkACL": 'VpcVirtualRouter',
+                                            "Connectivity": 'Ovs'
+                                        },
+                                },
+                         "vpc_offering": {
+                                    "name": 'VPC off',
+                                    "displaytext": 'VPC off',
+                                    "supportedservices": 'Dhcp,Dns,SourceNat,PortForwarding,Vpn,Lb,UserData,StaticNat,Connectivity',
+                                    "serviceProviderList": {
+                                            "Vpn": 'VpcVirtualRouter',
+                                            "Dhcp": 'VpcVirtualRouter',
+                                            "Dns": 'VpcVirtualRouter',
+                                            "SourceNat": 'VpcVirtualRouter',
+                                            "PortForwarding": 'VpcVirtualRouter',
+                                            "Lb": 'VpcVirtualRouter',
+                                            "UserData": 'VpcVirtualRouter',
+                                            "StaticNat": 'VpcVirtualRouter',
+                                            "Connectivity": 'Ovs'
+                                        },
+                                    "serviceCapabilityList": {
+                                        "Connectivity": {
+                                            "DistributedRouter": "true"
+                                        },
+                                    },
+                                },
+                         "vpc": {
+                                 "name": "TestVPC",
+                                 "displaytext": "TestVPC",
+                                 "cidr": '10.0.0.1/24'
+                                 },
+                         "network": {
+                                  "name": "Test Network",
+                                  "displaytext": "Test Network",
+                                  "netmask": '255.255.255.0'
+                                },
+                         "lbrule": {
+                                    "name": "SSH",
+                                    "alg": "leastconn",
+                                    # Algorithm used for load balancing
+                                    "privateport": 22,
+                                    "publicport": 2222,
+                                    "openfirewall": False,
+                                    "startport": 2222,
+                                    "endport": 2222,
+                                    "cidrlist": '0.0.0.0/0',
+                                    "protocol": 'TCP'
+                                },
+                         "natrule": {
+                                    "privateport": 22,
+                                    "publicport": 22,
+                                    "startport": 22,
+                                    "endport": 22,
+                                    "protocol": "TCP",
+                                    "cidrlist": '0.0.0.0/0',
+                                },
+                         "fw_rule": {
+                                    "startport": 1,
+                                    "endport": 6000,
+                                    "cidr": '0.0.0.0/0',
+                                    # Any network (For creating FW rule)
+                                    "protocol": "TCP"
+                                },
+                         "virtual_machine": {
+                                    "displayname": "Test VM",
+                                    "username": "root",
+                                    "password": "password",
+                                    "ssh_port": 22,
+                                    "hypervisor": 'XenServer',
+                                    # Hypervisor type should be same as
+                                    # hypervisor type of cluster
+                                    "privateport": 22,
+                                    "publicport": 22,
+                                    "protocol": 'TCP',
+                                },
+                         "ostype": 'CentOS 5.3 (64-bit)',
+                         # Cent OS 5.3 (64 bit)
+                         "sleep": 60,
+                         "timeout": 10,
+                    }
+
+
+class TestVPCDistributedRouterOffering(cloudstackTestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        cls.api_client = super(
+                               TestVPCDistributedRouterOffering,
+                               cls
+                               ).getClsTestClient().getApiClient()
+        cls.services = Services().services
+        # Get Zone, Domain and templates
+        cls.domain = get_domain(cls.api_client, cls.services)
+        cls.zone = get_zone(cls.api_client, cls.services)
+        cls.template = get_template(
+                            cls.api_client,
+                            cls.zone.id,
+                            cls.services["ostype"]
+                            )
+        cls.services["virtual_machine"]["zoneid"] = cls.zone.id
+        cls.services["virtual_machine"]["template"] = cls.template.id
+
+        cls.service_offering = ServiceOffering.create(
+                                            cls.api_client,
+                                            cls.services["service_offering"]
+                                            )
+        cls._cleanup = [
+                        cls.service_offering,
+                        ]
+        return
+
+    @classmethod
+    def tearDownClass(cls):
+        try:
+            #Cleanup resources used
+            cleanup_resources(cls.api_client, cls._cleanup)
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+        return
+
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.dbclient = self.testClient.getDbConnection()
+        self.account = Account.create(
+                                     self.apiclient,
+                                     self.services["account"],
+                                     admin=True,
+                                     domainid=self.domain.id
+                                     )
+        self.cleanup = []
+        self.cleanup.insert(0, self.account)
+        return
+
+    def tearDown(self):
+        try:
+            cleanup_resources(self.apiclient, self.cleanup)
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+        return
+
+    def validate_vpc_offering(self, vpc_offering):
+        """Validates the VPC offering"""
+
+        self.debug("Check if the VPC offering is created successfully?")
+        vpc_offs = VpcOffering.list(
+                                    self.apiclient,
+                                    id=vpc_offering.id
+                                    )
+        self.assertEqual(
+                         isinstance(vpc_offs, list),
+                         True,
+                         "List VPC offerings should return a valid list"
+                         )
+        self.assertEqual(
+                 vpc_offering.name,
+                 vpc_offs[0].name,
+                "Name of the VPC offering should match with listVPCOff data"
+                )
+        self.assertEqual(
+                 vpc_offering.name,
+                 vpc_offs[0].name,
+                "Name of the VPC offering should match with listVPCOff data"
+                )
+        self.assertEqual(
+                 vpc_offs[0].distributedvpcrouter,True,
+                 "VPC offering is not set up for Distributed routing"
+                )
+        self.debug(
+                "VPC offering is created successfully - %s" %
+                                                        vpc_offering.name)
+        return
+
+    def validate_vpc_network(self, network):
+        """Validates the VPC network"""
+
+        self.debug("Check if the VPC network is created successfully?")
+        vpc_networks = VPC.list(
+                                    self.apiclient,
+                                    id=network.id
+                          )
+        self.assertEqual(
+                         isinstance(vpc_networks, list),
+                         True,
+                         "List VPC network should return a valid list"
+                         )
+        self.assertEqual(
+                 network.name,
+                 vpc_networks[0].name,
+                 "Name of the VPC network should match with listVPC data"
+                )
+        self.debug("VPC network created successfully - %s" % network.name)
+        return
+
+    @attr(tags=["advanced", "intervlan"])
+    def test_01_create_vpc_offering_with_distributedrouter_service_capability(self):
+        """ Test create VPC offering
+        """
+
+        # Steps for validation
+        # 1. Create VPC Offering by specifying all supported Services
+        # 2. VPC offering should be created successfully.
+
+        self.debug("Creating inter VPC offering")
+        vpc_off = VpcOffering.create(
+                                     self.apiclient,
+                                     self.services["vpc_offering"]
+                                     )
+
+        self.debug("Check if the VPC offering is created successfully?")
+        self.cleanup.append(vpc_off)
+        self.validate_vpc_offering(vpc_off)
+        return
+
+    @attr(tags=["advanced", "intervlan"])
+    def test_02_create_vpc_from_offering_with_distributedrouter_service_capability(self):
+        """ Test create VPC offering
+        """
+
+        # Steps for validation
+        # 1. Create VPC Offering by specifying all supported Services
+        # 2. VPC offering should be created successfully.
+
+        self.debug("Creating inter VPC offering")
+        vpc_off = VpcOffering.create(
+                                     self.apiclient,
+                                     self.services["vpc_offering"]
+                                     )
+        vpc_off.update(self.apiclient, state='Enabled')
+        vpc = VPC.create(
+                         self.apiclient,
+                         self.services["vpc"],
+                         vpcofferingid=vpc_off.id,
+                         zoneid=self.zone.id,
+                         account=self.account.name,
+                         domainid=self.account.domainid
+                         )
+        self.assertEqual(vpc.distributedvpcrouter, True, "VPC created should have 'distributedvpcrouter' set to True")
+
+        try:
+            vpc.delete(self.apiclient)
+        except Exception as e:
+            self.fail("Failed to delete VPC network - %s" % e)
+        return
+
+    @attr(tags=["advanced", "intervlan"])
+    def test_03_deploy_vms_in_vpc_with_distributedrouter(self):
+        """Test deploy virtual machines in VPC networks"""
+
+        # 1. Create VPC Offering by specifying all supported Services
+        #   (Vpn,dhcpdns,UserData, SourceNat,Static NAT and PF,LB,NetworkAcl)
+        # 2. Create a VPC using the above VPC offering
+        # 3. Create a network as part of this VPC.
+        # 4. Deploy few Vms.
+        # 5. Create a LB rule for this VM.
+        # 6. Create a PF rule for this VM.
+        # 7. Create a  Static Nat rule for this VM.
+        # 8. Create Ingress rules on the network to open the above created
+        #    LB PF and Static Nat rule
+        # 9. Create Egress Network ACL for this network to access google.com.
+        # 10. Enable VPN services
+
+        self.debug("Creating a VPC offering..")
+        vpc_off = VpcOffering.create(
+                                     self.apiclient,
+                                     self.services["vpc_offering"]
+                                     )
+
+        vpc_off.update(self.apiclient, state='Enabled')
+
+        self.debug("creating a VPC network in the account: %s" %
+                                                    self.account.name)
+        vpc = VPC.create(
+                         self.apiclient,
+                         self.services["vpc"],
+                         vpcofferingid=vpc_off.id,
+                         zoneid=self.zone.id,
+                         account=self.account.name,
+                         domainid=self.account.domainid
+                         )
+        self.validate_vpc_network(vpc)
+
+        self.network_offering = NetworkOffering.create(
+                                            self.apiclient,
+                                            self.services["network_offering"],
+                                            conservemode=False
+                                            )
+        # Enable Network offering
+        self.network_offering.update(self.apiclient, state='Enabled')
+
+        gateway = vpc.cidr.split('/')[0]
+        # Split the cidr to retrieve gateway
+        # for eg. cidr = 10.0.0.1/24
+        # Gateway = 10.0.0.1
+
+        # Creating network using the network offering created
+        self.debug("Creating network with network offering: %s" %
+                                                    self.network_offering.id)
+        network = Network.create(
+                                self.apiclient,
+                                self.services["network"],
+                                accountid=self.account.name,
+                                domainid=self.account.domainid,
+                                networkofferingid=self.network_offering.id,
+                                zoneid=self.zone.id,
+                                gateway=gateway,
+                                vpcid=vpc.id
+                                )
+        self.debug("Created network with ID: %s" % network.id)
+        # Spawn an instance in that network
+        virtual_machine = VirtualMachine.create(
+                                  self.apiclient,
+                                  self.services["virtual_machine"],
+                                  accountid=self.account.name,
+                                  domainid=self.account.domainid,
+                                  serviceofferingid=self.service_offering.id,
+                                  networkids=[str(network.id)]
+                                  )
+        self.debug("Deployed VM in network: %s" % network.id)
+
+        self.debug("Associating public IP for network: %s" % network.name)
+        public_ip = PublicIPAddress.create(
+                                self.apiclient,
+                                accountid=self.account.name,
+                                zoneid=self.zone.id,
+                                domainid=self.account.domainid,
+                                networkid=network.id,
+                                vpcid=vpc.id
+                                )
+        self.debug("Associated %s with network %s" % (
+                                        public_ip.ipaddress.ipaddress,
+                                        network.id
+                                        ))
+
+        self.debug("Creating LB rule for IP address: %s" %
+                                        public_ip.ipaddress.ipaddress)
+
+        lb_rule = LoadBalancerRule.create(
+                                    self.apiclient,
+                                    self.services["lbrule"],
+                                    ipaddressid=public_ip.ipaddress.id,
+                                    accountid=self.account.name,
+                                    networkid=network.id,
+                                    vpcid=vpc.id,
+                                    domainid=self.account.domainid
+                                )
+
+        self.debug("Associating public IP for network: %s" % vpc.name)
+        public_ip_2 = PublicIPAddress.create(
+                                self.apiclient,
+                                accountid=self.account.name,
+                                zoneid=self.zone.id,
+                                domainid=self.account.domainid,
+                                networkid=network.id,
+                                vpcid=vpc.id
+                                )
+        self.debug("Associated %s with network %s" % (
+                                        public_ip_2.ipaddress.ipaddress,
+                                        network.id
+                                        ))
+
+        nat_rule = NATRule.create(
+                                  self.apiclient,
+                                  virtual_machine,
+                                  self.services["natrule"],
+                                  ipaddressid=public_ip_2.ipaddress.id,
+                                  openfirewall=False,
+                                  networkid=network.id,
+                                  vpcid=vpc.id
+                                  )
+
+        self.debug("Adding NetwrokACl rules to make PF and LB accessible")
+        networkacl_1 = NetworkACL.create(
+                self.apiclient,
+                networkid=network.id,
+                services=self.services["natrule"],
+                traffictype='Ingress'
+                )
+
+        networkacl_2 = NetworkACL.create(
+                                self.apiclient,
+                                networkid=network.id,
+                                services=self.services["lbrule"],
+                                traffictype='Ingress'
+                                )
+        self.debug("Checking if we can SSH into VM?")
+        try:
+            virtual_machine.get_ssh_client(
+                ipaddress=public_ip_2.ipaddress.ipaddress,
+                )
+            self.debug("SSH into VM is successfully")
+        except Exception as e:
+            self.fail("Failed to SSH into VM - %s, %s" %
+                    (public_ip_2.ipaddress.ipaddress, e))
+
+        self.debug("Associating public IP for network: %s" % network.name)
+        public_ip_3 = PublicIPAddress.create(
+                                self.apiclient,
+                                accountid=self.account.name,
+                                zoneid=self.zone.id,
+                                domainid=self.account.domainid,
+                                networkid=network.id,
+                                vpcid=vpc.id
+                                )
+        self.debug("Associated %s with network %s" % (
+                                        public_ip_3.ipaddress.ipaddress,
+                                        network.id
+                                        ))
+        self.debug("Enabling static NAT for IP: %s" %
+                                            public_ip_3.ipaddress.ipaddress)
+        try:
+            StaticNATRule.enable(
+                              self.apiclient,
+                              ipaddressid=public_ip_3.ipaddress.id,
+                              virtualmachineid=virtual_machine.id,
+                              networkid=network.id
+                              )
+            self.debug("Static NAT enabled for IP: %s" %
+                                            public_ip_3.ipaddress.ipaddress)
+        except Exception as e:
+            self.fail("Failed to enable static NAT on IP: %s - %s" % (
+                                            public_ip_3.ipaddress.ipaddress, e))
+
+        public_ips = PublicIPAddress.list(
+                                          self.apiclient,
+                                          networkid=network.id,
+                                          listall=True,
+                                          isstaticnat=True,
+                                          account=self.account.name,
+                                          domainid=self.account.domainid
+                                          )
+        self.assertEqual(
+                         isinstance(public_ips, list),
+                         True,
+                         "List public Ip for network should list the Ip addr"
+                         )
+        self.assertEqual(
+                         public_ips[0].ipaddress,
+                         public_ip_3.ipaddress.ipaddress,
+                         "List public Ip for network should list the Ip addr"
+                         )
+        # TODO: Remote Access VPN is not yet supported in VPC
+        return
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07c85d53/tools/marvin/marvin/integration/lib/base.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py
index 72a6926..b7e2be4 100755
--- a/tools/marvin/marvin/integration/lib/base.py
+++ b/tools/marvin/marvin/integration/lib/base.py
@@ -3081,6 +3081,21 @@ class VpcOffering:
         cmd.name = "-".join([services["name"], random_gen()])
         cmd.displaytext = services["displaytext"]
         cmd.supportedServices = services["supportedservices"]
+        if "serviceProviderList" in services:
+            for service, provider in services["serviceProviderList"].items():
+                cmd.serviceproviderlist.append({
+                                            'service': service,
+                                            'provider': provider
+                                           })
+        if "serviceCapabilityList" in services:
+            cmd.servicecapabilitylist = []
+            for service, capability in services["serviceCapabilityList"].items():
+                for ctype, value in capability.items():
+                    cmd.servicecapabilitylist.append({
+                                            'service': service,
+                                            'capabilitytype': ctype,
+                                            'capabilityvalue': value
+                                           })
         return VpcOffering(apiclient.createVPCOffering(cmd).__dict__)
 
     def update(self, apiclient, name=None, displaytext=None, state=None):


[33/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
perform VM HA based on agent state report.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/7fa4715b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/7fa4715b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/7fa4715b

Branch: refs/heads/distributedrouter
Commit: 7fa4715b996fe551c09423b22bb24b22f9926044
Parents: 8e27120
Author: Kelven Yang <ke...@gmail.com>
Authored: Thu Mar 6 11:45:13 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Mar 13 16:59:56 2014 -0700

----------------------------------------------------------------------
 .../src/com/cloud/ha/HighAvailabilityManagerImpl.java   | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7fa4715b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
index 29f1e7b..52100c8 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -393,8 +393,12 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
             }
         }
 
-        HaWorkVO work =
-            new HaWorkVO(vm.getId(), vm.getType(), WorkType.HA, investigate ? Step.Investigating : Step.Scheduled, hostId, vm.getState(), maxRetries + 1, vm.getUpdated());
+        if (hostId == null) {
+            hostId = vm.getLastHostId();
+        }
+
+        HaWorkVO work = new HaWorkVO(vm.getId(), vm.getType(), WorkType.HA, investigate ? Step.Investigating : Step.Scheduled,
+                hostId != null ? hostId : 0L, vm.getState(), maxRetries + 1, vm.getUpdated());
         _haDao.persist(work);
 
         if (s_logger.isInfoEnabled()) {
@@ -962,7 +966,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
         if (oldState == State.Running && event == VirtualMachine.Event.FollowAgentPowerOffReport && newState == State.Stopped) {
             final VMInstanceVO vm = _instanceDao.findById(vo.getId());
             if (vm.isHaEnabled()) {
-                if (vm.getState() == State.Stopped)
+                if (vm.getState() != State.Stopped)
                     s_logger.warn("Sanity check failed. postStateTransitionEvent reports transited to Stopped but VM " + vm + " is still at state " + vm.getState());
 
                 s_logger.info("Detected out-of-band stop of a HA enabled VM " + vm.getInstanceName() + ", will schedule restart");
@@ -970,7 +974,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
                     @Override
                     protected void runInContext() {
                         try {
-                            scheduleRestart(vm, true);
+                            scheduleRestart(vm, false);
                         } catch (Exception e) {
                             s_logger.warn("Unexpected exception when scheduling a HA restart", e);
                         }


[35/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
BUG-ID: CS-19196: Relax HA work termination rule on exceptions. It could cause premature HA termination due to unhandled exceptions. Reviewed-By:Anthony


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3123c30f
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3123c30f
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3123c30f

Branch: refs/heads/distributedrouter
Commit: 3123c30f23ee0f089a554ec5ea50fac1c4731329
Parents: 5310e66
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Mar 7 17:15:04 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Mar 13 16:59:56 2014 -0700

----------------------------------------------------------------------
 server/src/com/cloud/ha/HighAvailabilityManagerImpl.java | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3123c30f/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
index 52100c8..48d998a 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -913,8 +913,14 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
                         work.setDateTaken(null);
                     }
                 } catch (Exception e) {
-                    s_logger.error("Terminating " + work, e);
-                    work.setStep(Step.Error);
+                    s_logger.warn("Encountered unhandled exception during HA process, reschedule retry", e);
+
+                    long nextTime = (System.currentTimeMillis() >> 10) + _restartRetryInterval;
+
+                    s_logger.info("Rescheduling " + work + " to try again at " + new Date(nextTime << 10));
+                    work.setTimeToTry(nextTime);
+                    work.setServerId(null);
+                    work.setDateTaken(null);
                 }
                 _haDao.update(work.getId(), work);
             } catch (final Throwable th) {


[05/54] [abbrv] Merge branch 'master' into rbac.

Posted by mu...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/router/DestroyRouterCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/router/DestroyRouterCmd.java
index 462219e,8b13c51..26440d4
--- a/api/src/org/apache/cloudstack/api/command/admin/router/DestroyRouterCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/router/DestroyRouterCmd.java
@@@ -35,7 -34,8 +35,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.network.router.VirtualRouter;
  import com.cloud.user.Account;
  
- @APICommand(name = "destroyRouter", description = "Destroys a router.", responseObject = DomainRouterResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "destroyRouter", description = "Destroys a router.", responseObject = DomainRouterResponse.class,
++@APICommand(name = "destroyRouter", description = "Destroys a router.", responseObject = DomainRouterResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DestroyRouterCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DestroyRouterCmd.class.getName());
      private static final String s_name = "destroyrouterresponse";
@@@ -103,7 -103,7 +104,7 @@@
          if (result != null) {
              DomainRouterResponse response = _responseGenerator.createDomainRouterResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to destroy router");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
index c0e54c8,3a5efa2..d55a5f3
--- a/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
@@@ -36,7 -35,8 +36,8 @@@ import org.apache.cloudstack.api.respon
  
  import com.cloud.network.router.VirtualRouter.Role;
  
- @APICommand(name = "listRouters", description = "List routers.", responseObject = DomainRouterResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "listRouters", description = "List routers.", responseObject = DomainRouterResponse.class,
++@APICommand(name = "listRouters", description = "List routers.", responseObject = DomainRouterResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListRoutersCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListRoutersCmd.class.getName());
  
@@@ -149,6 -149,6 +150,6 @@@
      public void execute() {
          ListResponse<DomainRouterResponse> response = _queryService.searchForRouters(this);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/router/RebootRouterCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/router/RebootRouterCmd.java
index f4200c5,155e3ee..3a89388
--- a/api/src/org/apache/cloudstack/api/command/admin/router/RebootRouterCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/router/RebootRouterCmd.java
@@@ -36,7 -35,8 +36,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.network.router.VirtualRouter;
  import com.cloud.user.Account;
  
- @APICommand(name = "rebootRouter", description = "Starts a router.", responseObject = DomainRouterResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "rebootRouter", description = "Starts a router.", responseObject = DomainRouterResponse.class,
++@APICommand(name = "rebootRouter", description = "Starts a router.", responseObject = DomainRouterResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class RebootRouterCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RebootRouterCmd.class.getName());
      private static final String s_name = "rebootrouterresponse";
@@@ -98,11 -98,11 +99,11 @@@
      @Override
      public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
          CallContext.current().setEventDetails("Router Id: " + getId());
--        VirtualRouter result = _routerService.rebootRouter(this.getId(), true);
++        VirtualRouter result = _routerService.rebootRouter(getId(), true);
          if (result != null) {
              DomainRouterResponse response = _responseGenerator.createDomainRouterResponse(result);
              response.setResponseName("router");
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to reboot router");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java
index 0c553be,ffafb5d..f83466b
--- a/api/src/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java
@@@ -38,7 -37,8 +38,8 @@@ import com.cloud.network.router.Virtual
  import com.cloud.network.router.VirtualRouter.Role;
  import com.cloud.user.Account;
  
- @APICommand(name = "startRouter", responseObject = DomainRouterResponse.class, description = "Starts a router.", entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "startRouter", responseObject = DomainRouterResponse.class, description = "Starts a router.",
++@APICommand(name = "startRouter", responseObject = DomainRouterResponse.class, description = "Starts a router.", entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class StartRouterCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(StartRouterCmd.class.getName());
      private static final String s_name = "startrouterresponse";
@@@ -114,7 -114,7 +115,7 @@@
          if (result != null) {
              DomainRouterResponse routerResponse = _responseGenerator.createDomainRouterResponse(result);
              routerResponse.setResponseName(getCommandName());
--            this.setResponseObject(routerResponse);
++            setResponseObject(routerResponse);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to start router");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java
index 9472e4a,d41cf88..e2d4200
--- a/api/src/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java
@@@ -37,7 -36,8 +37,8 @@@ import com.cloud.network.router.Virtual
  import com.cloud.network.router.VirtualRouter.Role;
  import com.cloud.user.Account;
  
- @APICommand(name = "stopRouter", description = "Stops a router.", responseObject = DomainRouterResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "stopRouter", description = "Stops a router.", responseObject = DomainRouterResponse.class,
++@APICommand(name = "stopRouter", description = "Stops a router.", responseObject = DomainRouterResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class StopRouterCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(StopRouterCmd.class.getName());
      private static final String s_name = "stoprouterresponse";
@@@ -117,7 -117,7 +118,7 @@@
          if (result != null) {
              DomainRouterResponse response = _responseGenerator.createDomainRouterResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to stop router");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/router/UpgradeRouterCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/router/UpgradeRouterCmd.java
index e414fc9,de195d9..0b67db9
--- a/api/src/org/apache/cloudstack/api/command/admin/router/UpgradeRouterCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/router/UpgradeRouterCmd.java
@@@ -31,7 -30,8 +31,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.router.VirtualRouter;
  import com.cloud.user.Account;
  
- @APICommand(name = "changeServiceForRouter", description = "Upgrades domain router to a new service offering", responseObject = DomainRouterResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "changeServiceForRouter", description = "Upgrades domain router to a new service offering", responseObject = DomainRouterResponse.class,
++@APICommand(name = "changeServiceForRouter", description = "Upgrades domain router to a new service offering", responseObject = DomainRouterResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpgradeRouterCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(UpgradeRouterCmd.class.getName());
      private static final String s_name = "changeserviceforrouterresponse";
@@@ -87,7 -87,7 +88,7 @@@
          if (router != null) {
              DomainRouterResponse routerResponse = _responseGenerator.createDomainRouterResponse(router);
              routerResponse.setResponseName(getCommandName());
--            this.setResponseObject(routerResponse);
++            setResponseObject(routerResponse);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to upgrade router");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/systemvm/DestroySystemVmCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/systemvm/DestroySystemVmCmd.java
index 24687ec,2b25a0f..bc977a4
--- a/api/src/org/apache/cloudstack/api/command/admin/systemvm/DestroySystemVmCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/systemvm/DestroySystemVmCmd.java
@@@ -35,7 -32,8 +35,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.user.Account;
  import com.cloud.vm.VirtualMachine;
  
- @APICommand(name = "destroySystemVm", responseObject = SystemVmResponse.class, description = "Destroyes a system virtual machine.", entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "destroySystemVm", responseObject = SystemVmResponse.class, description = "Destroyes a system virtual machine.",
++@APICommand(name = "destroySystemVm", responseObject = SystemVmResponse.class, description = "Destroyes a system virtual machine.", entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DestroySystemVmCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DestroySystemVmCmd.class.getName());
  
@@@ -104,7 -101,7 +105,7 @@@
          if (instance != null) {
              SystemVmResponse response = _responseGenerator.createSystemVmResponse(instance);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Fail to destroy system vm");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/systemvm/ListSystemVMsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/systemvm/ListSystemVMsCmd.java
index 6add394,e5feec2..bfecd18
--- a/api/src/org/apache/cloudstack/api/command/admin/systemvm/ListSystemVMsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/systemvm/ListSystemVMsCmd.java
@@@ -37,7 -36,8 +37,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.utils.Pair;
  import com.cloud.vm.VirtualMachine;
  
- @APICommand(name = "listSystemVms", description = "List system virtual machines.", responseObject = SystemVmResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "listSystemVms", description = "List system virtual machines.", responseObject = SystemVmResponse.class,
++@APICommand(name = "listSystemVms", description = "List system virtual machines.", responseObject = SystemVmResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListSystemVMsCmd extends BaseListCmd {
      public static final Logger s_logger = Logger.getLogger(ListSystemVMsCmd.class.getName());
  
@@@ -140,6 -140,6 +141,6 @@@
  
          response.setResponses(vmResponses, systemVMs.second());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java
index 44a5586,0da7a53..994635a
--- a/api/src/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java
@@@ -41,7 -38,8 +41,8 @@@ import com.cloud.host.Host
  import com.cloud.user.Account;
  import com.cloud.vm.VirtualMachine;
  
- @APICommand(name = "migrateSystemVm", description = "Attempts Migration of a system virtual machine to the host specified.", responseObject = SystemVmResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "migrateSystemVm", description = "Attempts Migration of a system virtual machine to the host specified.", responseObject = SystemVmResponse.class,
++@APICommand(name = "migrateSystemVm", description = "Attempts Migration of a system virtual machine to the host specified.", responseObject = SystemVmResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class MigrateSystemVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(MigrateSystemVMCmd.class.getName());
  
@@@ -122,7 -119,7 +123,7 @@@
                  // return the generic system VM instance response
                  SystemVmResponse response = _responseGenerator.createSystemVmResponse(migratedVm);
                  response.setResponseName(getCommandName());
--                this.setResponseObject(response);
++                setResponseObject(response);
              } else {
                  throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to migrate the system vm");
              }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/systemvm/RebootSystemVmCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/systemvm/RebootSystemVmCmd.java
index 68c941c,6663d64..0031d60
--- a/api/src/org/apache/cloudstack/api/command/admin/systemvm/RebootSystemVmCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/systemvm/RebootSystemVmCmd.java
@@@ -35,7 -32,8 +35,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.user.Account;
  import com.cloud.vm.VirtualMachine;
  
- @APICommand(name = "rebootSystemVm", description = "Reboots a system VM.", responseObject = SystemVmResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "rebootSystemVm", description = "Reboots a system VM.", responseObject = SystemVmResponse.class,
++@APICommand(name = "rebootSystemVm", description = "Reboots a system VM.", responseObject = SystemVmResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class RebootSystemVmCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RebootSystemVmCmd.class.getName());
  
@@@ -111,7 -109,7 +112,7 @@@
          if (result != null) {
              SystemVmResponse response = _responseGenerator.createSystemVmResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Fail to reboot system vm");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/systemvm/ScaleSystemVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/systemvm/ScaleSystemVMCmd.java
index c220e2a,3df6497..f50b2c4
--- a/api/src/org/apache/cloudstack/api/command/admin/systemvm/ScaleSystemVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/systemvm/ScaleSystemVMCmd.java
@@@ -21,9 -21,6 +21,11 @@@ import java.util.HashMap
  import java.util.Iterator;
  import java.util.Map;
  
++import org.apache.log4j.Logger;
++
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
@@@ -34,7 -31,7 +36,6 @@@ import org.apache.cloudstack.api.comman
  import org.apache.cloudstack.api.response.ServiceOfferingResponse;
  import org.apache.cloudstack.api.response.SystemVmResponse;
  import org.apache.cloudstack.context.CallContext;
--import org.apache.log4j.Logger;
  
  import com.cloud.event.EventTypes;
  import com.cloud.exception.ConcurrentOperationException;
@@@ -47,7 -44,8 +48,8 @@@ import com.cloud.user.Account
  import com.cloud.vm.VirtualMachine;
  
  @APICommand(name = "scaleSystemVm", responseObject = SystemVmResponse.class, description = "Scale the service offering for a system vm (console proxy or secondary storage). "
-         + "The system vm must be in a \"Stopped\" state for " + "this command to take effect.", entityType = { IAMEntityType.VirtualMachine })
 -        + "The system vm must be in a \"Stopped\" state for " + "this command to take effect.",
++        + "The system vm must be in a \"Stopped\" state for " + "this command to take effect.", entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ScaleSystemVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(UpgradeVMCmd.class.getName());
      private static final String s_name = "changeserviceforsystemvmresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/systemvm/StartSystemVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/systemvm/StartSystemVMCmd.java
index ce6a47f,925c9cf..6aecc91
--- a/api/src/org/apache/cloudstack/api/command/admin/systemvm/StartSystemVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/systemvm/StartSystemVMCmd.java
@@@ -35,7 -32,8 +35,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.user.Account;
  import com.cloud.vm.VirtualMachine;
  
- @APICommand(name = "startSystemVm", responseObject = SystemVmResponse.class, description = "Starts a system virtual machine.", entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "startSystemVm", responseObject = SystemVmResponse.class, description = "Starts a system virtual machine.",
++@APICommand(name = "startSystemVm", responseObject = SystemVmResponse.class, description = "Starts a system virtual machine.", entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class StartSystemVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(StartSystemVMCmd.class.getName());
  
@@@ -115,7 -113,7 +116,7 @@@
          if (instance != null) {
              SystemVmResponse response = _responseGenerator.createSystemVmResponse(instance);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Fail to start system vm");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/systemvm/StopSystemVmCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/systemvm/StopSystemVmCmd.java
index d5e5f00,ef58156..9a049c2
--- a/api/src/org/apache/cloudstack/api/command/admin/systemvm/StopSystemVmCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/systemvm/StopSystemVmCmd.java
@@@ -37,7 -34,8 +37,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.vm.VirtualMachine;
  
- @APICommand(name = "stopSystemVm", description = "Stops a system VM.", responseObject = SystemVmResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "stopSystemVm", description = "Stops a system VM.", responseObject = SystemVmResponse.class,
++@APICommand(name = "stopSystemVm", description = "Stops a system VM.", responseObject = SystemVmResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class StopSystemVmCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(StopSystemVmCmd.class.getName());
  
@@@ -121,7 -118,7 +122,7 @@@
          if (result != null) {
              SystemVmResponse response = _responseGenerator.createSystemVmResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Fail to stop system vm");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/systemvm/UpgradeSystemVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/systemvm/UpgradeSystemVMCmd.java
index c12d6b0,7aff825..033709a
--- a/api/src/org/apache/cloudstack/api/command/admin/systemvm/UpgradeSystemVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/systemvm/UpgradeSystemVMCmd.java
@@@ -21,9 -21,6 +21,11 @@@ import java.util.HashMap
  import java.util.Iterator;
  import java.util.Map;
  
++import org.apache.log4j.Logger;
++
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
@@@ -34,15 -31,16 +36,15 @@@ import org.apache.cloudstack.api.comman
  import org.apache.cloudstack.api.response.ServiceOfferingResponse;
  import org.apache.cloudstack.api.response.SystemVmResponse;
  import org.apache.cloudstack.context.CallContext;
--import org.apache.log4j.Logger;
  
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.offering.ServiceOffering;
  import com.cloud.user.Account;
  import com.cloud.vm.VirtualMachine;
  
 -  @APICommand(name = "changeServiceForSystemVm", responseObject = SystemVmResponse.class, description = "Changes the service offering for a system vm (console proxy or secondary storage). "
 -        + "The system vm must be in a \"Stopped\" state for " + "this command to take effect.",
 +@APICommand(name = "changeServiceForSystemVm", responseObject = SystemVmResponse.class, description = "Changes the service offering for a system vm (console proxy or secondary storage). "
-         + "The system vm must be in a \"Stopped\" state for " + "this command to take effect.", entityType = { IAMEntityType.VirtualMachine })
++        + "The system vm must be in a \"Stopped\" state for " + "this command to take effect.", entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpgradeSystemVMCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(UpgradeVMCmd.class.getName());
      private static final String s_name = "changeserviceforsystemvmresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/template/PrepareTemplateCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/template/PrepareTemplateCmd.java
index af214e0,d227232..ce43243
--- a/api/src/org/apache/cloudstack/api/command/admin/template/PrepareTemplateCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/template/PrepareTemplateCmd.java
@@@ -35,7 -31,8 +35,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.template.VirtualMachineTemplate;
  import com.cloud.user.Account;
  
- @APICommand(name = "prepareTemplate", responseObject = TemplateResponse.class, description = "load template into primary storage", entityType = { IAMEntityType.VirtualMachineTemplate })
 -@APICommand(name = "prepareTemplate", responseObject = TemplateResponse.class, description = "load template into primary storage",
++@APICommand(name = "prepareTemplate", responseObject = TemplateResponse.class, description = "load template into primary storage", entityType = {IAMEntityType.VirtualMachineTemplate},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class PrepareTemplateCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(PrepareTemplateCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/user/CreateUserCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
index 71ababd,f435f72..dd84ec2
--- a/api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
@@@ -39,8 -37,10 +39,10 @@@ import com.cloud.uservm.UserVm
  @APICommand(name = "assignVirtualMachine",
              description = "Change ownership of a VM from one account to another. This API is available for Basic zones with security groups and Advanced zones with guest networks. A root administrator can reassign a VM from any account to any other account in any domain. A domain administrator can reassign a VM to any account in the same domain.",
              responseObject = UserVmResponse.class,
-             since = "3.0.0", entityType = { IAMEntityType.VirtualMachine })
 -            since = "3.0.0",
++        since = "3.0.0", entityType = {IAMEntityType.VirtualMachine},
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = true)
 -public class AssignVMCmd extends BaseCmd {
 +public class AssignVMCmd extends BaseCmd  {
      public static final Logger s_logger = Logger.getLogger(AssignVMCmd.class.getName());
  
      private static final String s_name = "assignvirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/vm/ExpungeVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/vm/ExpungeVMCmd.java
index 2fb6a1e,983d25d..623ddb6
--- a/api/src/org/apache/cloudstack/api/command/admin/vm/ExpungeVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vm/ExpungeVMCmd.java
@@@ -40,7 -37,8 +40,8 @@@ import com.cloud.user.Account
  import com.cloud.uservm.UserVm;
  import com.cloud.utils.exception.CloudRuntimeException;
  
- @APICommand(name = "expungeVirtualMachine", description = "Expunge a virtual machine. Once expunged, it cannot be recoverd.", responseObject = SuccessResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "expungeVirtualMachine", description = "Expunge a virtual machine. Once expunged, it cannot be recoverd.", responseObject = SuccessResponse.class,
++@APICommand(name = "expungeVirtualMachine", description = "Expunge a virtual machine. Once expunged, it cannot be recoverd.", responseObject = SuccessResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ExpungeVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(ExpungeVMCmd.class.getName());
  
@@@ -109,7 -106,7 +110,7 @@@
  
              if (result != null) {
                  SuccessResponse response = new SuccessResponse(getCommandName());
--                this.setResponseObject(response);
++                setResponseObject(response);
              } else {
                  throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to expunge vm");
              }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/vm/MigrateVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/vm/MigrateVMCmd.java
index b3615fc,611f698..fe84468
--- a/api/src/org/apache/cloudstack/api/command/admin/vm/MigrateVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vm/MigrateVMCmd.java
@@@ -45,7 -43,9 +45,9 @@@ import com.cloud.vm.VirtualMachine
  
  @APICommand(name = "migrateVirtualMachine",
              description = "Attempts Migration of a VM to a different host or Root volume of the vm to a different storage pool",
-             responseObject = UserVmResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -            responseObject = UserVmResponse.class,
++        responseObject = UserVmResponse.class, entityType = {IAMEntityType.VirtualMachine},
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = true)
  public class MigrateVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(MigrateVMCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java
index 4920250,7b10239..b5d1ae9
--- a/api/src/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vm/MigrateVirtualMachineWithVolumeCmd.java
@@@ -47,7 -45,9 +47,9 @@@ import com.cloud.vm.VirtualMachine
  
  @APICommand(name = "migrateVirtualMachineWithVolume",
              description = "Attempts Migration of a VM with its volumes to a different host",
-  responseObject = UserVmResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -            responseObject = UserVmResponse.class,
++        responseObject = UserVmResponse.class, entityType = {IAMEntityType.VirtualMachine},
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = true)
  public class MigrateVirtualMachineWithVolumeCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(MigrateVMCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/vm/RecoverVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/vm/RecoverVMCmd.java
index c7917b6,05d7a98..e7fbbdb
--- a/api/src/org/apache/cloudstack/api/command/admin/vm/RecoverVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vm/RecoverVMCmd.java
@@@ -32,7 -30,8 +32,8 @@@ import com.cloud.exception.ResourceAllo
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "recoverVirtualMachine", description = "Recovers a virtual machine.", responseObject = UserVmResponse.class, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "recoverVirtualMachine", description = "Recovers a virtual machine.", responseObject = UserVmResponse.class,
++@APICommand(name = "recoverVirtualMachine", description = "Recovers a virtual machine.", responseObject = UserVmResponse.class, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class RecoverVMCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(RecoverVMCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/volume/UpdateVolumeCmdByAdmin.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/volume/UpdateVolumeCmdByAdmin.java
index 7e2acc5,0000000..16b2d5d
mode 100644,000000..100644
--- a/api/src/org/apache/cloudstack/api/command/admin/volume/UpdateVolumeCmdByAdmin.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/volume/UpdateVolumeCmdByAdmin.java
@@@ -1,44 -1,0 +1,45 @@@
 +// Licensed to the Apache Software Foundation (ASF) under one
 +// or more contributor license agreements.  See the NOTICE file
 +// distributed with this work for additional information
 +// regarding copyright ownership.  The ASF licenses this file
 +// to you under the Apache License, Version 2.0 (the
 +// "License"); you may not use this file except in compliance
 +// with the License.  You may obtain a copy of the License at
 +//
 +//   http://www.apache.org/licenses/LICENSE-2.0
 +//
 +// Unless required by applicable law or agreed to in writing,
 +// software distributed under the License is distributed on an
 +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 +// KIND, either express or implied.  See the License for the
 +// specific language governing permissions and limitations
 +// under the License.
 +package org.apache.cloudstack.api.command.admin.volume;
 +
 +import org.apache.cloudstack.api.APICommand;
 +import org.apache.cloudstack.api.ApiErrorCode;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
 +import org.apache.cloudstack.api.ServerApiException;
 +import org.apache.cloudstack.api.command.user.volume.UpdateVolumeCmd;
 +import org.apache.cloudstack.api.response.VolumeResponse;
 +import org.apache.cloudstack.context.CallContext;
 +
 +import com.cloud.storage.Volume;
 +
 +@APICommand(name = "updateVolume", description = "Updates the volume.", responseObject = VolumeResponse.class, responseView = ResponseView.Full)
 +public class UpdateVolumeCmdByAdmin extends UpdateVolumeCmd {
 +
 +    @Override
 +    public void execute(){
 +        CallContext.current().setEventDetails("Volume Id: "+getId());
-         Volume result = _volumeService.updateVolume(getId(), getPath(), getState(), getStorageId(), getDisplayVolume(), getCustomId(), getEntityOwnerId());
++        Volume result = _volumeService.updateVolume(getId(), getPath(), getState(), getStorageId(), getDisplayVolume(),
++                getCustomId(), getEntityOwnerId(), getChainInfo());
 +        if (result != null) {
 +            VolumeResponse response = _responseGenerator.createVolumeResponse(ResponseView.Full, result);
 +            response.setResponseName(getCommandName());
 +            setResponseObject(response);
 +        } else {
 +            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update volume");
 +        }
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/vpc/CreatePrivateGatewayCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/vpc/CreatePrivateGatewayCmd.java
index 33c9c55,e13ed5b..ff88ada
--- a/api/src/org/apache/cloudstack/api/command/admin/vpc/CreatePrivateGatewayCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vpc/CreatePrivateGatewayCmd.java
@@@ -43,7 -42,8 +43,8 @@@ import com.cloud.network.vpc.PrivateGat
  import com.cloud.network.vpc.Vpc;
  import com.cloud.user.Account;
  
- @APICommand(name = "createPrivateGateway", description = "Creates a private gateway", responseObject = PrivateGatewayResponse.class, entityType = { IAMEntityType.PrivateGateway })
 -@APICommand(name = "createPrivateGateway", description = "Creates a private gateway", responseObject = PrivateGatewayResponse.class,
++@APICommand(name = "createPrivateGateway", description = "Creates a private gateway", responseObject = PrivateGatewayResponse.class, entityType = {IAMEntityType.PrivateGateway},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreatePrivateGatewayCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(CreatePrivateGatewayCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/vpc/DeletePrivateGatewayCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/vpc/DeletePrivateGatewayCmd.java
index 27e71cf,833044f..dcce58e
--- a/api/src/org/apache/cloudstack/api/command/admin/vpc/DeletePrivateGatewayCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vpc/DeletePrivateGatewayCmd.java
@@@ -37,7 -36,8 +37,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.network.vpc.VpcGateway;
  import com.cloud.user.Account;
  
- @APICommand(name = "deletePrivateGateway", description = "Deletes a Private gateway", responseObject = SuccessResponse.class, entityType = { IAMEntityType.PrivateGateway })
 -@APICommand(name = "deletePrivateGateway", description = "Deletes a Private gateway", responseObject = SuccessResponse.class,
++@APICommand(name = "deletePrivateGateway", description = "Deletes a Private gateway", responseObject = SuccessResponse.class, entityType = {IAMEntityType.PrivateGateway},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeletePrivateGatewayCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeletePrivateGatewayCmd.class.getName());
      private static final String s_name = "deleteprivategatewayresponse";
@@@ -86,7 -86,7 +87,7 @@@
          boolean result = _vpcService.deleteVpcPrivateGateway(id);
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete private gateway");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/vpc/ListVPCsCmdByAdmin.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/vpc/ListVPCsCmdByAdmin.java
index 8ba954c,0000000..3a95e44
mode 100644,000000..100644
--- a/api/src/org/apache/cloudstack/api/command/admin/vpc/ListVPCsCmdByAdmin.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vpc/ListVPCsCmdByAdmin.java
@@@ -1,55 -1,0 +1,55 @@@
 +// Licensed to the Apache Software Foundation (ASF) under one
 +// or more contributor license agreements.  See the NOTICE file
 +// distributed with this work for additional information
 +// regarding copyright ownership.  The ASF licenses this file
 +// to you under the Apache License, Version 2.0 (the
 +// "License"); you may not use this file except in compliance
 +// with the License.  You may obtain a copy of the License at
 +//
 +//   http://www.apache.org/licenses/LICENSE-2.0
 +//
 +// Unless required by applicable law or agreed to in writing,
 +// software distributed under the License is distributed on an
 +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 +// KIND, either express or implied.  See the License for the
 +// specific language governing permissions and limitations
 +// under the License.
 +package org.apache.cloudstack.api.command.admin.vpc;
 +
 +import java.util.ArrayList;
 +import java.util.List;
 +
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.api.APICommand;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
 +import org.apache.cloudstack.api.command.user.vpc.ListVPCsCmd;
 +import org.apache.cloudstack.api.response.ListResponse;
 +import org.apache.cloudstack.api.response.VpcResponse;
 +
 +import com.cloud.network.vpc.Vpc;
 +
 +
 +@APICommand(name = "listVPCs", description = "Lists VPCs", responseObject = VpcResponse.class, responseView = ResponseView.Full)
 +public class ListVPCsCmdByAdmin extends ListVPCsCmd {
 +    public static final Logger s_logger = Logger.getLogger(ListVPCsCmdByAdmin.class.getName());
 +
 +    @Override
 +    public void execute() {
-         List<? extends Vpc> vpcs = _vpcService.listVpcs(getId(), getVpcName(), getDisplayText(),
-                 getSupportedServices(), getCidr(), getVpcOffId(), getState(), getAccountName(), getDomainId(),
-                 getKeyword(), getStartIndex(), getPageSizeVal(), getZoneId(), isRecursive(),
-                 listAll(), getRestartRequired(), getTags(), getProjectId());
++        List<? extends Vpc> vpcs =
++                _vpcService.listVpcs(getId(), getVpcName(), getDisplayText(), getSupportedServices(), getCidr(), getVpcOffId(), getState(), getAccountName(), getDomainId(),
++                        getKeyword(), getStartIndex(), getPageSizeVal(), getZoneId(), isRecursive(), listAll(), getRestartRequired(), getTags(),
++                        getProjectId(), getDisplay());
 +        ListResponse<VpcResponse> response = new ListResponse<VpcResponse>();
 +        List<VpcResponse> offeringResponses = new ArrayList<VpcResponse>();
 +        for (Vpc vpc : vpcs) {
 +            VpcResponse offeringResponse = _responseGenerator.createVpcResponse(ResponseView.Full, vpc);
 +            offeringResponses.add(offeringResponse);
 +        }
 +
 +        response.setResponses(offeringResponses);
 +        response.setResponseName(getCommandName());
 +        setResponseObject(response);
 +    }
 +
 +}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCCmdByAdmin.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCCmdByAdmin.java
index 372bb75,0000000..b94cdcf
mode 100644,000000..100644
--- a/api/src/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCCmdByAdmin.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCCmdByAdmin.java
@@@ -1,47 -1,0 +1,47 @@@
 +// Licensed to the Apache Software Foundation (ASF) under one
 +// or more contributor license agreements.  See the NOTICE file
 +// distributed with this work for additional information
 +// regarding copyright ownership.  The ASF licenses this file
 +// to you under the Apache License, Version 2.0 (the
 +// "License"); you may not use this file except in compliance
 +// with the License.  You may obtain a copy of the License at
 +//
 +//   http://www.apache.org/licenses/LICENSE-2.0
 +//
 +// Unless required by applicable law or agreed to in writing,
 +// software distributed under the License is distributed on an
 +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 +// KIND, either express or implied.  See the License for the
 +// specific language governing permissions and limitations
 +// under the License.
 +package org.apache.cloudstack.api.command.admin.vpc;
 +
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.api.APICommand;
 +import org.apache.cloudstack.api.ApiErrorCode;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
 +import org.apache.cloudstack.api.ServerApiException;
 +import org.apache.cloudstack.api.command.user.vpc.UpdateVPCCmd;
 +import org.apache.cloudstack.api.response.VpcResponse;
 +
 +import com.cloud.network.vpc.Vpc;
 +
 +@APICommand(name = "updateVPC", description = "Updates a VPC", responseObject = VpcResponse.class, responseView = ResponseView.Full)
 +public class UpdateVPCCmdByAdmin extends UpdateVPCCmd {
 +    public static final Logger s_logger = Logger.getLogger(UpdateVPCCmdByAdmin.class.getName());
 +
 +    @Override
 +    public void execute(){
-         Vpc result = _vpcService.updateVpc(getId(), getVpcName(), getDisplayText(), getCustomId());
++        Vpc result = _vpcService.updateVpc(getId(), getVpcName(), getDisplayText(), getCustomId(), getDisplayVpc());
 +        if (result != null) {
 +            VpcResponse response = _responseGenerator.createVpcResponse(ResponseView.Full, result);
 +            response.setResponseName(getCommandName());
 +            setResponseObject(response);
 +        } else {
 +            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update VPC");
 +        }
 +    }
 +
 +
 +}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/zone/CreateZoneCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/zone/MarkDefaultZoneForAccountCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/admin/zone/UpdateZoneCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/account/ListAccountsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/account/ListAccountsCmd.java
index 492dd57,f3632c0..65331e4
--- a/api/src/org/apache/cloudstack/api/command/user/account/ListAccountsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/account/ListAccountsCmd.java
@@@ -27,7 -25,8 +27,8 @@@ import org.apache.cloudstack.api.Respon
  import org.apache.cloudstack.api.response.AccountResponse;
  import org.apache.cloudstack.api.response.ListResponse;
  
- @APICommand(name = "listAccounts", description = "Lists accounts and provides detailed account information for listed accounts", responseObject = AccountResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Account })
 -@APICommand(name = "listAccounts", description = "Lists accounts and provides detailed account information for listed accounts",
 -        responseObject = AccountResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
++@APICommand(name = "listAccounts", description = "Lists accounts and provides detailed account information for listed accounts", responseObject = AccountResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.Account},
++        requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class ListAccountsCmd extends BaseListDomainResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListAccountsCmd.class.getName());
      private static final String s_name = "listaccountsresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java
index 1214011,aca9bfc..3f0d246
--- a/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java
@@@ -18,8 -18,7 +18,9 @@@ package org.apache.cloudstack.api.comma
  
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
@@@ -56,7 -55,8 +57,8 @@@ import com.cloud.offering.NetworkOfferi
  import com.cloud.projects.Project;
  import com.cloud.user.Account;
  
- @APICommand(name = "associateIpAddress", description = "Acquires and associates a public IP to an account.", responseObject = IPAddressResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "associateIpAddress", description = "Acquires and associates a public IP to an account.", responseObject = IPAddressResponse.class,
++@APICommand(name = "associateIpAddress", description = "Acquires and associates a public IP to an account.", responseObject = IPAddressResponse.class, responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class AssociateIPAddrCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(AssociateIPAddrCmd.class.getName());
      private static final String s_name = "associateipaddressresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java
index b9ac91b,109dcd0..3218713
--- a/api/src/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/address/ListPublicIpAddressesCmd.java
@@@ -19,8 -19,7 +19,9 @@@ package org.apache.cloudstack.api.comma
  import java.util.ArrayList;
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
@@@ -38,7 -37,8 +39,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.IpAddress;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listPublicIpAddresses", description = "Lists all public ip addresses", responseObject = IPAddressResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "listPublicIpAddresses", description = "Lists all public ip addresses", responseObject = IPAddressResponse.class,
++@APICommand(name = "listPublicIpAddresses", description = "Lists all public ip addresses", responseObject = IPAddressResponse.class, responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListPublicIpAddressesCmd extends BaseListTaggedResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListPublicIpAddressesCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/address/UpdateIPAddrCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/address/UpdateIPAddrCmd.java
index ea55dc4,c2de3a1..cc736d0
--- a/api/src/org/apache/cloudstack/api/command/user/address/UpdateIPAddrCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/address/UpdateIPAddrCmd.java
@@@ -16,8 -16,7 +16,9 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.address;
  
 +import org.apache.log4j.Logger;
 +
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseAsyncCustomIdCmd;
@@@ -116,8 -124,8 +126,8 @@@ public class UpdateIPAddrCmd extends Ba
      public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException,
              NetworkRuleConflictException {
  
-         IpAddress result = _networkService.updateIP(getId(), getCustomId());
 -        IpAddress result = _networkService.updateIP(getId(), this.getCustomId(), getDisplayIp());
 -        IPAddressResponse ipResponse = _responseGenerator.createIPAddressResponse(result);
++        IpAddress result = _networkService.updateIP(getId(), getCustomId(), getDisplayIp());
 +        IPAddressResponse ipResponse = _responseGenerator.createIPAddressResponse(ResponseView.Restricted, result);
          ipResponse.setResponseName(getCommandName());
          setResponseObject(ipResponse);
      }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java
index cf00787,41d5823..50573e9
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java
@@@ -35,7 -34,8 +35,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.exception.ResourceAllocationException;
  import com.cloud.user.Account;
  
- @APICommand(name = "createAffinityGroup", responseObject = AffinityGroupResponse.class, description = "Creates an affinity/anti-affinity group", entityType = { IAMEntityType.AffinityGroup })
 -@APICommand(name = "createAffinityGroup", responseObject = AffinityGroupResponse.class, description = "Creates an affinity/anti-affinity group",
++@APICommand(name = "createAffinityGroup", responseObject = AffinityGroupResponse.class, description = "Creates an affinity/anti-affinity group", entityType = {IAMEntityType.AffinityGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateAffinityGroupCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(CreateAffinityGroupCmd.class.getName());
  
@@@ -126,7 -126,7 +127,7 @@@
          if (group != null) {
              AffinityGroupResponse response = _responseGenerator.createAffinityGroupResponse(group);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create affinity group:" + affinityGroupName);
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
index 2722889,d4d1f2a..eb9145c
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
@@@ -37,7 -34,8 +37,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteAffinityGroup", description = "Deletes affinity group", responseObject = SuccessResponse.class, entityType = { IAMEntityType.AffinityGroup })
 -@APICommand(name = "deleteAffinityGroup", description = "Deletes affinity group", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteAffinityGroup", description = "Deletes affinity group", responseObject = SuccessResponse.class, entityType = {IAMEntityType.AffinityGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteAffinityGroupCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteAffinityGroupCmd.class.getName());
      private static final String s_name = "deleteaffinitygroupresponse";
@@@ -132,7 -129,7 +133,7 @@@
          boolean result = _affinityGroupService.deleteAffinityGroup(id, accountName, domainId, name);
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete affinity group");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
index 5e209dc,9dbf727..e469eab
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
@@@ -17,7 -17,6 +17,8 @@@
  package org.apache.cloudstack.api.command.user.affinitygroup;
  
  import org.apache.log4j.Logger;
++
 +import org.apache.cloudstack.acl.IAMEntityType;
  import org.apache.cloudstack.affinity.AffinityGroupResponse;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
@@@ -27,7 -26,8 +28,8 @@@ import org.apache.cloudstack.api.Parame
  import org.apache.cloudstack.api.response.ListResponse;
  import org.apache.cloudstack.api.response.UserVmResponse;
  
- @APICommand(name = "listAffinityGroups", description = "Lists affinity groups", responseObject = AffinityGroupResponse.class, entityType = { IAMEntityType.AffinityGroup })
 -@APICommand(name = "listAffinityGroups", description = "Lists affinity groups", responseObject = AffinityGroupResponse.class,
++@APICommand(name = "listAffinityGroups", description = "Lists affinity groups", responseObject = AffinityGroupResponse.class, entityType = {IAMEntityType.AffinityGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListAffinityGroupsCmd extends BaseListAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListAffinityGroupsCmd.class.getName());
  
@@@ -80,10 -80,10 +82,10 @@@
      public void execute() {
  
          ListResponse<AffinityGroupResponse> response = _queryService.listAffinityGroups(id, affinityGroupName,
--                affinityGroupType, virtualMachineId, this.getAccountName(), this.getDomainId(), this.isRecursive(),
--                this.listAll(), this.getStartIndex(), this.getPageSizeVal(), this.getKeyword());
++                affinityGroupType, virtualMachineId, getAccountName(), getDomainId(), isRecursive(),
++                listAll(), getStartIndex(), getPageSizeVal(), getKeyword());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
  
      }
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java
index 75f01c1,0c3f296..4bfcddb
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java
@@@ -45,8 -42,12 +45,14 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "updateVMAffinityGroup", description = "Updates the affinity/anti-affinity group associations of a virtual machine. The VM has to be stopped and restarted for the "
-         + "new properties to take effect.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
+ @APICommand(name = "updateVMAffinityGroup",
+             description = "Updates the affinity/anti-affinity group associations of a virtual machine. The VM has to be stopped and restarted for the "
+                 + "new properties to take effect.",
+             responseObject = UserVmResponse.class,
++        responseView = ResponseView.Restricted,
++        entityType = {IAMEntityType.VirtualMachine},
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = true)
  public class UpdateVMAffinityGroupCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateVMAffinityGroupCmd.class.getName());
      private static final String s_name = "updatevirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScalePolicyCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScalePolicyCmd.java
index e722a6e,04130b5..8b5708d
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScalePolicyCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScalePolicyCmd.java
@@@ -40,7 -39,9 +40,9 @@@ import com.cloud.user.Account
  
  @APICommand(name = "createAutoScalePolicy",
              description = "Creates an autoscale policy for a provision or deprovision action, the action is taken when the all the conditions evaluates to true for the specified duration. The policy is in effect once it is attached to a autscale vm group.",
-  responseObject = AutoScalePolicyResponse.class, entityType = { IAMEntityType.AutoScalePolicy })
 -            responseObject = AutoScalePolicyResponse.class,
++        responseObject = AutoScalePolicyResponse.class, entityType = {IAMEntityType.AutoScalePolicy},
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = false)
  public class CreateAutoScalePolicyCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(CreateAutoScalePolicyCmd.class.getName());
  
@@@ -164,15 -165,15 +166,15 @@@
          AutoScalePolicy result = _entityMgr.findById(AutoScalePolicy.class, getEntityId());
          AutoScalePolicyResponse response = _responseGenerator.createAutoScalePolicyResponse(result);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
      @Override
      public void create() throws ResourceAllocationException {
          AutoScalePolicy result = _autoScaleService.createAutoScalePolicy(this);
          if (result != null) {
--            this.setEntityId(result.getId());
--            this.setEntityUuid(result.getUuid());
++            setEntityId(result.getId());
++            setEntityUuid(result.getUuid());
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create AutoScale Policy");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java
index 65bbafa,c519219..43a7f18
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmGroupCmd.java
@@@ -18,9 -18,7 +18,10 @@@ package org.apache.cloudstack.api.comma
  
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
@@@ -41,7 -40,9 +42,9 @@@ import com.cloud.network.rules.LoadBala
  
  @APICommand(name = "createAutoScaleVmGroup",
              description = "Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.",
-  responseObject = AutoScaleVmGroupResponse.class, entityType = { IAMEntityType.AutoScaleVmGroup })
 -            responseObject = AutoScaleVmGroupResponse.class,
++            responseObject = AutoScaleVmGroupResponse.class, entityType = { IAMEntityType.AutoScaleVmGroup },
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = false)
  public class CreateAutoScaleVmGroupCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(CreateAutoScaleVmGroupCmd.class.getName());
  
@@@ -183,8 -191,8 +193,8 @@@
      public void create() throws ResourceAllocationException {
          AutoScaleVmGroup result = _autoScaleService.createAutoScaleVmGroup(this);
          if (result != null) {
--            this.setEntityId(result.getId());
--            this.setEntityUuid(result.getUuid());
++            setEntityId(result.getId());
++            setEntityUuid(result.getUuid());
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Autoscale Vm Group");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmProfileCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmProfileCmd.java
index 617b335,570e018..5d78593
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmProfileCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateAutoScaleVmProfileCmd.java
@@@ -19,9 -19,7 +19,10 @@@ package org.apache.cloudstack.api.comma
  import java.util.HashMap;
  import java.util.Map;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
@@@ -45,7 -44,9 +46,9 @@@ import com.cloud.user.User
  
  @APICommand(name = "createAutoScaleVmProfile",
              description = "Creates a profile that contains information about the virtual machine which will be provisioned automatically by autoscale feature.",
-  responseObject = AutoScaleVmProfileResponse.class, entityType = { IAMEntityType.AutoScaleVmProfile })
 -            responseObject = AutoScaleVmProfileResponse.class,
++            responseObject = AutoScaleVmProfileResponse.class, entityType = { IAMEntityType.AutoScaleVmProfile },
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = false)
  @SuppressWarnings("rawtypes")
  public class CreateAutoScaleVmProfileCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(CreateAutoScaleVmProfileCmd.class.getName());
@@@ -236,7 -244,7 +246,7 @@@
          AutoScaleVmProfile result = _entityMgr.findById(AutoScaleVmProfile.class, getEntityId());
          AutoScaleVmProfileResponse response = _responseGenerator.createAutoScaleVmProfileResponse(result);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
      @Override
@@@ -244,8 -252,8 +254,8 @@@
  
          AutoScaleVmProfile result = _autoScaleService.createAutoScaleVmProfile(this);
          if (result != null) {
--            this.setEntityId(result.getId());
--            this.setEntityUuid(result.getUuid());
++            setEntityId(result.getId());
++            setEntityUuid(result.getUuid());
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Autoscale Vm Profile");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateConditionCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/CreateConditionCmd.java
index f99aecc,356b836..a3358b2
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateConditionCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateConditionCmd.java
@@@ -36,7 -35,8 +36,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.exception.ResourceAllocationException;
  import com.cloud.network.as.Condition;
  
- @APICommand(name = "createCondition", description = "Creates a condition", responseObject = ConditionResponse.class, entityType = { IAMEntityType.Condition })
 -@APICommand(name = "createCondition", description = "Creates a condition", responseObject = ConditionResponse.class,
++@APICommand(name = "createCondition", description = "Creates a condition", responseObject = ConditionResponse.class, entityType = {IAMEntityType.Condition},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateConditionCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(CreateConditionCmd.class.getName());
      private static final String s_name = "conditionresponse";
@@@ -70,8 -70,8 +71,8 @@@
          condition = _autoScaleService.createCondition(this);
  
          if (condition != null) {
--            this.setEntityId(condition.getId());
--            this.setEntityUuid(condition.getUuid());
++            setEntityId(condition.getId());
++            setEntityUuid(condition.getUuid());
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create condition.");
          }
@@@ -82,7 -82,7 +83,7 @@@
          Condition condition = _entityMgr.findById(Condition.class, getEntityId());
          ConditionResponse response = _responseGenerator.createConditionResponse(condition);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
      // /////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScalePolicyCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScalePolicyCmd.java
index 7d5741e,903ac59..779ee0a
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScalePolicyCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScalePolicyCmd.java
@@@ -36,7 -33,8 +36,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.as.AutoScalePolicy;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteAutoScalePolicy", description = "Deletes a autoscale policy.", responseObject = SuccessResponse.class, entityType = { IAMEntityType.AutoScalePolicy })
 -@APICommand(name = "deleteAutoScalePolicy", description = "Deletes a autoscale policy.", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteAutoScalePolicy", description = "Deletes a autoscale policy.", responseObject = SuccessResponse.class, entityType = {IAMEntityType.AutoScalePolicy},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteAutoScalePolicyCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteAutoScalePolicyCmd.class.getName());
      private static final String s_name = "deleteautoscalepolicyresponse";
@@@ -97,7 -94,7 +98,7 @@@
  
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              s_logger.warn("Failed to delete autoscale policy " + getId());
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete AutoScale Policy");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmGroupCmd.java
index c8d32bd,44f2cd8..5a43abe
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmGroupCmd.java
@@@ -36,7 -33,8 +36,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.as.AutoScaleVmGroup;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteAutoScaleVmGroup", description = "Deletes a autoscale vm group.", responseObject = SuccessResponse.class, entityType = { IAMEntityType.AutoScaleVmGroup })
 -@APICommand(name = "deleteAutoScaleVmGroup", description = "Deletes a autoscale vm group.", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteAutoScaleVmGroup", description = "Deletes a autoscale vm group.", responseObject = SuccessResponse.class, entityType = {IAMEntityType.AutoScaleVmGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteAutoScaleVmGroupCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteAutoScaleVmGroupCmd.class.getName());
      private static final String s_name = "deleteautoscalevmgroupresponse";
@@@ -97,7 -94,7 +98,7 @@@
  
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              s_logger.warn("Failed to delete autoscale vm group " + getId());
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete autoscale vm group");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmProfileCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmProfileCmd.java
index 79e0a17,d2dccc1..2391a93
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmProfileCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteAutoScaleVmProfileCmd.java
@@@ -36,7 -33,8 +36,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.as.AutoScaleVmProfile;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteAutoScaleVmProfile", description = "Deletes a autoscale vm profile.", responseObject = SuccessResponse.class, entityType = { IAMEntityType.AutoScaleVmProfile })
 -@APICommand(name = "deleteAutoScaleVmProfile", description = "Deletes a autoscale vm profile.", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteAutoScaleVmProfile", description = "Deletes a autoscale vm profile.", responseObject = SuccessResponse.class, entityType = {IAMEntityType.AutoScaleVmProfile},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteAutoScaleVmProfileCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteAutoScaleVmProfileCmd.class.getName());
      private static final String s_name = "deleteautoscalevmprofileresponse";
@@@ -96,7 -93,7 +97,7 @@@
          boolean result = _autoScaleService.deleteAutoScaleVmProfile(id);
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              s_logger.warn("Failed to delete autoscale vm profile " + getId());
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete autoscale vm profile");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteConditionCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteConditionCmd.java
index 9d12149,a029f15..9a7d2d7
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteConditionCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/DeleteConditionCmd.java
@@@ -37,7 -34,8 +37,8 @@@ import com.cloud.exception.ResourceInUs
  import com.cloud.network.as.Condition;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteCondition", description = "Removes a condition", responseObject = SuccessResponse.class, entityType = { IAMEntityType.Condition })
 -@APICommand(name = "deleteCondition", description = "Removes a condition", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteCondition", description = "Removes a condition", responseObject = SuccessResponse.class, entityType = {IAMEntityType.Condition},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteConditionCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteConditionCmd.class.getName());
      private static final String s_name = "deleteconditionresponse";
@@@ -65,7 -62,7 +66,7 @@@
          }
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              s_logger.warn("Failed to delete condition " + getId());
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete condition.");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/DisableAutoScaleVmGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/DisableAutoScaleVmGroupCmd.java
index a6e736a,dccb016..6575d27
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/DisableAutoScaleVmGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/DisableAutoScaleVmGroupCmd.java
@@@ -35,7 -32,8 +35,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.as.AutoScaleVmGroup;
  import com.cloud.user.Account;
  
- @APICommand(name = "disableAutoScaleVmGroup", description = "Disables an AutoScale Vm Group", responseObject = AutoScaleVmGroupResponse.class, entityType = { IAMEntityType.AutoScaleVmGroup })
 -@APICommand(name = "disableAutoScaleVmGroup", description = "Disables an AutoScale Vm Group", responseObject = AutoScaleVmGroupResponse.class,
++@APICommand(name = "disableAutoScaleVmGroup", description = "Disables an AutoScale Vm Group", responseObject = AutoScaleVmGroupResponse.class, entityType = {IAMEntityType.AutoScaleVmGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DisableAutoScaleVmGroupCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DisableAutoScaleVmGroupCmd.class.getName());
      private static final String s_name = "disableautoscalevmGroupresponse";
@@@ -62,7 -59,7 +63,7 @@@
          if (result != null) {
              AutoScaleVmGroupResponse response = _responseGenerator.createAutoScaleVmGroupResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to disable AutoScale Vm Group");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/EnableAutoScaleVmGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/EnableAutoScaleVmGroupCmd.java
index 49a6cee,d9326d0..6b9f2c3
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/EnableAutoScaleVmGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/EnableAutoScaleVmGroupCmd.java
@@@ -35,7 -32,8 +35,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.as.AutoScaleVmGroup;
  import com.cloud.user.Account;
  
- @APICommand(name = "enableAutoScaleVmGroup", description = "Enables an AutoScale Vm Group", responseObject = AutoScaleVmGroupResponse.class, entityType = { IAMEntityType.AutoScaleVmGroup })
 -@APICommand(name = "enableAutoScaleVmGroup", description = "Enables an AutoScale Vm Group", responseObject = AutoScaleVmGroupResponse.class,
++@APICommand(name = "enableAutoScaleVmGroup", description = "Enables an AutoScale Vm Group", responseObject = AutoScaleVmGroupResponse.class, entityType = {IAMEntityType.AutoScaleVmGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class EnableAutoScaleVmGroupCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(EnableAutoScaleVmGroupCmd.class.getName());
      private static final String s_name = "enableautoscalevmGroupresponse";
@@@ -62,7 -59,7 +63,7 @@@
          if (result != null) {
              AutoScaleVmGroupResponse response = _responseGenerator.createAutoScaleVmGroupResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to enable AutoScale Vm Group");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScalePoliciesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScalePoliciesCmd.java
index c6eb40c,615ed47..43c4c72
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScalePoliciesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScalePoliciesCmd.java
@@@ -33,7 -32,8 +33,8 @@@ import org.apache.cloudstack.api.respon
  
  import com.cloud.network.as.AutoScalePolicy;
  
- @APICommand(name = "listAutoScalePolicies", description = "Lists autoscale policies.", responseObject = AutoScalePolicyResponse.class, entityType = { IAMEntityType.AutoScalePolicy })
 -@APICommand(name = "listAutoScalePolicies", description = "Lists autoscale policies.", responseObject = AutoScalePolicyResponse.class,
++@APICommand(name = "listAutoScalePolicies", description = "Lists autoscale policies.", responseObject = AutoScalePolicyResponse.class, entityType = {IAMEntityType.AutoScalePolicy},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListAutoScalePoliciesCmd extends BaseListAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListAutoScalePoliciesCmd.class.getName());
  
@@@ -100,7 -100,7 +101,7 @@@
          }
          response.setResponses(responses);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmGroupsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmGroupsCmd.java
index 5e35e63,a5d3cdb..2e88c27
--- a/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmGroupsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/autoscale/ListAutoScaleVmGroupsCmd.java
@@@ -19,9 -19,7 +19,10 @@@ package org.apache.cloudstack.api.comma
  import java.util.ArrayList;
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
@@@ -36,7 -35,8 +37,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.network.as.AutoScaleVmGroup;
  
- @APICommand(name = "listAutoScaleVmGroups", description = "Lists autoscale vm groups.", responseObject = AutoScaleVmGroupResponse.class, entityType = { IAMEntityType.AutoScaleVmGroup })
 -@APICommand(name = "listAutoScaleVmGroups", description = "Lists autoscale vm groups.", responseObject = AutoScaleVmGroupResponse.class,
++@APICommand(name = "listAutoScaleVmGroups", description = "Lists autoscale vm groups.", responseObject = AutoScaleVmGroupResponse.class, entityType = { IAMEntityType.AutoScaleVmGroup },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListAutoScaleVmGroupsCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListAutoScaleVmGroupsCmd.class.getName());
  
@@@ -111,6 -122,6 +124,6 @@@
          }
          response.setResponses(responses);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }


[39/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
CLOUDSTACK-6215: Updating test case to accomodate condition for VMware

Signed-off-by: SrikanteswaraRao Talluri <ta...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/28697448
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/28697448
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/28697448

Branch: refs/heads/distributedrouter
Commit: 286974488eab03efddfea35962161a224e997ab0
Parents: 16ddc34
Author: Gaurav Aradhye <ga...@clogeny.com>
Authored: Mon Mar 10 03:44:43 2014 -0400
Committer: SrikanteswaraRao Talluri <ta...@apache.org>
Committed: Fri Mar 14 11:34:52 2014 +0530

----------------------------------------------------------------------
 .../component/test_base_image_updation.py        | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/28697448/test/integration/component/test_base_image_updation.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_base_image_updation.py b/test/integration/component/test_base_image_updation.py
index af968cc..e31aacf 100644
--- a/test/integration/component/test_base_image_updation.py
+++ b/test/integration/component/test_base_image_updation.py
@@ -25,11 +25,10 @@
 """
 
 #Import Local Modules
-import marvin
 from marvin.codes import (PASS,
                           RECURRING)
 from nose.plugins.attrib import attr
-from marvin.cloudstackTestCase import cloudstackTestCase, unittest
+from marvin.cloudstackTestCase import cloudstackTestCase
 
 from marvin.integration.lib.base import (ServiceOffering,
                                          Account,
@@ -51,7 +50,6 @@ from marvin.integration.lib.utils import (validateList,
                                           cleanup_resources)
 
 import time
-from datetime import datetime, timedelta
 
 class Services:
     """Test Base Image Updation
@@ -117,6 +115,18 @@ class Services:
                         "ispublic": True,
                         "isextractable": True,
 
+                },
+                "VMware": {
+                        "displaytext": "Public Template - VMware",
+                        "name": "Public template -VMware",
+                        "ostype": "CentOS 5.3 (64-bit)",
+                        "url": "http://download.cloud.com/releases/2.2.0/CentOS5.3-x86_64.ova",
+                        "hypervisor": "vmware",
+                        "format": "ova",
+                        "isfeatured": True,
+                        "ispublic": True,
+                        "isextractable": True,
+
                 }
             },
             "template": {
@@ -503,8 +513,7 @@ class TestBaseImageUpdate(cloudstackTestCase):
                                     "VM created with IsVolatile=False doesn't have same ip after restore. Got : %s Expected : %s"
                                     %(vm_without_reset.nic[0].ipaddress, self.vm_without_reset.nic[0].ipaddress)
                                 )
-
-	    return
+        return
 
     @attr(tags=["advanced", "basic"])
     def test_04_reoccuring_snapshot_rules(self):


[36/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Give graceful state transition period to live with race-condition on VM startup time


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5a75a3e1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5a75a3e1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5a75a3e1

Branch: refs/heads/distributedrouter
Commit: 5a75a3e1f92dc8f6352f1e27797c44d40565454b
Parents: 3123c30
Author: Kelven Yang <ke...@gmail.com>
Authored: Wed Mar 12 14:30:18 2014 -0700
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Mar 13 16:59:56 2014 -0700

----------------------------------------------------------------------
 .../vm/VirtualMachinePowerStateSyncImpl.java    | 44 +++++++++++++++++---
 .../vmware/resource/VmwareResource.java         |  2 -
 2 files changed, 38 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5a75a3e1/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
index 6332958..9edecac 100644
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.vm;
 
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -24,10 +25,12 @@ import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
 
+import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.messagebus.MessageBus;
 import org.apache.cloudstack.framework.messagebus.PublishScope;
 
 import com.cloud.agent.api.HostVmStateReportEntry;
+import com.cloud.utils.DateUtil;
 import com.cloud.vm.dao.VMInstanceDao;
 
 public class VirtualMachinePowerStateSyncImpl implements VirtualMachinePowerStateSync {
@@ -37,6 +40,9 @@ public class VirtualMachinePowerStateSyncImpl implements VirtualMachinePowerStat
     @Inject VMInstanceDao _instanceDao;
     @Inject VirtualMachineManager _vmMgr;
 
+    protected final ConfigKey<Integer> PingInterval = new ConfigKey<Integer>(Integer.class, "ping.interval", "Advanced", "60",
+            "Interval to send application level pings to make sure the connection is still working", false);
+
     public VirtualMachinePowerStateSyncImpl() {
     }
 
@@ -96,15 +102,41 @@ public class VirtualMachinePowerStateSyncImpl implements VirtualMachinePowerStat
         }
 
         if (vmsThatAreMissingReport.size() > 0) {
+            Date currentTime = DateUtil.currentGMTTime();
+            if (s_logger.isDebugEnabled())
+                s_logger.debug("Run missing VM report. current time: " + currentTime.getTime());
+
+            // 2 times of sync-update interval for graceful period
+            long milliSecondsGracefullPeriod = PingInterval.value() * 2000;
+
             for (VMInstanceVO instance : vmsThatAreMissingReport) {
-                if (_instanceDao.updatePowerState(instance.getId(), hostId, VirtualMachine.PowerState.PowerReportMissing)) {
-                    if (s_logger.isDebugEnabled())
-                        s_logger.debug("VM state report is updated. host: " + hostId + ", vm id: " + instance.getId() + ", power state: PowerReportMissing ");
 
-                    _messageBus.publish(null, VirtualMachineManager.Topics.VM_POWER_STATE, PublishScope.GLOBAL, instance.getId());
+                Date vmStateUpdateTime = instance.getUpdateTime();
+                if (vmStateUpdateTime == null) {
+                    s_logger.warn("VM state was updated but update time is null?! vm id: " + instance.getId());
+                    vmStateUpdateTime = currentTime;
+                }
+
+                if (s_logger.isDebugEnabled())
+                    s_logger.debug("Detected missing VM. host: " + hostId + ", vm id: " + instance.getId() +
+                            ", power state: PowerReportMissing, last state update: " + vmStateUpdateTime.getTime());
+
+                long milliSecondsSinceLastStateUpdate = currentTime.getTime() - vmStateUpdateTime.getTime();
+
+                if (milliSecondsSinceLastStateUpdate > milliSecondsGracefullPeriod) {
+                    s_logger.debug("vm id: " + instance.getId() + " - time since last state update(" + milliSecondsSinceLastStateUpdate + "ms) has passed graceful period");
+
+                    if (_instanceDao.updatePowerState(instance.getId(), hostId, VirtualMachine.PowerState.PowerReportMissing)) {
+                        if (s_logger.isDebugEnabled())
+                            s_logger.debug("VM state report is updated. host: " + hostId + ", vm id: " + instance.getId() + ", power state: PowerReportMissing ");
+
+                        _messageBus.publish(null, VirtualMachineManager.Topics.VM_POWER_STATE, PublishScope.GLOBAL, instance.getId());
+                    } else {
+                        if (s_logger.isDebugEnabled())
+                            s_logger.debug("VM power state does not change, skip DB writing. vm id: " + instance.getId());
+                    }
                 } else {
-                    if (s_logger.isDebugEnabled())
-                        s_logger.debug("VM power state does not change, skip DB writing. vm id: " + instance.getId());
+                    s_logger.debug("vm id: " + instance.getId() + " - time since last state update(" + milliSecondsSinceLastStateUpdate + "ms) has not passed graceful period yet");
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5a75a3e1/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 4693f86..0a2cad4 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -41,7 +41,6 @@ import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
-
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
@@ -2681,7 +2680,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
         try {
             VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(cmd.getVmName());
             if (vmMo != null) {
-
                 State state = null;
                 synchronized (_vms) {
                     state = _vms.get(cmd.getVmName());


[54/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
findbug fixes, added some comments, bug fixes


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/42b553e3
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/42b553e3
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/42b553e3

Branch: refs/heads/distributedrouter
Commit: 42b553e30eefadbb7dbcce72db66ce113fe3d420
Parents: 7b0677a
Author: Murali Reddy <mu...@gmail.com>
Authored: Fri Mar 14 15:51:49 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:59:05 2014 +0530

----------------------------------------------------------------------
 .../xen/resource/CitrixResourceBase.java        |  11 +-
 .../cloud/network/guru/OvsGuestNetworkGuru.java |   1 +
 .../network/ovs/OvsNetworkTopologyGuruImpl.java |  21 +-
 .../cloud/network/ovs/OvsTunnelManagerImpl.java |  56 +++--
 .../xenserver/cloudstack_pluginlib.py           | 236 +++++++++++--------
 5 files changed, 193 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/42b553e3/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 57debc6..d1e1716 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -1147,7 +1147,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         if (vmSpec != null) {
             vifr.otherConfig.put("cloudstack-vm-id", vmSpec.getUuid());
         }
+
+        // OVS plugin looks at network UUID in the vif 'otherconfig' details to group VIF's & tunnel ports as part of tier
+        // when bridge is setup for distributed routing
         vifr.otherConfig.put("cloudstack-network-id", nic.getNetworkUuid());
+
         vifr.network = getNetwork(conn, nic);
 
         if (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) {
@@ -5285,7 +5289,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         Connection conn = getConnection();
         try {
             Network nw = findOrCreateTunnelNetwork(conn, cmd.getBridgeName());
-            String bridgeName = nw.getBridge(conn);;
+            String bridgeName = nw.getBridge(conn);
             String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge",
                     bridgeName, "config", cmd.getVpcConfigInJson(), "host-id", ((Long)cmd.getHostId()).toString());
                 if (result.startsWith("SUCCESS")) {
@@ -5302,8 +5306,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
     public Answer execute(OvsVpcRoutingPolicyConfigCommand cmd) {
         Connection conn = getConnection();
         try {
+            Network nw = findOrCreateTunnelNetwork(conn, cmd.getBridgeName());
+            String bridgeName = nw.getBridge(conn);
+
             String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_routing_policies", "bridge",
-                    cmd.getBridgeName(), "host-id", ((Long)cmd.getHostId()).toString(), "config",
+                    bridgeName, "host-id", ((Long)cmd.getHostId()).toString(), "config",
                     cmd.getVpcConfigInJson());
             if (result.startsWith("SUCCESS")) {
                 return new Answer(cmd, true, result);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/42b553e3/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java b/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
index 9d2efe6..de74108 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
@@ -151,6 +151,7 @@ public class OvsGuestNetworkGuru extends GuestNetworkGuru {
 
         implemented.setBroadcastDomainType(BroadcastDomainType.Vswitch);
 
+        // for the networks that are part of VPC enabled for distributed routing use scheme vs://vpcid.GRE key for network
         if (network.getVpcId() != null && isVpcEnabledForDistributedRouter(network.getVpcId())) {
             String keyStr = BroadcastDomainType.getValue(implemented.getBroadcastUri());
             Long vpcid= network.getVpcId();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/42b553e3/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
index 740df80..ab08d26 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
@@ -91,6 +91,9 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
         return vpcHostIds;
     }
 
+    /**
+     * get the list of VPC id's of the vpc's for which one or more VM's from the VPC are running on the host
+     */
     @Override
     public List<Long> getVpcOnHost(long hostId) {
         List<Long> vpcIds = new ArrayList<>();
@@ -109,6 +112,9 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
         return vpcIds;
     }
 
+    /**
+     * get the list of all active Vm id's in a network
+     */
     @Override
     public List<Long> getAllActiveVmsInNetwork(long networkId) {
         List <Long> vmIds = new ArrayList<>();
@@ -117,7 +123,6 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
                 VirtualMachine.State.Migrating);
         // Find routers for the network
         List<DomainRouterVO> routers = _routerDao.findByNetwork(networkId);
-        List<VMInstanceVO> ins = new ArrayList<VMInstanceVO>();
 
         if (vms != null) {
             for (UserVmVO vm : vms) {
@@ -132,6 +137,9 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
         return  vmIds;
     }
 
+    /**
+     * get the list of all active Vm id's in the VPC for all ther tiers
+     */
     @Override
     public List<Long> getAllActiveVmsInVpc(long vpcId) {
 
@@ -148,6 +156,9 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
         return vmIds;
     }
 
+    /**
+     * get the list of all Vm id's in the VPC for all the tiers that are running on the host
+     */
     @Override
     public List<Long> getActiveVmsInVpcOnHost(long vpcId, long hostId) {
         Set<Long> vmIdsSet = new HashSet<>();
@@ -163,6 +174,9 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
         return vmIds;
     }
 
+    /**
+     * get the list of all Vm id's in the network that are running on the host
+     */
     @Override
     public List<Long> getActiveVmsInNetworkOnHost(long networkId, long hostId) {
         List <Long> vmIds = new ArrayList<>();
@@ -171,7 +185,6 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
                 VirtualMachine.State.Migrating);
         // Find routers for the network
         List<DomainRouterVO> routers = _routerDao.findByNetwork(networkId);
-        List<VMInstanceVO> ins = new ArrayList<VMInstanceVO>();
 
         if (vms != null) {
             for (UserVmVO vm : vms) {
@@ -188,13 +201,15 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
         return  vmIds;
     }
 
+    /**
+     * get the list of all Vpc id's in which, a VM has a nic in the network that is part of VPC
+     */
     @Override
     public List<Long> getVpcIdsVmIsPartOf(long vmId) {
         List<Long> vpcIds = new ArrayList<>();
         List<NicVO> nics = _nicDao.listByVmId(vmId);
         if (nics == null)
             return null;
-
         for (Nic nic: nics) {
             Network network = _networkDao.findById(nic.getNetworkId());
             if (network != null && network.getTrafficType() == Networks.TrafficType.Guest && network.getVpcId() != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/42b553e3/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
index 30088aa..21e9058 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
@@ -665,7 +665,6 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
     public boolean postStateTransitionEvent(VirtualMachine.State oldState, VirtualMachine.Event event,
                                             VirtualMachine.State newState, VirtualMachine vm,
                                             boolean status, Object opaque) {
-
         if (!status) {
             return false;
         }
@@ -720,7 +719,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
 
     public boolean sendVpcTopologyChangeUpdate(OvsVpcPhysicalTopologyConfigCommand updateCmd, long hostId, String bridgeName) {
         try {
-            s_logger.debug("Sending VPC topology update to the host " + hostId);
+            s_logger.debug("Sending VPC topology change update to the host " + hostId);
             updateCmd.setHostId(hostId);
             updateCmd.setBridgeName(bridgeName);
             Answer ans = _agentMgr.send(hostId, updateCmd);
@@ -732,7 +731,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                 return false;
             }
         } catch (Exception e) {
-            s_logger.debug("Failed to updated the host " + hostId + " with latest VPC topology." );
+            s_logger.debug("Failed to updated the host " + hostId + " with latest VPC topology.", e );
             return false;
         }
     }
@@ -797,6 +796,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                     vmInstance.getHostId(), vmNics.toArray(new OvsVpcPhysicalTopologyConfigCommand.Nic[vmNics.size()]));
             vms.add(vm);
         }
+
         return new OvsVpcPhysicalTopologyConfigCommand(
                 hosts.toArray(new OvsVpcPhysicalTopologyConfigCommand.Host[hosts.size()]),
                 tiers.toArray(new OvsVpcPhysicalTopologyConfigCommand.Tier[tiers.size()]),
@@ -804,47 +804,58 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                 vpc.getCidr());
     }
 
-    // Subscriber to ACL replace events. On acl replace event, if the vpc is enabled for distributed routing
-    // send the ACL update to all the hosts on which VPC spans
+    // Subscriber to ACL replace events. On acl replace event, if the vpc for the tier is enabled for
+    // distributed routing send the ACL update to all the hosts on which VPC spans
     public class NetworkAclEventsSubscriber implements MessageSubscriber {
         @Override
         public void onPublishMessage(String senderAddress, String subject, Object args) {
-            NetworkVO network = (NetworkVO) args;
-            String bridgeName=generateBridgeNameForVpc(network.getVpcId());
-            if (network.getVpcId() != null & isVpcEnabledForDistributedRouter(network.getVpcId())) {
-                long vpcId = network.getVpcId();
-                OvsVpcRoutingPolicyConfigCommand cmd = prepareVpcRoutingPolicyUpdate(vpcId);
-                List<Long> vpcSpannedHostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
-                for (Long id: vpcSpannedHostIds) {
-                    if (!sendVpcRoutingPolicyChangeUpdate(cmd, id, bridgeName)) {
-                        s_logger.debug("Failed to send VPC routing policy change update to host : " + id +
-                                ". But moving on with sending the host updates to the rest of the hosts.");
+            try {
+                NetworkVO network = (NetworkVO) args;
+                String bridgeName=generateBridgeNameForVpc(network.getVpcId());
+                if (network.getVpcId() != null & isVpcEnabledForDistributedRouter(network.getVpcId())) {
+                    long vpcId = network.getVpcId();
+                    OvsVpcRoutingPolicyConfigCommand cmd = prepareVpcRoutingPolicyUpdate(vpcId);
+                    List<Long> vpcSpannedHostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
+                    for (Long id: vpcSpannedHostIds) {
+                        if (!sendVpcRoutingPolicyChangeUpdate(cmd, id, bridgeName)) {
+                            s_logger.debug("Failed to send VPC routing policy change update to host : " + id +
+                                    ". But moving on with sending the updates to the rest of the hosts.");
+                        }
                     }
                 }
+            } catch (Exception e) {
+                s_logger.debug("Failed to send VPC routing policy change updates all hosts in vpc", e);
             }
         }
     }
 
     private OvsVpcRoutingPolicyConfigCommand prepareVpcRoutingPolicyUpdate(long vpcId) {
-        VpcVO vpc = _vpcDao.findById(vpcId);
-        assert (vpc != null): "invalid vpc id";
+
         List<OvsVpcRoutingPolicyConfigCommand.Acl> acls = new ArrayList<>();
         List<OvsVpcRoutingPolicyConfigCommand.Tier> tiers = new ArrayList<>();
 
+        VpcVO vpc = _vpcDao.findById(vpcId);
         List<? extends Network> vpcNetworks =  _vpcMgr.getVpcNetworks(vpcId);
+        assert (vpc != null && (vpcNetworks != null && !vpcNetworks.isEmpty())): "invalid vpc id";
+
         for (Network network : vpcNetworks) {
             Long networkAclId = network.getNetworkACLId();
+            if (networkAclId == null)
+                continue;
             NetworkACLVO networkAcl = _networkACLDao.findById(networkAclId);
 
             List<OvsVpcRoutingPolicyConfigCommand.AclItem> aclItems = new ArrayList<>();
             List<NetworkACLItemVO> aclItemVos = _networkACLItemDao.listByACL(networkAclId);
             for (NetworkACLItemVO aclItem : aclItemVos) {
                 String[] sourceCidrs = aclItem.getSourceCidrList().toArray(new String[aclItem.getSourceCidrList().size()]);
+
                 aclItems.add(new OvsVpcRoutingPolicyConfigCommand.AclItem(
                         aclItem.getNumber(), aclItem.getUuid(), aclItem.getAction().name(),
                         aclItem.getTrafficType().name(),
-                        aclItem.getSourcePortStart().toString(), aclItem.getSourcePortEnd().toString(),
-                        aclItem.getProtocol(), sourceCidrs));
+                        ((aclItem.getSourcePortStart() != null) ?aclItem.getSourcePortStart().toString() :null),
+                        ((aclItem.getSourcePortEnd() != null) ?aclItem.getSourcePortEnd().toString() :null),
+                        aclItem.getProtocol(),
+                        sourceCidrs));
             }
 
             OvsVpcRoutingPolicyConfigCommand.Acl acl = new OvsVpcRoutingPolicyConfigCommand.Acl(networkAcl.getUuid(),
@@ -862,10 +873,9 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
         return cmd;
     }
 
-
     public boolean sendVpcRoutingPolicyChangeUpdate(OvsVpcRoutingPolicyConfigCommand updateCmd, long hostId, String bridgeName) {
         try {
-            s_logger.debug("Sending VPC routing policy change update to the host " + hostId);
+            s_logger.debug("Sending VPC routing policies change update to the host " + hostId);
             updateCmd.setHostId(hostId);
             updateCmd.setBridgeName(bridgeName);
             Answer ans = _agentMgr.send(hostId, updateCmd);
@@ -873,11 +883,11 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                 s_logger.debug("Successfully updated the host " + hostId + " with latest VPC routing policies." );
                 return true;
             }  else {
-                s_logger.debug("Failed to update the host " + hostId + " with latest routing policy." );
+                s_logger.debug("Failed to update the host " + hostId + " with latest routing policies." );
                 return false;
             }
         } catch (Exception e) {
-            s_logger.debug("Failed to updated the host " + hostId + " with latest routing policy." );
+            s_logger.debug("Failed to updated the host " + hostId + " with latest routing policies due to" , e );
             return false;
         }
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/42b553e3/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
index 1c9d513..4ebb435 100644
--- a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
+++ b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
@@ -321,62 +321,66 @@ def configure_bridge_for_network_topology(bridge, this_host_id, json_config):
         logging.debug("WARNING:Can't find VPC info in json config file")
         return "FAILURE:IMPROPER_JSON_CONFG_FILE"
 
-    # get the list of Vm's in the VPC from the JSON config
-    this_host_vms = get_vms_on_host(vpconfig, this_host_id)
-
-    for vm in this_host_vms:
-        for nic in vm.nics:
-            mac_addr = nic.macaddress
-            ip = nic.ipaddress
-            vif_name = get_vif_name_from_macaddress(mac_addr)
-            of_port = get_ofport_for_vif(vif_name)
-            network = get_network_details(vpconfig, nic.networkuuid)
-
-            # Add flow rule in L2 look up table, if the destination mac = MAC of the nic send packet on the found OFPORT
-            add_mac_lookup_table_entry(bridge, mac_addr, of_port)
-
-            # Add flow rule in L3 look up table: if the destination IP = VM's IP then modify the packet
-            # to set DST MAC = VM's MAC, SRC MAC=tier gateway MAC and send to egress table
-            add_ip_lookup_table_entry(bridge, ip, network.gatewaymac, mac_addr)
-
-            # Add flow entry to send with intra tier traffic from the NIC to L2 lookup path)
-            action_str = "table=0, in_port=%s," %of_port + " ip, nw_dst=%s," %network.cidr + " actions=resubmit(,1)"
-            addflow = [OFCTL_PATH, "add-flow", bridge, action_str]
-            do_cmd(addflow)
-
-            #add flow entry to send inter-tier traffic from the NIC to egress ACL table(to L3 lookup path)
-            action_str = "table=0, in_port=%s," % of_port + " ip, dl_dst=%s," %network.gatewaymac +\
-                         "nw_dst=%s," %vpconfig.cidr + "actions=resubmit(,3)"
-            addflow = [OFCTL_PATH, "add-flow", bridge, action_str]
-
-            do_cmd(addflow)
-
-    # get the list of hosts on which VPC spans from the JSON config
-    vpc_spanning_hosts = vpconfig.hosts
-
-    for host in vpc_spanning_hosts:
-        if str(this_host_id) == str(host.hostid):
-            continue
-        other_host_vms = get_vms_on_host(vpconfig, host.hostid)
-        for vm in other_host_vms:
+    try:
+        # get the list of Vm's in the VPC from the JSON config
+        this_host_vms = get_vms_on_host(vpconfig, this_host_id)
+
+        for vm in this_host_vms:
             for nic in vm.nics:
                 mac_addr = nic.macaddress
                 ip = nic.ipaddress
+                vif_name = get_vif_name_from_macaddress(mac_addr)
+                of_port = get_ofport_for_vif(vif_name)
                 network = get_network_details(vpconfig, nic.networkuuid)
-                gre_key = network.grekey
 
-                # generate tunnel name from tunnel naming convention
-                tunnel_name = "t%s-%s-%s" % (gre_key, this_host_id, host.hostid)
-                of_port = get_ofport_for_vif(tunnel_name)
-
-                # Add flow rule in L2 look up table, if the destination mac = MAC of the nic send packet tunnel port
+                # Add flow rule in L2 look up table, if the destination mac = MAC of the nic send packet on the found OFPORT
                 add_mac_lookup_table_entry(bridge, mac_addr, of_port)
 
-                # Add flow tule in L3 look up table: if the destination IP = VM's IP then modify the packet
-                # set DST MAC = VM's MAC, SRC MAC=tier gateway MAC and send to egress table
+                # Add flow rule in L3 look up table: if the destination IP = VM's IP then modify the packet
+                # to set DST MAC = VM's MAC, SRC MAC=tier gateway MAC and send to egress table
                 add_ip_lookup_table_entry(bridge, ip, network.gatewaymac, mac_addr)
 
-    return "SUCCESS: successfully configured bridge as per the VPC topology"
+                # Add flow entry to send with intra tier traffic from the NIC to L2 lookup path)
+                action_str = "table=0, in_port=%s," %of_port + " ip, nw_dst=%s," %network.cidr + " actions=resubmit(,1)"
+                addflow = [OFCTL_PATH, "add-flow", bridge, action_str]
+                do_cmd(addflow)
+
+                #add flow entry to send inter-tier traffic from the NIC to egress ACL table(to L3 lookup path)
+                action_str = "table=0, in_port=%s," % of_port + " ip, dl_dst=%s," %network.gatewaymac +\
+                             "nw_dst=%s," %vpconfig.cidr + "actions=resubmit(,3)"
+                addflow = [OFCTL_PATH, "add-flow", bridge, action_str]
+
+                do_cmd(addflow)
+
+        # get the list of hosts on which VPC spans from the JSON config
+        vpc_spanning_hosts = vpconfig.hosts
+
+        for host in vpc_spanning_hosts:
+            if str(this_host_id) == str(host.hostid):
+                continue
+            other_host_vms = get_vms_on_host(vpconfig, host.hostid)
+            for vm in other_host_vms:
+                for nic in vm.nics:
+                    mac_addr = nic.macaddress
+                    ip = nic.ipaddress
+                    network = get_network_details(vpconfig, nic.networkuuid)
+                    gre_key = network.grekey
+
+                    # generate tunnel name from tunnel naming convention
+                    tunnel_name = "t%s-%s-%s" % (gre_key, this_host_id, host.hostid)
+                    of_port = get_ofport_for_vif(tunnel_name)
+
+                    # Add flow rule in L2 look up table, if the destination mac = MAC of the nic send packet tunnel port
+                    add_mac_lookup_table_entry(bridge, mac_addr, of_port)
+
+                    # Add flow tule in L3 look up table: if the destination IP = VM's IP then modify the packet
+                    # set DST MAC = VM's MAC, SRC MAC=tier gateway MAC and send to egress table
+                    add_ip_lookup_table_entry(bridge, ip, network.gatewaymac, mac_addr)
+
+        return "SUCCESS: successfully configured bridge as per the VPC topology"
+    except:
+        logging.debug("An unexpected error occurred while configuring bridge as per VPC topology.")
+        raise
 
 def get_acl(vpcconfig, required_acl_id):
     acls = vpcconfig.acls
@@ -392,60 +396,84 @@ def configure_ovs_bridge_for_routing_policies(bridge, json_config):
         logging.debug("WARNING:Can't find VPC info in json config file")
         return "FAILURE:IMPROPER_JSON_CONFG_FILE"
 
-    # First flush current egress ACL's before re-applying the ACL's
-    del_flows(bridge, table=3)
-
-    egress_rules_added = False
-    ingress_rules_added = False
-
-    tiers = vpconfig.tiers
-    for tier in tiers:
-        tier_cidr = tier.cidr
-        acl = get_acl(vpconfig, tier.aclid)
-        acl_items = acl.aclitems
-
-        for acl_item in acl_items:
-            number = acl_item.number
-            action = acl_item.action
-            direction = acl_item.direction
-            source_port_start = acl_item.sourceportstart
-            source_port_end = acl_item.sourceportend
-            protocol = acl_item.protocol
-            source_cidrs = acl_item.sourcecidrs
-            acl_priority = 1000 + number
-            for source_cidr in source_cidrs:
-                if direction is "ingress":
-                    ingress_rules_added = True
-                    # add flow rule to do action (allow/deny) for flows where source IP of the packet is in
-                    # source_cidr and destination ip is in tier_cidr
-                    port = source_port_start
-                    while (port < source_port_end):
-                        if action is "deny":
-                            add_flow(bridge, priority= acl_priority, table=5, nw_src=source_cidr, nw_dst=tier_cidr, tp_dst=port,
-                                     nw_proto=protocol, actions='drop')
-                        if action is "allow":
-                            add_flow(bridge, priority= acl_priority,table=5, nw_src=source_cidr, nw_dst=tier_cidr, tp_dst=port,
-                                     nw_proto=protocol, actions='resubmit(,1)')
-                        port = port + 1
-
-                elif direction in "egress":
-                    egress_rules_added = True
-                    # add flow rule to do action (allow/deny) for flows where destination IP of the packet is in
-                    # source_cidr and source ip is in tier_cidr
-                    port = source_port_start
-                    while (port < source_port_end):
-                        if action is "deny":
-                            add_flow(bridge, priority= acl_priority, table=5, nw_src=tier_cidr, nw_dst=source_cidr, tp_dst=port,
-                                     nw_proto=protocol, actions='drop')
-                        if action is "allow":
-                            add_flow(bridge, priority= acl_priority, table=5, nw_src=tier_cidr, nw_dst=source_cidr, tp_dst=port,
-                                     nw_proto=protocol, actions='resubmit(,1)')
-                        port = port + 1
-
-    if egress_rules_added is False:
-        # add a default rule in egress table to forward packet to L3 lookup table
-        add_flow(bridge, priority=0, table=3, actions='resubmit(,4)')
-
-    if ingress_rules_added is False:
-        # add a default rule in egress table drop packets
-        add_flow(bridge, priority=0, table=5, actions='drop')
\ No newline at end of file
+    try:
+        # First flush current egress ACL's before re-applying the ACL's
+        del_flows(bridge, table=3)
+
+        egress_rules_added = False
+        ingress_rules_added = False
+
+        tiers = vpconfig.tiers
+        for tier in tiers:
+            tier_cidr = tier.cidr
+            acl = get_acl(vpconfig, tier.aclid)
+            acl_items = acl.aclitems
+
+            for acl_item in acl_items:
+                number = acl_item.number
+                action = acl_item.action
+                direction = acl_item.direction
+                source_port_start = acl_item.sourceportstart
+                source_port_end = acl_item.sourceportend
+                protocol = acl_item.protocol
+                source_cidrs = acl_item.sourcecidrs
+                acl_priority = 1000 + number
+                for source_cidr in source_cidrs:
+                    if direction is "ingress":
+                        ingress_rules_added = True
+
+                        if source_port_start is None and source_port_end is None:
+                            if action is "deny":
+                                add_flow(bridge, priority= acl_priority, table=5, nw_src=source_cidr, nw_dst=tier_cidr,
+                                         nw_proto=protocol, actions='drop')
+                            if action is "allow":
+                                add_flow(bridge, priority= acl_priority,table=5, nw_src=source_cidr, nw_dst=tier_cidr,
+                                         nw_proto=protocol, actions='resubmit(,1)')
+                            continue
+
+                        # add flow rule to do action (allow/deny) for flows where source IP of the packet is in
+                        # source_cidr and destination ip is in tier_cidr
+                        port = source_port_start
+                        while (port < source_port_end):
+                            if action is "deny":
+                                add_flow(bridge, priority= acl_priority, table=5, nw_src=source_cidr, nw_dst=tier_cidr, tp_dst=port,
+                                         nw_proto=protocol, actions='drop')
+                            if action is "allow":
+                                add_flow(bridge, priority= acl_priority,table=5, nw_src=source_cidr, nw_dst=tier_cidr, tp_dst=port,
+                                         nw_proto=protocol, actions='resubmit(,1)')
+                            port = port + 1
+
+                    elif direction in "egress":
+                        egress_rules_added = True
+
+                        if source_port_start is None and source_port_end is None:
+                            if action is "deny":
+                                add_flow(bridge, priority= acl_priority, table=3, nw_src=source_cidr, nw_dst=tier_cidr,
+                                         nw_proto=protocol, actions='drop')
+                            if action is "allow":
+                                add_flow(bridge, priority= acl_priority,table=3, nw_src=source_cidr, nw_dst=tier_cidr,
+                                         nw_proto=protocol, actions='resubmit(,1)')
+                            continue
+
+                        # add flow rule to do action (allow/deny) for flows where destination IP of the packet is in
+                        # source_cidr and source ip is in tier_cidr
+                        port = source_port_start
+                        while (port < source_port_end):
+                            if action is "deny":
+                                add_flow(bridge, priority= acl_priority, table=3, nw_src=tier_cidr, nw_dst=source_cidr, tp_dst=port,
+                                         nw_proto=protocol, actions='drop')
+                            if action is "allow":
+                                add_flow(bridge, priority= acl_priority, table=3, nw_src=tier_cidr, nw_dst=source_cidr, tp_dst=port,
+                                         nw_proto=protocol, actions='resubmit(,1)')
+                            port = port + 1
+
+        if egress_rules_added is False:
+            # add a default rule in egress table to forward packet to L3 lookup table
+            add_flow(bridge, priority=0, table=3, actions='resubmit(,4)')
+
+        if ingress_rules_added is False:
+            # add a default rule in egress table drop packets
+            add_flow(bridge, priority=0, table=5, actions='drop')
+    except:
+        logging.debug("An unexpected error occurred while configuring bridge as per VPC's routing policies.")
+        raise
\ No newline at end of file


[40/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
CLOUDSTACK-6238: NPE in HostStatsCollector.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6a5d3e96
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6a5d3e96
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6a5d3e96

Branch: refs/heads/distributedrouter
Commit: 6a5d3e96c96c0cd5ec9e1ec1e1c4ed42dc73f84f
Parents: 2869744
Author: Sanjay Tripathi <sa...@citrix.com>
Authored: Fri Mar 14 13:35:22 2014 +0530
Committer: Sanjay Tripathi <sa...@citrix.com>
Committed: Fri Mar 14 13:37:19 2014 +0530

----------------------------------------------------------------------
 server/src/com/cloud/server/StatsCollector.java | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6a5d3e96/server/src/com/cloud/server/StatsCollector.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java
index 067ed00..50aa93c 100755
--- a/server/src/com/cloud/server/StatsCollector.java
+++ b/server/src/com/cloud/server/StatsCollector.java
@@ -343,7 +343,9 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc
                 }
                 for (HostVO host : gpuEnabledHosts) {
                     HashMap<String, HashMap<String, Long>> groupDetails = _resourceMgr.getGPUStatistics(host);
-                    _resourceMgr.updateGPUDetails(host.getId(), groupDetails);
+                    if (groupDetails != null) {
+                        _resourceMgr.updateGPUDetails(host.getId(), groupDetails);
+                    }
                 }
                 hostIds = _hostGpuGroupsDao.listHostIds();
             } catch (Throwable t) {


[20/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
fix build for the juniper-contrail plugin


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1f6263de
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1f6263de
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1f6263de

Branch: refs/heads/distributedrouter
Commit: 1f6263dead08e208efacdb382ac57bbf143c4607
Parents: d9696b2
Author: Prachi Damle <pr...@cloud.com>
Authored: Thu Mar 13 13:50:36 2014 -0700
Committer: Prachi Damle <pr...@cloud.com>
Committed: Thu Mar 13 13:50:36 2014 -0700

----------------------------------------------------------------------
 .../network/contrail/management/MockAccountManager.java          | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1f6263de/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/MockAccountManager.java b/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
index c0b9ee5..957f708 100644
--- a/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
+++ b/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
@@ -177,13 +177,13 @@ public class MockAccountManager extends ManagerBase implements AccountManager {
     }
 
     @Override
-    public boolean isRootAdmin(long accountId) {
+    public boolean isRootAdmin(Long accountId) {
         // TODO Auto-generated method stub
         return false;
     }
 
     @Override
-    public boolean isDomainAdmin(long accountId) {
+    public boolean isDomainAdmin(Long accountId) {
         // TODO Auto-generated method stub
         return false;
     }


[17/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Removed getUUID() method from Domain interface as this interface already implements @Identity where getUUID is defined


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/67ab3211
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/67ab3211
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/67ab3211

Branch: refs/heads/distributedrouter
Commit: 67ab3211bd49724ee4a15aa4933c19c0e7adddff
Parents: df85211
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Thu Mar 13 12:54:13 2014 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Thu Mar 13 12:54:13 2014 -0700

----------------------------------------------------------------------
 api/src/com/cloud/domain/Domain.java | 3 ---
 1 file changed, 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/67ab3211/api/src/com/cloud/domain/Domain.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/domain/Domain.java b/api/src/com/cloud/domain/Domain.java
index c4755d7..365a705 100644
--- a/api/src/com/cloud/domain/Domain.java
+++ b/api/src/com/cloud/domain/Domain.java
@@ -60,7 +60,4 @@ public interface Domain extends OwnedBy, Identity, InternalIdentity {
 
     String getNetworkDomain();
 
-    @Override
-    public String getUuid();
-
 }


[48/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Scripts that use ovs-vsctl and ovs-ofctl to setup a bridge for VPC in
distributed routing mode, and setup flows appropriatley

script to handle the VPC topology sent from management server in JSOn
format. From the JSON file, reqired configuration (tunnel setup and flow
rules setup) is setup on the bridge


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/73b6c1b0
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/73b6c1b0
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/73b6c1b0

Branch: refs/heads/distributedrouter
Commit: 73b6c1b0df48d0345b6ae8c1a57e419b8305d44e
Parents: a067ccb
Author: Murali Reddy <mu...@gmail.com>
Authored: Mon Mar 10 11:58:37 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:58:19 2014 +0530

----------------------------------------------------------------------
 .../xenserver/cloudstack_pluginlib.py           | 154 +++++++++++++++++++
 .../vm/hypervisor/xenserver/ovs-vif-flows.py    | 128 +++++++++++----
 scripts/vm/hypervisor/xenserver/ovstunnel       | 114 +++++++++++++-
 3 files changed, 362 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/73b6c1b0/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
index 422111f..d2b95dc 100644
--- a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
+++ b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
@@ -21,6 +21,7 @@ import ConfigParser
 import logging
 import os
 import subprocess
+import json
 
 from time import localtime, asctime
 
@@ -176,6 +177,7 @@ def _build_flow_expr(**kwargs):
     dl_dst = 'dl_dst' in kwargs and ",dl_dst=%s" % kwargs['dl_dst'] or ''
     nw_src = 'nw_src' in kwargs and ",nw_src=%s" % kwargs['nw_src'] or ''
     nw_dst = 'nw_dst' in kwargs and ",nw_dst=%s" % kwargs['nw_dst'] or ''
+    table = 'table' in kwargs and ",table=%s" % kwargs['table'] or ''
     proto = 'proto' in kwargs and ",%s" % kwargs['proto'] or ''
     ip = ('nw_src' in kwargs or 'nw_dst' in kwargs) and ',ip' or ''
     flow = (flow + in_port + dl_type + dl_src + dl_dst +
@@ -219,3 +221,155 @@ def del_all_flows(bridge):
 def del_port(bridge, port):
     delPort = [VSCTL_PATH, "del-port", bridge, port]
     do_cmd(delPort)
+
+def get_network_id_for_vif(vif_name):
+    domain_id, device_id = vif_name[3:len(vif_name)].split(".")
+    dom_uuid = do_cmd([XE_PATH, "vm-list", "dom-id=%s" % domain_id, "--minimal"])
+    vif_uuid = do_cmd([XE_PATH, "vif-list", "vm-uuid=%s" % dom_uuid, "device=%s" % device_id, "--minimal"])
+    vnet = do_cmd([XE_PATH, "vif-param-get", "uuid=%s" % vif_uuid,  "param-name=other-config",
+                             "param-key=cloudstack-network-id"])
+    return vnet
+
+def get_network_id_for_tunnel_port(tunnelif_name):
+    vnet = do_cmd([VSCTL_PATH, "get", "interface", tunnelif_name, "options:cloudstack-network-id"])
+    return vnet
+
+def clear_flooding_rules_for_port(bridge, ofport):
+        del_flows(bridge, in_port=ofport, table=2)
+
+def add_flooding_rules_for_port(bridge, in_ofport, out_ofports):
+        action = "".join("output:%s," %ofport for ofport in out_ofports)[:-1]
+        add_flow(bridge, priority=1100, in_port=in_ofport, table=1, actions=action)
+
+def get_ofport_for_vif(vif_name):
+    return do_cmd([VSCTL_PATH, "get", "interface", vif_name, "ofport"])
+
+def get_macaddress_of_vif(vif_name):
+    domain_id, device_id = vif_name[3:len(vif_name)].split(".")
+    dom_uuid = do_cmd([XE_PATH, "vm-list", "dom-id=%s" % domain_id, "--minimal"])
+    vif_uuid = do_cmd([XE_PATH, "vif-list", "vm-uuid=%s" % dom_uuid, "device=%s" % device_id, "--minimal"])
+    mac = do_cmd([XE_PATH, "vif-param-get", "uuid=%s" % vif_uuid,  "param-name=MAC"])
+    return mac
+
+def get_vif_name_from_macaddress(macaddress):
+    vif_uuid = do_cmd([XE_PATH, "vif-list", "MAC=%s" % macaddress, "--minimal"])
+    vif_device_id = do_cmd([XE_PATH, "vif-param-get", "uuid=%s" % vif_uuid,  "param-name=device"])
+    vm_uuid = do_cmd([XE_PATH, "vif-param-get", "uuid=%s" % vif_uuid,  "param-name=vm-uuid"])
+    vm_domain_id = do_cmd([XE_PATH, "vm-param-get", "uuid=%s" % vm_uuid,  "param-name=dom-id"])
+    return "vif"+vm_domain_id+"."+vif_device_id
+
+def add_mac_lookup_table_entry(bridge, mac_address, out_of_port):
+    add_flow(bridge, priority=1100, dl_dst=mac_address, table=1, actions="output:%s" % out_of_port)
+
+def delete_mac_lookup_table_entry(bridge, mac_address):
+    del_flows(bridge, dl_dst=mac_address, table=1)
+
+def add_ip_lookup_table_entry(bridge, ip, dst_tier_gateway_mac, dst_vm_mac):
+    action_str = "mod_dl_sr:%s" % dst_tier_gateway_mac + ",mod_dl_dst:%s" % dst_vm_mac +",resubmit(,5)"
+    addflow = [OFCTL_PATH, "add-flow", bridge, "table=4", "nw_dst=%s" % ip, "actions=%s" %action_str]
+    do_cmd(addflow)
+
+def get_vms_on_host(vpc, host_id):
+    all_vms = vpc.vms
+    vms_on_host = []
+    for vm in all_vms:
+      if vm.hostid == host_id:
+        vms_on_host.append(vm)
+    return vms_on_host
+
+def get_network_details(vpc, network_uuid):
+    tiers = vpc.tiers
+    for tier in tiers:
+      if tier.networkuuid == network_uuid:
+        return tier
+    return None
+
+class jsonLoader(object):
+  def __init__(self, obj):
+        for k in obj:
+            v = obj[k]
+            if isinstance(v, dict):
+                setattr(self, k, jsonLoader(v))
+            elif isinstance(v, (list, tuple)):
+                if len(v) > 0 and isinstance(v[0], dict):
+                    setattr(self, k, [jsonLoader(elem) for elem in v])
+                else:
+                    setattr(self, k, v)
+            else:
+                setattr(self, k, v)
+
+  def __getattr__(self, val):
+        if val in self.__dict__:
+            return self.__dict__[val]
+        else:
+            return None
+
+  def __repr__(self):
+        return '{%s}' % str(', '.join('%s : %s' % (k, repr(v)) for (k, v)
+                                      in self.__dict__.iteritems()))
+
+  def __str__(self):
+        return '{%s}' % str(', '.join('%s : %s' % (k, repr(v)) for (k, v)
+                                      in self.__dict__.iteritems()))
+
+def configure_bridge_for_topology(bridge, this_host_id, json_config):
+    vpconfig = jsonLoader(json.loads(json_config)).vpc
+
+    if vpconfig is None:
+        logging.debug("WARNING:Can't find VPC info in json config file")
+        return "FAILURE:IMPROPER_JSON_CONFG_FILE"
+
+    # get the list of Vm's in the VPC from the JSON config
+    this_host_vms = get_vms_on_host(vpconfig, this_host_id)
+
+    for vm in this_host_vms:
+        for nic in vm.nics:
+            mac_addr = nic.macaddress
+            ip = nic.ipaddress
+            vif_name = get_vif_name_from_macaddress(mac_addr)
+            of_port = get_ofport_for_vif(vif_name)
+            network = get_network_details(vpconfig, nic.networkuuid)
+
+            # Add flow rule in L2 look up table, if the destination mac = MAC of the nic send packet on the found OFPORT
+            add_mac_lookup_table_entry(bridge, mac_addr, of_port)
+
+            # Add flow rule in L3 look up table: if the destination IP = VM's IP then modify the packet
+            # to set DST MAC = VM's MAC, SRC MAC=tier gateway MAC and send to egress table
+            add_ip_lookup_table_entry(bridge, ip, network.gatewaymac, mac_addr)
+
+            # Add flow entry to send with intra tier traffic from the NIC to L2 lookup path)
+            addflow = [OFCTL_PATH, "add-flow", bridge, "table=0", "in_port=%s" % of_port,
+                       "nw_dst=%s" %network.cidr, "actions=resubmit(,1)"]
+            do_cmd(addflow)
+
+            #add flow entry to send inter-tier traffic from the NIC to egress ACL table(to L3 lookup path)
+            addflow = [OFCTL_PATH, "add-flow", bridge, "table=0", "in_port=%s" % of_port,
+                       "dl_dst=%s" %network.gatewaymac, "nw_dst=%s" %vpconfig.cidr, "actions=resubmit(,3)"]
+            do_cmd(addflow)
+
+    # get the list of hosts on which VPC spans from the JSON config
+    vpc_spanning_hosts = vpconfig.hosts
+
+    for host in vpc_spanning_hosts:
+        if this_host_id == host.hostid:
+            continue
+        other_host_vms = get_vms_on_host(vpconfig, host.hostid)
+        for vm in other_host_vms:
+            for nic in vm.nics:
+                mac_addr = nic.macaddress
+                ip = nic.ipaddress
+                network = get_network_details(vpconfig, nic.networkuuid)
+                gre_key = network.grekey
+
+                # generate tunnel name from tunnel naming convention
+                tunnel_name = "t%s-%s-%s" % (gre_key, this_host_id, host.hostid)
+                of_port = get_ofport_for_vif(tunnel_name)
+
+                # Add flow rule in L2 look up table, if the destination mac = MAC of the nic send packet tunnel port
+                add_mac_lookup_table_entry(bridge, mac_addr, of_port)
+
+                # Add flow tule in L3 look up table: if the destination IP = VM's IP then modify the packet
+                # set DST MAC = VM's MAC, SRC MAC=tier gateway MAC and send to egress table
+                add_ip_lookup_table_entry(bridge, ip, network.gatewaymac, mac_addr)
+
+    return "SUCCESS: successfully configured bridge as per the VPC toplogy"
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/73b6c1b0/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py b/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
index 8452dae..ae37525 100644
--- a/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
+++ b/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
@@ -18,6 +18,7 @@
 # A simple script for enabling and disabling per-vif rules for explicitly
 # allowing broadcast/multicast traffic on the port where the VIF is attached
 
+import copy
 import os
 import sys
 
@@ -65,7 +66,6 @@ def clear_rules(vif):
     except:
         pass
 
-
 def main(command, vif_raw):
     if command not in ('online', 'offline'):
         return
@@ -86,38 +86,110 @@ def main(command, vif_raw):
 	# find xs network for this bridge, verify is used for ovs tunnel network
     xs_nw_uuid = pluginlib.do_cmd([pluginlib.XE_PATH, "network-list",
 								   "bridge=%s" % bridge, "--minimal"])
-    result = pluginlib.do_cmd([pluginlib.XE_PATH,"network-param-get",
+    ovs_tunnel_network = pluginlib.do_cmd([pluginlib.XE_PATH,"network-param-get",
 						       "uuid=%s" % xs_nw_uuid,
 						       "param-name=other-config",
 						       "param-key=is-ovs-tun-network", "--minimal"])
 
-    if result != 'True':
-		return
-    
-    vlan = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'br-to-vlan', bridge])
-    if vlan != '0':
-            # We need the REAL bridge name
-            bridge = pluginlib.do_cmd([pluginlib.VSCTL_PATH,
-                                       'br-to-parent', bridge])
-
-    vsctl_output = pluginlib.do_cmd([pluginlib.VSCTL_PATH,
-                                     'list-ports', bridge])
-    vifs = vsctl_output.split('\n')
-    vif_ofports = []
-    for vif in vifs:
-    	vif_ofport = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'get',
-                                       'Interface', vif, 'ofport'])
-    	if this_vif == vif:
-    		this_vif_ofport = vif_ofport
-        if vif.startswith('vif'): 
-            vif_ofports.append(vif_ofport)
-
-    if command == 'offline':
-        clear_flows(bridge,  this_vif_ofport, vif_ofports)
-
-    if command == 'online':
-        apply_flows(bridge,  this_vif_ofport, vif_ofports)
+    ovs_vpc_distributed_vr_network = pluginlib.do_cmd([pluginlib.XE_PATH,"network-param-get",
+						       "uuid=%s" % xs_nw_uuid,
+						       "param-name=other-config",
+						       "param-key=is-ovs_vpc_distributed_vr_network", "--minimal"])
+
+    if ovs_tunnel_network == 'True':
+        vlan = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'br-to-vlan', bridge])
+        if vlan != '0':
+                # We need the REAL bridge name
+                bridge = pluginlib.do_cmd([pluginlib.VSCTL_PATH,
+                                           'br-to-parent', bridge])
+        vsctl_output = pluginlib.do_cmd([pluginlib.VSCTL_PATH,
+                                         'list-ports', bridge])
+        vifs = vsctl_output.split('\n')
+        vif_ofports = []
+        for vif in vifs:
+            vif_ofport = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'get',
+                                           'Interface', vif, 'ofport'])
+            if this_vif == vif:
+                this_vif_ofport = vif_ofport
+            if vif.startswith('vif'):
+                vif_ofports.append(vif_ofport)
 
+        if command == 'offline':
+            clear_flows(bridge,  this_vif_ofport, vif_ofports)
+
+        if command == 'online':
+            apply_flows(bridge,  this_vif_ofport, vif_ofports)
+
+
+    if ovs_vpc_distributed_vr_network == 'True':
+        vlan = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'br-to-vlan', bridge])
+        if vlan != '0':
+                # We need the REAL bridge name
+                bridge = pluginlib.do_cmd([pluginlib.VSCTL_PATH,
+                                           'br-to-parent', bridge])
+        vsctl_output = pluginlib.do_cmd([pluginlib.VSCTL_PATH,
+                                         'list-ports', bridge])
+        vif_network_id = pluginlib.get_network_id_for_vif(this_vif)
+        vnet_vif_ofports = []
+        vnet_tunnelif_ofports = []
+        vnet_all_ofports = []
+
+        ports = vsctl_output.split('\n')
+        for port in ports:
+            if_ofport = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'get', 'Interface', vif, 'ofport'])
+            if vif.startswith('vif'):
+                # check VIF is in same network as that of plugged vif
+                if vif_network_id != pluginlib.get_network_id_for_vif(port):
+                    continue
+                vnet_vif_ofports.append(if_ofport)
+                vnet_all_ofports.append(if_ofport)
+
+            if vif.startswith('t'):
+                # check tunnel port is in same network as that of plugged vif
+                if vif_network_id != pluginlib.get_network_id_for_tunnel_port(port):
+                    continue
+                vnet_tunnelif_ofports.append(if_ofport)
+                vnet_all_ofports.append(if_ofport)
+
+        if command == 'online':
+            for port in vnet_all_ofports:
+                pluginlib.clear_flooding_rules_for_port(bridge, port)
+
+            # for a packet arrived from tunnel port, flood only on VIF ports
+            for port in vnet_tunnelif_ofports:
+                pluginlib.add_flooding_rules_for_port(bridge, port, vnet_vif_ofports)
+
+            # send on all VIF and tunnel port excluding the port on which packet arrived
+            for port in vnet_vif_ofports:
+                vnet_all_ofports_copy = copy.copy(vnet_all_ofports)
+                vnet_all_ofports_copy.remove(port)
+                pluginlib.add_flooding_rules_for_port(bridge, port, vnet_all_ofports_copy)
+
+            #learn that MAC is reachable through the VIF port
+            mac = pluginlib.get_macaddress_of_vif(this_vif)
+            pluginlib.add_mac_lookup_table_entry(bridge, mac, this_vif_ofport)
+
+        if command == 'offline':
+            for port in vnet_all_ofports:
+                pluginlib.clear_flooding_rules_for_port(bridge, port)
+            vnet_all_ofports.remove(this_vif_ofport)
+            vnet_vif_ofports.remove(this_vif_ofport)
+
+            # for a packet arrived from tunnel port, flood only on VIF ports
+            for port in vnet_tunnelif_ofports:
+                pluginlib.add_flooding_rules_for_port(bridge, port, vnet_vif_ofports)
+
+            # for a packet from VIF port send on all VIF's and tunnel ports excluding the port on which packet arrived
+            for port in vnet_vif_ofports:
+                vnet_all_ofports_copy = copy.copy(vnet_all_ofports)
+                vnet_all_ofports_copy.remove(port)
+                pluginlib.add_flooding_rules_for_port(bridge, port, vnet_all_ofports_copy)
+
+            #un-learn that MAC is reachable through the VIF port
+            mac = pluginlib.get_macaddress_of_vif(this_vif)
+            pluginlib.delete_mac_lookup_table_entry(bridge, mac)
+
+    return
 
 if __name__ == "__main__":
     if len(sys.argv) != 3:

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/73b6c1b0/scripts/vm/hypervisor/xenserver/ovstunnel
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/ovstunnel b/scripts/vm/hypervisor/xenserver/ovstunnel
index 106be04..d558e97 100755
--- a/scripts/vm/hypervisor/xenserver/ovstunnel
+++ b/scripts/vm/hypervisor/xenserver/ovstunnel
@@ -124,6 +124,75 @@ def setup_ovs_bridge(session, args):
     logging.debug("Setup_ovs_bridge completed with result:%s" % result)
     return result
 
+@echo
+def setup_ovs_bridge_for_distributed_routing(session, args):
+    bridge = args.pop("bridge")
+    key = args.pop("key")
+    xs_nw_uuid = args.pop("xs_nw_uuid")
+    cs_host_id = args.pop("cs_host_id")
+
+    res = lib.check_switch()
+    if res != "SUCCESS":
+        return "FAILURE:%s" % res
+
+    logging.debug("About to manually create the bridge:%s" % bridge)
+    # create a bridge with the same name as the xapi network
+    res = lib.do_cmd([lib.VSCTL_PATH, "--", "--may-exist", "add-br", bridge,
+                                     "--", "set", "bridge", bridge])
+    logging.debug("Bridge has been manually created:%s" % res)
+    # TODO: Make sure xs-network-uuid is set into external_ids
+    lib.do_cmd([lib.VSCTL_PATH, "set", "Bridge", bridge,
+                            "external_ids:xs-network-uuid=%s" % xs_nw_uuid])
+
+    # Non empty result means something went wrong
+    if res:
+        result = "FAILURE:%s" % res
+    else:
+        # Verify the bridge actually exists, with the gre_key properly set
+        res = lib.do_cmd([lib.VSCTL_PATH, "get", "bridge",
+                                          bridge, "other_config:gre_key"])
+        if key in res:
+            result = "SUCCESS:%s" % bridge
+        else:
+            result = "FAILURE:%s" % res
+        # Finally note in the xenapi network object that the network has
+        # been configured
+        xs_nw_uuid = lib.do_cmd([lib.XE_PATH, "network-list",
+                                "bridge=%s" % bridge, "--minimal"])
+        lib.do_cmd([lib.XE_PATH, "network-param-set", "uuid=%s" % xs_nw_uuid,
+                   "other-config:is-ovs_vpc_distributed_vr_network=True"])
+        conf_hosts = lib.do_cmd([lib.XE_PATH, "network-param-get",
+                                "uuid=%s" % xs_nw_uuid,
+                                "param-name=other-config",
+                                "param-key=ovs-host-setup", "--minimal"])
+        conf_hosts = cs_host_id + (conf_hosts and ',%s' % conf_hosts or '')
+        lib.do_cmd([lib.XE_PATH, "network-param-set", "uuid=%s" % xs_nw_uuid,
+                   "other-config:ovs-host-setup=%s" % conf_hosts])
+
+        # add a default flow rule to send broadcast and multi-cast packets to L2 flooding table
+        lib.add_flow(bridge, priority=1000, dl_dst='ff:ff:ff:ff:ff:ff', table=0, actions='resubmit(,2)')
+        lib.add_flow(bridge, priority=1000, nw_dst='224.0.0.0/24', table=0, actions='resubmit(,2)')
+
+        # add a default flow rule to send uni-cast traffic to L2 lookup table
+        lib.add_flow(bridge, priority=0, table=0, actions='resubmit(,1)')
+
+        # add a default rule to send unknown mac address to L2 flooding table
+        lib.add_flow(bridge, priority=0, table=1, actions='resubmit(,2)')
+
+        # add a default rule in L2 flood table to drop packet
+        lib.add_flow(bridge, priority=0, table=2, actions='drop')
+
+        # add a default rule in egress table to forward packet to L3 lookup table
+        lib.add_flow(bridge, priority=0, table=3, actions='resubmit(,4)')
+
+        # add a default rule in L3 lookup table to forward packet to L2 lookup table
+        lib.add_flow(bridge, priority=0, table=4, actions='resubmit(,1)')
+
+        # add a default rule in egress table to forward packet to L3 lookup table
+        lib.add_flow(bridge, priority=0, table=5, actions='drop')
+
+    logging.debug("Setup_ovs_bridge completed with result:%s" % result)
+    return result
 
 @echo
 def destroy_ovs_bridge(session, args):
@@ -220,13 +289,36 @@ def create_tunnel(session, args):
         # Ensure no trailing LF
         if tun_ofport.endswith('\n'):
             tun_ofport = tun_ofport[:-1]
-        # add flow entryies for dropping broadcast coming in from gre tunnel
-        lib.add_flow(bridge, priority=1000, in_port=tun_ofport,
+        # find xs network for this bridge, verify is used for ovs tunnel network
+        xs_nw_uuid = lib.do_cmd([lib.XE_PATH, "network-list",
+								   "bridge=%s" % bridge, "--minimal"])
+        ovs_tunnel_network = lib.do_cmd([lib.XE_PATH,"network-param-get",
+						       "uuid=%s" % xs_nw_uuid,
+						       "param-name=other-config",
+						       "param-key=is-ovs-tun-network", "--minimal"])
+        ovs_vpc_distributed_vr_network = lib.do_cmd([lib.XE_PATH,"network-param-get",
+                           "uuid=%s" % xs_nw_uuid,
+                           "param-name=other-config",
+                           "param-key=is-ovs_vpc_distributed_vr_network", "--minimal"])
+        if ovs_tunnel_network == 'True':
+            # add flow entryies for dropping broadcast coming in from gre tunnel
+            lib.add_flow(bridge, priority=1000, in_port=tun_ofport,
                          dl_dst='ff:ff:ff:ff:ff:ff', actions='drop')
-        lib.add_flow(bridge, priority=1000, in_port=tun_ofport,
+            lib.add_flow(bridge, priority=1000, in_port=tun_ofport,
                      nw_dst='224.0.0.0/24', actions='drop')
-        drop_flow_setup = True
-        logging.debug("Broadcast drop rules added")
+            drop_flow_setup = True
+            logging.debug("Broadcast drop rules added")
+
+        if ovs_vpc_distributed_vr_network == 'True':
+            # add flow rules for dropping broadcast coming in from tunnel ports
+            lib.add_flow(bridge, priority=1000, in_port=tun_ofport, table=0,
+                         dl_dst='ff:ff:ff:ff:ff:ff', actions='drop')
+            lib.add_flow(bridge, priority=1000, in_port=tun_ofport, table=0,
+                     nw_dst='224.0.0.0/24', actions='drop')
+
+            # add flow rule to send the traffic from tunnel ports to L2 switching table only
+            lib.add_flow(bridge, priority=1000, in_port=tun_ofport, table=0, actions='resubmit(,1)')
+
         return "SUCCESS:%s" % name
     except:
         logging.debug("An unexpected error occured. Rolling back")
@@ -293,10 +385,20 @@ def getLabel(session, args):
     	return label
     return False
 
+@echo
+def configure_ovs_bridge_for_network_topology(session, args):
+    bridge = args.pop("bridge")
+    json_config = args.pop("config")
+    this_host_id = args.pop("host-id")
+
+    return lib.configure_bridge_for_topology(bridge, this_host_id, json_config)
+
 if __name__ == "__main__":
     XenAPIPlugin.dispatch({"create_tunnel": create_tunnel,
                            "destroy_tunnel": destroy_tunnel,
                            "setup_ovs_bridge": setup_ovs_bridge,
                            "destroy_ovs_bridge": destroy_ovs_bridge,
                            "is_xcp": is_xcp,
-                           "getLabel": getLabel})
+                           "getLabel": getLabel,
+                           "setup_ovs_bridge_for_distributed_routing": setup_ovs_bridge_for_distributed_routing,
+                           "configure_ovs_bridge_for_network_topology": configure_ovs_bridge_for_network_topology})


[09/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Fix issues found through FindBugs.

Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/b554d4ac
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/b554d4ac
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/b554d4ac

Branch: refs/heads/distributedrouter
Commit: b554d4ac1fa58e4c6ae0b7256bffddab1f539510
Parents: 1c85af3
Author: Min Chen <mi...@citrix.com>
Authored: Tue Mar 11 11:49:48 2014 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Tue Mar 11 11:49:48 2014 -0700

----------------------------------------------------------------------
 server/src/com/cloud/api/query/QueryManagerImpl.java      |  9 ++++++---
 .../api/command/iam/AddIAMPermissionToIAMPolicyCmd.java   |  3 ---
 .../api/response/iam/IAMPermissionResponse.java           |  8 ++++----
 .../src/org/apache/cloudstack/iam/IAMApiServiceImpl.java  |  3 ++-
 .../cloudstack/iam/RoleBasedEntityAccessChecker.java      | 10 +++++++++-
 5 files changed, 21 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b554d4ac/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java
index 564bf4e..96647f8 100644
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@ -3314,17 +3314,20 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
         if (resourceIdStr != null) {
             resourceId = _taggedResourceMgr.getResourceId(resourceIdStr, resourceType);
         }
+        if (resourceId == null) {
+            throw new InvalidParameterValueException("Cannot find resource with resourceId " + resourceIdStr + " and of resource type " + resourceType);
+        }
         List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>();
         ResourceDetail requestedDetail = null;
 
-            if (key == null) {
+        if (key == null) {
             detailList = _resourceMetaDataMgr.getDetailsList(resourceId, resourceType, forDisplay);
-            } else {
+        } else {
             requestedDetail = _resourceMetaDataMgr.getDetail(resourceId, resourceType, key);
             if (forDisplay != null && requestedDetail.isDisplay() != forDisplay) {
                 requestedDetail = null;
             }
-            }
+        }
 
         List<ResourceDetailResponse> responseList = new ArrayList<ResourceDetailResponse>();
         if (requestedDetail != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b554d4ac/services/iam/plugin/src/org/apache/cloudstack/api/command/iam/AddIAMPermissionToIAMPolicyCmd.java
----------------------------------------------------------------------
diff --git a/services/iam/plugin/src/org/apache/cloudstack/api/command/iam/AddIAMPermissionToIAMPolicyCmd.java b/services/iam/plugin/src/org/apache/cloudstack/api/command/iam/AddIAMPermissionToIAMPolicyCmd.java
index e991537..d37cc3c 100644
--- a/services/iam/plugin/src/org/apache/cloudstack/api/command/iam/AddIAMPermissionToIAMPolicyCmd.java
+++ b/services/iam/plugin/src/org/apache/cloudstack/api/command/iam/AddIAMPermissionToIAMPolicyCmd.java
@@ -39,7 +39,6 @@ import com.cloud.event.EventTypes;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.user.Account;
-import com.cloud.utils.db.EntityManager;
 
 
 @APICommand(name = "addIAMPermissionToIAMPolicy", description = "Add IAM permission to an iam policy", responseObject = IAMPolicyResponse.class)
@@ -49,8 +48,6 @@ public class AddIAMPermissionToIAMPolicyCmd extends BaseAsyncCmd {
 
     @Inject
     public IAMApiService _iamApiSrv;
-    @Inject
-    public EntityManager _entityMgr;
 
     /////////////////////////////////////////////////////
     //////////////// API parameters /////////////////////

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b554d4ac/services/iam/plugin/src/org/apache/cloudstack/api/response/iam/IAMPermissionResponse.java
----------------------------------------------------------------------
diff --git a/services/iam/plugin/src/org/apache/cloudstack/api/response/iam/IAMPermissionResponse.java b/services/iam/plugin/src/org/apache/cloudstack/api/response/iam/IAMPermissionResponse.java
index b7af4da..5def248 100644
--- a/services/iam/plugin/src/org/apache/cloudstack/api/response/iam/IAMPermissionResponse.java
+++ b/services/iam/plugin/src/org/apache/cloudstack/api/response/iam/IAMPermissionResponse.java
@@ -108,13 +108,13 @@ public class IAMPermissionResponse extends BaseResponse {
         if (getClass() != obj.getClass())
             return false;
         IAMPermissionResponse other = (IAMPermissionResponse) obj;
-        if ((entityType == null && other.entityType != null) || !entityType.equals(other.entityType)) {
+        if ((entityType == null && other.entityType != null) || (entityType != null && !entityType.equals(other.entityType))) {
             return false;
-        } else if ((action == null && other.action != null) || !action.equals(other.action)) {
+        } else if ((action == null && other.action != null) || (action != null && !action.equals(other.action))) {
             return false;
-        } else if ((scope == null && other.scope != null) || !scope.equals(other.scope)) {
+        } else if ((scope == null && other.scope != null) || (scope != null && !scope.equals(other.scope))) {
             return false;
-        } else if ((scopeId == null && other.scopeId != null) || !scopeId.equals(other.scopeId)) {
+        } else if ((scopeId == null && other.scopeId != null) || (scopeId != null && !scopeId.equals(other.scopeId))) {
             return false;
         }
         return true;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b554d4ac/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java b/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
index 47b7697..9e941f2 100644
--- a/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
+++ b/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
@@ -591,8 +591,9 @@ public class IAMApiServiceImpl extends ManagerBase implements IAMApiService, Man
         if (BaseListCmd.class.isAssignableFrom(cmdClass)) {
             accessType = AccessType.UseEntry;
         }
+        String accessTypeStr = (accessType != null) ? accessType.toString() : null;
         return _iamSrv.addIAMPermissionToIAMPolicy(iamPolicyId, entityType, scope.toString(), scopeId, action,
-                accessType.toString(), perm, recursive);
+                accessTypeStr, perm, recursive);
     }
 
     @DB

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b554d4ac/services/iam/plugin/src/org/apache/cloudstack/iam/RoleBasedEntityAccessChecker.java
----------------------------------------------------------------------
diff --git a/services/iam/plugin/src/org/apache/cloudstack/iam/RoleBasedEntityAccessChecker.java b/services/iam/plugin/src/org/apache/cloudstack/iam/RoleBasedEntityAccessChecker.java
index d0d9d88..02bb702 100644
--- a/services/iam/plugin/src/org/apache/cloudstack/iam/RoleBasedEntityAccessChecker.java
+++ b/services/iam/plugin/src/org/apache/cloudstack/iam/RoleBasedEntityAccessChecker.java
@@ -35,6 +35,7 @@ import org.apache.cloudstack.iam.api.IAMService;
 
 import com.cloud.acl.DomainChecker;
 import com.cloud.domain.dao.DomainDao;
+import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.PermissionDeniedException;
 import com.cloud.user.Account;
 import com.cloud.user.AccountService;
@@ -73,7 +74,14 @@ public class RoleBasedEntityAccessChecker extends DomainChecker implements Secur
             return true;
         }
 
-        String entityType = entity.getEntityType().toString();
+        if (entity == null) {
+            throw new InvalidParameterValueException("Entity and action cannot be both NULL in checkAccess!");
+        }
+
+        String entityType = null;
+        if (entity.getEntityType() != null) {
+            entityType = entity.getEntityType().toString();
+        }
 
         if (accessType == null) {
             accessType = AccessType.UseEntry;


[50/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
adds hypervisor script to convert JSON routing polcies (ACL) config in
to flow rules and applies them on the bridge

add event subscriber in OvsTunnelManager, that listens to
replaceNetworkAcl events. On event sends the updated policy info to all
the hosts in the VPC


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/96fba6a8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/96fba6a8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/96fba6a8

Branch: refs/heads/distributedrouter
Commit: 96fba6a81c39b021ba6cd0072a5845554700d453
Parents: eeec82b
Author: Murali Reddy <mu...@gmail.com>
Authored: Tue Mar 11 04:07:13 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:59:03 2014 +0530

----------------------------------------------------------------------
 .../xen/resource/CitrixResourceBase.java        |  24 +++-
 .../api/OvsVpcLogicalTopologyConfigCommand.java |  33 -----
 .../OvsVpcPhysicalTopologyConfigCommand.java    |   6 +-
 .../api/OvsVpcRoutingPolicyConfigCommand.java   | 124 +++++++++++++++++++
 .../cloud/network/ovs/OvsTunnelManagerImpl.java | 104 ++++++++++++++--
 .../xenserver/cloudstack_pluginlib.py           |  76 +++++++++++-
 scripts/vm/hypervisor/xenserver/ovstunnel       |  14 ++-
 .../network/vpc/NetworkACLManagerImpl.java      |  12 +-
 8 files changed, 336 insertions(+), 57 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/96fba6a8/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 8752921..a281002 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -16,7 +16,6 @@
 // under the License.
 package com.cloud.hypervisor.xen.resource;
 
-
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
@@ -89,6 +88,7 @@ import org.apache.cloudstack.storage.to.TemplateObjectTO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
 
 import com.cloud.agent.IAgentControl;
+
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.AttachIsoCommand;
 import com.cloud.agent.api.AttachVolumeAnswer;
@@ -510,6 +510,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             return execute((OvsDeleteFlowCommand)cmd);
         } else if (clazz == OvsVpcPhysicalTopologyConfigCommand.class) {
             return execute((OvsVpcPhysicalTopologyConfigCommand) cmd);
+        } else if (clazz == OvsVpcRoutingPolicyConfigCommand.class) {
+            return execute((OvsVpcRoutingPolicyConfigCommand) cmd);
         } else if (clazz == CleanupNetworkRulesCmd.class) {
             return execute((CleanupNetworkRulesCmd)cmd);
         } else if (clazz == NetworkRulesSystemVmCommand.class) {
@@ -533,7 +535,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         } else if (clazz == PlugNicCommand.class) {
             return execute((PlugNicCommand)cmd);
         } else if (clazz == UnPlugNicCommand.class) {
-            return execute((UnPlugNicCommand)cmd);
+            return execute((UnPlugNicCommand) cmd);
         } else if (cmd instanceof StorageSubSystemCommand) {
             return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd);
         } else if (clazz == CreateVMSnapshotCommand.class) {
@@ -5283,8 +5285,24 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         Connection conn = getConnection();
         try {
             String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge",
+                    cmd.getBridgeName(), "config", cmd.getVpcConfigInJson());
+            if (result.equalsIgnoreCase("SUCCESS")) {
+                return new Answer(cmd, true, result);
+            } else {
+                return new Answer(cmd, false, result);
+            }
+        } catch  (Exception e) {
+            s_logger.warn("caught exception while updating host with latest routing polcies", e);
+            return new Answer(cmd, false, e.getMessage());
+        }
+    }
+
+    public Answer execute(OvsVpcRoutingPolicyConfigCommand cmd) {
+        Connection conn = getConnection();
+        try {
+            String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_routing_policies", "bridge",
                     cmd.getBridgeName(), "host-id", ((Long)cmd.getHostId()).toString(), "config",
-                    cmd.getjsonVpcConfig());
+                    cmd.getVpcConfigInJson());
             if (result.equalsIgnoreCase("SUCCESS")) {
                 return new Answer(cmd, true, result);
             } else {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/96fba6a8/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcLogicalTopologyConfigCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcLogicalTopologyConfigCommand.java b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcLogicalTopologyConfigCommand.java
deleted file mode 100644
index 2fafb6e..0000000
--- a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcLogicalTopologyConfigCommand.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.agent.api;
-
-/**
- * This command represents view of how a VPC is laid out (on which hosts, which VM is on which host etc)
- * on the physical infrastructure.
- */
-public class OvsVpcLogicalTopologyConfigCommand extends Command {
-
-    public OvsVpcLogicalTopologyConfigCommand() {
-
-    }
-
-    @Override
-    public boolean executeInSequence() {
-        return false;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/96fba6a8/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
index e6f4383..17299d3 100644
--- a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
+++ b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
@@ -20,8 +20,8 @@ import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 
 /**
- * This command represents physical view of how a VPC is laid out on the physical infrastructure.
- *   - on which hypervisor hosts VPC spans (host is running in at least one VM from the VPC)
+ * This command represents physical view of how a VPC is laid out on the physical infrastructure. Contains information:
+ *   - on which hypervisor hosts VPC spans (host running at least one VM from the VPC)
  *   - information of tiers, so we can figure how one VM can talk to a different VM in same tier or different tier
  *   - information on all the VM's in the VPC.
  *   - information of NIC's of each VM in the VPC
@@ -102,7 +102,7 @@ public class OvsVpcPhysicalTopologyConfigCommand extends Command {
         vpcConfig = new VpcConfig(vpc);
     }
 
-    public String getjsonVpcConfig() {
+    public String getVpcConfigInJson() {
         Gson gson = new GsonBuilder().create();
         return gson.toJson(vpcConfig).toLowerCase();
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/96fba6a8/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
new file mode 100644
index 0000000..8e4d5d1
--- /dev/null
+++ b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
@@ -0,0 +1,124 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.agent.api;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import java.util.UUID;
+
+/**
+ * This command represents logical view of VM's connectivity in VPC.
+ */
+public class OvsVpcRoutingPolicyConfigCommand extends Command {
+
+    VpcConfig vpcConfig =null;
+    long hostId;
+    String bridgeName;
+
+    public static class AclItem {
+        int number;
+        String uuid;
+        String action;
+        String direction;
+        String sourcePortStart;
+        String sourcePortEnd;
+        String protocol;
+        String[] sourceCidrs;
+        public AclItem(int number, String uuid, String action, String direction, String sourcePortStart,
+                       String sourcePortEnd, String protocol, String[] sourceCidrs) {
+            this.number = number;
+            this.uuid =uuid;
+            this.action = action;
+            this.direction = direction;
+            this.sourceCidrs = sourceCidrs;
+            this.sourcePortStart = sourcePortStart;
+            this.sourcePortEnd = sourcePortEnd;
+            this.protocol = protocol;
+        }
+    }
+
+    public static class Acl {
+        String id;
+        AclItem[] aclItems;
+        public Acl(String uuid, AclItem[] aclItems) {
+            this.id = uuid;
+            this.aclItems = aclItems;
+        }
+    }
+
+    public static class Tier {
+        String id;
+        String cidr;
+        String aclId;
+        public Tier(String uuid, String cidr, String aclId) {
+            this.id = uuid;
+            this.cidr = cidr;
+            this.aclId = aclId;
+        }
+    }
+
+    public class Vpc {
+        String cidr;
+        String id;
+        Acl[] acls;
+        Tier[] tiers;
+        public Vpc(String id, String cidr, Acl[] acls, Tier[] tiers) {
+            this.id = id;
+            this.cidr = cidr;
+            this.acls = acls;
+            this.tiers = tiers;
+        }
+    }
+
+    public static class VpcConfig {
+        Vpc vpc;
+        public VpcConfig(Vpc vpc) {
+            this.vpc = vpc;
+        }
+    }
+
+    public OvsVpcRoutingPolicyConfigCommand(String id, String cidr, Acl[] acls, Tier[] tiers) {
+        Vpc vpc = new Vpc(id, cidr, acls, tiers);
+        vpcConfig = new VpcConfig(vpc);
+    }
+
+    public String getVpcConfigInJson() {
+        Gson gson = new GsonBuilder().create();
+        return gson.toJson(vpcConfig).toLowerCase();
+    }
+
+    public void setHostId(long hostId) {
+        this.hostId = hostId;
+    }
+
+    public long getHostId() {
+        return hostId;
+    }
+
+    public String getBridgeName() {
+        return bridgeName;
+    }
+
+    public void setBridgeName(String bridgeName) {
+        this.bridgeName = bridgeName;
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/96fba6a8/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
index 82dbfed..35b0035 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
@@ -16,8 +16,12 @@
 // under the License.
 package com.cloud.network.ovs;
 
+import com.amazonaws.services.ec2.model.NetworkAcl;
+import com.cloud.agent.api.*;
 import com.cloud.network.dao.NetworkDao;
-import com.cloud.network.vpc.VpcManager;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.vpc.*;
+import com.cloud.network.vpc.dao.NetworkACLDao;
 import com.cloud.vm.dao.VMInstanceDao;
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicVO;
@@ -33,22 +37,14 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 import javax.persistence.EntityExistsException;
 
+import org.apache.cloudstack.framework.messagebus.MessageBus;
+import org.apache.cloudstack.framework.messagebus.MessageSubscriber;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 
 import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.Command;
-import com.cloud.agent.api.OvsCreateTunnelAnswer;
-import com.cloud.agent.api.OvsCreateTunnelCommand;
-import com.cloud.agent.api.OvsDestroyBridgeCommand;
-import com.cloud.agent.api.OvsDestroyTunnelCommand;
-import com.cloud.agent.api.OvsFetchInterfaceAnswer;
-import com.cloud.agent.api.OvsFetchInterfaceCommand;
-import com.cloud.agent.api.OvsSetupBridgeCommand;
-import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
 import com.cloud.agent.manager.Commands;
 import com.cloud.configuration.Config;
 import com.cloud.exception.AgentUnavailableException;
@@ -68,7 +64,6 @@ import com.cloud.network.ovs.dao.OvsTunnelNetworkDao;
 import com.cloud.network.ovs.dao.OvsTunnelNetworkVO;
 import com.cloud.network.ovs.dao.OvsTunnel;
 import com.cloud.network.vpc.dao.VpcDao;
-import com.cloud.network.vpc.VpcVO;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
@@ -112,6 +107,12 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
     protected VMInstanceDao _vmInstanceDao;
     @Inject
     NetworkDao _networkDao;
+    @Inject
+    MessageBus _messageBus;
+    @Inject
+    NetworkACLDao _networkACLDao;
+    @Inject
+    NetworkACLItemDao _networkACLItemDao;
 
     @Override
     public boolean configure(String name, Map<String, Object> params)
@@ -119,6 +120,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
         _executorPool = Executors.newScheduledThreadPool(10, new NamedThreadFactory("OVS"));
         _cleanupExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("OVS-Cleanup"));
 
+        _messageBus.subscribe("Network_ACL_Replaced", new NetworkAclEventsSubscriber());
         return true;
     }
 
@@ -725,4 +727,82 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
             }
         }
     }
+
+    // Subscriber to ACL replace events. On acl replace event, if the vpc is enabled for distributed routing
+    // send the ACL update to all the hosts on which VPC spans
+    public class NetworkAclEventsSubscriber implements MessageSubscriber {
+        @Override
+        public void onPublishMessage(String senderAddress, String subject, Object args) {
+            NetworkVO network = (NetworkVO) args;
+            String bridgeName=generateBridgeNameForVpc(network.getVpcId());
+            if (network.getVpcId() != null & isVpcEnabledForDistributedRouter(network.getVpcId())) {
+                long vpcId = network.getVpcId();
+                OvsVpcRoutingPolicyConfigCommand cmd = prepareVpcRoutingPolicyUpdate(vpcId);
+                List<Long> vpcSpannedHostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
+                for (Long id: vpcSpannedHostIds) {
+                    if (!sendVpcRoutingPolicyChangeUpdate(cmd, id, bridgeName)) {
+                        s_logger.debug("Failed to send VPC routing policy change update to host : " + id +
+                                ". Moving on with rest of the host updates.");
+                    }
+                }
+            }
+        }
+    }
+
+    OvsVpcRoutingPolicyConfigCommand prepareVpcRoutingPolicyUpdate(long vpcId) {
+        VpcVO vpc = _vpcDao.findById(vpcId);
+        assert (vpc != null): "invalid vpc id";
+        List<OvsVpcRoutingPolicyConfigCommand.Acl> acls = new ArrayList<>();
+        List<OvsVpcRoutingPolicyConfigCommand.Tier> tiers = new ArrayList<>();
+
+        List<? extends Network> vpcNetworks =  _vpcMgr.getVpcNetworks(vpcId);
+        for (Network network : vpcNetworks) {
+            Long networkAclId = network.getNetworkACLId();
+            NetworkACLVO networkAcl = _networkACLDao.findById(networkAclId);
+
+            List<OvsVpcRoutingPolicyConfigCommand.AclItem> aclItems = new ArrayList<>();
+            List<NetworkACLItemVO> aclItemVos = _networkACLItemDao.listByACL(networkAclId);
+            for (NetworkACLItemVO aclItem : aclItemVos) {
+                String[] sourceCidrs = aclItem.getSourceCidrList().toArray(new String[aclItem.getSourceCidrList().size()]);
+                aclItems.add(new OvsVpcRoutingPolicyConfigCommand.AclItem(
+                        aclItem.getNumber(), aclItem.getUuid(), aclItem.getAction().name(),
+                        aclItem.getTrafficType().name(),
+                        aclItem.getSourcePortStart().toString(), aclItem.getSourcePortEnd().toString(),
+                        aclItem.getProtocol(), sourceCidrs));
+            }
+
+            OvsVpcRoutingPolicyConfigCommand.Acl acl = new OvsVpcRoutingPolicyConfigCommand.Acl(networkAcl.getUuid(),
+                    aclItems.toArray(new OvsVpcRoutingPolicyConfigCommand.AclItem[aclItems.size()]));
+            acls.add(acl);
+
+            OvsVpcRoutingPolicyConfigCommand.Tier tier = new OvsVpcRoutingPolicyConfigCommand.Tier(network.getUuid(),
+                    network.getCidr(), networkAcl.getUuid());
+            tiers.add(tier);
+        }
+
+        OvsVpcRoutingPolicyConfigCommand cmd = new OvsVpcRoutingPolicyConfigCommand(vpc.getUuid(), vpc.getCidr(),
+                acls.toArray(new OvsVpcRoutingPolicyConfigCommand.Acl[acls.size()]),
+                tiers.toArray(new OvsVpcRoutingPolicyConfigCommand.Tier[tiers.size()]));
+        return cmd;
+    }
+
+
+    public boolean sendVpcRoutingPolicyChangeUpdate(OvsVpcRoutingPolicyConfigCommand updateCmd, long hostId, String bridgeName) {
+        try {
+            s_logger.debug("Sending VPC routing policy change update to the host " + hostId);
+            updateCmd.setHostId(hostId);
+            updateCmd.setBridgeName(bridgeName);
+            Answer ans = _agentMgr.send(hostId, updateCmd);
+            if (ans.getResult()) {
+                s_logger.debug("Successfully updated the host " + hostId + " with latest VPC routing policies." );
+                return true;
+            }  else {
+                s_logger.debug("Failed to update the host " + hostId + " with latest routing policy." );
+                return false;
+            }
+        } catch (Exception e) {
+            s_logger.debug("Failed to updated the host " + hostId + " with latest routing policy." );
+            return false;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/96fba6a8/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
index dbcc288..ac8a11d 100644
--- a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
+++ b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
@@ -312,7 +312,7 @@ class jsonLoader(object):
         return '{%s}' % str(', '.join('%s : %s' % (k, repr(v)) for (k, v)
                                       in self.__dict__.iteritems()))
 
-def configure_bridge_for_topology(bridge, this_host_id, json_config):
+def configure_bridge_for_network_topology(bridge, this_host_id, json_config):
     vpconfig = jsonLoader(json.loads(json_config)).vpc
 
     if vpconfig is None:
@@ -372,4 +372,76 @@ def configure_bridge_for_topology(bridge, this_host_id, json_config):
                 # set DST MAC = VM's MAC, SRC MAC=tier gateway MAC and send to egress table
                 add_ip_lookup_table_entry(bridge, ip, network.gatewaymac, mac_addr)
 
-    return "SUCCESS: successfully configured bridge as per the VPC toplogy"
\ No newline at end of file
+    return "SUCCESS: successfully configured bridge as per the VPC topology"
+
+def get_acl(vpcconfig, required_acl_id):
+    acls = vpcconfig.acls
+    for acl in acls:
+        if acl.id == required_acl_id:
+            return acl
+    return None
+
+def configure_ovs_bridge_for_routing_policies(bridge, json_config):
+    vpconfig = jsonLoader(json.loads(json_config)).vpc
+
+    if vpconfig is None:
+        logging.debug("WARNING:Can't find VPC info in json config file")
+        return "FAILURE:IMPROPER_JSON_CONFG_FILE"
+
+    # First flush current egress ACL's before re-applying the ACL's
+    del_flows(bridge, table=3)
+
+    egress_rules_added = False
+    ingress_rules_added = False
+
+    tiers = vpconfig.tiers
+    for tier in tiers:
+        tier_cidr = tier.cidr
+        acl = get_acl(vpconfig, tier.aclid)
+        acl_items = acl.aclitems
+
+        for acl_item in acl_items:
+            number = acl_item.number
+            action = acl_item.action
+            direction = acl_item.direction
+            source_port_start = acl_item.sourceportstart
+            source_port_end = acl_item.sourceportend
+            protocol = acl_item.protocol
+            source_cidrs = acl_item.sourcecidrs
+            acl_priority = 1000 + number
+            for source_cidr in source_cidrs:
+                if direction is "ingress":
+                    ingress_rules_added = True
+                    # add flow rule to do action (allow/deny) for flows where source IP of the packet is in
+                    # source_cidr and destination ip is in tier_cidr
+                    port = source_port_start
+                    while (port < source_port_end):
+                        if action is "deny":
+                            add_flow(bridge, priority= acl_priority, table=5, nw_src=source_cidr, nw_dst=tier_cidr, tp_dst=port,
+                                     nw_proto=protocol, actions='drop')
+                        if action is "allow":
+                            add_flow(bridge, priority= acl_priority,table=5, nw_src=source_cidr, nw_dst=tier_cidr, tp_dst=port,
+                                     nw_proto=protocol, actions='resubmit(,1)')
+                        port = port + 1
+
+                elif direction in "egress":
+                    egress_rules_added = True
+                    # add flow rule to do action (allow/deny) for flows where destination IP of the packet is in
+                    # source_cidr and source ip is in tier_cidr
+                    port = source_port_start
+                    while (port < source_port_end):
+                        if action is "deny":
+                            add_flow(bridge, priority= acl_priority, table=5, nw_src=tier_cidr, nw_dst=source_cidr, tp_dst=port,
+                                     nw_proto=protocol, actions='drop')
+                        if action is "allow":
+                            add_flow(bridge, priority= acl_priority, table=5, nw_src=tier_cidr, nw_dst=source_cidr, tp_dst=port,
+                                     nw_proto=protocol, actions='resubmit(,1)')
+                        port = port + 1
+
+    if egress_rules_added is False:
+        # add a default rule in egress table to forward packet to L3 lookup table
+        add_flow(bridge, priority=0, table=3, actions='resubmit(,4)')
+
+    if ingress_rules_added is False:
+        # add a default rule in egress table drop packets
+        add_flow(bridge, priority=0, table=5, actions='drop')
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/96fba6a8/scripts/vm/hypervisor/xenserver/ovstunnel
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/ovstunnel b/scripts/vm/hypervisor/xenserver/ovstunnel
index 9ef0f7b..98a9d0b 100755
--- a/scripts/vm/hypervisor/xenserver/ovstunnel
+++ b/scripts/vm/hypervisor/xenserver/ovstunnel
@@ -184,7 +184,7 @@ def setup_ovs_bridge_for_distributed_routing(session, args):
         # add a default rule in L3 lookup table to forward packet to L2 lookup table
         lib.add_flow(bridge, priority=0, table=4, actions='resubmit(,1)')
 
-        # add a default rule in egress table to forward packet to L3 lookup table
+        # add a default rule in ingress table to drop in bound packets
         lib.add_flow(bridge, priority=0, table=5, actions='drop')
 
         result = "SUCCESS: successfully setup bridge with flow rules"
@@ -391,7 +391,14 @@ def configure_ovs_bridge_for_network_topology(session, args):
     json_config = args.pop("config")
     this_host_id = args.pop("host-id")
 
-    return lib.configure_bridge_for_topology(bridge, this_host_id, json_config)
+    return lib.configure_bridge_for_network_topology(bridge, this_host_id, json_config)
+
+@echo
+def configure_ovs_bridge_for_routing_policies(session, args):
+    bridge = args.pop("bridge")
+    json_config = args.pop("config")
+
+    return lib.configure_ovs_bridge_for_router_policies(bridge, json_config)
 
 if __name__ == "__main__":
     XenAPIPlugin.dispatch({"create_tunnel": create_tunnel,
@@ -401,4 +408,5 @@ if __name__ == "__main__":
                            "is_xcp": is_xcp,
                            "getLabel": getLabel,
                            "setup_ovs_bridge_for_distributed_routing": setup_ovs_bridge_for_distributed_routing,
-                           "configure_ovs_bridge_for_network_topology": configure_ovs_bridge_for_network_topology})
+                           "configure_ovs_bridge_for_network_topology": configure_ovs_bridge_for_network_topology,
+                           "configure_ovs_bridge_for_routing_policies": "configure_ovs_bridge_for_routing_policies"})

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/96fba6a8/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java b/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
index 82f1216..ad47df1 100644
--- a/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
@@ -23,6 +23,8 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 
 import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.framework.messagebus.MessageBus;
+import org.apache.cloudstack.framework.messagebus.PublishScope;
 import org.apache.log4j.Logger;
 
 import com.cloud.configuration.ConfigurationManager;
@@ -82,6 +84,8 @@ public class NetworkACLManagerImpl extends ManagerBase implements NetworkACLMana
     EntityManager _entityMgr;
     @Inject
     VpcService _vpcSvc;
+    @Inject
+    MessageBus _messageBus;
 
     @Override
     public NetworkACL createNetworkACL(String name, String description, long vpcId, Boolean forDisplay) {
@@ -210,7 +214,13 @@ public class NetworkACLManagerImpl extends ManagerBase implements NetworkACLMana
         if (_networkDao.update(network.getId(), network)) {
             s_logger.debug("Updated network: " + network.getId() + " with Network ACL Id: " + acl.getId() + ", Applying ACL items");
             //Apply ACL to network
-            return applyACLToNetwork(network.getId());
+            Boolean result = applyACLToNetwork(network.getId());
+            if (result) {
+                // public message on message bus, so that network elements implementing distributed routing capability
+                // can act on the event
+                _messageBus.publish(_name, "Network_ACL_Replaced", PublishScope.LOCAL, network);
+            }
+            return result;
         }
         return false;
     }


[53/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
couple of bug fixes


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/7b0677a2
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/7b0677a2
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/7b0677a2

Branch: refs/heads/distributedrouter
Commit: 7b0677a2c2ab0c78fb2e507dbf4858dcb3f09ec0
Parents: 07c85d5
Author: Murali Reddy <mu...@gmail.com>
Authored: Thu Mar 13 19:18:41 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:59:04 2014 +0530

----------------------------------------------------------------------
 .../schema/src/com/cloud/network/vpc/VpcVO.java |   1 +
 .../xen/resource/CitrixResourceBase.java        |  12 +-
 .../network/ovs/OvsNetworkTopologyGuru.java     |   5 +
 .../network/ovs/OvsNetworkTopologyGuruImpl.java |  18 ++
 .../cloud/network/ovs/OvsTunnelManagerImpl.java | 251 ++++++++++++-------
 .../xenserver/cloudstack_pluginlib.py           |  26 +-
 .../vm/hypervisor/xenserver/ovs-vif-flows.py    |  27 +-
 7 files changed, 223 insertions(+), 117 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/engine/schema/src/com/cloud/network/vpc/VpcVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/VpcVO.java b/engine/schema/src/com/cloud/network/vpc/VpcVO.java
index d7aaa95..dea8c31 100644
--- a/engine/schema/src/com/cloud/network/vpc/VpcVO.java
+++ b/engine/schema/src/com/cloud/network/vpc/VpcVO.java
@@ -206,6 +206,7 @@ public class VpcVO implements Vpc {
     @Override
     public IAMEntityType getEntityType() {
         return IAMEntityType.Vpc;
+    }
 
     @Override
     public boolean usesDistributedRouter() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 273c08c..57debc6 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -5284,15 +5284,17 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
     public Answer execute(OvsVpcPhysicalTopologyConfigCommand cmd) {
         Connection conn = getConnection();
         try {
+            Network nw = findOrCreateTunnelNetwork(conn, cmd.getBridgeName());
+            String bridgeName = nw.getBridge(conn);;
             String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge",
-                    cmd.getBridgeName(), "config", cmd.getVpcConfigInJson());
-            if (result.equalsIgnoreCase("SUCCESS")) {
+                    bridgeName, "config", cmd.getVpcConfigInJson(), "host-id", ((Long)cmd.getHostId()).toString());
+                if (result.startsWith("SUCCESS")) {
                 return new Answer(cmd, true, result);
             } else {
                 return new Answer(cmd, false, result);
             }
         } catch  (Exception e) {
-            s_logger.warn("caught exception while updating host with latest routing polcies", e);
+            s_logger.warn("caught exception while updating host with latest VPC topology", e);
             return new Answer(cmd, false, e.getMessage());
         }
     }
@@ -5303,13 +5305,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_routing_policies", "bridge",
                     cmd.getBridgeName(), "host-id", ((Long)cmd.getHostId()).toString(), "config",
                     cmd.getVpcConfigInJson());
-            if (result.equalsIgnoreCase("SUCCESS")) {
+            if (result.startsWith("SUCCESS")) {
                 return new Answer(cmd, true, result);
             } else {
                 return new Answer(cmd, false, result);
             }
         } catch  (Exception e) {
-            s_logger.warn("caught exception while updating host with latest VPC topology", e);
+            s_logger.warn("caught exception while updating host with latest routing policies", e);
             return new Answer(cmd, false, e.getMessage());
         }
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
index 122175c..a9b62bf 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
@@ -56,4 +56,9 @@ public interface OvsNetworkTopologyGuru extends Manager {
      * get the list of all Vm id's in the network that are running on the host
      */
     public List<Long> getActiveVmsInNetworkOnHost(long vpcId, long hostId);
+
+    /**
+     * get the list of all Vpc id's in which, a VM has a nic in the network that is part of VPC
+     */
+    public List<Long> getVpcIdsVmIsPartOf(long vmId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
index 7715641..740df80 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
@@ -187,4 +187,22 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
         }
         return  vmIds;
     }
+
+    @Override
+    public List<Long> getVpcIdsVmIsPartOf(long vmId) {
+        List<Long> vpcIds = new ArrayList<>();
+        List<NicVO> nics = _nicDao.listByVmId(vmId);
+        if (nics == null)
+            return null;
+
+        for (Nic nic: nics) {
+            Network network = _networkDao.findById(nic.getNetworkId());
+            if (network != null && network.getTrafficType() == Networks.TrafficType.Guest && network.getVpcId() != null) {
+                if (!vpcIds.contains(network.getVpcId())) {
+                    vpcIds.add(network.getVpcId());
+                }
+            }
+        }
+        return  vpcIds;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
index eeb22b1..30088aa 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
@@ -36,6 +36,7 @@ import com.cloud.network.vpc.dao.VpcDao;
 import com.cloud.network.vpc.VpcManager;
 import com.cloud.network.vpc.VpcVO;
 import com.cloud.network.vpc.dao.NetworkACLDao;
+import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.dao.VMInstanceDao;
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicVO;
@@ -80,13 +81,14 @@ import com.cloud.network.ovs.dao.OvsTunnel;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
+import com.cloud.utils.fsm.StateListener;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.NicDao;
 
 @Component
 @Local(value = {OvsTunnelManager.class})
-public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManager {
+public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManager, StateListener<VirtualMachine.State, VirtualMachine.Event, VirtualMachine> {
     public static final Logger s_logger = Logger.getLogger(OvsTunnelManagerImpl.class.getName());
 
     // boolean _isEnabled;
@@ -133,7 +135,12 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
         _executorPool = Executors.newScheduledThreadPool(10, new NamedThreadFactory("OVS"));
         _cleanupExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("OVS-Cleanup"));
 
+        // register for network ACL updated for a VPC.
         _messageBus.subscribe("Network_ACL_Replaced", new NetworkAclEventsSubscriber());
+
+        // register for VM state transition updates
+        VirtualMachine.State.getStateMachine().registerListener(this);
+
         return true;
     }
 
@@ -540,92 +547,6 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
         return "OVS-DR-VPC-Bridge" + vpcId;
     }
 
-    public boolean sendVpcTopologyChangeUpdate(OvsVpcPhysicalTopologyConfigCommand updateCmd, long hostId, String bridgeName) {
-        try {
-            s_logger.debug("Sending VPC topology update to the host " + hostId);
-            updateCmd.setHostId(hostId);
-            updateCmd.setBridgeName(bridgeName);
-            Answer ans = _agentMgr.send(hostId, updateCmd);
-            if (ans.getResult()) {
-                s_logger.debug("Successfully updated the host " + hostId + " with latest VPC topology." );
-                return true;
-            }  else {
-                s_logger.debug("Failed to update the host " + hostId + " with latest VPC topology." );
-                return false;
-            }
-        } catch (Exception e) {
-            s_logger.debug("Failed to updated the host " + hostId + " with latest VPC topology." );
-            return false;
-        }
-    }
-
-    OvsVpcPhysicalTopologyConfigCommand prepareVpcTopologyUpdate(long vpcId) {
-        VpcVO vpc = _vpcDao.findById(vpcId);
-        assert (vpc != null): "invalid vpc id";
-
-        List<? extends Network> vpcNetworks =  _vpcMgr.getVpcNetworks(vpcId);
-        List<Long> hostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
-        List<Long> vmIds = _ovsNetworkToplogyGuru.getAllActiveVmsInVpc(vpcId);
-
-        List<OvsVpcPhysicalTopologyConfigCommand.Host> hosts = new ArrayList<>();
-        List<OvsVpcPhysicalTopologyConfigCommand.Tier> tiers = new ArrayList<>();
-        List<OvsVpcPhysicalTopologyConfigCommand.Vm> vms = new ArrayList<>();
-
-        for (Long hostId : hostIds) {
-            HostVO hostDetails = _hostDao.findById(hostId);
-            String remoteIp = null;
-            for (Network network: vpcNetworks) {
-                try {
-                    remoteIp = getGreEndpointIP(hostDetails, network);
-                } catch (Exception e) {
-
-                }
-            }
-            OvsVpcPhysicalTopologyConfigCommand.Host host = new OvsVpcPhysicalTopologyConfigCommand.Host(hostId, remoteIp);
-            hosts.add(host);
-        }
-
-        for (Network network: vpcNetworks) {
-            String key = network.getBroadcastUri().getAuthority();
-            long gre_key;
-            if (key.contains(".")) {
-                String[] parts = key.split("\\.");
-                gre_key = Long.parseLong(parts[1]);
-            } else {
-                try {
-                    gre_key = Long.parseLong(BroadcastDomainType.getValue(key));
-                } catch (Exception e) {
-                    return null;
-                }
-            }
-            NicVO nic = _nicDao.findByIp4AddressAndNetworkId(network.getGateway(), network.getId());
-            OvsVpcPhysicalTopologyConfigCommand.Tier tier = new OvsVpcPhysicalTopologyConfigCommand.Tier(gre_key,
-                    network.getUuid(), network.getGateway(), nic.getMacAddress(), network.getCidr());
-            tiers.add(tier);
-        }
-
-        for (long vmId: vmIds) {
-            VirtualMachine vmInstance = _vmInstanceDao.findById(vmId);
-            List<OvsVpcPhysicalTopologyConfigCommand.Nic>  vmNics = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Nic>();
-            for (Nic vmNic :_nicDao.listByVmId(vmId)) {
-                Network network = _networkDao.findById(vmNic.getNetworkId());
-                if (network.getTrafficType() == TrafficType.Guest) {
-                    OvsVpcPhysicalTopologyConfigCommand.Nic nic =  new OvsVpcPhysicalTopologyConfigCommand.Nic(
-                            vmNic.getIp4Address(), vmNic.getMacAddress(), ((Long)vmNic.getNetworkId()).toString());
-                    vmNics.add(nic);
-                }
-            }
-            OvsVpcPhysicalTopologyConfigCommand.Vm vm = new OvsVpcPhysicalTopologyConfigCommand.Vm(
-                    vmInstance.getHostId(), vmNics.toArray(new OvsVpcPhysicalTopologyConfigCommand.Nic[vmNics.size()]));
-            vms.add(vm);
-        }
-        return new OvsVpcPhysicalTopologyConfigCommand(
-                hosts.toArray(new OvsVpcPhysicalTopologyConfigCommand.Host[hosts.size()]),
-                tiers.toArray(new OvsVpcPhysicalTopologyConfigCommand.Tier[tiers.size()]),
-                vms.toArray(new OvsVpcPhysicalTopologyConfigCommand.Vm[vms.size()]),
-                vpc.getCidr());
-    }
-
     @DB
     protected void checkAndCreateVpcTunnelNetworks(Host host, long vpcId) {
 
@@ -731,16 +652,158 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                 s_logger.warn("Ovs Tunnel network created tunnel failed", e);
             }
         }
+    }
+
+    @Override
+    public boolean preStateTransitionEvent(VirtualMachine.State oldState,
+                                           VirtualMachine.Event event, VirtualMachine.State newState,
+                                           VirtualMachine vo, boolean status, Object opaque) {
+        return true;
+    }
+
+    @Override
+    public boolean postStateTransitionEvent(VirtualMachine.State oldState, VirtualMachine.Event event,
+                                            VirtualMachine.State newState, VirtualMachine vm,
+                                            boolean status, Object opaque) {
+
+        if (!status) {
+            return false;
+        }
+
+        if (VirtualMachine.State.isVmStarted(oldState, event, newState)) {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("Security Group Mgr: handling start of vm id" + vm.getId());
+            }
+            handleVmStateChange((VMInstanceVO)vm);
+        } else if (VirtualMachine.State.isVmStopped(oldState, event, newState)) {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("Security Group Mgr: handling stop of vm id" + vm.getId());
+            }
+            handleVmStateChange((VMInstanceVO)vm);
+        } else if (VirtualMachine.State.isVmMigrated(oldState, event, newState)) {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("Security Group Mgr: handling migration of vm id" + vm.getId());
+            }
+            handleVmStateChange((VMInstanceVO)vm);
+        }
+
+        return true;
+    }
+
+    public void handleVmStateChange(VMInstanceVO vm) {
+
+        // get the VPC's impacted with the VM start
+        List<Long> vpcIds = _ovsNetworkToplogyGuru.getVpcIdsVmIsPartOf(vm.getId());
+        if (vpcIds == null || vpcIds.isEmpty()) {
+            return;
+        }
+
+        for (Long vpcId: vpcIds) {
+            VpcVO vpc = _vpcDao.findById(vpcId);
+            if (vpc == null || !vpc.usesDistributedRouter()) {
+                return;
+            }
+
+            // get the list of hosts on which VPC spans (i.e hosts that need to be aware of VPC topology change update)
+            List<Long> vpcSpannedHostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
+            String bridgeName=generateBridgeNameForVpc(vpcId);
 
-        OvsVpcPhysicalTopologyConfigCommand topologyConfigCommand = prepareVpcTopologyUpdate(vpcId);
-        for (Long id: vpcSpannedHostIds) {
-            if (!sendVpcTopologyChangeUpdate(topologyConfigCommand, id, bridgeName)) {
-                s_logger.debug("Failed to send VPC topology change update to host : " + id + ". Moving on with rest of" +
-                        "the host update.");
+            OvsVpcPhysicalTopologyConfigCommand topologyConfigCommand = prepareVpcTopologyUpdate(vpcId);
+            for (Long id: vpcSpannedHostIds) {
+                if (!sendVpcTopologyChangeUpdate(topologyConfigCommand, id, bridgeName)) {
+                    s_logger.debug("Failed to send VPC topology change update to host : " + id + ". Moving on " +
+                            "with rest of the host update.");
+                }
+            }
+        }
+    }
+
+    public boolean sendVpcTopologyChangeUpdate(OvsVpcPhysicalTopologyConfigCommand updateCmd, long hostId, String bridgeName) {
+        try {
+            s_logger.debug("Sending VPC topology update to the host " + hostId);
+            updateCmd.setHostId(hostId);
+            updateCmd.setBridgeName(bridgeName);
+            Answer ans = _agentMgr.send(hostId, updateCmd);
+            if (ans.getResult()) {
+                s_logger.debug("Successfully updated the host " + hostId + " with latest VPC topology." );
+                return true;
+            }  else {
+                s_logger.debug("Failed to update the host " + hostId + " with latest VPC topology." );
+                return false;
             }
+        } catch (Exception e) {
+            s_logger.debug("Failed to updated the host " + hostId + " with latest VPC topology." );
+            return false;
         }
     }
 
+    OvsVpcPhysicalTopologyConfigCommand prepareVpcTopologyUpdate(long vpcId) {
+        VpcVO vpc = _vpcDao.findById(vpcId);
+        assert (vpc != null): "invalid vpc id";
+
+        List<? extends Network> vpcNetworks =  _vpcMgr.getVpcNetworks(vpcId);
+        List<Long> hostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
+        List<Long> vmIds = _ovsNetworkToplogyGuru.getAllActiveVmsInVpc(vpcId);
+
+        List<OvsVpcPhysicalTopologyConfigCommand.Host> hosts = new ArrayList<>();
+        List<OvsVpcPhysicalTopologyConfigCommand.Tier> tiers = new ArrayList<>();
+        List<OvsVpcPhysicalTopologyConfigCommand.Vm> vms = new ArrayList<>();
+
+        for (Long hostId : hostIds) {
+            HostVO hostDetails = _hostDao.findById(hostId);
+            String remoteIp = null;
+            for (Network network: vpcNetworks) {
+                try {
+                    remoteIp = getGreEndpointIP(hostDetails, network);
+                } catch (Exception e) {
+
+                }
+            }
+            OvsVpcPhysicalTopologyConfigCommand.Host host = new OvsVpcPhysicalTopologyConfigCommand.Host(hostId, remoteIp);
+            hosts.add(host);
+        }
+
+        for (Network network: vpcNetworks) {
+            String key = network.getBroadcastUri().getAuthority();
+            long gre_key;
+            if (key.contains(".")) {
+                String[] parts = key.split("\\.");
+                gre_key = Long.parseLong(parts[1]);
+            } else {
+                try {
+                    gre_key = Long.parseLong(BroadcastDomainType.getValue(key));
+                } catch (Exception e) {
+                    return null;
+                }
+            }
+            NicVO nic = _nicDao.findByIp4AddressAndNetworkId(network.getGateway(), network.getId());
+            OvsVpcPhysicalTopologyConfigCommand.Tier tier = new OvsVpcPhysicalTopologyConfigCommand.Tier(gre_key,
+                    network.getUuid(), network.getGateway(), nic.getMacAddress(), network.getCidr());
+            tiers.add(tier);
+        }
+
+        for (long vmId: vmIds) {
+            VirtualMachine vmInstance = _vmInstanceDao.findById(vmId);
+            List<OvsVpcPhysicalTopologyConfigCommand.Nic>  vmNics = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Nic>();
+            for (Nic vmNic :_nicDao.listByVmId(vmId)) {
+                Network network = _networkDao.findById(vmNic.getNetworkId());
+                if (network.getTrafficType() == TrafficType.Guest) {
+                    OvsVpcPhysicalTopologyConfigCommand.Nic nic =  new OvsVpcPhysicalTopologyConfigCommand.Nic(
+                            vmNic.getIp4Address(), vmNic.getMacAddress(), network.getUuid());
+                    vmNics.add(nic);
+                }
+            }
+            OvsVpcPhysicalTopologyConfigCommand.Vm vm = new OvsVpcPhysicalTopologyConfigCommand.Vm(
+                    vmInstance.getHostId(), vmNics.toArray(new OvsVpcPhysicalTopologyConfigCommand.Nic[vmNics.size()]));
+            vms.add(vm);
+        }
+        return new OvsVpcPhysicalTopologyConfigCommand(
+                hosts.toArray(new OvsVpcPhysicalTopologyConfigCommand.Host[hosts.size()]),
+                tiers.toArray(new OvsVpcPhysicalTopologyConfigCommand.Tier[tiers.size()]),
+                vms.toArray(new OvsVpcPhysicalTopologyConfigCommand.Vm[vms.size()]),
+                vpc.getCidr());
+    }
+
     // Subscriber to ACL replace events. On acl replace event, if the vpc is enabled for distributed routing
     // send the ACL update to all the hosts on which VPC spans
     public class NetworkAclEventsSubscriber implements MessageSubscriber {
@@ -755,14 +818,14 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                 for (Long id: vpcSpannedHostIds) {
                     if (!sendVpcRoutingPolicyChangeUpdate(cmd, id, bridgeName)) {
                         s_logger.debug("Failed to send VPC routing policy change update to host : " + id +
-                                ". Moving on with rest of the host updates.");
+                                ". But moving on with sending the host updates to the rest of the hosts.");
                     }
                 }
             }
         }
     }
 
-    OvsVpcRoutingPolicyConfigCommand prepareVpcRoutingPolicyUpdate(long vpcId) {
+    private OvsVpcRoutingPolicyConfigCommand prepareVpcRoutingPolicyUpdate(long vpcId) {
         VpcVO vpc = _vpcDao.findById(vpcId);
         assert (vpc != null): "invalid vpc id";
         List<OvsVpcRoutingPolicyConfigCommand.Acl> acls = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
index ac8a11d..1c9d513 100644
--- a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
+++ b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
@@ -239,7 +239,7 @@ def clear_flooding_rules_for_port(bridge, ofport):
 
 def add_flooding_rules_for_port(bridge, in_ofport, out_ofports):
         action = "".join("output:%s," %ofport for ofport in out_ofports)[:-1]
-        add_flow(bridge, priority=1100, in_port=in_ofport, table=1, actions=action)
+        add_flow(bridge, priority=1100, in_port=in_ofport, table=2, actions=action)
 
 def get_ofport_for_vif(vif_name):
     return do_cmd([VSCTL_PATH, "get", "interface", vif_name, "ofport"])
@@ -259,28 +259,30 @@ def get_vif_name_from_macaddress(macaddress):
     return "vif"+vm_domain_id+"."+vif_device_id
 
 def add_mac_lookup_table_entry(bridge, mac_address, out_of_port):
-    add_flow(bridge, priority=1100, dl_dst=mac_address, table=1, actions="output:%s" % out_of_port)
+    action = "output=%s" %out_of_port
+    add_flow(bridge, priority=1100, dl_dst=mac_address, table=1, actions=action)
 
 def delete_mac_lookup_table_entry(bridge, mac_address):
     del_flows(bridge, dl_dst=mac_address, table=1)
 
 def add_ip_lookup_table_entry(bridge, ip, dst_tier_gateway_mac, dst_vm_mac):
-    action_str = "mod_dl_sr:%s" % dst_tier_gateway_mac + ",mod_dl_dst:%s" % dst_vm_mac +",resubmit(,5)"
-    addflow = [OFCTL_PATH, "add-flow", bridge, "table=4", "nw_dst=%s" % ip, "actions=%s" %action_str]
+    action_str = "mod_dl_src:%s" % dst_tier_gateway_mac + ",mod_dl_dst:%s" % dst_vm_mac + ",resubmit(,5)"
+    action_str = "table=4, ip, nw_dst=%s" % ip + ",  actions=%s" %action_str
+    addflow = [OFCTL_PATH, "add-flow", bridge, action_str]
     do_cmd(addflow)
 
 def get_vms_on_host(vpc, host_id):
     all_vms = vpc.vms
     vms_on_host = []
     for vm in all_vms:
-      if vm.hostid == host_id:
+      if str(vm.hostid) == (host_id):
         vms_on_host.append(vm)
     return vms_on_host
 
 def get_network_details(vpc, network_uuid):
     tiers = vpc.tiers
     for tier in tiers:
-      if tier.networkuuid == network_uuid:
+      if str(tier.networkuuid) == (network_uuid):
         return tier
     return None
 
@@ -338,20 +340,22 @@ def configure_bridge_for_network_topology(bridge, this_host_id, json_config):
             add_ip_lookup_table_entry(bridge, ip, network.gatewaymac, mac_addr)
 
             # Add flow entry to send with intra tier traffic from the NIC to L2 lookup path)
-            addflow = [OFCTL_PATH, "add-flow", bridge, "table=0", "in_port=%s" % of_port,
-                       "nw_dst=%s" %network.cidr, "actions=resubmit(,1)"]
+            action_str = "table=0, in_port=%s," %of_port + " ip, nw_dst=%s," %network.cidr + " actions=resubmit(,1)"
+            addflow = [OFCTL_PATH, "add-flow", bridge, action_str]
             do_cmd(addflow)
 
             #add flow entry to send inter-tier traffic from the NIC to egress ACL table(to L3 lookup path)
-            addflow = [OFCTL_PATH, "add-flow", bridge, "table=0", "in_port=%s" % of_port,
-                       "dl_dst=%s" %network.gatewaymac, "nw_dst=%s" %vpconfig.cidr, "actions=resubmit(,3)"]
+            action_str = "table=0, in_port=%s," % of_port + " ip, dl_dst=%s," %network.gatewaymac +\
+                         "nw_dst=%s," %vpconfig.cidr + "actions=resubmit(,3)"
+            addflow = [OFCTL_PATH, "add-flow", bridge, action_str]
+
             do_cmd(addflow)
 
     # get the list of hosts on which VPC spans from the JSON config
     vpc_spanning_hosts = vpconfig.hosts
 
     for host in vpc_spanning_hosts:
-        if this_host_id == host.hostid:
+        if str(this_host_id) == str(host.hostid):
             continue
         other_host_vms = get_vms_on_host(vpconfig, host.hostid)
         for vm in other_host_vms:

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b0677a2/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py b/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
index ae37525..1445d94 100644
--- a/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
+++ b/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py
@@ -21,9 +21,11 @@
 import copy
 import os
 import sys
+import logging
 
 import cloudstack_pluginlib as pluginlib
 
+pluginlib.setup_logging("/var/log/cloud/ovstunnel.log")
 
 def clear_flows(bridge, this_vif_ofport, vif_ofports):
     # Remove flow entries originating from given ofport
@@ -83,18 +85,26 @@ def main(command, vif_raw):
 
     bridge = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'iface-to-br', this_vif])
     
-	# find xs network for this bridge, verify is used for ovs tunnel network
+    # find xs network for this bridge, verify is used for ovs tunnel network
     xs_nw_uuid = pluginlib.do_cmd([pluginlib.XE_PATH, "network-list",
 								   "bridge=%s" % bridge, "--minimal"])
-    ovs_tunnel_network = pluginlib.do_cmd([pluginlib.XE_PATH,"network-param-get",
+    ovs_tunnel_network = False
+    try:
+        ovs_tunnel_network = pluginlib.do_cmd([pluginlib.XE_PATH,"network-param-get",
 						       "uuid=%s" % xs_nw_uuid,
 						       "param-name=other-config",
 						       "param-key=is-ovs-tun-network", "--minimal"])
+    except:
+        pass
 
-    ovs_vpc_distributed_vr_network = pluginlib.do_cmd([pluginlib.XE_PATH,"network-param-get",
+    ovs_vpc_distributed_vr_network = False
+    try:
+        ovs_vpc_distributed_vr_network = pluginlib.do_cmd([pluginlib.XE_PATH,"network-param-get",
 						       "uuid=%s" % xs_nw_uuid,
 						       "param-name=other-config",
 						       "param-key=is-ovs_vpc_distributed_vr_network", "--minimal"])
+    except:
+        pass
 
     if ovs_tunnel_network == 'True':
         vlan = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'br-to-vlan', bridge])
@@ -121,6 +131,7 @@ def main(command, vif_raw):
             apply_flows(bridge,  this_vif_ofport, vif_ofports)
 
 
+    # handle case where brdige is setup for VPC and VPC is enabled for distributed routing
     if ovs_vpc_distributed_vr_network == 'True':
         vlan = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'br-to-vlan', bridge])
         if vlan != '0':
@@ -136,15 +147,15 @@ def main(command, vif_raw):
 
         ports = vsctl_output.split('\n')
         for port in ports:
-            if_ofport = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'get', 'Interface', vif, 'ofport'])
-            if vif.startswith('vif'):
+            if_ofport = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'get', 'Interface', port, 'ofport'])
+            if port.startswith('vif'):
                 # check VIF is in same network as that of plugged vif
                 if vif_network_id != pluginlib.get_network_id_for_vif(port):
                     continue
                 vnet_vif_ofports.append(if_ofport)
                 vnet_all_ofports.append(if_ofport)
 
-            if vif.startswith('t'):
+            if port.startswith('t'):
                 # check tunnel port is in same network as that of plugged vif
                 if vif_network_id != pluginlib.get_network_id_for_tunnel_port(port):
                     continue
@@ -159,7 +170,8 @@ def main(command, vif_raw):
             for port in vnet_tunnelif_ofports:
                 pluginlib.add_flooding_rules_for_port(bridge, port, vnet_vif_ofports)
 
-            # send on all VIF and tunnel port excluding the port on which packet arrived
+            # for a packet arrived from VIF port send on all VIF and tunnel port excluding the port
+            # on which packet arrived
             for port in vnet_vif_ofports:
                 vnet_all_ofports_copy = copy.copy(vnet_all_ofports)
                 vnet_all_ofports_copy.remove(port)
@@ -167,6 +179,7 @@ def main(command, vif_raw):
 
             #learn that MAC is reachable through the VIF port
             mac = pluginlib.get_macaddress_of_vif(this_vif)
+            this_vif_ofport = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'get', 'Interface', this_vif, 'ofport'])
             pluginlib.add_mac_lookup_table_entry(bridge, mac, this_vif_ofport)
 
         if command == 'offline':


[22/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Merge branch 'master' into rbac


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/84a528fa
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/84a528fa
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/84a528fa

Branch: refs/heads/distributedrouter
Commit: 84a528fad6979ed6745ad9eb9806d6b9a9fdb0f4
Parents: fa80c63 90c485e
Author: Min Chen <mi...@citrix.com>
Authored: Thu Mar 13 14:52:37 2014 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Thu Mar 13 14:52:37 2014 -0700

----------------------------------------------------------------------
 api/src/com/cloud/domain/Domain.java            |   3 -
 .../org/apache/cloudstack/api/ApiConstants.java |   2 +-
 .../org/apache/cloudstack/api/BaseListCmd.java  |   2 +-
 .../api/command/user/vm/DeployVMCmd.java        |   7 +
 .../api/command/user/vm/StartVMCmd.java         |  11 +-
 .../src/com/cloud/vm/VirtualMachineManager.java |   2 +-
 .../cloud/entity/api/VirtualMachineEntity.java  |   3 +-
 .../cloud/deploy/DeploymentPlanningManager.java |   4 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java |  20 +-
 .../src/com/cloud/vm/VmWorkStart.java           |  12 +-
 .../cloud/entity/api/VMEntityManager.java       |   3 +-
 .../cloud/entity/api/VMEntityManagerImpl.java   |  19 +-
 .../entity/api/VirtualMachineEntityImpl.java    |   4 +-
 .../security/dao/VmRulesetLogDaoImpl.java       |   2 +-
 .../src/com/cloud/projects/ProjectVO.java       |   5 +
 .../cloud/entity/api/db/VMReservationVO.java    |  11 +
 .../jobs/impl/JobSerializerHelper.java          |   5 +-
 .../mom/rabbitmq/RabbitMQEventBus.java          |  18 +-
 .../lb/InternalLoadBalancerVMManagerImpl.java   |   2 +-
 .../allocator/impl/FirstFitAllocator.java       |  29 +--
 .../dispatch/ParamGenericValidationWorker.java  |   3 +
 .../src/com/cloud/dc/DedicatedResourceVO.java   |   7 +
 .../deploy/DeploymentPlanningManagerImpl.java   |  31 ++-
 .../src/com/cloud/deploy/FirstFitPlanner.java   |   3 +-
 .../com/cloud/network/IpAddressManagerImpl.java |   4 +-
 .../cloud/network/as/AutoScaleManagerImpl.java  |   4 +-
 .../com/cloud/server/ManagementServerImpl.java  | 217 +------------------
 server/src/com/cloud/vm/UserVmManager.java      |   2 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java  |  35 ++-
 .../ParamGenericValidationWorkerTest.java       |  24 ++
 setup/db/db/schema-430to440.sql                 |   2 +
 31 files changed, 175 insertions(+), 321 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/api/src/org/apache/cloudstack/api/ApiConstants.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
index 4e91c7b,f55aa59..13b7442
--- a/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
@@@ -16,18 -16,13 +16,19 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vm;
  
- import org.apache.cloudstack.api.BaseAsyncVMCmd;
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
+ import org.apache.cloudstack.api.BaseAsyncVMCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.HostResponse;
  import org.apache.cloudstack.api.response.UserVmResponse;
@@@ -70,6 -68,6 +74,7 @@@ public class StartVMCmd extends BaseAsy
      // ///////////////// Accessors ///////////////////////
      // ///////////////////////////////////////////////////
  
++    @Override
      public Long getId() {
          return id;
      }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
index c1f336c,5312e15..9cbbb10
--- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
+++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
@@@ -1,57 -1,56 +1,56 @@@
 -// Licensed to the Apache Software Foundation (ASF) under one
 -// or more contributor license agreements.  See the NOTICE file
 -// distributed with this work for additional information
 -// regarding copyright ownership.  The ASF licenses this file
 -// to you under the Apache License, Version 2.0 (the
 -// "License"); you may not use this file except in compliance
 -// with the License.  You may obtain a copy of the License at
 -//
 -//   http://www.apache.org/licenses/LICENSE-2.0
 -//
 -// Unless required by applicable law or agreed to in writing,
 -// software distributed under the License is distributed on an
 -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 -// KIND, either express or implied.  See the License for the
 -// specific language governing permissions and limitations
 -// under the License.
 -package com.cloud.deploy;
 -
 -import java.util.ArrayList;
 +// Licensed to the Apache Software Foundation (ASF) under one
 +// or more contributor license agreements.  See the NOTICE file
 +// distributed with this work for additional information
 +// regarding copyright ownership.  The ASF licenses this file
 +// to you under the Apache License, Version 2.0 (the
 +// "License"); you may not use this file except in compliance
 +// with the License.  You may obtain a copy of the License at
 +//
 +//   http://www.apache.org/licenses/LICENSE-2.0
 +//
 +// Unless required by applicable law or agreed to in writing,
 +// software distributed under the License is distributed on an
 +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 +// KIND, either express or implied.  See the License for the
 +// specific language governing permissions and limitations
 +// under the License.
 +package com.cloud.deploy;
 +
 +import java.util.ArrayList;
  import java.util.Arrays;
 -import java.util.Comparator;
 -import java.util.HashMap;
 +import java.util.Comparator;
 +import java.util.HashMap;
  import java.util.HashSet;
 -import java.util.List;
 -import java.util.Map;
 +import java.util.List;
 +import java.util.Map;
  import java.util.Set;
 -import java.util.Timer;
 -import java.util.TreeSet;
 -
 -import javax.ejb.Local;
 -import javax.inject.Inject;
 -import javax.naming.ConfigurationException;
 -
 -import org.apache.cloudstack.affinity.AffinityGroupProcessor;
 -import org.apache.cloudstack.affinity.AffinityGroupService;
 +import java.util.Timer;
 +import java.util.TreeSet;
 +
 +import javax.ejb.Local;
 +import javax.inject.Inject;
 +import javax.naming.ConfigurationException;
 +
- import org.apache.log4j.Logger;
- 
 +import org.apache.cloudstack.affinity.AffinityGroupProcessor;
 +import org.apache.cloudstack.affinity.AffinityGroupService;
  import org.apache.cloudstack.affinity.AffinityGroupVMMapVO;
 -import org.apache.cloudstack.affinity.AffinityGroupVO;
 -import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
 -import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
 -import org.apache.cloudstack.engine.cloud.entity.api.db.VMReservationVO;
 -import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMReservationDao;
 -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 -import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
 -import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 -import org.apache.cloudstack.framework.messagebus.MessageBus;
 -import org.apache.cloudstack.framework.messagebus.MessageSubscriber;
 -import org.apache.cloudstack.managed.context.ManagedContextTimerTask;
 -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 -import org.apache.cloudstack.utils.identity.ManagementServerNode;
 +import org.apache.cloudstack.affinity.AffinityGroupVO;
 +import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
 +import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
 +import org.apache.cloudstack.engine.cloud.entity.api.db.VMReservationVO;
 +import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMReservationDao;
 +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 +import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
 +import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 +import org.apache.cloudstack.framework.messagebus.MessageBus;
 +import org.apache.cloudstack.framework.messagebus.MessageSubscriber;
 +import org.apache.cloudstack.managed.context.ManagedContextTimerTask;
 +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 +import org.apache.cloudstack.utils.identity.ManagementServerNode;
+ import org.apache.log4j.Logger;
 -
 +
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.Listener;
  import com.cloud.agent.api.AgentControlAnswer;
@@@ -230,99 -229,94 +229,94 @@@ public class DeploymentPlanningManagerI
  
      public void setPlanners(List<DeploymentPlanner> planners) {
          _planners = planners;
 -    }
 +    }
 +
 +    protected List<AffinityGroupProcessor> _affinityProcessors;
  
 -    protected List<AffinityGroupProcessor> _affinityProcessors;
 +    public List<AffinityGroupProcessor> getAffinityGroupProcessors() {
 +        return _affinityProcessors;
 +    }
  
 -    public List<AffinityGroupProcessor> getAffinityGroupProcessors() {
 -        return _affinityProcessors;
 -    }
 -
 -    public void setAffinityGroupProcessors(List<AffinityGroupProcessor> affinityProcessors) {
 +    public void setAffinityGroupProcessors(List<AffinityGroupProcessor> affinityProcessors) {
          _affinityProcessors = affinityProcessors;
 -    }
 -
 -    @Override
 +    }
 +
 +    @Override
      public DeployDestination planDeployment(VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids, DeploymentPlanner planner)
              throws InsufficientServerCapacityException, AffinityConflictException {
 -
 -        // call affinitygroup chain
 -        VirtualMachine vm = vmProfile.getVirtualMachine();
 -        long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId());
 +
 +        // call affinitygroup chain
 +        VirtualMachine vm = vmProfile.getVirtualMachine();
 +        long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId());
          DataCenter dc = _dcDao.findById(vm.getDataCenterId());
 -
 -        if (vmGroupCount > 0) {
 -            for (AffinityGroupProcessor processor : _affinityProcessors) {
 -                processor.process(vmProfile, plan, avoids);
 -            }
 +
 +        if (vmGroupCount > 0) {
 +            for (AffinityGroupProcessor processor : _affinityProcessors) {
 +                processor.process(vmProfile, plan, avoids);
 +            }
 +        }
 +
 +        if (vm.getType() == VirtualMachine.Type.User) {
 +            checkForNonDedicatedResources(vmProfile, dc, avoids);
          }
 -
 -        if (vm.getType() == VirtualMachine.Type.User) {
 -            checkForNonDedicatedResources(vmProfile, dc, avoids);
 -        }
 -        if (s_logger.isDebugEnabled()) {
 +        if (s_logger.isDebugEnabled()) {
              s_logger.debug("Deploy avoids pods: " + avoids.getPodsToAvoid() + ", clusters: " + avoids.getClustersToAvoid() + ", hosts: " + avoids.getHostsToAvoid());
 -        }
 -
 -        // call planners
 +        }
 +
 +        // call planners
          //DataCenter dc = _dcDao.findById(vm.getDataCenterId());
 -        // check if datacenter is in avoid set
 -        if (avoids.shouldAvoid(dc)) {
 -            if (s_logger.isDebugEnabled()) {
 +        // check if datacenter is in avoid set
 +        if (avoids.shouldAvoid(dc)) {
 +            if (s_logger.isDebugEnabled()) {
                  s_logger.debug("DataCenter id = '" + dc.getId() + "' provided is in avoid set, DeploymentPlanner cannot allocate the VM, returning.");
 -            }
 -            return null;
 -        }
 -
 -        ServiceOffering offering = vmProfile.getServiceOffering();
 +            }
 +            return null;
 +        }
 +
 +        ServiceOffering offering = vmProfile.getServiceOffering();
          if(planner == null){
 -            String plannerName = offering.getDeploymentPlanner();
 -            if (plannerName == null) {
 -                if (vm.getHypervisorType() == HypervisorType.BareMetal) {
 -                    plannerName = "BareMetalPlanner";
 -                } else {
 -                    plannerName = _configDao.getValue(Config.VmDeploymentPlanner.key());
 -                }
 -            }
 +        String plannerName = offering.getDeploymentPlanner();
 +        if (plannerName == null) {
 +            if (vm.getHypervisorType() == HypervisorType.BareMetal) {
 +                plannerName = "BareMetalPlanner";
 +            } else {
 +                plannerName = _configDao.getValue(Config.VmDeploymentPlanner.key());
 +            }
 +        }
-         for (DeploymentPlanner plannerInList : _planners) {
-             if (plannerName.equals(plannerInList.getName())) {
-                 planner = plannerInList;
-                 break;
-             }
-         }
+             planner = getDeploymentPlannerByName(plannerName);
          }
 -
 -        int cpu_requested = offering.getCpu() * offering.getSpeed();
 -        long ram_requested = offering.getRamSize() * 1024L * 1024L;
 -
 -        if (s_logger.isDebugEnabled()) {
 -            s_logger.debug("DeploymentPlanner allocation algorithm: " + planner);
 -
 +
 +        int cpu_requested = offering.getCpu() * offering.getSpeed();
 +        long ram_requested = offering.getRamSize() * 1024L * 1024L;
 +
 +        if (s_logger.isDebugEnabled()) {
 +            s_logger.debug("DeploymentPlanner allocation algorithm: " + planner);
 +
              s_logger.debug("Trying to allocate a host and storage pools from dc:" + plan.getDataCenterId() + ", pod:" + plan.getPodId() + ",cluster:" +
                  plan.getClusterId() + ", requested cpu: " + cpu_requested + ", requested ram: " + ram_requested);
 -
 +
              s_logger.debug("Is ROOT volume READY (pool already allocated)?: " + (plan.getPoolId() != null ? "Yes" : "No"));
 -        }
 -
 +        }
 +
          String haVmTag = (String)vmProfile.getParameter(VirtualMachineProfile.Param.HaTag);
 -
 -        if (plan.getHostId() != null && haVmTag == null) {
 -            Long hostIdSpecified = plan.getHostId();
 -            if (s_logger.isDebugEnabled()) {
 +
 +        if (plan.getHostId() != null && haVmTag == null) {
 +            Long hostIdSpecified = plan.getHostId();
 +            if (s_logger.isDebugEnabled()) {
                  s_logger.debug("DeploymentPlan has host_id specified, choosing this host and making no checks on this host: " + hostIdSpecified);
 -            }
 -            HostVO host = _hostDao.findById(hostIdSpecified);
 -            if (host == null) {
 -                s_logger.debug("The specified host cannot be found");
 -            } else if (avoids.shouldAvoid(host)) {
 -                s_logger.debug("The specified host is in avoid set");
 -            } else {
 -                if (s_logger.isDebugEnabled()) {
 +            }
 +            HostVO host = _hostDao.findById(hostIdSpecified);
 +            if (host == null) {
 +                s_logger.debug("The specified host cannot be found");
 +            } else if (avoids.shouldAvoid(host)) {
 +                s_logger.debug("The specified host is in avoid set");
 +            } else {
 +                if (s_logger.isDebugEnabled()) {
                      s_logger.debug("Looking for suitable pools for this host under zone: " + host.getDataCenterId() + ", pod: " + host.getPodId() + ", cluster: " +
                          host.getClusterId());
 -                }
 -
 -                // search for storage under the zone, pod, cluster of the host.
 +                }
 +
 +                // search for storage under the zone, pod, cluster of the host.
                  DataCenterDeployment lastPlan =
                      new DataCenterDeployment(host.getDataCenterId(), host.getPodId(), host.getClusterId(), hostIdSpecified, plan.getPoolId(), null,
                          plan.getReservationContext());
@@@ -440,100 -434,114 +434,114 @@@
                  } else {
                      s_logger.debug("The last host of this VM is not UP or is not enabled, host status is: " + host.getStatus().name() + ", host resource state is: " +
                          host.getResourceState());
 -                }
 -            }
 -            s_logger.debug("Cannot choose the last host to deploy this VM ");
 -        }
 -
 -        DeployDestination dest = null;
 -        List<Long> clusterList = null;
 -
 -        if (planner != null && planner.canHandle(vmProfile, plan, avoids)) {
 -            while (true) {
 -                if (planner instanceof DeploymentClusterPlanner) {
 -
 +                }
 +            }
 +            s_logger.debug("Cannot choose the last host to deploy this VM ");
 +        }
 +
 +        DeployDestination dest = null;
 +        List<Long> clusterList = null;
 +
 +        if (planner != null && planner.canHandle(vmProfile, plan, avoids)) {
 +            while (true) {
- 
 +                if (planner instanceof DeploymentClusterPlanner) {
 +
                      ExcludeList plannerAvoidInput =
                          new ExcludeList(avoids.getDataCentersToAvoid(), avoids.getPodsToAvoid(), avoids.getClustersToAvoid(), avoids.getHostsToAvoid(),
 -                            avoids.getPoolsToAvoid());
 -
 +                            avoids.getPoolsToAvoid());
 +
                      clusterList = ((DeploymentClusterPlanner)planner).orderClusters(vmProfile, plan, avoids);
 -
 -                    if (clusterList != null && !clusterList.isEmpty()) {
 -                        // planner refactoring. call allocators to list hosts
 +
 +                    if (clusterList != null && !clusterList.isEmpty()) {
 +                        // planner refactoring. call allocators to list hosts
                          ExcludeList plannerAvoidOutput =
                              new ExcludeList(avoids.getDataCentersToAvoid(), avoids.getPodsToAvoid(), avoids.getClustersToAvoid(), avoids.getHostsToAvoid(),
 -                                avoids.getPoolsToAvoid());
 -
 -                        resetAvoidSet(plannerAvoidOutput, plannerAvoidInput);
 -
 +                                avoids.getPoolsToAvoid());
 +
 +                        resetAvoidSet(plannerAvoidOutput, plannerAvoidInput);
 +
                          dest =
                              checkClustersforDestination(clusterList, vmProfile, plan, avoids, dc, getPlannerUsage(planner, vmProfile, plan, avoids), plannerAvoidOutput);
 -                        if (dest != null) {
 -                            return dest;
 -                        }
 -                        // reset the avoid input to the planners
 -                        resetAvoidSet(avoids, plannerAvoidOutput);
 -
 -                    } else {
 -                        return null;
 -                    }
 -                } else {
 -                    dest = planner.plan(vmProfile, plan, avoids);
 -                    if (dest != null) {
 -                        long hostId = dest.getHost().getId();
 -                        avoids.addHost(dest.getHost().getId());
 -
 -                        if (checkIfHostFitsPlannerUsage(hostId, DeploymentPlanner.PlannerResourceUsage.Shared)) {
 -                            // found destination
 -                            return dest;
 -                        } else {
 -                            // find another host - seems some concurrent
 -                            // deployment picked it up for dedicated access
 -                            continue;
 -                        }
 -                    } else {
 -                        return null;
 -                    }
 -                }
 -            }
 -        }
 -
 -        return dest;
 -    }
 -
 +                        if (dest != null) {
 +                            return dest;
 +                        }
 +                        // reset the avoid input to the planners
 +                        resetAvoidSet(avoids, plannerAvoidOutput);
 +
 +                    } else {
 +                        return null;
 +                    }
 +                } else {
 +                    dest = planner.plan(vmProfile, plan, avoids);
 +                    if (dest != null) {
 +                        long hostId = dest.getHost().getId();
 +                        avoids.addHost(dest.getHost().getId());
 +
 +                        if (checkIfHostFitsPlannerUsage(hostId, DeploymentPlanner.PlannerResourceUsage.Shared)) {
 +                            // found destination
 +                            return dest;
 +                        } else {
 +                            // find another host - seems some concurrent
 +                            // deployment picked it up for dedicated access
 +                            continue;
 +                        }
 +                    } else {
 +                        return null;
 +                    }
 +                }
 +            }
 +        }
 +
 +        return dest;
 +    }
 +
+     @Override
+     public DeploymentPlanner getDeploymentPlannerByName(String plannerName) {
+         if (plannerName != null) {
+             for (DeploymentPlanner plannerInList : _planners) {
+                 if (plannerName != null) {
+                 }
+                 if (plannerName.equalsIgnoreCase(plannerInList.getName())) {
+                     return plannerInList;
+                 }
+             }
+         }
+ 
+         return null;
+     }
+ 
      private void checkForNonDedicatedResources(VirtualMachineProfile vmProfile, DataCenter dc, ExcludeList avoids) {
 -        boolean isExplicit = false;
 -        VirtualMachine vm = vmProfile.getVirtualMachine();
 -
 -        // check if zone is dedicated. if yes check if vm owner has acess to it.
 -        DedicatedResourceVO dedicatedZone = _dedicatedDao.findByZoneId(dc.getId());
 -        if (dedicatedZone != null && !_accountMgr.isRootAdmin(vmProfile.getOwner().getType())) {
 -            long accountDomainId = vmProfile.getOwner().getDomainId();
 -            long accountId = vmProfile.getOwner().getAccountId();
 -
 -            // If a zone is dedicated to an account then all hosts in this zone
 -            // will be explicitly dedicated to
 -            // that account. So there won't be any shared hosts in the zone, the
 -            // only way to deploy vms from that
 -            // account will be to use explicit dedication affinity group.
 -            if (dedicatedZone.getAccountId() != null) {
 -                if (dedicatedZone.getAccountId().equals(accountId)) {
 -                    return;
 -                } else {
 +        boolean isExplicit = false;
 +        VirtualMachine vm = vmProfile.getVirtualMachine();
 +
 +        // check if zone is dedicated. if yes check if vm owner has acess to it.
 +        DedicatedResourceVO dedicatedZone = _dedicatedDao.findByZoneId(dc.getId());
 +        if (dedicatedZone != null && !_accountMgr.isRootAdmin(vmProfile.getOwner().getId())) {
 +            long accountDomainId = vmProfile.getOwner().getDomainId();
 +            long accountId = vmProfile.getOwner().getAccountId();
 +
 +            // If a zone is dedicated to an account then all hosts in this zone
 +            // will be explicitly dedicated to
 +            // that account. So there won't be any shared hosts in the zone, the
 +            // only way to deploy vms from that
 +            // account will be to use explicit dedication affinity group.
 +            if (dedicatedZone.getAccountId() != null) {
 +                if (dedicatedZone.getAccountId().equals(accountId)) {
 +                    return;
 +                } else {
                      throw new CloudRuntimeException("Failed to deploy VM, Zone " + dc.getName() + " not available for the user account " + vmProfile.getOwner());
 -                }
 -            }
 -
 -            // if zone is dedicated to a domain. Check owner's access to the
 -            // domain level dedication group
 +                }
 +            }
 +
 +            // if zone is dedicated to a domain. Check owner's access to the
 +            // domain level dedication group
              if (!_affinityGroupService.isAffinityGroupAvailableInDomain(dedicatedZone.getAffinityGroupId(), accountDomainId)) {
                  throw new CloudRuntimeException("Failed to deploy VM, Zone " + dc.getName() + " not available for the user domain " + vmProfile.getOwner());
 -            }
 -
 -        }
 -
 -        // check affinity group of type Explicit dedication exists. If No put
 +            }
 +
 +        }
 +
 +        // check affinity group of type Explicit dedication exists. If No put
          // dedicated pod/cluster/host in avoid list
          List<AffinityGroupVMMapVO> vmGroupMappings = _affinityGroupVMMapDao.findByVmIdType(vm.getId(), "ExplicitDedication");
  
@@@ -1302,111 -1310,114 +1310,114 @@@
              avoid.getPoolsToAvoid().addAll(poolsToAvoidOutput);
          }
  
 -        if (suitableVolumeStoragePools.isEmpty()) {
 -            s_logger.debug("No suitable pools found");
 -        }
 -
 -        return new Pair<Map<Volume, List<StoragePool>>, List<Volume>>(suitableVolumeStoragePools, readyAndReusedVolumes);
 -    }
 -
 -    private boolean isEnabledForAllocation(long zoneId, Long podId, Long clusterId) {
 -        // Check if the zone exists in the system
 -        DataCenterVO zone = _dcDao.findById(zoneId);
 -        if (zone != null && Grouping.AllocationState.Disabled == zone.getAllocationState()) {
 -            s_logger.info("Zone is currently disabled, cannot allocate to this zone: " + zoneId);
 -            return false;
 -        }
 -
 -        Pod pod = _podDao.findById(podId);
 -        if (pod != null && Grouping.AllocationState.Disabled == pod.getAllocationState()) {
 -            s_logger.info("Pod is currently disabled, cannot allocate to this pod: " + podId);
 -            return false;
 -        }
 -
 -        Cluster cluster = _clusterDao.findById(clusterId);
 -        if (cluster != null && Grouping.AllocationState.Disabled == cluster.getAllocationState()) {
 -            s_logger.info("Cluster is currently disabled, cannot allocate to this cluster: " + clusterId);
 -            return false;
 -        }
 -
 -        return true;
 -    }
 -
 -    private boolean isRootAdmin(ReservationContext reservationContext) {
 -        if (reservationContext != null) {
 -            if (reservationContext.getAccount() != null) {
 -                return _accountMgr.isRootAdmin(reservationContext.getAccount().getType());
 -            } else {
 -                return false;
 -            }
 -        }
 -        return false;
 -    }
 -
 -    @DB
 -    @Override
 +        if (suitableVolumeStoragePools.isEmpty()) {
 +            s_logger.debug("No suitable pools found");
 +        }
 +
 +        return new Pair<Map<Volume, List<StoragePool>>, List<Volume>>(suitableVolumeStoragePools, readyAndReusedVolumes);
 +    }
 +
 +    private boolean isEnabledForAllocation(long zoneId, Long podId, Long clusterId) {
 +        // Check if the zone exists in the system
 +        DataCenterVO zone = _dcDao.findById(zoneId);
 +        if (zone != null && Grouping.AllocationState.Disabled == zone.getAllocationState()) {
 +            s_logger.info("Zone is currently disabled, cannot allocate to this zone: " + zoneId);
 +            return false;
 +        }
 +
 +        Pod pod = _podDao.findById(podId);
 +        if (pod != null && Grouping.AllocationState.Disabled == pod.getAllocationState()) {
 +            s_logger.info("Pod is currently disabled, cannot allocate to this pod: " + podId);
 +            return false;
 +        }
 +
 +        Cluster cluster = _clusterDao.findById(clusterId);
 +        if (cluster != null && Grouping.AllocationState.Disabled == cluster.getAllocationState()) {
 +            s_logger.info("Cluster is currently disabled, cannot allocate to this cluster: " + clusterId);
 +            return false;
 +        }
 +
 +        return true;
 +    }
 +
 +    private boolean isRootAdmin(ReservationContext reservationContext) {
 +        if (reservationContext != null) {
 +            if (reservationContext.getAccount() != null) {
 +                return _accountMgr.isRootAdmin(reservationContext.getAccount().getId());
 +            } else {
 +                return false;
 +            }
 +        }
 +        return false;
 +    }
 +
 +    @DB
 +    @Override
-     public String finalizeReservation(final DeployDestination plannedDestination, final VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids)
+     public String finalizeReservation(final DeployDestination plannedDestination, final VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids, final DeploymentPlanner planner)
 -        throws InsufficientServerCapacityException, AffinityConflictException {
 -
 -        final VirtualMachine vm = vmProfile.getVirtualMachine();
 -        final long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId());
 -
 -        return Transaction.execute(new TransactionCallback<String>() {
 -            @Override
 -            public String doInTransaction(TransactionStatus status) {
 -                boolean saveReservation = true;
 -
 -                if (vmGroupCount > 0) {
 -                    List<Long> groupIds = _affinityGroupVMMapDao.listAffinityGroupIdsByVmId(vm.getId());
 -                    SearchCriteria<AffinityGroupVO> criteria = _affinityGroupDao.createSearchCriteria();
 -                    criteria.addAnd("id", SearchCriteria.Op.IN, groupIds.toArray(new Object[groupIds.size()]));
 -                    List<AffinityGroupVO> groups = _affinityGroupDao.lockRows(criteria, null, true);
 -
 -                    for (AffinityGroupProcessor processor : _affinityProcessors) {
 -                        if (!processor.check(vmProfile, plannedDestination)) {
 -                            saveReservation = false;
 -                            break;
 -                        }
 -                    }
 -                }
 -
 -                if (saveReservation) {
 +            throws InsufficientServerCapacityException, AffinityConflictException {
 +
 +        final VirtualMachine vm = vmProfile.getVirtualMachine();
 +        final long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId());
 +
 +        return Transaction.execute(new TransactionCallback<String>() {
 +            @Override
 +            public String doInTransaction(TransactionStatus status) {
 +        boolean saveReservation = true;
 +
 +            if (vmGroupCount > 0) {
 +                List<Long> groupIds = _affinityGroupVMMapDao.listAffinityGroupIdsByVmId(vm.getId());
 +                SearchCriteria<AffinityGroupVO> criteria = _affinityGroupDao.createSearchCriteria();
 +                criteria.addAnd("id", SearchCriteria.Op.IN, groupIds.toArray(new Object[groupIds.size()]));
 +                List<AffinityGroupVO> groups = _affinityGroupDao.lockRows(criteria, null, true);
 +
 +                for (AffinityGroupProcessor processor : _affinityProcessors) {
 +                    if (!processor.check(vmProfile, plannedDestination)) {
 +                        saveReservation = false;
 +                        break;
 +                    }
 +                }
 +            }
 +
 +            if (saveReservation) {
                      VMReservationVO vmReservation =
                          new VMReservationVO(vm.getId(), plannedDestination.getDataCenter().getId(), plannedDestination.getPod().getId(), plannedDestination.getCluster()
                              .getId(), plannedDestination.getHost().getId());
+                     if (planner != null) {
+                         vmReservation.setDeploymentPlanner(planner.getName());
+                     }
 -                    Map<Long, Long> volumeReservationMap = new HashMap<Long, Long>();
 -
 -                    if (vm.getHypervisorType() != HypervisorType.BareMetal) {
 -                        for (Volume vo : plannedDestination.getStorageForDisks().keySet()) {
 -                            volumeReservationMap.put(vo.getId(), plannedDestination.getStorageForDisks().get(vo).getId());
 -                        }
 -                        vmReservation.setVolumeReservation(volumeReservationMap);
 -                    }
 -                    _reservationDao.persist(vmReservation);
 -                    return vmReservation.getUuid();
 -                }
 -
 -                return null;
 -            }
 -        });
 -    }
 -
 -    @Override
 +                Map<Long, Long> volumeReservationMap = new HashMap<Long, Long>();
 +
 +                if (vm.getHypervisorType() != HypervisorType.BareMetal) {
 +                    for (Volume vo : plannedDestination.getStorageForDisks().keySet()) {
 +                        volumeReservationMap.put(vo.getId(), plannedDestination.getStorageForDisks().get(vo).getId());
 +                    }
 +                    vmReservation.setVolumeReservation(volumeReservationMap);
 +                }
 +                _reservationDao.persist(vmReservation);
 +                return vmReservation.getUuid();
 +            }
 +
 +        return null;
 +    }
 +        });
 +    }
 +
 +    @Override
      public boolean preStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vo, boolean status, Object opaque) {
 -        return true;
 -    }
 -
 -    @Override
 +        return true;
 +    }
 +
 +    @Override
      public boolean postStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vo, boolean status, Object opaque) {
 -        if (!status) {
 -            return false;
 -        }
 -        if ((oldState == State.Starting) && (newState != State.Starting)) {
 -            // cleanup all VM reservation entries
 -            SearchCriteria<VMReservationVO> sc = _reservationDao.createSearchCriteria();
 -            sc.addAnd("vmId", SearchCriteria.Op.EQ, vo.getId());
 -            _reservationDao.expunge(sc);
 -        }
 -        return true;
 -    }
 -}
 +        if (!status) {
 +            return false;
 +        }
 +        if ((oldState == State.Starting) && (newState != State.Starting)) {
 +            // cleanup all VM reservation entries
 +            SearchCriteria<VMReservationVO> sc = _reservationDao.createSearchCriteria();
 +            sc.addAnd("vmId", SearchCriteria.Op.EQ, vo.getId());
 +            _reservationDao.expunge(sc);
 +        }
 +        return true;
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/deploy/FirstFitPlanner.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/network/IpAddressManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/as/AutoScaleManagerImpl.java
index 755fc54,61b7f4b..99189fe
--- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
+++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
@@@ -1375,18 -1366,18 +1375,18 @@@ public class AutoScaleManagerImpl<Type
          return sdf.format(current);
      }
  
 -    private boolean startNewVM(final long vmId) {
 +    private boolean startNewVM(long vmId) {
          try {
              CallContext.current().setEventDetails("Vm Id: " + vmId);
-             _userVmManager.startVirtualMachine(vmId, null, null);
-         } catch (ResourceUnavailableException ex) {
+             _userVmManager.startVirtualMachine(vmId, null, null, null);
+         } catch (final ResourceUnavailableException ex) {
              s_logger.warn("Exception: ", ex);
              throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage());
 -        } catch (final ConcurrentOperationException ex) {
 +        } catch (ConcurrentOperationException ex) {
              s_logger.warn("Exception: ", ex);
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, ex.getMessage());
 -        } catch (final InsufficientCapacityException ex) {
 -            final StringBuilder message = new StringBuilder(ex.getMessage());
 +        } catch (InsufficientCapacityException ex) {
 +            StringBuilder message = new StringBuilder(ex.getMessage());
              if (ex instanceof InsufficientServerCapacityException) {
                  if (((InsufficientServerCapacityException)ex).isAffinityApplied()) {
                      message.append(", Please check the affinity groups provided, there may not be sufficient capacity to follow them");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/server/ManagementServerImpl.java
index 09823d7,2b63ae9..073cf47
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@@ -40,11 -40,7 +40,10 @@@ import javax.crypto.spec.SecretKeySpec
  import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
 +import org.apache.commons.codec.binary.Base64;
 +import org.apache.log4j.Logger;
 +
  import org.apache.cloudstack.acl.ControlledEntity;
- import org.apache.cloudstack.acl.SecurityChecker.AccessType;
  import org.apache.cloudstack.affinity.AffinityGroupProcessor;
  import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
  import org.apache.cloudstack.api.ApiConstants;
@@@ -735,10 -723,7 +726,9 @@@ public class ManagementServerImpl exten
      @Inject
      private UserVmManager _userVmMgr;
      @Inject
 +    private AccountService _accountService;
 +    @Inject
      private ServiceOfferingDao _offeringDao;
- 
      @Inject
      private DeploymentPlanningManager _dpMgr;
  
@@@ -1708,210 -1692,108 +1697,6 @@@
          return new Pair<List<? extends Configuration>, Integer>(result.first(), result.second());
      }
  
--    /* TODO: this method should go away. Keep here just in case that our latest refactoring using template_store_ref missed anything
--     * in handling Swift or S3.
--    private Set<Pair<Long, Long>> listTemplates(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso,
--            Boolean bootable, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean showDomr, boolean onlyReady,
--            List<Account> permittedAccounts, Account caller, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags, String zoneType) {
--
--        VMTemplateVO template = null;
--        if (templateId != null) {
--            template = _templateDao.findById(templateId);
--            if (template == null) {
--                throw new InvalidParameterValueException("Please specify a valid template ID.");
--            }// If ISO requested then it should be ISO.
--            if (isIso && template.getFormat() != ImageFormat.ISO) {
--                s_logger.error("Template Id " + templateId + " is not an ISO");
--                InvalidParameterValueException ex = new InvalidParameterValueException("Specified Template Id is not an ISO");
--                ex.addProxyObject(template.getUuid(), "templateId");
--                throw ex;
--            }// If ISO not requested then it shouldn't be an ISO.
--            if (!isIso && template.getFormat() == ImageFormat.ISO) {
--                s_logger.error("Incorrect format of the template id " + templateId);
--                InvalidParameterValueException ex = new InvalidParameterValueException("Incorrect format " + template.getFormat()
--                        + " of the specified template id");
--                ex.addProxyObject(template.getUuid(), "templateId");
--                throw ex;
--            }
--        }
--
--        DomainVO domain = null;
--        if (!permittedAccounts.isEmpty()) {
--            domain = _domainDao.findById(permittedAccounts.get(0).getDomainId());
--        } else {
--            domain = _domainDao.findById(DomainVO.ROOT_DOMAIN);
--        }
--
--        List<HypervisorType> hypers = null;
--        if (!isIso) {
--            hypers = _resourceMgr.listAvailHypervisorInZone(null, null);
--        }
--        Set<Pair<Long, Long>> templateZonePairSet = new HashSet<Pair<Long, Long>>();
--        if (_swiftMgr.isSwiftEnabled()) {
--            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, zoneType);
--
--                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 (_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, zoneType);
--
--                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,
--                        startIndex, zoneId, hyperType, onlyReady, showDomr, permittedAccounts, caller, listProjectResourcesCriteria, tags, zoneType);
--            } 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));
--            }
--        }
--
--        return templateZonePairSet;
--    }
--     */
--
-     private VMTemplateVO updateTemplateOrIso(BaseUpdateTemplateOrIsoCmd cmd) {
-         Long id = cmd.getId();
-         String name = cmd.getTemplateName();
-         String displayText = cmd.getDisplayText();
-         String format = cmd.getFormat();
-         Long guestOSId = cmd.getOsTypeId();
-         Boolean passwordEnabled = cmd.isPasswordEnabled();
-         Boolean bootable = cmd.isBootable();
-         Integer sortKey = cmd.getSortKey();
-         Boolean isDynamicallyScalable = cmd.isDynamicallyScalable();
-         Boolean isRoutingTemplate = cmd.isRoutingType();
-         Account account = CallContext.current().getCallingAccount();
- 
-         // verify that template exists
-         VMTemplateVO template = _templateDao.findById(id);
-         if (template == null || template.getRemoved() != null) {
-             InvalidParameterValueException ex = new InvalidParameterValueException("unable to find template/iso with specified id");
-             ex.addProxyObject(id.toString(), "templateId");
-             throw ex;
-         }
- 
-         // Don't allow to modify system template
-         if (id.equals(Long.valueOf(1))) {
-             InvalidParameterValueException ex = new InvalidParameterValueException("Unable to update template/iso of specified id");
-             ex.addProxyObject(template.getUuid(), "templateId");
-             throw ex;
-         }
- 
-         // do a permission check
-         _accountMgr.checkAccess(account, AccessType.OperateEntry, true, template);
- 
-         if(cmd.isRoutingType() != null){
-             if (!_accountService.isRootAdmin(account.getId())) {
-                 throw new PermissionDeniedException("Parameter isrouting can only be specified by a Root Admin, permission denied");
-             }
-         }
-         boolean updateNeeded = !(name == null && displayText == null && format == null && guestOSId == null && passwordEnabled == null && bootable == null && sortKey == null
-                 && isDynamicallyScalable == null && isRoutingTemplate == null);
-         if (!updateNeeded) {
-             return template;
-         }
- 
-         template = _templateDao.createForUpdate(id);
- 
-         if (name != null) {
-             template.setName(name);
-         }
- 
-         if (displayText != null) {
-             template.setDisplayText(displayText);
-         }
- 
-         if (sortKey != null) {
-             template.setSortKey(sortKey);
-         }
- 
-         ImageFormat imageFormat = null;
-         if (format != null) {
-             try {
-                 imageFormat = ImageFormat.valueOf(format.toUpperCase());
-             } catch (IllegalArgumentException e) {
-                 throw new InvalidParameterValueException("Image format: " + format + " is incorrect. Supported formats are " + EnumUtils.listValues(ImageFormat.values()));
-             }
- 
-             template.setFormat(imageFormat);
-         }
- 
-         if (guestOSId != null) {
-             GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
- 
-             if (guestOS == null) {
-                 throw new InvalidParameterValueException("Please specify a valid guest OS ID.");
-             } else {
-                 template.setGuestOSId(guestOSId);
-             }
-         }
- 
-         if (passwordEnabled != null) {
-             template.setEnablePassword(passwordEnabled);
-         }
- 
-         if (bootable != null) {
-             template.setBootable(bootable);
-         }
- 
-         if (isDynamicallyScalable != null) {
-             template.setDynamicallyScalable(isDynamicallyScalable);
-         }
- 
-         if (isRoutingTemplate != null) {
-             if (isRoutingTemplate) {
-                 template.setTemplateType(TemplateType.ROUTING);
-             } else {
-                 template.setTemplateType(TemplateType.USER);
-             }
-         }
- 
-         _templateDao.update(id, template);
- 
-         return _templateDao.findById(id);
-     }
- 
      @Override
      public Pair<List<? extends IpAddress>, Integer> searchForIPAddresses(ListPublicIpAddressesCmd cmd) {
          Object keyword = cmd.getKeyword();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/vm/UserVmManager.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/vm/UserVmManager.java
index 0e48414,11b110f..afe1002
--- a/server/src/com/cloud/vm/UserVmManager.java
+++ b/server/src/com/cloud/vm/UserVmManager.java
@@@ -88,7 -92,23 +88,7 @@@ public interface UserVmManager extends 
  
      boolean expunge(UserVmVO vm, long callerUserId, Account caller);
  
-     Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long hostId, Map<VirtualMachineProfile.Param, Object> additionalParams)
 -    /**
 -     * Obtains a list of virtual machines by the specified search criteria.
 -     * Can search by: "userId", "name", "state", "dataCenterId", "podId", "hostId"
 -     * @param c
 -     * @param caller TODO
 -     * @param domainId TODO
 -     * @param isRecursive TODO
 -     * @param permittedAccounts TODO
 -     * @param listAll TODO
 -     * @param listProjectResourcesCriteria TODO
 -     * @param tags TODO
 -     * @return List of UserVMs + count
 -     */
 -    Pair<List<UserVmJoinVO>, Integer> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List<Long> permittedAccounts, boolean listAll,
 -        ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags);
 -
+     Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long hostId, Map<VirtualMachineProfile.Param, Object> additionalParams, String deploymentPlannerToUse)
          throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
  
      boolean upgradeVirtualMachine(Long id, Long serviceOfferingId, Map<String, String> customParameters) throws ResourceUnavailableException,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/setup/db/db/schema-430to440.sql
----------------------------------------------------------------------


[34/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Do not use row lock in sync-queue scheduling to work around mysql locking issues.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5310e66f
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5310e66f
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5310e66f

Branch: refs/heads/distributedrouter
Commit: 5310e66f30fbfcc025b69b50a9a717557ac9eb3c
Parents: 7fa4715
Author: Kelven Yang <ke...@gmail.com>
Authored: Thu Mar 6 16:28:29 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Mar 13 16:59:56 2014 -0700

----------------------------------------------------------------------
 api/src/com/cloud/vm/VirtualMachine.java        |  2 ++
 .../jobs/impl/AsyncJobManagerImpl.java          | 16 ++++++++++++++
 .../jobs/impl/SyncQueueManagerImpl.java         | 22 ++++++++++----------
 3 files changed, 29 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5310e66f/api/src/com/cloud/vm/VirtualMachine.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/VirtualMachine.java b/api/src/com/cloud/vm/VirtualMachine.java
index dd11a82..b085d4a 100755
--- a/api/src/com/cloud/vm/VirtualMachine.java
+++ b/api/src/com/cloud/vm/VirtualMachine.java
@@ -119,10 +119,12 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, I
             s_fsm.addTransition(State.Error, VirtualMachine.Event.DestroyRequested, State.Expunging);
             s_fsm.addTransition(State.Error, VirtualMachine.Event.ExpungeOperation, State.Expunging);
 
+            s_fsm.addTransition(State.Starting, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
             s_fsm.addTransition(State.Stopping, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
             s_fsm.addTransition(State.Stopped, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
             s_fsm.addTransition(State.Running, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
             s_fsm.addTransition(State.Migrating, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running);
+
             s_fsm.addTransition(State.Starting, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
             s_fsm.addTransition(State.Stopping, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);
             s_fsm.addTransition(State.Running, VirtualMachine.Event.FollowAgentPowerOffReport, State.Stopped);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5310e66f/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index 9b9460c..49c3032 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -659,8 +659,24 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
 
     private Runnable getHeartbeatTask() {
         return new ManagedContextRunnable() {
+
             @Override
             protected void runInContext() {
+                GlobalLock scanLock = GlobalLock.getInternLock("AsyncJobManagerHeartbeat");
+                try {
+                    if (scanLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) {
+                        try {
+                            reallyRun();
+                        } finally {
+                            scanLock.unlock();
+                        }
+                    }
+                } finally {
+                    scanLock.releaseRef();
+                }
+            }
+
+            protected void reallyRun() {
                 try {
                     List<SyncQueueItemVO> l = _queueMgr.dequeueFromAny(getMsid(), MAX_ONETIME_SCHEDULE_SIZE);
                     if (l != null && l.size() > 0) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5310e66f/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
index d8e2674..5160e05 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
@@ -83,8 +83,8 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
             return Transaction.execute(new TransactionCallback<SyncQueueItemVO>() {
                 @Override
                 public SyncQueueItemVO doInTransaction(TransactionStatus status) {
-                    SyncQueueVO queueVO = _syncQueueDao.lockRow(queueId, true);
-                    if (queueVO == null) {
+                    SyncQueueVO queueVO = _syncQueueDao.findById(queueId);
+                    if(queueVO == null) {
                         s_logger.error("Sync queue(id: " + queueId + ") does not exist");
                         return null;
                     }
@@ -139,11 +139,11 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
                 @Override
                 public void doInTransactionWithoutResult(TransactionStatus status) {
                     List<SyncQueueItemVO> l = _syncQueueItemDao.getNextQueueItems(maxItems);
-                    if (l != null && l.size() > 0) {
-                        for (SyncQueueItemVO item : l) {
-                            SyncQueueVO queueVO = _syncQueueDao.lockRow(item.getQueueId(), true);
-                            SyncQueueItemVO itemVO = _syncQueueItemDao.lockRow(item.getId(), true);
-                            if (queueReadyToProcess(queueVO) && itemVO.getLastProcessNumber() == null) {
+                    if(l != null && l.size() > 0) {
+                        for(SyncQueueItemVO item : l) {
+                            SyncQueueVO queueVO = _syncQueueDao.findById(item.getQueueId());
+                            SyncQueueItemVO itemVO = _syncQueueItemDao.findById(item.getId());
+                            if(queueReadyToProcess(queueVO) && itemVO.getLastProcessNumber() == null) {
                                 Long processNumber = queueVO.getLastProcessNumber();
                                 if (processNumber == null)
                                     processNumber = new Long(1);
@@ -184,8 +184,8 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
                 @Override
                 public void doInTransactionWithoutResult(TransactionStatus status) {
                     SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
-                    if (itemVO != null) {
-                        SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
+                    if(itemVO != null) {
+                        SyncQueueVO queueVO = _syncQueueDao.findById(itemVO.getQueueId());
 
                         _syncQueueItemDao.expunge(itemVO.getId());
 
@@ -213,8 +213,8 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
                 @Override
                 public void doInTransactionWithoutResult(TransactionStatus status) {
                     SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
-                    if (itemVO != null) {
-                        SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
+                    if(itemVO != null) {
+                        SyncQueueVO queueVO = _syncQueueDao.findById(itemVO.getQueueId());
 
                         itemVO.setLastProcessMsid(null);
                         itemVO.setLastProcessNumber(null);


[03/54] [abbrv] Merge branch 'master' into rbac.

Posted by mu...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
index 1bb7cc8,61e9428..63eb12b
--- a/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
@@@ -42,7 -41,8 +42,8 @@@ import org.apache.cloudstack.context.Ca
  import com.cloud.exception.ResourceAllocationException;
  import com.cloud.template.VirtualMachineTemplate;
  
- @APICommand(name = "registerTemplate", description = "Registers an existing template into the CloudStack cloud. ", responseObject = TemplateResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "registerTemplate", description = "Registers an existing template into the CloudStack cloud. ", responseObject = TemplateResponse.class,
++@APICommand(name = "registerTemplate", description = "Registers an existing template into the CloudStack cloud. ", responseObject = TemplateResponse.class, responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class RegisterTemplateCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(RegisterTemplateCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java
index f7a2ac2,bad3a2f..81da7ee
--- a/api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplateCmd.java
@@@ -28,7 -27,8 +28,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.template.VirtualMachineTemplate;
  import com.cloud.user.Account;
  
- @APICommand(name = "updateTemplate", description = "Updates attributes of a template.", responseObject = TemplateResponse.class, responseView = ResponseView.Restricted)
 -@APICommand(name = "updateTemplate", description = "Updates attributes of a template.", responseObject = TemplateResponse.class,
++@APICommand(name = "updateTemplate", description = "Updates attributes of a template.", responseObject = TemplateResponse.class, responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdateTemplateCmd extends BaseUpdateTemplateOrIsoCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateTemplateCmd.class.getName());
      private static final String s_name = "updatetemplateresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplatePermissionsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplatePermissionsCmd.java
index b2aee46,4c94e57..d5d0c58
--- a/api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplatePermissionsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/UpdateTemplatePermissionsCmd.java
@@@ -28,7 -27,8 +28,8 @@@ import com.cloud.user.Account
  
  @APICommand(name = "updateTemplatePermissions", responseObject = SuccessResponse.class, description = "Updates a template visibility permissions. "
      + "A public template is visible to all accounts within the same domain. " + "A private template is visible only to the owner of the template. "
-         + "A priviledged template is a private template with account permissions added. " + "Only accounts specified under the template permissions are visible to them.", entityType = {IAMEntityType.VirtualMachineTemplate})
 -    + "A priviledged template is a private template with account permissions added. " + "Only accounts specified under the template permissions are visible to them.",
++    + "A priviledged template is a private template with account permissions added. " + "Only accounts specified under the template permissions are visible to them.", entityType = {IAMEntityType.VirtualMachineTemplate},
+     requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdateTemplatePermissionsCmd extends BaseUpdateTemplateOrIsoPermissionsCmd {
      @Override
      protected String getResponseName() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java
index 7857594,46a2010..a1bbe2a
--- a/api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java
@@@ -40,7 -36,8 +40,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "addNicToVirtualMachine", description = "Adds VM to specified network by creating a NIC", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "addNicToVirtualMachine", description = "Adds VM to specified network by creating a NIC", responseObject = UserVmResponse.class,
++@APICommand(name = "addNicToVirtualMachine", description = "Adds VM to specified network by creating a NIC", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class AddNicToVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(AddNicToVMCmd.class);
      private static final String s_name = "addnictovirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
index 4be416a,c6f4e19..7d55974
--- a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
@@@ -24,9 -24,7 +24,10 @@@ import java.util.LinkedHashMap
  import java.util.List;
  import java.util.Map;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.acl.SecurityChecker.AccessType;
  import org.apache.cloudstack.affinity.AffinityGroupResponse;
  import org.apache.cloudstack.api.ACL;
@@@ -68,7 -66,8 +69,8 @@@ import com.cloud.template.VirtualMachin
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "deployVirtualMachine", description = "Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "deployVirtualMachine", description = "Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.", responseObject = UserVmResponse.class,
++@APICommand(name = "deployVirtualMachine", description = "Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd {
      public static final Logger s_logger = Logger.getLogger(DeployVMCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java
index c34e427,9bfd611..b8ac561
--- a/api/src/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java
@@@ -40,7 -36,11 +40,9 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "destroyVirtualMachine", description = "Destroys a virtual machine. Once destroyed, only the administrator can recover it.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "destroyVirtualMachine",
 -            description = "Destroys a virtual machine. Once destroyed, only the administrator can recover it.",
 -            responseObject = UserVmResponse.class,
++@APICommand(name = "destroyVirtualMachine", description = "Destroys a virtual machine. Once destroyed, only the administrator can recover it.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = true)
  public class DestroyVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DestroyVMCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/GetVMPasswordCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/GetVMPasswordCmd.java
index 50fa761,6c63213..ebee189
--- a/api/src/org/apache/cloudstack/api/command/user/vm/GetVMPasswordCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/GetVMPasswordCmd.java
@@@ -33,7 -30,8 +33,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "getVMPassword", responseObject = GetVMPasswordResponse.class, description = "Returns an encrypted password for the VM", entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "getVMPassword", responseObject = GetVMPasswordResponse.class, description = "Returns an encrypted password for the VM",
++@APICommand(name = "getVMPassword", responseObject = GetVMPasswordResponse.class, description = "Returns an encrypted password for the VM", entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class GetVMPasswordCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(GetVMPasswordCmd.class.getName());
      private static final String s_name = "getvmpasswordresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
index e6111fb,1a564f6..d1e5c09
--- a/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
@@@ -20,9 -20,7 +20,10 @@@ import java.util.ArrayList
  import java.util.EnumSet;
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.affinity.AffinityGroupResponse;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
@@@ -45,8 -43,9 +47,9 @@@ import org.apache.cloudstack.api.respon
  
  import com.cloud.exception.InvalidParameterValueException;
  
 -@APICommand(name = "listVirtualMachines", description = "List the virtual machines owned by the account.", responseObject = UserVmResponse.class,
 +
- @APICommand(name = "listVirtualMachines", description = "List the virtual machines owned by the account.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
++@APICommand(name = "listVirtualMachines", description = "List the virtual machines owned by the account.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class ListVMsCmd extends BaseListTaggedResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListVMsCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java
index 9904415,c54d62f..8f04430
--- a/api/src/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java
@@@ -38,7 -34,8 +38,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "rebootVirtualMachine", description = "Reboots a virtual machine.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "rebootVirtualMachine", description = "Reboots a virtual machine.", responseObject = UserVmResponse.class,
++@APICommand(name = "rebootVirtualMachine", description = "Reboots a virtual machine.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class RebootVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RebootVMCmd.class.getName());
      private static final String s_name = "rebootvirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/RemoveIpFromVmNicCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/RemoveIpFromVmNicCmd.java
index b81b8a9,c83bcda..75eafa9
--- a/api/src/org/apache/cloudstack/api/command/user/vm/RemoveIpFromVmNicCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/RemoveIpFromVmNicCmd.java
@@@ -37,7 -37,8 +37,9 @@@ import com.cloud.network.Network
  import com.cloud.user.Account;
  import com.cloud.vm.NicSecondaryIp;
  
- @APICommand(name = "removeIpFromNic", description = "Assigns secondary IP to NIC.", responseObject = SuccessResponse.class)
++
+ @APICommand(name = "removeIpFromNic", description = "Removes secondary IP from the NIC.", responseObject = SuccessResponse.class,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class RemoveIpFromVmNicCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RemoveIpFromVmNicCmd.class.getName());
      private static final String s_name = "removeipfromnicresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/RemoveNicFromVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/RemoveNicFromVMCmd.java
index 904f266,eb4f454..44dfcf6
--- a/api/src/org/apache/cloudstack/api/command/user/vm/RemoveNicFromVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/RemoveNicFromVMCmd.java
@@@ -40,7 -36,8 +40,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "removeNicFromVirtualMachine", description = "Removes VM from specified network by deleting a NIC", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "removeNicFromVirtualMachine", description = "Removes VM from specified network by deleting a NIC", responseObject = UserVmResponse.class,
++@APICommand(name = "removeNicFromVirtualMachine", description = "Removes VM from specified network by deleting a NIC", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class RemoveNicFromVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RemoveNicFromVMCmd.class);
      private static final String s_name = "removenicfromvirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java
index a6f132a,e8d5f73..2fd508b
--- a/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java
@@@ -38,9 -34,9 +38,10 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "resetPasswordForVirtualMachine", responseObject = UserVmResponse.class, description = "Resets the password for virtual machine. "
 -    + "The virtual machine must be in a \"Stopped\" state and the template must already " + "support this feature for this command to take effect. [async]",
 +@APICommand(name = "resetPasswordForVirtualMachine", responseObject=UserVmResponse.class, description="Resets the password for virtual machine. " +
 +                    "The virtual machine must be in a \"Stopped\" state and the template must already " +
-  "support this feature for this command to take effect. [async]", responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
++        "support this feature for this command to take effect. [async]", responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+     requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class ResetVMPasswordCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(ResetVMPasswordCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java
index bdbd553,318d3c8..288eed7
--- a/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java
@@@ -41,8 -37,9 +41,9 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "resetSSHKeyForVirtualMachine", responseObject = UserVmResponse.class, description = "Resets the SSH Key for virtual machine. "
 -    + "The virtual machine must be in a \"Stopped\" state. [async]",
 +@APICommand(name = "resetSSHKeyForVirtualMachine", responseObject = UserVmResponse.class, description = "Resets the SSH Key for virtual machine. " +
-  "The virtual machine must be in a \"Stopped\" state. [async]", responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
++        "The virtual machine must be in a \"Stopped\" state. [async]", responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+     requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class ResetVMSSHKeyCmd extends BaseAsyncCmd {
  
      public static final Logger s_logger = Logger.getLogger(ResetVMSSHKeyCmd.class.getName());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java
index 7844028,7c35680..9befc67
--- a/api/src/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java
@@@ -40,7 -36,12 +40,9 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "restoreVirtualMachine", description = "Restore a VM to original template/ISO or new template/ISO", responseObject = UserVmResponse.class, since = "3.0.0", responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "restoreVirtualMachine",
 -            description = "Restore a VM to original template/ISO or new template/ISO",
 -            responseObject = UserVmResponse.class,
 -            since = "3.0.0",
++@APICommand(name = "restoreVirtualMachine", description = "Restore a VM to original template/ISO or new template/ISO", responseObject = UserVmResponse.class, since = "3.0.0", responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+             requestHasSensitiveInfo = false,
+             responseHasSensitiveInfo = true)
  public class RestoreVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RestoreVMCmd.class);
      private static final String s_name = "restorevmresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java
index acc4578,fe752cb..cd658cb
--- a/api/src/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java
@@@ -47,8 -43,8 +47,9 @@@ import com.cloud.exception.VirtualMachi
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "scaleVirtualMachine", description = "Scales the virtual machine to a new service offering.", responseObject = SuccessResponse.class,
 +
- @APICommand(name = "scaleVirtualMachine", description = "Scales the virtual machine to a new service offering.", responseObject = SuccessResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
++@APICommand(name = "scaleVirtualMachine", description = "Scales the virtual machine to a new service offering.", responseObject = SuccessResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ScaleVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(ScaleVMCmd.class.getName());
      private static final String s_name = "scalevirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
index 8237c0f,a59dc6e..2e4187d
--- a/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
@@@ -44,7 -40,8 +44,8 @@@ import com.cloud.user.Account
  import com.cloud.uservm.UserVm;
  import com.cloud.utils.exception.ExecutionException;
  
- @APICommand(name = "startVirtualMachine", responseObject = UserVmResponse.class, description = "Starts a virtual machine.", responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "startVirtualMachine", responseObject = UserVmResponse.class, description = "Starts a virtual machine.",
++@APICommand(name = "startVirtualMachine", responseObject = UserVmResponse.class, description = "Starts a virtual machine.", responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class StartVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(StartVMCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java
index 6a448ba,b547357..fe94964
--- a/api/src/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java
@@@ -37,7 -34,8 +37,8 @@@ import com.cloud.exception.ConcurrentOp
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "stopVirtualMachine", responseObject = UserVmResponse.class, description = "Stops a virtual machine.", responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "stopVirtualMachine", responseObject = UserVmResponse.class, description = "Stops a virtual machine.",
++@APICommand(name = "stopVirtualMachine", responseObject = UserVmResponse.class, description = "Stops a virtual machine.", responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class StopVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(StopVMCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/UpdateDefaultNicForVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/UpdateDefaultNicForVMCmd.java
index 6d32c96,26af16e..c70f7e5
--- a/api/src/org/apache/cloudstack/api/command/user/vm/UpdateDefaultNicForVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/UpdateDefaultNicForVMCmd.java
@@@ -40,8 -36,8 +40,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- 
- @APICommand(name = "updateDefaultNicForVirtualMachine", description = "Changes the default NIC on a VM", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "updateDefaultNicForVirtualMachine", description = "Changes the default NIC on a VM", responseObject = UserVmResponse.class,
++@APICommand(name = "updateDefaultNicForVirtualMachine", description = "Changes the default NIC on a VM", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class UpdateDefaultNicForVMCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateDefaultNicForVMCmd.class);
      private static final String s_name = "updatedefaultnicforvirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java
index 4d74574,eb3b955..fac82aa
--- a/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java
@@@ -16,11 -16,7 +16,12 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vm;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
@@@ -37,10 -33,10 +38,10 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- 
 -@APICommand(name = "updateVirtualMachine", description = "Updates properties of a virtual machine. The VM has to be stopped and restarted for the "
 -    + "new properties to take effect. UpdateVirtualMachine does not first check whether the VM is stopped. "
 -    + "Therefore, stop the VM manually before issuing this call.", responseObject = UserVmResponse.class,
 +@APICommand(name = "updateVirtualMachine", description="Updates properties of a virtual machine. The VM has to be stopped and restarted for the " +
 +        "new properties to take effect. UpdateVirtualMachine does not first check whether the VM is stopped. " +
-  "Therefore, stop the VM manually before issuing this call.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
++        "Therefore, stop the VM manually before issuing this call.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+     requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class UpdateVMCmd extends BaseCustomIdCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateVMCmd.class.getName());
      private static final String s_name = "updatevirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vm/UpgradeVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/UpgradeVMCmd.java
index ec06070,46cce80..7282eba
--- a/api/src/org/apache/cloudstack/api/command/user/vm/UpgradeVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/UpgradeVMCmd.java
@@@ -43,9 -38,9 +43,10 @@@ import com.cloud.offering.ServiceOfferi
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "changeServiceForVirtualMachine", responseObject = UserVmResponse.class, description = "Changes the service offering for a virtual machine. "
 -        + "The virtual machine must be in a \"Stopped\" state for " + "this command to take effect.",
 +@APICommand(name = "changeServiceForVirtualMachine", responseObject=UserVmResponse.class, description="Changes the service offering for a virtual machine. " +
 +                                            "The virtual machine must be in a \"Stopped\" state for " +
-  "this command to take effect.", responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
++        "this command to take effect.", responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class UpgradeVMCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(UpgradeVMCmd.class.getName());
      private static final String s_name = "changeserviceforvirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vmgroup/CreateVMGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vmgroup/CreateVMGroupCmd.java
index a8cca68,4676def..30b3ac8
--- a/api/src/org/apache/cloudstack/api/command/user/vmgroup/CreateVMGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vmgroup/CreateVMGroupCmd.java
@@@ -32,7 -31,8 +32,8 @@@ import org.apache.cloudstack.context.Ca
  
  import com.cloud.vm.InstanceGroup;
  
- @APICommand(name = "createInstanceGroup", description = "Creates a vm group", responseObject = InstanceGroupResponse.class, entityType = { IAMEntityType.InstanceGroup })
 -@APICommand(name = "createInstanceGroup", description = "Creates a vm group", responseObject = InstanceGroupResponse.class,
++@APICommand(name = "createInstanceGroup", description = "Creates a vm group", responseObject = InstanceGroupResponse.class, entityType = {IAMEntityType.InstanceGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateVMGroupCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(CreateVMGroupCmd.class.getName());
  
@@@ -104,7 -104,7 +105,7 @@@
          if (result != null) {
              InstanceGroupResponse response = _responseGenerator.createInstanceGroupResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create vm instance group");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vmgroup/DeleteVMGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vmgroup/DeleteVMGroupCmd.java
index 5b4ff8c,f88f45e..0bc5236
--- a/api/src/org/apache/cloudstack/api/command/user/vmgroup/DeleteVMGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vmgroup/DeleteVMGroupCmd.java
@@@ -33,7 -30,8 +33,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.user.Account;
  import com.cloud.vm.InstanceGroup;
  
- @APICommand(name = "deleteInstanceGroup", description = "Deletes a vm group", responseObject = SuccessResponse.class, entityType = { IAMEntityType.InstanceGroup })
 -@APICommand(name = "deleteInstanceGroup", description = "Deletes a vm group", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteInstanceGroup", description = "Deletes a vm group", responseObject = SuccessResponse.class, entityType = {IAMEntityType.InstanceGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteVMGroupCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteVMGroupCmd.class.getName());
      private static final String s_name = "deleteinstancegroupresponse";
@@@ -78,7 -75,7 +79,7 @@@
          boolean result = _userVmService.deleteVmGroup(this);
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete vm group");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vmgroup/ListVMGroupsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vmgroup/ListVMGroupsCmd.java
index 99aeaf8,6d58260..e9844dd
--- a/api/src/org/apache/cloudstack/api/command/user/vmgroup/ListVMGroupsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vmgroup/ListVMGroupsCmd.java
@@@ -26,7 -25,8 +26,8 @@@ import org.apache.cloudstack.api.Parame
  import org.apache.cloudstack.api.response.InstanceGroupResponse;
  import org.apache.cloudstack.api.response.ListResponse;
  
- @APICommand(name = "listInstanceGroups", description = "Lists vm groups", responseObject = InstanceGroupResponse.class, entityType = { IAMEntityType.InstanceGroup })
 -@APICommand(name = "listInstanceGroups", description = "Lists vm groups", responseObject = InstanceGroupResponse.class,
++@APICommand(name = "listInstanceGroups", description = "Lists vm groups", responseObject = InstanceGroupResponse.class, entityType = {IAMEntityType.InstanceGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListVMGroupsCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListVMGroupsCmd.class.getName());
  
@@@ -67,6 -67,6 +68,6 @@@
      public void execute() {
          ListResponse<InstanceGroupResponse> response = _queryService.searchForVmGroups(this);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vmgroup/UpdateVMGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vmgroup/UpdateVMGroupCmd.java
index d2f3b46,cc738cd..e06ec52
--- a/api/src/org/apache/cloudstack/api/command/user/vmgroup/UpdateVMGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vmgroup/UpdateVMGroupCmd.java
@@@ -32,7 -29,8 +32,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.user.Account;
  import com.cloud.vm.InstanceGroup;
  
- @APICommand(name = "updateInstanceGroup", description = "Updates a vm group", responseObject = InstanceGroupResponse.class, entityType = { IAMEntityType.InstanceGroup })
 -@APICommand(name = "updateInstanceGroup", description = "Updates a vm group", responseObject = InstanceGroupResponse.class,
++@APICommand(name = "updateInstanceGroup", description = "Updates a vm group", responseObject = InstanceGroupResponse.class, entityType = {IAMEntityType.InstanceGroup},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdateVMGroupCmd extends BaseCmd {
  
      private static final String s_name = "updateinstancegroupresponse";
@@@ -85,7 -83,7 +86,7 @@@
          if (result != null) {
              InstanceGroupResponse response = _responseGenerator.createInstanceGroupResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update vm instance group");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java
index 8f0a8c8,be78528..fae0e61
--- a/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java
@@@ -37,7 -34,8 +37,8 @@@ import com.cloud.exception.ResourceAllo
  import com.cloud.uservm.UserVm;
  import com.cloud.vm.snapshot.VMSnapshot;
  
- @APICommand(name = "createVMSnapshot", description = "Creates snapshot for a vm.", responseObject = VMSnapshotResponse.class, since = "4.2.0", entityType = { IAMEntityType.VMSnapshot })
 -@APICommand(name = "createVMSnapshot", description = "Creates snapshot for a vm.", responseObject = VMSnapshotResponse.class, since = "4.2.0",
++@APICommand(name = "createVMSnapshot", description = "Creates snapshot for a vm.", responseObject = VMSnapshotResponse.class, since = "4.2.0", entityType = {IAMEntityType.VMSnapshot},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateVMSnapshotCmd extends BaseAsyncCreateCmd {
  
      public static final Logger s_logger = Logger.getLogger(CreateVMSnapshotCmd.class.getName());
@@@ -91,7 -88,7 +92,7 @@@
      public void create() throws ResourceAllocationException {
          VMSnapshot vmsnapshot = _vmSnapshotService.allocVMSnapshot(getVmId(), getDisplayName(), getDescription(), snapshotMemory());
          if (vmsnapshot != null) {
--            this.setEntityId(vmsnapshot.getId());
++            setEntityId(vmsnapshot.getId());
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create vm snapshot");
          }
@@@ -114,7 -111,7 +115,7 @@@
          if (result != null) {
              VMSnapshotResponse response = _responseGenerator.createVMSnapshotResponse(result);
              response.setResponseName(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create vm snapshot due to an internal error creating snapshot for vm " + getVmId());
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/DeleteVMSnapshotCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vmsnapshot/DeleteVMSnapshotCmd.java
index 063ff77,bee8546..af076cf
--- a/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/DeleteVMSnapshotCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/DeleteVMSnapshotCmd.java
@@@ -36,7 -33,8 +36,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.user.Account;
  import com.cloud.vm.snapshot.VMSnapshot;
  
- @APICommand(name = "deleteVMSnapshot", description = "Deletes a vmsnapshot.", responseObject = SuccessResponse.class, since = "4.2.0", entityType = { IAMEntityType.VMSnapshot })
 -@APICommand(name = "deleteVMSnapshot", description = "Deletes a vmsnapshot.", responseObject = SuccessResponse.class, since = "4.2.0",
++@APICommand(name = "deleteVMSnapshot", description = "Deletes a vmsnapshot.", responseObject = SuccessResponse.class, since = "4.2.0", entityType = {IAMEntityType.VMSnapshot},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteVMSnapshotCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteVMSnapshotCmd.class.getName());
      private static final String s_name = "deletevmsnapshotresponse";
@@@ -73,7 -70,7 +74,7 @@@
          boolean result = _vmSnapshotService.deleteVMSnapshot(getId());
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete vm snapshot");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/ListVMSnapshotCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vmsnapshot/ListVMSnapshotCmd.java
index 7faed63,adebb6e..3167d09
--- a/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/ListVMSnapshotCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/ListVMSnapshotCmd.java
@@@ -31,7 -30,8 +31,8 @@@ import org.apache.cloudstack.api.respon
  
  import com.cloud.vm.snapshot.VMSnapshot;
  
- @APICommand(name = "listVMSnapshot", description = "List virtual machine snapshot by conditions", responseObject = VMSnapshotResponse.class, since = "4.2.0", entityType = { IAMEntityType.VMSnapshot })
 -@APICommand(name = "listVMSnapshot", description = "List virtual machine snapshot by conditions", responseObject = VMSnapshotResponse.class, since = "4.2.0",
++@APICommand(name = "listVMSnapshot", description = "List virtual machine snapshot by conditions", responseObject = VMSnapshotResponse.class, since = "4.2.0", entityType = {IAMEntityType.VMSnapshot},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListVMSnapshotCmd extends BaseListTaggedResourcesCmd {
  
      private static final String s_name = "listvmsnapshotresponse";
@@@ -76,7 -76,7 +77,7 @@@
          }
          response.setResponses(snapshotResponses);
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java
index 84916ce,91661f6..0ca5009
--- a/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java
@@@ -40,7 -37,8 +40,8 @@@ import com.cloud.user.Account
  import com.cloud.uservm.UserVm;
  import com.cloud.vm.snapshot.VMSnapshot;
  
- @APICommand(name = "revertToVMSnapshot", description = "Revert VM from a vmsnapshot.", responseObject = UserVmResponse.class, since = "4.2.0", responseView = ResponseView.Restricted)
 -@APICommand(name = "revertToVMSnapshot", description = "Revert VM from a vmsnapshot.", responseObject = UserVmResponse.class, since = "4.2.0",
++@APICommand(name = "revertToVMSnapshot", description = "Revert VM from a vmsnapshot.", responseObject = UserVmResponse.class, since = "4.2.0", responseView = ResponseView.Restricted,
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
  public class RevertToVMSnapshotCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RevertToVMSnapshotCmd.class.getName());
      private static final String s_name = "reverttovmsnapshotresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
index 9fdf2bc,78e1a69..553e2e9
--- a/api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
@@@ -36,7 -33,8 +36,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.storage.Volume;
  import com.cloud.user.Account;
  
- @APICommand(name = "attachVolume", description = "Attaches a disk volume to a virtual machine.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.VirtualMachine })
 -@APICommand(name = "attachVolume", description = "Attaches a disk volume to a virtual machine.", responseObject = VolumeResponse.class,
++@APICommand(name = "attachVolume", description = "Attaches a disk volume to a virtual machine.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class AttachVolumeCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(AttachVolumeCmd.class.getName());
      private static final String s_name = "attachvolumeresponse";
@@@ -108,8 -108,17 +109,17 @@@
      }
  
      @Override
+     public boolean isDisplayResourceEnabled(){
+         Volume volume = _responseGenerator.findVolumeById(getId());
+         if (volume == null) {
+             return true; // bad id given, parent this command to true so ERROR events are tracked
+         }
+         return volume.isDisplayVolume();
+     }
+ 
+     @Override
      public String getEventDescription() {
 -        return "attaching volume: " + getId() + " to vm: " + getVirtualMachineId();
 +        return  "attaching volume: " + getId() + " to vm: " + getVirtualMachineId();
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
index 5939ca6,555711b..ad06bc2
--- a/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
@@@ -16,9 -16,7 +16,10 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.volume;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
@@@ -42,7 -40,10 +43,8 @@@ import com.cloud.exception.ResourceAllo
  import com.cloud.storage.Snapshot;
  import com.cloud.storage.Volume;
  
- @APICommand(name = "createVolume", responseObject = VolumeResponse.class, description = "Creates a disk volume from a disk offering. This disk volume must still be attached to a virtual machine to make use of it.", responseView = ResponseView.Restricted, entityType = { IAMEntityType.Volume })
 -@APICommand(name = "createVolume",
 -            responseObject = VolumeResponse.class,
 -            description = "Creates a disk volume from a disk offering. This disk volume must still be attached to a virtual machine to make use of it.",
++@APICommand(name = "createVolume", responseObject = VolumeResponse.class, description = "Creates a disk volume from a disk offering. This disk volume must still be attached to a virtual machine to make use of it.", responseView = ResponseView.Restricted, entityType = {IAMEntityType.Volume},
+             requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateVolumeCmd extends BaseAsyncCreateCustomIdCmd {
      public static final Logger s_logger = Logger.getLogger(CreateVolumeCmd.class.getName());
      private static final String s_name = "createvolumeresponse";
@@@ -191,8 -196,13 +197,13 @@@
      }
  
      @Override
+     public boolean isDisplayResourceEnabled(){
+         return getDisplayVolume();
+     }
+ 
+     @Override
      public String getEventDescription() {
 -        return "creating volume: " + getVolumeName() + ((getSnapshotId() == null) ? "" : " from snapshot: " + getSnapshotId());
 +        return  "creating volume: " + getVolumeName() + ((getSnapshotId() == null) ? "" : " from snapshot: " + getSnapshotId());
      }
  
      @Override
@@@ -210,9 -220,10 +221,10 @@@
      @Override
      public void execute() {
          CallContext.current().setEventDetails("Volume Id: " + getEntityId() + ((getSnapshotId() == null) ? "" : " from snapshot: " + getSnapshotId()));
+         CallContext.current().setEventDisplayEnabled(getDisplayVolume());
          Volume volume = _volumeService.createVolume(this);
          if (volume != null) {
 -            VolumeResponse response = _responseGenerator.createVolumeResponse(volume);
 +            VolumeResponse response = _responseGenerator.createVolumeResponse(ResponseView.Restricted, volume);
              //FIXME - have to be moved to ApiResponseHelper
              if (getSnapshotId() != null) {
                  Snapshot snap = _entityMgr.findById(Snapshot.class, getSnapshotId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
index bb17bd9,2c66dea..546a9d5
--- a/api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
@@@ -34,7 -32,8 +34,8 @@@ import com.cloud.exception.ConcurrentOp
  import com.cloud.storage.Volume;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteVolume", description = "Deletes a detached disk volume.", responseObject = SuccessResponse.class, entityType = { IAMEntityType.Volume })
 -@APICommand(name = "deleteVolume", description = "Deletes a detached disk volume.", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteVolume", description = "Deletes a detached disk volume.", responseObject = SuccessResponse.class, entityType = {IAMEntityType.Volume},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteVolumeCmd extends BaseCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteVolumeCmd.class.getName());
      private static final String s_name = "deletevolumeresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
index c7419fc,2b87ff8..1a874e1
--- a/api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
@@@ -37,7 -34,8 +37,8 @@@ import com.cloud.storage.Volume
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
- @APICommand(name = "detachVolume", description = "Detaches a disk volume from a virtual machine.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Volume })
 -@APICommand(name = "detachVolume", description = "Detaches a disk volume from a virtual machine.", responseObject = VolumeResponse.class,
++@APICommand(name = "detachVolume", description = "Detaches a disk volume from a virtual machine.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.Volume},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DetachVolumeCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DetachVolumeCmd.class.getName());
      private static final String s_name = "detachvolumeresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
index fef35dc,da466fd..b9883cc
--- a/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
@@@ -39,7 -36,8 +39,8 @@@ import com.cloud.storage.Upload
  import com.cloud.storage.Volume;
  import com.cloud.user.Account;
  
- @APICommand(name = "extractVolume", description = "Extracts volume", responseObject = ExtractResponse.class, entityType = { IAMEntityType.Volume })
 -@APICommand(name = "extractVolume", description = "Extracts volume", responseObject = ExtractResponse.class,
++@APICommand(name = "extractVolume", description = "Extracts volume", responseObject = ExtractResponse.class, entityType = {IAMEntityType.Volume},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ExtractVolumeCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(ExtractVolumeCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
index 24425cb,04c68fe..b4ac4ae
--- a/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
@@@ -15,16 -15,14 +15,18 @@@
  // specific language governing permissions and limitations
  // under the License.
  package org.apache.cloudstack.api.command.user.volume;
+ 
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
  import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
+ import org.apache.cloudstack.api.response.DiskOfferingResponse;
  import org.apache.cloudstack.api.response.HostResponse;
  import org.apache.cloudstack.api.response.ListResponse;
  import org.apache.cloudstack.api.response.PodResponse;
@@@ -32,11 -30,10 +34,9 @@@ import org.apache.cloudstack.api.respon
  import org.apache.cloudstack.api.response.UserVmResponse;
  import org.apache.cloudstack.api.response.VolumeResponse;
  import org.apache.cloudstack.api.response.ZoneResponse;
 -import org.apache.log4j.Logger;
  
- 
- 
- 
- @APICommand(name = "listVolumes", description = "Lists all volumes.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Volume })
 -@APICommand(name = "listVolumes", description = "Lists all volumes.", responseObject = VolumeResponse.class,
++@APICommand(name = "listVolumes", description = "Lists all volumes.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Volume },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListVolumesCmd extends BaseListTaggedResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListVolumesCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
index bbd754a,47bf26f..820d73d
--- a/api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
@@@ -31,8 -29,8 +31,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.storage.Volume;
  import com.cloud.user.Account;
  
- 
- @APICommand(name = "migrateVolume", description = "Migrate volume", responseObject = VolumeResponse.class, since = "3.0.0", responseView = ResponseView.Restricted, entityType = { IAMEntityType.Volume })
 -@APICommand(name = "migrateVolume", description = "Migrate volume", responseObject = VolumeResponse.class, since = "3.0.0",
++@APICommand(name = "migrateVolume", description = "Migrate volume", responseObject = VolumeResponse.class, since = "3.0.0", responseView = ResponseView.Restricted, entityType = {IAMEntityType.Volume},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class MigrateVolumeCmd extends BaseAsyncCmd {
      private static final String s_name = "migratevolumeresponse";
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
index 0e7d27d,a95c95b..2f34c75
--- a/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
@@@ -15,10 -15,7 +15,11 @@@
  // specific language governing permissions and limitations
  // under the License.
  package org.apache.cloudstack.api.command.user.volume;
 +import org.apache.log4j.Logger;
+ 
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
@@@ -30,6 -26,8 +31,7 @@@ import org.apache.cloudstack.api.Server
  import org.apache.cloudstack.api.response.DiskOfferingResponse;
  import org.apache.cloudstack.api.response.VolumeResponse;
  import org.apache.cloudstack.context.CallContext;
 -import org.apache.log4j.Logger;
+ 
  import com.cloud.event.EventTypes;
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.exception.PermissionDeniedException;
@@@ -38,8 -36,8 +40,9 @@@ import com.cloud.projects.Project
  import com.cloud.storage.Volume;
  import com.cloud.user.Account;
  
 -@APICommand(name = "resizeVolume", description = "Resizes a volume", responseObject = VolumeResponse.class,
 +
- @APICommand(name = "resizeVolume", description = "Resizes a volume", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Volume })
++@APICommand(name = "resizeVolume", description = "Resizes a volume", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.Volume},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ResizeVolumeCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(ResizeVolumeCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/volume/UpdateVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/UpdateVolumeCmd.java
index d5b23ab,2d2b215..d9fa82e
--- a/api/src/org/apache/cloudstack/api/command/user/volume/UpdateVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/UpdateVolumeCmd.java
@@@ -16,11 -16,7 +16,12 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.volume;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
@@@ -37,7 -33,8 +38,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.storage.Volume;
  
- @APICommand(name = "updateVolume", description = "Updates the volume.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Volume })
 -@APICommand(name = "updateVolume", description = "Updates the volume.", responseObject = VolumeResponse.class,
++@APICommand(name = "updateVolume", description = "Updates the volume.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Volume },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdateVolumeCmd extends BaseAsyncCustomIdCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateVolumeCmd.class.getName());
      private static final String s_name = "updatevolumeresponse";
@@@ -145,9 -147,10 +153,10 @@@
      @Override
      public void execute() {
          CallContext.current().setEventDetails("Volume Id: " + getId());
-         Volume result = _volumeService.updateVolume(getId(), getPath(), getState(), getStorageId(), getDisplayVolume(), getCustomId(), getEntityOwnerId());
+         Volume result = _volumeService.updateVolume(getId(), getPath(), getState(), getStorageId(), getDisplayVolume(),
+                 getCustomId(), getEntityOwnerId(), getChainInfo());
          if (result != null) {
 -            VolumeResponse response = _responseGenerator.createVolumeResponse(result);
 +            VolumeResponse response = _responseGenerator.createVolumeResponse(ResponseView.Restricted, result);
              response.setResponseName(getCommandName());
              setResponseObject(response);
          } else {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
index 608bde5,2d97ec9..949e6df
--- a/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
@@@ -40,7 -38,8 +40,8 @@@ import com.cloud.exception.ResourceAllo
  import com.cloud.exception.ResourceUnavailableException;
  import com.cloud.storage.Volume;
  
- @APICommand(name = "uploadVolume", description = "Uploads a data disk.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Volume })
 -@APICommand(name = "uploadVolume", description = "Uploads a data disk.", responseObject = VolumeResponse.class,
++@APICommand(name = "uploadVolume", description = "Uploads a data disk.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.Volume},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UploadVolumeCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(UploadVolumeCmd.class.getName());
      private static final String s_name = "uploadvolumeresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java
index 0bbe8cb,7df5e37..f2c9e2c
--- a/api/src/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java
@@@ -40,7 -39,8 +40,8 @@@ import com.cloud.network.vpc.StaticRout
  import com.cloud.network.vpc.Vpc;
  import com.cloud.network.vpc.VpcGateway;
  
- @APICommand(name = "createStaticRoute", description = "Creates a static route", responseObject = StaticRouteResponse.class, entityType = { IAMEntityType.StaticRoute })
 -@APICommand(name = "createStaticRoute", description = "Creates a static route", responseObject = StaticRouteResponse.class,
++@APICommand(name = "createStaticRoute", description = "Creates a static route", responseObject = StaticRouteResponse.class, entityType = {IAMEntityType.StaticRoute},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateStaticRouteCmd extends BaseAsyncCreateCmd {
      private static final String s_name = "createstaticrouteresponse";
      public static final Logger s_logger = Logger.getLogger(CreateStaticRouteCmd.class.getName());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java
index 42eeb62,62fa29f..5cd1f6e
--- a/api/src/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java
@@@ -16,9 -16,7 +16,10 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vpc;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
@@@ -40,8 -38,9 +41,9 @@@ import com.cloud.exception.ResourceAllo
  import com.cloud.exception.ResourceUnavailableException;
  import com.cloud.network.vpc.Vpc;
  
- @APICommand(name = "createVPC", description = "Creates a VPC", responseObject = VpcResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Vpc })
- public class CreateVPCCmd extends BaseAsyncCreateCmd{
 -@APICommand(name = "createVPC", description = "Creates a VPC", responseObject = VpcResponse.class,
++@APICommand(name = "createVPC", description = "Creates a VPC", responseObject = VpcResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.Vpc},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+ public class CreateVPCCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(CreateVPCCmd.class.getName());
      private static final String s_name = "createvpcresponse";
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpc/DeleteStaticRouteCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpc/DeleteStaticRouteCmd.java
index b59ba93,dfa4910..0017753
--- a/api/src/org/apache/cloudstack/api/command/user/vpc/DeleteStaticRouteCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpc/DeleteStaticRouteCmd.java
@@@ -38,7 -35,8 +38,8 @@@ import com.cloud.exception.InvalidParam
  import com.cloud.exception.ResourceUnavailableException;
  import com.cloud.network.vpc.StaticRoute;
  
- @APICommand(name = "deleteStaticRoute", description = "Deletes a static route", responseObject = SuccessResponse.class, entityType = { IAMEntityType.StaticRoute })
 -@APICommand(name = "deleteStaticRoute", description = "Deletes a static route", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteStaticRoute", description = "Deletes a static route", responseObject = SuccessResponse.class, entityType = {IAMEntityType.StaticRoute},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteStaticRouteCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteStaticRouteCmd.class.getName());
      private static final String s_name = "deletestaticrouteresponse";
@@@ -100,7 -98,7 +101,7 @@@
  
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
--            this.setResponseObject(response);
++            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete static route");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpc/DeleteVPCCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpc/DeleteVPCCmd.java
index ab4a447,94ad9e4..5928aab
--- a/api/src/org/apache/cloudstack/api/command/user/vpc/DeleteVPCCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpc/DeleteVPCCmd.java
@@@ -36,7 -33,8 +36,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.network.vpc.Vpc;
  import com.cloud.user.Account;
  
- @APICommand(name = "deleteVPC", description = "Deletes a VPC", responseObject = SuccessResponse.class, entityType = { IAMEntityType.Vpc })
 -@APICommand(name = "deleteVPC", description = "Deletes a VPC", responseObject = SuccessResponse.class,
++@APICommand(name = "deleteVPC", description = "Deletes a VPC", responseObject = SuccessResponse.class, entityType = {IAMEntityType.Vpc},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class DeleteVPCCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(DeleteVPCCmd.class.getName());
      private static final String s_name = "deletevpcresponse";
@@@ -76,7 -74,7 +77,7 @@@
              boolean result = _vpcService.deleteVpc(getId());
              if (result) {
                  SuccessResponse response = new SuccessResponse(getCommandName());
--                this.setResponseObject(response);
++                setResponseObject(response);
              } else {
                  throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete VPC");
              }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpc/ListPrivateGatewaysCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpc/ListPrivateGatewaysCmd.java
index 03f51f5,ff2d0bc..160355a
--- a/api/src/org/apache/cloudstack/api/command/user/vpc/ListPrivateGatewaysCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpc/ListPrivateGatewaysCmd.java
@@@ -33,7 -32,8 +33,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.vpc.PrivateGateway;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listPrivateGateways", description = "List private gateways", responseObject = PrivateGatewayResponse.class, entityType = { IAMEntityType.VpcGateway })
 -@APICommand(name = "listPrivateGateways", description = "List private gateways", responseObject = PrivateGatewayResponse.class,
++@APICommand(name = "listPrivateGateways", description = "List private gateways", responseObject = PrivateGatewayResponse.class, entityType = {IAMEntityType.VpcGateway},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListPrivateGatewaysCmd extends BaseListProjectAndAccountResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListPrivateGatewaysCmd.class.getName());
  
@@@ -101,6 -101,6 +102,6 @@@
          response.setResponses(projectResponses, gateways.second());
          response.setResponseName(getCommandName());
  
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpc/ListStaticRoutesCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpc/ListStaticRoutesCmd.java
index 215ae9f,83865ca..b2cdf87
--- a/api/src/org/apache/cloudstack/api/command/user/vpc/ListStaticRoutesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpc/ListStaticRoutesCmd.java
@@@ -32,7 -31,8 +32,8 @@@ import org.apache.cloudstack.api.respon
  import com.cloud.network.vpc.StaticRoute;
  import com.cloud.utils.Pair;
  
- @APICommand(name = "listStaticRoutes", description = "Lists all static routes", responseObject = StaticRouteResponse.class, entityType = { IAMEntityType.StaticRoute })
 -@APICommand(name = "listStaticRoutes", description = "Lists all static routes", responseObject = StaticRouteResponse.class,
++@APICommand(name = "listStaticRoutes", description = "Lists all static routes", responseObject = StaticRouteResponse.class, entityType = {IAMEntityType.StaticRoute},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class ListStaticRoutesCmd extends BaseListTaggedResourcesCmd {
      private static final String s_name = "liststaticroutesresponse";
  
@@@ -80,7 -80,7 +81,7 @@@
          }
          response.setResponses(routeResponses, result.second());
          response.setResponseName(getCommandName());
--        this.setResponseObject(response);
++        setResponseObject(response);
      }
  
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpc/ListVPCsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpc/ListVPCsCmd.java
index bbd07d6,69a8693..fa60f6f
--- a/api/src/org/apache/cloudstack/api/command/user/vpc/ListVPCsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpc/ListVPCsCmd.java
@@@ -19,9 -19,7 +19,10 @@@ package org.apache.cloudstack.api.comma
  import java.util.ArrayList;
  import java.util.List;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
@@@ -34,9 -31,10 +35,10 @@@ import org.apache.cloudstack.api.respon
  
  import com.cloud.network.vpc.Vpc;
  
 -@APICommand(name = "listVPCs", description = "Lists VPCs", responseObject = VpcResponse.class,
 +
- @APICommand(name = "listVPCs", description = "Lists VPCs", responseObject = VpcResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Vpc })
- public class ListVPCsCmd extends BaseListTaggedResourcesCmd{
++@APICommand(name = "listVPCs", description = "Lists VPCs", responseObject = VpcResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Vpc },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+ public class ListVPCsCmd extends BaseListTaggedResourcesCmd {
      public static final Logger s_logger = Logger.getLogger(ListVPCsCmd.class.getName());
      private static final String s_name = "listvpcsresponse";
  
@@@ -117,10 -126,10 +130,10 @@@
  
      @Override
      public void execute() {
-         List<? extends Vpc> vpcs = _vpcService.listVpcs(getId(), getVpcName(), getDisplayText(),
-                 getSupportedServices(), getCidr(), getVpcOffId(), getState(), getAccountName(), getDomainId(),
-                 getKeyword(), getStartIndex(), getPageSizeVal(), getZoneId(), isRecursive(),
-                 listAll(), getRestartRequired(), getTags(), getProjectId());
+         List<? extends Vpc> vpcs =
+             _vpcService.listVpcs(getId(), getVpcName(), getDisplayText(), getSupportedServices(), getCidr(), getVpcOffId(), getState(), getAccountName(), getDomainId(),
 -                this.getKeyword(), this.getStartIndex(), this.getPageSizeVal(), getZoneId(), this.isRecursive(), this.listAll(), getRestartRequired(), getTags(),
++                getKeyword(), getStartIndex(), getPageSizeVal(), getZoneId(), isRecursive(), listAll(), getRestartRequired(), getTags(),
+                 getProjectId(), getDisplay());
          ListResponse<VpcResponse> response = new ListResponse<VpcResponse>();
          List<VpcResponse> offeringResponses = new ArrayList<VpcResponse>();
          for (Vpc vpc : vpcs) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java
index cb395ee,f68760b..d1d805a
--- a/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java
@@@ -37,7 -34,8 +37,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.network.vpc.Vpc;
  import com.cloud.user.Account;
  
- @APICommand(name = "restartVPC", description = "Restarts a VPC", responseObject = VpcResponse.class, entityType = { IAMEntityType.Vpc })
 -@APICommand(name = "restartVPC", description = "Restarts a VPC", responseObject = VpcResponse.class,
++@APICommand(name = "restartVPC", description = "Restarts a VPC", responseObject = VpcResponse.class, entityType = {IAMEntityType.Vpc},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class RestartVPCCmd extends BaseAsyncCmd {
      public static final Logger s_logger = Logger.getLogger(RestartVPCCmd.class.getName());
      private static final String Name = "restartvpcresponse";
@@@ -81,7 -79,7 +82,7 @@@
              boolean result = _vpcService.restartVpc(getId());
              if (result) {
                  SuccessResponse response = new SuccessResponse(getCommandName());
--                this.setResponseObject(response);
++                setResponseObject(response);
              } else {
                  throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to restart VPC");
              }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpc/UpdateVPCCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpc/UpdateVPCCmd.java
index a081b9f,f0b9814..7624423
--- a/api/src/org/apache/cloudstack/api/command/user/vpc/UpdateVPCCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpc/UpdateVPCCmd.java
@@@ -16,11 -16,7 +16,12 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vpc;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
@@@ -35,7 -31,8 +36,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.vpc.Vpc;
  import com.cloud.user.Account;
  
- @APICommand(name = "updateVPC", description = "Updates a VPC", responseObject = VpcResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Vpc })
 -@APICommand(name = "updateVPC", description = "Updates a VPC", responseObject = VpcResponse.class,
++@APICommand(name = "updateVPC", description = "Updates a VPC", responseObject = VpcResponse.class, responseView = ResponseView.Restricted, entityType = { IAMEntityType.Vpc },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class UpdateVPCCmd extends BaseAsyncCustomIdCmd {
      public static final Logger s_logger = Logger.getLogger(UpdateVPCCmd.class.getName());
      private static final String Name = "updatevpcresponse";
@@@ -89,11 -93,11 +98,11 @@@
  
      @Override
      public void execute() {
-         Vpc result = _vpcService.updateVpc(getId(), getVpcName(), getDisplayText(), getCustomId());
 -        Vpc result = _vpcService.updateVpc(getId(), getVpcName(), getDisplayText(), this.getCustomId(), getDisplayVpc());
++        Vpc result = _vpcService.updateVpc(getId(), getVpcName(), getDisplayText(), getCustomId(), getDisplayVpc());
          if (result != null) {
 -            VpcResponse response = _responseGenerator.createVpcResponse(result);
 +            VpcResponse response = _responseGenerator.createVpcResponse(ResponseView.Restricted, result);
              response.setResponseName(getCommandName());
 -            this.setResponseObject(response);
 +            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update VPC");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java
index 48ee1fd,45d8703..d057629
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java
@@@ -35,7 -34,8 +35,8 @@@ import com.cloud.event.EventTypes
  import com.cloud.network.VpnUser;
  import com.cloud.user.Account;
  
- @APICommand(name = "addVpnUser", description = "Adds vpn users", responseObject = VpnUsersResponse.class, entityType = { IAMEntityType.VpnUser })
 -@APICommand(name = "addVpnUser", description = "Adds vpn users", responseObject = VpnUsersResponse.class,
++@APICommand(name = "addVpnUser", description = "Adds vpn users", responseObject = VpnUsersResponse.class, entityType = {IAMEntityType.VpnUser},
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class AddVpnUserCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(AddVpnUserCmd.class.getName());
  
@@@ -136,7 -136,7 +137,7 @@@
  
          vpnResponse.setResponseName(getCommandName());
          vpnResponse.setObjectName("vpnuser");
--        this.setResponseObject(vpnResponse);
++        setResponseObject(vpnResponse);
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/48e08fe6/api/src/org/apache/cloudstack/api/command/user/vpn/CreateRemoteAccessVpnCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vpn/CreateRemoteAccessVpnCmd.java
index b350f3b,7f56353..4df2134
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/CreateRemoteAccessVpnCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/CreateRemoteAccessVpnCmd.java
@@@ -16,9 -16,7 +16,10 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vpn;
  
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
@@@ -37,7 -36,8 +38,8 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.network.IpAddress;
  import com.cloud.network.RemoteAccessVpn;
  
- @APICommand(name = "createRemoteAccessVpn", description = "Creates a l2tp/ipsec remote access vpn", responseObject = RemoteAccessVpnResponse.class, entityType = { IAMEntityType.RemoteAccessVpn })
 -@APICommand(name = "createRemoteAccessVpn", description = "Creates a l2tp/ipsec remote access vpn", responseObject = RemoteAccessVpnResponse.class,
++@APICommand(name = "createRemoteAccessVpn", description = "Creates a l2tp/ipsec remote access vpn", responseObject = RemoteAccessVpnResponse.class, entityType = { IAMEntityType.RemoteAccessVpn },
+         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
  public class CreateRemoteAccessVpnCmd extends BaseAsyncCreateCmd {
      public static final Logger s_logger = Logger.getLogger(CreateRemoteAccessVpnCmd.class.getName());
  
@@@ -140,13 -144,13 +146,13 @@@
      @Override
      public void create() {
          try {
-             RemoteAccessVpn vpn = _ravService.createRemoteAccessVpn(publicIpId, ipRange, getOpenFirewall());
+             RemoteAccessVpn vpn = _ravService.createRemoteAccessVpn(publicIpId, ipRange, getOpenFirewall(), getDisplay());
              if (vpn != null) {
--                this.setEntityId(vpn.getServerAddressId());
++                setEntityId(vpn.getServerAddressId());
                  // find uuid for server ip address
                  IpAddress ipAddr = _entityMgr.findById(IpAddress.class, vpn.getServerAddressId());
                  if (ipAddr != null) {
--                    this.setEntityUuid(ipAddr.getUuid());
++                    setEntityUuid(ipAddr.getUuid());
                  }
              } else {
                  throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create remote access vpn");
@@@ -165,7 -169,7 +171,7 @@@
              if (result != null) {
                  RemoteAccessVpnResponse response = _responseGenerator.createRemoteAccessVpnResponse(result);
                  response.setResponseName(getCommandName());
--                this.setResponseObject(response);
++                setResponseObject(response);
              } else {
                  throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create remote access vpn");
              }


[30/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
HA manager to check target state of the VM to make decisions on whether or not to carry on a cheduled step. Fix NPE in capacity manager when releasing capacity of a stopped VM.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/4312d884
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/4312d884
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/4312d884

Branch: refs/heads/distributedrouter
Commit: 4312d884629d4a9e7716da4c869433cdaa8181b8
Parents: 3d5fbe7
Author: Kelven Yang <ke...@gmail.com>
Authored: Tue Mar 4 16:43:26 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Mar 13 16:59:56 2014 -0700

----------------------------------------------------------------------
 server/src/com/cloud/capacity/CapacityManagerImpl.java   | 5 +++++
 server/src/com/cloud/ha/HighAvailabilityManagerImpl.java | 2 ++
 2 files changed, 7 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4312d884/server/src/com/cloud/capacity/CapacityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/capacity/CapacityManagerImpl.java b/server/src/com/cloud/capacity/CapacityManagerImpl.java
index 957a5d0..69e8cfa 100755
--- a/server/src/com/cloud/capacity/CapacityManagerImpl.java
+++ b/server/src/com/cloud/capacity/CapacityManagerImpl.java
@@ -188,6 +188,11 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
         Long clusterId = null;
         if (hostId != null) {
             HostVO host = _hostDao.findById(hostId);
+            if (host == null) {
+                s_logger.warn("Host " + hostId + " no long exist anymore!");
+                return true;
+            }
+
             clusterId = host.getClusterId();
         }
         if (capacityCpu == null || capacityMemory == null || svo == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4312d884/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
index 3bcaf2e..8bd569a 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -701,6 +701,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
                         (vm.getHostId() != null ? vm.getHostId() : "none") + " State: " + vm.getState());
                     return null;
                 }
+
                 _itMgr.advanceStop(vm.getUuid(), false);
                 s_logger.info("Stop for " + vm + " was successful");
                 return null;
@@ -711,6 +712,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
                         (vm.getHostId() != null ? vm.getHostId() : "none") + " State: " + vm.getState());
                     return null;
                 }
+
                 _itMgr.advanceStop(vm.getUuid(), true);
                 s_logger.info("Stop for " + vm + " was successful");
                 return null;


[14/54] [abbrv] Merge branch 'master' into rbac.

Posted by mu...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/api/ApiDispatcher.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiDispatcher.java
index 4bc6578,27ff952..95074e2
--- a/server/src/com/cloud/api/ApiDispatcher.java
+++ b/server/src/com/cloud/api/ApiDispatcher.java
@@@ -33,14 -21,10 +21,13 @@@ import java.util.Map
  import javax.annotation.PostConstruct;
  import javax.inject.Inject;
  
 -import com.cloud.event.EventTypes;
 -import com.cloud.utils.ReflectUtil;
 -import com.cloud.vm.VirtualMachine;
++import org.apache.log4j.Logger;
++
 +import org.apache.cloudstack.acl.ControlledEntity;
 +import org.apache.cloudstack.acl.InfrastructureEntity;
- import org.apache.cloudstack.acl.RoleType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
- import org.apache.cloudstack.api.ACL;
 +import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
- import org.apache.cloudstack.api.ApiErrorCode;
  import org.apache.cloudstack.api.BaseAsyncCmd;
  import org.apache.cloudstack.api.BaseAsyncCreateCmd;
  import org.apache.cloudstack.api.BaseAsyncCustomIdCmd;
@@@ -50,43 -33,26 +36,33 @@@ import org.apache.cloudstack.api.BaseCu
  import org.apache.cloudstack.context.CallContext;
  import org.apache.cloudstack.framework.jobs.AsyncJob;
  import org.apache.cloudstack.framework.jobs.AsyncJobManager;
--import org.apache.log4j.Logger;
  
- import com.cloud.exception.InvalidParameterValueException;
+ import com.cloud.api.dispatch.DispatchChain;
+ import com.cloud.api.dispatch.DispatchChainFactory;
+ import com.cloud.api.dispatch.DispatchTask;
++import com.cloud.event.EventTypes;
 +import com.cloud.user.Account;
 +import com.cloud.user.AccountManager;
- import com.cloud.utils.DateUtil;
 +import com.cloud.utils.ReflectUtil;
- import com.cloud.utils.db.EntityManager;
- import com.cloud.utils.exception.CSExceptionErrorCode;
- import com.cloud.utils.exception.CloudRuntimeException;
++import com.cloud.vm.VirtualMachine;
  
  public class ApiDispatcher {
      private static final Logger s_logger = Logger.getLogger(ApiDispatcher.class.getName());
  
      Long _createSnapshotQueueSizeLimit;
+ 
      @Inject
-     AsyncJobManager _asyncMgr = null;
-     @Inject
-     AccountManager _accountMgr = null;
+     AsyncJobManager _asyncMgr;
+ 
 +    @Inject
-     EntityManager _entityMgr = null;
++    AccountManager _accountMgr;
 +
-     private static ApiDispatcher s_instance;
+     @Inject()
+     protected DispatchChainFactory dispatchChainFactory;
  
-     public static ApiDispatcher getInstance() {
-         return s_instance;
-     }
+     protected DispatchChain standardDispatchChain;
+ 
+     protected DispatchChain asyncCreationDispatchChain;
  
      public ApiDispatcher() {
      }
@@@ -100,41 -67,37 +77,54 @@@
          _createSnapshotQueueSizeLimit = snapshotLimit;
      }
  
-     public void dispatchCreateCmd(BaseAsyncCreateCmd cmd, Map<String, String> params) throws Exception {
-         processParameters(cmd, params);
-         CallContext.current().setEventDisplayEnabled(cmd.isDisplayResourceEnabled());
-         cmd.create();
  
+     public void dispatchCreateCmd(final BaseAsyncCreateCmd cmd, final Map<String, String> params) throws Exception {
+         asyncCreationDispatchChain.dispatch(new DispatchTask(cmd, params));
+         CallContext.current().setEventDisplayEnabled(cmd.isDisplayResourceEnabled());
      }
  
 +    private void doAccessChecks(BaseCmd cmd, Map<Object, AccessType> entitiesToAccess) {
 +        Account caller = CallContext.current().getCallingAccount();
 +
 +        APICommand commandAnnotation = cmd.getClass().getAnnotation(APICommand.class);
 +        String apiName = commandAnnotation != null ? commandAnnotation.name() : null;
 +
 +        if (!entitiesToAccess.isEmpty()) {
 +            for (Object entity : entitiesToAccess.keySet()) {
 +                if (entity instanceof ControlledEntity) {
 +                    _accountMgr.checkAccess(caller, entitiesToAccess.get(entity), false, apiName, (ControlledEntity) entity);
 +                } else if (entity instanceof InfrastructureEntity) {
 +                    //FIXME: Move this code in adapter, remove code from Account manager
 +                }
 +            }
 +        }
 +    }
 +
-     public void dispatch(BaseCmd cmd, Map<String, String> params, boolean execute) throws Exception {
-         processParameters(cmd, params);
-         CallContext ctx = CallContext.current();
+     public void dispatch(final BaseCmd cmd, final Map<String, String> params, final boolean execute) throws Exception {
+         // Let the chain of responsibility dispatch gradually
+         standardDispatchChain.dispatch(new DispatchTask(cmd, params));
+ 
+         final CallContext ctx = CallContext.current();
          ctx.setEventDisplayEnabled(cmd.isDisplayResourceEnabled());
  
+         // TODO This if shouldn't be here. Use polymorphism and move it to validateSpecificParameters
          if (cmd instanceof BaseAsyncCmd) {
  
-             BaseAsyncCmd asyncCmd = (BaseAsyncCmd)cmd;
-             String startEventId = params.get("ctxStartEventId");
+             final BaseAsyncCmd asyncCmd = (BaseAsyncCmd)cmd;
+             final String startEventId = params.get(ApiConstants.CTX_START_EVENT_ID);
+             String uuid = params.get(ApiConstants.UUID);
              ctx.setStartEventId(Long.valueOf(startEventId));
  
+             // Fow now use the key from EventTypes.java rather than getInstanceType bcz the later doesn't refer to the interfaces
+             // Add the resource id in the call context, also add some other first class object ids (for now vm) if available.
+             // TODO - this should be done for all the uuids passed in the cmd - so should be moved where uuid to id conversion happens.
+             if(EventTypes.getEntityForEvent(asyncCmd.getEventType()) != null){
+                 ctx.putContextParameter(EventTypes.getEntityForEvent(asyncCmd.getEventType()), uuid);
+             }
+             if(params.get(ApiConstants.VIRTUAL_MACHINE_ID) != null){
+                 ctx.putContextParameter(ReflectUtil.getEntityName(VirtualMachine.class), params.get(ApiConstants.VIRTUAL_MACHINE_ID));
+             }
+ 
              // Synchronise job on the object if needed
              if (asyncCmd.getJob() != null && asyncCmd.getSyncObjId() != null && asyncCmd.getSyncObjType() != null) {
                  Long queueSizeLimit = null;
@@@ -163,392 -127,6 +154,6 @@@
          }
  
          cmd.execute();
- 
--    }
- 
-     @SuppressWarnings({"unchecked", "rawtypes"})
-     public static void processParameters(BaseCmd cmd, Map<String, String> params) {
-         Map<Object, AccessType> entitiesToAccess = new HashMap<Object, AccessType>();
-         Map<String, Object> unpackedParams = cmd.unpackParams(params);
- 
-         if (cmd instanceof BaseListCmd) {
-             Object pageSizeObj = unpackedParams.get(ApiConstants.PAGE_SIZE);
-             Long pageSize = null;
-             if (pageSizeObj != null) {
-                 pageSize = Long.valueOf((String)pageSizeObj);
-             }
- 
-             if ((unpackedParams.get(ApiConstants.PAGE) == null) && (pageSize != null && !pageSize.equals(BaseListCmd.s_pageSizeUnlimited))) {
-                 ServerApiException ex = new ServerApiException(ApiErrorCode.PARAM_ERROR, "\"page\" parameter is required when \"pagesize\" is specified");
-                 ex.setCSErrorCode(CSExceptionErrorCode.getCSErrCode(ex.getClass().getName()));
-                 throw ex;
-             } else if (pageSize == null && (unpackedParams.get(ApiConstants.PAGE) != null)) {
-                 throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "\"pagesize\" parameter is required when \"page\" is specified");
-             }
-         }
- 
-         List<Field> fields = ReflectUtil.getAllFieldsForClass(cmd.getClass(), BaseCmd.class);
- 
-         for (Field field : fields) {
-             Parameter parameterAnnotation = field.getAnnotation(Parameter.class);
-             if ((parameterAnnotation == null) || !parameterAnnotation.expose()) {
-                 continue;
-             }
- 
-             //TODO: Annotate @Validate on API Cmd classes, FIXME how to process Validate
-             RoleType[] allowedRoles = parameterAnnotation.authorized();
-             if (allowedRoles.length > 0) {
-                 boolean permittedParameter = false;
-                 Account caller = CallContext.current().getCallingAccount();
-                 for (RoleType allowedRole : allowedRoles) {
-                     if (allowedRole.getValue() == caller.getType()) {
-                         permittedParameter = true;
-                         break;
-                     }
-                 }
-                 if (!permittedParameter) {
-                     s_logger.debug("Ignoring paremeter " + parameterAnnotation.name() + " as the caller is not authorized to pass it in");
-                     continue;
-                 }
-             }
- 
-             Object paramObj = unpackedParams.get(parameterAnnotation.name());
-             if (paramObj == null) {
-                 if (parameterAnnotation.required()) {
-                     throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to execute API command " +
-                         cmd.getCommandName().substring(0, cmd.getCommandName().length() - 8) + " due to missing parameter " + parameterAnnotation.name());
-                 }
-                 continue;
-             }
- 
-             // marshall the parameter into the correct type and set the field value
-             try {
-                 setFieldValue(field, cmd, paramObj, parameterAnnotation);
-             } catch (IllegalArgumentException argEx) {
-                 if (s_logger.isDebugEnabled()) {
-                     s_logger.debug("Unable to execute API command " + cmd.getCommandName() + " due to invalid value " + paramObj + " for parameter " +
-                         parameterAnnotation.name());
-                 }
-                 throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to execute API command " +
-                     cmd.getCommandName().substring(0, cmd.getCommandName().length() - 8) + " due to invalid value " + paramObj + " for parameter " +
-                     parameterAnnotation.name());
-             } catch (ParseException parseEx) {
-                 if (s_logger.isDebugEnabled()) {
-                     s_logger.debug("Invalid date parameter " + paramObj + " passed to command " + cmd.getCommandName().substring(0, cmd.getCommandName().length() - 8));
-                 }
-                 throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to parse date " + paramObj + " for command " +
-                     cmd.getCommandName().substring(0, cmd.getCommandName().length() - 8) + ", please pass dates in the format mentioned in the api documentation");
-             } catch (InvalidParameterValueException invEx) {
-                 throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to execute API command " +
-                     cmd.getCommandName().substring(0, cmd.getCommandName().length() - 8) + " due to invalid value. " + invEx.getMessage());
-             } catch (CloudRuntimeException cloudEx) {
-                 s_logger.error("CloudRuntimeException", cloudEx);
-                 // FIXME: Better error message? This only happens if the API command is not executable, which typically
-                 //means
-                 // there was
-                 // and IllegalAccessException setting one of the parameters.
-                 throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Internal error executing API command " +
-                     cmd.getCommandName().substring(0, cmd.getCommandName().length() - 8));
-             }
- 
-             //check access on the resource this field points to
-             try {
-                 ACL checkAccess = field.getAnnotation(ACL.class);
-                 CommandType fieldType = parameterAnnotation.type();
- 
-                 if (checkAccess != null) {
-                     // Verify that caller can perform actions in behalf of vm owner
-                     //acumulate all Controlled Entities together.
- 
-                     //parse the array of resource types and in case of map check access on key or value or both as specified in @acl
-                     //implement external dao for classes that need findByName
-                     //for maps, specify access to be checkd on key or value.
- 
-                     // find the controlled entity DBid by uuid
-                     if (parameterAnnotation.entityType() != null) {
-                         Class<?>[] entityList = parameterAnnotation.entityType()[0].getAnnotation(EntityReference.class).value();
- 
-                         for (Class entity : entityList) {
-                             // Check if the parameter type is a single
-                             // Id or list of id's/name's
-                             switch (fieldType) {
-                                 case LIST:
-                                     CommandType listType = parameterAnnotation.collectionType();
-                                     switch (listType) {
-                                         case LONG:
-                                         case UUID:
-                                             List<Long> listParam = (List<Long>)field.get(cmd);
-                                             for (Long entityId : listParam) {
-                                                 Object entityObj = s_instance._entityMgr.findById(entity, entityId);
-                                                 entitiesToAccess.put(entityObj, checkAccess.accessType());
-                                             }
-                                             break;
-                                         /*
-                                          * case STRING: List<String> listParam =
-                                          * new ArrayList<String>(); listParam =
-                                          * (List)field.get(cmd); for(String
-                                          * entityName: listParam){
-                                          * ControlledEntity entityObj =
-                                          * (ControlledEntity
-                                          * )daoClassInstance(entityId);
-                                          * entitiesToAccess.add(entityObj); }
-                                          * break;
-                                          */
-                                         default:
-                                             break;
-                                     }
-                                     break;
-                                 case LONG:
-                                 case UUID:
-                                     Object entityObj = s_instance._entityMgr.findById(entity, (Long)field.get(cmd));
-                                     entitiesToAccess.put(entityObj, checkAccess.accessType());
-                                     break;
-                                 default:
-                                     break;
-                             }
- 
-                             if (ControlledEntity.class.isAssignableFrom(entity)) {
-                                 if (s_logger.isDebugEnabled()) {
-                                     s_logger.debug("ControlledEntity name is:" + entity.getName());
-                                 }
 +                            }
  
-                             if (InfrastructureEntity.class.isAssignableFrom(entity)) {
-                                 if (s_logger.isDebugEnabled()) {
-                                     s_logger.debug("InfrastructureEntity name is:" + entity.getName());
-                                 }
-                             }
-                         }
- 
-                     }
- 
-                 }
- 
-             } catch (IllegalArgumentException e) {
-                 s_logger.error("Error initializing command " + cmd.getCommandName() + ", field " + field.getName() + " is not accessible.");
-                 throw new CloudRuntimeException("Internal error initializing parameters for command " + cmd.getCommandName() + " [field " + field.getName() +
-                     " is not accessible]");
-             } catch (IllegalAccessException e) {
-                 s_logger.error("Error initializing command " + cmd.getCommandName() + ", field " + field.getName() + " is not accessible.");
-                 throw new CloudRuntimeException("Internal error initializing parameters for command " + cmd.getCommandName() + " [field " + field.getName() +
-                     " is not accessible]");
-             }
- 
-         }
- 
-         //check access on the entities.
-         getInstance().doAccessChecks(cmd, entitiesToAccess);
- 
-     }
- 
-     private static Long translateUuidToInternalId(String uuid, Parameter annotation) {
-         if (uuid.equals("-1")) {
-             // FIXME: This is to handle a lot of hardcoded special cases where -1 is sent
-             // APITODO: Find and get rid of all hardcoded params in API Cmds and service layer
-             return -1L;
-         }
-         Long internalId = null;
-         // If annotation's empty, the cmd existed before 3.x try conversion to long
-         boolean isPre3x = annotation.since().isEmpty();
-         // Match against Java's UUID regex to check if input is uuid string
-         boolean isUuid = uuid.matches("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$");
-         // Enforce that it's uuid for newly added apis from version 3.x
-         if (!isPre3x && !isUuid)
-             return null;
-         // Allow both uuid and internal id for pre3x apis
-         if (isPre3x && !isUuid) {
-             try {
-                 internalId = Long.parseLong(uuid);
-             } catch (NumberFormatException e) {
-                 internalId = null;
-             }
-             if (internalId != null)
-                 return internalId;
-         }
-         // There may be multiple entities defined on the @EntityReference of a Response.class
-         // UUID CommandType would expect only one entityType, so use the first entityType
-         Class<?>[] entities = annotation.entityType()[0].getAnnotation(EntityReference.class).value();
-         // Go through each entity which is an interface to a VO class and get a VO object
-         // Try to getId() for the object using reflection, break on first non-null value
-         for (Class<?> entity : entities) {
-             // For backward compatibility, we search within removed entities and let service layer deal
-             // with removed ones, return empty response or error
-             Object objVO = s_instance._entityMgr.findByUuidIncludingRemoved(entity, uuid);
-             if (objVO == null) {
-                 continue;
-             }
-             // Invoke the getId method, get the internal long ID
-             // If that fails hide exceptions as the uuid may not exist
-             try {
-                 internalId = ((InternalIdentity)objVO).getId();
-             } catch (IllegalArgumentException e) {
-             } catch (NullPointerException e) {
-             }
-             // Return on first non-null Id for the uuid entity
-             if (internalId != null)
-                 break;
-         }
-         if (internalId == null) {
-             if (s_logger.isDebugEnabled())
-                 s_logger.debug("Object entity uuid = " + uuid + " does not exist in the database.");
-             throw new InvalidParameterValueException("Invalid parameter " + annotation.name() + " value=" + uuid +
-                 " due to incorrect long value format, or entity does not exist or due to incorrect parameter annotation for the field in api cmd class.");
-         }
-         return internalId;
-     }
- 
-     @SuppressWarnings({"unchecked", "rawtypes"})
-     private static void setFieldValue(Field field, BaseCmd cmdObj, Object paramObj, Parameter annotation) throws IllegalArgumentException, ParseException {
-         try {
-             field.setAccessible(true);
-             CommandType fieldType = annotation.type();
-             switch (fieldType) {
-                 case BOOLEAN:
-                     field.set(cmdObj, Boolean.valueOf(paramObj.toString()));
-                     break;
-                 case DATE:
-                     // This piece of code is for maintaining backward compatibility
-                     // and support both the date formats(Bug 9724)
-                     // Do the date messaging for ListEventsCmd only
-                     if (cmdObj instanceof ListEventsCmd || cmdObj instanceof DeleteEventsCmd || cmdObj instanceof ArchiveEventsCmd ||
-                         cmdObj instanceof ArchiveAlertsCmd || cmdObj instanceof DeleteAlertsCmd) {
-                         boolean isObjInNewDateFormat = isObjInNewDateFormat(paramObj.toString());
-                         if (isObjInNewDateFormat) {
-                             DateFormat newFormat = BaseCmd.NEW_INPUT_FORMAT;
-                             synchronized (newFormat) {
-                                 field.set(cmdObj, newFormat.parse(paramObj.toString()));
-                             }
-                         } else {
-                             DateFormat format = BaseCmd.INPUT_FORMAT;
-                             synchronized (format) {
-                                 Date date = format.parse(paramObj.toString());
-                                 if (field.getName().equals("startDate")) {
-                                     date = messageDate(date, 0, 0, 0);
-                                 } else if (field.getName().equals("endDate")) {
-                                     date = messageDate(date, 23, 59, 59);
-                                 }
-                                 field.set(cmdObj, date);
-                             }
-                         }
-                     } else {
-                         DateFormat format = BaseCmd.INPUT_FORMAT;
-                         synchronized (format) {
-                         format.setLenient(false);
-                             field.set(cmdObj, format.parse(paramObj.toString()));
-                         }
-                     }
-                     break;
-                 case FLOAT:
-                     // Assuming that the parameters have been checked for required before now,
-                     // we ignore blank or null values and defer to the command to set a default
-                     // value for optional parameters ...
-                     if (paramObj != null && isNotBlank(paramObj.toString())) {
-                         field.set(cmdObj, Float.valueOf(paramObj.toString()));
-                     }
-                     break;
-                 case INTEGER:
-                     // Assuming that the parameters have been checked for required before now,
-                     // we ignore blank or null values and defer to the command to set a default
-                     // value for optional parameters ...
-                     if (paramObj != null && isNotBlank(paramObj.toString())) {
-                         field.set(cmdObj, Integer.valueOf(paramObj.toString()));
-                     }
-                     break;
-                 case LIST:
-                     List listParam = new ArrayList();
-                     StringTokenizer st = new StringTokenizer(paramObj.toString(), ",");
-                     while (st.hasMoreTokens()) {
-                         String token = st.nextToken();
-                         CommandType listType = annotation.collectionType();
-                         switch (listType) {
-                             case INTEGER:
-                                 listParam.add(Integer.valueOf(token));
-                                 break;
-                             case UUID:
-                                 if (token.isEmpty())
-                                     break;
-                                 Long internalId = translateUuidToInternalId(token, annotation);
-                                 listParam.add(internalId);
-                                 break;
-                             case LONG: {
-                                 listParam.add(Long.valueOf(token));
-                             }
-                                 break;
-                             case SHORT:
-                                 listParam.add(Short.valueOf(token));
-                             case STRING:
-                                 listParam.add(token);
-                                 break;
-                         }
-                     }
-                     field.set(cmdObj, listParam);
-                     break;
-                 case UUID:
-                     if (paramObj.toString().isEmpty())
-                         break;
-                     Long internalId = translateUuidToInternalId(paramObj.toString(), annotation);
-                     field.set(cmdObj, internalId);
-                     break;
-                 case LONG:
-                     field.set(cmdObj, Long.valueOf(paramObj.toString()));
-                     break;
-                 case SHORT:
-                     field.set(cmdObj, Short.valueOf(paramObj.toString()));
-                     break;
-                 case STRING:
-                     if ((paramObj != null) && paramObj.toString().length() > annotation.length()) {
-                         s_logger.error("Value greater than max allowed length " + annotation.length() + " for param: " + field.getName());
-                         throw new InvalidParameterValueException("Value greater than max allowed length " + annotation.length() + " for param: " + field.getName());
-                     }
-                     field.set(cmdObj, paramObj.toString());
-                     break;
-                 case TZDATE:
-                     field.set(cmdObj, DateUtil.parseTZDateString(paramObj.toString()));
-                     break;
-                 case MAP:
-                 default:
-                     field.set(cmdObj, paramObj);
-                     break;
-             }
-         } catch (IllegalAccessException ex) {
-             s_logger.error("Error initializing command " + cmdObj.getCommandName() + ", field " + field.getName() + " is not accessible.");
-             throw new CloudRuntimeException("Internal error initializing parameters for command " + cmdObj.getCommandName() + " [field " + field.getName() +
-                 " is not accessible]");
-         }
-     }
- 
-     private static boolean isObjInNewDateFormat(String string) {
-         Matcher matcher = BaseCmd.newInputDateFormat.matcher(string);
-         return matcher.matches();
-     }
- 
-     private static Date messageDate(Date date, int hourOfDay, int minute, int second) {
-         Calendar cal = Calendar.getInstance();
-         cal.setTime(date);
-         cal.set(Calendar.HOUR_OF_DAY, hourOfDay);
-         cal.set(Calendar.MINUTE, minute);
-         cal.set(Calendar.SECOND, second);
-         return cal.getTime();
-     }
- 
-     public static void plugService(Field field, BaseCmd cmd) {
- 
-         Class<?> fc = field.getType();
-         Object instance = null;
- 
-         if (instance == null) {
-             throw new CloudRuntimeException("Unable to plug service " + fc.getSimpleName() + " in command " + cmd.getClass().getSimpleName());
-         }
- 
-         try {
-             field.setAccessible(true);
-             field.set(cmd, instance);
-         } catch (IllegalArgumentException e) {
-             s_logger.error("IllegalArgumentException at plugService for command " + cmd.getCommandName() + ", field " + field.getName());
-             throw new CloudRuntimeException("Internal error at plugService for command " + cmd.getCommandName() + " [Illegal argumet at field " + field.getName() + "]");
-         } catch (IllegalAccessException e) {
-             s_logger.error("Error at plugService for command " + cmd.getCommandName() + ", field " + field.getName() + " is not accessible.");
-             throw new CloudRuntimeException("Internal error at plugService for command " + cmd.getCommandName() + " [field " + field.getName() + " is not accessible]");
-         }
-     }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiServer.java
index 5ab65f4,3502689..e4486c1
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@@ -53,39 -53,12 +53,40 @@@ import javax.naming.ConfigurationExcept
  import javax.servlet.http.HttpServletResponse;
  import javax.servlet.http.HttpSession;
  
 -import com.cloud.event.EventTypes;
 -import com.cloud.utils.ReflectUtil;
 -import com.cloud.vm.VirtualMachine;
 +import org.apache.commons.codec.binary.Base64;
 +import org.apache.http.ConnectionClosedException;
 +import org.apache.http.HttpException;
 +import org.apache.http.HttpRequest;
 +import org.apache.http.HttpResponse;
 +import org.apache.http.HttpServerConnection;
 +import org.apache.http.HttpStatus;
 +import org.apache.http.NameValuePair;
 +import org.apache.http.client.utils.URLEncodedUtils;
 +import org.apache.http.entity.BasicHttpEntity;
 +import org.apache.http.impl.DefaultHttpResponseFactory;
 +import org.apache.http.impl.DefaultHttpServerConnection;
 +import org.apache.http.impl.NoConnectionReuseStrategy;
 +import org.apache.http.impl.SocketHttpServerConnection;
 +import org.apache.http.params.BasicHttpParams;
 +import org.apache.http.params.CoreConnectionPNames;
 +import org.apache.http.params.CoreProtocolPNames;
 +import org.apache.http.params.HttpParams;
 +import org.apache.http.protocol.BasicHttpContext;
 +import org.apache.http.protocol.BasicHttpProcessor;
 +import org.apache.http.protocol.HttpContext;
 +import org.apache.http.protocol.HttpRequestHandler;
 +import org.apache.http.protocol.HttpRequestHandlerRegistry;
 +import org.apache.http.protocol.HttpService;
 +import org.apache.http.protocol.ResponseConnControl;
 +import org.apache.http.protocol.ResponseContent;
 +import org.apache.http.protocol.ResponseDate;
 +import org.apache.http.protocol.ResponseServer;
 +import org.apache.log4j.Logger;
 +import org.springframework.stereotype.Component;
 +
  import org.apache.cloudstack.acl.APIChecker;
  import org.apache.cloudstack.api.APICommand;
+ import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
  import org.apache.cloudstack.api.BaseAsyncCmd;
  import org.apache.cloudstack.api.BaseAsyncCreateCmd;
@@@ -122,12 -94,44 +123,15 @@@ import org.apache.cloudstack.framework.
  import org.apache.cloudstack.framework.jobs.AsyncJobManager;
  import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
  import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 -import org.apache.commons.codec.binary.Base64;
 -import org.apache.http.ConnectionClosedException;
 -import org.apache.http.HttpException;
 -import org.apache.http.HttpRequest;
 -import org.apache.http.HttpResponse;
 -import org.apache.http.HttpServerConnection;
 -import org.apache.http.HttpStatus;
 -import org.apache.http.NameValuePair;
 -import org.apache.http.client.utils.URLEncodedUtils;
 -import org.apache.http.entity.BasicHttpEntity;
 -import org.apache.http.impl.DefaultHttpResponseFactory;
 -import org.apache.http.impl.DefaultHttpServerConnection;
 -import org.apache.http.impl.NoConnectionReuseStrategy;
 -import org.apache.http.impl.SocketHttpServerConnection;
 -import org.apache.http.params.BasicHttpParams;
 -import org.apache.http.params.CoreConnectionPNames;
 -import org.apache.http.params.CoreProtocolPNames;
 -import org.apache.http.params.HttpParams;
 -import org.apache.http.protocol.BasicHttpContext;
 -import org.apache.http.protocol.BasicHttpProcessor;
 -import org.apache.http.protocol.HttpContext;
 -import org.apache.http.protocol.HttpRequestHandler;
 -import org.apache.http.protocol.HttpRequestHandlerRegistry;
 -import org.apache.http.protocol.HttpService;
 -import org.apache.http.protocol.ResponseConnControl;
 -import org.apache.http.protocol.ResponseContent;
 -import org.apache.http.protocol.ResponseDate;
 -import org.apache.http.protocol.ResponseServer;
 -import org.apache.log4j.Logger;
 -import org.springframework.stereotype.Component;
  
+ import com.cloud.api.dispatch.DispatchChainFactory;
+ import com.cloud.api.dispatch.DispatchTask;
  import com.cloud.api.response.ApiResponseSerializer;
  import com.cloud.configuration.Config;
  import com.cloud.domain.Domain;
  import com.cloud.domain.DomainVO;
  import com.cloud.event.ActionEventUtils;
++import com.cloud.event.EventTypes;
  import com.cloud.exception.AccountLimitException;
  import com.cloud.exception.CloudAuthenticationException;
  import com.cloud.exception.InsufficientCapacityException;
@@@ -144,6 -148,6 +148,7 @@@ import com.cloud.user.UserAccount
  import com.cloud.user.UserVO;
  import com.cloud.utils.NumbersUtil;
  import com.cloud.utils.Pair;
++import com.cloud.utils.ReflectUtil;
  import com.cloud.utils.StringUtils;
  import com.cloud.utils.component.ComponentContext;
  import com.cloud.utils.component.ManagerBase;
@@@ -154,6 -158,6 +159,7 @@@ import com.cloud.utils.db.SearchCriteri
  import com.cloud.utils.db.TransactionLegacy;
  import com.cloud.utils.exception.CloudRuntimeException;
  import com.cloud.utils.exception.ExceptionProxyObject;
++import com.cloud.vm.VirtualMachine;
  
  @Component
  public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiServerService {
@@@ -234,14 -245,12 +248,15 @@@
              if (at == null) {
                  throw new CloudRuntimeException(String.format("%s is claimed as a API command, but it doesn't have @APICommand annotation", cmdClass.getName()));
              }
 -            final String apiName = at.name();
 -            if (s_apiNameCmdClassMap.containsKey(apiName)) {
 -                s_logger.error("API Cmd class " + cmdClass.getName() + " has non-unique apiname" + apiName);
 -                continue;
++
 +            String apiName = at.name();
 +            List<Class<?>> apiCmdList = s_apiNameCmdClassMap.get(apiName);
 +            if (apiCmdList == null) {
 +                apiCmdList = new ArrayList<Class<?>>();
 +                s_apiNameCmdClassMap.put(apiName, apiCmdList);
              }
 -            s_apiNameCmdClassMap.put(apiName, cmdClass);
 +            apiCmdList.add(cmdClass);
 +
          }
  
          setEncodeApiResponse(Boolean.valueOf(_configDao.getValue(Config.EncodeApiResponse.key())));
@@@ -392,10 -414,10 +420,10 @@@
                                  StringUtils.cleanString(response));
                      }
                      else
 -                        buildAuditTrail(auditTrailSb, command[0], response);
 +                    buildAuditTrail(auditTrailSb, command[0], response);
                  } else {
                      if (!command[0].equalsIgnoreCase("login") && !command[0].equalsIgnoreCase("logout")) {
-                         String errorString = "Unknown API command: " + command[0];
+                         final String errorString = "Unknown API command: " + command[0];
                          s_logger.warn(errorString);
                          auditTrailSb.append(" " + errorString);
                          throw new ServerApiException(ApiErrorCode.UNSUPPORTED_ACTION_ERROR, errorString);
@@@ -423,35 -445,35 +451,35 @@@
                  s_logger.info("PermissionDenied: " + ex.getMessage());
              }
              throw new ServerApiException(ApiErrorCode.ACCOUNT_ERROR, ex.getMessage(), ex);
-         } catch (AccountLimitException ex) {
+         } catch (final AccountLimitException ex) {
              s_logger.info(ex.getMessage());
              throw new ServerApiException(ApiErrorCode.ACCOUNT_RESOURCE_LIMIT_ERROR, ex.getMessage(), ex);
-         } catch (InsufficientCapacityException ex) {
+         } catch (final InsufficientCapacityException ex) {
              s_logger.info(ex.getMessage());
              String errorMsg = ex.getMessage();
 -            if (CallContext.current().getCallingAccount().getType() != Account.ACCOUNT_TYPE_ADMIN) {
 +            if (!_accountMgr.isRootAdmin(CallContext.current().getCallingAccount().getId())) {
                  // hide internal details to non-admin user for security reason
                  errorMsg = BaseCmd.USER_ERROR_MESSAGE;
              }
              throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, errorMsg, ex);
-         } catch (ResourceAllocationException ex) {
+         } catch (final ResourceAllocationException ex) {
              s_logger.info(ex.getMessage());
              throw new ServerApiException(ApiErrorCode.RESOURCE_ALLOCATION_ERROR, ex.getMessage(), ex);
-         } catch (ResourceUnavailableException ex) {
+         } catch (final ResourceUnavailableException ex) {
              s_logger.info(ex.getMessage());
              String errorMsg = ex.getMessage();
 -            if (CallContext.current().getCallingAccount().getType() != Account.ACCOUNT_TYPE_ADMIN) {
 +            if (!_accountMgr.isRootAdmin(CallContext.current().getCallingAccount().getId())) {
                  // hide internal details to non-admin user for security reason
                  errorMsg = BaseCmd.USER_ERROR_MESSAGE;
              }
              throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, errorMsg, ex);
-         } catch (ServerApiException ex) {
+         } catch (final ServerApiException ex) {
              s_logger.info(ex.getDescription());
              throw ex;
-         } catch (Exception ex) {
-             s_logger.error("unhandled exception executing api command: " + ((command == null) ? "null" : command[0]), ex);
+         } catch (final Exception ex) {
+             s_logger.error("unhandled exception executing api command: " + ((command == null) ? "null" : command), ex);
              String errorMsg = ex.getMessage();
 -            if (CallContext.current().getCallingAccount().getType() != Account.ACCOUNT_TYPE_ADMIN) {
 +            if (!_accountMgr.isRootAdmin(CallContext.current().getCallingAccount().getId())) {
                  // hide internal details to non-admin user for security reason
                  errorMsg = BaseCmd.USER_ERROR_MESSAGE;
              }
@@@ -553,23 -589,12 +595,12 @@@
              // if the command is of the listXXXCommand, we will need to also return the
              // the job id and status if possible
              // For those listXXXCommand which we have already created DB views, this step is not needed since async job is joined in their db views.
-             if (cmdObj instanceof BaseListCmd && !(cmdObj instanceof ListVMsCmd) && !(cmdObj instanceof ListRoutersCmd)
-                     && !(cmdObj instanceof ListSecurityGroupsCmd)
-                     && !(cmdObj instanceof ListTagsCmd)
-                     && !(cmdObj instanceof ListEventsCmd)
-                     && !(cmdObj instanceof ListVMGroupsCmd)
-                     && !(cmdObj instanceof ListProjectsCmd)
-                     && !(cmdObj instanceof ListProjectAccountsCmd)
-                     && !(cmdObj instanceof ListProjectInvitationsCmd)
-                     && !(cmdObj instanceof ListHostsCmd)
-                     && !(cmdObj instanceof ListVolumesCmd)
-                     && !(cmdObj instanceof ListUsersCmd)
-                     && !(cmdObj instanceof ListAccountsCmd)
-                     && !(cmdObj instanceof ListStoragePoolsCmd)
-                     && !(cmdObj instanceof ListDiskOfferingsCmd)
-                     && !(cmdObj instanceof ListServiceOfferingsCmd)
-                     && !(cmdObj instanceof ListZonesCmd)
-                     ) {
+             if (cmdObj instanceof BaseListCmd && !(cmdObj instanceof ListVMsCmd) && !(cmdObj instanceof ListRoutersCmd) && !(cmdObj instanceof ListSecurityGroupsCmd) &&
+                 !(cmdObj instanceof ListTagsCmd) && !(cmdObj instanceof ListEventsCmd) && !(cmdObj instanceof ListVMGroupsCmd) && !(cmdObj instanceof ListProjectsCmd) &&
+                 !(cmdObj instanceof ListProjectAccountsCmd) && !(cmdObj instanceof ListProjectInvitationsCmd) && !(cmdObj instanceof ListHostsCmd) &&
+                 !(cmdObj instanceof ListVolumesCmd) && !(cmdObj instanceof ListUsersCmd) && !(cmdObj instanceof ListAccountsCmd) &&
+                 !(cmdObj instanceof ListStoragePoolsCmd) && !(cmdObj instanceof ListDiskOfferingsCmd) && !(cmdObj instanceof ListServiceOfferingsCmd) &&
 -                !(cmdObj instanceof ListZonesByCmd)) {
++                !(cmdObj instanceof ListZonesCmd)) {
                  buildAsyncListResponse((BaseListCmd) cmdObj, caller);
              }
  
@@@ -988,10 -988,10 +1019,10 @@@
                  .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024)
                  .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false)
                  .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
 -                .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "HttpComponents/1.1");
 +            .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "HttpComponents/1.1");
  
              // Set up the HTTP protocol processor
-             BasicHttpProcessor httpproc = new BasicHttpProcessor();
+             final BasicHttpProcessor httpproc = new BasicHttpProcessor();
              httpproc.addInterceptor(new ResponseDate());
              httpproc.addInterceptor(new ResponseServer());
              httpproc.addInterceptor(new ResponseContent());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/query/QueryManagerImpl.java
index 96647f8,47d2aec..0554e3a
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@@ -751,50 -728,95 +751,61 @@@ public class QueryManagerImpl extends M
          Boolean isRecursive = domainIdRecursiveListProject.second();
          ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third();
  
 +        Filter searchFilter = new Filter(UserVmJoinVO.class, "id", true, cmd.getStartIndex(),
 +                cmd.getPageSizeVal());
 +
+         List<Long> ids = null;
+         if (cmd.getId() != null) {
+             if (cmd.getIds() != null && !cmd.getIds().isEmpty()) {
+                 throw new InvalidParameterValueException("Specify either id or ids but not both parameters");
+             }
+             ids = new ArrayList<Long>();
+             ids.add(cmd.getId());
+         } else {
+             ids = cmd.getIds();
+         }
+ 
 -        Criteria c = new Criteria("id", Boolean.TRUE, cmd.getStartIndex(), cmd.getPageSizeVal());
 -        // Criteria c = new Criteria(null, Boolean.FALSE, cmd.getStartIndex(),
 -        // cmd.getPageSizeVal()); //version without default sorting
 -        c.addCriteria(Criteria.KEYWORD, cmd.getKeyword());
 -        c.addCriteria(Criteria.ID, ids);
 -        c.addCriteria(Criteria.NAME, cmd.getName());
 -        c.addCriteria(Criteria.STATE, cmd.getState());
 -        c.addCriteria(Criteria.DATACENTERID, cmd.getZoneId());
 -        c.addCriteria(Criteria.GROUPID, cmd.getGroupId());
 -        c.addCriteria(Criteria.FOR_VIRTUAL_NETWORK, cmd.getForVirtualNetwork());
 -        c.addCriteria(Criteria.NETWORKID, cmd.getNetworkId());
 -        c.addCriteria(Criteria.TEMPLATE_ID, cmd.getTemplateId());
 -        c.addCriteria(Criteria.ISO_ID, cmd.getIsoId());
 -        c.addCriteria(Criteria.VPC_ID, cmd.getVpcId());
 -        c.addCriteria(Criteria.AFFINITY_GROUP_ID, cmd.getAffinityGroupId());
 -        c.addCriteria(Criteria.SERVICE_OFFERING_ID, cmd.getServiceOfferingId());
 -        c.addCriteria(Criteria.DISPLAY, cmd.getDisplay());
 +        // first search distinct vm id by using query criteria and pagination
 +        SearchBuilder<UserVmJoinVO> sb = _userVmJoinDao.createSearchBuilder();
 +        sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct ids
  
 -        if (domainId != null) {
 -            c.addCriteria(Criteria.DOMAINID, domainId);
 +        String hypervisor = cmd.getHypervisor();
 +        Object name = cmd.getName();
 +        Object state = cmd.getState();
 +        Object zoneId = cmd.getZoneId();
 +        Object keyword = cmd.getKeyword();
 +        boolean isAdmin = false;
 +        boolean isRootAdmin = false;
 +        if (_accountMgr.isAdmin(caller.getType())) {
 +            isAdmin = true;
 +        }
 +        if (_accountMgr.isRootAdmin(caller.getId())) {
 +            isRootAdmin = true;
          }
  
 -        if (HypervisorType.getType(hypervisor) != HypervisorType.None) {
 -            c.addCriteria(Criteria.HYPERVISOR, hypervisor);
 -        } else if (hypervisor != null) {
 +        Object groupId = cmd.getGroupId();
 +        Object networkId = cmd.getNetworkId();
 +        if (HypervisorType.getType(hypervisor) == HypervisorType.None && hypervisor != null) {
 +            // invalid hypervisor type input
              throw new InvalidParameterValueException("Invalid HypervisorType " + hypervisor);
          }
 -
 -        // ignore these search requests if it's not an admin
 -        if (_accountMgr.isAdmin(caller.getType())) {
 -            c.addCriteria(Criteria.PODID, cmd.getPodId());
 -            c.addCriteria(Criteria.HOSTID, cmd.getHostId());
 -            c.addCriteria(Criteria.STORAGE_ID, cmd.getStorageId());
 +        Object templateId = cmd.getTemplateId();
 +        Object isoId = cmd.getIsoId();
 +        Object vpcId = cmd.getVpcId();
 +        Object affinityGroupId = cmd.getAffinityGroupId();
 +        Object serviceOffId = cmd.getServiceOfferingId();
 +        Object pod = null;
 +        Object hostId = null;
 +        Object storageId = null;
 +        if (cmd instanceof ListVMsCmdByAdmin) {
 +            ListVMsCmdByAdmin adCmd = (ListVMsCmdByAdmin)cmd;
 +            pod = adCmd.getPodId();
 +            hostId = adCmd.getHostId();
 +            storageId = adCmd.getStorageId();
          }
  
 -        if (!permittedAccounts.isEmpty()) {
 -            c.addCriteria(Criteria.ACCOUNTID, permittedAccounts.toArray());
 -        }
 -        c.addCriteria(Criteria.ISADMIN, _accountMgr.isAdmin(caller.getType()));
 -
 -        return searchForUserVMsByCriteria(c, caller, domainId, isRecursive, permittedAccounts, listAll, listProjectResourcesCriteria, tags);
 -    }
 -
 -    private Pair<List<UserVmJoinVO>, Integer> searchForUserVMsByCriteria(Criteria c, Account caller, Long domainId, boolean isRecursive, List<Long> permittedAccounts,
 -        boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags) {
 -        Filter searchFilter = new Filter(UserVmJoinVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit());
 -        boolean isRootAdmin = _accountMgr.isRootAdmin(caller.getType());
 -
 -        // first search distinct vm id by using query criteria and pagination
 -        SearchBuilder<UserVmJoinVO> sb = _userVmJoinDao.createSearchBuilder();
 -        sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct
 -        // ids
 -        _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
 -
 -        Object id = c.getCriteria(Criteria.ID);
 -        Object name = c.getCriteria(Criteria.NAME);
 -        Object state = c.getCriteria(Criteria.STATE);
 -        Object notState = c.getCriteria(Criteria.NOTSTATE);
 -        Object zoneId = c.getCriteria(Criteria.DATACENTERID);
 -        Object pod = c.getCriteria(Criteria.PODID);
 -        Object hostId = c.getCriteria(Criteria.HOSTID);
 -        Object hostName = c.getCriteria(Criteria.HOSTNAME);
 -        Object keyword = c.getCriteria(Criteria.KEYWORD);
 -        Object isAdmin = c.getCriteria(Criteria.ISADMIN);
 -        assert c.getCriteria(Criteria.IPADDRESS) == null : "We don't support search by ip address on VM any more.  If you see this assert, it means we have to find a different way to search by the nic table.";
 -        Object groupId = c.getCriteria(Criteria.GROUPID);
 -        Object networkId = c.getCriteria(Criteria.NETWORKID);
 -        Object hypervisor = c.getCriteria(Criteria.HYPERVISOR);
 -        Object storageId = c.getCriteria(Criteria.STORAGE_ID);
 -        Object templateId = c.getCriteria(Criteria.TEMPLATE_ID);
 -        Object isoId = c.getCriteria(Criteria.ISO_ID);
 -        Object vpcId = c.getCriteria(Criteria.VPC_ID);
 -        Object affinityGroupId = c.getCriteria(Criteria.AFFINITY_GROUP_ID);
 -        Object serviceOffId = c.getCriteria(Criteria.SERVICE_OFFERING_ID);
 -        Object display = c.getCriteria(Criteria.DISPLAY);
 -
          sb.and("displayName", sb.entity().getDisplayName(), SearchCriteria.Op.LIKE);
-         sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
+         sb.and("idIN", sb.entity().getId(), SearchCriteria.Op.IN);
          sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
          sb.and("stateEQ", sb.entity().getState(), SearchCriteria.Op.EQ);
          sb.and("stateNEQ", sb.entity().getState(), SearchCriteria.Op.NEQ);
@@@ -877,8 -899,11 +888,11 @@@
              sc.setParameters("display", display);
          }
  
--        if (id != null) {
-             sc.setParameters("id", id);
 -            List<?> idList = (id instanceof List<?> ? (List<?>)id : null);
++        if (ids != null) {
++            List<?> idList = (ids instanceof List<?> ? (List<?>)ids : null);
+             if (idList != null && !idList.isEmpty()) {
+                 sc.setParameters("idIN", idList.toArray());
+             }
          }
  
          if (templateId != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java
index 92f5110,07b4c91..1cab6e8
--- a/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java
+++ b/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java
@@@ -59,9 -57,9 +59,9 @@@ public class TemplateJoinDaoImpl extend
      public static final Logger s_logger = Logger.getLogger(TemplateJoinDaoImpl.class);
  
      @Inject
 -    private ConfigurationDao _configDao;
 +    private ConfigurationDao  _configDao;
      @Inject
-     public AccountService _accountService;
+     private AccountService _accountService;
  
      private final SearchBuilder<TemplateJoinVO> tmpltIdPairSearch;
  
@@@ -98,24 -96,33 +98,23 @@@
          _count = "select count(distinct temp_zone_pair) from template_view WHERE ";
      }
  
- 
      private String getTemplateStatus(TemplateJoinVO template) {
 -        boolean isAdmin = false;
 -        Account caller = CallContext.current().getCallingAccount();
 -        if ((caller == null) || _accountService.isAdmin(caller.getType())) {
 -            isAdmin = true;
 -        }
 -
 -        // If the user is an Admin, add the template download status
          String templateStatus = null;
 -        if (isAdmin || caller.getId() == template.getAccountId()) {
 -            // add download status
 -            if (template.getDownloadState() != Status.DOWNLOADED) {
 -                templateStatus = "Processing";
 -                if (template.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) {
 -                    if (template.getDownloadPercent() == 100) {
 -                        templateStatus = "Installing Template";
 -                    } else {
 -                        templateStatus = template.getDownloadPercent() + "% Downloaded";
 -                    }
 +        if (template.getDownloadState() != Status.DOWNLOADED) {
 +            templateStatus = "Processing";
 +            if (template.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) {
 +                if (template.getDownloadPercent() == 100) {
 +                    templateStatus = "Installing Template";
                  } else {
 -                    templateStatus = template.getErrorString();
 +                    templateStatus = template.getDownloadPercent() + "% Downloaded";
                  }
 -            } else if (template.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) {
 -                templateStatus = "Download Complete";
              } else {
 -                templateStatus = "Successfully Installed";
 +                templateStatus = template.getErrorString();
              }
 +        } else if (template.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) {
 +            templateStatus = "Download Complete";
 +        } else {
 +            templateStatus = "Successfully Installed";
          }
          return templateStatus;
      }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
index a5dfb16,235902c..779ddb4
--- a/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
+++ b/server/src/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
@@@ -42,9 -40,10 +42,11 @@@ import org.apache.cloudstack.framework.
  import com.cloud.api.ApiDBUtils;
  import com.cloud.api.query.vo.ResourceTagJoinVO;
  import com.cloud.api.query.vo.UserVmJoinVO;
+ import com.cloud.gpu.GPU;
  import com.cloud.hypervisor.Hypervisor.HypervisorType;
+ import com.cloud.service.ServiceOfferingDetailsVO;
  import com.cloud.user.Account;
 +import com.cloud.user.AccountManager;
  import com.cloud.uservm.UserVm;
  import com.cloud.utils.db.GenericDaoBase;
  import com.cloud.utils.db.SearchBuilder;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/api/query/vo/EventJoinVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index b739d30,2d4539c..9b9bd13
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@@ -2035,13 -2075,62 +2076,62 @@@ public class ConfigurationManagerImpl e
          if ((iopsWriteRate != null) && (iopsWriteRate > 0))
              offering.setIopsWriteRate(iopsWriteRate);
  
-         if ((offering = _serviceOfferingDao.persist(offering)) != null) {
+         if (hypervisorSnapshotReserve != null && hypervisorSnapshotReserve < 0) {
+             throw new InvalidParameterValueException("If provided, Hypervisor Snapshot Reserve must be greater than or equal to 0.");
+         }
+ 
+         offering.setHypervisorSnapshotReserve(hypervisorSnapshotReserve);
+ 
+         List<ServiceOfferingDetailsVO> detailsVO = null;
 -        if (details != null) {
 +            if (details != null) {
-                 List<ServiceOfferingDetailsVO> detailsVO = new ArrayList<ServiceOfferingDetailsVO>();
+             // Check if the user has passed the gpu-type before passing the VGPU type
+             if (!details.containsKey(GPU.Keys.pciDevice.toString()) && details.containsKey(GPU.Keys.vgpuType.toString())) {
+                 throw new InvalidParameterValueException("Please specify the gpu type");
+             }
+             detailsVO = new ArrayList<ServiceOfferingDetailsVO>();
 -            for (Entry<String, String> detailEntry : details.entrySet()) {
 +                for (Entry<String, String> detailEntry : details.entrySet()) {
+                 String value = null;
+                 if (detailEntry.getKey().equals(GPU.Keys.pciDevice.toString())) {
+                     for (GPU.Type type : GPU.Type.values()) {
+                         if (detailEntry.getValue().equals(type.toString())) {
+                             value = detailEntry.getValue();
+                         }
+                     }
+                     if (value == null) {
+                         throw new InvalidParameterValueException("Please specify valid gpu type");
+                     }
+                 }
+                 if (detailEntry.getKey().equals(GPU.Keys.vgpuType.toString())) {
+                     if (details.get(GPU.Keys.pciDevice.toString()).equals(GPU.Type.GPU_Passthrough.toString())) {
+                         throw new InvalidParameterValueException("vgpuTypes are supported only with vGPU pciDevice");
+                     }
+                     if (detailEntry.getValue() == null) {
+                         throw new InvalidParameterValueException("With vGPU as pciDevice, vGPUType value cannot be null");
+                     }
+                     for (GPU.vGPUType entry : GPU.vGPUType.values()) {
+                         if (detailEntry.getValue().equals(entry.getType())) {
+                             value = entry.getType();
+                         }
+                     }
+                     if (value == null || detailEntry.getValue().equals(GPU.vGPUType.passthrough.getType())) {
+                         throw new InvalidParameterValueException("Please specify valid vGPU type");
+                     }
+                 }
 -                detailsVO.add(new ServiceOfferingDetailsVO(offering.getId(), detailEntry.getKey(), detailEntry.getValue(), true));
 -            }
 +                    detailsVO.add(new ServiceOfferingDetailsVO(offering.getId(), detailEntry.getKey(), detailEntry.getValue(), true));
 +                }
+             // If pciDevice type is passed, put the default VGPU type as 'passthrough'
+             if (details.containsKey(GPU.Keys.pciDevice.toString())
+                     && !details.containsKey(GPU.Keys.vgpuType.toString())) {
+                 detailsVO.add(new ServiceOfferingDetailsVO(offering.getId(),
+                         GPU.Keys.vgpuType.toString(), GPU.vGPUType.passthrough.getType(), true));
+             }
+         }
  
+         if ((offering = _serviceOfferingDao.persist(offering)) != null) {
+             if (detailsVO != null && !detailsVO.isEmpty()) {
+                 for (int index = 0; index < detailsVO.size(); index++) {
+                     detailsVO.get(index).setResourceId(offering.getId());
+                 }
                  _serviceOfferingDetailsDao.saveDetails(detailsVO);
              }
              CallContext.current().setEventDetails("Service offering id=" + offering.getId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
index ee8cc4d,f76e485..74c141e
--- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
+++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
@@@ -61,108 -61,112 +61,112 @@@ import com.cloud.agent.api.Command
  import com.cloud.agent.api.StartupCommand;
  import com.cloud.agent.api.StartupRoutingCommand;
  import com.cloud.agent.manager.allocator.HostAllocator;
 -import com.cloud.capacity.CapacityManager;
 -import com.cloud.capacity.dao.CapacityDao;
 -import com.cloud.configuration.Config;
 -import com.cloud.dc.ClusterDetailsDao;
 -import com.cloud.dc.ClusterDetailsVO;
 -import com.cloud.dc.ClusterVO;
 -import com.cloud.dc.DataCenter;
 -import com.cloud.dc.DataCenterVO;
 +import com.cloud.capacity.CapacityManager;
 +import com.cloud.capacity.dao.CapacityDao;
 +import com.cloud.configuration.Config;
 +import com.cloud.dc.ClusterDetailsDao;
 +import com.cloud.dc.ClusterDetailsVO;
 +import com.cloud.dc.ClusterVO;
 +import com.cloud.dc.DataCenter;
 +import com.cloud.dc.DataCenterVO;
  import com.cloud.dc.DedicatedResourceVO;
 -import com.cloud.dc.Pod;
 -import com.cloud.dc.dao.ClusterDao;
 -import com.cloud.dc.dao.DataCenterDao;
 +import com.cloud.dc.Pod;
 +import com.cloud.dc.dao.ClusterDao;
 +import com.cloud.dc.dao.DataCenterDao;
  import com.cloud.dc.dao.DedicatedResourceDao;
 -import com.cloud.dc.dao.HostPodDao;
 -import com.cloud.deploy.DeploymentPlanner.ExcludeList;
 -import com.cloud.deploy.DeploymentPlanner.PlannerResourceUsage;
 -import com.cloud.deploy.dao.PlannerHostReservationDao;
 -import com.cloud.exception.AffinityConflictException;
 -import com.cloud.exception.ConnectionException;
 -import com.cloud.exception.InsufficientServerCapacityException;
 +import com.cloud.dc.dao.HostPodDao;
 +import com.cloud.deploy.DeploymentPlanner.ExcludeList;
 +import com.cloud.deploy.DeploymentPlanner.PlannerResourceUsage;
 +import com.cloud.deploy.dao.PlannerHostReservationDao;
 +import com.cloud.exception.AffinityConflictException;
 +import com.cloud.exception.ConnectionException;
 +import com.cloud.exception.InsufficientServerCapacityException;
+ import com.cloud.gpu.GPU;
 -import com.cloud.host.Host;
 -import com.cloud.host.HostVO;
 -import com.cloud.host.Status;
 -import com.cloud.host.dao.HostDao;
 -import com.cloud.hypervisor.Hypervisor.HypervisorType;
 -import com.cloud.offering.ServiceOffering;
 -import com.cloud.org.Cluster;
 -import com.cloud.org.Grouping;
 +import com.cloud.host.Host;
 +import com.cloud.host.HostVO;
 +import com.cloud.host.Status;
 +import com.cloud.host.dao.HostDao;
 +import com.cloud.hypervisor.Hypervisor.HypervisorType;
 +import com.cloud.offering.ServiceOffering;
 +import com.cloud.org.Cluster;
 +import com.cloud.org.Grouping;
+ import com.cloud.resource.ResourceManager;
 -import com.cloud.resource.ResourceState;
 +import com.cloud.resource.ResourceState;
+ import com.cloud.service.ServiceOfferingDetailsVO;
+ import com.cloud.service.dao.ServiceOfferingDetailsDao;
 -import com.cloud.storage.DiskOfferingVO;
 -import com.cloud.storage.ScopeType;
 +import com.cloud.storage.DiskOfferingVO;
 +import com.cloud.storage.ScopeType;
  import com.cloud.storage.Storage;
 -import com.cloud.storage.StorageManager;
 -import com.cloud.storage.StoragePool;
 -import com.cloud.storage.StoragePoolHostVO;
 -import com.cloud.storage.Volume;
 -import com.cloud.storage.VolumeVO;
 -import com.cloud.storage.dao.DiskOfferingDao;
 -import com.cloud.storage.dao.GuestOSCategoryDao;
 -import com.cloud.storage.dao.GuestOSDao;
 -import com.cloud.storage.dao.StoragePoolHostDao;
 -import com.cloud.storage.dao.VolumeDao;
 -import com.cloud.user.AccountManager;
 -import com.cloud.utils.DateUtil;
 -import com.cloud.utils.NumbersUtil;
 -import com.cloud.utils.Pair;
 -import com.cloud.utils.component.Manager;
 -import com.cloud.utils.component.ManagerBase;
 -import com.cloud.utils.db.DB;
 -import com.cloud.utils.db.SearchCriteria;
 -import com.cloud.utils.db.Transaction;
 -import com.cloud.utils.db.TransactionCallback;
 -import com.cloud.utils.db.TransactionStatus;
 +import com.cloud.storage.StorageManager;
 +import com.cloud.storage.StoragePool;
 +import com.cloud.storage.StoragePoolHostVO;
 +import com.cloud.storage.Volume;
 +import com.cloud.storage.VolumeVO;
 +import com.cloud.storage.dao.DiskOfferingDao;
 +import com.cloud.storage.dao.GuestOSCategoryDao;
 +import com.cloud.storage.dao.GuestOSDao;
 +import com.cloud.storage.dao.StoragePoolHostDao;
 +import com.cloud.storage.dao.VolumeDao;
 +import com.cloud.user.AccountManager;
 +import com.cloud.utils.DateUtil;
 +import com.cloud.utils.NumbersUtil;
 +import com.cloud.utils.Pair;
 +import com.cloud.utils.component.Manager;
 +import com.cloud.utils.component.ManagerBase;
 +import com.cloud.utils.db.DB;
 +import com.cloud.utils.db.SearchCriteria;
 +import com.cloud.utils.db.Transaction;
 +import com.cloud.utils.db.TransactionCallback;
 +import com.cloud.utils.db.TransactionStatus;
  import com.cloud.utils.exception.CloudRuntimeException;
 -import com.cloud.utils.fsm.StateListener;
 -import com.cloud.vm.DiskProfile;
 -import com.cloud.vm.ReservationContext;
 -import com.cloud.vm.VMInstanceVO;
 -import com.cloud.vm.VirtualMachine;
 -import com.cloud.vm.VirtualMachine.Event;
 -import com.cloud.vm.VirtualMachine.State;
 +import com.cloud.utils.fsm.StateListener;
 +import com.cloud.vm.DiskProfile;
 +import com.cloud.vm.ReservationContext;
 +import com.cloud.vm.VMInstanceVO;
 +import com.cloud.vm.VirtualMachine;
 +import com.cloud.vm.VirtualMachine.Event;
 +import com.cloud.vm.VirtualMachine.State;
  import com.cloud.vm.VirtualMachineProfile;
 -import com.cloud.vm.dao.UserVmDao;
 -import com.cloud.vm.dao.VMInstanceDao;
 -
 +import com.cloud.vm.dao.UserVmDao;
 +import com.cloud.vm.dao.VMInstanceDao;
 +
  @Local(value = {DeploymentPlanningManager.class})
 -public class DeploymentPlanningManagerImpl extends ManagerBase implements DeploymentPlanningManager, Manager, Listener,
 -        StateListener<State, VirtualMachine.Event, VirtualMachine> {
 -
 -    private static final Logger s_logger = Logger.getLogger(DeploymentPlanningManagerImpl.class);
 -    @Inject
 -    AgentManager _agentMgr;
 -    @Inject
 -    protected UserVmDao _vmDao;
 -    @Inject
 -    protected VMInstanceDao _vmInstanceDao;
 -    @Inject
 -    protected AffinityGroupDao _affinityGroupDao;
 -    @Inject
 -    protected AffinityGroupVMMapDao _affinityGroupVMMapDao;
 -    @Inject
 -    AffinityGroupService _affinityGroupService;
 -    @Inject
 -    DataCenterDao _dcDao;
 -    @Inject
 -    PlannerHostReservationDao _plannerHostReserveDao;
 -    private int _vmCapacityReleaseInterval;
 -    @Inject
 -    MessageBus _messageBus;
 -    private Timer _timer = null;
 -    private long _hostReservationReleasePeriod = 60L * 60L * 1000L; // one hour by default
 -    @Inject
 -    protected VMReservationDao _reservationDao;
 -
 -    private static final long INITIAL_RESERVATION_RELEASE_CHECKER_DELAY = 30L * 1000L; // thirty seconds expressed in milliseconds
 -    protected long _nodeId = -1;
 -
 -    protected List<StoragePoolAllocator> _storagePoolAllocators;
 -
 -    public List<StoragePoolAllocator> getStoragePoolAllocators() {
 -        return _storagePoolAllocators;
 -    }
 +public class DeploymentPlanningManagerImpl extends ManagerBase implements DeploymentPlanningManager, Manager, Listener,
 +        StateListener<State, VirtualMachine.Event, VirtualMachine> {
 +
 +    private static final Logger s_logger = Logger.getLogger(DeploymentPlanningManagerImpl.class);
 +    @Inject
 +    AgentManager _agentMgr;
 +    @Inject
 +    protected UserVmDao _vmDao;
 +    @Inject
 +    protected VMInstanceDao _vmInstanceDao;
 +    @Inject
 +    protected AffinityGroupDao _affinityGroupDao;
 +    @Inject
 +    protected AffinityGroupVMMapDao _affinityGroupVMMapDao;
 +    @Inject
 +    AffinityGroupService _affinityGroupService;
 +    @Inject
 +    DataCenterDao _dcDao;
 +    @Inject
 +    PlannerHostReservationDao _plannerHostReserveDao;
 +    private int _vmCapacityReleaseInterval;
 +    @Inject
 +    MessageBus _messageBus;
 +    private Timer _timer = null;
 +    private long _hostReservationReleasePeriod = 60L * 60L * 1000L; // one hour by default
 +    @Inject
 +    protected VMReservationDao _reservationDao;
 +
 +    private static final long INITIAL_RESERVATION_RELEASE_CHECKER_DELAY = 30L * 1000L; // thirty seconds expressed in milliseconds
 +    protected long _nodeId = -1;
 +
 +    protected List<StoragePoolAllocator> _storagePoolAllocators;
 +
 +    public List<StoragePoolAllocator> getStoragePoolAllocators() {
 +        return _storagePoolAllocators;
 +    }
  
      public void setStoragePoolAllocators(List<StoragePoolAllocator> storagePoolAllocators) {
          _storagePoolAllocators = storagePoolAllocators;
@@@ -213,12 -217,16 +217,16 @@@
      DataStoreManager dataStoreMgr;
      @Inject
      protected ClusterDetailsDao _clusterDetailsDao;
+     @Inject
+     protected ResourceManager _resourceMgr;
+     @Inject
+     protected ServiceOfferingDetailsDao _serviceOfferingDetailsDao;
 +
 +    protected List<DeploymentPlanner> _planners;
  
 -    protected List<DeploymentPlanner> _planners;
 -
 -    public List<DeploymentPlanner> getPlanners() {
 -        return _planners;
 -    }
 +    public List<DeploymentPlanner> getPlanners() {
 +        return _planners;
 +    }
  
      public void setPlanners(List<DeploymentPlanner> planners) {
          _planners = planners;
@@@ -318,50 -326,54 +326,54 @@@
                  DataCenterDeployment lastPlan =
                      new DataCenterDeployment(host.getDataCenterId(), host.getPodId(), host.getClusterId(), hostIdSpecified, plan.getPoolId(), null,
                          plan.getReservationContext());
 -
 +
                  Pair<Map<Volume, List<StoragePool>>, List<Volume>> result = findSuitablePoolsForVolumes(vmProfile, lastPlan, avoids, HostAllocator.RETURN_UPTO_ALL);
 -                Map<Volume, List<StoragePool>> suitableVolumeStoragePools = result.first();
 -                List<Volume> readyAndReusedVolumes = result.second();
 -
 -                // choose the potential pool for this VM for this host
 -                if (!suitableVolumeStoragePools.isEmpty()) {
 -                    List<Host> suitableHosts = new ArrayList<Host>();
 -                    suitableHosts.add(host);
 -                    Pair<Host, Map<Volume, StoragePool>> potentialResources = findPotentialDeploymentResources(
 +                Map<Volume, List<StoragePool>> suitableVolumeStoragePools = result.first();
 +                List<Volume> readyAndReusedVolumes = result.second();
 +
 +                // choose the potential pool for this VM for this host
 +                if (!suitableVolumeStoragePools.isEmpty()) {
 +                    List<Host> suitableHosts = new ArrayList<Host>();
 +                    suitableHosts.add(host);
 +                    Pair<Host, Map<Volume, StoragePool>> potentialResources = findPotentialDeploymentResources(
                          suitableHosts, suitableVolumeStoragePools, avoids,
                          getPlannerUsage(planner, vmProfile, plan, avoids), readyAndReusedVolumes);
 -                    if (potentialResources != null) {
 -                        Pod pod = _podDao.findById(host.getPodId());
 -                        Cluster cluster = _clusterDao.findById(host.getClusterId());
 -                        Map<Volume, StoragePool> storageVolMap = potentialResources.second();
 -                        // remove the reused vol<->pool from destination, since
 -                        // we don't have to prepare this volume.
 -                        for (Volume vol : readyAndReusedVolumes) {
 -                            storageVolMap.remove(vol);
 -                        }
 -                        DeployDestination dest = new DeployDestination(dc, pod, cluster, host, storageVolMap);
 -                        s_logger.debug("Returning Deployment Destination: " + dest);
 -                        return dest;
 -                    }
 -                }
 -            }
 -            s_logger.debug("Cannnot deploy to specified host, returning.");
 -            return null;
 -        }
 -
 -        if (vm.getLastHostId() != null && haVmTag == null) {
 -            s_logger.debug("This VM has last host_id specified, trying to choose the same host: " + vm.getLastHostId());
 -
 -            HostVO host = _hostDao.findById(vm.getLastHostId());
 +                    if (potentialResources != null) {
 +                        Pod pod = _podDao.findById(host.getPodId());
 +                        Cluster cluster = _clusterDao.findById(host.getClusterId());
 +                        Map<Volume, StoragePool> storageVolMap = potentialResources.second();
 +                        // remove the reused vol<->pool from destination, since
 +                        // we don't have to prepare this volume.
 +                        for (Volume vol : readyAndReusedVolumes) {
 +                            storageVolMap.remove(vol);
 +                        }
 +                        DeployDestination dest = new DeployDestination(dc, pod, cluster, host, storageVolMap);
 +                        s_logger.debug("Returning Deployment Destination: " + dest);
 +                        return dest;
 +                    }
 +                }
 +            }
 +            s_logger.debug("Cannnot deploy to specified host, returning.");
 +            return null;
 +        }
 +
 +        if (vm.getLastHostId() != null && haVmTag == null) {
 +            s_logger.debug("This VM has last host_id specified, trying to choose the same host: " + vm.getLastHostId());
 +
 +            HostVO host = _hostDao.findById(vm.getLastHostId());
+             ServiceOfferingDetailsVO offeringDetails = null;
 -            if (host == null) {
 -                s_logger.debug("The last host of this VM cannot be found");
 -            } else if (avoids.shouldAvoid(host)) {
 -                s_logger.debug("The last host of this VM is in avoid set");
 -            } else if (_capacityMgr.checkIfHostReachMaxGuestLimit(host)) {
 +            if (host == null) {
 +                s_logger.debug("The last host of this VM cannot be found");
 +            } else if (avoids.shouldAvoid(host)) {
 +                s_logger.debug("The last host of this VM is in avoid set");
 +            } else if (_capacityMgr.checkIfHostReachMaxGuestLimit(host)) {
                  s_logger.debug("The last Host, hostId: " + host.getId() +
                      " already has max Running VMs(count includes system VMs), skipping this and trying other available hosts");
+             } else if ((offeringDetails  = _serviceOfferingDetailsDao.findDetail(offering.getId(), GPU.Keys.vgpuType.toString())) != null
+                     && !_resourceMgr.isGPUDeviceAvailable(host.getId(), offeringDetails.getValue())){
+                 s_logger.debug("The last host of this VM does not have required GPU devices available");
 -            } else {
 -                if (host.getStatus() == Status.Up && host.getResourceState() == ResourceState.Enabled) {
 +            } else {
 +                if (host.getStatus() == Status.Up && host.getResourceState() == ResourceState.Enabled) {
                      boolean hostTagsMatch = true;
                      if(offering.getHostTag() != null){
                          _hostDao.loadHostTags(host);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/network/IpAddressManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/IpAddressManagerImpl.java
index 5905fd3,15d1458..4b7d4b9
--- a/server/src/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/com/cloud/network/IpAddressManagerImpl.java
@@@ -660,115 -660,115 +660,115 @@@ public class IpAddressManagerImpl exten
          IPAddressVO addr = Transaction.execute(new TransactionCallbackWithException<IPAddressVO, InsufficientAddressCapacityException>() {
              @Override
              public IPAddressVO doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
 -                StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in ");
 -                boolean fetchFromDedicatedRange = false;
 -                List<Long> dedicatedVlanDbIds = new ArrayList<Long>();
 -                List<Long> nonDedicatedVlanDbIds = new ArrayList<Long>();
 -
 -                SearchCriteria<IPAddressVO> sc = null;
 -                if (podId != null) {
 -                    sc = AssignIpAddressFromPodVlanSearch.create();
 -                    sc.setJoinParameters("podVlanMapSB", "podId", podId);
 -                    errorMessage.append(" pod id=" + podId);
 -                } else {
 -                    sc = AssignIpAddressSearch.create();
 -                    errorMessage.append(" zone id=" + dcId);
 -                }
 +        StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in ");
 +        boolean fetchFromDedicatedRange = false;
 +        List<Long> dedicatedVlanDbIds = new ArrayList<Long>();
 +        List<Long> nonDedicatedVlanDbIds = new ArrayList<Long>();
 +
 +        SearchCriteria<IPAddressVO> sc = null;
 +        if (podId != null) {
 +            sc = AssignIpAddressFromPodVlanSearch.create();
 +            sc.setJoinParameters("podVlanMapSB", "podId", podId);
 +            errorMessage.append(" pod id=" + podId);
 +        } else {
 +            sc = AssignIpAddressSearch.create();
 +            errorMessage.append(" zone id=" + dcId);
 +        }
  
 -                // If owner has dedicated Public IP ranges, fetch IP from the dedicated range
 -                // Otherwise fetch IP from the system pool
 -                List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(owner.getId());
 -                for (AccountVlanMapVO map : maps) {
 -                    if (vlanDbIds == null || vlanDbIds.contains(map.getVlanDbId()))
 -                        dedicatedVlanDbIds.add(map.getVlanDbId());
 -                }
 -                List<VlanVO> nonDedicatedVlans = _vlanDao.listZoneWideNonDedicatedVlans(dcId);
 -                for (VlanVO nonDedicatedVlan : nonDedicatedVlans) {
 -                    if (vlanDbIds == null || vlanDbIds.contains(nonDedicatedVlan.getId()))
 -                        nonDedicatedVlanDbIds.add(nonDedicatedVlan.getId());
 -                }
 -                if (dedicatedVlanDbIds != null && !dedicatedVlanDbIds.isEmpty()) {
 -                    fetchFromDedicatedRange = true;
 -                    sc.setParameters("vlanId", dedicatedVlanDbIds.toArray());
 +        // If owner has dedicated Public IP ranges, fetch IP from the dedicated range
 +        // Otherwise fetch IP from the system pool
 +        List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(owner.getId());
 +        for (AccountVlanMapVO map : maps) {
 +            if (vlanDbIds == null || vlanDbIds.contains(map.getVlanDbId()))
 +                dedicatedVlanDbIds.add(map.getVlanDbId());
 +        }
 +        List<VlanVO> nonDedicatedVlans = _vlanDao.listZoneWideNonDedicatedVlans(dcId);
 +        for (VlanVO nonDedicatedVlan : nonDedicatedVlans) {
 +            if (vlanDbIds == null || vlanDbIds.contains(nonDedicatedVlan.getId()))
 +                nonDedicatedVlanDbIds.add(nonDedicatedVlan.getId());
 +        }
 +        if (dedicatedVlanDbIds != null && !dedicatedVlanDbIds.isEmpty()) {
 +            fetchFromDedicatedRange = true;
 +            sc.setParameters("vlanId", dedicatedVlanDbIds.toArray());
                      errorMessage.append(", vlanId id=" + Arrays.toString(dedicatedVlanDbIds.toArray()));
 -                } else if (nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
 -                    sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
 +        } else if (nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
 +            sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
-                     errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
+                     errorMessage.append(", vlanId id=" + Arrays.toString(nonDedicatedVlanDbIds.toArray()));
 -                } else {
 -                    if (podId != null) {
 -                        InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
 -                        ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
 -                        throw ex;
 -                    }
 -                    s_logger.warn(errorMessage.toString());
 -                    InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
 -                    ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
 -                    throw ex;
 -                }
 +        } else {
 +            if (podId != null) {
 +                InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
 +                ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
 +                throw ex;
 +            }
 +            s_logger.warn(errorMessage.toString());
 +            InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
 +            ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
 +            throw ex;
 +        }
  
 -                sc.setParameters("dc", dcId);
 +        sc.setParameters("dc", dcId);
  
 -                DataCenter zone = _entityMgr.findById(DataCenter.class, dcId);
 +        DataCenter zone = _entityMgr.findById(DataCenter.class, dcId);
  
 -                // for direct network take ip addresses only from the vlans belonging to the network
 -                if (vlanUse == VlanType.DirectAttached) {
 -                    sc.setJoinParameters("vlan", "networkId", guestNetworkId);
 -                    errorMessage.append(", network id=" + guestNetworkId);
 -                }
 -                sc.setJoinParameters("vlan", "type", vlanUse);
 +        // for direct network take ip addresses only from the vlans belonging to the network
 +        if (vlanUse == VlanType.DirectAttached) {
 +            sc.setJoinParameters("vlan", "networkId", guestNetworkId);
 +            errorMessage.append(", network id=" + guestNetworkId);
 +        }
 +        sc.setJoinParameters("vlan", "type", vlanUse);
  
 -                if (requestedIp != null) {
 -                    sc.addAnd("address", SearchCriteria.Op.EQ, requestedIp);
 -                    errorMessage.append(": requested ip " + requestedIp + " is not available");
 -                }
 +        if (requestedIp != null) {
 +            sc.addAnd("address", SearchCriteria.Op.EQ, requestedIp);
 +            errorMessage.append(": requested ip " + requestedIp + " is not available");
 +        }
  
 -                Filter filter = new Filter(IPAddressVO.class, "vlanId", true, 0l, 1l);
 +        Filter filter = new Filter(IPAddressVO.class, "vlanId", true, 0l, 1l);
  
 -                List<IPAddressVO> addrs = _ipAddressDao.lockRows(sc, filter, true);
 +        List<IPAddressVO> addrs = _ipAddressDao.lockRows(sc, filter, true);
  
 -                // If all the dedicated IPs of the owner are in use fetch an IP from the system pool
 -                if (addrs.size() == 0 && fetchFromDedicatedRange) {
 -                    // Verify if account is allowed to acquire IPs from the system
 -                    boolean useSystemIps = UseSystemPublicIps.valueIn(owner.getId());
 -                    if (useSystemIps && nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
 -                        fetchFromDedicatedRange = false;
 -                        sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
 +        // If all the dedicated IPs of the owner are in use fetch an IP from the system pool
 +        if (addrs.size() == 0 && fetchFromDedicatedRange) {
 +            // Verify if account is allowed to acquire IPs from the system
 +            boolean useSystemIps = UseSystemPublicIps.valueIn(owner.getId());
 +            if (useSystemIps && nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
 +                fetchFromDedicatedRange = false;
 +                sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
-                         errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
+                         errorMessage.append(", vlanId id=" + Arrays.toString(nonDedicatedVlanDbIds.toArray()));
 -                        addrs = _ipAddressDao.lockRows(sc, filter, true);
 -                    }
 -                }
 +                addrs = _ipAddressDao.lockRows(sc, filter, true);
 +            }
 +        }
  
 -                if (addrs.size() == 0) {
 -                    if (podId != null) {
 -                        InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
 -                        // for now, we hardcode the table names, but we should ideally do a lookup for the tablename from the VO object.
 -                        ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
 -                        throw ex;
 -                    }
 -                    s_logger.warn(errorMessage.toString());
 -                    InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
 -                    ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
 -                    throw ex;
 -                }
 +        if (addrs.size() == 0) {
 +            if (podId != null) {
 +                InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
 +                // for now, we hardcode the table names, but we should ideally do a lookup for the tablename from the VO object.
 +                ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
 +                throw ex;
 +            }
 +            s_logger.warn(errorMessage.toString());
 +            InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
 +            ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
 +            throw ex;
 +        }
  
 -                assert (addrs.size() == 1) : "Return size is incorrect: " + addrs.size();
 +        assert (addrs.size() == 1) : "Return size is incorrect: " + addrs.size();
  
 -                if (!fetchFromDedicatedRange) {
 -                    // Check that the maximum number of public IPs for the given accountId will not be exceeded
 -                    try {
 -                        _resourceLimitMgr.checkResourceLimit(owner, ResourceType.public_ip);
 -                    } catch (ResourceAllocationException ex) {
 -                        s_logger.warn("Failed to allocate resource of type " + ex.getResourceType() + " for account " + owner);
 -                        throw new AccountLimitException("Maximum number of public IP addresses for account: " + owner.getAccountName() + " has been exceeded.");
 -                    }
 -                }
 +        if (!fetchFromDedicatedRange) {
 +            // Check that the maximum number of public IPs for the given accountId will not be exceeded
 +            try {
 +                _resourceLimitMgr.checkResourceLimit(owner, ResourceType.public_ip);
 +            } catch (ResourceAllocationException ex) {
 +                s_logger.warn("Failed to allocate resource of type " + ex.getResourceType() + " for account " + owner);
 +                throw new AccountLimitException("Maximum number of public IP addresses for account: " + owner.getAccountName() + " has been exceeded.");
 +            }
 +        }
  
 -                IPAddressVO addr = addrs.get(0);
 -                addr.setSourceNat(sourceNat);
 -                addr.setAllocatedTime(new Date());
 -                addr.setAllocatedInDomainId(owner.getDomainId());
 -                addr.setAllocatedToAccountId(owner.getId());
 -                addr.setSystem(isSystem);
 +        IPAddressVO addr = addrs.get(0);
 +        addr.setSourceNat(sourceNat);
 +        addr.setAllocatedTime(new Date());
 +        addr.setAllocatedInDomainId(owner.getDomainId());
 +        addr.setAllocatedToAccountId(owner.getId());
 +        addr.setSystem(isSystem);
                  if (displayIp != null) {
                      addr.setDisplay(displayIp);
                  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------


[47/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
introduce OvsNetworkTopologyGuru that has convinenace functions to
   - get the hosts on which VPC spans given vpc id
   - get the VM's in the VPC
   - get the hosts on which a network spans
   - get the VPC's to which a hosts is part of
   - get VM's of a VPC on a hosts

introduces capability to build a physical toplogy representation of a
VPC. This json file is encapsulated in
OvsVpcPhysicalTopologyConfigCommand, and is used to send full topology
to hypervisor hosts. On hypervisor this json config can be used to setup
tunnels, configure bridge, add flow rules etc

Ovs GURU, to use different broasdcast scheme VS://vpcid.gerkey for the
networks in VPC that use distributed routing

each VIF and tunnel interface to carry the network UUID in other/options
config


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/8dcce6aa
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/8dcce6aa
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/8dcce6aa

Branch: refs/heads/distributedrouter
Commit: 8dcce6aa338ca8b5ac343f79822baabfc578631f
Parents: 73b6c1b
Author: Murali Reddy <mu...@gmail.com>
Authored: Mon Mar 10 12:52:30 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:58:19 2014 +0530

----------------------------------------------------------------------
 api/src/com/cloud/agent/api/to/NicTO.java       |   8 +
 .../kvm/resource/LibvirtComputingResource.java  |  34 +-
 .../xen/resource/CitrixResourceBase.java        |  95 +++--
 .../cloudstack/ovs/spring-ovs-context.xml       |   2 +-
 .../cloud/agent/api/OvsCreateTunnelCommand.java |  19 +-
 .../agent/api/OvsDestroyBridgeCommand.java      |  10 +-
 .../agent/api/OvsDestroyTunnelCommand.java      |  10 +-
 .../cloud/agent/api/OvsSetupBridgeCommand.java  |  10 +-
 .../OvsVpcPhysicalTopologyConfigCommand.java    | 127 +++++++
 .../com/cloud/network/element/OvsElement.java   |  35 +-
 .../cloud/network/guru/OvsGuestNetworkGuru.java |  17 +-
 .../network/ovs/OvsNetworkTopologyGuru.java     |  49 +++
 .../network/ovs/OvsNetworkTopologyGuruImpl.java |  74 ++++
 .../com/cloud/network/ovs/OvsTunnelManager.java |  16 +-
 .../cloud/network/ovs/OvsTunnelManagerImpl.java | 356 ++++++++++++++-----
 .../com/cloud/network/ovs/dao/OvsTunnel.java    |  24 ++
 .../network/ovs/dao/OvsTunnelNetworkVO.java     |   2 +-
 scripts/vm/hypervisor/xenserver/ovstunnel       |   2 +
 .../cloud/hypervisor/HypervisorGuruBase.java    |   7 +
 19 files changed, 737 insertions(+), 160 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/api/src/com/cloud/agent/api/to/NicTO.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/to/NicTO.java b/api/src/com/cloud/agent/api/to/NicTO.java
index bd8f24e..67660c8 100644
--- a/api/src/com/cloud/agent/api/to/NicTO.java
+++ b/api/src/com/cloud/agent/api/to/NicTO.java
@@ -80,4 +80,12 @@ public class NicTO extends NetworkTO {
     public List<String> getNicSecIps() {
         return nicSecIps;
     }
+
+    public String getNetworkUuid() {
+        return super.getUuid();
+    }
+
+    public void setNetworkUuid(String uuid) {
+        super.setUuid(uuid);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index cdeedfe..c1a7721 100755
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -1388,23 +1388,22 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
     }
 
     private Answer execute(OvsSetupBridgeCommand cmd) {
-        findOrCreateTunnelNetwork(cmd.getKey());
+        findOrCreateTunnelNetwork(cmd.getBridgeName());
         configureTunnelNetwork(cmd.getNetworkId(), cmd.getHostId(),
-                cmd.getKey());
+                cmd.getBridgeName());
         s_logger.debug("OVS Bridge configured");
         return new Answer(cmd, true, null);
     }
 
     private Answer execute(OvsDestroyBridgeCommand cmd) {
-        destroyTunnelNetwork(cmd.getKey());
+        destroyTunnelNetwork(cmd.getBridgeName());
         s_logger.debug("OVS Bridge destroyed");
         return new Answer(cmd, true, null);
     }
 
-    private synchronized void destroyTunnelNetwork(int key) {
+    private synchronized void destroyTunnelNetwork(String bridge) {
         try {
-            findOrCreateTunnelNetwork(key);
-            String bridge = "OVSTunnel" + key;
+            findOrCreateTunnelNetwork(bridge);
             Script cmd = new Script(_ovsTunnelPath, _timeout, s_logger);
             cmd.add("destroy_ovs_bridge");
             cmd.add("--bridge", bridge);
@@ -1423,9 +1422,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
         }
     }
 
-    private synchronized boolean findOrCreateTunnelNetwork(long key) {
+    private synchronized boolean findOrCreateTunnelNetwork(String nwName) {
         try {
-            String nwName = "OVSTunnel" + key;
             if (checkNetwork(nwName)) {
                 return true;
             }
@@ -1443,10 +1441,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
     }
 
     private synchronized boolean configureTunnelNetwork(long networkId,
-            long hostId, int key) {
+            long hostId, String nwName) {
         try {
-            findOrCreateTunnelNetwork(key);
-            String nwName = "OVSTunnel" + key;
+            findOrCreateTunnelNetwork(nwName);
             String configuredHosts = Script
                     .runSimpleBashScript("ovs-vsctl get bridge " + nwName
                             + " other_config:ovs_host_setup");
@@ -1463,7 +1460,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
             if (!configured) {
                 Script cmd = new Script(_ovsTunnelPath, _timeout, s_logger);
                 cmd.add("setup_ovs_bridge");
-                cmd.add("--key", String.valueOf(key));
+                cmd.add("--key", nwName);
                 cmd.add("--cs_host_id", ((Long)hostId).toString());
                 cmd.add("--bridge", nwName);
                 String result = cmd.execute();
@@ -1481,16 +1478,16 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
     }
 
     private OvsCreateTunnelAnswer execute(OvsCreateTunnelCommand cmd) {
-        String bridge = "OVSTunnel" + cmd.getKey();
+        String bridge = cmd.getNetworkName();
         try {
-            if (!findOrCreateTunnelNetwork(cmd.getKey())) {
+            if (!findOrCreateTunnelNetwork(bridge)) {
                 s_logger.debug("Error during bridge setup");
                 return new OvsCreateTunnelAnswer(cmd, false,
                         "Cannot create network", bridge);
             }
 
             configureTunnelNetwork(cmd.getNetworkId(), cmd.getFrom(),
-                    cmd.getKey());
+                    cmd.getNetworkName());
             Script command = new Script(_ovsTunnelPath, _timeout, s_logger);
             command.add("create_tunnel");
             command.add("--bridge", bridge);
@@ -1515,16 +1512,15 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
 
     private Answer execute(OvsDestroyTunnelCommand cmd) {
         try {
-            if (!findOrCreateTunnelNetwork(cmd.getKey())) {
+            if (!findOrCreateTunnelNetwork(cmd.getBridgeName())) {
                 s_logger.warn("Unable to find tunnel network for GRE key:"
-                        + cmd.getKey());
+                        + cmd.getBridgeName());
                 return new Answer(cmd, false, "No network found");
             }
 
-            String bridge = "OVSTunnel" + cmd.getKey();
             Script command = new Script(_ovsTunnelPath, _timeout, s_logger);
             command.add("destroy_tunnel");
-            command.add("--bridge", bridge);
+            command.add("--bridge", cmd.getBridgeName());
             command.add("--iface_name", cmd.getInPortName());
             String result = command.execute();
             if (result == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 9103b59..3e7dfaf 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -148,6 +148,7 @@ import com.cloud.agent.api.OvsFetchInterfaceCommand;
 import com.cloud.agent.api.OvsSetTagAndFlowAnswer;
 import com.cloud.agent.api.OvsSetTagAndFlowCommand;
 import com.cloud.agent.api.OvsSetupBridgeCommand;
+import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
 import com.cloud.agent.api.PerformanceMonitorAnswer;
 import com.cloud.agent.api.PerformanceMonitorCommand;
 import com.cloud.agent.api.PingCommand;
@@ -507,6 +508,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             return execute((OvsSetTagAndFlowCommand)cmd);
         } else if (clazz == OvsDeleteFlowCommand.class) {
             return execute((OvsDeleteFlowCommand)cmd);
+        } else if (clazz == OvsVpcPhysicalTopologyConfigCommand.class) {
+            return execute((OvsVpcPhysicalTopologyConfigCommand) cmd);
         } else if (clazz == CleanupNetworkRulesCmd.class) {
             return execute((CleanupNetworkRulesCmd)cmd);
         } else if (clazz == NetworkRulesSystemVmCommand.class) {
@@ -964,15 +967,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
     /**
      * This method just creates a XenServer network following the tunnel network naming convention
      */
-    private synchronized Network findOrCreateTunnelNetwork(Connection conn, long key) {
+    private synchronized Network findOrCreateTunnelNetwork(Connection conn, String nwName) {
         try {
-            String nwName = "OVSTunnel" + key;
             Network nw = null;
             Network.Record rec = new Network.Record();
             Set<Network> networks = Network.getByNameLabel(conn, nwName);
 
             if (networks.size() == 0) {
-                rec.nameDescription = "tunnel network id# " + key;
+                rec.nameDescription = "tunnel network id# " + nwName;
                 rec.nameLabel = nwName;
                 //Initialize the ovs-host-setup to avoid error when doing get-param in plugin
                 Map<String, String> otherConfig = new HashMap<String, String>();
@@ -981,7 +983,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                 nw = Network.create(conn, rec);
                 // Plug dom0 vif only when creating network
                 if (!is_xcp())
-                    enableXenServerNetwork(conn, nw, nwName, "tunnel network for account " + key);
+                    enableXenServerNetwork(conn, nw, nwName, "tunnel network for account " + nwName);
                 s_logger.debug("### Xen Server network for tunnels created:" + nwName);
             } else {
                 nw = networks.iterator().next();
@@ -997,10 +999,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
     /**
      * This method creates a XenServer network and configures it for being used as a L2-in-L3 tunneled network
      */
-    private synchronized Network configureTunnelNetwork(Connection conn, long networkId, long hostId, int key) {
+    private synchronized Network configureTunnelNetwork(Connection conn, long networkId, long hostId, String bridgeName) {
         try {
-            Network nw = findOrCreateTunnelNetwork(conn, key);
-            String nwName = "OVSTunnel" + key;
+            Network nw = findOrCreateTunnelNetwork(conn, bridgeName);
+            String nwName = bridgeName;
             //Invoke plugin to setup the bridge which will be used by this network
             String bridge = nw.getBridge(conn);
             Map<String, String> nwOtherConfig = nw.getOtherConfig(conn);
@@ -1018,11 +1020,20 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             if (!configured) {
                 // Plug dom0 vif only if not done before for network and host
                 if (!is_xcp())
-                    enableXenServerNetwork(conn, nw, nwName, "tunnel network for account " + key);
-                String result = callHostPlugin(conn, "ovstunnel", "setup_ovs_bridge", "bridge", bridge,
-                        "key", String.valueOf(key),
-                        "xs_nw_uuid", nw.getUuid(conn),
-                        "cs_host_id", ((Long)hostId).toString());
+                    enableXenServerNetwork(conn, nw, nwName, "tunnel network for account " + bridgeName);
+                String result;
+                if (bridgeName.startsWith("OVS-DR-VPC-Bridge")) {
+                    result = callHostPlugin(conn, "ovstunnel", "setup_ovs_bridge_for_distributed_routing", "bridge", bridge,
+                            "key", bridgeName,
+                            "xs_nw_uuid", nw.getUuid(conn),
+                            "cs_host_id", ((Long)hostId).toString());
+                } else {
+                    result = callHostPlugin(conn, "ovstunnel", "setup_ovs_bridge", "bridge", bridge,
+                            "key", bridgeName,
+                            "xs_nw_uuid", nw.getUuid(conn),
+                            "cs_host_id", ((Long)hostId).toString());
+                }
+
                 //Note down the fact that the ovs bridge has been setup
                 String[] res = result.split(":");
                 if (res.length != 2 || !res[0].equalsIgnoreCase("SUCCESS")) {
@@ -1037,9 +1048,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         }
     }
 
-    private synchronized void destroyTunnelNetwork(Connection conn, int key) {
+    private synchronized void destroyTunnelNetwork(Connection conn, String bridgeName) {
         try {
-            Network nw = findOrCreateTunnelNetwork(conn, key);
+            Network nw = findOrCreateTunnelNetwork(conn, bridgeName);
             String bridge = nw.getBridge(conn);
             String result = callHostPlugin(conn, "ovstunnel", "destroy_ovs_bridge", "bridge", bridge);
             String[] res = result.split(":");
@@ -1079,8 +1090,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                 _isOvs = true;
                 return setupvSwitchNetwork(conn);
             } else {
-                long vnetId = Long.parseLong(BroadcastDomainType.getValue(uri));
-                return findOrCreateTunnelNetwork(conn, vnetId);
+                return findOrCreateTunnelNetwork(conn, getOvsTunnelNetworkName(BroadcastDomainType.getValue(uri)));
             }
         } else if (type == BroadcastDomainType.Storage) {
             if (uri == null) {
@@ -1102,6 +1112,19 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         throw new CloudRuntimeException("Unable to support this type of network broadcast domain: " + nic.getBroadcastUri());
     }
 
+    private String getOvsTunnelNetworkName(String broadcastUri) {
+        if (broadcastUri.contains(".")) {
+            String[] parts = broadcastUri.split(".");
+            return "OVS-DR-VPC-Bridge"+parts[0];
+         } else {
+            try {
+                return "OVSTunnel" + broadcastUri;
+            } catch (Exception e) {
+                return null;
+            }
+         }
+    }
+
     protected VIF createVif(Connection conn, String vmName, VM vm, VirtualMachineTO vmSpec, NicTO nic) throws XmlRpcException, XenAPIException {
         assert (nic.getUuid() != null) : "Nic should have a uuid value";
 
@@ -1122,7 +1145,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         if (vmSpec != null) {
             vifr.otherConfig.put("cloudstack-vm-id", vmSpec.getUuid());
         }
-
+        vifr.otherConfig.put("cloudstack-network-id", nic.getNetworkUuid());
         vifr.network = getNetwork(conn, nic);
 
         if (nic.getNetworkRateMbps() != null && nic.getNetworkRateMbps().intValue() != -1) {
@@ -5220,15 +5243,15 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
     private Answer execute(OvsSetupBridgeCommand cmd) {
         Connection conn = getConnection();
-        findOrCreateTunnelNetwork(conn, cmd.getKey());
-        configureTunnelNetwork(conn, cmd.getNetworkId(), cmd.getHostId(), cmd.getKey());
+        findOrCreateTunnelNetwork(conn, cmd.getBridgeName());
+        configureTunnelNetwork(conn, cmd.getNetworkId(), cmd.getHostId(), cmd.getBridgeName());
         s_logger.debug("OVS Bridge configured");
         return new Answer(cmd, true, null);
     }
 
     private Answer execute(OvsDestroyBridgeCommand cmd) {
         Connection conn = getConnection();
-        destroyTunnelNetwork(conn, cmd.getKey());
+        destroyTunnelNetwork(conn, cmd.getBridgeName());
         s_logger.debug("OVS Bridge destroyed");
         return new Answer(cmd, true, null);
     }
@@ -5236,14 +5259,14 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
     private Answer execute(OvsDestroyTunnelCommand cmd) {
         Connection conn = getConnection();
         try {
-            Network nw = findOrCreateTunnelNetwork(conn, cmd.getNetworkId());
+            Network nw = findOrCreateTunnelNetwork(conn, cmd.getBridgeName());
             if (nw == null) {
-                s_logger.warn("Unable to find tunnel network for GRE key:" + cmd.getKey());
+                s_logger.warn("Unable to find tunnel network for GRE key:" + cmd.getBridgeName());
                 return new Answer(cmd, false, "No network found");
             }
 
             String bridge = nw.getBridge(conn);
-            String result = callHostPlugin(conn, "ovstunnel", "destroy_tunnel", "bridge", bridge, "in_port", cmd.getInPortName());
+            String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge", bridge, "in_port", cmd.getInPortName());
             if (result.equalsIgnoreCase("SUCCESS")) {
                 return new Answer(cmd, true, result);
             } else {
@@ -5255,6 +5278,22 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         }
     }
 
+    public Answer execute(OvsVpcPhysicalTopologyConfigCommand cmd) {
+        Connection conn = getConnection();
+        try {
+            String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge",
+                    cmd.getBridgeName(), "host-id", ((Long)cmd.getHostId()).toString());
+            if (result.equalsIgnoreCase("SUCCESS")) {
+                return new Answer(cmd, true, result);
+            } else {
+                return new Answer(cmd, false, result);
+            }
+        } catch  (Exception e) {
+            s_logger.warn("caught exception while updating host with latest VPC topology", e);
+            return new Answer(cmd, false, e.getMessage());
+        }
+    }
+
     private Answer execute(UpdateHostPasswordCommand cmd) {
         _password.add(cmd.getNewPassword());
         return new Answer(cmd, true, null);
@@ -5264,17 +5303,19 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         Connection conn = getConnection();
         String bridge = "unknown";
         try {
-            Network nw = findOrCreateTunnelNetwork(conn, cmd.getKey());
+            Network nw = findOrCreateTunnelNetwork(conn, cmd.getNetworkName());
             if (nw == null) {
                 s_logger.debug("Error during bridge setup");
                 return new OvsCreateTunnelAnswer(cmd, false, "Cannot create network", bridge);
             }
 
-            configureTunnelNetwork(conn, cmd.getNetworkId(), cmd.getFrom(), cmd.getKey());
+            configureTunnelNetwork(conn, cmd.getNetworkId(), cmd.getFrom(), cmd.getNetworkName());
             bridge = nw.getBridge(conn);
             String result =
-                    callHostPlugin(conn, "ovstunnel", "create_tunnel", "bridge", bridge, "remote_ip", cmd.getRemoteIp(), "key", cmd.getKey().toString(), "from",
-                            cmd.getFrom().toString(), "to", cmd.getTo().toString());
+                    callHostPlugin(conn, "ovstunnel", "create_tunnel", "bridge", bridge, "remote_ip", cmd.getRemoteIp(),
+                            "key", cmd.getKey().toString(), "from",
+                            cmd.getFrom().toString(), "to", cmd.getTo().toString(), "cloudstack-network-id",
+                            cmd.getNetworkUuid());
             String[] res = result.split(":");
             if (res.length == 2 && res[0].equalsIgnoreCase("SUCCESS")) {
                 return new OvsCreateTunnelAnswer(cmd, true, result, res[1], bridge);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/resources/META-INF/cloudstack/ovs/spring-ovs-context.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/resources/META-INF/cloudstack/ovs/spring-ovs-context.xml b/plugins/network-elements/ovs/resources/META-INF/cloudstack/ovs/spring-ovs-context.xml
index e60d93e..fa56d5d 100644
--- a/plugins/network-elements/ovs/resources/META-INF/cloudstack/ovs/spring-ovs-context.xml
+++ b/plugins/network-elements/ovs/resources/META-INF/cloudstack/ovs/spring-ovs-context.xml
@@ -38,5 +38,5 @@
     <bean id="ovsTunnelManagerImpl" class="com.cloud.network.ovs.OvsTunnelManagerImpl" />
     <bean id="ovsTunnelInterfaceDaoImpl" class="com.cloud.network.ovs.dao.OvsTunnelInterfaceDaoImpl" />
     <bean id="ovsTunnelNetworkDaoImpl" class="com.cloud.network.ovs.dao.OvsTunnelNetworkDaoImpl" />
-    
+    <bean id="ovsNetworkTopologyGuruImpl" class="com.cloud.network.ovs.OvsNetworkTopologyGuruImpl"/>
 </beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsCreateTunnelCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsCreateTunnelCommand.java b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsCreateTunnelCommand.java
index 7f151fb..3e08531 100644
--- a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsCreateTunnelCommand.java
+++ b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsCreateTunnelCommand.java
@@ -20,10 +20,13 @@ package com.cloud.agent.api;
 public class OvsCreateTunnelCommand extends Command {
     Integer key;
     String remoteIp;
+    String networkName;
     Long from;
     Long to;
     long networkId;
 
+    String networkUuid;
+
     // for debug info
     String fromIp;
 
@@ -33,13 +36,15 @@ public class OvsCreateTunnelCommand extends Command {
     }
 
     public OvsCreateTunnelCommand(String remoteIp, Integer key, Long from,
-            Long to, long networkId, String fromIp) {
+            Long to, long networkId, String fromIp, String networkName, String networkUuid) {
         this.remoteIp = remoteIp;
         this.key = key;
         this.from = from;
         this.to = to;
         this.networkId = networkId;
         this.fromIp = fromIp;
+        this.networkName = networkName;
+        this.networkUuid = networkUuid;
     }
 
     public Integer getKey() {
@@ -66,4 +71,16 @@ public class OvsCreateTunnelCommand extends Command {
         return fromIp;
     }
 
+    public String getNetworkName() {
+        return networkName;
+    }
+
+
+    public String getNetworkUuid() {
+        return networkUuid;
+    }
+
+    public void setNetworkUuid(String networkUuid) {
+        this.networkUuid = networkUuid;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsDestroyBridgeCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsDestroyBridgeCommand.java b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsDestroyBridgeCommand.java
index 59b50be..f9205c5 100644
--- a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsDestroyBridgeCommand.java
+++ b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsDestroyBridgeCommand.java
@@ -21,19 +21,19 @@ package com.cloud.agent.api;
 public class OvsDestroyBridgeCommand extends Command {
 
     Long networkId;
-    Integer key;
+    String name;
 
-    public OvsDestroyBridgeCommand(Long networkId, Integer key) {
+    public OvsDestroyBridgeCommand(Long networkId, String name) {
         this.networkId = networkId;
-        this.key = key;
+        this.name = name;
     }
 
     public Long getNetworkId() {
         return networkId;
     }
 
-    public Integer getKey() {
-        return key;
+    public String getBridgeName() {
+        return name;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsDestroyTunnelCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsDestroyTunnelCommand.java b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsDestroyTunnelCommand.java
index 4776a07..9fc6c37 100644
--- a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsDestroyTunnelCommand.java
+++ b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsDestroyTunnelCommand.java
@@ -20,14 +20,14 @@ package com.cloud.agent.api;
 public class OvsDestroyTunnelCommand extends Command {
 
     Long networkId;
-    Integer key;
+    String networkName;
     String inPortName;
 
-    public OvsDestroyTunnelCommand(Long networkId, Integer key,
+    public OvsDestroyTunnelCommand(Long networkId, String networkName,
             String inPortName) {
         this.networkId = networkId;
         this.inPortName = inPortName;
-        this.key = key;
+        this.networkName = networkName;
     }
 
     public Long getNetworkId() {
@@ -38,8 +38,8 @@ public class OvsDestroyTunnelCommand extends Command {
         return inPortName;
     }
 
-    public Integer getKey() {
-        return key;
+    public String getBridgeName() {
+        return networkName;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsSetupBridgeCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsSetupBridgeCommand.java b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsSetupBridgeCommand.java
index e3390f3..a104598 100644
--- a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsSetupBridgeCommand.java
+++ b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsSetupBridgeCommand.java
@@ -19,7 +19,7 @@ package com.cloud.agent.api;
 
 
 public class OvsSetupBridgeCommand extends Command {
-    Integer key;
+    String name;
     Long hostId;
     Long networkId;
 
@@ -28,14 +28,14 @@ public class OvsSetupBridgeCommand extends Command {
         return true;
     }
 
-    public OvsSetupBridgeCommand(Integer key, Long hostId, Long networkId) {
-        this.key = key;
+    public OvsSetupBridgeCommand(String name, Long hostId, Long networkId) {
+        this.name = name;
         this.hostId = hostId;
         this.networkId = networkId;
     }
 
-    public Integer getKey() {
-        return key;
+    public String getBridgeName() {
+        return name;
     }
 
     public Long getHostId() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
new file mode 100644
index 0000000..35d4c6e
--- /dev/null
+++ b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
@@ -0,0 +1,127 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.agent.api;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+/**
+ * This command represents view of how a VPC is laid out (on which hosts, which VM is on which host etc)
+ * on the physical infrastructure.
+ */
+public class OvsVpcPhysicalTopologyConfigCommand extends Command {
+
+    VpcConfig vpcConfig =null;
+    long hostId;
+    String bridgeName;
+
+    public static class Host {
+        long hostId;
+        String ipAddress;
+
+        public Host (long hostId, String ipAddress) {
+            this.hostId = hostId;
+            this.ipAddress = ipAddress;
+        }
+    }
+
+    public static class Nic {
+        String ipAddress;
+        String macAddress;
+        String networkUuid;
+        public Nic (String ipAddress, String macAddress, String networkUuid) {
+            this.ipAddress = ipAddress;
+            this.macAddress = macAddress;
+            this.networkUuid = networkUuid;
+        }
+    }
+
+    public static class Tier {
+        long greKey;
+        String networkUuid;
+        String gatewayIp;
+        String gatewayMac;
+        String cidr;
+        public Tier(long greKey, String networkUuid, String gatewayIp, String gatewayMac, String cidr) {
+            this.greKey = greKey;
+            this.networkUuid = networkUuid;
+            this.gatewayIp = gatewayIp;
+            this.gatewayMac = gatewayMac;
+            this.cidr = cidr;
+        }
+    }
+
+    public static class Vm {
+        long hostId;
+        Nic[] nics;
+        public Vm(long hostId, Nic[] nics) {
+            this.hostId = hostId;
+            this.nics = nics;
+        }
+    }
+
+    public static class Vpc {
+        String cidr;
+        Host[] hosts;
+        Tier[] tiers;
+        Vm[]  vms;
+        public Vpc(Host[] hosts, Tier[] tiers, Vm[] vms, String cidr) {
+            this.hosts = hosts;
+            this.tiers = tiers;
+            this.vms = vms;
+            this.cidr = cidr;
+        }
+    }
+
+    public static class VpcConfig {
+        Vpc vpc;
+        public VpcConfig(Vpc vpc) {
+            this.vpc = vpc;
+        }
+    }
+
+    public OvsVpcPhysicalTopologyConfigCommand(Host[] hosts, Tier[] tiers, Vm[] vms, String cidr) {
+        Vpc vpc = new Vpc(hosts, tiers, vms, cidr);
+        vpcConfig = new VpcConfig(vpc);
+    }
+
+    public String getjsonVpcConfig() {
+        Gson gson = new GsonBuilder().create();
+        return gson.toJson(vpcConfig).toLowerCase();
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+
+    public void setHostId(long hostId) {
+        this.hostId = hostId;
+    }
+
+    public long getHostId() {
+        return hostId;
+    }
+
+    public String getBridgeName() {
+        return bridgeName;
+    }
+
+    public void setBridgeName(String bridgeName) {
+        this.bridgeName = bridgeName;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java b/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
index 05e81a1..c28d908 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.network.element;
 
+import com.cloud.host.dao.HostDao;
+import com.cloud.vm.dao.UserVmDao;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -73,6 +75,8 @@ import com.cloud.vm.NicProfile;
 import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VirtualMachine;
 
 @Local(value = {NetworkElement.class, ConnectivityProvider.class,
         SourceNatServiceProvider.class, StaticNatServiceProvider.class,
@@ -93,6 +97,10 @@ StaticNatServiceProvider, IpDeployer {
     DomainRouterDao _routerDao;
     @Inject
     VpcVirtualNetworkApplianceManager _routerMgr;
+    @Inject
+    UserVmDao _userVmDao;
+    @Inject
+    HostDao _hostDao;
 
     private static final Logger s_logger = Logger.getLogger(OvsElement.class);
     private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
@@ -171,7 +179,12 @@ StaticNatServiceProvider, IpDeployer {
             return false;
         }
 
-        _ovsTunnelMgr.vmCheckAndCreateTunnel(vm, network, dest);
+        if (vm.getType() != VirtualMachine.Type.User && vm.getType() != VirtualMachine.Type.DomainRouter) {
+            return false;
+        }
+
+        // prepare the tunnel network on the host, in order for VM to get launched
+        _ovsTunnelMgr.checkAndPrepareHostForTunnelNetwork(network, dest.getHost());
 
         return true;
     }
@@ -192,7 +205,25 @@ StaticNatServiceProvider, IpDeployer {
             return false;
         }
 
-        _ovsTunnelMgr.checkAndDestroyTunnel(vm.getVirtualMachine(), network);
+        List<UserVmVO> userVms = _userVmDao.listByAccountIdAndHostId(vm.getVirtualMachine().getAccountId(),
+                vm.getVirtualMachine().getHostId());
+        if (vm.getType() == VirtualMachine.Type.User) {
+            if (userVms.size() > 1) {
+                return true;
+            }
+
+            List<DomainRouterVO> routers = _routerDao.findByNetwork(network.getId());
+            for (DomainRouterVO router : routers) {
+                if (router.getHostId().equals(vm.getVirtualMachine().getHostId())) {
+                    return true;
+                }
+            }
+        } else if (vm.getType() == VirtualMachine.Type.DomainRouter && userVms.size() != 0) {
+            return true;
+        }
+
+        HostVO host = _hostDao.findById(vm.getVirtualMachine().getHostId());
+        _ovsTunnelMgr.checkAndRemoveHostFromTunnelNetwork(network, host);
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java b/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
index 8fa636d..2814c2a 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.network.guru;
 
+import com.cloud.network.vpc.VpcVO;
+import com.cloud.network.vpc.dao.VpcDao;
 import javax.ejb.Local;
 import javax.inject.Inject;
 
@@ -61,6 +63,8 @@ public class OvsGuestNetworkGuru extends GuestNetworkGuru {
     OvsTunnelManager _ovsTunnelMgr;
     @Inject
     NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao;
+    @Inject
+    VpcDao _vpcDao;
 
     OvsGuestNetworkGuru() {
         super();
@@ -145,10 +149,14 @@ public class OvsGuestNetworkGuru extends GuestNetworkGuru {
             implemented.setCidr(network.getCidr());
         }
 
-        // do we need to create switch right now?
-
         implemented.setBroadcastDomainType(BroadcastDomainType.Vswitch);
 
+        if (network.getVpcId() != null && isVpcEnabledForDistributedRouter(network.getVpcId())) {
+            String keyStr = BroadcastDomainType.getValue(implemented.getBroadcastUri());
+            Long vpcid= network.getVpcId();
+            implemented.setBroadcastUri(BroadcastDomainType.Vswitch.toUri(vpcid.toString()+keyStr));
+        }
+
         return implemented;
     }
 
@@ -215,4 +223,9 @@ public class OvsGuestNetworkGuru extends GuestNetworkGuru {
             implemented.setBroadcastUri(network.getBroadcastUri());
         }
     }
+
+    boolean isVpcEnabledForDistributedRouter(long vpcId) {
+        VpcVO vpc = _vpcDao.findById(vpcId);
+        return vpc.usesDistributedRouter();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
new file mode 100644
index 0000000..c410d10
--- /dev/null
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
@@ -0,0 +1,49 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.network.ovs;
+
+import com.cloud.utils.component.Manager;
+
+import java.util.List;
+
+public interface OvsNetworkTopologyGuru extends Manager {
+
+    /**
+     * get the list of hypervisor hosts id's on which VM's belonging to the network currently spans
+     */
+    public  List<Long> getNetworkSpanedHosts(long networkId);
+
+    /**
+     * get the list of hypervisor hosts id's on which VM's belonging to a VPC spans
+     */
+    public  List<Long> getVpcSpannedHosts(long vpId);
+
+    /**
+     * get the list of VPC id's of the vpc's for which one or more VM's from the VPC are running on the host
+     */
+    public  List<Long> getVpcOnHost(long hostId);
+
+    /**
+     * get the list of all active Vm id's in the VPC for all ther tiers
+     */
+    public List<Long> getAllActiveVmsInVpc(long vpcId);
+
+    /**
+     * get the list of all Vm id's in the VPC for all the tiers that are running on the host
+     */
+    public List<Long> getActiveVmsInVpcOnHost(long vpcId, long hostId);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
new file mode 100644
index 0000000..7560e35
--- /dev/null
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
@@ -0,0 +1,74 @@
+package com.cloud.network.ovs;
+
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.UserVmDao;
+import java.util.ArrayList;
+import java.util.List;
+import javax.ejb.Local;
+import javax.inject.Inject;
+import org.springframework.stereotype.Component;
+
+@Component
+@Local(value = {OvsNetworkTopologyGuru.class})
+public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetworkTopologyGuru {
+
+    @Inject
+    UserVmDao _userVmDao;
+    @Inject
+    DomainRouterDao _routerDao;
+
+    /**
+     * get the list of hypervisor hosts on which VM's belonging to a network currently spans
+     */
+    public  List<Long> getNetworkSpanedHosts(long networkId) {
+        List<Long> hostIds = new ArrayList<Long>();
+        // Find active VMs with a NIC on the target network
+        List<UserVmVO> vms = _userVmDao.listByNetworkIdAndStates(networkId,
+                VirtualMachine.State.Running, VirtualMachine.State.Starting, VirtualMachine.State.Stopping, VirtualMachine.State.Unknown,
+                VirtualMachine.State.Migrating);
+        // Find routers for the network
+        List<DomainRouterVO> routers = _routerDao.findByNetwork(networkId);
+        List<VMInstanceVO> ins = new ArrayList<VMInstanceVO>();
+        if (vms != null) {
+            ins.addAll(vms);
+        }
+        if (routers.size() != 0) {
+            ins.addAll(routers);
+        }
+        for (VMInstanceVO v : ins) {
+            Long rh = v.getHostId();
+            if (rh == null) {
+                continue;
+            }
+            if (!hostIds.contains(rh)) {
+                hostIds.add(rh);
+            }
+        }
+        return  hostIds;
+    }
+
+    @Override
+    public List<Long> getVpcSpannedHosts(long vpId) {
+        return null;
+    }
+
+    @Override
+    public List<Long> getVpcOnHost(long hostId) {
+        return null;
+    }
+
+    @Override
+    public List<Long> getAllActiveVmsInVpc(long vpcId) {
+        return null;
+    }
+
+    @Override
+    public List<Long> getActiveVmsInVpcOnHost(long vpcId, long hostId) {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManager.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManager.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManager.java
index 118beeb..cd88136 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManager.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManager.java
@@ -16,18 +16,24 @@
 // under the License.
 package com.cloud.network.ovs;
 
-import com.cloud.deploy.DeployDestination;
+import com.cloud.host.Host;
 import com.cloud.network.Network;
 import com.cloud.utils.component.Manager;
-import com.cloud.vm.VirtualMachine;
-import com.cloud.vm.VirtualMachineProfile;
 
 public interface OvsTunnelManager extends Manager {
 
     boolean isOvsTunnelEnabled();
 
-    public void vmCheckAndCreateTunnel(VirtualMachineProfile vm, Network nw, DeployDestination dest);
+    /**
+     *  create a bridge on the host if not already created for the network and establish full tunnel mesh with
+     *  the rest of the hosts on which network spans
+     */
+    public void checkAndPrepareHostForTunnelNetwork(Network nw, Host host);
 
-    public void checkAndDestroyTunnel(VirtualMachine vm, Network nw);
+    /**
+     * remove the bridge and tunnels to the hosts on which network spans if there are no other VM's
+     * belonging to the network are running on the host
+     */
+    public void checkAndRemoveHostFromTunnelNetwork(Network nw, Host host);
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
index 320568b..ae37095 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
@@ -16,6 +16,12 @@
 // under the License.
 package com.cloud.network.ovs;
 
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.vpc.VpcManager;
+import com.cloud.vm.Nic;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.VMInstanceDao;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -42,9 +48,9 @@ import com.cloud.agent.api.OvsDestroyTunnelCommand;
 import com.cloud.agent.api.OvsFetchInterfaceAnswer;
 import com.cloud.agent.api.OvsFetchInterfaceCommand;
 import com.cloud.agent.api.OvsSetupBridgeCommand;
+import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
 import com.cloud.agent.manager.Commands;
 import com.cloud.configuration.Config;
-import com.cloud.deploy.DeployDestination;
 import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.OperationTimedoutException;
 import com.cloud.host.Host;
@@ -60,19 +66,15 @@ import com.cloud.network.ovs.dao.OvsTunnelInterfaceDao;
 import com.cloud.network.ovs.dao.OvsTunnelInterfaceVO;
 import com.cloud.network.ovs.dao.OvsTunnelNetworkDao;
 import com.cloud.network.ovs.dao.OvsTunnelNetworkVO;
+import com.cloud.network.ovs.dao.OvsTunnel;
+import com.cloud.network.vpc.dao.VpcDao;
+import com.cloud.network.vpc.VpcVO;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.vm.DomainRouterVO;
-import com.cloud.vm.UserVmVO;
-import com.cloud.vm.VMInstanceVO;
-import com.cloud.vm.VirtualMachine;
-import com.cloud.vm.VirtualMachine.State;
-import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.NicDao;
-import com.cloud.vm.dao.UserVmDao;
 
 @Component
 @Local(value = {OvsTunnelManager.class})
@@ -91,8 +93,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
     HostDao _hostDao;
     @Inject
     PhysicalNetworkTrafficTypeDao _physNetTTDao;
-    @Inject
-    UserVmDao _userVmDao;
+
     @Inject
     DomainRouterDao _routerDao;
     @Inject
@@ -101,6 +102,16 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
     OvsTunnelInterfaceDao _tunnelInterfaceDao;
     @Inject
     AgentManager _agentMgr;
+    @Inject
+    OvsNetworkTopologyGuru _ovsNetworkToplogyGuru;
+    @Inject
+    VpcDao _vpcDao;
+    @Inject
+    VpcManager _vpcMgr;
+    @Inject
+    protected VMInstanceDao _vmInstanceDao;
+    @Inject
+    NetworkDao _networkDao;
 
     @Override
     public boolean configure(String name, Map<String, Object> params)
@@ -182,13 +193,13 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                             from, to, networkId));
         }
         if (!r.getResult()) {
-            tunnel.setState("FAILED");
-            s_logger.warn("Create GRE tunnel failed due to " + r.getDetails()
+            tunnel.setState(OvsTunnel.State.Failed.name());
+            s_logger.warn("Create GRE tunnel from " + from + " to " + to + " failed due to " + r.getDetails()
                     + s);
         } else {
-            tunnel.setState("SUCCESS");
+            tunnel.setState(OvsTunnel.State.Established.name());
             tunnel.setPortName(r.getInPortName());
-            s_logger.warn("Create GRE tunnel " + r.getDetails() + s);
+            s_logger.info("Create GRE tunnel from " + from + " to " + to + " succeeded." + r.getDetails() + s);
         }
         _tunnelNetworkDao.update(tunnel.getId(), tunnel);
     }
@@ -249,13 +260,14 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
         int key = 0;
         try {
             //The GRE key is actually in the host part of the URI
-            // this is not true for lswitch/NiciraNvp!
             String keyStr = BroadcastDomainType.getValue(network.getBroadcastUri());
-            // The key is most certainly and int if network is a vlan.
-            // !! not in the case of lswitch/pvlan/(possibly)vswitch
-            // So we now feel quite safe in converting it into a string
-            // by calling the appropriate BroadcastDomainType method
-            key = Integer.parseInt(keyStr);
+            if (keyStr.contains(".")) {
+                String[] parts = keyStr.split(".");
+                key = Integer.parseInt(parts[1]);
+            } else {
+                key = Integer.parseInt(keyStr);
+            }
+
             return key;
         } catch (NumberFormatException e) {
             s_logger.debug("Well well, how did '" + key
@@ -268,41 +280,23 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
     }
 
     @DB
-    protected void checkAndCreateTunnel(VirtualMachine instance, Network nw, DeployDestination dest) {
+    protected void checkAndCreateTunnel(Network nw, Host host) {
 
         s_logger.debug("Creating tunnels with OVS tunnel manager");
-        if (instance.getType() != VirtualMachine.Type.User
-                && instance.getType() != VirtualMachine.Type.DomainRouter) {
-            s_logger.debug("Will not work if you're not"
-                    + "an instance or a virtual router");
-            return;
-        }
 
-        long hostId = dest.getHost().getId();
+        long hostId = host.getId();
         int key = getGreKey(nw);
-        // Find active VMs with a NIC on the target network
-        List<UserVmVO> vms = _userVmDao.listByNetworkIdAndStates(nw.getId(),
-                State.Running, State.Starting, State.Stopping, State.Unknown,
-                State.Migrating);
-        // Find routers for the network
-        List<DomainRouterVO> routers = _routerDao.findByNetwork(nw.getId());
-        List<VMInstanceVO> ins = new ArrayList<VMInstanceVO>();
-        if (vms != null) {
-            ins.addAll(vms);
-        }
-        if (routers.size() != 0) {
-            ins.addAll(routers);
-        }
+        String bridgeName = generateBridgeName(nw, key);
         List<Long> toHostIds = new ArrayList<Long>();
         List<Long> fromHostIds = new ArrayList<Long>();
-        for (VMInstanceVO v : ins) {
-            Long rh = v.getHostId();
-            if (rh == null || rh.longValue() == hostId) {
+        List<Long> networkSpannedHosts = _ovsNetworkToplogyGuru.getNetworkSpanedHosts(nw.getId());
+        for (Long rh : networkSpannedHosts) {
+            if (rh == hostId) {
                 continue;
             }
             OvsTunnelNetworkVO ta = _tunnelNetworkDao.getByFromToNetwork(hostId, rh.longValue(), nw.getId());
             // Try and create the tunnel even if a previous attempt failed
-            if (ta == null || ta.getState().equals("FAILED")) {
+            if (ta == null || ta.getState().equals(OvsTunnel.State.Failed.name())) {
                 s_logger.debug("Attempting to create tunnel from:" + hostId + " to:" + rh.longValue());
                 if (ta == null) {
                     createTunnelRecord(hostId, rh.longValue(), nw.getId(), key);
@@ -315,7 +309,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
             ta = _tunnelNetworkDao.getByFromToNetwork(rh.longValue(),
                     hostId, nw.getId());
             // Try and create the tunnel even if a previous attempt failed
-            if (ta == null || ta.getState().equals("FAILED")) {
+            if (ta == null || ta.getState().equals(OvsTunnel.State.Failed.name())) {
                 s_logger.debug("Attempting to create tunnel from:" +
                         rh.longValue() + " to:" + hostId);
                 if (ta == null) {
@@ -329,9 +323,9 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
         }
         //TODO: Should we propagate the exception here?
         try {
-            String myIp = getGreEndpointIP(dest.getHost(), nw);
+            String myIp = getGreEndpointIP(host, nw);
             if (myIp == null)
-                throw new GreTunnelException("Unable to retrieve the source " + "endpoint for the GRE tunnel." + "Failure is on host:" + dest.getHost().getId());
+                throw new GreTunnelException("Unable to retrieve the source " + "endpoint for the GRE tunnel." + "Failure is on host:" + host.getId());
             boolean noHost = true;
             for (Long i : toHostIds) {
                 HostVO rHost = _hostDao.findById(i);
@@ -343,7 +337,8 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                                     + "Failure is on host:" + rHost.getId());
                 Commands cmds = new Commands(
                         new OvsCreateTunnelCommand(otherIp, key,
-                                Long.valueOf(hostId), i, nw.getId(), myIp));
+                                Long.valueOf(hostId), i, nw.getId(), myIp, bridgeName, nw.getUuid()));
+                s_logger.debug("Attempting to create tunnel from:" + hostId + " to:" + i + " for the network " + nw.getId());
                 s_logger.debug("Ask host " + hostId
                         + " to create gre tunnel to " + i);
                 Answer[] answers = _agentMgr.send(hostId, cmds);
@@ -355,21 +350,19 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                 HostVO rHost = _hostDao.findById(i);
                 String otherIp = getGreEndpointIP(rHost, nw);
                 Commands cmds = new Commands(new OvsCreateTunnelCommand(myIp,
-                        key, i, Long.valueOf(hostId), nw.getId(), otherIp));
+                        key, i, Long.valueOf(hostId), nw.getId(), otherIp, bridgeName, nw.getUuid()));
                 s_logger.debug("Ask host " + i + " to create gre tunnel to "
                         + hostId);
                 Answer[] answers = _agentMgr.send(i, cmds);
                 handleCreateTunnelAnswer(answers);
                 noHost = false;
             }
+
             // If no tunnels have been configured, perform the bridge setup
-            // anyway
-            // This will ensure VIF rules will be triggered
+            // anyway. This will ensure VIF rules will be triggered
             if (noHost) {
-                Commands cmds = new Commands(new OvsSetupBridgeCommand(key,
-                        hostId, nw.getId()));
-                s_logger.debug("Ask host " + hostId
-                        + " to configure bridge for network:" + nw.getId());
+                Commands cmds = new Commands(new OvsSetupBridgeCommand(bridgeName, hostId, nw.getId()));
+                s_logger.debug("Ask host " + hostId + " to configure bridge for network:" + nw.getId());
                 Answer[] answers = _agentMgr.send(hostId, cmds);
                 handleSetupBridgeAnswer(answers);
             }
@@ -384,10 +377,20 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
         return true;
     }
 
+    boolean isVpcEnabledForDistributedRouter(long vpcId) {
+        VpcVO vpc = _vpcDao.findById(vpcId);
+        return vpc.usesDistributedRouter();
+    }
+
     @Override
-    public void vmCheckAndCreateTunnel(VirtualMachineProfile vm,
-            Network nw, DeployDestination dest) {
-        checkAndCreateTunnel(vm.getVirtualMachine(), nw, dest);
+    public void checkAndPrepareHostForTunnelNetwork(Network nw, Host host) {
+        if (nw.getVpcId() != null && isVpcEnabledForDistributedRouter(nw.getVpcId())) {
+            // check and setup host to be in full tunnel mesh with each of the network in the VPC
+            checkAndCreateVpcTunnelNetworks(host, nw.getVpcId());
+        } else {
+            // check and setup host to be in full tunnel mesh with the network
+            checkAndCreateTunnel(nw, host);
+        }
     }
 
     @DB
@@ -440,45 +443,28 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
     }
 
     @Override
-    public void checkAndDestroyTunnel(VirtualMachine vm, Network nw) {
-        // if (!_isEnabled) {
-        // return;
-        // }
-
-        List<UserVmVO> userVms = _userVmDao.listByAccountIdAndHostId(vm.getAccountId(), vm.getHostId());
-        if (vm.getType() == VirtualMachine.Type.User) {
-            if (userVms.size() > 1) {
-                return;
-            }
+    public void checkAndRemoveHostFromTunnelNetwork(Network nw, Host host) {
 
-            List<DomainRouterVO> routers = _routerDao.findByNetwork(nw.getId());
-            for (DomainRouterVO router : routers) {
-                if (router.getHostId().equals(vm.getHostId())) {
-                    return;
-                }
-            }
-        } else if (vm.getType() == VirtualMachine.Type.DomainRouter && userVms.size() != 0) {
-            return;
-        }
         try {
             /* Now we are last one on host, destroy the bridge with all
              * the tunnels for this network  */
             int key = getGreKey(nw);
-            Command cmd = new OvsDestroyBridgeCommand(nw.getId(), key);
-            s_logger.debug("Destroying bridge for network " + nw.getId() + " on host:" + vm.getHostId());
-            Answer ans = _agentMgr.send(vm.getHostId(), cmd);
-            handleDestroyBridgeAnswer(ans, vm.getHostId(), nw.getId());
+            String bridgeName = generateBridgeName(nw, key);
+            Command cmd = new OvsDestroyBridgeCommand(nw.getId(), bridgeName);
+            s_logger.debug("Destroying bridge for network " + nw.getId() + " on host:" + host.getId());
+            Answer ans = _agentMgr.send(host.getId(), cmd);
+            handleDestroyBridgeAnswer(ans, host.getId(), nw.getId());
 
             /* Then ask hosts have peer tunnel with me to destroy them */
             List<OvsTunnelNetworkVO> peers =
-                    _tunnelNetworkDao.listByToNetwork(vm.getHostId(),
+                    _tunnelNetworkDao.listByToNetwork(host.getId(),
                             nw.getId());
             for (OvsTunnelNetworkVO p : peers) {
                 // If the tunnel was not successfully created don't bother to remove it
-                if (p.getState().equals("SUCCESS")) {
-                    cmd = new OvsDestroyTunnelCommand(p.getNetworkId(), key,
+                if (p.getState().equals(OvsTunnel.State.Established.name())) {
+                    cmd = new OvsDestroyTunnelCommand(p.getNetworkId(), bridgeName,
                             p.getPortName());
-                    s_logger.debug("Destroying tunnel to " + vm.getHostId() +
+                    s_logger.debug("Destroying tunnel to " + host.getId() +
                             " from " + p.getFrom());
                     ans = _agentMgr.send(p.getFrom(), cmd);
                     handleDestroyTunnelAnswer(ans, p.getFrom(),
@@ -486,8 +472,204 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                 }
             }
         } catch (Exception e) {
-            s_logger.warn(String.format("Destroy tunnel(account:%1$s," + "hostId:%2$s) failed", vm.getAccountId(), vm.getHostId()), e);
+            s_logger.warn(String.format("Destroy tunnel failed", e));
+        }
+    }
+
+    private String generateBridgeName(Network nw, int key) {
+        if (nw.getVpcId() != null && isVpcEnabledForDistributedRouter(nw.getVpcId())) {
+            return "OVS-DR-VPC-Bridge" + nw.getVpcId();
+        } else {
+            return "OVSTunnel"+key;
+        }
+    }
+    private String generateBridgeNameForVpc(long vpcId) {
+        return "OVS-DR-VPC-Bridge" + vpcId;
+    }
+
+    public boolean sendVpcTopologyChangeUpdate(OvsVpcPhysicalTopologyConfigCommand updateCmd, long hostId, String bridgeName) {
+        try {
+            s_logger.debug("Sending VPC topology update to the host " + hostId);
+            updateCmd.setHostId(hostId);
+            updateCmd.setBridgeName(bridgeName);
+            Answer ans = _agentMgr.send(hostId, updateCmd);
+            if (ans.getResult()) {
+                s_logger.debug("Successfully updated the host " + hostId + " with latest VPC topology." );
+                return true;
+            }  else {
+                s_logger.debug("Failed to update the host " + hostId + " with latest VPC topology." );
+                return false;
+            }
+        } catch (Exception e) {
+            s_logger.debug("Failed to updated the host " + hostId + " with latest VPC topology." );
+            return false;
         }
     }
 
+    OvsVpcPhysicalTopologyConfigCommand prepareVpcTopologyUpdate(long vpcId) {
+        VpcVO vpc = _vpcDao.findById(vpcId);
+        assert (vpc != null): "invalid vpc id";
+
+        List<? extends Network> vpcNetworks =  _vpcMgr.getVpcNetworks(vpcId);
+        List<Long> hostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
+        List<Long> vmIds = _ovsNetworkToplogyGuru.getAllActiveVmsInVpc(vpcId);
+
+        List<OvsVpcPhysicalTopologyConfigCommand.Host> hosts = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Host>();
+        List<OvsVpcPhysicalTopologyConfigCommand.Tier> tiers = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Tier>();
+        List<OvsVpcPhysicalTopologyConfigCommand.Vm> vms = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Vm>();
+
+        for (Long hostId : hostIds) {
+            HostVO hostDetails = _hostDao.findById(hostId);
+            String remoteIp = null;
+            for (Network network: vpcNetworks) {
+                try {
+                    remoteIp = getGreEndpointIP(hostDetails, network);
+                } catch (Exception e) {
+
+                }
+            }
+            OvsVpcPhysicalTopologyConfigCommand.Host host = new OvsVpcPhysicalTopologyConfigCommand.Host(hostId, remoteIp);
+            hosts.add(host);
+        }
+
+        for (Network network: vpcNetworks) {
+            String key = BroadcastDomainType.getValue(network.getBroadcastUri());
+            long gre_key;
+            if (key.contains(".")) {
+                String[] parts = key.split(".");
+                gre_key = Long.parseLong(parts[1]);
+            } else {
+                try {
+                    gre_key = Long.parseLong(BroadcastDomainType.getValue(key));
+                } catch (Exception e) {
+                    return null;
+                }
+            }
+            NicVO nic = _nicDao.findByIp4AddressAndNetworkId(network.getGateway(), network.getId());
+            OvsVpcPhysicalTopologyConfigCommand.Tier tier = new OvsVpcPhysicalTopologyConfigCommand.Tier(gre_key,
+                    network.getUuid(), network.getGateway(), nic.getMacAddress(), network.getCidr());
+            tiers.add(tier);
+        }
+
+        for (long vmId: vmIds) {
+            VirtualMachine vmInstance = _vmInstanceDao.findById(vmId);
+            List<OvsVpcPhysicalTopologyConfigCommand.Nic>  vmNics = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Nic>();
+            for (Nic vmNic :_nicDao.listByVmId(vmId)) {
+                Network network = _networkDao.findById(vmNic.getNetworkId());
+                if (network.getTrafficType() == TrafficType.Guest) {
+                    OvsVpcPhysicalTopologyConfigCommand.Nic nic =  new OvsVpcPhysicalTopologyConfigCommand.Nic(
+                            vmNic.getIp4Address(), vmNic.getMacAddress(), ((Long)vmNic.getNetworkId()).toString());
+                    vmNics.add(nic);
+                }
+            }
+            OvsVpcPhysicalTopologyConfigCommand.Vm vm = new OvsVpcPhysicalTopologyConfigCommand.Vm(
+                    vmInstance.getHostId(), vmNics.toArray(new OvsVpcPhysicalTopologyConfigCommand.Nic[vmNics.size()]));
+            vms.add(vm);
+        }
+        return new OvsVpcPhysicalTopologyConfigCommand(
+                hosts.toArray(new OvsVpcPhysicalTopologyConfigCommand.Host[hosts.size()]),
+                tiers.toArray(new OvsVpcPhysicalTopologyConfigCommand.Tier[tiers.size()]),
+                vms.toArray(new OvsVpcPhysicalTopologyConfigCommand.Vm[vms.size()]),
+                vpc.getCidr());
+    }
+
+    @DB
+    protected void checkAndCreateVpcTunnelNetworks(Host host, long vpcId) {
+
+        long hostId = host.getId();
+        List<? extends Network> vpcNetworks =  _vpcMgr.getVpcNetworks(vpcId);
+        List<Long> vpcSpannedHostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
+        String bridgeName=generateBridgeNameForVpc(vpcId);
+
+        for (Network vpcNetwork: vpcNetworks) {
+            int key = getGreKey(vpcNetwork);
+            List<Long> toHostIds = new ArrayList<Long>();
+            List<Long> fromHostIds = new ArrayList<Long>();
+
+            for (Long rh : vpcSpannedHostIds) {
+                if (rh == hostId) {
+                    continue;
+                }
+                OvsTunnelNetworkVO ta = _tunnelNetworkDao.getByFromToNetwork(hostId, rh.longValue(), vpcNetwork.getId());
+                // Try and create the tunnel even if a previous attempt failed
+                if (ta == null || ta.getState().equals(OvsTunnel.State.Failed.name())) {
+                    s_logger.debug("Attempting to create tunnel from:" + hostId + " to:" + rh.longValue());
+                    if (ta == null) {
+                        createTunnelRecord(hostId, rh.longValue(), vpcNetwork.getId(), key);
+                    }
+                    if (!toHostIds.contains(rh)) {
+                        toHostIds.add(rh);
+                    }
+                }
+
+                ta = _tunnelNetworkDao.getByFromToNetwork(rh.longValue(),
+                        hostId, vpcNetwork.getId());
+                // Try and create the tunnel even if a previous attempt failed
+                if (ta == null || ta.getState().equals(OvsTunnel.State.Failed.name())) {
+                    s_logger.debug("Attempting to create tunnel from:" +
+                            rh.longValue() + " to:" + hostId);
+                    if (ta == null) {
+                        createTunnelRecord(rh.longValue(), hostId,
+                                vpcNetwork.getId(), key);
+                    }
+                    if (!fromHostIds.contains(rh)) {
+                        fromHostIds.add(rh);
+                    }
+                }
+            }
+
+            try {
+                String myIp = getGreEndpointIP(host, vpcNetwork);
+                if (myIp == null)
+                    throw new GreTunnelException("Unable to retrieve the source " + "endpoint for the GRE tunnel."
+                            + "Failure is on host:" + host.getId());
+                boolean noHost = true;
+
+                for (Long i : toHostIds) {
+                    HostVO rHost = _hostDao.findById(i);
+                    String otherIp = getGreEndpointIP(rHost, vpcNetwork);
+                    if (otherIp == null)
+                        throw new GreTunnelException(
+                                "Unable to retrieve the remote "
+                                        + "endpoint for the GRE tunnel."
+                                        + "Failure is on host:" + rHost.getId());
+                    Commands cmds = new Commands(
+                            new OvsCreateTunnelCommand(otherIp, key,
+                                    Long.valueOf(hostId), i, vpcNetwork.getId(), myIp, bridgeName,
+                                    vpcNetwork.getUuid()));
+                    s_logger.debug("Attempting to create tunnel from:" + hostId + " to:" + i + " for the network "
+                            + vpcNetwork.getId());
+                    s_logger.debug("Ask host " + hostId
+                            + " to create gre tunnel to " + i);
+                    Answer[] answers = _agentMgr.send(hostId, cmds);
+                    handleCreateTunnelAnswer(answers);
+                    noHost = false;
+                }
+
+                for (Long i : fromHostIds) {
+                    HostVO rHost = _hostDao.findById(i);
+                    String otherIp = getGreEndpointIP(rHost, vpcNetwork);
+                    Commands cmds = new Commands(new OvsCreateTunnelCommand(myIp,
+                            key, i, Long.valueOf(hostId), vpcNetwork.getId(), otherIp, bridgeName,
+                            vpcNetwork.getUuid()));
+                    s_logger.debug("Ask host " + i + " to create gre tunnel to "
+                            + hostId);
+                    Answer[] answers = _agentMgr.send(i, cmds);
+                    handleCreateTunnelAnswer(answers);
+                    noHost = false;
+                }
+            } catch (GreTunnelException | OperationTimedoutException | AgentUnavailableException e) {
+                // I really thing we should do a better handling of these exceptions
+                s_logger.warn("Ovs Tunnel network created tunnel failed", e);
+            }
+        }
+
+        OvsVpcPhysicalTopologyConfigCommand topologyConfigCommand = prepareVpcTopologyUpdate(vpcId);
+        for (Long id: vpcSpannedHostIds) {
+            if (!sendVpcTopologyChangeUpdate(topologyConfigCommand, id, bridgeName)) {
+                s_logger.debug("Failed to send VPC topology change update to host : " + id + ". Moving on with rest of" +
+                        "the host update.");
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/OvsTunnel.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/OvsTunnel.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/OvsTunnel.java
new file mode 100644
index 0000000..3216ac7
--- /dev/null
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/OvsTunnel.java
@@ -0,0 +1,24 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.network.ovs.dao;
+
+public interface OvsTunnel {
+    public enum State {
+        Created, Established, Failed
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/OvsTunnelNetworkVO.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/OvsTunnelNetworkVO.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/OvsTunnelNetworkVO.java
index 2826912..88a7591 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/OvsTunnelNetworkVO.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/dao/OvsTunnelNetworkVO.java
@@ -62,7 +62,7 @@ public class OvsTunnelNetworkVO implements InternalIdentity {
         this.key = key;
         this.networkId = networkId;
         this.portName = "[]";
-        this.state = "FAILED";
+        this.state = OvsTunnel.State.Created.name();
     }
 
     public void setKey(int key) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/scripts/vm/hypervisor/xenserver/ovstunnel
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/ovstunnel b/scripts/vm/hypervisor/xenserver/ovstunnel
index d558e97..64a2d36 100755
--- a/scripts/vm/hypervisor/xenserver/ovstunnel
+++ b/scripts/vm/hypervisor/xenserver/ovstunnel
@@ -224,6 +224,7 @@ def create_tunnel(session, args):
     gre_key = args.pop("key")
     src_host = args.pop("from")
     dst_host = args.pop("to")
+    network_uuid = args.pop("cloudstack-network-id")
 
     logging.debug("Entering create_tunnel")
 
@@ -318,6 +319,7 @@ def create_tunnel(session, args):
 
             # add flow rule to send the traffic from tunnel ports to L2 switching table only
             lib.add_flow(bridge, priority=1000, in_port=tun_ofport, table=0, actions='resubmit(,1)')
+            lib.do_cmd([lib.VSCTL_PATH, "set", "interface", name, "options:cloudstack-network-id=%s" % network_uuid])
 
         return "SUCCESS:%s" % name
     except:

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8dcce6aa/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
index 4af20c6..b643ec4 100644
--- a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
+++ b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.hypervisor;
 
+import com.cloud.network.dao.NetworkVO;
 import java.util.List;
 import java.util.Map;
 
@@ -41,6 +42,7 @@ import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.dao.NicDao;
+import com.cloud.network.dao.NetworkDao;
 import com.cloud.vm.dao.NicSecondaryIpDao;
 import com.cloud.vm.dao.UserVmDetailsDao;
 import com.cloud.vm.dao.VMInstanceDao;
@@ -52,6 +54,8 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis
     @Inject
     NicDao _nicDao;
     @Inject
+    NetworkDao  _networkDao;
+    @Inject
     VMInstanceDao _virtualMachineDao;
     @Inject
     UserVmDetailsDao _userVmDetailsDao;
@@ -87,6 +91,9 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis
         to.setName(profile.getName());
         to.setSecurityGroupEnabled(profile.isSecurityGroupEnabled());
 
+        NetworkVO network = _networkDao.findById(profile.getNetworkId());
+        to.setNetworkUuid(network.getUuid());
+
         // Workaround to make sure the TO has the UUID we need for Niciri integration
         NicVO nicVO = _nicDao.findById(profile.getId());
         to.setUuid(nicVO.getUuid());


[52/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
adding distributed routing support for KVM OVS

some check style error fixes


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/20e08d55
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/20e08d55
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/20e08d55

Branch: refs/heads/distributedrouter
Commit: 20e08d5530b35ce0abaa38b9b6942693832e2b82
Parents: 96fba6a
Author: Murali Reddy <mu...@gmail.com>
Authored: Tue Mar 11 13:05:03 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:59:04 2014 +0530

----------------------------------------------------------------------
 .../kvm/resource/LibvirtComputingResource.java  |  47 ++++
 .../xen/resource/CitrixResourceBase.java        |   2 +-
 .../api/OvsVpcRoutingPolicyConfigCommand.java   |   1 -
 .../cloud/network/ovs/OvsTunnelManagerImpl.java |  21 +-
 scripts/vm/network/vnet/cloudstack_pluginlib.py | 226 +++++++++++++++++++
 scripts/vm/network/vnet/ovstunnel.py            |  86 ++++++-
 6 files changed, 373 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/20e08d55/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index c1a7721..ec8bc11 100755
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -78,6 +78,8 @@ import com.cloud.agent.api.OvsDestroyTunnelCommand;
 import com.cloud.agent.api.OvsFetchInterfaceAnswer;
 import com.cloud.agent.api.OvsFetchInterfaceCommand;
 import com.cloud.agent.api.OvsSetupBridgeCommand;
+import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
+import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
 import com.cloud.agent.api.PingCommand;
 import com.cloud.agent.api.PingRoutingCommand;
 import com.cloud.agent.api.PingRoutingWithNwGroupsCommand;
@@ -1360,6 +1362,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
                 return execute((OvsCreateTunnelCommand)cmd);
             } else if (cmd instanceof OvsDestroyTunnelCommand) {
                 return execute((OvsDestroyTunnelCommand)cmd);
+            } else if (cmd instanceof OvsVpcPhysicalTopologyConfigCommand) {
+                return execute((OvsVpcPhysicalTopologyConfigCommand) cmd);
+            } else if (cmd instanceof OvsVpcRoutingPolicyConfigCommand) {
+                return execute((OvsVpcRoutingPolicyConfigCommand) cmd);
             } else {
                 s_logger.warn("Unsupported command ");
                 return Answer.createUnsupportedCommandAnswer(cmd);
@@ -1401,6 +1407,47 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
         return new Answer(cmd, true, null);
     }
 
+    public Answer execute(OvsVpcPhysicalTopologyConfigCommand cmd) {
+
+        String bridge = cmd.getBridgeName();
+        try {
+            Script command = new Script(_ovsTunnelPath, _timeout, s_logger);
+            command.add("configure_ovs_bridge_for_network_topology");
+            command.add("--bridge", bridge);
+            command.add("--config", cmd.getVpcConfigInJson());
+
+            String result = command.execute();
+            if (result.equalsIgnoreCase("SUCCESS")) {
+                return new Answer(cmd, true, result);
+            } else {
+                return new Answer(cmd, false, result);
+            }
+        } catch  (Exception e) {
+            s_logger.warn("caught exception while updating host with latest routing polcies", e);
+            return new Answer(cmd, false, e.getMessage());
+        }
+    }
+
+    public Answer execute(OvsVpcRoutingPolicyConfigCommand cmd) {
+
+        try {
+            Script command = new Script(_ovsTunnelPath, _timeout, s_logger);
+            command.add("configure_ovs_bridge_for_routing_policies");
+            command.add("--bridge", cmd.getBridgeName());
+            command.add("--config", cmd.getVpcConfigInJson());
+
+            String result = command.execute();
+            if (result.equalsIgnoreCase("SUCCESS")) {
+                return new Answer(cmd, true, result);
+            } else {
+                return new Answer(cmd, false, result);
+            }
+        } catch  (Exception e) {
+            s_logger.warn("caught exception while updating host with latest VPC topology", e);
+            return new Answer(cmd, false, e.getMessage());
+        }
+    }
+
     private synchronized void destroyTunnelNetwork(String bridge) {
         try {
             findOrCreateTunnelNetwork(bridge);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/20e08d55/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index a281002..273c08c 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -88,7 +88,6 @@ import org.apache.cloudstack.storage.to.TemplateObjectTO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
 
 import com.cloud.agent.IAgentControl;
-
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.AttachIsoCommand;
 import com.cloud.agent.api.AttachVolumeAnswer;
@@ -149,6 +148,7 @@ import com.cloud.agent.api.OvsSetTagAndFlowAnswer;
 import com.cloud.agent.api.OvsSetTagAndFlowCommand;
 import com.cloud.agent.api.OvsSetupBridgeCommand;
 import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
+import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
 import com.cloud.agent.api.PerformanceMonitorAnswer;
 import com.cloud.agent.api.PerformanceMonitorCommand;
 import com.cloud.agent.api.PingCommand;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/20e08d55/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
index 8e4d5d1..50f1fdd 100644
--- a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
+++ b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcRoutingPolicyConfigCommand.java
@@ -18,7 +18,6 @@ package com.cloud.agent.api;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
-import java.util.UUID;
 
 /**
  * This command represents logical view of VM's connectivity in VPC.

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/20e08d55/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
index 35b0035..eeb22b1 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
@@ -16,11 +16,25 @@
 // under the License.
 package com.cloud.network.ovs;
 
-import com.amazonaws.services.ec2.model.NetworkAcl;
-import com.cloud.agent.api.*;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.OvsCreateTunnelAnswer;
+import com.cloud.agent.api.OvsCreateTunnelCommand;
+import com.cloud.agent.api.OvsDestroyBridgeCommand;
+import com.cloud.agent.api.OvsDestroyTunnelCommand;
+import com.cloud.agent.api.OvsFetchInterfaceAnswer;
+import com.cloud.agent.api.OvsFetchInterfaceCommand;
+import com.cloud.agent.api.OvsSetupBridgeCommand;
+import com.cloud.agent.api.OvsVpcPhysicalTopologyConfigCommand;
+import com.cloud.agent.api.OvsVpcRoutingPolicyConfigCommand;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NetworkVO;
-import com.cloud.network.vpc.*;
+import com.cloud.network.vpc.NetworkACLVO;
+import com.cloud.network.vpc.NetworkACLItemDao;
+import com.cloud.network.vpc.NetworkACLItemVO;
+import com.cloud.network.vpc.dao.VpcDao;
+import com.cloud.network.vpc.VpcManager;
+import com.cloud.network.vpc.VpcVO;
 import com.cloud.network.vpc.dao.NetworkACLDao;
 import com.cloud.vm.dao.VMInstanceDao;
 import com.cloud.vm.Nic;
@@ -63,7 +77,6 @@ import com.cloud.network.ovs.dao.OvsTunnelInterfaceVO;
 import com.cloud.network.ovs.dao.OvsTunnelNetworkDao;
 import com.cloud.network.ovs.dao.OvsTunnelNetworkVO;
 import com.cloud.network.ovs.dao.OvsTunnel;
-import com.cloud.network.vpc.dao.VpcDao;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/20e08d55/scripts/vm/network/vnet/cloudstack_pluginlib.py
----------------------------------------------------------------------
diff --git a/scripts/vm/network/vnet/cloudstack_pluginlib.py b/scripts/vm/network/vnet/cloudstack_pluginlib.py
index f886aa3..6c24917 100755
--- a/scripts/vm/network/vnet/cloudstack_pluginlib.py
+++ b/scripts/vm/network/vnet/cloudstack_pluginlib.py
@@ -174,6 +174,7 @@ def _build_flow_expr(**kwargs):
     dl_dst = 'dl_dst' in kwargs and ",dl_dst=%s" % kwargs['dl_dst'] or ''
     nw_src = 'nw_src' in kwargs and ",nw_src=%s" % kwargs['nw_src'] or ''
     nw_dst = 'nw_dst' in kwargs and ",nw_dst=%s" % kwargs['nw_dst'] or ''
+    table = 'table' in kwargs and ",table=%s" % kwargs['table'] or ''
     proto = 'proto' in kwargs and ",%s" % kwargs['proto'] or ''
     ip = ('nw_src' in kwargs or 'nw_dst' in kwargs) and ',ip' or ''
     flow = (flow + in_port + dl_type + dl_src + dl_dst +
@@ -217,3 +218,228 @@ def del_all_flows(bridge):
 def del_port(bridge, port):
     delPort = [VSCTL_PATH, "del-port", bridge, port]
     do_cmd(delPort)
+
+
+def get_network_id_for_vif(vif_name):
+    domain_id, device_id = vif_name[3:len(vif_name)].split(".")
+    dom_uuid = do_cmd([XE_PATH, "vm-list", "dom-id=%s" % domain_id, "--minimal"])
+    vif_uuid = do_cmd([XE_PATH, "vif-list", "vm-uuid=%s" % dom_uuid, "device=%s" % device_id, "--minimal"])
+    vnet = do_cmd([XE_PATH, "vif-param-get", "uuid=%s" % vif_uuid,  "param-name=other-config",
+                             "param-key=cloudstack-network-id"])
+    return vnet
+
+def get_network_id_for_tunnel_port(tunnelif_name):
+    vnet = do_cmd([VSCTL_PATH, "get", "interface", tunnelif_name, "options:cloudstack-network-id"])
+    return vnet
+
+def clear_flooding_rules_for_port(bridge, ofport):
+        del_flows(bridge, in_port=ofport, table=2)
+
+def add_flooding_rules_for_port(bridge, in_ofport, out_ofports):
+        action = "".join("output:%s," %ofport for ofport in out_ofports)[:-1]
+        add_flow(bridge, priority=1100, in_port=in_ofport, table=1, actions=action)
+
+def get_ofport_for_vif(vif_name):
+    return do_cmd([VSCTL_PATH, "get", "interface", vif_name, "ofport"])
+
+def get_macaddress_of_vif(vif_name):
+    domain_id, device_id = vif_name[3:len(vif_name)].split(".")
+    dom_uuid = do_cmd([XE_PATH, "vm-list", "dom-id=%s" % domain_id, "--minimal"])
+    vif_uuid = do_cmd([XE_PATH, "vif-list", "vm-uuid=%s" % dom_uuid, "device=%s" % device_id, "--minimal"])
+    mac = do_cmd([XE_PATH, "vif-param-get", "uuid=%s" % vif_uuid,  "param-name=MAC"])
+    return mac
+
+def get_vif_name_from_macaddress(macaddress):
+    vif_uuid = do_cmd([XE_PATH, "vif-list", "MAC=%s" % macaddress, "--minimal"])
+    vif_device_id = do_cmd([XE_PATH, "vif-param-get", "uuid=%s" % vif_uuid,  "param-name=device"])
+    vm_uuid = do_cmd([XE_PATH, "vif-param-get", "uuid=%s" % vif_uuid,  "param-name=vm-uuid"])
+    vm_domain_id = do_cmd([XE_PATH, "vm-param-get", "uuid=%s" % vm_uuid,  "param-name=dom-id"])
+    return "vif"+vm_domain_id+"."+vif_device_id
+
+def add_mac_lookup_table_entry(bridge, mac_address, out_of_port):
+    add_flow(bridge, priority=1100, dl_dst=mac_address, table=1, actions="output:%s" % out_of_port)
+
+def delete_mac_lookup_table_entry(bridge, mac_address):
+    del_flows(bridge, dl_dst=mac_address, table=1)
+
+def add_ip_lookup_table_entry(bridge, ip, dst_tier_gateway_mac, dst_vm_mac):
+    action_str = "mod_dl_sr:%s" % dst_tier_gateway_mac + ",mod_dl_dst:%s" % dst_vm_mac +",resubmit(,5)"
+    addflow = [OFCTL_PATH, "add-flow", bridge, "table=4", "nw_dst=%s" % ip, "actions=%s" %action_str]
+    do_cmd(addflow)
+
+def get_vms_on_host(vpc, host_id):
+    all_vms = vpc.vms
+    vms_on_host = []
+    for vm in all_vms:
+      if vm.hostid == host_id:
+        vms_on_host.append(vm)
+    return vms_on_host
+
+def get_network_details(vpc, network_uuid):
+    tiers = vpc.tiers
+    for tier in tiers:
+      if tier.networkuuid == network_uuid:
+        return tier
+    return None
+
+class jsonLoader(object):
+  def __init__(self, obj):
+        for k in obj:
+            v = obj[k]
+            if isinstance(v, dict):
+                setattr(self, k, jsonLoader(v))
+            elif isinstance(v, (list, tuple)):
+                if len(v) > 0 and isinstance(v[0], dict):
+                    setattr(self, k, [jsonLoader(elem) for elem in v])
+                else:
+                    setattr(self, k, v)
+            else:
+                setattr(self, k, v)
+
+  def __getattr__(self, val):
+        if val in self.__dict__:
+            return self.__dict__[val]
+        else:
+            return None
+
+  def __repr__(self):
+        return '{%s}' % str(', '.join('%s : %s' % (k, repr(v)) for (k, v)
+                                      in self.__dict__.iteritems()))
+
+  def __str__(self):
+        return '{%s}' % str(', '.join('%s : %s' % (k, repr(v)) for (k, v)
+                                      in self.__dict__.iteritems()))
+
+def configure_bridge_for_network_topology(bridge, this_host_id, json_config):
+    vpconfig = jsonLoader(json.loads(json_config)).vpc
+
+    if vpconfig is None:
+        logging.debug("WARNING:Can't find VPC info in json config file")
+        return "FAILURE:IMPROPER_JSON_CONFG_FILE"
+
+    # get the list of Vm's in the VPC from the JSON config
+    this_host_vms = get_vms_on_host(vpconfig, this_host_id)
+
+    for vm in this_host_vms:
+        for nic in vm.nics:
+            mac_addr = nic.macaddress
+            ip = nic.ipaddress
+            vif_name = get_vif_name_from_macaddress(mac_addr)
+            of_port = get_ofport_for_vif(vif_name)
+            network = get_network_details(vpconfig, nic.networkuuid)
+
+            # Add flow rule in L2 look up table, if the destination mac = MAC of the nic send packet on the found OFPORT
+            add_mac_lookup_table_entry(bridge, mac_addr, of_port)
+
+            # Add flow rule in L3 look up table: if the destination IP = VM's IP then modify the packet
+            # to set DST MAC = VM's MAC, SRC MAC=tier gateway MAC and send to egress table
+            add_ip_lookup_table_entry(bridge, ip, network.gatewaymac, mac_addr)
+
+            # Add flow entry to send with intra tier traffic from the NIC to L2 lookup path)
+            addflow = [OFCTL_PATH, "add-flow", bridge, "table=0", "in_port=%s" % of_port,
+                       "nw_dst=%s" %network.cidr, "actions=resubmit(,1)"]
+            do_cmd(addflow)
+
+            #add flow entry to send inter-tier traffic from the NIC to egress ACL table(to L3 lookup path)
+            addflow = [OFCTL_PATH, "add-flow", bridge, "table=0", "in_port=%s" % of_port,
+                       "dl_dst=%s" %network.gatewaymac, "nw_dst=%s" %vpconfig.cidr, "actions=resubmit(,3)"]
+            do_cmd(addflow)
+
+    # get the list of hosts on which VPC spans from the JSON config
+    vpc_spanning_hosts = vpconfig.hosts
+
+    for host in vpc_spanning_hosts:
+        if this_host_id == host.hostid:
+            continue
+        other_host_vms = get_vms_on_host(vpconfig, host.hostid)
+        for vm in other_host_vms:
+            for nic in vm.nics:
+                mac_addr = nic.macaddress
+                ip = nic.ipaddress
+                network = get_network_details(vpconfig, nic.networkuuid)
+                gre_key = network.grekey
+
+                # generate tunnel name from tunnel naming convention
+                tunnel_name = "t%s-%s-%s" % (gre_key, this_host_id, host.hostid)
+                of_port = get_ofport_for_vif(tunnel_name)
+
+                # Add flow rule in L2 look up table, if the destination mac = MAC of the nic send packet tunnel port
+                add_mac_lookup_table_entry(bridge, mac_addr, of_port)
+
+                # Add flow tule in L3 look up table: if the destination IP = VM's IP then modify the packet
+                # set DST MAC = VM's MAC, SRC MAC=tier gateway MAC and send to egress table
+                add_ip_lookup_table_entry(bridge, ip, network.gatewaymac, mac_addr)
+
+    return "SUCCESS: successfully configured bridge as per the VPC topology"
+
+def get_acl(vpcconfig, required_acl_id):
+    acls = vpcconfig.acls
+    for acl in acls:
+        if acl.id == required_acl_id:
+            return acl
+    return None
+
+def configure_ovs_bridge_for_routing_policies(bridge, json_config):
+    vpconfig = jsonLoader(json.loads(json_config)).vpc
+
+    if vpconfig is None:
+        logging.debug("WARNING:Can't find VPC info in json config file")
+        return "FAILURE:IMPROPER_JSON_CONFG_FILE"
+
+    # First flush current egress ACL's before re-applying the ACL's
+    del_flows(bridge, table=3)
+
+    egress_rules_added = False
+    ingress_rules_added = False
+
+    tiers = vpconfig.tiers
+    for tier in tiers:
+        tier_cidr = tier.cidr
+        acl = get_acl(vpconfig, tier.aclid)
+        acl_items = acl.aclitems
+
+        for acl_item in acl_items:
+            number = acl_item.number
+            action = acl_item.action
+            direction = acl_item.direction
+            source_port_start = acl_item.sourceportstart
+            source_port_end = acl_item.sourceportend
+            protocol = acl_item.protocol
+            source_cidrs = acl_item.sourcecidrs
+            acl_priority = 1000 + number
+            for source_cidr in source_cidrs:
+                if direction is "ingress":
+                    ingress_rules_added = True
+                    # add flow rule to do action (allow/deny) for flows where source IP of the packet is in
+                    # source_cidr and destination ip is in tier_cidr
+                    port = source_port_start
+                    while (port < source_port_end):
+                        if action is "deny":
+                            add_flow(bridge, priority= acl_priority, table=5, nw_src=source_cidr, nw_dst=tier_cidr, tp_dst=port,
+                                     nw_proto=protocol, actions='drop')
+                        if action is "allow":
+                            add_flow(bridge, priority= acl_priority,table=5, nw_src=source_cidr, nw_dst=tier_cidr, tp_dst=port,
+                                     nw_proto=protocol, actions='resubmit(,1)')
+                        port = port + 1
+
+                elif direction in "egress":
+                    egress_rules_added = True
+                    # add flow rule to do action (allow/deny) for flows where destination IP of the packet is in
+                    # source_cidr and source ip is in tier_cidr
+                    port = source_port_start
+                    while (port < source_port_end):
+                        if action is "deny":
+                            add_flow(bridge, priority= acl_priority, table=5, nw_src=tier_cidr, nw_dst=source_cidr, tp_dst=port,
+                                     nw_proto=protocol, actions='drop')
+                        if action is "allow":
+                            add_flow(bridge, priority= acl_priority, table=5, nw_src=tier_cidr, nw_dst=source_cidr, tp_dst=port,
+                                     nw_proto=protocol, actions='resubmit(,1)')
+                        port = port + 1
+
+    if egress_rules_added is False:
+        # add a default rule in egress table to forward packet to L3 lookup table
+        add_flow(bridge, priority=0, table=3, actions='resubmit(,4)')
+
+    if ingress_rules_added is False:
+        # add a default rule in egress table drop packets
+        add_flow(bridge, priority=0, table=5, actions='drop')

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/20e08d55/scripts/vm/network/vnet/ovstunnel.py
----------------------------------------------------------------------
diff --git a/scripts/vm/network/vnet/ovstunnel.py b/scripts/vm/network/vnet/ovstunnel.py
index 9e05413..57085d8 100755
--- a/scripts/vm/network/vnet/ovstunnel.py
+++ b/scripts/vm/network/vnet/ovstunnel.py
@@ -27,6 +27,7 @@ import os
 import sys
 import subprocess
 import time
+import simplejson as json
 from optparse import OptionParser, OptionGroup, OptParseError, BadOptionError, OptionError, OptionConflictError, OptionValueError
 
 from time import localtime as _localtime, asctime as _asctime
@@ -72,6 +73,58 @@ def setup_ovs_bridge(bridge, key, cs_host_id):
     logging.debug("Setup_ovs_bridge completed with result:%s" % result)
     return result
 
+@echo
+def setup_ovs_bridge_for_distributed_routing(bridge, cs_host_id):
+
+    res = lib.check_switch()
+    if res != "SUCCESS":
+        return "FAILURE:%s" % res
+
+    logging.debug("About to manually create the bridge:%s" % bridge)
+    res = lib.do_cmd([lib.VSCTL_PATH, "--", "--may-exist", "add-br", bridge])
+    logging.debug("Bridge has been manually created:%s" % res)
+
+    # Non empty result means something went wrong
+    if res:
+        result = "FAILURE:%s" % res
+    else:
+        # Verify the bridge actually exists
+        res = lib.do_cmd([lib.VSCTL_PATH, "list", "bridge", bridge])
+
+        res = lib.do_cmd([lib.VSCTL_PATH, "set", "bridge", bridge, "other_config:is-ovs_vpc_distributed_vr_network=True"])
+        conf_hosts = lib.do_cmd([lib.VSCTL_PATH, "get","bridge", bridge,"other:ovs-host-setup"])
+        conf_hosts = cs_host_id + (conf_hosts and ',%s' % conf_hosts or '')
+        lib.do_cmd([lib.VSCTL_PATH, "set", "bridge", bridge,
+                   "other_config:ovs-host-setup=%s" % conf_hosts])
+
+        # add a default flow rule to send broadcast and multi-cast packets to L2 flooding table
+        lib.add_flow(bridge, priority=1000, dl_dst='ff:ff:ff:ff:ff:ff', table=0, actions='resubmit(,2)')
+        lib.add_flow(bridge, priority=1000, nw_dst='224.0.0.0/24', table=0, actions='resubmit(,2)')
+
+        # add a default flow rule to send uni-cast traffic to L2 lookup table
+        lib.add_flow(bridge, priority=0, table=0, actions='resubmit(,1)')
+
+        # add a default rule to send unknown mac address to L2 flooding table
+        lib.add_flow(bridge, priority=0, table=1, actions='resubmit(,2)')
+
+        # add a default rule in L2 flood table to drop packet
+        lib.add_flow(bridge, priority=0, table=2, actions='drop')
+
+        # add a default rule in egress table to forward packet to L3 lookup table
+        lib.add_flow(bridge, priority=0, table=3, actions='resubmit(,4)')
+
+        # add a default rule in L3 lookup table to forward packet to L2 lookup table
+        lib.add_flow(bridge, priority=0, table=4, actions='resubmit(,1)')
+
+        # add a default rule in ingress table to drop in bound packets
+        lib.add_flow(bridge, priority=0, table=5, actions='drop')
+
+        result = "SUCCESS: successfully setup bridge with flow rules"
+
+        logging.debug("Setup_ovs_bridge completed with result:%s" % result)
+
+    return result
+
 def destroy_ovs_bridge(bridge):
 
     res = lib.check_switch()
@@ -163,12 +216,30 @@ def create_tunnel(bridge, remote_ip, key, src_host, dst_host):
         # Ensure no trailing LF
         if tun_ofport.endswith('\n'):
             tun_ofport = tun_ofport[:-1]
-        # add flow entryies for dropping broadcast coming in from gre tunnel
-        lib.add_flow(bridge, priority=1000, in_port=tun_ofport,
+
+        ovs_tunnel_network = lib.do_cmd([lib.VSCTL_PATH, "get", "bridge", bridge, "other_config:is-ovs-tun-network"])
+        ovs_vpc_distributed_vr_network = lib.do_cmd([lib.VSCTL_PATH, "get", "bridge", bridge,
+                                                     "other_config:is-ovs_vpc_distributed_vr_network"])
+
+        if ovs_tunnel_network == 'True':
+            # add flow entryies for dropping broadcast coming in from gre tunnel
+            lib.add_flow(bridge, priority=1000, in_port=tun_ofport,
+                         dl_dst='ff:ff:ff:ff:ff:ff', actions='drop')
+            lib.add_flow(bridge, priority=1000, in_port=tun_ofport,
+                     nw_dst='224.0.0.0/24', actions='drop')
+            drop_flow_setup = True
+
+        if ovs_vpc_distributed_vr_network == 'True':
+            # add flow rules for dropping broadcast coming in from tunnel ports
+            lib.add_flow(bridge, priority=1000, in_port=tun_ofport, table=0,
                          dl_dst='ff:ff:ff:ff:ff:ff', actions='drop')
-        lib.add_flow(bridge, priority=1000, in_port=tun_ofport,
+            lib.add_flow(bridge, priority=1000, in_port=tun_ofport, table=0,
                      nw_dst='224.0.0.0/24', actions='drop')
-        drop_flow_setup = True
+
+            # add flow rule to send the traffic from tunnel ports to L2 switching table only
+            lib.add_flow(bridge, priority=1000, in_port=tun_ofport, table=0, actions='resubmit(,1)')
+            lib.do_cmd([lib.VSCTL_PATH, "set", "interface", name, "options:cloudstack-network-id=%s" % network_uuid])
+
         logging.debug("Broadcast drop rules added")
 #        return "SUCCESS:%s" % name
         return 'true'
@@ -210,6 +281,7 @@ if __name__ == '__main__':
     parser.add_option("--src_host", dest="src_host")
     parser.add_option("--dst_host", dest="dst_host")
     parser.add_option("--iface_name", dest="iface_name")
+    parser.ad_option("--config", dest="config")
     (option, args) = parser.parse_args()
     if len(args) == 0:
         logging.debug("No command to execute")
@@ -223,6 +295,12 @@ if __name__ == '__main__':
         create_tunnel(option.bridge, option.remote_ip, option.key, option.src_host, option.dst_host)
     elif cmd == "destroy_tunnel":
         destroy_tunnel(option.bridge, option.iface_name)
+    elif cmd == "setup_ovs_bridge_for_distributed_routing":
+        setup_ovs_bridge_for_distributed_routing(bridge, cs_host_id)
+    elif cmd == "configure_ovs_bridge_for_network_topology":
+        configure_bridge_for_network_topology(brdige, cs_host_id, config)
+    elif cmd == "configure_ovs_bridge_for_routing_policies":
+        configure_ovs_bridge_for_routing_policies(bridge, config)
     else:
         logging.debug("Unknown command: " + cmd)
         sys.exit(1)


[08/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
A production/QA Setup does not populate the admin and SYSTEM accounts during database setup. So IAM plugin needs to insert the necessary group <-> account map in the DB during startup


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1c85af31
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1c85af31
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1c85af31

Branch: refs/heads/distributedrouter
Commit: 1c85af319340b28152a75606da577ec8e6eb51ca
Parents: 748c090
Author: Prachi Damle <pr...@cloud.com>
Authored: Mon Mar 10 17:27:32 2014 -0700
Committer: Prachi Damle <pr...@cloud.com>
Committed: Mon Mar 10 17:30:00 2014 -0700

----------------------------------------------------------------------
 .../cloudstack/iam/IAMApiServiceImpl.java       | 95 ++++++++++++++++++++
 1 file changed, 95 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1c85af31/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java b/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
index 97519f2..47b7697 100644
--- a/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
+++ b/services/iam/plugin/src/org/apache/cloudstack/iam/IAMApiServiceImpl.java
@@ -16,6 +16,9 @@
 // under the License.
 package org.apache.cloudstack.iam;
 
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -111,6 +114,11 @@ import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
+import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.InstanceGroupVO;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.dao.NicIpAliasVO;
@@ -190,6 +198,11 @@ public class IAMApiServiceImpl extends ManagerBase implements IAMApiService, Man
 
     @Override
     public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
+
+        // populate group <-> account association if not present for CS admin
+        // and system accounts
+        populateIAMGroupAdminAccountMap();
+
         _messageBus.subscribe(AccountManager.MESSAGE_ADD_ACCOUNT_EVENT, new MessageSubscriber() {
             @Override
             public void onPublishMessage(String senderAddress, String subject, Object obj) {
@@ -338,6 +351,88 @@ public class IAMApiServiceImpl extends ManagerBase implements IAMApiService, Man
         return super.configure(name, params);
     }
 
+    private void populateIAMGroupAdminAccountMap() {
+
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                TransactionLegacy txn = TransactionLegacy.currentTxn();
+
+                String searchQuery = "Select id from `cloud`.`iam_group_account_map` where account_id = ? and removed is null";
+                ResultSet rs = null;
+                PreparedStatement acctQuery = null;
+                PreparedStatement acctInsert = null;
+                // find if the system account is present in the map
+                try {
+                    acctQuery = txn.prepareAutoCloseStatement(searchQuery);
+                    acctQuery.setLong(1, Account.ACCOUNT_ID_SYSTEM);
+
+                    rs = acctQuery.executeQuery();
+                    if (!rs.next()) {
+                        acctInsert = txn
+                                .prepareAutoCloseStatement("INSERT INTO `cloud`.`iam_group_account_map` (group_id, account_id, created) values(?, ?, Now())");
+                        // insert entry in iam_group_account_map table
+                        acctInsert.setLong(1, Account.ACCOUNT_TYPE_ADMIN + 1);
+                        acctInsert.setLong(2, Account.ACCOUNT_ID_SYSTEM);
+                        acctInsert.executeUpdate();
+                    }
+                } catch (SQLException ex) {
+                    String msg = "Unable to populate iam_group_account_map for SYSTEM account." + ex.getMessage();
+                    s_logger.error(msg);
+                    throw new CloudRuntimeException(msg, ex);
+                } finally {
+                    try {
+                        if (acctInsert != null) {
+                            acctInsert.close();
+                        }
+                        if (rs != null) {
+                            rs.close();
+                        }
+                        if (acctQuery != null) {
+                            acctQuery.close();
+                        }
+                    } catch (SQLException e) {
+                    }
+                }
+
+                // find if the admin account is present in the map
+                try {
+                    acctQuery = txn.prepareAutoCloseStatement(searchQuery);
+                    acctQuery.setLong(1, Account.ACCOUNT_ID_SYSTEM + 1);
+
+                    rs = acctQuery.executeQuery();
+                    if (!rs.next()) {
+                        acctInsert = txn
+                                .prepareAutoCloseStatement("INSERT INTO `cloud`.`iam_group_account_map` (group_id, account_id, created) values(?, ?, Now())");
+                        // insert entry in iam_group_account_map table
+                        acctInsert.setLong(1, Account.ACCOUNT_TYPE_ADMIN + 1);
+                        acctInsert.setLong(2, Account.ACCOUNT_ID_SYSTEM + 1);
+                        acctInsert.executeUpdate();
+                    }
+                } catch (SQLException ex) {
+                    String msg = "Unable to populate iam_group_account_map for Admin account." + ex.getMessage();
+                    s_logger.error(msg);
+                    throw new CloudRuntimeException(msg, ex);
+                } finally {
+                    try {
+                        if (acctInsert != null) {
+                            acctInsert.close();
+                        }
+                        if (rs != null) {
+                            rs.close();
+                        }
+                        if (acctQuery != null) {
+                            acctQuery.close();
+                        }
+                    } catch (SQLException e) {
+                    }
+                }
+
+            }
+        });
+
+    }
+
     private void addDomainWideResourceAccess(Map<String, Object> params) {
 
         IAMEntityType entityType = (IAMEntityType)params.get(ApiConstants.ENTITY_TYPE);


[19/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Fixed some problems reported by FindBugs


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/90c485e5
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/90c485e5
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/90c485e5

Branch: refs/heads/distributedrouter
Commit: 90c485e5d659afdd8a6a09ec3b81e54ab7398296
Parents: 67ab321
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Thu Mar 13 13:29:25 2014 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Thu Mar 13 13:45:30 2014 -0700

----------------------------------------------------------------------
 .../org/apache/cloudstack/api/BaseListCmd.java  |   2 +-
 .../security/dao/VmRulesetLogDaoImpl.java       |   2 +-
 .../src/com/cloud/projects/ProjectVO.java       |   5 +
 .../jobs/impl/JobSerializerHelper.java          |   5 +-
 .../mom/rabbitmq/RabbitMQEventBus.java          |  18 ++-
 .../src/com/cloud/dc/DedicatedResourceVO.java   |   7 ++
 .../com/cloud/network/IpAddressManagerImpl.java |   4 +-
 .../com/cloud/server/ManagementServerImpl.java  | 123 +------------------
 8 files changed, 29 insertions(+), 137 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90c485e5/api/src/org/apache/cloudstack/api/BaseListCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/BaseListCmd.java b/api/src/org/apache/cloudstack/api/BaseListCmd.java
index f280003..407ad22 100644
--- a/api/src/org/apache/cloudstack/api/BaseListCmd.java
+++ b/api/src/org/apache/cloudstack/api/BaseListCmd.java
@@ -24,7 +24,7 @@ import com.cloud.utils.exception.CSExceptionErrorCode;
 public abstract class BaseListCmd extends BaseCmd {
 
     private static Long s_maxPageSize = null;
-    public static Long s_pageSizeUnlimited = -1L;
+    public static final Long s_pageSizeUnlimited = -1L;
 
     // ///////////////////////////////////////////////////
     // ///////// BaseList API parameters /////////////////

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90c485e5/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
index c941055..90f8349 100644
--- a/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
@@ -39,7 +39,7 @@ import com.cloud.utils.db.TransactionLegacy;
 @Component
 @Local(value = {VmRulesetLogDao.class})
 public class VmRulesetLogDaoImpl extends GenericDaoBase<VmRulesetLogVO, Long> implements VmRulesetLogDao {
-    protected static Logger s_logger = Logger.getLogger(VmRulesetLogDaoImpl.class);
+    protected static final Logger s_logger = Logger.getLogger(VmRulesetLogDaoImpl.class);
     private SearchBuilder<VmRulesetLogVO> VmIdSearch;
     private String InsertOrUpdateSQl = "INSERT INTO op_vm_ruleset_log (instance_id, created, logsequence) "
         + " VALUES(?, now(), 1) ON DUPLICATE KEY UPDATE logsequence=logsequence+1";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90c485e5/engine/schema/src/com/cloud/projects/ProjectVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/projects/ProjectVO.java b/engine/schema/src/com/cloud/projects/ProjectVO.java
index d49e484..77eed40 100644
--- a/engine/schema/src/com/cloud/projects/ProjectVO.java
+++ b/engine/schema/src/com/cloud/projects/ProjectVO.java
@@ -31,6 +31,7 @@ import javax.persistence.Table;
 import org.apache.cloudstack.api.Identity;
 import org.apache.cloudstack.api.InternalIdentity;
 
+import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.db.GenericDao;
 
 @Entity
@@ -161,4 +162,8 @@ public class ProjectVO implements Project, Identity, InternalIdentity {
         this.uuid = uuid;
     }
 
+    @Override
+    public int hashCode() {
+        return NumbersUtil.hash(id);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90c485e5/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java
index 67c4b86..735d7cf 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java
@@ -29,6 +29,7 @@ import java.lang.reflect.Type;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.log4j.Logger;
 
+import com.cloud.utils.exception.CloudRuntimeException;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.JsonDeserializationContext;
@@ -40,14 +41,12 @@ import com.google.gson.JsonPrimitive;
 import com.google.gson.JsonSerializationContext;
 import com.google.gson.JsonSerializer;
 
-import com.cloud.utils.exception.CloudRuntimeException;
-
 /**
  * Note: toPairList and appendPairList only support simple POJO objects currently
  */
 public class JobSerializerHelper {
     private static final Logger s_logger = Logger.getLogger(JobSerializerHelper.class);
-    public static String token = "/";
+    public static final String token = "/";
 
     private static Gson s_gson;
     static {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90c485e5/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java
----------------------------------------------------------------------
diff --git a/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java b/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java
index 8ad7033..8403271 100644
--- a/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java
+++ b/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java
@@ -30,8 +30,16 @@ import java.util.concurrent.Executors;
 import javax.ejb.Local;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.framework.events.Event;
+import org.apache.cloudstack.framework.events.EventBus;
+import org.apache.cloudstack.framework.events.EventBusException;
+import org.apache.cloudstack.framework.events.EventSubscriber;
+import org.apache.cloudstack.framework.events.EventTopic;
+import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 import org.apache.log4j.Logger;
 
+import com.cloud.utils.Ternary;
+import com.cloud.utils.component.ManagerBase;
 import com.rabbitmq.client.AMQP;
 import com.rabbitmq.client.AlreadyClosedException;
 import com.rabbitmq.client.Channel;
@@ -43,16 +51,6 @@ import com.rabbitmq.client.MessageProperties;
 import com.rabbitmq.client.ShutdownListener;
 import com.rabbitmq.client.ShutdownSignalException;
 
-import org.apache.cloudstack.framework.events.Event;
-import org.apache.cloudstack.framework.events.EventBus;
-import org.apache.cloudstack.framework.events.EventBusException;
-import org.apache.cloudstack.framework.events.EventSubscriber;
-import org.apache.cloudstack.framework.events.EventTopic;
-import org.apache.cloudstack.managed.context.ManagedContextRunnable;
-
-import com.cloud.utils.Ternary;
-import com.cloud.utils.component.ManagerBase;
-
 @Local(value = EventBus.class)
 public class RabbitMQEventBus extends ManagerBase implements EventBus {
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90c485e5/server/src/com/cloud/dc/DedicatedResourceVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/dc/DedicatedResourceVO.java b/server/src/com/cloud/dc/DedicatedResourceVO.java
index 2e0fde7..79c563c 100644
--- a/server/src/com/cloud/dc/DedicatedResourceVO.java
+++ b/server/src/com/cloud/dc/DedicatedResourceVO.java
@@ -25,6 +25,8 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
+import com.cloud.utils.NumbersUtil;
+
 @Entity
 @Table(name = "dedicated_resources")
 public class DedicatedResourceVO implements DedicatedResources {
@@ -163,4 +165,9 @@ public class DedicatedResourceVO implements DedicatedResources {
             return false;
         }
     }
+
+    @Override
+    public int hashCode() {
+        return NumbersUtil.hash(id);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90c485e5/server/src/com/cloud/network/IpAddressManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/IpAddressManagerImpl.java b/server/src/com/cloud/network/IpAddressManagerImpl.java
index 15d1458..20eae3a 100644
--- a/server/src/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/com/cloud/network/IpAddressManagerImpl.java
@@ -1346,7 +1346,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
         PublicIp publicIp = PublicIp.createFromAddrAndVlan(ipToAssoc, _vlanDao.findById(ipToAssoc.getVlanId()));
         ipList.add(publicIp);
         Map<PublicIpAddress, Set<Service>> ipToServices = _networkModel.getIpToServices(ipList, false, true);
-        if (ipToServices != null & !ipToServices.isEmpty()) {
+        if (!ipToServices.isEmpty()) {
             Set<Service> services = ipToServices.get(publicIp);
             if (services != null && !services.isEmpty()) {
                 throw new InvalidParameterValueException("IP " + ipToAssoc + " has services and rules associated in the network " + networkId);
@@ -1387,7 +1387,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
         PublicIp publicIp = PublicIp.createFromAddrAndVlan(ip, _vlanDao.findById(ip.getVlanId()));
         ipList.add(publicIp);
         Map<PublicIpAddress, Set<Service>> ipToServices = _networkModel.getIpToServices(ipList, false, true);
-        if (ipToServices != null & !ipToServices.isEmpty()) {
+        if (!ipToServices.isEmpty()) {
             Set<Service> ipServices = ipToServices.get(publicIp);
             if (ipServices != null && !ipServices.isEmpty()) {
                 return false;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90c485e5/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index cb73519..2b63ae9 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -40,15 +40,10 @@ import javax.crypto.spec.SecretKeySpec;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.acl.ControlledEntity;
-import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.affinity.AffinityGroupProcessor;
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
 import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
 import org.apache.cloudstack.api.command.admin.account.CreateAccountCmd;
 import org.apache.cloudstack.api.command.admin.account.DeleteAccountCmd;
 import org.apache.cloudstack.api.command.admin.account.DisableAccountCmd;
@@ -465,6 +460,8 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.GetVncPortAnswer;
@@ -556,18 +553,14 @@ import com.cloud.storage.GuestOSHypervisor;
 import com.cloud.storage.GuestOSHypervisorVO;
 import com.cloud.storage.GuestOSVO;
 import com.cloud.storage.GuestOsCategory;
-import com.cloud.storage.Storage.ImageFormat;
-import com.cloud.storage.Storage.TemplateType;
 import com.cloud.storage.StorageManager;
 import com.cloud.storage.StoragePool;
-import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.Volume;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.DiskOfferingDao;
 import com.cloud.storage.dao.GuestOSCategoryDao;
 import com.cloud.storage.dao.GuestOSDao;
 import com.cloud.storage.dao.GuestOSHypervisorDao;
-import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.secondary.SecondaryStorageVmManager;
 import com.cloud.tags.ResourceTagVO;
@@ -575,7 +568,6 @@ import com.cloud.tags.dao.ResourceTagDao;
 import com.cloud.template.TemplateManager;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
-import com.cloud.user.AccountService;
 import com.cloud.user.SSHKeyPair;
 import com.cloud.user.SSHKeyPairVO;
 import com.cloud.user.User;
@@ -583,7 +575,6 @@ import com.cloud.user.UserVO;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.SSHKeyPairDao;
 import com.cloud.user.dao.UserDao;
-import com.cloud.utils.EnumUtils;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.PasswordGenerator;
@@ -668,8 +659,6 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     @Inject
     private DiskOfferingDao _diskOfferingDao;
     @Inject
-    private VMTemplateDao _templateDao;
-    @Inject
     private DomainDao _domainDao;
     @Inject
     private AccountDao _accountDao;
@@ -734,15 +723,11 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     @Inject
     private UserVmManager _userVmMgr;
     @Inject
-    private AccountService _accountService;
-    @Inject
     private ServiceOfferingDao _offeringDao;
-
     @Inject
     private DeploymentPlanningManager _dpMgr;
 
     private LockMasterListener _lockMasterListener;
-
     private final ScheduledExecutorService _eventExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("EventChecker"));
     private final ScheduledExecutorService _alertExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("AlertChecker"));
     @Inject
@@ -1809,108 +1794,6 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
     }
      */
 
-    private VMTemplateVO updateTemplateOrIso(BaseUpdateTemplateOrIsoCmd cmd) {
-        Long id = cmd.getId();
-        String name = cmd.getTemplateName();
-        String displayText = cmd.getDisplayText();
-        String format = cmd.getFormat();
-        Long guestOSId = cmd.getOsTypeId();
-        Boolean passwordEnabled = cmd.isPasswordEnabled();
-        Boolean bootable = cmd.isBootable();
-        Integer sortKey = cmd.getSortKey();
-        Boolean isDynamicallyScalable = cmd.isDynamicallyScalable();
-        Boolean isRoutingTemplate = cmd.isRoutingType();
-        Account account = CallContext.current().getCallingAccount();
-
-        // verify that template exists
-        VMTemplateVO template = _templateDao.findById(id);
-        if (template == null || template.getRemoved() != null) {
-            InvalidParameterValueException ex = new InvalidParameterValueException("unable to find template/iso with specified id");
-            ex.addProxyObject(id.toString(), "templateId");
-            throw ex;
-        }
-
-        // Don't allow to modify system template
-        if (id.equals(Long.valueOf(1))) {
-            InvalidParameterValueException ex = new InvalidParameterValueException("Unable to update template/iso of specified id");
-            ex.addProxyObject(template.getUuid(), "templateId");
-            throw ex;
-        }
-
-        // do a permission check
-        _accountMgr.checkAccess(account, AccessType.ModifyEntry, true, template);
-
-        if (cmd.isRoutingType() != null) {
-            if (!_accountService.isRootAdmin(account.getType())) {
-                throw new PermissionDeniedException("Parameter isrouting can only be specified by a Root Admin, permission denied");
-            }
-        }
-        boolean updateNeeded = !(name == null && displayText == null && format == null && guestOSId == null && passwordEnabled == null && bootable == null && sortKey == null
-                && isDynamicallyScalable == null && isRoutingTemplate == null);
-        if (!updateNeeded) {
-            return template;
-        }
-
-        template = _templateDao.createForUpdate(id);
-
-        if (name != null) {
-            template.setName(name);
-        }
-
-        if (displayText != null) {
-            template.setDisplayText(displayText);
-        }
-
-        if (sortKey != null) {
-            template.setSortKey(sortKey);
-        }
-
-        ImageFormat imageFormat = null;
-        if (format != null) {
-            try {
-                imageFormat = ImageFormat.valueOf(format.toUpperCase());
-            } catch (IllegalArgumentException e) {
-                throw new InvalidParameterValueException("Image format: " + format + " is incorrect. Supported formats are " + EnumUtils.listValues(ImageFormat.values()));
-            }
-
-            template.setFormat(imageFormat);
-        }
-
-        if (guestOSId != null) {
-            GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
-
-            if (guestOS == null) {
-                throw new InvalidParameterValueException("Please specify a valid guest OS ID.");
-            } else {
-                template.setGuestOSId(guestOSId);
-            }
-        }
-
-        if (passwordEnabled != null) {
-            template.setEnablePassword(passwordEnabled);
-        }
-
-        if (bootable != null) {
-            template.setBootable(bootable);
-        }
-
-        if (isDynamicallyScalable != null) {
-            template.setDynamicallyScalable(isDynamicallyScalable);
-        }
-
-        if (isRoutingTemplate != null) {
-            if (isRoutingTemplate) {
-                template.setTemplateType(TemplateType.ROUTING);
-            } else {
-                template.setTemplateType(TemplateType.USER);
-            }
-        }
-
-        _templateDao.update(id, template);
-
-        return _templateDao.findById(id);
-    }
-
     @Override
     public Pair<List<? extends IpAddress>, Integer> searchForIPAddresses(ListPublicIpAddressesCmd cmd) {
         Object keyword = cmd.getKeyword();
@@ -3462,7 +3345,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
             }
         }
 
-        long diskOffMaxSize = _volumeMgr.CustomDiskOfferingMaxSize.value();
+        long diskOffMaxSize = VolumeOrchestrationService.CustomDiskOfferingMaxSize.value();
         KVMSnapshotEnabled = Boolean.parseBoolean(_configDao.getValue("KVM.snapshot.enabled"));
 
         boolean userPublicTemplateEnabled = TemplateManager.AllowPublicUserTemplates.valueIn(caller.getId());


[43/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
-introduces 'DistributedRouter' as capability to 'Connectivity' service.
-create VPC offering to permit 'DistributedRouter' as capability to
connectivity service


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/b9518c8e
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/b9518c8e
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/b9518c8e

Branch: refs/heads/distributedrouter
Commit: b9518c8e2ca3cbd7b17a93aaecca4b7bba610325
Parents: f293c94
Author: Murali Reddy <mu...@gmail.com>
Authored: Tue Mar 4 16:42:17 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:58:16 2014 +0530

----------------------------------------------------------------------
 api/src/com/cloud/network/Network.java          |  3 +-
 api/src/com/cloud/network/vpc/VpcOffering.java  |  5 ++
 .../network/vpc/VpcProvisioningService.java     |  6 +-
 .../org/apache/cloudstack/api/ApiConstants.java |  1 +
 .../command/admin/vpc/CreateVPCOfferingCmd.java | 10 ++-
 .../api/response/VpcOfferingResponse.java       |  8 +++
 .../com/cloud/network/vpc/VpcOfferingVO.java    | 12 +++-
 .../management/ContrailManagerImpl.java         |  2 +-
 server/src/com/cloud/api/ApiResponseHelper.java |  1 +
 .../com/cloud/network/vpc/VpcManagerImpl.java   | 65 +++++++++++++++++---
 setup/db/db/schema-430to440.sql                 |  2 +-
 11 files changed, 99 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b9518c8e/api/src/com/cloud/network/Network.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java
index 6dc6752..3283a55 100644
--- a/api/src/com/cloud/network/Network.java
+++ b/api/src/com/cloud/network/Network.java
@@ -57,7 +57,7 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
         public static final Service PortForwarding = new Service("PortForwarding");
         public static final Service SecurityGroup = new Service("SecurityGroup");
         public static final Service NetworkACL = new Service("NetworkACL", Capability.SupportedProtocols);
-        public static final Service Connectivity = new Service("Connectivity");
+        public static final Service Connectivity = new Service("Connectivity", Capability.DistributedRouter);
 
         private final String name;
         private final Capability[] caps;
@@ -186,6 +186,7 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
         public static final Capability SslTermination = new Capability("SslTermination");
         public static final Capability LbSchemes = new Capability("LbSchemes");
         public static final Capability DhcpAccrossMultipleSubnets = new Capability("DhcpAccrossMultipleSubnets");
+        public static final Capability DistributedRouter = new Capability("DistributedRouter");
 
         private final String name;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b9518c8e/api/src/com/cloud/network/vpc/VpcOffering.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/vpc/VpcOffering.java b/api/src/com/cloud/network/vpc/VpcOffering.java
index 6e75a2f..a0a1b15 100644
--- a/api/src/com/cloud/network/vpc/VpcOffering.java
+++ b/api/src/com/cloud/network/vpc/VpcOffering.java
@@ -55,4 +55,9 @@ public interface VpcOffering extends InternalIdentity, Identity {
      */
     Long getServiceOfferingId();
 
+    /**
+     *
+     * @return true if the offering provides a distributed router capable of one-hop forwarding
+     */
+    boolean supportsDistributedRouter();
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b9518c8e/api/src/com/cloud/network/vpc/VpcProvisioningService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/vpc/VpcProvisioningService.java b/api/src/com/cloud/network/vpc/VpcProvisioningService.java
index 174b71f..e545275 100644
--- a/api/src/com/cloud/network/vpc/VpcProvisioningService.java
+++ b/api/src/com/cloud/network/vpc/VpcProvisioningService.java
@@ -23,8 +23,10 @@ public interface VpcProvisioningService {
 
     public VpcOffering getVpcOffering(long vpcOfferingId);
 
-    public VpcOffering createVpcOffering(String name, String displayText, List<String> supportedServices, Map<String, List<String>> serviceProviders,
-        Long serviceOfferingId);
+    public VpcOffering createVpcOffering(String name, String displayText, List<String> supportedServices,
+                                         Map<String, List<String>> serviceProviders,
+                                         Map serviceCapabilitystList,
+                                         Long serviceOfferingId);
 
     List<? extends VpcOffering> listVpcOfferings(Long id, String name, String displayText, List<String> supportedServicesStr, Boolean isDefault, String keyword,
         String state, Long startIndex, Long pageSizeVal);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b9518c8e/api/src/org/apache/cloudstack/api/ApiConstants.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java
index 239b8cd..32107ed 100755
--- a/api/src/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/org/apache/cloudstack/api/ApiConstants.java
@@ -588,6 +588,7 @@ public class ApiConstants {
     public static final String VGPU = "vgpu";
     public static final String VGPUTYPE = "vgputype";
     public static final String REMAININGCAPACITY = "remainingcapacity";
+    public static final String DISTRIBUTED_VPC_ROUTER = "distributedvpcrouter";
 
 
     public enum HostDetails {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b9518c8e/api/src/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java
index 6b2c4ba..5b3090b 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java
@@ -66,6 +66,9 @@ public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd {
         + "If not specified, the provider for the service will be mapped to the default provider on the physical network")
     private Map<String, String> serviceProviderList;
 
+    @Parameter(name = ApiConstants.SERVICE_CAPABILITY_LIST, type = CommandType.MAP, description = "desired service capabilities as part of vpc offering")
+    private Map serviceCapabilitystList;
+
     @Parameter(name = ApiConstants.SERVICE_OFFERING_ID,
                type = CommandType.UUID,
                entityType = ServiceOfferingResponse.class,
@@ -112,13 +115,18 @@ public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd {
         return serviceProviderMap;
     }
 
+    public Map<String, List<String>> getServiceCapabilitystList() {
+        return serviceCapabilitystList;
+    }
+
     public Long getServiceOfferingId() {
         return serviceOfferingId;
     }
 
     @Override
     public void create() throws ResourceAllocationException {
-        VpcOffering vpcOff = _vpcProvSvc.createVpcOffering(getVpcOfferingName(), getDisplayText(), getSupportedServices(), getServiceProviders(), getServiceOfferingId());
+        VpcOffering vpcOff = _vpcProvSvc.createVpcOffering(getVpcOfferingName(), getDisplayText(),
+                getSupportedServices(), getServiceProviders(), getServiceCapabilitystList(), getServiceOfferingId());
         if (vpcOff != null) {
             setEntityId(vpcOff.getId());
             setEntityUuid(vpcOff.getUuid());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b9518c8e/api/src/org/apache/cloudstack/api/response/VpcOfferingResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/VpcOfferingResponse.java b/api/src/org/apache/cloudstack/api/response/VpcOfferingResponse.java
index 17e4dfd..89697f0 100644
--- a/api/src/org/apache/cloudstack/api/response/VpcOfferingResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/VpcOfferingResponse.java
@@ -59,6 +59,10 @@ public class VpcOfferingResponse extends BaseResponse {
     @Param(description = "the list of supported services", responseObject = ServiceResponse.class)
     private List<ServiceResponse> services;
 
+    @SerializedName(ApiConstants.DISTRIBUTED_VPC_ROUTER)
+    @Param(description = " indicates if the vpc offering supports distributed router for one-hop forwarding")
+    private Boolean supportsDistributedRouter;
+
     public void setId(String id) {
         this.id = id;
     }
@@ -86,4 +90,8 @@ public class VpcOfferingResponse extends BaseResponse {
     public void setState(String state) {
         this.state = state;
     }
+
+    public void setSupportsDistributedRouter(Boolean supportsDistributedRouter) {
+        this.supportsDistributedRouter = supportsDistributedRouter;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b9518c8e/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java b/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java
index 3a676e6..53f6f60 100644
--- a/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java
+++ b/engine/schema/src/com/cloud/network/vpc/VpcOfferingVO.java
@@ -67,6 +67,9 @@ public class VpcOfferingVO implements VpcOffering {
     @Column(name = "service_offering_id")
     Long serviceOfferingId;
 
+    @Column(name = "supports_distributed_router")
+    boolean supportsDistributedRouter=false;
+
     public VpcOfferingVO() {
         this.uuid = UUID.randomUUID().toString();
     }
@@ -80,9 +83,11 @@ public class VpcOfferingVO implements VpcOffering {
         this.state = State.Disabled;
     }
 
-    public VpcOfferingVO(String name, String displayText, boolean isDefault, Long serviceOfferingId) {
+    public VpcOfferingVO(String name, String displayText, boolean isDefault, Long serviceOfferingId,
+                         boolean supportsDistributedRouter) {
         this(name, displayText, serviceOfferingId);
         this.isDefault = isDefault;
+        this.supportsDistributedRouter = supportsDistributedRouter;
     }
 
     @Override
@@ -145,4 +150,9 @@ public class VpcOfferingVO implements VpcOffering {
     public Long getServiceOfferingId() {
         return serviceOfferingId;
     }
+
+    @Override
+    public boolean supportsDistributedRouter() {
+        return supportsDistributedRouter;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b9518c8e/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java
index 01be7db..bf083fd 100644
--- a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java
+++ b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java
@@ -281,7 +281,7 @@ public class ContrailManagerImpl extends ManagerBase implements ContrailManager
         for (String svc: services) {
             serviceProviderMap.put(svc, providerSet);
         }
-        vpcOffer = _vpcProvSvc.createVpcOffering(juniperVPCOfferingName, juniperVPCOfferingDisplayText, services, serviceProviderMap, null);
+        vpcOffer = _vpcProvSvc.createVpcOffering(juniperVPCOfferingName, juniperVPCOfferingDisplayText, services, serviceProviderMap, null, null);
         ((VpcOfferingVO)vpcOffer).setState(VpcOffering.State.Enabled);
         long id = vpcOffer.getId();
         _vpcOffDao.update(id, (VpcOfferingVO)vpcOffer);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b9518c8e/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index f500909..e87c3e0 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -2765,6 +2765,7 @@ public class ApiResponseHelper implements ResponseGenerator {
         response.setDisplayText(offering.getDisplayText());
         response.setIsDefault(offering.isDefault());
         response.setState(offering.getState().name());
+        response.setSupportsDistributedRouter(offering.supportsDistributedRouter());
 
         Map<Service, Set<Provider>> serviceProviderMap = ApiDBUtils.listVpcOffServices(offering.getId());
         List<ServiceResponse> serviceResponses = new ArrayList<ServiceResponse>();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b9518c8e/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 99dbfde..8c7b5fb 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -18,8 +18,10 @@ package com.cloud.network.vpc;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -231,7 +233,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                     svcProviderMap.put(svc, defaultProviders);
                 }
             }
-                    createVpcOffering(VpcOffering.defaultVPCOfferingName, VpcOffering.defaultVPCOfferingName, svcProviderMap, true, State.Enabled, null);
+                    createVpcOffering(VpcOffering.defaultVPCOfferingName, VpcOffering.defaultVPCOfferingName, svcProviderMap, true, State.Enabled, null, false);
         }
 
         //configure default vpc offering with Netscaler as LB Provider
@@ -250,7 +252,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                     svcProviderMap.put(svc, defaultProviders);
                 }
             }
-                    createVpcOffering(VpcOffering.defaultVPCNSOfferingName, VpcOffering.defaultVPCNSOfferingName, svcProviderMap, false, State.Enabled, null);
+                    createVpcOffering(VpcOffering.defaultVPCNSOfferingName, VpcOffering.defaultVPCNSOfferingName, svcProviderMap, false, State.Enabled, null, false);
         }
             }
         });
@@ -299,8 +301,10 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
 
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_VPC_OFFERING_CREATE, eventDescription = "creating vpc offering", create = true)
-    public VpcOffering createVpcOffering(String name, String displayText, List<String> supportedServices, Map<String, List<String>> serviceProviders,
-        Long serviceOfferingId) {
+    public VpcOffering createVpcOffering(String name, String displayText, List<String> supportedServices,
+                                         Map<String, List<String>> serviceProviders,
+                                         Map serviceCapabilitystList,
+                                         Long serviceOfferingId) {
         Map<Network.Service, Set<Network.Provider>> svcProviderMap = new HashMap<Network.Service, Set<Network.Provider>>();
         Set<Network.Provider> defaultProviders = new HashSet<Network.Provider>();
         defaultProviders.add(Provider.VPCVirtualRouter);
@@ -372,20 +376,25 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
             }
         }
 
-        VpcOffering offering = createVpcOffering(name, displayText, svcProviderMap, false, null, serviceOfferingId);
+        boolean supportsDistributedRouter = isVpcOfferingSupportsDistributedRouter(serviceCapabilitystList);
+
+        VpcOffering offering = createVpcOffering(name, displayText, svcProviderMap, false, null,
+                serviceOfferingId,supportsDistributedRouter);
         CallContext.current().setEventDetails(" Id: " + offering.getId() + " Name: " + name);
 
         return offering;
     }
 
     @DB
-    protected VpcOffering createVpcOffering(final String name, final String displayText, final Map<Network.Service, Set<Network.Provider>> svcProviderMap,
-        final boolean isDefault, final State state, final Long serviceOfferingId) {
+    protected VpcOffering createVpcOffering(final String name, final String displayText,
+                                            final Map<Network.Service, Set<Network.Provider>> svcProviderMap,
+                                            final boolean isDefault, final State state, final Long serviceOfferingId,
+                                            final boolean supportsDistributedRouter) {
         return Transaction.execute(new TransactionCallback<VpcOffering>() {
             @Override
             public VpcOffering doInTransaction(TransactionStatus status) {
-        // create vpc offering object
-                VpcOfferingVO offering = new VpcOfferingVO(name, displayText, isDefault, serviceOfferingId);
+                // create vpc offering object
+                VpcOfferingVO offering = new VpcOfferingVO(name, displayText, isDefault, serviceOfferingId, supportsDistributedRouter);
 
         if (state != null) {
             offering.setState(state);
@@ -413,6 +422,44 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         });
     }
 
+    private boolean isVpcOfferingSupportsDistributedRouter(Map serviceCapabilitystList) {
+        boolean supportsDistributedRouter = false;
+        if (serviceCapabilitystList != null && !serviceCapabilitystList.isEmpty()) {
+            Collection serviceCapabilityCollection = serviceCapabilitystList.values();
+            Iterator iter = serviceCapabilityCollection.iterator();
+            Map<Network.Capability, String> capabilityMap = null;
+
+            while (iter.hasNext()) {
+                HashMap<String, String> svcCapabilityMap = (HashMap<String, String>)iter.next();
+                Network.Capability capability = null;
+                String svc = svcCapabilityMap.get("service");
+                String capabilityName = svcCapabilityMap.get("capabilitytype");
+                String capabilityValue = svcCapabilityMap.get("capabilityvalue");
+                if (capabilityName != null) {
+                    capability = Network.Capability.getCapability(capabilityName);
+                }
+
+                if ((capability == null) || (capabilityName == null) || (capabilityValue == null)) {
+                    throw new InvalidParameterValueException("Invalid capability:" + capabilityName + " capability value:" + capabilityValue);
+                }
+
+                if (!svc.equalsIgnoreCase(Service.Connectivity.getName())) {
+                    throw new InvalidParameterValueException("Invalid Service:" + svc + " specified. Only for 'Connectivity' service capabilities can be specified");
+                }
+
+                if (!capabilityName.equalsIgnoreCase("DistributedRouter")) {
+                    throw new InvalidParameterValueException("Invalid Capability:" + capabilityName + " specified. Only 'DistributedRouter' capability can be specified.");
+                }
+
+                if (!capabilityValue.equalsIgnoreCase("true") && capabilityValue.equalsIgnoreCase("false")) {
+                    throw new InvalidParameterValueException("Invalid Capability value:" + capabilityValue + " specified.");
+                }
+                supportsDistributedRouter = capabilityValue.equalsIgnoreCase("true");
+            }
+        }
+        return supportsDistributedRouter;
+    }
+
     @Override
     public Vpc getActiveVpc(long vpcId) {
         return _vpcDao.getActiveVpcById(vpcId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b9518c8e/setup/db/db/schema-430to440.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-430to440.sql b/setup/db/db/schema-430to440.sql
index 9d41fe9..9614bca 100644
--- a/setup/db/db/schema-430to440.sql
+++ b/setup/db/db/schema-430to440.sql
@@ -738,5 +738,5 @@ UPDATE `cloud`.`guest_os_hypervisor` SET `created` = now();
 ALTER TABLE `cloud`.`guest_os` ADD COLUMN `created` datetime COMMENT 'Time when Guest OS was created in system';
 ALTER TABLE `cloud`.`guest_os` ADD COLUMN `removed` datetime COMMENT 'Time when Guest OS was removed if deleted, else NULL';
 UPDATE `cloud`.`guest_os` SET `created` = now();
-
 ALTER TABLE `cloud`.`vm_reservation` ADD COLUMN `deployment_planner` varchar(40) DEFAULT NULL COMMENT 'Preferred deployment planner for the vm';
+ALTER TABLE `cloud`.`vpc_offerings` ADD COLUMN supports_distributed_router boolean default false;


[25/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Fix VM deploy failure bug introduced by commit
39e5b768e8fcae9622e01b2ca72a49675eb6d3fb.

Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/d3fd66e9
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/d3fd66e9
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/d3fd66e9

Branch: refs/heads/distributedrouter
Commit: d3fd66e9f555616530e483d1eacf2525556bf14e
Parents: 36c0a4e
Author: Min Chen <mi...@citrix.com>
Authored: Thu Mar 13 16:37:26 2014 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Thu Mar 13 16:37:26 2014 -0700

----------------------------------------------------------------------
 api/src/org/apache/cloudstack/api/ApiConstants.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d3fd66e9/api/src/org/apache/cloudstack/api/ApiConstants.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java
index 3a90afc..239b8cd 100755
--- a/api/src/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/org/apache/cloudstack/api/ApiConstants.java
@@ -59,7 +59,7 @@ public class ApiConstants {
     public static final String CTX_ACCOUNT_ID = "ctxaccountid";
     public static final String CTX_USER_ID = "ctxuserid";
     public static final String CTXSTARTEVENTID = "ctxstarteventid";
-    public static final String CTX_START_EVENT_ID = "ctxstarteventid";
+    public static final String CTX_START_EVENT_ID = "ctxStartEventId";
     public static final String CUSTOMIZED = "customized";
     public static final String CUSTOMIZED_IOPS = "customizediops";
     public static final String CUSTOM_ID = "customid";


[27/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Handle a race-condition in VirtualNetworkManagerImpl.java in the process of starting it parallelly.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/42d63737
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/42d63737
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/42d63737

Branch: refs/heads/distributedrouter
Commit: 42d637376bba7a975830d695f14be7678dc6e110
Parents: 5a75a3e
Author: Kelven Yang <ke...@gmail.com>
Authored: Wed Mar 12 16:09:51 2014 -0700
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Mar 13 16:59:56 2014 -0700

----------------------------------------------------------------------
 .../VirtualNetworkApplianceManagerImpl.java     | 117 ++++++++++++-------
 1 file changed, 76 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/42d63737/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 74cfd74..eeab91d 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -17,6 +17,44 @@
 
 package com.cloud.network.router;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+import org.apache.log4j.Logger;
+import org.apache.cloudstack.api.command.admin.router.RebootRouterCmd;
+import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
+import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.cloudstack.framework.config.ConfigDepot;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.framework.jobs.AsyncJobManager;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
+import org.apache.cloudstack.managed.context.ManagedContextRunnable;
+import org.apache.cloudstack.utils.identity.ManagementServerNode;
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
 import com.cloud.agent.api.AgentControlAnswer;
@@ -238,45 +276,7 @@ import com.cloud.vm.dao.NicIpAliasVO;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.UserVmDetailsDao;
 import com.cloud.vm.dao.VMInstanceDao;
-import org.apache.cloudstack.api.command.admin.router.RebootRouterCmd;
-import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
-import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
 import org.apache.cloudstack.config.ApiServiceConfiguration;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
-import org.apache.cloudstack.framework.config.ConfigDepot;
-import org.apache.cloudstack.framework.config.ConfigKey;
-import org.apache.cloudstack.framework.config.Configurable;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.cloudstack.framework.jobs.AsyncJobManager;
-import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
-import org.apache.cloudstack.managed.context.ManagedContextRunnable;
-import org.apache.cloudstack.utils.identity.ManagementServerNode;
-import org.apache.log4j.Logger;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TimeZone;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
 
 /**
  * VirtualNetworkApplianceManagerImpl manages the different types of virtual network appliances available in the Cloud Stack.
@@ -1885,8 +1885,35 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
         return new Pair<DeploymentPlan, List<DomainRouterVO>>(plan, routers);
     }
 
-    private DomainRouterVO startVirtualRouter(final DomainRouterVO router, final User user, final Account caller, final Map<Param, Object> params) throws StorageUnavailableException,
-    InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
+    private DomainRouterVO waitRouter(DomainRouterVO router) {
+        DomainRouterVO vm = _routerDao.findById(router.getId());
+
+        if (s_logger.isDebugEnabled())
+            s_logger.debug("Router " + router.getInstanceName() + " is not fully up yet, we will wait");
+        while (vm.getState() == State.Starting) {
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+            }
+
+            // reload to get the latest state info
+            vm = _routerDao.findById(router.getId());
+        }
+
+        if (vm.getState() == State.Running) {
+            if (s_logger.isDebugEnabled())
+                s_logger.debug("Router " + router.getInstanceName() + " is now fully up");
+
+            return router;
+        }
+
+        s_logger.warn("Router " + router.getInstanceName() + " failed to start. current state: " + vm.getState());
+        return null;
+    }
+
+    private DomainRouterVO startVirtualRouter(DomainRouterVO router, User user, Account caller, Map<Param, Object> params)
+            throws StorageUnavailableException, InsufficientCapacityException,
+    ConcurrentOperationException, ResourceUnavailableException {
 
         if (router.getRole() != Role.VIRTUAL_ROUTER || !router.getIsRedundantRouter()) {
             return this.start(router, user, caller, params, null);
@@ -1897,7 +1924,15 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
             return router;
         }
 
-        final DataCenterDeployment plan = new DataCenterDeployment(0, null, null, null, null, null);
+        //
+        // If another thread has already requested a VR start, there is a transition period for VR to transit from
+        // Starting to Running, there exist a race conditioning window here
+        // We will wait until VR is up or fail
+        if (router.getState() == State.Starting) {
+            return waitRouter(router);
+        }
+
+        DataCenterDeployment plan = new DataCenterDeployment(0, null, null, null, null, null);
         DomainRouterVO result = null;
         assert router.getIsRedundantRouter();
         final List<Long> networkIds = _routerDao.getRouterNetworks(router.getId());


[11/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
deployVm/startVm APIs: ability to define deploymentPlanner for VmToStart in the api call (available to ROOT admin only)


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1b83698d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1b83698d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1b83698d

Branch: refs/heads/distributedrouter
Commit: 1b83698dac712e3497d4140b15c9fcba3870c705
Parents: 5779292
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Tue Mar 11 10:14:08 2014 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Thu Mar 13 10:23:34 2014 -0700

----------------------------------------------------------------------
 .../api/command/user/vm/DeployVMCmd.java        |  7 ++++
 .../api/command/user/vm/StartVMCmd.java         | 13 ++++++--
 .../src/com/cloud/vm/VirtualMachineManager.java |  2 +-
 .../cloud/entity/api/VirtualMachineEntity.java  |  3 +-
 .../cloud/deploy/DeploymentPlanningManager.java |  4 ++-
 .../com/cloud/vm/VirtualMachineManagerImpl.java | 20 ++++++-----
 .../src/com/cloud/vm/VmWorkStart.java           | 12 +++++--
 .../cloud/entity/api/VMEntityManager.java       |  3 +-
 .../cloud/entity/api/VMEntityManagerImpl.java   | 19 ++++++-----
 .../entity/api/VirtualMachineEntityImpl.java    |  4 +--
 .../cloud/entity/api/db/VMReservationVO.java    | 11 ++++++
 .../lb/InternalLoadBalancerVMManagerImpl.java   |  2 +-
 .../deploy/DeploymentPlanningManagerImpl.java   | 31 +++++++++++------
 .../src/com/cloud/deploy/FirstFitPlanner.java   |  3 +-
 .../cloud/network/as/AutoScaleManagerImpl.java  |  4 +--
 server/src/com/cloud/vm/UserVmManager.java      |  2 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java  | 35 ++++++++++----------
 setup/db/db/schema-430to440.sql                 |  2 ++
 18 files changed, 113 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
index bd363da..44edef8 100755
--- a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
@@ -178,6 +178,9 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd {
     @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, since = "4.3", description = "used to specify the custom parameters.")
     private Map details;
 
+    @Parameter(name = ApiConstants.DEPLOYMENT_PLANNER, type = CommandType.STRING, description = "Deployment planner to use for vm allocation. Available to ROOT admin only", since = "4.4", authorized = { RoleType.Admin })
+    private String deploymentPlanner;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -193,6 +196,10 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd {
         return diskOfferingId;
     }
 
+    public String getDeploymentPlanner() {
+        return deploymentPlanner;
+    }
+
     public String getDisplayName() {
         return displayName;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
index 553b753..f55aa59 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
@@ -16,18 +16,18 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.vm;
 
-import org.apache.cloudstack.api.BaseAsyncVMCmd;
-import org.apache.log4j.Logger;
-
+import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiCommandJobType;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncVMCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.HostResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
 
 import com.cloud.event.EventTypes;
 import com.cloud.exception.ConcurrentOperationException;
@@ -61,6 +61,9 @@ public class StartVMCmd extends BaseAsyncVMCmd {
                since = "3.0.1")
     private Long hostId;
 
+    @Parameter(name = ApiConstants.DEPLOYMENT_PLANNER, type = CommandType.STRING, description = "Deployment planner to use for vm allocation. Available to ROOT admin only", since = "4.4", authorized = { RoleType.Admin })
+    private String deploymentPlanner;
+
     // ///////////////////////////////////////////////////
     // ///////////////// Accessors ///////////////////////
     // ///////////////////////////////////////////////////
@@ -86,6 +89,10 @@ public class StartVMCmd extends BaseAsyncVMCmd {
         return "virtualmachine";
     }
 
+    public String getDeploymentPlanner() {
+        return deploymentPlanner;
+    }
+
     @Override
     public long getEntityOwnerId() {
         UserVm vm = _responseGenerator.findUserVmById(getId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/api/src/com/cloud/vm/VirtualMachineManager.java
----------------------------------------------------------------------
diff --git a/engine/api/src/com/cloud/vm/VirtualMachineManager.java b/engine/api/src/com/cloud/vm/VirtualMachineManager.java
index 350f396..99f5595 100644
--- a/engine/api/src/com/cloud/vm/VirtualMachineManager.java
+++ b/engine/api/src/com/cloud/vm/VirtualMachineManager.java
@@ -85,7 +85,7 @@ public interface VirtualMachineManager extends Manager {
 
     void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params);
 
-    void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy);
+    void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy, DeploymentPlanner planner);
 
     void stop(String vmUuid) throws ResourceUnavailableException;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java
index 773c683..37501f0 100755
--- a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java
+++ b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java
@@ -30,6 +30,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import org.apache.cloudstack.engine.entity.api.CloudStackEntity;
 
 import com.cloud.deploy.DeploymentPlan;
+import com.cloud.deploy.DeploymentPlanner;
 import com.cloud.deploy.DeploymentPlanner.ExcludeList;
 import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.CloudException;
@@ -90,7 +91,7 @@ public interface VirtualMachineEntity extends CloudStackEntity {
      * @param exclude list of areas to exclude
      * @return a reservation id
      */
-    String reserve(String plannerToUse, @BeanParam DeploymentPlan plan, ExcludeList exclude, String caller) throws InsufficientCapacityException,
+    String reserve(DeploymentPlanner plannerToUse, @BeanParam DeploymentPlan plan, ExcludeList exclude, String caller) throws InsufficientCapacityException,
         ResourceUnavailableException;
 
     /**

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java
----------------------------------------------------------------------
diff --git a/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java b/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java
index de2fc0e..ee6721a 100644
--- a/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java
+++ b/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java
@@ -43,8 +43,10 @@ public interface DeploymentPlanningManager extends Manager {
             ExcludeList avoids, DeploymentPlanner planner) throws InsufficientServerCapacityException, AffinityConflictException;
 
     String finalizeReservation(DeployDestination plannedDestination,
-            VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids)
+            VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids, DeploymentPlanner planner)
             throws InsufficientServerCapacityException, AffinityConflictException;
 
     void cleanupVMReservations();
+
+    DeploymentPlanner getDeploymentPlannerByName(String plannerName);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 609aefa..2cbde35 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -40,8 +40,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -70,6 +68,7 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
@@ -80,8 +79,8 @@ import com.cloud.agent.api.CheckVirtualMachineAnswer;
 import com.cloud.agent.api.CheckVirtualMachineCommand;
 import com.cloud.agent.api.ClusterSyncAnswer;
 import com.cloud.agent.api.ClusterSyncCommand;
-import com.cloud.agent.api.ClusterVMMetaDataSyncCommand;
 import com.cloud.agent.api.ClusterVMMetaDataSyncAnswer;
+import com.cloud.agent.api.ClusterVMMetaDataSyncCommand;
 import com.cloud.agent.api.Command;
 import com.cloud.agent.api.MigrateAnswer;
 import com.cloud.agent.api.MigrateCommand;
@@ -608,13 +607,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
     @Override
     public void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) {
-        start(vmUuid, params, null);
+        start(vmUuid, params, null, null);
     }
 
     @Override
-    public void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy) {
+    public void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy, DeploymentPlanner planner) {
         try {
-            advanceStart(vmUuid, params, planToDeploy, null);
+            advanceStart(vmUuid, params, planToDeploy, planner);
         } catch (ConcurrentOperationException e) {
             throw new CloudRuntimeException("Unable to start a VM due to concurrent operation", e).add(VirtualMachine.class, vmUuid);
         } catch (InsufficientCapacityException e) {
@@ -779,7 +778,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     _workJobDao.expunge(placeHolder.getId());
             }
         } else {
-            Outcome<VirtualMachine> outcome = startVmThroughJobQueue(vmUuid, params, planToDeploy);
+            Outcome<VirtualMachine> outcome = startVmThroughJobQueue(vmUuid, params, planToDeploy, planner);
 
             try {
                 VirtualMachine vm = outcome.get();
@@ -4451,7 +4450,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     //
     public Outcome<VirtualMachine> startVmThroughJobQueue(final String vmUuid,
             final Map<VirtualMachineProfile.Param, Object> params,
-            final DeploymentPlan planToDeploy) {
+            final DeploymentPlan planToDeploy, final DeploymentPlanner planner) {
 
         final CallContext context = CallContext.current();
         final User callingUser = context.getCallingUser();
@@ -4488,6 +4487,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                         // save work context info (there are some duplications)
                         VmWorkStart workInfo = new VmWorkStart(callingUser.getId(), callingAccount.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER);
                         workInfo.setPlan(planToDeploy);
+                        if (planner != null) {
+                            workInfo.setDeploymentPlanner(planner.getName());
+                        }
                         workInfo.setParams(params);
                         workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
 
@@ -5123,7 +5125,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         }
         assert (vm != null);
 
-        orchestrateStart(vm.getUuid(), work.getParams(), work.getPlan(), null);
+        orchestrateStart(vm.getUuid(), work.getParams(), work.getPlan(), _dpMgr.getDeploymentPlannerByName(work.getDeploymentPlanner()));
         return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkStart.java b/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
index f1b2efd..bb9f375 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkStart.java
@@ -21,10 +21,9 @@ import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.framework.jobs.impl.JobSerializerHelper;
+import org.apache.log4j.Logger;
 
 import com.cloud.deploy.DataCenterDeployment;
 import com.cloud.deploy.DeploymentPlan;
@@ -46,6 +45,7 @@ public class VmWorkStart extends VmWork {
 
     String reservationId;
     String journalName;
+    String planner;
 
     // use serialization friendly map
     private Map<String, String> rawParams;
@@ -91,6 +91,14 @@ public class VmWorkStart extends VmWork {
         }
     }
 
+    public void setDeploymentPlanner(String planner) {
+        this.planner = planner;
+    }
+
+    public String getDeploymentPlanner() {
+        return this.planner;
+    }
+
     public Map<String, String> getRawParams() {
         return rawParams;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java
index 7c53302..3145314 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java
@@ -21,6 +21,7 @@ import java.util.Map;
 import org.apache.cloudstack.engine.cloud.entity.api.db.VMEntityVO;
 
 import com.cloud.deploy.DeploymentPlan;
+import com.cloud.deploy.DeploymentPlanner;
 import com.cloud.deploy.DeploymentPlanner.ExcludeList;
 import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.ConcurrentOperationException;
@@ -35,7 +36,7 @@ public interface VMEntityManager {
 
     void saveVirtualMachine(VMEntityVO vmInstanceVO);
 
-    String reserveVirtualMachine(VMEntityVO vmEntityVO, String plannerToUse, DeploymentPlan plan, ExcludeList exclude) throws InsufficientCapacityException,
+    String reserveVirtualMachine(VMEntityVO vmEntityVO, DeploymentPlanner plannerToUse, DeploymentPlan plan, ExcludeList exclude) throws InsufficientCapacityException,
         ResourceUnavailableException;
 
     void deployVirtualMachine(String reservationId, VMEntityVO vmEntityVO, String caller, Map<VirtualMachineProfile.Param, Object> params)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java
index 36481ab..b1ac2f8 100755
--- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java
@@ -22,9 +22,6 @@ import java.util.UUID;
 
 import javax.inject.Inject;
 
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
 import org.apache.cloudstack.engine.cloud.entity.api.db.VMEntityVO;
 import org.apache.cloudstack.engine.cloud.entity.api.db.VMReservationVO;
@@ -32,6 +29,8 @@ import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMEntityDao;
 import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMReservationDao;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
 import com.cloud.dc.DataCenter;
 import com.cloud.deploy.DataCenterDeployment;
@@ -114,6 +113,8 @@ public class VMEntityManagerImpl implements VMEntityManager {
 
     @Inject
     protected AffinityGroupVMMapDao _affinityGroupVMMapDao;
+    @Inject
+    DeploymentPlanningManager _planningMgr;
 
     @Override
     public VMEntityVO loadVirtualMachine(String vmId) {
@@ -138,7 +139,7 @@ public class VMEntityManagerImpl implements VMEntityManager {
     }
 
     @Override
-    public String reserveVirtualMachine(VMEntityVO vmEntityVO, String plannerToUse, DeploymentPlan planToDeploy, ExcludeList exclude)
+    public String reserveVirtualMachine(VMEntityVO vmEntityVO, DeploymentPlanner plannerToUse, DeploymentPlan planToDeploy, ExcludeList exclude)
         throws InsufficientCapacityException, ResourceUnavailableException {
 
         //call planner and get the deployDestination.
@@ -189,13 +190,13 @@ public class VMEntityManagerImpl implements VMEntityManager {
         while (true) {
             DeployDestination dest = null;
             try {
-                dest = _dpMgr.planDeployment(vmProfile, plan, exclude, null);
+                dest = _dpMgr.planDeployment(vmProfile, plan, exclude, plannerToUse);
             } catch (AffinityConflictException e) {
                 throw new CloudRuntimeException("Unable to create deployment, affinity rules associted to the VM conflict");
             }
 
             if (dest != null) {
-                String reservationId = _dpMgr.finalizeReservation(dest, vmProfile, plan, exclude);
+                String reservationId = _dpMgr.finalizeReservation(dest, vmProfile, plan, exclude, plannerToUse);
                 if (reservationId != null) {
                     return reservationId;
                 } else {
@@ -229,7 +230,7 @@ public class VMEntityManagerImpl implements VMEntityManager {
             DataCenterDeployment reservedPlan =
                 new DataCenterDeployment(vm.getDataCenterId(), vmReservation.getPodId(), vmReservation.getClusterId(), vmReservation.getHostId(), null, null);
             try {
-                _itMgr.start(vm.getUuid(), params, reservedPlan);
+                _itMgr.start(vm.getUuid(), params, reservedPlan, _planningMgr.getDeploymentPlannerByName(vmReservation.getDeploymentPlanner()));
             } catch (Exception ex) {
                 // Retry the deployment without using the reservation plan
                 DataCenterDeployment plan = new DataCenterDeployment(0, null, null, null, null, null);
@@ -238,11 +239,11 @@ public class VMEntityManagerImpl implements VMEntityManager {
                     plan.setAvoids(reservedPlan.getAvoids());
                 }
 
-                _itMgr.start(vm.getUuid(), params, plan);
+                _itMgr.start(vm.getUuid(), params, plan, null);
             }
         } else {
             // no reservation found. Let VirtualMachineManager retry
-            _itMgr.start(vm.getUuid(), params, null);
+            _itMgr.start(vm.getUuid(), params, null, null);
         }
 
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java
index 7f2e4ff..706748f 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java
@@ -24,10 +24,10 @@ import java.util.Map;
 import javax.inject.Inject;
 
 import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.engine.cloud.entity.api.db.VMEntityVO;
 
 import com.cloud.deploy.DeploymentPlan;
+import com.cloud.deploy.DeploymentPlanner;
 import com.cloud.deploy.DeploymentPlanner.ExcludeList;
 import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.ConcurrentOperationException;
@@ -195,7 +195,7 @@ public class VirtualMachineEntityImpl implements VirtualMachineEntity {
     }
 
     @Override
-    public String reserve(String plannerToUse, DeploymentPlan plan, ExcludeList exclude, String caller) throws InsufficientCapacityException,
+    public String reserve(DeploymentPlanner plannerToUse, DeploymentPlan plan, ExcludeList exclude, String caller) throws InsufficientCapacityException,
         ResourceUnavailableException {
         return manager.reserveVirtualMachine(this.vmEntityVO, plannerToUse, plan, exclude);
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMReservationVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMReservationVO.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMReservationVO.java
index dabed15..b934a5d 100644
--- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMReservationVO.java
+++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMReservationVO.java
@@ -66,6 +66,9 @@ public class VMReservationVO implements Identity, InternalIdentity {
     @Column(name = GenericDao.REMOVED_COLUMN)
     private Date removed;
 
+    @Column(name = "deployment_planner")
+    private String deploymentPlanner;
+
     // VolumeId -> poolId
     @Transient
     Map<Long, Long> volumeReservationMap;
@@ -124,4 +127,12 @@ public class VMReservationVO implements Identity, InternalIdentity {
         this.volumeReservationMap = volumeReservationMap;
     }
 
+    public void setDeploymentPlanner(String planner) {
+        this.deploymentPlanner = planner;
+    }
+
+    public String getDeploymentPlanner() {
+        return this.deploymentPlanner;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java
index 8b82306..aa763d5 100644
--- a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java
+++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java
@@ -805,7 +805,7 @@ public class InternalLoadBalancerVMManagerImpl extends ManagerBase implements In
     protected DomainRouterVO startInternalLbVm(DomainRouterVO internalLbVm, Account caller, long callerUserId, Map<Param, Object> params)
         throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
         s_logger.debug("Starting Internal LB VM " + internalLbVm);
-        _itMgr.start(internalLbVm.getUuid(), params, null);
+        _itMgr.start(internalLbVm.getUuid(), params, null, null);
         if (internalLbVm.isStopPending()) {
             s_logger.info("Clear the stop pending flag of Internal LB VM " + internalLbVm.getHostName() + " after start router successfully!");
             internalLbVm.setStopPending(false);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
index f76e485..5312e15 100644
--- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
+++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
@@ -31,8 +31,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.affinity.AffinityGroupProcessor;
 import org.apache.cloudstack.affinity.AffinityGroupService;
 import org.apache.cloudstack.affinity.AffinityGroupVMMapVO;
@@ -51,6 +49,7 @@ import org.apache.cloudstack.managed.context.ManagedContextTimerTask;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
@@ -284,12 +283,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
                     plannerName = _configDao.getValue(Config.VmDeploymentPlanner.key());
                 }
             }
-            for (DeploymentPlanner plannerInList : _planners) {
-                if (plannerName.equals(plannerInList.getName())) {
-                    planner = plannerInList;
-                    break;
-                }
-            }
+            planner = getDeploymentPlannerByName(plannerName);
         }
 
         int cpu_requested = offering.getCpu() * offering.getSpeed();
@@ -450,7 +444,6 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
 
         if (planner != null && planner.canHandle(vmProfile, plan, avoids)) {
             while (true) {
-
                 if (planner instanceof DeploymentClusterPlanner) {
 
                     ExcludeList plannerAvoidInput =
@@ -502,6 +495,21 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
         return dest;
     }
 
+    @Override
+    public DeploymentPlanner getDeploymentPlannerByName(String plannerName) {
+        if (plannerName != null) {
+            for (DeploymentPlanner plannerInList : _planners) {
+                if (plannerName != null) {
+                }
+                if (plannerName.equalsIgnoreCase(plannerInList.getName())) {
+                    return plannerInList;
+                }
+            }
+        }
+
+        return null;
+    }
+
     private void checkForNonDedicatedResources(VirtualMachineProfile vmProfile, DataCenter dc, ExcludeList avoids) {
         boolean isExplicit = false;
         VirtualMachine vm = vmProfile.getVirtualMachine();
@@ -1345,7 +1353,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
 
     @DB
     @Override
-    public String finalizeReservation(final DeployDestination plannedDestination, final VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids)
+    public String finalizeReservation(final DeployDestination plannedDestination, final VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids, final DeploymentPlanner planner)
         throws InsufficientServerCapacityException, AffinityConflictException {
 
         final VirtualMachine vm = vmProfile.getVirtualMachine();
@@ -1374,6 +1382,9 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
                     VMReservationVO vmReservation =
                         new VMReservationVO(vm.getId(), plannedDestination.getDataCenter().getId(), plannedDestination.getPod().getId(), plannedDestination.getCluster()
                             .getId(), plannedDestination.getHost().getId());
+                    if (planner != null) {
+                        vmReservation.setDeploymentPlanner(planner.getName());
+                    }
                     Map<Long, Long> volumeReservationMap = new HashMap<Long, Long>();
 
                     if (vm.getHypervisorType() != HypervisorType.BareMetal) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/server/src/com/cloud/deploy/FirstFitPlanner.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/deploy/FirstFitPlanner.java b/server/src/com/cloud/deploy/FirstFitPlanner.java
index 1c79a67..c09fa7a 100755
--- a/server/src/com/cloud/deploy/FirstFitPlanner.java
+++ b/server/src/com/cloud/deploy/FirstFitPlanner.java
@@ -25,13 +25,12 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.log4j.Logger;
 
 import com.cloud.capacity.Capacity;
 import com.cloud.capacity.CapacityManager;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
index 2fa3821..61b7f4b 100644
--- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
+++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
@@ -53,7 +53,6 @@ import org.apache.cloudstack.api.command.user.vm.DeployVMCmd;
 import org.apache.cloudstack.config.ApiServiceConfiguration;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-
 import org.apache.log4j.Logger;
 
 import com.cloud.api.ApiDBUtils;
@@ -120,7 +119,6 @@ import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.UserVmManager;
 import com.cloud.vm.UserVmService;
-
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 
@@ -1371,7 +1369,7 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
     private boolean startNewVM(final long vmId) {
         try {
             CallContext.current().setEventDetails("Vm Id: " + vmId);
-            _userVmManager.startVirtualMachine(vmId, null, null);
+            _userVmManager.startVirtualMachine(vmId, null, null, null);
         } catch (final ResourceUnavailableException ex) {
             s_logger.warn("Exception: ", ex);
             throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/server/src/com/cloud/vm/UserVmManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManager.java b/server/src/com/cloud/vm/UserVmManager.java
index 7371692..11b110f 100755
--- a/server/src/com/cloud/vm/UserVmManager.java
+++ b/server/src/com/cloud/vm/UserVmManager.java
@@ -108,7 +108,7 @@ public interface UserVmManager extends UserVmService {
     Pair<List<UserVmJoinVO>, Integer> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List<Long> permittedAccounts, boolean listAll,
         ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags);
 
-    Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long hostId, Map<VirtualMachineProfile.Param, Object> additionalParams)
+    Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long hostId, Map<VirtualMachineProfile.Param, Object> additionalParams, String deploymentPlannerToUse)
         throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
 
     boolean upgradeVirtualMachine(Long id, Long serviceOfferingId, Map<String, String> customParameters) throws ResourceUnavailableException,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index be00aa8..0751d27 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -115,7 +115,9 @@ import com.cloud.dc.dao.DedicatedResourceDao;
 import com.cloud.dc.dao.HostPodDao;
 import com.cloud.deploy.DataCenterDeployment;
 import com.cloud.deploy.DeployDestination;
+import com.cloud.deploy.DeploymentPlanner;
 import com.cloud.deploy.DeploymentPlanner.ExcludeList;
+import com.cloud.deploy.DeploymentPlanningManager;
 import com.cloud.deploy.PlannerHostReservationVO;
 import com.cloud.deploy.dao.PlannerHostReservationDao;
 import com.cloud.domain.DomainVO;
@@ -396,7 +398,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     protected ProjectManager _projectMgr;
     @Inject
     protected ResourceManager _resourceMgr;
-
     @Inject
     protected NetworkServiceMapDao _ntwkSrvcDao;
     @Inject
@@ -415,17 +416,14 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     protected GuestOSCategoryDao _guestOSCategoryDao;
     @Inject
     UsageEventDao _usageEventDao;
-
     @Inject
     SecondaryStorageVmDao _secondaryDao;
     @Inject
     VmDiskStatisticsDao _vmDiskStatsDao;
-
     @Inject
     protected VMSnapshotDao _vmSnapshotDao;
     @Inject
     protected VMSnapshotManager _vmSnapshotMgr;
-
     @Inject
     AffinityGroupVMMapDao _affinityGroupVMMapDao;
     @Inject
@@ -450,6 +448,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     UserVmDetailsDao _uservmDetailsDao;
     @Inject
     UUIDManager _uuidMgr;
+    @Inject
+    DeploymentPlanningManager _planningMgr;
 
     protected ScheduledExecutorService _executor = null;
     protected int _expungeInterval;
@@ -1975,7 +1975,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_VM_START, eventDescription = "starting Vm", async = true)
     public UserVm startVirtualMachine(StartVMCmd cmd) throws ExecutionException, ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
-        return startVirtualMachine(cmd.getId(), cmd.getHostId(), null).first();
+        return startVirtualMachine(cmd.getId(), cmd.getHostId(), null, cmd.getDeploymentPlanner()).first();
     }
 
     @Override
@@ -2974,10 +2974,10 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_VM_CREATE, eventDescription = "starting Vm", async = true)
     public UserVm startVirtualMachine(DeployVMCmd cmd) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException {
-        return startVirtualMachine(cmd, null);
+        return startVirtualMachine(cmd, null, cmd.getDeploymentPlanner());
     }
 
-    protected UserVm startVirtualMachine(DeployVMCmd cmd, Map<VirtualMachineProfile.Param, Object> additonalParams) throws ResourceUnavailableException,
+    protected UserVm startVirtualMachine(DeployVMCmd cmd, Map<VirtualMachineProfile.Param, Object> additonalParams, String deploymentPlannerToUse) throws ResourceUnavailableException,
             InsufficientCapacityException, ConcurrentOperationException {
 
         long vmId = cmd.getEntityId();
@@ -2986,7 +2986,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
 
         Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> vmParamPair = null;
         try {
-            vmParamPair = startVirtualMachine(vmId, hostId, additonalParams);
+            vmParamPair = startVirtualMachine(vmId, hostId, additonalParams, deploymentPlannerToUse);
             vm = vmParamPair.first();
         } finally {
             updateVmStateForFailedVmCreation(vm.getId(), hostId);
@@ -3232,7 +3232,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     }
 
     @Override
-    public Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long hostId, Map<VirtualMachineProfile.Param, Object> additionalParams)
+    public Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long hostId, Map<VirtualMachineProfile.Param, Object> additionalParams, String deploymentPlannerToUse)
             throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
         // Input validation
         Account callerAccount = CallContext.current().getCallingAccount();
@@ -3324,18 +3324,17 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
 
         VirtualMachineEntity vmEntity = _orchSrvc.getVirtualMachine(vm.getUuid());
 
-        // Get serviceOffering for Virtual Machine
-        ServiceOfferingVO offering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId());
-        String plannerName = offering.getDeploymentPlanner();
-        if (plannerName == null) {
-            if (vm.getHypervisorType() == HypervisorType.BareMetal) {
-                plannerName = "BareMetalPlanner";
-            } else {
-                plannerName = _configDao.getValue(Config.VmDeploymentPlanner.key());
+        DeploymentPlanner planner = null;
+        if (deploymentPlannerToUse != null) {
+            // if set to null, the deployment planner would be later figured out either from global config var, or from
+            // the service offering
+            planner = _planningMgr.getDeploymentPlannerByName(deploymentPlannerToUse);
+            if (planner == null) {
+                throw new InvalidParameterValueException("Can't find a planner by name " + deploymentPlannerToUse);
             }
         }
 
-        String reservationId = vmEntity.reserve(plannerName, plan, new ExcludeList(), Long.toString(callerUser.getId()));
+        String reservationId = vmEntity.reserve(planner, plan, new ExcludeList(), Long.toString(callerUser.getId()));
         vmEntity.deploy(reservationId, Long.toString(callerUser.getId()), params);
 
         Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> vmParamPair = new Pair(vm, params);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/setup/db/db/schema-430to440.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-430to440.sql b/setup/db/db/schema-430to440.sql
index ab6bc98..235f357 100644
--- a/setup/db/db/schema-430to440.sql
+++ b/setup/db/db/schema-430to440.sql
@@ -621,3 +621,5 @@ UPDATE `cloud`.`guest_os_hypervisor` SET `created` = now();
 ALTER TABLE `cloud`.`guest_os` ADD COLUMN `created` datetime COMMENT 'Time when Guest OS was created in system';
 ALTER TABLE `cloud`.`guest_os` ADD COLUMN `removed` datetime COMMENT 'Time when Guest OS was removed if deleted, else NULL';
 UPDATE `cloud`.`guest_os` SET `created` = now();
+
+ALTER TABLE `cloud`.`vm_reservation` ADD COLUMN `deployment_planner` varchar(40) DEFAULT NULL COMMENT 'Preferred deployment planner for the vm';


[29/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Send StopCommand(Cleanup) if out-of-band power-off VM is detected.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/53f306e8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/53f306e8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/53f306e8

Branch: refs/heads/distributedrouter
Commit: 53f306e8e20023eace74c3644a20be4066ca7ca9
Parents: 8ff9460
Author: Kelven Yang <ke...@gmail.com>
Authored: Tue Mar 4 15:09:07 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Mar 13 16:59:56 2014 -0700

----------------------------------------------------------------------
 .../src/com/cloud/vm/VirtualMachineManagerImpl.java           | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/53f306e8/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 2cbde35..0ca0d30 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -4221,6 +4221,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         case Stopped:
         case Migrating:
             s_logger.info("VM " + vm.getInstanceName() + " is at " + vm.getState() + " and we received a power-off report while there is no pending jobs on it");
+            VirtualMachineGuru vmGuru = getVmGuru(vm);
+            VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
+            sendStop(vmGuru, profile, true);
+
             try {
                 stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOffReport, null);
             } catch (NoTransitionException e) {
@@ -4233,9 +4237,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
             s_logger.info("VM " + vm.getInstanceName() + " is sync-ed to at Stopped state according to power-off report from hypervisor");
 
-            VirtualMachineGuru vmGuru = getVmGuru(vm);
-            VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
-            sendStop(vmGuru, profile, true);
             break;
 
         case Destroyed:


[15/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Merge branch 'master' into rbac.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/99bdc8d8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/99bdc8d8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/99bdc8d8

Branch: refs/heads/distributedrouter
Commit: 99bdc8d8752a37f629bd86b842312e420b87b0af
Parents: f2d4b4d 5779292
Author: Min Chen <mi...@citrix.com>
Authored: Thu Mar 13 11:05:03 2014 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Thu Mar 13 11:05:03 2014 -0700

----------------------------------------------------------------------
 agent/conf/agent.properties                     |  11 +
 .../SYSCONFDIR/rc.d/init.d/cloud-agent.in       |   2 +-
 .../SYSCONFDIR/rc.d/init.d/cloud-agent.in       |   2 +-
 .../sles/SYSCONFDIR/init.d/cloud-agent.in       |   2 +-
 .../rhel/SYSCONFDIR/rc.d/init.d/cloud-agent.in  |   2 +-
 .../sles/SYSCONFDIR/init.d/cloud-agent.in       |   2 +-
 .../cloud/agent/api/HostVmStateReportEntry.java |  10 +-
 api/src/com/cloud/agent/api/to/GPUDeviceTO.java |  56 ++
 .../cloud/agent/api/to/VirtualMachineTO.java    |   9 +
 api/src/com/cloud/event/EventTypes.java         |  42 +-
 api/src/com/cloud/gpu/GPU.java                  |  49 ++
 .../VpcVirtualNetworkApplianceService.java      |   8 +-
 .../element/AggregatedCommandExecutor.java      |  28 +
 .../com/cloud/offering/DiskOfferingInfo.java    |  65 ++
 api/src/com/cloud/server/ManagementService.java |  77 ++-
 api/src/com/cloud/storage/GuestOS.java          |   6 +
 .../com/cloud/storage/GuestOSHypervisor.java    |  10 +
 api/src/com/cloud/storage/VolumeApiService.java |   2 +
 api/src/com/cloud/user/AccountService.java      |   2 +
 api/src/com/cloud/vm/UserVmService.java         |   6 +
 .../cloudstack/api/ApiCommandJobType.java       |   6 +-
 .../org/apache/cloudstack/api/ApiConstants.java |  22 +-
 .../org/apache/cloudstack/api/BaseAsyncCmd.java |  36 -
 .../apache/cloudstack/api/BaseAsyncVMCmd.java   |  30 +
 .../cloudstack/api/BaseAsyncVolumeCmd.java      |  30 +
 api/src/org/apache/cloudstack/api/BaseCmd.java  | 239 +++----
 .../org/apache/cloudstack/api/BaseListCmd.java  |  30 +-
 .../org/apache/cloudstack/api/Parameter.java    |   2 -
 .../cloudstack/api/ResponseGenerator.java       |   4 +
 .../api/command/admin/guest/AddGuestOsCmd.java  | 136 ++++
 .../admin/guest/AddGuestOsMappingCmd.java       | 146 ++++
 .../admin/guest/ListGuestOsMappingCmd.java      | 101 +++
 .../command/admin/guest/RemoveGuestOsCmd.java   |  98 +++
 .../admin/guest/RemoveGuestOsMappingCmd.java    |  98 +++
 .../command/admin/guest/UpdateGuestOsCmd.java   | 104 +++
 .../admin/guest/UpdateGuestOsMappingCmd.java    | 102 +++
 .../admin/offering/CreateDiskOfferingCmd.java   |   6 +-
 .../offering/CreateServiceOfferingCmd.java      |  54 +-
 .../api/command/admin/user/CreateUserCmd.java   |   3 +-
 .../affinitygroup/DeleteAffinityGroupCmd.java   |   1 +
 .../user/autoscale/CreateConditionCmd.java      |   2 +-
 .../api/command/user/iso/ListIsosCmd.java       |   3 +-
 .../api/command/user/iso/RegisterIsoCmd.java    |   5 +-
 .../command/user/network/CreateNetworkCmd.java  |   2 +-
 .../gslb/CreateGlobalLoadBalancerRuleCmd.java   |   5 +-
 .../user/resource/ListResourceLimitsCmd.java    |   5 +-
 .../user/resource/UpdateResourceCountCmd.java   |   5 +-
 .../user/resource/UpdateResourceLimitCmd.java   |   7 +-
 .../AuthorizeSecurityGroupEgressCmd.java        |   2 +-
 .../AuthorizeSecurityGroupIngressCmd.java       |   2 +-
 .../securitygroup/DeleteSecurityGroupCmd.java   |   2 +-
 .../command/user/ssh/CreateSSHKeyPairCmd.java   |   2 +-
 .../command/user/ssh/DeleteSSHKeyPairCmd.java   |   1 +
 .../command/user/ssh/RegisterSSHKeyPairCmd.java |   2 +-
 .../command/user/template/ListTemplatesCmd.java |   3 +-
 .../user/template/RegisterTemplateCmd.java      |   5 +-
 .../api/command/user/vm/DeployVMCmd.java        |  62 +-
 .../api/command/user/vm/DestroyVMCmd.java       |   4 +-
 .../api/command/user/vm/ListVMsCmd.java         |   8 +
 .../api/command/user/vm/RebootVMCmd.java        |   4 +-
 .../api/command/user/vm/ResetVMPasswordCmd.java |   4 +-
 .../api/command/user/vm/ResetVMSSHKeyCmd.java   |   4 +-
 .../api/command/user/vm/RestoreVMCmd.java       |  10 +-
 .../api/command/user/vm/ScaleVMCmd.java         |   4 +-
 .../api/command/user/vm/StartVMCmd.java         |   4 +-
 .../api/command/user/vm/StopVMCmd.java          |   4 +-
 .../api/command/user/vm/UpgradeVMCmd.java       |   5 +
 .../command/user/vmgroup/CreateVMGroupCmd.java  |   2 +-
 .../command/user/volume/AttachVolumeCmd.java    |  15 +-
 .../command/user/volume/CreateVolumeCmd.java    |  14 +-
 .../command/user/volume/DeleteVolumeCmd.java    |   5 +
 .../command/user/volume/DetachVolumeCmd.java    |   6 +-
 .../command/user/volume/ExtractVolumeCmd.java   |   4 +-
 .../command/user/volume/MigrateVolumeCmd.java   |  10 +-
 .../command/user/volume/ResizeVolumeCmd.java    |  10 +-
 .../command/user/volume/UpdateVolumeCmd.java    |   5 +
 .../command/user/volume/UploadVolumeCmd.java    |   2 +-
 .../api/command/user/vpc/CreateVPCCmd.java      |   2 +-
 .../api/command/user/vpn/AddVpnUserCmd.java     |   2 +-
 .../user/vpn/CreateVpnCustomerGatewayCmd.java   |   2 +-
 .../api/command/user/vpn/RemoveVpnUserCmd.java  |   2 +-
 .../command/user/vpn/ResetVpnConnectionCmd.java |   2 +-
 .../user/vpn/UpdateVpnCustomerGatewayCmd.java   |   2 +-
 .../api/response/DiskOfferingResponse.java      |  12 +
 .../cloudstack/api/response/GpuResponse.java    |  46 ++
 .../api/response/GuestOsMappingResponse.java    | 102 +++
 .../cloudstack/api/response/HostResponse.java   |   8 +
 .../api/response/ServiceOfferingResponse.java   |  48 ++
 .../cloudstack/api/response/UserVmResponse.java |  10 +
 .../cloudstack/api/response/VgpuResponse.java   |  52 ++
 .../org/apache/cloudstack/api/BaseCmdTest.java  |  69 ++
 .../classes/resources/messages.properties       | 209 ++++++
 .../classes/resources/messages_ja_JP.properties | 272 +++++++-
 .../classes/resources/messages_zh_CN.properties | 572 +++++++++++-----
 client/tomcatconf/commands.properties.in        |   9 +
 .../com/cloud/agent/api/ClusterSyncAnswer.java  |  10 +-
 .../agent/api/ClusterVMMetaDataSyncAnswer.java  |  52 ++
 .../agent/api/ClusterVMMetaDataSyncCommand.java |  47 ++
 .../com/cloud/agent/api/GetGPUStatsAnswer.java  |  36 +
 .../com/cloud/agent/api/GetGPUStatsCommand.java |  47 ++
 .../cloud/agent/api/StartupRoutingCommand.java  |  17 +-
 core/src/com/cloud/agent/api/StopCommand.java   |   9 +
 .../api/routing/AggregationControlCommand.java  |  44 ++
 .../virtualnetwork/VirtualRoutingResource.java  | 210 ++++--
 core/src/com/cloud/info/ConsoleProxyInfo.java   |  19 +-
 .../storage/to/PrimaryDataStoreTO.java          |  18 +
 .../VirtualRoutingResourceTest.java             | 467 ++++++++++---
 .../src/com/cloud/vm/VirtualMachineManager.java |   4 +-
 .../service/VolumeOrchestrationService.java     |   2 +-
 .../api/storage/DataMotionService.java          |   2 +
 .../api/storage/DataMotionStrategy.java         |   2 +
 .../api/storage/PrimaryDataStoreInfo.java       |  18 +
 .../subsystem/api/storage/VolumeService.java    |   6 +-
 .../src/com/cloud/resource/ResourceManager.java |  41 ++
 .../cloud/agent/manager/DirectAgentAttache.java |   2 -
 .../com/cloud/vm/VirtualMachineManagerImpl.java | 123 ++--
 .../engine/orchestration/CloudOrchestrator.java |  40 +-
 .../orchestration/NetworkOrchestrator.java      |  33 +-
 .../orchestration/VolumeOrchestrator.java       |  29 +-
 .../spring-engine-schema-core-daos-context.xml  |   2 +
 engine/schema/src/com/cloud/event/EventVO.java  |  12 +-
 .../src/com/cloud/gpu/HostGpuGroupsVO.java      |  70 ++
 .../schema/src/com/cloud/gpu/VGPUTypesVO.java   |  82 +++
 .../src/com/cloud/gpu/dao/HostGpuGroupsDao.java |  60 ++
 .../com/cloud/gpu/dao/HostGpuGroupsDaoImpl.java |  94 +++
 .../src/com/cloud/gpu/dao/VGPUTypesDao.java     |  48 ++
 .../src/com/cloud/gpu/dao/VGPUTypesDaoImpl.java |  95 +++
 engine/schema/src/com/cloud/host/HostVO.java    |  13 +
 .../src/com/cloud/host/dao/HostDaoImpl.java     |  18 +
 .../com/cloud/network/vpc/NetworkACLItemVO.java |  14 +-
 .../cloud/service/ServiceOfferingDetailsVO.java |   4 +
 .../com/cloud/storage/GuestOSHypervisorVO.java  |  62 +-
 .../schema/src/com/cloud/storage/GuestOSVO.java |  25 +-
 .../cloud/storage/dao/GuestOSHypervisorDao.java |   3 +
 .../storage/dao/GuestOSHypervisorDaoImpl.java   |  27 +
 .../cloud/upgrade/dao/DatabaseAccessObject.java |  99 +++
 .../com/cloud/upgrade/dao/DbUpgradeUtils.java   |  76 +--
 .../datastore/db/SnapshotDataStoreVO.java       |  11 +-
 .../datastore/db/TemplateDataStoreVO.java       |  11 +-
 .../storage/datastore/db/VolumeDataStoreVO.java |  11 +-
 .../upgrade/dao/DatabaseAccessObjectTest.java   | 463 +++++++++++++
 .../cloud/upgrade/dao/DbUpgradeUtilsTest.java   | 162 +++++
 .../motion/AncientDataMotionStrategy.java       |  25 +-
 .../storage/motion/DataMotionServiceImpl.java   |   9 +-
 .../storage/image/TemplateServiceImpl.java      |  13 +-
 .../storage/image/store/TemplateObject.java     |  15 +
 .../storage/test/MockStorageMotionStrategy.java |   5 +
 .../storage/datastore/PrimaryDataStoreImpl.java |  20 +-
 .../datastore/provider/DefaultHostListener.java |   2 +-
 .../storage/volume/VolumeServiceImpl.java       | 156 ++++-
 packaging/centos63/cloud-agent.rc               |   2 +-
 packaging/centos63/cloud-ipallocator.rc         |   2 +-
 .../networkservice/BareMetalResourceBase.java   |   3 +-
 .../hypervisor/hyperv/guru/HypervGuru.java      |   9 +-
 .../resource/HypervDirectConnectResource.java   | 218 +++++-
 .../kvm/resource/LibvirtComputingResource.java  | 110 ++-
 .../cloud/ovm/hypervisor/OvmResourceBase.java   |   2 +-
 .../cloud/resource/AgentRoutingResource.java    |   2 +-
 .../motion/SimulatorDataMotionStrategy.java     |   5 +
 .../vmware/resource/VmwareResource.java         |   2 +-
 .../network/element/CiscoNexusVSMElement.java   |   5 +-
 .../motion/VmwareStorageMotionStrategy.java     |   5 +
 .../src/com/cloud/hypervisor/XenServerGuru.java |  33 +-
 .../xen/resource/CitrixResourceBase.java        | 256 +++++--
 .../xen/resource/XenServer610Resource.java      |   8 -
 .../xen/resource/XenServerPoolVms.java          |  41 +-
 .../xen/resource/XenServerStorageProcessor.java | 126 +++-
 .../xenserver/XenServerResourceNewBase.java     |  20 +-
 .../motion/XenServerStorageMotionStrategy.java  |   5 +
 .../api/command/CreateServiceInstanceCmd.java   |   2 +-
 .../contrail/management/MockAccountManager.java |   5 +
 .../driver/CloudStackImageStoreDriverImpl.java  |  12 +-
 .../apache/cloudstack/ldap/LdapUserManager.java |   8 +-
 .../cloudstack/ldap/LdapUserManagerSpec.groovy  | 263 ++++----
 .../SYSCONFDIR/rc.d/init.d/cloud-ipallocator.in |   2 +-
 .../SYSCONFDIR/rc.d/init.d/cloud-ipallocator.in |   2 +-
 .../SYSCONFDIR/init.d/cloud-ipallocator.in      |   2 +-
 .../SYSCONFDIR/rc.d/init.d/cloud-ipallocator.in |   2 +-
 .../sles/SYSCONFDIR/init.d/cloud-ipallocator.in |   2 +-
 .../SYSCONFDIR/init.d/cloud-ipallocator.in      |   2 +-
 .../vm/hypervisor/xenserver/createipAlias.sh    |  25 -
 .../vm/hypervisor/xenserver/deleteipAlias.sh    |  24 -
 scripts/vm/hypervisor/xenserver/vmops           |  16 -
 scripts/vm/hypervisor/xenserver/xcposs/patch    |  12 -
 scripts/vm/hypervisor/xenserver/xcpserver/patch |   9 -
 .../vm/hypervisor/xenserver/xenserver56/patch   |   7 -
 .../hypervisor/xenserver/xenserver56fp1/patch   |   7 -
 .../vm/hypervisor/xenserver/xenserver60/patch   |   7 -
 .../vm/hypervisor/xenserver/xenserver62/patch   |   7 -
 .../core/spring-server-core-misc-context.xml    |  12 +
 .../allocator/impl/FirstFitAllocator.java       |  17 +-
 server/src/com/cloud/api/ApiDBUtils.java        |  30 +
 server/src/com/cloud/api/ApiDispatcher.java     | 481 ++------------
 server/src/com/cloud/api/ApiResponseHelper.java |  26 +-
 server/src/com/cloud/api/ApiServer.java         | 413 ++++++------
 server/src/com/cloud/api/ApiServlet.java        | 133 ++--
 .../api/dispatch/CommandCreationWorker.java     |  56 ++
 .../com/cloud/api/dispatch/DispatchChain.java   |  40 ++
 .../api/dispatch/DispatchChainFactory.java      |  72 ++
 .../com/cloud/api/dispatch/DispatchTask.java    |  58 ++
 .../com/cloud/api/dispatch/DispatchWorker.java  |  30 +
 .../dispatch/ParamGenericValidationWorker.java  | 103 +++
 .../cloud/api/dispatch/ParamProcessWorker.java  | 428 ++++++++++++
 .../cloud/api/dispatch/ParamUnpackWorker.java   | 114 ++++
 .../dispatch/SpecificCmdValidationWorker.java   |  34 +
 .../com/cloud/api/query/QueryManagerImpl.java   |  22 +-
 .../api/query/dao/DiskOfferingJoinDaoImpl.java  |   1 +
 .../cloud/api/query/dao/HostJoinDaoImpl.java    |  25 +
 .../query/dao/ServiceOfferingJoinDaoImpl.java   |   4 +
 .../api/query/dao/TemplateJoinDaoImpl.java      |   3 +-
 .../cloud/api/query/dao/UserVmJoinDaoImpl.java  |   6 +
 .../cloud/api/query/vo/DiskOfferingJoinVO.java  |   7 +-
 .../src/com/cloud/api/query/vo/EventJoinVO.java |   8 +-
 .../api/query/vo/ServiceOfferingJoinVO.java     |  28 +
 server/src/com/cloud/configuration/Config.java  |   4 +-
 .../configuration/ConfigurationManagerImpl.java | 104 ++-
 .../consoleproxy/ConsoleProxyManagerImpl.java   |  11 +-
 .../deploy/DeploymentPlanningManagerImpl.java   |  12 +
 .../src/com/cloud/event/ActionEventUtils.java   |  18 +-
 .../cloud/hypervisor/HypervisorGuruBase.java    |  15 +
 .../com/cloud/network/IpAddressManagerImpl.java |   4 +-
 .../src/com/cloud/network/NetworkModelImpl.java |  14 +-
 .../com/cloud/network/NetworkServiceImpl.java   |   5 +-
 .../cloud/network/NetworkUsageManagerImpl.java  |   4 +
 .../cloud/network/as/AutoScaleManagerImpl.java  |   7 +-
 .../network/element/VirtualRouterElement.java   |  71 +-
 .../element/VpcVirtualRouterElement.java        |  14 +-
 .../router/VirtualNetworkApplianceManager.java  |  16 +-
 .../VirtualNetworkApplianceManagerImpl.java     | 129 ++--
 .../VpcVirtualNetworkApplianceManagerImpl.java  |  76 ++-
 .../com/cloud/network/vpc/VpcManagerImpl.java   |   5 +-
 .../com/cloud/resource/ResourceManagerImpl.java |  97 ++-
 .../src/com/cloud/server/ManagementServer.java  |   3 +
 .../com/cloud/server/ManagementServerImpl.java  | 257 ++++++-
 server/src/com/cloud/server/StatsCollector.java |  21 +
 .../com/cloud/storage/VolumeApiServiceImpl.java |  17 +
 .../storage/snapshot/SnapshotSchedulerImpl.java | 105 +--
 .../src/com/cloud/user/AccountManagerImpl.java  |  46 ++
 server/src/com/cloud/vm/UserVmManagerImpl.java  |  21 +-
 .../test/com/cloud/api/ApiDispatcherTest.java   | 106 ---
 .../api/dispatch/CommandCreationWorkerTest.java |  48 ++
 .../api/dispatch/DispatchChainFactoryTest.java  |  55 ++
 .../ParamGenericValidationWorkerTest.java       | 195 ++++++
 .../api/dispatch/ParamProcessWorkerTest.java    | 107 +++
 .../SpecificCmdValidationWorkerTest.java        |  48 ++
 .../cloud/network/vpc/VpcManagerImplTest.java   |  66 ++
 .../cloud/resource/MockResourceManagerImpl.java |  31 +
 .../com/cloud/user/MockAccountManagerImpl.java  |   5 +
 .../vm/DeploymentPlanningManagerImplTest.java   |  12 +
 .../MockVpcVirtualNetworkApplianceManager.java  |  39 +-
 server/test/resources/createNetworkOffering.xml |   4 +-
 .../SecondaryStorageManagerImpl.java            |   7 +
 setup/db/db/schema-421to430.sql                 |   4 +
 setup/db/db/schema-430to440.sql                 |  37 +-
 systemvm/conf/consoleproxy.properties           |   2 +-
 .../rc.d/init.d/cloud-console-proxy.in          |   2 +-
 .../rc.d/init.d/cloud-console-proxy.in          |   2 +-
 .../rc.d/init.d/cloud-console-proxy.in          |   2 +-
 .../SYSCONFDIR/init.d/cloud-console-proxy.in    |   2 +-
 .../debian/config/etc/init.d/cloud-early-config |  18 +-
 .../debian/config/opt/cloud/bin/vr_cfg.sh       |  96 +++
 .../component/test_cpu_domain_limits.py         |  11 +-
 test/integration/component/test_cpu_limits.py   |  15 +-
 .../component/test_cpu_project_limits.py        |   7 +-
 .../component/test_dynamic_compute_offering.py  | 409 ++++++++++++
 .../integration/component/test_memory_limits.py |  15 +-
 .../component/test_mm_domain_limits.py          |   7 +-
 .../component/test_mm_project_limits.py         |   7 +-
 test/integration/component/test_routers.py      |  28 +-
 .../component/test_vpc_vm_life_cycle.py         | 108 +--
 .../smoke/test_deploy_vgpu_enabled_vm.py        | 227 +++++++
 test/integration/smoke/test_deploy_vm.py        |  52 +-
 tools/marvin/marvin/codes.py                    |   1 +
 tools/marvin/marvin/configGenerator.py          |   5 +-
 tools/marvin/marvin/integration/lib/base.py     |  32 +-
 tools/marvin/marvin/integration/lib/common.py   |  39 +-
 tools/marvin/marvin/integration/lib/utils.py    |   3 +-
 .../marvin/sandbox/advanced/advanced_env.py     |  23 +-
 .../marvin/sandbox/advancedsg/advancedsg_env.py |  18 +-
 tools/marvin/marvin/sandbox/basic/basic_env.py  |  16 +-
 .../sandbox/demo/simulator/simulator_setup.py   |  16 +-
 tools/ngui/static/js/app/accounts/accounts.js   |  16 +-
 tools/ngui/static/js/app/storage/storage.js     |   2 +-
 ui/css/cloudstack3.css                          |  42 +-
 ui/dictionary.jsp                               | 220 +++++-
 ui/images/sprites.png                           | Bin 212515 -> 211543 bytes
 ui/index.jsp                                    |  11 +
 .../vnmcNetworkProvider/vnmcNetworkProvider.js  |  50 +-
 ui/scripts/configuration.js                     | 350 ++++++++--
 ui/scripts/installWizard.js                     |   6 +-
 ui/scripts/instanceWizard.js                    |  16 +-
 ui/scripts/instances.js                         |  24 +-
 ui/scripts/network.js                           |  62 +-
 ui/scripts/sharedFunctions.js                   |  28 +-
 ui/scripts/storage.js                           |   6 +-
 ui/scripts/system.js                            | 662 ++++++++++---------
 ui/scripts/templates.js                         |   6 +-
 ui/scripts/ui-custom/instanceWizard.js          |   8 +
 ui/scripts/ui-custom/zoneChart.js               |  16 +-
 ui/scripts/ui/core.js                           |   2 +-
 ui/scripts/ui/dialog.js                         |   2 +-
 ui/scripts/ui/widgets/multiEdit.js              |   2 +-
 ui/scripts/ui/widgets/tagger.js                 |   4 +-
 ui/scripts/vpc.js                               |  16 +-
 ui/scripts/zoneWizard.js                        |  12 +-
 utils/src/com/cloud/utils/ReflectUtil.java      |  13 +
 306 files changed, 11294 insertions(+), 2990 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/com/cloud/storage/VolumeApiService.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/com/cloud/user/AccountService.java
----------------------------------------------------------------------
diff --cc api/src/com/cloud/user/AccountService.java
index 37f6105,de0b470..85c71ca
--- a/api/src/com/cloud/user/AccountService.java
+++ b/api/src/com/cloud/user/AccountService.java
@@@ -108,9 -103,6 +108,11 @@@ public interface AccountService 
  
      void checkAccess(Account account, AccessType accessType, boolean sameOwner, ControlledEntity... entities) throws PermissionDeniedException;
  
 -    Long finalyzeAccountId(String accountName, Long domainId, Long projectId, boolean enabledOnly);
 +    void checkAccess(Account account, AccessType accessType, boolean sameOwner, String apiName,
 +            ControlledEntity... entities) throws PermissionDeniedException;
  
 +    //TO be implemented, to check accessibility for an entity owned by domain
 +    void checkAccess(Account account, AccessType accessType, boolean sameOwner, PartOf... entities) throws PermissionDeniedException;
++
++    Long finalyzeAccountId(String accountName, Long domainId, Long projectId, boolean enabledOnly);
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/ApiConstants.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/ApiConstants.java
index 62191fc,089affb..239b8cd
--- a/api/src/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/org/apache/cloudstack/api/ApiConstants.java
@@@ -568,8 -583,12 +583,13 @@@ public class ApiConstants 
      public static final String PASSIVE = "passive";
      public static final String VERSION = "version";
      public static final String START = "start";
+     public static final String GPUGROUP = "gpugroup";
+     public static final String GPUGROUPNAME = "gpugroupname";
+     public static final String VGPU = "vgpu";
+     public static final String VGPUTYPE = "vgputype";
+     public static final String REMAININGCAPACITY = "remainingcapacity";
  
 +
      public enum HostDetails {
          all, capacity, events, stats, min;
      }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/BaseCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/BaseCmd.java
index 7c720c9,937ccc2..f6f21ae
--- a/api/src/org/apache/cloudstack/api/BaseCmd.java
+++ b/api/src/org/apache/cloudstack/api/BaseCmd.java
@@@ -26,22 -29,21 +29,22 @@@ import java.util.regex.Pattern
  
  import javax.inject.Inject;
  
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.acl.RoleType;
  import org.apache.cloudstack.affinity.AffinityGroupService;
  import org.apache.cloudstack.alert.AlertService;
+ import org.apache.cloudstack.context.CallContext;
  import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
  import org.apache.cloudstack.network.lb.ApplicationLoadBalancerService;
  import org.apache.cloudstack.network.lb.InternalLoadBalancerVMService;
  import org.apache.cloudstack.query.QueryService;
  import org.apache.cloudstack.usage.UsageService;
--import org.apache.log4j.Logger;
  
  import com.cloud.configuration.ConfigurationService;
- import com.cloud.domain.Domain;
  import com.cloud.exception.ConcurrentOperationException;
  import com.cloud.exception.InsufficientCapacityException;
- import com.cloud.exception.InvalidParameterValueException;
  import com.cloud.exception.NetworkRuleConflictException;
- import com.cloud.exception.PermissionDeniedException;
  import com.cloud.exception.ResourceAllocationException;
  import com.cloud.exception.ResourceUnavailableException;
  import com.cloud.network.NetworkModel;
@@@ -264,92 -279,68 +280,68 @@@ public abstract class BaseCmd 
          return formattedString;
      }
  
-     // FIXME: move this to a utils method so that maps can be unpacked and integer/long values can be appropriately cast
-     @SuppressWarnings({"unchecked", "rawtypes"})
-     public Map<String, Object> unpackParams(Map<String, String> params) {
-         Map<String, Object> lowercaseParams = new HashMap<String, Object>();
-         for (String key : params.keySet()) {
-             int arrayStartIndex = key.indexOf('[');
-             int arrayStartLastIndex = key.lastIndexOf('[');
-             if (arrayStartIndex != arrayStartLastIndex) {
-                 throw new ServerApiException(ApiErrorCode.MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key +
-                     "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup");
-             }
- 
-             if (arrayStartIndex > 0) {
-                 int arrayEndIndex = key.indexOf(']');
-                 int arrayEndLastIndex = key.lastIndexOf(']');
-                 if ((arrayEndIndex < arrayStartIndex) || (arrayEndIndex != arrayEndLastIndex)) {
-                     // malformed parameter
-                     throw new ServerApiException(ApiErrorCode.MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key +
-                         "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup");
-                 }
+     protected List<Field> getAllFieldsForClass(final Class<?> clazz) {
+         List<Field> filteredFields = fieldsForCmdClass.get(clazz);
  
-                 // Now that we have an array object, check for a field name in the case of a complex object
-                 int fieldIndex = key.indexOf('.');
-                 String fieldName = null;
-                 if (fieldIndex < arrayEndIndex) {
-                     throw new ServerApiException(ApiErrorCode.MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key +
-                         "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup");
-                 } else {
-                     fieldName = key.substring(fieldIndex + 1);
-                 }
+         // If list of fields was not cached yet
+         if (filteredFields == null) {
+             final List<Field> allFields = ReflectUtil.getAllFieldsForClass(this.getClass(), BaseCmd.class);
+             filteredFields = new ArrayList<Field>();
  
-                 // parse the parameter name as the text before the first '[' character
-                 String paramName = key.substring(0, arrayStartIndex);
-                 paramName = paramName.toLowerCase();
- 
-                 Map<Integer, Map> mapArray = null;
-                 Map<String, Object> mapValue = null;
-                 String indexStr = key.substring(arrayStartIndex + 1, arrayEndIndex);
-                 int index = 0;
-                 boolean parsedIndex = false;
-                 try {
-                     if (indexStr != null) {
-                         index = Integer.parseInt(indexStr);
-                         parsedIndex = true;
+             for (final Field field : allFields) {
+                 final Parameter parameterAnnotation = field.getAnnotation(Parameter.class);
+                 if ((parameterAnnotation != null) && parameterAnnotation.expose()) {
+                     filteredFields.add(field);
 +                    }
-                 } catch (NumberFormatException nfe) {
-                     s_logger.warn("Invalid parameter " + key + " received, unable to parse object array, returning an error.");
                  }
 -            }
  
-                 if (!parsedIndex) {
-                     throw new ServerApiException(ApiErrorCode.MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key +
-                         "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup");
+             // Cache the prepared list for future use
+             fieldsForCmdClass.put(clazz, filteredFields);
 -        }
++                    }
+         return filteredFields;
 -    }
 +                }
  
-                 Object value = lowercaseParams.get(paramName);
-                 if (value == null) {
-                     // for now, assume object array with sub fields
-                     mapArray = new HashMap<Integer, Map>();
-                     mapValue = new HashMap<String, Object>();
-                     mapArray.put(Integer.valueOf(index), mapValue);
-                 } else if (value instanceof Map) {
-                     mapArray = (HashMap)value;
-                     mapValue = mapArray.get(Integer.valueOf(index));
-                     if (mapValue == null) {
-                         mapValue = new HashMap<String, Object>();
-                         mapArray.put(Integer.valueOf(index), mapValue);
+     /**
+      * This method doesn't return all the @{link Parameter}, but only the ones exposed
+      * and allowed for current @{link RoleType}. This method will get the fields for a given
+      * Cmd class only once and never again, so in case of a dynamic update the result would
+      * be obsolete (this might be a plugin update. It is agreed upon that we will not do
+      * upgrades dynamically but in case we come back on that decision we need to revisit this)
+      *
+      * @return
+      */
+     public List<Field> getParamFields() {
+         final List<Field> allFields = getAllFieldsForClass(this.getClass());
+         final List<Field> validFields = new ArrayList<Field>();
+         final Account caller = CallContext.current().getCallingAccount();
+ 
+         for (final Field field : allFields) {
+             final Parameter parameterAnnotation = field.getAnnotation(Parameter.class);
+ 
+             //TODO: Annotate @Validate on API Cmd classes, FIXME how to process Validate
+             final RoleType[] allowedRoles = parameterAnnotation.authorized();
+             boolean roleIsAllowed = true;
+             if (allowedRoles.length > 0) {
+                 roleIsAllowed = false;
+                 for (final RoleType allowedRole : allowedRoles) {
+                     if (allowedRole.getValue() == caller.getType()) {
+                         roleIsAllowed = true;
+                         break;
                      }
                  }
+             }
  
-                 // we are ready to store the value for a particular field into the map for this object
-                 mapValue.put(fieldName, params.get(key));
- 
-                 lowercaseParams.put(paramName, mapArray);
+             if (roleIsAllowed) {
+                 validFields.add(field);
              } else {
-                 lowercaseParams.put(key.toLowerCase(), params.get(key));
+                 s_logger.debug("Ignoring paremeter " + parameterAnnotation.name() + " as the caller is not authorized to pass it in");
              }
          }
-         return lowercaseParams;
-     }
  
-     protected long getInstanceIdFromJobSuccessResult(String result) {
-         s_logger.debug("getInstanceIdFromJobSuccessResult not overridden in subclass " + this.getClass().getName());
-         return 0;
+         return validFields;
      }
  
-     public void setFullUrlParams(Map<String, String> map) {
+     public void setFullUrlParams(final Map<String, String> map) {
          fullUrlParams = map;
      }
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/ResponseGenerator.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
index eb9145c,6a6dd25..378a826
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
@@@ -16,12 -16,7 +16,13 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.affinitygroup;
  
++
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
  import org.apache.cloudstack.affinity.AffinityGroupResponse;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/autoscale/CreateConditionCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/securitygroup/DeleteSecurityGroupCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/ssh/CreateSSHKeyPairCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/ssh/DeleteSSHKeyPairCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/ssh/DeleteSSHKeyPairCmd.java
index 19b29bd,92105c1..d0a5234
--- a/api/src/org/apache/cloudstack/api/command/user/ssh/DeleteSSHKeyPairCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/ssh/DeleteSSHKeyPairCmd.java
@@@ -16,9 -16,6 +16,10 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.ssh;
  
++
 +import org.apache.log4j.Logger;
 +
 +import org.apache.cloudstack.acl.IAMEntityType;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.BaseCmd;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/ssh/RegisterSSHKeyPairCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java
index b8ac561,e9a5213..4c3a415
--- a/api/src/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/DestroyVMCmd.java
@@@ -18,18 -18,14 +18,18 @@@ package org.apache.cloudstack.api.comma
  
  import java.util.List;
  
+ import org.apache.cloudstack.api.BaseAsyncVMCmd;
  import org.apache.log4j.Logger;
  
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.UserVmResponse;
  import org.apache.cloudstack.context.CallContext;
@@@ -40,10 -36,12 +40,10 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "destroyVirtualMachine",
 -            description = "Destroys a virtual machine. Once destroyed, only the administrator can recover it.",
 -            responseObject = UserVmResponse.class,
 +@APICommand(name = "destroyVirtualMachine", description = "Destroys a virtual machine. Once destroyed, only the administrator can recover it.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
              requestHasSensitiveInfo = false,
              responseHasSensitiveInfo = true)
- public class DestroyVMCmd extends BaseAsyncCmd {
+ public class DestroyVMCmd extends BaseAsyncVMCmd {
      public static final Logger s_logger = Logger.getLogger(DestroyVMCmd.class.getName());
  
      private static final String s_name = "destroyvirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java
index 8f04430,c547d62..0f04114
--- a/api/src/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java
@@@ -16,18 -16,14 +16,18 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vm;
  
+ import org.apache.cloudstack.api.BaseAsyncVMCmd;
  import org.apache.log4j.Logger;
  
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.UserVmResponse;
  import org.apache.cloudstack.context.CallContext;
@@@ -38,9 -34,9 +38,9 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "rebootVirtualMachine", description = "Reboots a virtual machine.", responseObject = UserVmResponse.class,
 +@APICommand(name = "rebootVirtualMachine", description = "Reboots a virtual machine.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
          requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
- public class RebootVMCmd extends BaseAsyncCmd {
+ public class RebootVMCmd extends BaseAsyncVMCmd {
      public static final Logger s_logger = Logger.getLogger(RebootVMCmd.class.getName());
      private static final String s_name = "rebootvirtualmachineresponse";
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java
index 2fd508b,461ce7f..615ef69
--- a/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMPasswordCmd.java
@@@ -16,18 -16,14 +16,18 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vm;
  
+ import org.apache.cloudstack.api.BaseAsyncVMCmd;
  import org.apache.log4j.Logger;
  
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.UserVmResponse;
  import org.apache.cloudstack.context.CallContext;
@@@ -38,11 -34,10 +38,11 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "resetPasswordForVirtualMachine", responseObject = UserVmResponse.class, description = "Resets the password for virtual machine. "
 -    + "The virtual machine must be in a \"Stopped\" state and the template must already " + "support this feature for this command to take effect. [async]",
 +@APICommand(name = "resetPasswordForVirtualMachine", responseObject=UserVmResponse.class, description="Resets the password for virtual machine. " +
 +                    "The virtual machine must be in a \"Stopped\" state and the template must already " +
 +        "support this feature for this command to take effect. [async]", responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
      requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
- public class ResetVMPasswordCmd extends BaseAsyncCmd {
+ public class ResetVMPasswordCmd extends BaseAsyncVMCmd {
      public static final Logger s_logger = Logger.getLogger(ResetVMPasswordCmd.class.getName());
  
      private static final String s_name = "resetpasswordforvirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java
index 288eed7,b7ab357..7d43853
--- a/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/ResetVMSSHKeyCmd.java
@@@ -17,18 -17,14 +17,18 @@@
  
  package org.apache.cloudstack.api.command.user.vm;
  
+ import org.apache.cloudstack.api.BaseAsyncVMCmd;
  import org.apache.log4j.Logger;
  
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.DomainResponse;
  import org.apache.cloudstack.api.response.ProjectResponse;
@@@ -41,10 -37,10 +41,10 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "resetSSHKeyForVirtualMachine", responseObject = UserVmResponse.class, description = "Resets the SSH Key for virtual machine. "
 -    + "The virtual machine must be in a \"Stopped\" state. [async]",
 +@APICommand(name = "resetSSHKeyForVirtualMachine", responseObject = UserVmResponse.class, description = "Resets the SSH Key for virtual machine. " +
 +        "The virtual machine must be in a \"Stopped\" state. [async]", responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
      requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
- public class ResetVMSSHKeyCmd extends BaseAsyncCmd {
+ public class ResetVMSSHKeyCmd extends BaseAsyncVMCmd {
  
      public static final Logger s_logger = Logger.getLogger(ResetVMSSHKeyCmd.class.getName());
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java
index 9befc67,81c40ec..0d5ef70
--- a/api/src/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/RestoreVMCmd.java
@@@ -16,17 -16,13 +16,17 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vm;
  
+ import org.apache.cloudstack.api.BaseAsyncVMCmd;
  import org.apache.log4j.Logger;
  
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.TemplateResponse;
  import org.apache.cloudstack.api.response.UserVmResponse;
@@@ -40,10 -36,13 +40,10 @@@ import com.cloud.exception.ResourceUnav
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "restoreVirtualMachine",
 -            description = "Restore a VM to original template/ISO or new template/ISO",
 -            responseObject = UserVmResponse.class,
 -            since = "3.0.0",
 +@APICommand(name = "restoreVirtualMachine", description = "Restore a VM to original template/ISO or new template/ISO", responseObject = UserVmResponse.class, since = "3.0.0", responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
              requestHasSensitiveInfo = false,
              responseHasSensitiveInfo = true)
- public class RestoreVMCmd extends BaseAsyncCmd {
+ public class RestoreVMCmd extends BaseAsyncVMCmd {
      public static final Logger s_logger = Logger.getLogger(RestoreVMCmd.class);
      private static final String s_name = "restorevmresponse";
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java
index cd658cb,07672c0..d668ad4
--- a/api/src/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/ScaleVMCmd.java
@@@ -30,10 -26,9 +30,10 @@@ import org.apache.cloudstack.api.ACL
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
+ import org.apache.cloudstack.api.BaseAsyncVMCmd;
  import org.apache.cloudstack.api.BaseCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.ServiceOfferingResponse;
  import org.apache.cloudstack.api.response.SuccessResponse;
@@@ -47,10 -43,9 +47,10 @@@ import com.cloud.exception.VirtualMachi
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "scaleVirtualMachine", description = "Scales the virtual machine to a new service offering.", responseObject = SuccessResponse.class,
 +
 +@APICommand(name = "scaleVirtualMachine", description = "Scales the virtual machine to a new service offering.", responseObject = SuccessResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
          requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
- public class ScaleVMCmd extends BaseAsyncCmd {
+ public class ScaleVMCmd extends BaseAsyncVMCmd {
      public static final Logger s_logger = Logger.getLogger(ScaleVMCmd.class.getName());
      private static final String s_name = "scalevirtualmachineresponse";
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
index 2e4187d,553b753..4e91c7b
--- a/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
@@@ -16,18 -16,14 +16,18 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vm;
  
+ import org.apache.cloudstack.api.BaseAsyncVMCmd;
  import org.apache.log4j.Logger;
  
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.HostResponse;
  import org.apache.cloudstack.api.response.UserVmResponse;
@@@ -44,9 -40,9 +44,9 @@@ import com.cloud.user.Account
  import com.cloud.uservm.UserVm;
  import com.cloud.utils.exception.ExecutionException;
  
 -@APICommand(name = "startVirtualMachine", responseObject = UserVmResponse.class, description = "Starts a virtual machine.",
 +@APICommand(name = "startVirtualMachine", responseObject = UserVmResponse.class, description = "Starts a virtual machine.", responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
          requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
- public class StartVMCmd extends BaseAsyncCmd {
+ public class StartVMCmd extends BaseAsyncVMCmd {
      public static final Logger s_logger = Logger.getLogger(StartVMCmd.class.getName());
  
      private static final String s_name = "startvirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java
index fe94964,e9fa97b..6db5d18
--- a/api/src/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/StopVMCmd.java
@@@ -16,18 -16,15 +16,18 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.vm;
  
+ import org.apache.cloudstack.api.BaseAsyncVMCmd;
  import org.apache.log4j.Logger;
  
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
  import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.UserVmResponse;
  import org.apache.cloudstack.context.CallContext;
@@@ -37,9 -34,9 +37,9 @@@ import com.cloud.exception.ConcurrentOp
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "stopVirtualMachine", responseObject = UserVmResponse.class, description = "Stops a virtual machine.",
 +@APICommand(name = "stopVirtualMachine", responseObject = UserVmResponse.class, description = "Stops a virtual machine.", responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
          requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
- public class StopVMCmd extends BaseAsyncCmd {
+ public class StopVMCmd extends BaseAsyncVMCmd {
      public static final Logger s_logger = Logger.getLogger(StopVMCmd.class.getName());
  
      private static final String s_name = "stopvirtualmachineresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vm/UpgradeVMCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vmgroup/CreateVMGroupCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
index 553e2e9,7939edf..f9d9081
--- a/api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/AttachVolumeCmd.java
@@@ -15,18 -15,15 +15,19 @@@
  // specific language governing permissions and limitations
  // under the License.
  package org.apache.cloudstack.api.command.user.volume;
+ 
 -import org.apache.cloudstack.api.BaseAsyncVolumeCmd;
  import org.apache.log4j.Logger;
  
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
++import org.apache.cloudstack.api.BaseAsyncVolumeCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.UserVmResponse;
  import org.apache.cloudstack.api.response.VolumeResponse;
@@@ -36,9 -33,9 +37,9 @@@ import com.cloud.event.EventTypes
  import com.cloud.storage.Volume;
  import com.cloud.user.Account;
  
 -@APICommand(name = "attachVolume", description = "Attaches a disk volume to a virtual machine.", responseObject = VolumeResponse.class,
 +@APICommand(name = "attachVolume", description = "Attaches a disk volume to a virtual machine.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.VirtualMachine},
          requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
- public class AttachVolumeCmd extends BaseAsyncCmd {
+ public class AttachVolumeCmd extends BaseAsyncVolumeCmd {
      public static final Logger s_logger = Logger.getLogger(AttachVolumeCmd.class.getName());
      private static final String s_name = "attachvolumeresponse";
  
@@@ -67,6 -66,6 +68,7 @@@
          return deviceId;
      }
  
++    @Override
      public Long getId() {
          return id;
      }
@@@ -109,17 -108,8 +111,8 @@@
      }
  
      @Override
-     public boolean isDisplayResourceEnabled(){
-         Volume volume = _responseGenerator.findVolumeById(getId());
-         if (volume == null) {
-             return true; // bad id given, parent this command to true so ERROR events are tracked
-         }
-         return volume.isDisplayVolume();
-     }
- 
-     @Override
      public String getEventDescription() {
 -        return "attaching volume: " + getId() + " to vm: " + getVirtualMachineId();
 +        return  "attaching volume: " + getId() + " to vm: " + getVirtualMachineId();
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
index ad06bc2,31d75d8..9b83f61
--- a/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/CreateVolumeCmd.java
@@@ -221,10 -221,9 +222,9 @@@ public class CreateVolumeCmd extends Ba
      @Override
      public void execute() {
          CallContext.current().setEventDetails("Volume Id: " + getEntityId() + ((getSnapshotId() == null) ? "" : " from snapshot: " + getSnapshotId()));
-         CallContext.current().setEventDisplayEnabled(getDisplayVolume());
          Volume volume = _volumeService.createVolume(this);
          if (volume != null) {
 -            VolumeResponse response = _responseGenerator.createVolumeResponse(volume);
 +            VolumeResponse response = _responseGenerator.createVolumeResponse(ResponseView.Restricted, volume);
              //FIXME - have to be moved to ApiResponseHelper
              if (getSnapshotId() != null) {
                  Snapshot snap = _entityMgr.findById(Snapshot.class, getSnapshotId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
index 546a9d5,eff7a35..6ca96b0
--- a/api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/DeleteVolumeCmd.java
@@@ -81,12 -77,17 +81,17 @@@ public class DeleteVolumeCmd extends Ba
      }
  
      @Override
+     public boolean isDisplayResourceEnabled(){
+         return _volumeService.isDisplayResourceEnabled(getId());
+     }
+ 
+     @Override
      public void execute() throws ConcurrentOperationException {
          CallContext.current().setEventDetails("Volume Id: " + getId());
 -        boolean result = this._volumeService.deleteVolume(id, CallContext.current().getCallingAccount());
 +        boolean result = _volumeService.deleteVolume(id, CallContext.current().getCallingAccount());
          if (result) {
              SuccessResponse response = new SuccessResponse(getCommandName());
 -            this.setResponseObject(response);
 +            setResponseObject(response);
          } else {
              throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete volume");
          }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
index 1a874e1,b45ad0b..bfd0322
--- a/api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/DetachVolumeCmd.java
@@@ -15,18 -15,15 +15,19 @@@
  // specific language governing permissions and limitations
  // under the License.
  package org.apache.cloudstack.api.command.user.volume;
+ 
 -import org.apache.cloudstack.api.BaseAsyncVolumeCmd;
  import org.apache.log4j.Logger;
  
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
++import org.apache.cloudstack.api.BaseAsyncVolumeCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.UserVmResponse;
  import org.apache.cloudstack.api.response.VolumeResponse;
@@@ -37,9 -34,9 +38,9 @@@ import com.cloud.storage.Volume
  import com.cloud.user.Account;
  import com.cloud.uservm.UserVm;
  
 -@APICommand(name = "detachVolume", description = "Detaches a disk volume from a virtual machine.", responseObject = VolumeResponse.class,
 +@APICommand(name = "detachVolume", description = "Detaches a disk volume from a virtual machine.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.Volume},
          requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
- public class DetachVolumeCmd extends BaseAsyncCmd {
+ public class DetachVolumeCmd extends BaseAsyncVolumeCmd {
      public static final Logger s_logger = Logger.getLogger(DetachVolumeCmd.class.getName());
      private static final String s_name = "detachvolumeresponse";
  
@@@ -65,6 -60,6 +66,7 @@@
      /////////////////// Accessors ///////////////////////
      /////////////////////////////////////////////////////
  
++    @Override
      public Long getId() {
          return id;
      }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
index b9883cc,7f5cd0d..cc7f56c
--- a/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/ExtractVolumeCmd.java
@@@ -16,11 -16,9 +16,12 @@@
  // under the License.
  package org.apache.cloudstack.api.command.user.volume;
  
+ import org.apache.cloudstack.api.BaseAsyncVolumeCmd;
  import org.apache.log4j.Logger;
  
 +import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 +import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
@@@ -39,9 -36,9 +39,9 @@@ import com.cloud.storage.Upload
  import com.cloud.storage.Volume;
  import com.cloud.user.Account;
  
 -@APICommand(name = "extractVolume", description = "Extracts volume", responseObject = ExtractResponse.class,
 +@APICommand(name = "extractVolume", description = "Extracts volume", responseObject = ExtractResponse.class, entityType = {IAMEntityType.Volume},
          requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
- public class ExtractVolumeCmd extends BaseAsyncCmd {
+ public class ExtractVolumeCmd extends BaseAsyncVolumeCmd {
      public static final Logger s_logger = Logger.getLogger(ExtractVolumeCmd.class.getName());
  
      private static final String s_name = "extractvolumeresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
index 820d73d,126f1f3..d80595a
--- a/api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/MigrateVolumeCmd.java
@@@ -20,9 -19,8 +20,9 @@@ import org.apache.cloudstack.acl.IAMEnt
  import org.apache.cloudstack.api.APICommand;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
+ import org.apache.cloudstack.api.BaseAsyncVolumeCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.StoragePoolResponse;
  import org.apache.cloudstack.api.response.VolumeResponse;
@@@ -31,12 -29,12 +31,12 @@@ import com.cloud.event.EventTypes
  import com.cloud.storage.Volume;
  import com.cloud.user.Account;
  
 -@APICommand(name = "migrateVolume", description = "Migrate volume", responseObject = VolumeResponse.class, since = "3.0.0",
 +@APICommand(name = "migrateVolume", description = "Migrate volume", responseObject = VolumeResponse.class, since = "3.0.0", responseView = ResponseView.Restricted, entityType = {IAMEntityType.Volume},
          requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
- public class MigrateVolumeCmd extends BaseAsyncCmd {
+ public class MigrateVolumeCmd extends BaseAsyncVolumeCmd {
      private static final String s_name = "migratevolumeresponse";
  
 -    /////////////////////////////////////////////////////
 +     /////////////////////////////////////////////////////
      //////////////// API parameters /////////////////////
      /////////////////////////////////////////////////////
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
index 2f34c75,d51cdc5..d5cd62b
--- a/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
@@@ -24,9 -20,8 +24,9 @@@ import org.apache.cloudstack.api.APICom
  import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
- import org.apache.cloudstack.api.BaseAsyncCmd;
+ import org.apache.cloudstack.api.BaseAsyncVolumeCmd;
  import org.apache.cloudstack.api.Parameter;
 +import org.apache.cloudstack.api.ResponseObject.ResponseView;
  import org.apache.cloudstack.api.ServerApiException;
  import org.apache.cloudstack.api.response.DiskOfferingResponse;
  import org.apache.cloudstack.api.response.VolumeResponse;
@@@ -40,10 -36,9 +40,10 @@@ import com.cloud.projects.Project
  import com.cloud.storage.Volume;
  import com.cloud.user.Account;
  
 -@APICommand(name = "resizeVolume", description = "Resizes a volume", responseObject = VolumeResponse.class,
 +
 +@APICommand(name = "resizeVolume", description = "Resizes a volume", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = {IAMEntityType.Volume},
          requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
- public class ResizeVolumeCmd extends BaseAsyncCmd {
+ public class ResizeVolumeCmd extends BaseAsyncVolumeCmd {
      public static final Logger s_logger = Logger.getLogger(ResizeVolumeCmd.class.getName());
  
      private static final String s_name = "resizevolumeresponse";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/volume/UpdateVolumeCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vpn/ResetVpnConnectionCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/api/src/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
----------------------------------------------------------------------
diff --cc engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index 6e55bd2,e36dc62..6aa1e36
--- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@@ -16,41 -16,6 +16,43 @@@
  // under the License.
  package org.apache.cloudstack.engine.orchestration;
  
++
 +import java.net.URI;
 +import java.util.ArrayList;
 +import java.util.Arrays;
 +import java.util.Collections;
 +import java.util.Comparator;
 +import java.util.HashMap;
 +import java.util.HashSet;
 +import java.util.LinkedHashMap;
 +import java.util.List;
 +import java.util.Map;
 +import java.util.Set;
 +import java.util.UUID;
 +import java.util.concurrent.Executors;
 +import java.util.concurrent.ScheduledExecutorService;
 +import java.util.concurrent.TimeUnit;
 +
 +import javax.ejb.Local;
 +import javax.inject.Inject;
 +import javax.naming.ConfigurationException;
 +
- import org.apache.cloudstack.acl.IAMEntityType;
++import org.apache.log4j.Logger;
++
 +import org.apache.cloudstack.acl.ControlledEntity.ACLType;
++import org.apache.cloudstack.acl.IAMEntityType;
 +import org.apache.cloudstack.api.ApiConstants;
 +import org.apache.cloudstack.context.CallContext;
 +import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 +import org.apache.cloudstack.framework.config.ConfigDepot;
 +import org.apache.cloudstack.framework.config.ConfigKey;
 +import org.apache.cloudstack.framework.config.Configurable;
 +import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 +import org.apache.cloudstack.framework.messagebus.MessageBus;
 +import org.apache.cloudstack.framework.messagebus.PublishScope;
 +import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 +import org.apache.cloudstack.region.PortableIpDao;
- import org.apache.log4j.Logger;
 +
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.Listener;
  import com.cloud.agent.api.AgentControlAnswer;
@@@ -1082,16 -1067,42 +1085,42 @@@ public class NetworkOrchestrator extend
              }
          }
  
+         for (NetworkElement element : networkElements) {
+             if ((element instanceof AggregatedCommandExecutor) && (providersToImplement.contains(element.getProvider()))) {
+                 ((AggregatedCommandExecutor)element).prepareAggregatedExecution(network, dest);
+             }
+         }
+ 
+         try {
 -            // reapply all the firewall/staticNat/lb rules
 -            s_logger.debug("Reprogramming network " + network + " as a part of network implement");
 -            if (!reprogramNetworkRules(network.getId(), CallContext.current().getCallingAccount(), network)) {
 -                s_logger.warn("Failed to re-program the network as a part of network " + network + " implement");
 -                // see DataCenterVO.java
 -                ResourceUnavailableException ex = new ResourceUnavailableException("Unable to apply network rules as a part of network " + network + " implement", DataCenter.class,
 -                        network.getDataCenterId());
 -                ex.addProxyObject(_entityMgr.findById(DataCenter.class, network.getDataCenterId()).getUuid());
 -                throw ex;
 -            }
 +        // reapply all the firewall/staticNat/lb rules
 +        s_logger.debug("Reprogramming network " + network + " as a part of network implement");
 +        if (!reprogramNetworkRules(network.getId(), CallContext.current().getCallingAccount(), network)) {
 +            s_logger.warn("Failed to re-program the network as a part of network " + network + " implement");
 +            // see DataCenterVO.java
 +            ResourceUnavailableException ex = new ResourceUnavailableException("Unable to apply network rules as a part of network " + network + " implement", DataCenter.class,
 +                    network.getDataCenterId());
 +            ex.addProxyObject(_entityMgr.findById(DataCenter.class, network.getDataCenterId()).getUuid());
 +            throw ex;
 +        }
+             for (NetworkElement element : networkElements) {
+                 if ((element instanceof AggregatedCommandExecutor) && (providersToImplement.contains(element.getProvider()))) {
+                     if (!((AggregatedCommandExecutor)element).completeAggregatedExecution(network, dest)) {
+                         s_logger.warn("Failed to re-program the network as a part of network " + network + " implement due to aggregated commands execution failure!");
+                         // see DataCenterVO.java
+                         ResourceUnavailableException ex = new ResourceUnavailableException("Unable to apply network rules as a part of network " + network + " implement", DataCenter.class,
+                                 network.getDataCenterId());
+                         ex.addProxyObject(_entityMgr.findById(DataCenter.class, network.getDataCenterId()).getUuid());
+                         throw ex;
+                     }
+                 }
+             }
+         } finally {
+             for (NetworkElement element : networkElements) {
+                 if ((element instanceof AggregatedCommandExecutor) && (providersToImplement.contains(element.getProvider()))) {
+                     ((AggregatedCommandExecutor)element).cleanupAggregatedExecution(network, dest);
+                 }
+             }
+         }
      }
  
      // This method re-programs the rules/ips for existing network

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/engine/schema/src/com/cloud/event/EventVO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
----------------------------------------------------------------------
diff --cc plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
index 6e2d70d,fb08dc6..c0b9ee5
--- a/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
+++ b/plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/network/contrail/management/MockAccountManager.java
@@@ -370,10 -347,9 +370,15 @@@ public class MockAccountManager extend
      }
  
      @Override
 +    public void checkAccess(Account account, AccessType accessType, boolean sameOwner, String apiName,
 +            ControlledEntity... entities) throws PermissionDeniedException {
 +        // TODO Auto-generated method stub
++    }
 +
++    @Override
+     public Long finalyzeAccountId(String accountName, Long domainId, Long projectId, boolean enabledOnly) {
+         // TODO Auto-generated method stub
+         return null;
      }
  
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99bdc8d8/server/src/com/cloud/api/ApiDBUtils.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiDBUtils.java
index 859ca01,539eb70..432eb94
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@@ -727,6 -743,9 +743,8 @@@ public class ApiDBUtils 
          s_networkACLDao = networkACLDao;
          s_accountService = accountService;
          s_resourceDetailsService = resourceDetailsService;
+         s_hostGpuGroupsDao = hostGpuGroupsDao;
+         s_vgpuTypesDao = vgpuTypesDao;
 -
      }
  
      // ///////////////////////////////////////////////////////////


[45/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
mark VPC to be using distributed router if VPC offerign supports
distributedrouter capability.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/d7ea69ff
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/d7ea69ff
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/d7ea69ff

Branch: refs/heads/distributedrouter
Commit: d7ea69fff0b00f5c9740f81fb1f6672cfb86a9b9
Parents: 0d2d99e
Author: Murali Reddy <mu...@gmail.com>
Authored: Tue Mar 4 18:17:02 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:58:18 2014 +0530

----------------------------------------------------------------------
 api/src/com/cloud/network/vpc/Vpc.java                 |  6 ++++++
 .../apache/cloudstack/api/response/VpcResponse.java    |  9 +++++++++
 engine/schema/src/com/cloud/network/vpc/VpcVO.java     | 13 +++++++++++--
 server/src/com/cloud/api/ApiResponseHelper.java        |  1 +
 server/src/com/cloud/network/vpc/VpcManagerImpl.java   |  9 +++++----
 server/test/com/cloud/vpc/VpcApiUnitTest.java          |  2 +-
 server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java      |  4 ++--
 setup/db/db/schema-430to440.sql                        |  1 +
 8 files changed, 36 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d7ea69ff/api/src/com/cloud/network/vpc/Vpc.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/vpc/Vpc.java b/api/src/com/cloud/network/vpc/Vpc.java
index eb7e391..4bc8c98 100644
--- a/api/src/com/cloud/network/vpc/Vpc.java
+++ b/api/src/com/cloud/network/vpc/Vpc.java
@@ -73,4 +73,10 @@ public interface Vpc extends ControlledEntity, Identity, InternalIdentity {
     boolean isRestartRequired();
 
     boolean isDisplay();
+
+    /**
+     *
+     * @return true if VPC is configured to use distributed router to provides one-hop forwarding and hypervisor based ACL
+     */
+    boolean usesDistributedRouter();
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d7ea69ff/api/src/org/apache/cloudstack/api/response/VpcResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/VpcResponse.java b/api/src/org/apache/cloudstack/api/response/VpcResponse.java
index eeafb40..e3b44f2 100644
--- a/api/src/org/apache/cloudstack/api/response/VpcResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/VpcResponse.java
@@ -111,6 +111,11 @@ public class VpcResponse extends BaseResponse implements ControlledEntityRespons
     @Param(description = "is vpc for display to the regular user", since = "4.4", authorized = {RoleType.Admin})
     private Boolean forDisplay;
 
+
+    @SerializedName(ApiConstants.DISTRIBUTED_VPC_ROUTER)
+    @Param(description = "is VPC uses distributed router for one hop forwarding and host based network ACL's")
+    private boolean usesDistributedRouter;
+
     public void setId(String id) {
         this.id = id;
     }
@@ -199,4 +204,8 @@ public class VpcResponse extends BaseResponse implements ControlledEntityRespons
     public void setForDisplay(Boolean forDisplay) {
         this.forDisplay = forDisplay;
     }
+
+    public void setUsesDistributedRouter(Boolean usesDistributedRouter) {
+        this.usesDistributedRouter = usesDistributedRouter;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d7ea69ff/engine/schema/src/com/cloud/network/vpc/VpcVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/VpcVO.java b/engine/schema/src/com/cloud/network/vpc/VpcVO.java
index 39bea77..d7aaa95 100644
--- a/engine/schema/src/com/cloud/network/vpc/VpcVO.java
+++ b/engine/schema/src/com/cloud/network/vpc/VpcVO.java
@@ -81,11 +81,15 @@ public class VpcVO implements Vpc {
     @Column(name = "display", updatable = true, nullable = false)
     protected boolean display = true;
 
+    @Column(name="uses_distributed_router")
+    boolean usesDistributedRouter = false;
+
     public VpcVO() {
         uuid = UUID.randomUUID().toString();
     }
 
-    public VpcVO(long zoneId, String name, String displayText, long accountId, long domainId, long vpcOffId, String cidr, String networkDomain) {
+    public VpcVO(long zoneId, String name, String displayText, long accountId, long domainId, long vpcOffId, String cidr,
+                 String networkDomain, boolean useDistributedRouter) {
         this.zoneId = zoneId;
         this.name = name;
         this.displayText = displayText;
@@ -95,7 +99,8 @@ public class VpcVO implements Vpc {
         uuid = UUID.randomUUID().toString();
         state = State.Enabled;
         this.networkDomain = networkDomain;
-        vpcOfferingId = vpcOffId;
+        this.vpcOfferingId = vpcOffId;
+        this.usesDistributedRouter = useDistributedRouter;
     }
 
     @Override
@@ -201,5 +206,9 @@ public class VpcVO implements Vpc {
     @Override
     public IAMEntityType getEntityType() {
         return IAMEntityType.Vpc;
+
+    @Override
+    public boolean usesDistributedRouter() {
+        return usesDistributedRouter;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d7ea69ff/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index e87c3e0..a37bf7b 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -2808,6 +2808,7 @@ public class ApiResponseHelper implements ResponseGenerator {
         response.setRestartRequired(vpc.isRestartRequired());
         response.setNetworkDomain(vpc.getNetworkDomain());
         response.setForDisplay(vpc.isDisplay());
+        response.setUsesDistributedRouter(vpc.usesDistributedRouter());
 
         Map<Service, Set<Provider>> serviceProviderMap = ApiDBUtils.listVpcOffServices(vpc.getVpcOfferingId());
         List<ServiceResponse> serviceResponses = new ArrayList<ServiceResponse>();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d7ea69ff/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 16a8399..6da1a55 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -728,13 +728,13 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                 networkDomain = "cs" + Long.toHexString(owner.getId()) + NetworkOrchestrationService.GuestDomainSuffix.valueIn(zoneId);
             }
         }
-
-        return createVpc(zoneId, vpcOffId, owner, vpcName, displayText, cidr, networkDomain, displayVpc);
+        boolean useDistributedRouter = vpcOff.supportsDistributedRouter();
+        return createVpc(zoneId, vpcOffId, owner, vpcName, displayText, cidr, networkDomain, displayVpc, useDistributedRouter);
     }
 
     @DB
     protected Vpc createVpc(final long zoneId, final long vpcOffId, final Account vpcOwner, final String vpcName, final String displayText, final String cidr,
-            final String networkDomain, final Boolean displayVpc) {
+            final String networkDomain, final Boolean displayVpc, final boolean useDistributedRouter) {
 
         //Validate CIDR
         if (!NetUtils.isValidCIDR(cidr)) {
@@ -756,7 +756,8 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         return Transaction.execute(new TransactionCallback<VpcVO>() {
             @Override
             public VpcVO doInTransaction(TransactionStatus status) {
-                VpcVO vpc = new VpcVO(zoneId, vpcName, displayText, vpcOwner.getId(), vpcOwner.getDomainId(), vpcOffId, cidr, networkDomain);
+                VpcVO vpc = new VpcVO(zoneId, vpcName, displayText, vpcOwner.getId(), vpcOwner.getDomainId(), vpcOffId,
+                        cidr, networkDomain, useDistributedRouter);
                 if (displayVpc != null) {
                     vpc.setDisplay(displayVpc);
                 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d7ea69ff/server/test/com/cloud/vpc/VpcApiUnitTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/VpcApiUnitTest.java b/server/test/com/cloud/vpc/VpcApiUnitTest.java
index bc982a9..5e28374 100644
--- a/server/test/com/cloud/vpc/VpcApiUnitTest.java
+++ b/server/test/com/cloud/vpc/VpcApiUnitTest.java
@@ -85,7 +85,7 @@ public class VpcApiUnitTest extends TestCase {
     public void validateNtwkOffForVpc() {
         //validate network offering
         //1) correct network offering
-        VpcVO vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain");
+        VpcVO vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false);
         boolean result = false;
         try {
             _vpcService.validateNtwkOffForNtwkInVpc(2L, 1, "0.0.0.0", "111-", vo, "10.1.1.1", new AccountVO(), null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d7ea69ff/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java b/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java
index 7a0c7a0..e1a6ac2 100644
--- a/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java
+++ b/server/test/com/cloud/vpc/dao/MockVpcDaoImpl.java
@@ -98,9 +98,9 @@ public class MockVpcDaoImpl extends GenericDaoBase<VpcVO, Long> implements VpcDa
     public VpcVO findById(Long id) {
         VpcVO vo = null;
         if (id.longValue() == 1) {
-            vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain");
+            vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false);
         } else if (id.longValue() == 2) {
-            vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain");
+            vo = new VpcVO(1, "new vpc", "new vpc", 1, 1, 1, "0.0.0.0/0", "vpc domain", false);
             vo.setState(State.Inactive);
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d7ea69ff/setup/db/db/schema-430to440.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-430to440.sql b/setup/db/db/schema-430to440.sql
index 9614bca..930d698 100644
--- a/setup/db/db/schema-430to440.sql
+++ b/setup/db/db/schema-430to440.sql
@@ -740,3 +740,4 @@ ALTER TABLE `cloud`.`guest_os` ADD COLUMN `removed` datetime COMMENT 'Time when
 UPDATE `cloud`.`guest_os` SET `created` = now();
 ALTER TABLE `cloud`.`vm_reservation` ADD COLUMN `deployment_planner` varchar(40) DEFAULT NULL COMMENT 'Preferred deployment planner for the vm';
 ALTER TABLE `cloud`.`vpc_offerings` ADD COLUMN supports_distributed_router boolean default false;
+ALTER TABLE `cloud`.`vpc` ADD COLUMN uses_distributed_router  boolean default false;


[44/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
-add check to ensure 'Connectivity' service provider specified in
createVpcOffering actually supports 'DistributedRouter' capability

- enable OVS to support 'DistributedRouter' capability


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/0d2d99ec
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/0d2d99ec
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/0d2d99ec

Branch: refs/heads/distributedrouter
Commit: 0d2d99ececf55881a4df51417855e7500da450aa
Parents: b9518c8
Author: Murali Reddy <mu...@gmail.com>
Authored: Tue Mar 4 17:17:18 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:58:17 2014 +0530

----------------------------------------------------------------------
 .../com/cloud/network/element/OvsElement.java   |  5 +-
 .../com/cloud/network/vpc/VpcManagerImpl.java   | 52 ++++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d2d99ec/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java b/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
index 03eeedd..05e81a1 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
@@ -246,7 +246,10 @@ StaticNatServiceProvider, IpDeployer {
         Map<Service, Map<Capability, String>> capabilities = new HashMap<Service, Map<Capability, String>>();
 
         // L2 Support : SDN provisioning
-        capabilities.put(Service.Connectivity, null);
+        Map<Capability, String> connectivityCapabilities = new HashMap<Capability, String>();
+        connectivityCapabilities.put(Capability.DistributedRouter, null);
+        capabilities.put(Service.Connectivity, connectivityCapabilities);
+
 
         // L3 Support : Port Forwarding
         capabilities.put(Service.PortForwarding, null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0d2d99ec/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 8c7b5fb..16a8399 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -65,6 +65,7 @@ import com.cloud.exception.PermissionDeniedException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.network.element.NetworkElement;
 import com.cloud.network.IpAddress;
 import com.cloud.network.IpAddressManager;
 import com.cloud.network.Network;
@@ -376,6 +377,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
             }
         }
 
+        validateConnectivtyServiceCapablitlies(svcProviderMap.get(Service.Connectivity), serviceCapabilitystList);
         boolean supportsDistributedRouter = isVpcOfferingSupportsDistributedRouter(serviceCapabilitystList);
 
         VpcOffering offering = createVpcOffering(name, displayText, svcProviderMap, false, null,
@@ -460,6 +462,56 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         return supportsDistributedRouter;
     }
 
+    private void validateConnectivtyServiceCapablitlies(Set<Provider> providers, Map serviceCapabilitystList) {
+
+        if (serviceCapabilitystList != null && !serviceCapabilitystList.isEmpty()) {
+            Collection serviceCapabilityCollection = serviceCapabilitystList.values();
+            Iterator iter = serviceCapabilityCollection.iterator();
+            Map<Network.Capability, String> capabilityMap = null;
+
+            while (iter.hasNext()) {
+                HashMap<String, String> svcCapabilityMap = (HashMap<String, String>)iter.next();
+                Network.Capability capability = null;
+                String svc = svcCapabilityMap.get("service");
+                String capabilityName = svcCapabilityMap.get("capabilitytype");
+                String capabilityValue = svcCapabilityMap.get("capabilityvalue");
+                if (capabilityName != null) {
+                    capability = Network.Capability.getCapability(capabilityName);
+                }
+
+                if ((capability == null) || (capabilityName == null) || (capabilityValue == null)) {
+                    throw new InvalidParameterValueException("Invalid capability:" + capabilityName + " capability value:" + capabilityValue);
+                }
+
+                if (!svc.equalsIgnoreCase(Service.Connectivity.getName())) {
+                    throw new InvalidParameterValueException("Invalid Service:" + svc + " specified. Only for 'Connectivity' service capabilities can be specified");
+                }
+
+                if (!capabilityName.equalsIgnoreCase("DistributedRouter")) {
+                    throw new InvalidParameterValueException("Invalid Capability:" + capabilityName + " specified. Only 'DistributedRouter' capability can be specified.");
+                }
+
+                if (!capabilityValue.equalsIgnoreCase("true") && capabilityValue.equalsIgnoreCase("false")) {
+                    throw new InvalidParameterValueException("Invalid Capability value:" + capabilityValue + " specified.");
+                }
+            }
+
+            if (providers != null && !providers.isEmpty()) {
+                for (Provider provider: providers) {
+                    NetworkElement element = _ntwkModel.getElementImplementingProvider(provider.getName());
+                    Map<Service, Map<Network.Capability, String>> capabilities = element.getCapabilities();
+                    if (capabilities != null && !capabilities.isEmpty()) {
+                        Map<Network.Capability, String> connectivityCapabilities =  capabilities.get(Service.Connectivity);
+                        if (connectivityCapabilities == null || (connectivityCapabilities != null && !connectivityCapabilities.keySet().contains(Network.Capability.DistributedRouter))) {
+                            throw new InvalidParameterValueException("Provider: " + provider.getName() + " does not support "
+                                    + Network.Capability.DistributedRouter.getName() + " capability.");
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     @Override
     public Vpc getActiveVpc(long vpcId) {
         return _vpcDao.getActiveVpcById(vpcId);


[31/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
move HA rescheduling operation to HA worker context.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3d5fbe70
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3d5fbe70
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3d5fbe70

Branch: refs/heads/distributedrouter
Commit: 3d5fbe7073d4b7234611e972ca030088bff2f3f2
Parents: 53f306e
Author: Kelven Yang <ke...@gmail.com>
Authored: Tue Mar 4 15:58:03 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Mar 13 16:59:56 2014 -0700

----------------------------------------------------------------------
 .../cloud/ha/HighAvailabilityManagerImpl.java   | 22 +++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3d5fbe70/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
index b7d5be8..3bcaf2e 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -267,10 +267,17 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
             "] is down." +
             ((sb != null) ? sb.toString() : ""));
 
-        for (final VMInstanceVO vm : vms) {
+        for (VMInstanceVO vm : vms) {
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("Notifying HA Mgr of to restart vm " + vm.getId() + "-" + vm.getHostName());
             }
+            vm = _instanceDao.findByUuid(vm.getUuid());
+            Long hostId = vm.getHostId();
+            if ( hostId != null && !hostId.equals(host.getId()) ) {
+                s_logger.debug("VM " + vm.getHostName() + " is not on down host " + host.getId() + " it is on other host "
+                        + hostId + " VM HA is done");
+                continue;
+            }
             scheduleRestart(vm, investigate);
         }
     }
@@ -951,10 +958,19 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
     @Override
     public boolean postStateTransitionEvent(State oldState, VirtualMachine.Event event, State newState, VirtualMachine vo, boolean status, Object opaque) {
         if (oldState == State.Running && event == VirtualMachine.Event.FollowAgentPowerOffReport && newState == State.Stopped) {
-            VMInstanceVO vm = _instanceDao.findById(vo.getId());
+            final VMInstanceVO vm = _instanceDao.findById(vo.getId());
             if (vm.isHaEnabled()) {
                 s_logger.info("Detected out-of-band stop of a HA enabled VM " + vm.getInstanceName() + ", will schedule restart");
-                scheduleRestart(vm, true);
+                _executor.submit(new ManagedContextRunnable() {
+                    @Override
+                    protected void runInContext() {
+                        try {
+                            scheduleRestart(vm, true);
+                        } catch (Exception e) {
+                            s_logger.warn("Unexpected exception when scheduling a HA restart", e);
+                        }
+                    }
+                });
             }
         }
         return true;


[12/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
More generic parameters that are not unknown

Adding some more parameter names that should not be considered unknown since they belong to general use paramters

Signed-off-by: Alena Prokharchyk <al...@citrix.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/39e5b768
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/39e5b768
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/39e5b768

Branch: refs/heads/distributedrouter
Commit: 39e5b768e8fcae9622e01b2ca72a49675eb6d3fb
Parents: 1b83698
Author: Antonio Fornie <af...@schubergphilis.com>
Authored: Wed Mar 12 18:47:50 2014 -0500
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Thu Mar 13 10:40:14 2014 -0700

----------------------------------------------------------------------
 .../org/apache/cloudstack/api/ApiConstants.java |  2 +-
 .../dispatch/ParamGenericValidationWorker.java  |  3 +++
 .../ParamGenericValidationWorkerTest.java       | 24 ++++++++++++++++++++
 3 files changed, 28 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/39e5b768/api/src/org/apache/cloudstack/api/ApiConstants.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java
index 089affb..d5e97e6 100755
--- a/api/src/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/org/apache/cloudstack/api/ApiConstants.java
@@ -59,7 +59,7 @@ public class ApiConstants {
     public static final String CTX_ACCOUNT_ID = "ctxaccountid";
     public static final String CTX_USER_ID = "ctxuserid";
     public static final String CTXSTARTEVENTID = "ctxstarteventid";
-    public static final String CTX_START_EVENT_ID = "ctxStartEventId";
+    public static final String CTX_START_EVENT_ID = "ctxstarteventid";
     public static final String CUSTOMIZED = "customized";
     public static final String CUSTOMIZED_IOPS = "customizediops";
     public static final String CUSTOM_ID = "customid";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/39e5b768/server/src/com/cloud/api/dispatch/ParamGenericValidationWorker.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/dispatch/ParamGenericValidationWorker.java b/server/src/com/cloud/api/dispatch/ParamGenericValidationWorker.java
index f456468..7a73b8a 100644
--- a/server/src/com/cloud/api/dispatch/ParamGenericValidationWorker.java
+++ b/server/src/com/cloud/api/dispatch/ParamGenericValidationWorker.java
@@ -42,6 +42,7 @@ public class ParamGenericValidationWorker implements DispatchWorker {
     protected static final List<String> defaultParamNames = new ArrayList<String>();
 
     static {
+        defaultParamNames.add(ApiConstants.ACCOUNT_ID);
         defaultParamNames.add(ApiConstants.CTX_START_EVENT_ID);
         defaultParamNames.add(ApiConstants.COMMAND);
         defaultParamNames.add(ApiConstants.CMD_EVENT_TYPE);
@@ -62,6 +63,8 @@ public class ParamGenericValidationWorker implements DispatchWorker {
         defaultParamNames.add(ApiConstants.CTX_ACCOUNT_ID);
         defaultParamNames.add(ApiConstants.CTX_START_EVENT_ID);
         defaultParamNames.add(ApiConstants.CTX_USER_ID);
+        defaultParamNames.add(ApiConstants.UUID);
+        defaultParamNames.add(ApiConstants.ID);
         defaultParamNames.add("_");
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/39e5b768/server/test/com/cloud/api/dispatch/ParamGenericValidationWorkerTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/api/dispatch/ParamGenericValidationWorkerTest.java b/server/test/com/cloud/api/dispatch/ParamGenericValidationWorkerTest.java
index 0803a2b..8f9709c 100644
--- a/server/test/com/cloud/api/dispatch/ParamGenericValidationWorkerTest.java
+++ b/server/test/com/cloud/api/dispatch/ParamGenericValidationWorkerTest.java
@@ -75,6 +75,30 @@ public class ParamGenericValidationWorkerTest {
         final BaseCmd cmd = new FakeCmd();
         final Map<String, String> params = new HashMap<String, String>();
         params.put(ApiConstants.COMMAND, "");
+        params.put(ApiConstants.ACCOUNT_ID, "");
+        params.put(ApiConstants.CTX_START_EVENT_ID, "");
+        params.put(ApiConstants.COMMAND, "");
+        params.put(ApiConstants.CMD_EVENT_TYPE, "");
+        params.put(ApiConstants.USERNAME, "");
+        params.put(ApiConstants.USER_ID, "");
+        params.put(ApiConstants.PASSWORD, "");
+        params.put(ApiConstants.DOMAIN, "");
+        params.put(ApiConstants.DOMAIN_ID, "");
+        params.put(ApiConstants.DOMAIN__ID, "");
+        params.put(ApiConstants.SESSIONKEY, "");
+        params.put(ApiConstants.RESPONSE, "");
+        params.put(ApiConstants.PAGE, "");
+        params.put(ApiConstants.USER_API_KEY, "");
+        params.put(ApiConstants.API_KEY, "");
+        params.put(ApiConstants.PAGE_SIZE, "");
+        params.put(ApiConstants.HTTPMETHOD, "");
+        params.put(ApiConstants.SIGNATURE, "");
+        params.put(ApiConstants.CTX_ACCOUNT_ID, "");
+        params.put(ApiConstants.CTX_START_EVENT_ID, "");
+        params.put(ApiConstants.CTX_USER_ID, "");
+        params.put(ApiConstants.UUID, "");
+        params.put(ApiConstants.ID, "");
+        params.put("_", "");
         params.put("addedParam", "");
 
         Account account = new AccountVO("testaccount", 1L, "networkdomain", (short) 0, "uuid");


[23/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Removed the AccessType.UseNetwork - replaced all referrences by  AccessType.UseEntry


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/36c0a4e2
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/36c0a4e2
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/36c0a4e2

Branch: refs/heads/distributedrouter
Commit: 36c0a4e2c33f59649ff52e3be7a4f181f8defeae
Parents: 84a528f
Author: Prachi Damle <pr...@cloud.com>
Authored: Thu Mar 13 15:32:38 2014 -0700
Committer: Prachi Damle <pr...@cloud.com>
Committed: Thu Mar 13 15:32:38 2014 -0700

----------------------------------------------------------------------
 api/src/org/apache/cloudstack/acl/SecurityChecker.java       | 1 -
 .../apache/cloudstack/api/command/user/vm/DeployVMCmd.java   | 2 +-
 server/src/com/cloud/acl/DomainChecker.java                  | 2 +-
 server/src/com/cloud/network/IpAddressManagerImpl.java       | 8 +++++---
 server/src/com/cloud/network/NetworkServiceImpl.java         | 4 ++--
 server/src/com/cloud/user/AccountManagerImpl.java            | 3 ++-
 server/src/com/cloud/vm/UserVmManagerImpl.java               | 6 +++---
 .../network/lb/ApplicationLoadBalancerManagerImpl.java       | 2 +-
 8 files changed, 15 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36c0a4e2/api/src/org/apache/cloudstack/acl/SecurityChecker.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/acl/SecurityChecker.java b/api/src/org/apache/cloudstack/acl/SecurityChecker.java
index 2889bc8..614f604 100644
--- a/api/src/org/apache/cloudstack/acl/SecurityChecker.java
+++ b/api/src/org/apache/cloudstack/acl/SecurityChecker.java
@@ -32,7 +32,6 @@ public interface SecurityChecker extends Adapter {
 
     public enum AccessType {
         ModifyProject,
-        UseNetwork,
         OperateEntry,
         UseEntry
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36c0a4e2/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
index 69e079f..0235fcc 100755
--- a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
@@ -105,7 +105,7 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd {
     private Long domainId;
 
     //Network information
-    @ACL(accessType = AccessType.UseNetwork)
+    @ACL(accessType = AccessType.UseEntry)
     @Parameter(name = ApiConstants.NETWORK_IDS, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = NetworkResponse.class, description = "list of network ids used by virtual machine. Can't be specified with ipToNetworkList parameter")
     private List<Long> networkIds;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36c0a4e2/server/src/com/cloud/acl/DomainChecker.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/acl/DomainChecker.java b/server/src/com/cloud/acl/DomainChecker.java
index 3df71a7..cb6921d 100755
--- a/server/src/com/cloud/acl/DomainChecker.java
+++ b/server/src/com/cloud/acl/DomainChecker.java
@@ -134,7 +134,7 @@ public class DomainChecker extends AdapterBase implements SecurityChecker {
             }
 
             return true;
-        } else if (entity instanceof Network && accessType != null && accessType == AccessType.UseNetwork) {
+        } else if (entity instanceof Network && accessType != null && accessType == AccessType.UseEntry) {
             _networkMgr.checkNetworkPermissions(caller, (Network)entity);
         } else if (entity instanceof AffinityGroup) {
             return false;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36c0a4e2/server/src/com/cloud/network/IpAddressManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/IpAddressManagerImpl.java b/server/src/com/cloud/network/IpAddressManagerImpl.java
index 5225e3d..9b1f9bd 100644
--- a/server/src/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/com/cloud/network/IpAddressManagerImpl.java
@@ -1164,7 +1164,8 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
             if (zone.getNetworkType() == NetworkType.Advanced) {
                 if (network.getGuestType() == Network.GuestType.Shared) {
                     if (isSharedNetworkOfferingWithServices(network.getNetworkOfferingId())) {
-                        _accountMgr.checkAccess(CallContext.current().getCallingAccount(), AccessType.UseNetwork, false, network);
+                        _accountMgr.checkAccess(CallContext.current().getCallingAccount(), AccessType.UseEntry, false,
+                                network);
                     } else {
                         throw new InvalidParameterValueException("IP can be associated with guest network of 'shared' type only if "
                                                                  + "network services Source Nat, Static Nat, Port Forwarding, Load balancing, firewall are enabled in the network");
@@ -1186,7 +1187,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
         Network network = _networksDao.findById(networkId);
         if (network != null) {
-            _accountMgr.checkAccess(owner, AccessType.UseNetwork, false, network);
+            _accountMgr.checkAccess(owner, AccessType.UseEntry, false, network);
         } else {
             s_logger.debug("Unable to find ip address by id: " + ipId);
             return null;
@@ -1318,7 +1319,8 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
             if (zone.getNetworkType() == NetworkType.Advanced) {
                 if (network.getGuestType() == Network.GuestType.Shared) {
                     assert (isSharedNetworkOfferingWithServices(network.getNetworkOfferingId()));
-                    _accountMgr.checkAccess(CallContext.current().getCallingAccount(), AccessType.UseNetwork, false, network);
+                    _accountMgr.checkAccess(CallContext.current().getCallingAccount(), AccessType.UseEntry, false,
+                            network);
                 }
             } else {
                 _accountMgr.checkAccess(caller, null, true, ipToAssoc);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36c0a4e2/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index 9185d84..9238a1e 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -535,7 +535,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
                 // if shared network in the advanced zone, then check the caller against the network for 'AccessType.UseNetwork'
                 if (zone.getNetworkType() == NetworkType.Advanced) {
                     if (isSharedNetworkOfferingWithServices(network.getNetworkOfferingId())) {
-                        _accountMgr.checkAccess(caller, AccessType.UseNetwork, false, network);
+                        _accountMgr.checkAccess(caller, AccessType.UseEntry, false, network);
                         if (s_logger.isDebugEnabled()) {
                             s_logger.debug("Associate IP address called by the user " + callerUserId + " account " + ipOwner.getId());
                         }
@@ -578,7 +578,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
                 // if shared network in the advanced zone, then check the caller against the network for 'AccessType.UseNetwork'
                 if (zone.getNetworkType() == NetworkType.Advanced) {
                     if (isSharedNetworkOfferingWithServices(network.getNetworkOfferingId())) {
-                        _accountMgr.checkAccess(caller, AccessType.UseNetwork, false, network);
+                        _accountMgr.checkAccess(caller, AccessType.UseEntry, false, network);
                         if (s_logger.isDebugEnabled()) {
                             s_logger.debug("Associate IP address called by the user " + callerUserId + " account " + ipOwner.getId());
                         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36c0a4e2/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java
index 1b68b0c..f0d129a 100755
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@ -91,6 +91,7 @@ import com.cloud.exception.PermissionDeniedException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.IpAddress;
 import com.cloud.network.IpAddressManager;
+import com.cloud.network.Network;
 import com.cloud.network.VpnUserVO;
 import com.cloud.network.as.AutoScaleManager;
 import com.cloud.network.dao.AccountGuestVlanMapDao;
@@ -490,7 +491,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
                 domainId = account != null ? account.getDomainId() : -1;
             }
             if (entity.getAccountId() != -1 && domainId != -1 && !(entity instanceof VirtualMachineTemplate) &&
-                !(accessType != null && accessType == AccessType.UseNetwork) && !(entity instanceof AffinityGroup)) {
+                !(entity instanceof Network && accessType != null && accessType == AccessType.UseEntry) && !(entity instanceof AffinityGroup)) {
                 List<ControlledEntity> toBeChecked = domains.get(entity.getDomainId());
                 // for templates, we don't have to do cross domains check
                 if (toBeChecked == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36c0a4e2/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index e7c0c8d..0e4fb5e 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -987,7 +987,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         }
 
         // Perform account permission check on network
-        _accountMgr.checkAccess(caller, AccessType.UseNetwork, false, network);
+        _accountMgr.checkAccess(caller, AccessType.UseEntry, false, network);
 
         //ensure network belongs in zone
         if (network.getDataCenterId() != vmInstance.getDataCenterId()) {
@@ -1061,7 +1061,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         }
 
         // Perform account permission check on network
-        _accountMgr.checkAccess(caller, AccessType.UseNetwork, false, network);
+        _accountMgr.checkAccess(caller, AccessType.UseEntry, false, network);
 
         boolean nicremoved = false;
 
@@ -2336,7 +2336,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
 
                 // Perform account permission check
                 if (network.getAclType() == ACLType.Account) {
-                    _accountMgr.checkAccess(caller, AccessType.UseNetwork, false, network);
+                    _accountMgr.checkAccess(caller, AccessType.UseEntry, false, network);
                 }
                 networkList.add(network);
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36c0a4e2/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
index 1f3e0d2..73bf0d2 100644
--- a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
+++ b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
@@ -114,7 +114,7 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A
         }
 
         Account caller = CallContext.current().getCallingAccount();
-        _accountMgr.checkAccess(caller, AccessType.UseNetwork, false, guestNtwk);
+        _accountMgr.checkAccess(caller, AccessType.UseEntry, false, guestNtwk);
 
         Network sourceIpNtwk = _networkModel.getNetwork(sourceIpNetworkId);
         if (sourceIpNtwk == null) {


[26/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Merge branch 'rbac' to master


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/8ff94601
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/8ff94601
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/8ff94601

Branch: refs/heads/distributedrouter
Commit: 8ff94601f1b7dc3c6c92b083d343e392325e860e
Parents: 6c23e20 d3fd66e
Author: Min Chen <mi...@citrix.com>
Authored: Thu Mar 13 16:42:22 2014 -0700
Committer: Min Chen <mi...@citrix.com>
Committed: Thu Mar 13 16:42:22 2014 -0700

----------------------------------------------------------------------
 .../cloud/network/vpc/StaticRouteProfile.java   |    2 +-
 api/src/com/cloud/storage/VolumeApiService.java |    4 +-
 api/src/com/cloud/user/Account.java             |    4 +-
 api/src/com/cloud/user/AccountService.java      |   14 +-
 .../com/cloud/user/ResourceLimitService.java    |    2 +-
 api/src/org/apache/cloudstack/acl/Role.java     |   34 -
 api/src/org/apache/cloudstack/acl/RoleType.java |    2 +-
 .../apache/cloudstack/acl/SecurityChecker.java  |   13 +-
 api/src/org/apache/cloudstack/api/ACL.java      |    4 +-
 .../org/apache/cloudstack/api/APICommand.java   |    3 +
 .../org/apache/cloudstack/api/ApiConstants.java |    3 +-
 api/src/org/apache/cloudstack/api/BaseCmd.java  |    9 +-
 .../BaseListTemplateOrIsoPermissionsCmd.java    |   21 +-
 .../cloudstack/api/ResponseGenerator.java       |   44 +-
 .../apache/cloudstack/api/ResponseObject.java   |    5 +
 .../command/admin/account/CreateAccountCmd.java |    9 +-
 .../command/admin/account/DeleteAccountCmd.java |    9 +-
 .../admin/account/DisableAccountCmd.java        |   15 +-
 .../command/admin/account/EnableAccountCmd.java |   13 +-
 .../admin/account/ListAccountsCmdByAdmin.java   |   26 +
 .../command/admin/account/LockAccountCmd.java   |    3 +-
 .../command/admin/account/UpdateAccountCmd.java |   14 +-
 .../address/AssociateIPAddrCmdByAdmin.java      |   65 +
 .../ListPublicIpAddressesCmdByAdmin.java        |   53 +
 .../UpdateVMAffinityGroupCmdByAdmin.java        |   63 +
 .../admin/internallb/ListInternalLBVMsCmd.java  |    5 +-
 .../admin/internallb/StartInternalLBVMCmd.java  |    9 +-
 .../admin/internallb/StopInternalLBVMCmd.java   |    9 +-
 .../command/admin/iso/AttachIsoCmdByAdmin.java  |   53 +
 .../command/admin/iso/DetachIsoCmdByAdmin.java  |   47 +
 .../admin/iso/ListIsoPermissionsCmdByAdmin.java |   31 +
 .../command/admin/iso/ListIsosCmdByAdmin.java   |   26 +
 .../admin/iso/RegisterIsoCmdByAdmin.java        |   53 +
 .../command/admin/iso/UpdateIsoCmdByAdmin.java  |   45 +
 ...ListLoadBalancerRuleInstancesCmdByAdmin.java |   57 +
 .../admin/network/CreateNetworkCmdByAdmin.java  |   66 +
 .../admin/network/ListNetworksCmdByAdmin.java   |   50 +
 .../admin/network/UpdateNetworkCmdByAdmin.java  |   63 +
 .../command/admin/router/DestroyRouterCmd.java  |    5 +-
 .../command/admin/router/ListRoutersCmd.java    |    5 +-
 .../command/admin/router/RebootRouterCmd.java   |    7 +-
 .../command/admin/router/StartRouterCmd.java    |    5 +-
 .../api/command/admin/router/StopRouterCmd.java |    5 +-
 .../command/admin/router/UpgradeRouterCmd.java  |    5 +-
 .../admin/systemvm/DestroySystemVmCmd.java      |    8 +-
 .../admin/systemvm/ListSystemVMsCmd.java        |    5 +-
 .../admin/systemvm/MigrateSystemVMCmd.java      |    8 +-
 .../admin/systemvm/RebootSystemVmCmd.java       |    9 +-
 .../admin/systemvm/ScaleSystemVMCmd.java        |    9 +-
 .../admin/systemvm/StartSystemVMCmd.java        |    9 +-
 .../command/admin/systemvm/StopSystemVmCmd.java |    8 +-
 .../admin/systemvm/UpgradeSystemVMCmd.java      |   11 +-
 .../admin/template/CopyTemplateCmdByAdmin.java  |   63 +
 .../template/CreateTemplateCmdByAdmin.java      |   62 +
 .../ListTemplatePermissionsCmdByAdmin.java      |   32 +
 .../admin/template/ListTemplatesCmdByAdmin.java |   28 +
 .../admin/template/PrepareTemplateCmd.java      |   11 +-
 .../template/RegisterTemplateCmdByAdmin.java    |   57 +
 .../template/UpdateTemplateCmdByAdmin.java      |   47 +
 .../command/admin/vm/AddNicToVMCmdByAdmin.java  |   55 +
 .../api/command/admin/vm/AssignVMCmd.java       |    8 +-
 .../command/admin/vm/DeployVMCmdByAdmin.java    |   79 +
 .../command/admin/vm/DestroyVMCmdByAdmin.java   |   57 +
 .../api/command/admin/vm/ExpungeVMCmd.java      |    8 +-
 .../api/command/admin/vm/ListVMsCmdByAdmin.java |   69 +
 .../api/command/admin/vm/MigrateVMCmd.java      |    8 +-
 .../vm/MigrateVirtualMachineWithVolumeCmd.java  |   10 +-
 .../command/admin/vm/RebootVMCmdByAdmin.java    |   51 +
 .../api/command/admin/vm/RecoverVMCmd.java      |   10 +-
 .../admin/vm/RemoveNicFromVMCmdByAdmin.java     |   55 +
 .../admin/vm/ResetVMPasswordCmdByAdmin.java     |   54 +
 .../admin/vm/ResetVMSSHKeyCmdByAdmin.java       |   57 +
 .../command/admin/vm/RestoreVMCmdByAdmin.java   |   54 +
 .../api/command/admin/vm/ScaleVMCmdByAdmin.java |   69 +
 .../api/command/admin/vm/StartVMCmdByAdmin.java |   80 +
 .../api/command/admin/vm/StopVMCmdByAdmin.java  |   53 +
 .../vm/UpdateDefaultNicForVMCmdByAdmin.java     |   56 +
 .../command/admin/vm/UpdateVMCmdByAdmin.java    |   53 +
 .../command/admin/vm/UpgradeVMCmdByAdmin.java   |   59 +
 .../RevertToVMSnapshotCmdByAdmin.java           |   57 +
 .../admin/volume/AttachVolumeCmdByAdmin.java    |   47 +
 .../admin/volume/CreateVolumeCmdByAdmin.java    |   61 +
 .../admin/volume/DetachVolumeCmdByAdmin.java    |   48 +
 .../admin/volume/ListVolumesCmdByAdmin.java     |   63 +
 .../admin/volume/MigrateVolumeCmdByAdmin.java   |   47 +
 .../admin/volume/ResizeVolumeCmdByAdmin.java    |   47 +
 .../admin/volume/UpdateVolumeCmdByAdmin.java    |   45 +
 .../admin/volume/UploadVolumeCmdByAdmin.java    |   57 +
 .../admin/vpc/CreatePrivateGatewayCmd.java      |    3 +-
 .../command/admin/vpc/CreateVPCCmdByAdmin.java  |   64 +
 .../admin/vpc/DeletePrivateGatewayCmd.java      |    5 +-
 .../command/admin/vpc/ListVPCsCmdByAdmin.java   |   55 +
 .../command/admin/vpc/UpdateVPCCmdByAdmin.java  |   47 +
 .../api/command/admin/zone/CreateZoneCmd.java   |    7 +-
 .../command/admin/zone/ListZonesCmdByAdmin.java |   26 +
 .../zone/MarkDefaultZoneForAccountCmd.java      |   10 +-
 .../api/command/admin/zone/UpdateZoneCmd.java   |    5 +-
 .../command/user/account/ListAccountsCmd.java   |    8 +-
 .../user/address/AssociateIPAddrCmd.java        |   10 +-
 .../user/address/ListPublicIpAddressesCmd.java  |   10 +-
 .../command/user/address/UpdateIPAddrCmd.java   |   12 +-
 .../affinitygroup/CreateAffinityGroupCmd.java   |    8 +-
 .../affinitygroup/DeleteAffinityGroupCmd.java   |   12 +-
 .../affinitygroup/ListAffinityGroupsCmd.java    |   10 +-
 .../affinitygroup/UpdateVMAffinityGroupCmd.java |   13 +-
 .../autoscale/CreateAutoScalePolicyCmd.java     |    9 +-
 .../autoscale/CreateAutoScaleVmGroupCmd.java    |   10 +-
 .../autoscale/CreateAutoScaleVmProfileCmd.java  |   12 +-
 .../user/autoscale/CreateConditionCmd.java      |   12 +-
 .../autoscale/DeleteAutoScalePolicyCmd.java     |    8 +-
 .../autoscale/DeleteAutoScaleVmGroupCmd.java    |    8 +-
 .../autoscale/DeleteAutoScaleVmProfileCmd.java  |    8 +-
 .../user/autoscale/DeleteConditionCmd.java      |    8 +-
 .../autoscale/DisableAutoScaleVmGroupCmd.java   |    8 +-
 .../autoscale/EnableAutoScaleVmGroupCmd.java    |    8 +-
 .../autoscale/ListAutoScalePoliciesCmd.java     |    5 +-
 .../autoscale/ListAutoScaleVmGroupsCmd.java     |    8 +-
 .../autoscale/ListAutoScaleVmProfilesCmd.java   |    8 +-
 .../autoscale/UpdateAutoScalePolicyCmd.java     |    8 +-
 .../autoscale/UpdateAutoScaleVmGroupCmd.java    |   15 +-
 .../autoscale/UpdateAutoScaleVmProfileCmd.java  |   15 +-
 .../command/user/event/ArchiveEventsCmd.java    |    5 +-
 .../api/command/user/event/DeleteEventsCmd.java |    5 +-
 .../api/command/user/event/ListEventsCmd.java   |    5 +-
 .../firewall/CreateEgressFirewallRuleCmd.java   |   18 +-
 .../user/firewall/CreateFirewallRuleCmd.java    |    6 +-
 .../firewall/CreatePortForwardingRuleCmd.java   |   20 +-
 .../firewall/DeleteEgressFirewallRuleCmd.java   |    8 +-
 .../user/firewall/DeleteFirewallRuleCmd.java    |    9 +-
 .../firewall/DeletePortForwardingRuleCmd.java   |    6 +-
 .../firewall/ListEgressFirewallRulesCmd.java    |    8 +-
 .../user/firewall/ListFirewallRulesCmd.java     |    8 +-
 .../firewall/ListPortForwardingRulesCmd.java    |    8 +-
 .../firewall/UpdatePortForwardingRuleCmd.java   |   14 +-
 .../api/command/user/iso/AttachIsoCmd.java      |   23 +-
 .../api/command/user/iso/DetachIsoCmd.java      |   18 +-
 .../command/user/iso/ListIsoPermissionsCmd.java |   10 +-
 .../api/command/user/iso/ListIsosCmd.java       |    8 +-
 .../api/command/user/iso/RegisterIsoCmd.java    |   20 +-
 .../api/command/user/iso/UpdateIsoCmd.java      |    7 +-
 .../ListLoadBalancerRuleInstancesCmd.java       |   13 +-
 .../command/user/network/CreateNetworkCmd.java  |   13 +-
 .../command/user/network/DeleteNetworkCmd.java  |    9 +-
 .../command/user/network/ListNetworksCmd.java   |   11 +-
 .../command/user/network/RestartNetworkCmd.java |    9 +-
 .../command/user/network/UpdateNetworkCmd.java  |   31 +-
 .../AuthorizeSecurityGroupEgressCmd.java        |   24 +-
 .../AuthorizeSecurityGroupIngressCmd.java       |   23 +-
 .../securitygroup/CreateSecurityGroupCmd.java   |    8 +-
 .../securitygroup/DeleteSecurityGroupCmd.java   |   16 +-
 .../securitygroup/ListSecurityGroupsCmd.java    |    5 +-
 .../RevokeSecurityGroupEgressCmd.java           |   11 +-
 .../RevokeSecurityGroupIngressCmd.java          |   10 +-
 .../user/snapshot/CreateSnapshotCmd.java        |   17 +-
 .../user/snapshot/DeleteSnapshotCmd.java        |   13 +-
 .../command/user/snapshot/ListSnapshotsCmd.java |    5 +-
 .../user/snapshot/RevertSnapshotCmd.java        |   14 +-
 .../command/user/ssh/CreateSSHKeyPairCmd.java   |    8 +-
 .../command/user/ssh/DeleteSSHKeyPairCmd.java   |    9 +-
 .../command/user/ssh/ListSSHKeyPairsCmd.java    |    5 +-
 .../command/user/ssh/RegisterSSHKeyPairCmd.java |    8 +-
 .../api/command/user/tag/CreateTagsCmd.java     |    5 +-
 .../api/command/user/tag/DeleteTagsCmd.java     |    5 +-
 .../api/command/user/tag/ListTagsCmd.java       |    5 +-
 .../command/user/template/CopyTemplateCmd.java  |    9 +-
 .../user/template/CreateTemplateCmd.java        |   40 +-
 .../template/ListTemplatePermissionsCmd.java    |   11 +-
 .../command/user/template/ListTemplatesCmd.java |    9 +-
 .../user/template/RegisterTemplateCmd.java      |   16 +-
 .../user/template/UpdateTemplateCmd.java        |    9 +-
 .../template/UpdateTemplatePermissionsCmd.java  |    3 +-
 .../api/command/user/vm/AddNicToVMCmd.java      |   21 +-
 .../api/command/user/vm/DeployVMCmd.java        |   37 +-
 .../api/command/user/vm/DestroyVMCmd.java       |   18 +-
 .../api/command/user/vm/GetVMPasswordCmd.java   |   11 +-
 .../api/command/user/vm/ListVMsCmd.java         |   28 +-
 .../api/command/user/vm/RebootVMCmd.java        |   20 +-
 .../command/user/vm/RemoveIpFromVmNicCmd.java   |   14 +-
 .../api/command/user/vm/RemoveNicFromVMCmd.java |   21 +-
 .../api/command/user/vm/ResetVMPasswordCmd.java |   27 +-
 .../api/command/user/vm/ResetVMSSHKeyCmd.java   |   14 +-
 .../api/command/user/vm/RestoreVMCmd.java       |   21 +-
 .../api/command/user/vm/ScaleVMCmd.java         |   27 +-
 .../api/command/user/vm/StartVMCmd.java         |   19 +-
 .../api/command/user/vm/StopVMCmd.java          |   14 +-
 .../user/vm/UpdateDefaultNicForVMCmd.java       |   20 +-
 .../api/command/user/vm/UpdateVMCmd.java        |   25 +-
 .../api/command/user/vm/UpgradeVMCmd.java       |   26 +-
 .../command/user/vmgroup/CreateVMGroupCmd.java  |    8 +-
 .../command/user/vmgroup/DeleteVMGroupCmd.java  |    8 +-
 .../command/user/vmgroup/ListVMGroupsCmd.java   |    5 +-
 .../command/user/vmgroup/UpdateVMGroupCmd.java  |    9 +-
 .../user/vmsnapshot/CreateVMSnapshotCmd.java    |   10 +-
 .../user/vmsnapshot/DeleteVMSnapshotCmd.java    |    8 +-
 .../user/vmsnapshot/ListVMSnapshotCmd.java      |    5 +-
 .../user/vmsnapshot/RevertToVMSnapshotCmd.java  |   13 +-
 .../command/user/volume/AttachVolumeCmd.java    |   23 +-
 .../command/user/volume/CreateVolumeCmd.java    |   21 +-
 .../command/user/volume/DeleteVolumeCmd.java    |   14 +-
 .../command/user/volume/DetachVolumeCmd.java    |   21 +-
 .../command/user/volume/ExtractVolumeCmd.java   |   13 +-
 .../api/command/user/volume/ListVolumesCmd.java |    9 +-
 .../command/user/volume/MigrateVolumeCmd.java   |   20 +-
 .../command/user/volume/ResizeVolumeCmd.java    |   20 +-
 .../command/user/volume/UpdateVolumeCmd.java    |   18 +-
 .../command/user/volume/UploadVolumeCmd.java    |   29 +-
 .../command/user/vpc/CreateStaticRouteCmd.java  |    3 +-
 .../api/command/user/vpc/CreateVPCCmd.java      |   23 +-
 .../command/user/vpc/DeleteStaticRouteCmd.java  |    9 +-
 .../api/command/user/vpc/DeleteVPCCmd.java      |    9 +-
 .../user/vpc/ListPrivateGatewaysCmd.java        |    5 +-
 .../command/user/vpc/ListStaticRoutesCmd.java   |    5 +-
 .../api/command/user/vpc/ListVPCsCmd.java       |   14 +-
 .../api/command/user/vpc/RestartVPCCmd.java     |    9 +-
 .../api/command/user/vpc/UpdateVPCCmd.java      |   21 +-
 .../api/command/user/vpn/AddVpnUserCmd.java     |    8 +-
 .../user/vpn/CreateRemoteAccessVpnCmd.java      |   12 +-
 .../user/vpn/CreateVpnConnectionCmd.java        |    7 +-
 .../user/vpn/CreateVpnCustomerGatewayCmd.java   |    8 +-
 .../command/user/vpn/CreateVpnGatewayCmd.java   |    6 +-
 .../user/vpn/DeleteRemoteAccessVpnCmd.java      |    4 +-
 .../user/vpn/DeleteVpnConnectionCmd.java        |    5 +-
 .../user/vpn/DeleteVpnCustomerGatewayCmd.java   |    8 +-
 .../command/user/vpn/DeleteVpnGatewayCmd.java   |    5 +-
 .../user/vpn/ListRemoteAccessVpnsCmd.java       |    8 +-
 .../command/user/vpn/ListVpnConnectionsCmd.java |    8 +-
 .../user/vpn/ListVpnCustomerGatewaysCmd.java    |    5 +-
 .../command/user/vpn/ListVpnGatewaysCmd.java    |    8 +-
 .../api/command/user/vpn/ListVpnUsersCmd.java   |    5 +-
 .../api/command/user/vpn/RemoveVpnUserCmd.java  |    6 +-
 .../command/user/vpn/ResetVpnConnectionCmd.java |    8 +-
 .../user/vpn/UpdateVpnCustomerGatewayCmd.java   |    8 +-
 .../api/command/user/zone/ListZonesByCmd.java   |  133 --
 .../api/command/user/zone/ListZonesCmd.java     |  134 ++
 .../api/response/AccountResponse.java           |    9 +
 .../apache/cloudstack/query/QueryService.java   |   18 +-
 .../api/command/test/ScaleVMCmdTest.java        |    4 +-
 client/pom.xml                                  |   16 +-
 client/tomcatconf/applicationContext.xml.in     |  951 ++++++++
 client/tomcatconf/commands.properties.in        |   16 +
 client/tomcatconf/componentContext.xml.in       |  317 +++
 client/tomcatconf/nonossComponentContext.xml.in |  422 ++++
 .../tomcatconf/simulatorComponentContext.xml.in |  286 +++
 ...g-core-lifecycle-api-context-inheritable.xml |    5 +
 .../core/spring-core-registry-core-context.xml  |    9 +-
 .../src/com/cloud/network/addr/PublicIp.java    |    4 +-
 .../orchestration/NetworkOrchestrator.java      |  168 +-
 engine/schema/src/com/cloud/event/EventVO.java  |    1 -
 .../cloud/network/as/AutoScaleVmGroupVO.java    |    1 -
 .../cloud/network/dao/RemoteAccessVpnVO.java    |    2 +-
 .../network/dao/Site2SiteCustomerGatewayVO.java |    1 +
 .../network/dao/Site2SiteVpnConnectionVO.java   |    1 +
 .../network/dao/Site2SiteVpnGatewayVO.java      |    1 +
 .../com/cloud/network/rules/FirewallRuleVO.java |    2 +-
 .../schema/src/com/cloud/network/vpc/VpcVO.java |    1 +
 .../schema/src/com/cloud/storage/VolumeVO.java  |    1 +
 .../src/com/cloud/tags/ResourceTagVO.java       |    1 +
 .../com/cloud/upgrade/dao/Upgrade430to440.java  |   52 +-
 engine/schema/src/com/cloud/user/AccountVO.java |    1 -
 .../schema/src/com/cloud/vm/VMInstanceVO.java   |   16 +-
 .../src/com/cloud/vm/dao/NicIpAliasVO.java      |   10 +-
 .../storage/snapshot/SnapshotObject.java        |    2 +-
 .../db/src/com/cloud/utils/db/SearchBase.java   |   12 +-
 .../ratelimit/ApiRateLimitServiceImpl.java      |    4 +-
 .../cloudstack/ratelimit/ApiRateLimitTest.java  |   10 +-
 .../commands/ListF5LoadBalancerNetworksCmd.java |    9 +-
 .../contrail/management/MockAccountManager.java |   63 +-
 .../commands/ListSrxFirewallNetworksCmd.java    |    9 +-
 .../ListNetscalerLoadBalancerNetworksCmd.java   |    9 +-
 .../ListNiciraNvpDeviceNetworksCmd.java         |    5 +-
 .../ListPaloAltoFirewallNetworksCmd.java        |    5 +-
 .../api/command/LdapCreateAccountCmd.java       |   20 +-
 .../spring-server-core-managers-context.xml     |    3 +-
 .../cloud/acl/AffinityGroupAccessChecker.java   |    6 +-
 server/src/com/cloud/acl/DomainChecker.java     |   41 +-
 server/src/com/cloud/api/ApiDBUtils.java        |   49 +-
 server/src/com/cloud/api/ApiDispatcher.java     |   37 +-
 server/src/com/cloud/api/ApiResponseHelper.java |   96 +-
 server/src/com/cloud/api/ApiServer.java         |  129 +-
 .../com/cloud/api/query/QueryManagerImpl.java   |  653 +++---
 .../com/cloud/api/query/ViewResponseHelper.java |   53 +-
 .../com/cloud/api/query/dao/AccountJoinDao.java |    3 +-
 .../cloud/api/query/dao/AccountJoinDaoImpl.java |  100 +-
 .../cloud/api/query/dao/DataCenterJoinDao.java  |    3 +-
 .../api/query/dao/DataCenterJoinDaoImpl.java    |   11 +-
 .../api/query/dao/DomainRouterJoinDaoImpl.java  |   10 +-
 .../cloud/api/query/dao/TemplateJoinDao.java    |   11 +-
 .../api/query/dao/TemplateJoinDaoImpl.java      |   52 +-
 .../com/cloud/api/query/dao/UserVmJoinDao.java  |    5 +-
 .../cloud/api/query/dao/UserVmJoinDaoImpl.java  |   21 +-
 .../com/cloud/api/query/dao/VolumeJoinDao.java  |    5 +-
 .../cloud/api/query/dao/VolumeJoinDaoImpl.java  |   18 +-
 .../com/cloud/api/query/vo/AsyncJobJoinVO.java  |   34 +-
 .../cloud/api/query/vo/DomainRouterJoinVO.java  |    1 -
 .../src/com/cloud/api/query/vo/EventJoinVO.java |    1 -
 .../cloud/api/query/vo/InstanceGroupJoinVO.java |    1 -
 .../api/query/vo/ProjectInvitationJoinVO.java   |    1 -
 .../cloud/api/query/vo/ResourceTagJoinVO.java   |    1 -
 .../cloud/api/query/vo/SecurityGroupJoinVO.java |    1 -
 .../com/cloud/api/query/vo/TemplateJoinVO.java  |    5 +-
 .../com/cloud/api/query/vo/UserVmJoinVO.java    |    1 -
 .../com/cloud/api/query/vo/VolumeJoinVO.java    |    2 +-
 .../api/response/ApiResponseSerializer.java     |   10 +-
 .../configuration/ConfigurationManagerImpl.java |  544 ++---
 .../deploy/DeploymentPlanningManagerImpl.java   | 2204 +++++++++---------
 .../src/com/cloud/deploy/FirstFitPlanner.java   |   10 +-
 .../com/cloud/network/IpAddressManagerImpl.java |  670 +++---
 .../com/cloud/network/NetworkServiceImpl.java   |  482 ++--
 .../cloud/network/as/AutoScaleManagerImpl.java  |  485 ++--
 .../network/firewall/FirewallManagerImpl.java   |  174 +-
 .../lb/LoadBalancingRulesManagerImpl.java       |   29 +-
 .../cloud/network/rules/RulesManagerImpl.java   |   47 +-
 .../security/SecurityGroupManagerImpl.java      |    3 +-
 .../network/vpc/NetworkACLServiceImpl.java      |   34 +-
 .../com/cloud/network/vpc/VpcManagerImpl.java   |  419 ++--
 .../network/vpn/RemoteAccessVpnManagerImpl.java |   43 +-
 .../network/vpn/Site2SiteVpnManagerImpl.java    |   49 +-
 .../com/cloud/projects/ProjectManagerImpl.java  |  228 +-
 .../com/cloud/resource/ResourceManagerImpl.java |  250 +-
 .../resourcelimit/ResourceLimitManagerImpl.java |  243 +-
 .../com/cloud/server/ManagementServerImpl.java  |  219 +-
 .../com/cloud/servlet/ConsoleProxyServlet.java  |   57 +-
 .../com/cloud/storage/StorageManagerImpl.java   |   47 +-
 .../com/cloud/storage/VolumeApiServiceImpl.java |  280 +--
 .../storage/snapshot/SnapshotManagerImpl.java   |   42 +-
 .../cloud/tags/TaggedResourceManagerImpl.java   |   14 +-
 .../template/HypervisorTemplateAdapter.java     |   26 +-
 .../com/cloud/template/TemplateAdapterBase.java |   15 +-
 .../com/cloud/template/TemplateManagerImpl.java |   99 +-
 .../src/com/cloud/usage/UsageServiceImpl.java   |    9 +-
 server/src/com/cloud/user/AccountManager.java   |   53 +-
 .../src/com/cloud/user/AccountManagerImpl.java  |  526 +++--
 .../src/com/cloud/user/DomainManagerImpl.java   |   52 +-
 .../com/cloud/uuididentity/UUIDManagerImpl.java |    2 +-
 server/src/com/cloud/vm/UserVmManager.java      |   24 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java  |  439 ++--
 .../vm/snapshot/VMSnapshotManagerImpl.java      |  138 +-
 .../affinity/AffinityGroupServiceImpl.java      |  998 ++++----
 .../lb/ApplicationLoadBalancerManagerImpl.java  |   18 +-
 .../cloudstack/network/lb/CertServiceImpl.java  |   21 +-
 .../GlobalLoadBalancingRulesServiceImpl.java    |   12 +-
 .../com/cloud/user/MockAccountManagerImpl.java  |   88 +-
 server/test/com/cloud/vm/UserVmManagerTest.java |   35 +-
 .../cloud/vpc/MockResourceLimitManagerImpl.java |    2 +-
 .../affinity/AffinityApiUnitTest.java           |    6 +
 .../iam/AddIAMPermissionToIAMPolicyCmd.java     |    3 -
 .../api/response/iam/IAMPermissionResponse.java |    8 +-
 .../cloudstack/iam/IAMApiServiceImpl.java       |   22 +-
 .../iam/RoleBasedEntityAccessChecker.java       |   13 +-
 services/pom.xml                                |    2 +-
 setup/db/db/schema-430to440.sql                 |  113 +-
 test/integration/smoke/test_vm_iam.py           |  717 ++++++
 tools/apidoc/gen_toc.py                         |   15 +-
 tools/marvin/marvin/integration/lib/base.py     |  130 +-
 354 files changed, 12593 insertions(+), 6294 deletions(-)
----------------------------------------------------------------------



[32/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
Restore to old HA logic, but suppress VM state change on resource state report to avoid interferring HA.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6ad245e6
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6ad245e6
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6ad245e6

Branch: refs/heads/distributedrouter
Commit: 6ad245e6756176eb0ca374f121f30877498b9225
Parents: 4312d88
Author: Kelven Yang <ke...@gmail.com>
Authored: Wed Mar 5 17:03:02 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Mar 13 16:59:56 2014 -0700

----------------------------------------------------------------------
 .../src/com/cloud/ha/HighAvailabilityManager.java           | 2 ++
 .../src/com/cloud/vm/VirtualMachineManagerImpl.java         | 4 ++--
 server/src/com/cloud/ha/HighAvailabilityManagerImpl.java    | 9 +++++++++
 3 files changed, 13 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6ad245e6/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java
----------------------------------------------------------------------
diff --git a/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java b/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java
index eb60f3e..ecfb6f6 100644
--- a/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java
+++ b/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java
@@ -100,6 +100,8 @@ public interface HighAvailabilityManager extends Manager {
 
     void cancelScheduledMigrations(HostVO host);
 
+    boolean hasPendingHaWork(long vmId);
+
     /**
      * @return
      */

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6ad245e6/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 0ca0d30..e344001 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -4100,7 +4100,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
                 VirtualMachine.Type.Instance, vmId);
-        if (pendingWorkJobs.size() == 0) {
+        if (pendingWorkJobs.size() == 0 || _haMgr.hasPendingHaWork(vmId)) {
             // there is no pending operation job
             VMInstanceVO vm = _vmDao.findById(vmId);
             if (vm != null) {
@@ -4125,7 +4125,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                 s_logger.warn("VM " + vmId + " no longer exists when processing VM state report");
             }
         } else {
-            s_logger.info("There is pending job working on the VM. vm id: " + vmId + ", postpone power-change report by resetting power-change counters");
+            s_logger.info("There is pending job or HA tasks working on the VM. vm id: " + vmId + ", postpone power-change report by resetting power-change counters");
 
             // reset VM power state tracking so that we won't lost signal when VM has
             // been translated to

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6ad245e6/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
index 8bd569a..29f1e7b 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -962,6 +962,9 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
         if (oldState == State.Running && event == VirtualMachine.Event.FollowAgentPowerOffReport && newState == State.Stopped) {
             final VMInstanceVO vm = _instanceDao.findById(vo.getId());
             if (vm.isHaEnabled()) {
+                if (vm.getState() == State.Stopped)
+                    s_logger.warn("Sanity check failed. postStateTransitionEvent reports transited to Stopped but VM " + vm + " is still at state " + vm.getState());
+
                 s_logger.info("Detected out-of-band stop of a HA enabled VM " + vm.getInstanceName() + ", will schedule restart");
                 _executor.submit(new ManagedContextRunnable() {
                     @Override
@@ -977,4 +980,10 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
         }
         return true;
     }
+
+    @Override
+    public boolean hasPendingHaWork(long vmId) {
+        List<HaWorkVO> haWorks = _haDao.listRunningHaWorkForVm(vmId);
+        return haWorks.size() > 0;
+    }
 }


[41/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
CLOUDSTACK-6090: Virtual Router Service Failure Alerting

Signed-off-by: Koushik Das <ko...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f7337527
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f7337527
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f7337527

Branch: refs/heads/distributedrouter
Commit: f7337527cf9dbb35ec4c60621d4b37173635660c
Parents: 6a5d3e9
Author: Harikrishna Patnala <ha...@citrix.com>
Authored: Fri Mar 14 15:00:38 2014 +0530
Committer: Koushik Das <ko...@apache.org>
Committed: Fri Mar 14 15:14:15 2014 +0530

----------------------------------------------------------------------
 .../cloud/agent/api/GetRouterAlertsAnswer.java  |  62 +++++
 .../api/routing/GetRouterAlertsCommand.java     |  46 ++++
 .../virtualnetwork/VirtualRoutingResource.java  |  45 +++-
 .../spring-engine-schema-core-daos-context.xml  |   1 +
 .../network/dao/OpRouterMonitorServiceDao.java  |  25 ++
 .../dao/OpRouterMonitorServiceDaoImpl.java      |  28 +++
 .../network/dao/OpRouterMonitorServiceVO.java   |  52 ++++
 .../VirtualNetworkApplianceManagerImpl.java     |  67 +++++
 setup/db/db/schema-430to440.sql                 |   8 +
 .../config/opt/cloud/bin/getRouterAlerts.sh     |  70 ++++++
 .../debian/config/root/monitorServices.py       |   3 +
 .../smoke/test_VirtualRouter_alerts.py          | 244 +++++++++++++++++++
 12 files changed, 650 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/core/src/com/cloud/agent/api/GetRouterAlertsAnswer.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/GetRouterAlertsAnswer.java b/core/src/com/cloud/agent/api/GetRouterAlertsAnswer.java
new file mode 100644
index 0000000..06a7a7a
--- /dev/null
+++ b/core/src/com/cloud/agent/api/GetRouterAlertsAnswer.java
@@ -0,0 +1,62 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.agent.api;
+
+
+import com.cloud.agent.api.routing.GetRouterAlertsCommand;
+
+public class GetRouterAlertsAnswer extends Answer {
+
+    String routerName;
+    String[] alerts;
+    String timeStamp;
+
+    protected GetRouterAlertsAnswer() {
+    }
+
+    public GetRouterAlertsAnswer(GetRouterAlertsCommand cmd, String alerts[], String timeStamp) {
+        super(cmd, true, null);
+        this.alerts = alerts;
+        this.timeStamp = timeStamp;
+    }
+
+
+    public GetRouterAlertsAnswer(GetRouterAlertsCommand cmd, Exception ex) {
+        super(cmd, ex);
+    }
+
+    public void setAlerts(String[] alerts) {
+        this.alerts = alerts;
+    }
+
+    public String[] getAlerts() {
+        return alerts;
+    }
+
+    public void setTimeStamp(String timeStamp) {
+        this.timeStamp = timeStamp;
+    }
+
+    public String getTimeStamp() {
+        return timeStamp;
+    }
+
+    public String getRouterName() {
+        return routerName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/core/src/com/cloud/agent/api/routing/GetRouterAlertsCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/GetRouterAlertsCommand.java b/core/src/com/cloud/agent/api/routing/GetRouterAlertsCommand.java
new file mode 100644
index 0000000..a6769ef
--- /dev/null
+++ b/core/src/com/cloud/agent/api/routing/GetRouterAlertsCommand.java
@@ -0,0 +1,46 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.agent.api.routing;
+
+
+public class GetRouterAlertsCommand  extends NetworkElementCommand {
+
+    private String previousAlertTimeStamp;
+
+    protected GetRouterAlertsCommand() {
+
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+
+    public GetRouterAlertsCommand(String timeStamp) {
+        this.previousAlertTimeStamp = timeStamp;
+    }
+
+    public String getPreviousAlertTimeStamp() {
+        return previousAlertTimeStamp;
+    }
+
+    @Override
+    public boolean isQuery() {
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
index 3712aba..e13fbf6 100755
--- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
+++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java
@@ -32,6 +32,8 @@ import com.cloud.agent.api.routing.DeleteIpAliasCommand;
 import com.cloud.agent.api.routing.DhcpEntryCommand;
 import com.cloud.agent.api.routing.DnsMasqConfigCommand;
 import com.cloud.agent.api.routing.GroupAnswer;
+import com.cloud.agent.api.routing.GetRouterAlertsCommand;
+import com.cloud.agent.api.GetRouterAlertsAnswer;
 import com.cloud.agent.api.routing.IpAliasTO;
 import com.cloud.agent.api.routing.IpAssocCommand;
 import com.cloud.agent.api.routing.IpAssocVpcCommand;
@@ -102,6 +104,7 @@ public class VirtualRoutingResource {
         protected static final String IPASSOC = "ipassoc.sh";
         protected static final String LB = "loadbalancer.sh";
         protected static final String MONITOR_SERVICE = "monitor_service.sh";
+        protected static final String ROUTER_ALERTS = "getRouterAlerts.sh";
         protected static final String PASSWORD = "savepassword.sh";
         protected static final String RVR_CHECK = "checkrouter.sh";
         protected static final String RVR_BUMPUP_PRI = "bumpup_priority.sh";
@@ -275,7 +278,9 @@ public class VirtualRoutingResource {
         } else if (cmd instanceof GetDomRVersionCmd) {
             return execute((GetDomRVersionCmd)cmd);
         } else if (cmd instanceof CheckS2SVpnConnectionsCommand) {
-            return execute((CheckS2SVpnConnectionsCommand)cmd);
+            return execute((CheckS2SVpnConnectionsCommand) cmd);
+        } else if (cmd instanceof GetRouterAlertsCommand) {
+            return execute((GetRouterAlertsCommand)cmd);
         } else {
             s_logger.error("Unknown query command in VirtualRoutingResource!");
             return Answer.createUnsupportedCommandAnswer(cmd);
@@ -642,6 +647,29 @@ public class VirtualRoutingResource {
         return new CheckS2SVpnConnectionsAnswer(cmd, result.isSuccess(), result.getDetails());
     }
 
+    private GetRouterAlertsAnswer execute(GetRouterAlertsCommand cmd) {
+
+        String args = null;
+        String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
+        if (cmd.getPreviousAlertTimeStamp() != null) {
+            args = cmd.getPreviousAlertTimeStamp();
+        }
+
+        ExecutionResult result = _vrDeployer.executeInVR(routerIp, VRScripts.ROUTER_ALERTS, args);
+        String alerts[] = null;
+        String lastAlertTimestamp = null;
+        // CallHostPlugin results "success" when there are no alerts on virtual router
+        if (result.isSuccess()) {
+            if (!result.getDetails().isEmpty() && !result.getDetails().equals("No Alerts")) {
+                alerts = result.getDetails().split("\\\\n");
+                String[] lastAlert = alerts[alerts.length - 1].split(" ");
+                lastAlertTimestamp = lastAlert[0] + " " + lastAlert[1];
+            }
+        }
+
+        return new GetRouterAlertsAnswer(cmd, alerts, lastAlertTimestamp);
+    }
+
     protected Answer execute(CheckRouterCommand cmd) {
         final ExecutionResult result = _vrDeployer.executeInVR(cmd.getRouterAccessIp(), VRScripts.RVR_CHECK, null);
         if (!result.isSuccess()) {
@@ -732,6 +760,21 @@ public class VirtualRoutingResource {
         return cfg;
     }
 
+    protected List<ConfigItem> generateConfig(GetRouterAlertsCommand cmd) {
+        LinkedList<ConfigItem> cfg = new LinkedList<>();
+
+        String args = null;
+        String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP);
+        if (cmd.getPreviousAlertTimeStamp() != null) {
+            args = "getRouterAlerts.sh " + routerIp + " " + cmd.getPreviousAlertTimeStamp();
+        } else {
+            args = "getRouterAlerts.sh " + routerIp;
+        }
+
+        cfg.add(new ConfigItem(VRScripts.ROUTER_ALERTS, args));
+        return cfg;
+    }
+
     protected List<ConfigItem> generateConfig(SetupGuestNetworkCommand cmd) {
         LinkedList<ConfigItem> cfg = new LinkedList<>();
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
----------------------------------------------------------------------
diff --git a/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml b/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
index 765d86c..489b37d 100644
--- a/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
+++ b/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
@@ -157,6 +157,7 @@
   <bean id="firewallRulesCidrsDaoImpl" class="com.cloud.network.dao.FirewallRulesCidrsDaoImpl" />
   <bean id="firewallRulesDaoImpl" class="com.cloud.network.dao.FirewallRulesDaoImpl" />
   <bean id="MonitoringServiceDaoImpl" class="com.cloud.network.dao.MonitoringServiceDaoImpl" />
+  <bean id="OpRouterMonitorServiceDaoImpl" class="com.cloud.network.dao.OpRouterMonitorServiceDaoImpl" />
   <bean id="globalLoadBalancerDaoImpl" class="org.apache.cloudstack.region.gslb.GlobalLoadBalancerDaoImpl" />
   <bean id="globalLoadBalancerLbRuleMapDaoImpl" class="org.apache.cloudstack.region.gslb.GlobalLoadBalancerLbRuleMapDaoImpl" />
   <bean id="guestOSCategoryDaoImpl" class="com.cloud.storage.dao.GuestOSCategoryDaoImpl" />

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceDao.java b/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceDao.java
new file mode 100644
index 0000000..ebc0f1a
--- /dev/null
+++ b/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceDao.java
@@ -0,0 +1,25 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.network.dao;
+
+
+import com.cloud.utils.db.GenericDao;
+
+public interface OpRouterMonitorServiceDao extends GenericDao<OpRouterMonitorServiceVO, Long> {
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceDaoImpl.java b/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceDaoImpl.java
new file mode 100644
index 0000000..b92512e
--- /dev/null
+++ b/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceDaoImpl.java
@@ -0,0 +1,28 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.network.dao;
+
+import com.cloud.utils.db.GenericDaoBase;
+import org.springframework.stereotype.Component;
+
+import javax.ejb.Local;
+
+@Component
+@Local(value=OpRouterMonitorServiceDao.class)
+public class OpRouterMonitorServiceDaoImpl extends GenericDaoBase<OpRouterMonitorServiceVO, Long> implements OpRouterMonitorServiceDao  {
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceVO.java b/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceVO.java
new file mode 100644
index 0000000..c70bba3
--- /dev/null
+++ b/engine/schema/src/com/cloud/network/dao/OpRouterMonitorServiceVO.java
@@ -0,0 +1,52 @@
+package com.cloud.network.dao;
+
+import org.apache.cloudstack.api.InternalIdentity;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Id;
+import javax.persistence.Column;
+
+
+@Entity
+@Table(name = "op_router_monitoring_services")
+public class OpRouterMonitorServiceVO implements InternalIdentity {
+
+    @Id
+    @Column(name="vm_id")
+    Long id;
+
+    @Column(name="router_name")
+    private String name;
+
+    @Column(name="last_alert_timestamp")
+    private String lastAlertTimestamp;
+
+
+    public OpRouterMonitorServiceVO() {}
+
+    public OpRouterMonitorServiceVO(long vmId, String name, String lastAlertTimestamp) {
+        this.id = vmId;
+        this.name = name;
+        this.lastAlertTimestamp = lastAlertTimestamp;
+    }
+
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getLastAlertTimestamp() {
+        return lastAlertTimestamp;
+    }
+
+    public void setLastAlertTimestamp (String timestamp) {
+        this.lastAlertTimestamp = timestamp;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index eeab91d..c692491 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -55,6 +55,7 @@ import org.apache.cloudstack.framework.jobs.AsyncJobManager;
 import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
+import org.apache.cloudstack.alert.AlertService.AlertType;
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
 import com.cloud.agent.api.AgentControlAnswer;
@@ -73,6 +74,8 @@ import com.cloud.agent.api.NetworkUsageAnswer;
 import com.cloud.agent.api.NetworkUsageCommand;
 import com.cloud.agent.api.PvlanSetupCommand;
 import com.cloud.agent.api.StartupCommand;
+import com.cloud.agent.api.routing.GetRouterAlertsCommand;
+import com.cloud.agent.api.GetRouterAlertsAnswer;
 import com.cloud.agent.api.check.CheckSshAnswer;
 import com.cloud.agent.api.check.CheckSshCommand;
 import com.cloud.agent.api.routing.AggregationControlCommand;
@@ -179,6 +182,7 @@ import com.cloud.network.dao.MonitoringServiceDao;
 import com.cloud.network.dao.MonitoringServiceVO;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.OpRouterMonitorServiceDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.RemoteAccessVpnDao;
 import com.cloud.network.dao.Site2SiteCustomerGatewayDao;
@@ -188,6 +192,7 @@ import com.cloud.network.dao.Site2SiteVpnGatewayDao;
 import com.cloud.network.dao.UserIpv6AddressDao;
 import com.cloud.network.dao.VirtualRouterProviderDao;
 import com.cloud.network.dao.VpnUserDao;
+import com.cloud.network.dao.OpRouterMonitorServiceVO;
 import com.cloud.network.lb.LoadBalancingRule;
 import com.cloud.network.lb.LoadBalancingRule.LbDestination;
 import com.cloud.network.lb.LoadBalancingRule.LbHealthCheckPolicy;
@@ -394,6 +399,8 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
     AsyncJobManager _asyncMgr;
     @Inject
     protected ApiAsyncJobDispatcher _asyncDispatcher;
+    @Inject
+    OpRouterMonitorServiceDao _opRouterMonitorServiceDao;
 
     int _routerRamSize;
     int _routerCpuMHz;
@@ -1348,6 +1355,8 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
 
                 updateSite2SiteVpnConnectionState(routers);
 
+                getRouterAlerts();
+
                 final List<NetworkVO> networks = _networkDao.listRedundantNetworks();
                 s_logger.debug("Found " + networks.size() + " networks to update RvR status. ");
                 for (final NetworkVO network : networks) {
@@ -1362,6 +1371,64 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
         }
     }
 
+    private void getRouterAlerts() {
+        try{
+            List<DomainRouterVO> routersInIsolatedNetwork = _routerDao.listByStateAndNetworkType(State.Running, GuestType.Isolated, mgmtSrvrId);
+            List<DomainRouterVO> routersInSharedNetwork = _routerDao.listByStateAndNetworkType(State.Running, GuestType.Shared, mgmtSrvrId);
+
+            List<DomainRouterVO> routers = new ArrayList<DomainRouterVO>();
+            routers.addAll(routersInIsolatedNetwork);
+            routers.addAll(routersInSharedNetwork);
+            s_logger.debug("Found " + routers.size() + " running routers. ");
+
+            for (final DomainRouterVO router : routers) {
+                if (router.getVpcId() != null) {
+                    continue;
+                }
+                String privateIP = router.getPrivateIpAddress();
+
+                if (privateIP != null) {
+                    OpRouterMonitorServiceVO opRouterMonitorServiceVO = _opRouterMonitorServiceDao.findById(router.getId());
+
+                    GetRouterAlertsCommand command = null;
+                    if (opRouterMonitorServiceVO == null) {
+                        command = new GetRouterAlertsCommand(null);
+                    } else {
+                        command = new GetRouterAlertsCommand(opRouterMonitorServiceVO.getLastAlertTimestamp());
+                    }
+
+                    command.setAccessDetail(NetworkElementCommand.ROUTER_IP, router.getPrivateIpAddress());
+                    command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+
+                    GetRouterAlertsAnswer answer = null;
+                    try {
+                        answer = (GetRouterAlertsAnswer) _agentMgr.easySend(router.getHostId(), command);
+                        String alerts[] = answer.getAlerts();
+                        if (alerts != null ) {
+                            for (String alert: alerts) {
+                                _alertMgr.sendAlert(AlertType.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterId(), router.getPodIdToDeployIn(), "Monitoring Service on VR " + router.getInstanceName(), alert);
+                            }
+                            String lastAlertTimeStamp = answer.getTimeStamp();
+                            if (opRouterMonitorServiceVO == null) {
+                                opRouterMonitorServiceVO = new OpRouterMonitorServiceVO(router.getId(), router.getHostName(), lastAlertTimeStamp);
+                                _opRouterMonitorServiceDao.persist(opRouterMonitorServiceVO);
+                            } else {
+                                opRouterMonitorServiceVO.setLastAlertTimestamp(lastAlertTimeStamp);
+                                _opRouterMonitorServiceDao.update(opRouterMonitorServiceVO.getId(), opRouterMonitorServiceVO);
+                            }
+                        }
+                    } catch (Exception e) {
+                        s_logger.warn("Error while collecting alerts from router: " + router.getInstanceName() + " from host: " + router.getHostId(), e);
+                        continue;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            s_logger.warn("Error while collecting alerts from router", e);
+        }
+    }
+
+
     private final static int DEFAULT_PRIORITY = 100;
     private final static int DEFAULT_DELTA = 2;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/setup/db/db/schema-430to440.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-430to440.sql b/setup/db/db/schema-430to440.sql
index 056c5f8..9d41fe9 100644
--- a/setup/db/db/schema-430to440.sql
+++ b/setup/db/db/schema-430to440.sql
@@ -657,6 +657,14 @@ ALTER TABLE `cloud`.`s2s_vpn_gateway` ADD COLUMN `display` tinyint(1) NOT NULL D
 INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (225, UUID(), 9, 'FreeBSD 10 (32-bit)');
 INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (226, UUID(), 9, 'FreeBSD 10 (64-bit)');
 
+CREATE TABLE `cloud`.`op_router_monitoring_services` (
+  `vm_id` bigint unsigned UNIQUE NOT NULL COMMENT 'Primary Key',
+  `router_name` varchar(255) NOT NULL COMMENT 'Name of the Virtual Router',
+  `last_alert_timestamp` varchar(255) NOT NULL COMMENT 'Timestamp of the last alert received from Virtual Router',
+   PRIMARY KEY (`vm_id`),
+   CONSTRAINT `fk_virtual_router__id` FOREIGN KEY `fk_virtual_router__id` (`vm_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE
+) ENGINE = InnoDB DEFAULT CHARSET=utf8
+
 ALTER TABLE `cloud`.`event` ADD COLUMN `display` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'True if the detail can be displayed to the end user';
 
 DROP VIEW IF EXISTS `cloud`.`event_view`;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/systemvm/patches/debian/config/opt/cloud/bin/getRouterAlerts.sh
----------------------------------------------------------------------
diff --git a/systemvm/patches/debian/config/opt/cloud/bin/getRouterAlerts.sh b/systemvm/patches/debian/config/opt/cloud/bin/getRouterAlerts.sh
new file mode 100644
index 0000000..e5e8abe
--- /dev/null
+++ b/systemvm/patches/debian/config/opt/cloud/bin/getRouterAlerts.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# getRouterAlerts.sh  --- Send the alerts from routerServiceMonitor.log to Management Server
+
+source /root/func.sh
+
+lock="biglock"
+locked=$(getLockFile $lock)
+if [ "$locked" != "1" ]
+then
+    exit 1
+fi
+
+#set -x
+
+filename=/var/log/routerServiceMonitor.log #Monitor service log file
+if [ -n "$1" -a -n "$2" ]
+then
+        reqdateval=$(date -d $1 +"%Y%m%d");
+        reqtimeval=$(date -d $2 +"%H%M%S");
+else
+        reqdateval=0
+        reqtimeval=0
+fi
+if [ -f $filename ]
+then
+        while read line
+        do
+        if [ -n "$line" ]; then
+            dateval=`echo $line |awk '{print $1}'`
+            timeval=`echo $line |awk '{print $2}'`
+
+            todate=$(date -d "$dateval" +"%Y%m%d") > /dev/null
+            totime=$(date -d "$timeval" +"%H%M%S") > /dev/null
+            if [ "$todate" -gt "$reqdateval" ] > /dev/null
+            then
+                if [ -n "$alerts" ]; then  alerts="$alerts\n$line"; else alerts="$line"; fi #>> $outputfile
+                elif [ "$todate" -eq "$reqdateval" ] > /dev/null
+                then
+                    if [ "$totime" -gt "$reqtimeval" ] > /dev/null
+                    then
+                        if [ -n "$alerts" ]; then  alerts="$alerts\n$line"; else alerts="$line"; fi #>> $outputfile
+                    fi
+                fi
+            fi
+        done < $filename
+fi
+if [ -n "$alerts" ]; then
+       echo $alerts
+else
+       echo "No Alerts"
+fi
+
+unlock_exit 0 $lock $locked
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/systemvm/patches/debian/config/root/monitorServices.py
----------------------------------------------------------------------
diff --git a/systemvm/patches/debian/config/root/monitorServices.py b/systemvm/patches/debian/config/root/monitorServices.py
index 0319ece..c1dfba2 100755
--- a/systemvm/patches/debian/config/root/monitorServices.py
+++ b/systemvm/patches/debian/config/root/monitorServices.py
@@ -25,6 +25,7 @@ from subprocess import *
 from os import path
 import time
 import os
+import logging
 
 class StatusCodes:
     SUCCESS      = 0
@@ -92,6 +93,8 @@ def raisealert(severity, msg, process_name=None):
     else:
         log = '['+severity+']' + " " + msg +"\n"
 
+    logging.basicConfig(level=logging.INFO,filename='/var/log/routerServiceMonitor.log',format='%(asctime)s %(message)s')
+    logging.info(log)
     msg = 'logger -t monit '+ log
     pout = Popen(msg, shell=True, stdout=PIPE)
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f7337527/test/integration/smoke/test_VirtualRouter_alerts.py
----------------------------------------------------------------------
diff --git a/test/integration/smoke/test_VirtualRouter_alerts.py b/test/integration/smoke/test_VirtualRouter_alerts.py
new file mode 100644
index 0000000..2333d84
--- /dev/null
+++ b/test/integration/smoke/test_VirtualRouter_alerts.py
@@ -0,0 +1,244 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+""" P1 tests for alert receiving from VR on service failure in VR
+"""
+#Import Local Modules
+import marvin
+from marvin.cloudstackTestCase import *
+from marvin.cloudstackAPI import *
+from marvin.integration.lib.utils import *
+from marvin.integration.lib.base import *
+from marvin.integration.lib.common import *
+from nose.plugins.attrib import attr
+import time
+
+
+_multiprocess_shared_ = True
+
+class Services:
+    """Test VM Life Cycle Services
+    """
+
+    def __init__(self):
+        self.services = {
+
+            "account": {
+                "email": "test@test.com",
+                "firstname": "Test",
+                "lastname": "User",
+                "username": "test",
+                # Random characters are appended in create account to
+                # ensure unique username generated each time
+                "password": "password",
+                },
+            "small":
+            # Create a small virtual machine instance with disk offering
+                {
+                    "displayname": "testserver",
+                    "username": "root", # VM creds for SSH
+                    "password": "password",
+                    "ssh_port": 22,
+                    "hypervisor": 'XenServer',
+                    "privateport": 22,
+                    "publicport": 22,
+                    "protocol": 'TCP',
+                    },
+            "service_offerings":
+                {
+                    "small":
+                        {
+                            # Small service offering ID to for change VM
+                            # service offering from medium to small
+                            "name": "SmallInstance",
+                            "displaytext": "SmallInstance",
+                            "cpunumber": 1,
+                            "cpuspeed": 100,
+                            "memory": 256,
+                            },
+                    "big":
+                        {
+                            # Big service offering ID to for change VM
+                            "name": "BigInstance",
+                            "displaytext": "BigInstance",
+                            "cpunumber": 1,
+                            "cpuspeed": 100,
+                            "memory": 512,
+                            }
+                },
+            #Change this
+            "template": {
+                "displaytext": "xs",
+                "name": "xs",
+                "passwordenabled": False,
+                },
+            "sleep": 60,
+            "timeout": 10,
+            #Migrate VM to hostid
+            "ostype": 'CentOS 5.3 (64-bit)',
+            # CentOS 5.3 (64-bit)
+        }
+
+
+class TestVRServiceFailureAlerting(cloudstackTestCase):
+    @classmethod
+    def setUpClass(cls):
+        cls.api_client = super(TestVRServiceFailureAlerting, cls).getClsTestClient().getApiClient()
+        cls.services = Services().services
+
+        # Get Zone, Domain and templates
+        domain = get_domain(cls.api_client, cls.services)
+        cls.zone = get_zone(cls.api_client, cls.services)
+        cls.services['mode'] = cls.zone.networktype
+
+        template = get_template(
+            cls.api_client,
+            cls.zone.id,
+            cls.services["ostype"]
+        )
+        # Set Zones and disk offerings ??
+        cls.services["small"]["zoneid"] = cls.zone.id
+        cls.services["small"]["template"] = template.id
+
+        # Create account, service offerings, vm.
+        cls.account = Account.create(
+            cls.api_client,
+            cls.services["account"],
+            domainid=domain.id
+        )
+
+        cls.small_offering = ServiceOffering.create(
+            cls.api_client,
+            cls.services["service_offerings"]["small"]
+        )
+
+        #create a virtual machine
+        cls.virtual_machine = VirtualMachine.create(
+            cls.api_client,
+            cls.services["small"],
+            accountid=cls.account.name,
+            domainid=cls.account.domainid,
+            serviceofferingid=cls.small_offering.id,
+            mode=cls.services["mode"]
+        )
+        cls._cleanup = [
+            cls.small_offering,
+            cls.account
+        ]
+
+    @classmethod
+    def tearDownClass(cls):
+        cls.api_client = super(TestVRServiceFailureAlerting, cls).getClsTestClient().getApiClient()
+        cleanup_resources(cls.api_client, cls._cleanup)
+        return
+
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.dbclient = self.testClient.getDbConnection()
+        self.cleanup = []
+
+    def tearDown(self):
+        #Clean up, terminate the created ISOs
+        cleanup_resources(self.apiclient, self.cleanup)
+        return
+
+    @attr(hypervisor="xenserver")
+    @attr(tags=["advanced", "basic"])
+    def test_01_VRServiceFailureAlerting(self):
+
+
+        if self.zone.networktype == "Basic":
+            list_router_response = list_routers(
+                self.apiclient,
+                listall="true"
+            )
+        else:
+            list_router_response = list_routers(
+                self.apiclient,
+                account=self.account.name,
+                domainid=self.account.domainid
+            )
+        self.assertEqual(
+            isinstance(list_router_response, list),
+            True,
+            "Check list response returns a valid list"
+        )
+        router = list_router_response[0]
+
+        hosts = list_hosts(
+            self.apiclient,
+            zoneid=router.zoneid,
+            type='Routing',
+            state='Up',
+            id=router.hostid
+        )
+        self.assertEqual(
+            isinstance(hosts, list),
+            True,
+            "Check list host returns a valid list"
+        )
+        host = hosts[0]
+
+        self.debug("Router ID: %s, state: %s" % (router.id, router.state))
+
+        self.assertEqual(
+        router.state,
+        'Running',
+        "Check list router response for router state"
+        )
+
+        alertSubject = "Monitoring Service on VR " + router.name
+
+        if self.apiclient.hypervisor.lower() == 'vmware':
+            result = get_process_status(
+                        self.apiclient.connection.mgtSvr,
+                        22,
+                        self.apiclient.connection.user,
+                        self.apiclient.connection.passwd,
+                        router.linklocalip,
+                        "service dnsmasq status",
+                        hypervisor=self.apiclient.hypervisor
+                        )
+        else:
+            try:
+                host.user, host.passwd = get_host_credentials(self.config, host.ipaddress)
+                result = get_process_status(
+                            host.ipaddress,
+                            22,
+                            host.user,
+                            host.passwd,
+                            router.linklocalip,
+                            "service apache2 stop"
+                            )
+            except KeyError:
+                self.skipTest("Marvin configuration has no host credentials to check router services")
+
+        res = str(result)
+        self.debug("apache process status: %s" % res)
+
+        time.sleep(300) #wait for 5 minutes meanwhile monitor service on VR starts the apache service
+
+        qresultset = self.dbclient.execute(
+            "select id from alert where subject = '%s' ORDER BY id DESC LIMIT 1;" \
+            % str(alertSubject)
+        )
+        self.assertNotEqual(
+            len(qresultset),
+            0,
+            "Check DB Query result set"
+        )
+
+        return


[24/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
1) More fixes for the problems found by findBugs
2) Corrected some logging in  MidoNetPublicNetworkGuru - removed .toString method call on the objects in the log body as toString is called on the object by default when use log4j


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6c23e201
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6c23e201
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6c23e201

Branch: refs/heads/distributedrouter
Commit: 6c23e201ad7423e405a4acfae4e8a08938cefd24
Parents: 90c485e
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Thu Mar 13 14:35:19 2014 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Thu Mar 13 16:05:45 2014 -0700

----------------------------------------------------------------------
 .../cloud/template/VirtualMachineTemplate.java  |  2 +-
 .../src/com/cloud/storage/VMTemplateVO.java     |  2 +-
 .../storage/image/store/TemplateObject.java     |  7 ++---
 .../allocator/AbstractStoragePoolAllocator.java |  3 +-
 .../ClusterScopeStoragePoolAllocator.java       |  5 ++--
 .../storage/image/TemplateEntityImpl.java       |  4 +--
 .../storage/volume/VolumeServiceImpl.java       | 26 ++++++++----------
 .../affinity/ExplicitDedicationProcessor.java   | 11 ++++----
 .../baremetal/manager/BareMetalDiscoverer.java  | 18 +-----------
 .../discoverer/HypervServerDiscoverer.java      | 20 +-------------
 .../kvm/resource/LibvirtComputingResource.java  |  4 +--
 .../kvm/resource/LibvirtXMLParser.java          |  3 +-
 .../resource/SimulatorSecondaryDiscoverer.java  |  5 +---
 .../vmware/VmwareServerDiscoverer.java          | 18 ++++--------
 .../xen/discoverer/XcpServerDiscoverer.java     | 19 ++++---------
 .../xen/resource/CitrixResourceBase.java        |  5 ++--
 .../network/guru/MidoNetPublicNetworkGuru.java  | 29 ++++++++++----------
 .../kvm/discoverer/LibvirtServerDiscoverer.java |  3 --
 .../src/com/cloud/resource/DiscovererBase.java  |  8 ++++--
 19 files changed, 67 insertions(+), 125 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/api/src/com/cloud/template/VirtualMachineTemplate.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/template/VirtualMachineTemplate.java b/api/src/com/cloud/template/VirtualMachineTemplate.java
index 9118bb2..599212b 100755
--- a/api/src/com/cloud/template/VirtualMachineTemplate.java
+++ b/api/src/com/cloud/template/VirtualMachineTemplate.java
@@ -99,5 +99,5 @@ public interface VirtualMachineTemplate extends ControlledEntity, Identity, Inte
 
     Map getDetails();
 
-    Boolean isDynamicallyScalable();
+    boolean isDynamicallyScalable();
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/engine/schema/src/com/cloud/storage/VMTemplateVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/VMTemplateVO.java b/engine/schema/src/com/cloud/storage/VMTemplateVO.java
index e619f68..c0b7d0f 100755
--- a/engine/schema/src/com/cloud/storage/VMTemplateVO.java
+++ b/engine/schema/src/com/cloud/storage/VMTemplateVO.java
@@ -593,7 +593,7 @@ public class VMTemplateVO implements VirtualMachineTemplate {
     }
 
     @Override
-    public Boolean isDynamicallyScalable() {
+    public boolean isDynamicallyScalable() {
         return dynamicallyScalable;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java
index 34db481..bd14df5 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java
@@ -23,8 +23,6 @@ import java.util.Map;
 
 import javax.inject.Inject;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.acl.IAMEntityType;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
@@ -37,6 +35,7 @@ import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 import org.apache.cloudstack.storage.to.TemplateObjectTO;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.to.DataObjectType;
@@ -435,8 +434,8 @@ public class TemplateObject implements TemplateInfo {
     }
 
     @Override
-    public Boolean isDynamicallyScalable() {
-        return Boolean.FALSE;
+    public boolean isDynamicallyScalable() {
+        return false;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/engine/storage/src/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java b/engine/storage/src/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
index aab3876..ddbb5a4 100755
--- a/engine/storage/src/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/allocator/AbstractStoragePoolAllocator.java
@@ -27,12 +27,11 @@ import java.util.Random;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.log4j.Logger;
 
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.dao.ClusterDao;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/engine/storage/src/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java b/engine/storage/src/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java
index af22810..ea084c7 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java
@@ -25,11 +25,10 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
 import com.cloud.deploy.DeploymentPlan;
 import com.cloud.deploy.DeploymentPlanner.ExcludeList;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
index fd90ac9..fde13e1 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
@@ -108,8 +108,8 @@ public class TemplateEntityImpl implements TemplateEntity {
     }
 
     @Override
-    public Boolean isDynamicallyScalable() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public boolean isDynamicallyScalable() {
+        return false;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index d47ee27..1c01401 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -26,9 +26,6 @@ import java.util.Map;
 
 import javax.inject.Inject;
 
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
 import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
@@ -41,7 +38,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService.VolumeApiResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
@@ -61,8 +57,10 @@ import org.apache.cloudstack.storage.command.DeleteCommand;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
-import org.apache.cloudstack.storage.to.VolumeObjectTO;
 import org.apache.cloudstack.storage.to.TemplateObjectTO;
+import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.storage.ListVolumeAnswer;
@@ -75,8 +73,8 @@ import com.cloud.event.EventTypes;
 import com.cloud.event.UsageEventUtils;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.ResourceAllocationException;
-import com.cloud.host.dao.HostDao;
 import com.cloud.host.Host;
+import com.cloud.host.dao.HostDao;
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.ScopeType;
 import com.cloud.storage.StoragePool;
@@ -625,15 +623,15 @@ public class VolumeServiceImpl implements VolumeService {
                     if (templatePoolRef != null) {
                         long templatePoolRefId = templatePoolRef.getId();
                         templatePoolRef = _tmpltPoolDao.acquireInLockTable(templatePoolRefId, 1200);
-                        if (templatePoolRef == null) {
-                            s_logger.warn("Reset Template State On Pool failed - unable to lock TemplatePoolRef " + templatePoolRefId);
-                        }
-
                         try {
-                            templatePoolRef.setDownloadState(VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED);
-                            templatePoolRef.setState(ObjectInDataStoreStateMachine.State.Allocated);
-                            _tmpltPoolDao.update(templatePoolRefId, templatePoolRef);
-                        } finally {
+                            if (templatePoolRef == null) {
+                                s_logger.warn("Reset Template State On Pool failed - unable to lock TemplatePoolRef " + templatePoolRefId);
+                            } else {
+                                templatePoolRef.setDownloadState(VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED);
+                                templatePoolRef.setState(ObjectInDataStoreStateMachine.State.Allocated);
+                                _tmpltPoolDao.update(templatePoolRefId, templatePoolRef);
+                            }
+                        }finally {
                             _tmpltPoolDao.releaseFromLockTable(templatePoolRefId);
                         }
                     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java b/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
index 8c253ee..9aad5f4 100644
--- a/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
+++ b/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
@@ -23,10 +23,9 @@ import java.util.Set;
 import javax.ejb.Local;
 import javax.inject.Inject;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
+import org.apache.log4j.Logger;
 
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.DataCenter;
@@ -120,10 +119,10 @@ public class ExplicitDedicationProcessor extends AffinityProcessorBase implement
                 DataCenterVO zoneOfHost = _dcDao.findById(host.getDataCenterId());
                 if (resourceList != null && resourceList.size() != 0) {
                     for (DedicatedResourceVO resource : resourceList) {
-                        if ((resource.getHostId() != null && resource.getHostId() == plan.getHostId()) ||
-                            (resource.getClusterId() != null && resource.getClusterId() == clusterofHost.getId()) ||
-                            (resource.getPodId() != null && resource.getPodId() == podOfHost.getId()) ||
-                            (resource.getDataCenterId() != null && resource.getDataCenterId() == zoneOfHost.getId())) {
+                        if ((resource.getHostId() != null && resource.getHostId().longValue() == plan.getHostId().longValue()) ||
+                                (resource.getClusterId() != null && resource.getClusterId().longValue() == clusterofHost.getId()) ||
+                                (resource.getPodId() != null && resource.getPodId().longValue() == podOfHost.getId()) ||
+                                (resource.getDataCenterId() != null && resource.getDataCenterId().longValue() == zoneOfHost.getId())) {
                             canUse = true;
                         }
                     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/plugins/hypervisors/baremetal/src/com/cloud/baremetal/manager/BareMetalDiscoverer.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/manager/BareMetalDiscoverer.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/manager/BareMetalDiscoverer.java
index 76897f2..c312df7 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/manager/BareMetalDiscoverer.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/manager/BareMetalDiscoverer.java
@@ -33,10 +33,8 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupRoutingCommand;
@@ -44,18 +42,14 @@ import com.cloud.baremetal.networkservice.BareMetalResourceBase;
 import com.cloud.configuration.Config;
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.dao.ClusterDao;
-import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.exception.DiscoveryException;
 import com.cloud.host.Host;
 import com.cloud.host.HostVO;
-import com.cloud.host.dao.HostDao;
 import com.cloud.hypervisor.Hypervisor;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.network.Network;
 import com.cloud.resource.Discoverer;
 import com.cloud.resource.DiscovererBase;
-import com.cloud.resource.ResourceManager;
 import com.cloud.resource.ResourceStateAdapter;
 import com.cloud.resource.ServerResource;
 import com.cloud.resource.UnableDeleteHostException;
@@ -71,17 +65,7 @@ import com.cloud.vm.dao.VMInstanceDao;
 public class BareMetalDiscoverer extends DiscovererBase implements Discoverer, ResourceStateAdapter {
     protected static final Logger s_logger = Logger.getLogger(BareMetalDiscoverer.class);
     @Inject
-    protected ClusterDao _clusterDao;
-    @Inject
-    protected HostDao _hostDao;
-    @Inject
-    protected DataCenterDao _dcDao;
-    @Inject
     protected VMInstanceDao _vmDao = null;
-    @Inject
-    protected ResourceManager _resourceMgr;
-    @Inject
-    protected ConfigurationDao _configDao;
 
     @Override
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java
index 371a618..c3d79c5 100644
--- a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java
+++ b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java
@@ -43,12 +43,9 @@ import com.cloud.agent.api.SetupCommand;
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupRoutingCommand;
 import com.cloud.alert.AlertManager;
-import com.cloud.dc.ClusterDetailsDao;
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.HostPodVO;
-import com.cloud.dc.dao.ClusterDao;
-import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.HostPodDao;
 import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.ConnectionException;
@@ -58,13 +55,11 @@ import com.cloud.host.Host;
 import com.cloud.host.HostEnvironment;
 import com.cloud.host.HostVO;
 import com.cloud.host.Status;
-import com.cloud.host.dao.HostDao;
 import com.cloud.hypervisor.Hypervisor;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.hypervisor.hyperv.resource.HypervDirectConnectResource;
 import com.cloud.resource.Discoverer;
 import com.cloud.resource.DiscovererBase;
-import com.cloud.resource.ResourceManager;
 import com.cloud.resource.ResourceStateAdapter;
 import com.cloud.resource.ServerResource;
 import com.cloud.resource.UnableDeleteHostException;
@@ -78,27 +73,14 @@ import com.cloud.storage.StorageLayer;
 @Local(value = Discoverer.class)
 public class HypervServerDiscoverer extends DiscovererBase implements Discoverer, Listener, ResourceStateAdapter {
     private static final Logger s_logger = Logger.getLogger(HypervServerDiscoverer.class);
-
-    private String _instance;
-    private String _mountParent;
-    private int _timeout;
     Random _rand = new Random(System.currentTimeMillis());
 
     Map<String, String> _storageMounts = new HashMap<String, String>();
     StorageLayer _storage;
 
     @Inject
-    private HostDao _hostDao = null;
-    @Inject
-    private ClusterDao _clusterDao;
-    @Inject
-    private ClusterDetailsDao _clusterDetailsDao;
-    @Inject
-    private ResourceManager _resourceMgr;
-    @Inject
     private HostPodDao _podDao;
-    @Inject
-    private DataCenterDao _dcDao;
+
 
     // TODO: AgentManager and AlertManager not being used to transmit info,
     // may want to reconsider.

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index 3a5d27c..cdeedfe 100755
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -449,7 +449,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
     protected int _stopTimeout;
 
     // TODO vmsync {
-    protected static HashMap<DomainInfo.DomainState, State> s_statesTable;
+    protected static final HashMap<DomainInfo.DomainState, State> s_statesTable;
     static {
         s_statesTable = new HashMap<DomainInfo.DomainState, State>();
         s_statesTable.put(DomainInfo.DomainState.VIR_DOMAIN_SHUTOFF, State.Stopped);
@@ -461,7 +461,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
     }
     // TODO vmsync }
 
-    protected static HashMap<DomainInfo.DomainState, PowerState> s_powerStatesTable;
+    protected static final HashMap<DomainInfo.DomainState, PowerState> s_powerStatesTable;
     static {
         s_powerStatesTable = new HashMap<DomainInfo.DomainState, PowerState>();
         s_powerStatesTable.put(DomainInfo.DomainState.VIR_DOMAIN_SHUTOFF, PowerState.PowerOff);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtXMLParser.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtXMLParser.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtXMLParser.java
index c8793f1..9d34781 100644
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtXMLParser.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtXMLParser.java
@@ -30,8 +30,7 @@ import org.xml.sax.helpers.DefaultHandler;
 
 public class LibvirtXMLParser extends DefaultHandler {
     private static final Logger s_logger = Logger.getLogger(LibvirtXMLParser.class);
-    protected static SAXParserFactory s_spf;
-
+    protected static final SAXParserFactory s_spf;
     static {
         s_spf = SAXParserFactory.newInstance();
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/plugins/hypervisors/simulator/src/com/cloud/resource/SimulatorSecondaryDiscoverer.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/simulator/src/com/cloud/resource/SimulatorSecondaryDiscoverer.java b/plugins/hypervisors/simulator/src/com/cloud/resource/SimulatorSecondaryDiscoverer.java
index 654eee6..715e9f3 100644
--- a/plugins/hypervisors/simulator/src/com/cloud/resource/SimulatorSecondaryDiscoverer.java
+++ b/plugins/hypervisors/simulator/src/com/cloud/resource/SimulatorSecondaryDiscoverer.java
@@ -25,12 +25,11 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.storage.resource.SecondaryStorageDiscoverer;
 import org.apache.cloudstack.storage.resource.SecondaryStorageResource;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
@@ -55,8 +54,6 @@ public class SimulatorSecondaryDiscoverer extends SecondaryStorageDiscoverer imp
     @Inject
     AgentManager _agentMgr;
     @Inject
-    ResourceManager _resourceMgr;
-    @Inject
     SnapshotDao _snapshotDao;
     @Inject
     ImageStoreDao imageStoreDao;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java
index 5ab5af0..51db0d9 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java
@@ -27,12 +27,8 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-
-import com.vmware.vim25.ClusterDasConfigInfo;
-import com.vmware.vim25.ManagedObjectReference;
-
 import org.apache.cloudstack.api.ApiConstants;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupRoutingCommand;
@@ -42,7 +38,6 @@ import com.cloud.dc.ClusterDetailsDao;
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.DataCenter.NetworkType;
 import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.exception.DiscoveredWithErrorException;
 import com.cloud.exception.DiscoveryException;
 import com.cloud.exception.InvalidParameterValueException;
@@ -69,7 +64,6 @@ import com.cloud.network.element.CiscoNexusVSMElement;
 import com.cloud.network.element.NetworkElement;
 import com.cloud.resource.Discoverer;
 import com.cloud.resource.DiscovererBase;
-import com.cloud.resource.ResourceManager;
 import com.cloud.resource.ResourceStateAdapter;
 import com.cloud.resource.ServerResource;
 import com.cloud.resource.UnableDeleteHostException;
@@ -80,6 +74,8 @@ import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.user.Account;
 import com.cloud.utils.Pair;
 import com.cloud.utils.UriUtils;
+import com.vmware.vim25.ClusterDasConfigInfo;
+import com.vmware.vim25.ManagedObjectReference;
 
 @Local(value = Discoverer.class)
 public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer, ResourceStateAdapter {
@@ -94,13 +90,7 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer
     @Inject
     ClusterDetailsDao _clusterDetailsDao;
     @Inject
-    DataCenterDao _dcDao;
-    @Inject
-    ResourceManager _resourceMgr;
-    @Inject
     CiscoNexusVSMDeviceDao _nexusDao;
-    CiscoNexusVSMElement _nexusElement;
-    List<NetworkElement> networkElements;
     @Inject
     NetworkModel _netmgr;
     @Inject
@@ -113,6 +103,8 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer
     protected Map<String, String> _urlParams;
     protected boolean useDVS = false;
     protected boolean nexusDVS = false;
+    CiscoNexusVSMElement _nexusElement;
+    List<NetworkElement> networkElements;
 
     public VmwareServerDiscoverer() {
         s_logger.info("VmwareServerDiscoverer is constructed");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
index fbfd222..0ad6dc4 100755
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
@@ -34,13 +34,6 @@ import javax.persistence.EntityExistsException;
 import org.apache.log4j.Logger;
 import org.apache.xmlrpc.XmlRpcException;
 
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.Host;
-import com.xensource.xenapi.Pool;
-import com.xensource.xenapi.Session;
-import com.xensource.xenapi.Types.SessionAuthenticationFailed;
-import com.xensource.xenapi.Types.XenAPIException;
-
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
 import com.cloud.agent.api.AgentControlAnswer;
@@ -57,7 +50,6 @@ import com.cloud.configuration.Config;
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.HostPodVO;
-import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.HostPodDao;
 import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.ConnectionException;
@@ -85,7 +77,6 @@ import com.cloud.hypervisor.xen.resource.XenServerConnectionPool;
 import com.cloud.hypervisor.xen.resource.Xenserver625Resource;
 import com.cloud.resource.Discoverer;
 import com.cloud.resource.DiscovererBase;
-import com.cloud.resource.ResourceManager;
 import com.cloud.resource.ResourceStateAdapter;
 import com.cloud.resource.ServerResource;
 import com.cloud.resource.UnableDeleteHostException;
@@ -99,6 +90,12 @@ import com.cloud.utils.db.QueryBuilder;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.exception.HypervisorVersionChangedException;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Host;
+import com.xensource.xenapi.Pool;
+import com.xensource.xenapi.Session;
+import com.xensource.xenapi.Types.SessionAuthenticationFailed;
+import com.xensource.xenapi.Types.XenAPIException;
 
 @Local(value = Discoverer.class)
 public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, Listener, ResourceStateAdapter {
@@ -122,11 +119,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
     @Inject
     VMTemplateDao _tmpltDao;
     @Inject
-    ResourceManager _resourceMgr;
-    @Inject
     HostPodDao _podDao;
-    @Inject
-    DataCenterDao _dcDao;
 
     protected XcpServerDiscoverer() {
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index d80bddc..9103b59 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.hypervisor.xen.resource;
 
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
@@ -329,7 +330,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         }
     }
 
-    protected static HashMap<Types.VmPowerState, PowerState> s_powerStatesTable;
+    protected static final HashMap<Types.VmPowerState, PowerState> s_powerStatesTable;
     static {
         s_powerStatesTable = new HashMap<Types.VmPowerState, PowerState>();
         s_powerStatesTable.put(Types.VmPowerState.HALTED, PowerState.PowerOff);
@@ -340,7 +341,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
     }
 
     // TODO vmsync {
-    protected static HashMap<Types.VmPowerState, State> s_statesTable;
+    protected static final HashMap<Types.VmPowerState, State> s_statesTable;
     static {
         s_statesTable = new HashMap<Types.VmPowerState, State>();
         s_statesTable.put(Types.VmPowerState.HALTED, State.Stopped);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetPublicNetworkGuru.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetPublicNetworkGuru.java b/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetPublicNetworkGuru.java
index d81dc9d..5f0b155 100644
--- a/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetPublicNetworkGuru.java
+++ b/plugins/network-elements/midonet/src/com/cloud/network/guru/MidoNetPublicNetworkGuru.java
@@ -72,7 +72,7 @@ public class MidoNetPublicNetworkGuru extends PublicNetworkGuru {
     // Only change is to make broadcast domain type Mido
     @Override
     public Network design(NetworkOffering offering, DeploymentPlan plan, Network network, Account owner) {
-        s_logger.debug("design called with network: " + network.toString());
+        s_logger.debug("design called with network: " + network);
         if (!canHandle(offering)) {
             return null;
         }
@@ -96,7 +96,7 @@ public class MidoNetPublicNetworkGuru extends PublicNetworkGuru {
         InsufficientAddressCapacityException, ConcurrentOperationException {
         if (nic.getIp4Address() == null) {
             PublicIp ip = _ipAddrMgr.assignPublicIpAddress(dc.getId(), null, vm.getOwner(), Vlan.VlanType.VirtualNetwork, null, null, false);
-            nic.setIp4Address(ip.getAddress().toString());
+            nic.setIp4Address(ip.getAddress().addr());
 
             nic.setGateway(ip.getGateway());
 
@@ -121,7 +121,7 @@ public class MidoNetPublicNetworkGuru extends PublicNetworkGuru {
 
     @Override
     public void updateNicProfile(NicProfile profile, Network network) {
-        s_logger.debug("updateNicProfile called with network: " + network.toString() + " profile: " + profile.toString());
+        s_logger.debug("updateNicProfile called with network: " + network + " profile: " + profile);
 
         DataCenter dc = _dcDao.findById(network.getDataCenterId());
         if (profile != null) {
@@ -134,17 +134,16 @@ public class MidoNetPublicNetworkGuru extends PublicNetworkGuru {
     public NicProfile allocate(Network network, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException,
         InsufficientAddressCapacityException, ConcurrentOperationException {
 
-        s_logger.debug("allocate called with network: " + network.toString() + " nic: " + nic.toString() + " vm: " + vm.toString());
+        if (nic == null) {
+            nic = new NicProfile(Nic.ReservationStrategy.Create, null, null, null, null);
+        }
+        s_logger.debug("allocate called with network: " + network + " nic: " + nic + " vm: " + vm);
         DataCenter dc = _dcDao.findById(network.getDataCenterId());
 
-        if (nic != null && nic.getRequestedIpv4() != null) {
+        if (nic.getRequestedIpv4() != null) {
             throw new CloudRuntimeException("Does not support custom ip allocation at this time: " + nic);
         }
 
-        if (nic == null) {
-            nic = new NicProfile(Nic.ReservationStrategy.Create, null, null, null, null);
-        }
-
         getIp(nic, dc, vm, network);
 
         if (nic.getIp4Address() == null) {
@@ -163,7 +162,7 @@ public class MidoNetPublicNetworkGuru extends PublicNetworkGuru {
     @Override
     public void reserve(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
         throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException {
-        s_logger.debug("reserve called with network: " + network.toString() + " nic: " + nic.toString() + " vm: " + vm.toString());
+        s_logger.debug("reserve called with network: " + network + " nic: " + nic + " vm: " + vm);
         if (nic.getIp4Address() == null) {
             getIp(nic, dest.getDataCenter(), vm, network);
         }
@@ -171,14 +170,14 @@ public class MidoNetPublicNetworkGuru extends PublicNetworkGuru {
 
     @Override
     public boolean release(NicProfile nic, VirtualMachineProfile vm, String reservationId) {
-        s_logger.debug("release called with nic: " + nic.toString() + " vm: " + vm.toString());
+        s_logger.debug("release called with nic: " + nic + " vm: " + vm);
         return true;
     }
 
     @Override
     public Network implement(Network network, NetworkOffering offering, DeployDestination destination, ReservationContext context)
         throws InsufficientVirtualNetworkCapcityException {
-        s_logger.debug("implement called with network: " + network.toString());
+        s_logger.debug("implement called with network: " + network);
         long dcId = destination.getDataCenter().getId();
 
         //get physical network id
@@ -205,7 +204,7 @@ public class MidoNetPublicNetworkGuru extends PublicNetworkGuru {
     @Override
     @DB
     public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm) {
-        s_logger.debug("deallocate called with network: " + network.toString() + " nic: " + nic.toString() + " vm: " + vm.toString());
+        s_logger.debug("deallocate called with network: " + network + " nic: " + nic + " vm: " + vm);
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("public network deallocate network: networkId: " + nic.getNetworkId() + ", ip: " + nic.getIp4Address());
         }
@@ -229,12 +228,12 @@ public class MidoNetPublicNetworkGuru extends PublicNetworkGuru {
 
     @Override
     public void shutdown(NetworkProfile network, NetworkOffering offering) {
-        s_logger.debug("shutdown called with network: " + network.toString());
+        s_logger.debug("shutdown called with network: " + network);
     }
 
     @Override
     public boolean trash(Network network, NetworkOffering offering) {
-        s_logger.debug("trash called with network: " + network.toString());
+        s_logger.debug("trash called with network: " + network);
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/server/src/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java b/server/src/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java
index 770099c..d127256 100644
--- a/server/src/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java
+++ b/server/src/com/cloud/hypervisor/kvm/discoverer/LibvirtServerDiscoverer.java
@@ -51,7 +51,6 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.network.PhysicalNetworkSetupInfo;
 import com.cloud.resource.Discoverer;
 import com.cloud.resource.DiscovererBase;
-import com.cloud.resource.ResourceManager;
 import com.cloud.resource.ResourceStateAdapter;
 import com.cloud.resource.ServerResource;
 import com.cloud.resource.UnableDeleteHostException;
@@ -65,8 +64,6 @@ public abstract class LibvirtServerDiscoverer extends DiscovererBase implements
     private String _kvmPublicNic;
     private String _kvmGuestNic;
     @Inject
-    ResourceManager _resourceMgr;
-    @Inject
     AgentManager _agentMgr;
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6c23e201/server/src/com/cloud/resource/DiscovererBase.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/resource/DiscovererBase.java b/server/src/com/cloud/resource/DiscovererBase.java
index 0da72c0..ae2a9c9 100644
--- a/server/src/com/cloud/resource/DiscovererBase.java
+++ b/server/src/com/cloud/resource/DiscovererBase.java
@@ -25,13 +25,13 @@ import java.util.Map;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.log4j.Logger;
 
 import com.cloud.configuration.Config;
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.dao.ClusterDao;
+import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
 import com.cloud.network.NetworkModel;
@@ -49,6 +49,10 @@ public abstract class DiscovererBase extends AdapterBase implements Discoverer {
     protected NetworkModel _networkMgr;
     @Inject
     protected HostDao _hostDao;
+    @Inject
+    protected ResourceManager _resourceMgr;
+    @Inject
+    protected DataCenterDao _dcDao;
 
     @Override
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {


[49/54] [abbrv] git commit: updated refs/heads/distributedrouter to 42b553e

Posted by mu...@apache.org.
some bug fixes


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/eeec82b4
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/eeec82b4
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/eeec82b4

Branch: refs/heads/distributedrouter
Commit: eeec82b4b35f06678ee9d567f682d8aff1bf7c4f
Parents: 8dcce6a
Author: Murali Reddy <mu...@gmail.com>
Authored: Mon Mar 10 22:16:46 2014 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Fri Mar 14 15:58:20 2014 +0530

----------------------------------------------------------------------
 .../xen/resource/CitrixResourceBase.java        |  14 ++-
 .../api/OvsVpcLogicalTopologyConfigCommand.java |  33 +++++
 .../OvsVpcPhysicalTopologyConfigCommand.java    |   7 +-
 .../com/cloud/network/element/OvsElement.java   |  18 ---
 .../cloud/network/guru/OvsGuestNetworkGuru.java |   2 +-
 .../network/ovs/OvsNetworkTopologyGuru.java     |  10 ++
 .../network/ovs/OvsNetworkTopologyGuruImpl.java | 126 ++++++++++++++++++-
 .../cloud/network/ovs/OvsTunnelManagerImpl.java | 125 ++++++++++++------
 .../xenserver/cloudstack_pluginlib.py           |   4 +-
 scripts/vm/hypervisor/xenserver/ovstunnel       |  14 +--
 .../network/guru/ExternalGuestNetworkGuru.java  |   4 +
 11 files changed, 279 insertions(+), 78 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eeec82b4/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 3e7dfaf..8752921 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -999,7 +999,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
     /**
      * This method creates a XenServer network and configures it for being used as a L2-in-L3 tunneled network
      */
-    private synchronized Network configureTunnelNetwork(Connection conn, long networkId, long hostId, String bridgeName) {
+    private synchronized Network configureTunnelNetwork(Connection conn, Long networkId, long hostId, String bridgeName) {
         try {
             Network nw = findOrCreateTunnelNetwork(conn, bridgeName);
             String nwName = bridgeName;
@@ -1038,7 +1038,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                 String[] res = result.split(":");
                 if (res.length != 2 || !res[0].equalsIgnoreCase("SUCCESS")) {
                     //TODO: Should make this error not fatal?
-                    throw new CloudRuntimeException("Unable to pre-configure OVS bridge " + bridge + " for network ID:" + networkId + " - " + res);
+                    throw new CloudRuntimeException("Unable to pre-configure OVS bridge " + bridge );
                 }
             }
             return nw;
@@ -1090,7 +1090,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
                 _isOvs = true;
                 return setupvSwitchNetwork(conn);
             } else {
-                return findOrCreateTunnelNetwork(conn, getOvsTunnelNetworkName(BroadcastDomainType.getValue(uri)));
+                return findOrCreateTunnelNetwork(conn, getOvsTunnelNetworkName(uri.getAuthority()));
             }
         } else if (type == BroadcastDomainType.Storage) {
             if (uri == null) {
@@ -1114,7 +1114,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
     private String getOvsTunnelNetworkName(String broadcastUri) {
         if (broadcastUri.contains(".")) {
-            String[] parts = broadcastUri.split(".");
+            String[] parts = broadcastUri.split("\\.");
             return "OVS-DR-VPC-Bridge"+parts[0];
          } else {
             try {
@@ -5266,7 +5266,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             }
 
             String bridge = nw.getBridge(conn);
-            String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge", bridge, "in_port", cmd.getInPortName());
+            String result = callHostPlugin(conn, "ovstunnel", "destroy_tunnel", "bridge", bridge, "in_port", cmd.getInPortName());
+
             if (result.equalsIgnoreCase("SUCCESS")) {
                 return new Answer(cmd, true, result);
             } else {
@@ -5282,7 +5283,8 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
         Connection conn = getConnection();
         try {
             String result = callHostPlugin(conn, "ovstunnel", "configure_ovs_bridge_for_network_topology", "bridge",
-                    cmd.getBridgeName(), "host-id", ((Long)cmd.getHostId()).toString());
+                    cmd.getBridgeName(), "host-id", ((Long)cmd.getHostId()).toString(), "config",
+                    cmd.getjsonVpcConfig());
             if (result.equalsIgnoreCase("SUCCESS")) {
                 return new Answer(cmd, true, result);
             } else {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eeec82b4/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcLogicalTopologyConfigCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcLogicalTopologyConfigCommand.java b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcLogicalTopologyConfigCommand.java
new file mode 100644
index 0000000..2fafb6e
--- /dev/null
+++ b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcLogicalTopologyConfigCommand.java
@@ -0,0 +1,33 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.agent.api;
+
+/**
+ * This command represents view of how a VPC is laid out (on which hosts, which VM is on which host etc)
+ * on the physical infrastructure.
+ */
+public class OvsVpcLogicalTopologyConfigCommand extends Command {
+
+    public OvsVpcLogicalTopologyConfigCommand() {
+
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eeec82b4/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
index 35d4c6e..e6f4383 100644
--- a/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
+++ b/plugins/network-elements/ovs/src/com/cloud/agent/api/OvsVpcPhysicalTopologyConfigCommand.java
@@ -20,8 +20,11 @@ import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 
 /**
- * This command represents view of how a VPC is laid out (on which hosts, which VM is on which host etc)
- * on the physical infrastructure.
+ * This command represents physical view of how a VPC is laid out on the physical infrastructure.
+ *   - on which hypervisor hosts VPC spans (host is running in at least one VM from the VPC)
+ *   - information of tiers, so we can figure how one VM can talk to a different VM in same tier or different tier
+ *   - information on all the VM's in the VPC.
+ *   - information of NIC's of each VM in the VPC
  */
 public class OvsVpcPhysicalTopologyConfigCommand extends Command {
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eeec82b4/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java b/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
index c28d908..036c319 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/element/OvsElement.java
@@ -75,7 +75,6 @@ import com.cloud.vm.NicProfile;
 import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.dao.DomainRouterDao;
-import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VirtualMachine;
 
 @Local(value = {NetworkElement.class, ConnectivityProvider.class,
@@ -205,23 +204,6 @@ StaticNatServiceProvider, IpDeployer {
             return false;
         }
 
-        List<UserVmVO> userVms = _userVmDao.listByAccountIdAndHostId(vm.getVirtualMachine().getAccountId(),
-                vm.getVirtualMachine().getHostId());
-        if (vm.getType() == VirtualMachine.Type.User) {
-            if (userVms.size() > 1) {
-                return true;
-            }
-
-            List<DomainRouterVO> routers = _routerDao.findByNetwork(network.getId());
-            for (DomainRouterVO router : routers) {
-                if (router.getHostId().equals(vm.getVirtualMachine().getHostId())) {
-                    return true;
-                }
-            }
-        } else if (vm.getType() == VirtualMachine.Type.DomainRouter && userVms.size() != 0) {
-            return true;
-        }
-
         HostVO host = _hostDao.findById(vm.getVirtualMachine().getHostId());
         _ovsTunnelMgr.checkAndRemoveHostFromTunnelNetwork(network, host);
         return true;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eeec82b4/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java b/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
index 2814c2a..9d2efe6 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/guru/OvsGuestNetworkGuru.java
@@ -154,7 +154,7 @@ public class OvsGuestNetworkGuru extends GuestNetworkGuru {
         if (network.getVpcId() != null && isVpcEnabledForDistributedRouter(network.getVpcId())) {
             String keyStr = BroadcastDomainType.getValue(implemented.getBroadcastUri());
             Long vpcid= network.getVpcId();
-            implemented.setBroadcastUri(BroadcastDomainType.Vswitch.toUri(vpcid.toString()+keyStr));
+            implemented.setBroadcastUri(BroadcastDomainType.Vswitch.toUri(vpcid.toString() + "." + keyStr));
         }
 
         return implemented;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eeec82b4/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
index c410d10..122175c 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuru.java
@@ -38,6 +38,11 @@ public interface OvsNetworkTopologyGuru extends Manager {
     public  List<Long> getVpcOnHost(long hostId);
 
     /**
+     * get the list of all active Vm id's in a network
+     */
+    public List<Long> getAllActiveVmsInNetwork(long networkId);
+
+    /**
      * get the list of all active Vm id's in the VPC for all ther tiers
      */
     public List<Long> getAllActiveVmsInVpc(long vpcId);
@@ -46,4 +51,9 @@ public interface OvsNetworkTopologyGuru extends Manager {
      * get the list of all Vm id's in the VPC for all the tiers that are running on the host
      */
     public List<Long> getActiveVmsInVpcOnHost(long vpcId, long hostId);
+
+    /**
+     * get the list of all Vm id's in the network that are running on the host
+     */
+    public List<Long> getActiveVmsInNetworkOnHost(long vpcId, long hostId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eeec82b4/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
index 7560e35..7715641 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsNetworkTopologyGuruImpl.java
@@ -1,14 +1,24 @@
 package com.cloud.network.ovs;
 
+import com.cloud.network.Network;
+import com.cloud.network.Networks;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.vpc.VpcManager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.Nic;
 import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.NicDao;
 import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.dao.VMInstanceDao;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import javax.ejb.Local;
 import javax.inject.Inject;
 import org.springframework.stereotype.Component;
@@ -21,6 +31,14 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
     UserVmDao _userVmDao;
     @Inject
     DomainRouterDao _routerDao;
+    @Inject
+    VpcManager _vpcMgr;
+    @Inject
+    VMInstanceDao _vmInstanceDao;
+    @Inject
+    NicDao _nicDao;
+    @Inject
+    NetworkDao _networkDao;
 
     /**
      * get the list of hypervisor hosts on which VM's belonging to a network currently spans
@@ -52,23 +70,121 @@ public class OvsNetworkTopologyGuruImpl extends ManagerBase implements OvsNetwor
         return  hostIds;
     }
 
+    /**
+     * get the list of hypervisor hosts on which VM's belonging to a VPC currently spans
+     */
     @Override
-    public List<Long> getVpcSpannedHosts(long vpId) {
-        return null;
+    public List<Long> getVpcSpannedHosts(long vpcId) {
+        List<? extends Network> vpcNetworks =  _vpcMgr.getVpcNetworks(vpcId);
+        List<Long> vpcHostIds = new ArrayList<>();
+        for (Network vpcNetwork : vpcNetworks) {
+            List<Long> networkHostIds = new ArrayList<Long>();
+            networkHostIds = getNetworkSpanedHosts(vpcNetwork.getId());
+            if (networkHostIds != null && !networkHostIds.isEmpty()) {
+                for (Long hostId : networkHostIds) {
+                    if (!vpcHostIds.contains(hostId)) {
+                        vpcHostIds.add(hostId);
+                    }
+                }
+            }
+        }
+        return vpcHostIds;
     }
 
     @Override
     public List<Long> getVpcOnHost(long hostId) {
-        return null;
+        List<Long> vpcIds = new ArrayList<>();
+        List<VMInstanceVO> vmInstances = _vmInstanceDao.listByHostId(hostId);
+        for (VMInstanceVO instance : vmInstances) {
+            List<NicVO> nics = _nicDao.listByVmId(instance.getId());
+            for (Nic nic: nics) {
+                Network network = _networkDao.findById(nic.getNetworkId());
+                if (network.getTrafficType() == Networks.TrafficType.Guest && network.getVpcId() != null) {
+                    if (!vpcIds.contains(network.getVpcId())) {
+                        vpcIds.add(network.getVpcId());
+                    }
+                }
+            }
+        }
+        return vpcIds;
+    }
+
+    @Override
+    public List<Long> getAllActiveVmsInNetwork(long networkId) {
+        List <Long> vmIds = new ArrayList<>();
+        List<UserVmVO> vms = _userVmDao.listByNetworkIdAndStates(networkId,
+                VirtualMachine.State.Running, VirtualMachine.State.Starting, VirtualMachine.State.Stopping, VirtualMachine.State.Unknown,
+                VirtualMachine.State.Migrating);
+        // Find routers for the network
+        List<DomainRouterVO> routers = _routerDao.findByNetwork(networkId);
+        List<VMInstanceVO> ins = new ArrayList<VMInstanceVO>();
+
+        if (vms != null) {
+            for (UserVmVO vm : vms) {
+                vmIds.add(vm.getId());
+            }
+        }
+        if (routers.size() != 0) {
+            for (DomainRouterVO router: routers) {
+                vmIds.add(router.getId());
+            }
+        }
+        return  vmIds;
     }
 
     @Override
     public List<Long> getAllActiveVmsInVpc(long vpcId) {
-        return null;
+
+        Set<Long> vmIdsSet = new HashSet<>();
+        List<? extends Network> vpcNetworks =  _vpcMgr.getVpcNetworks(vpcId);
+        for (Network network : vpcNetworks) {
+            List<Long> networkVmIds = getAllActiveVmsInNetwork(network.getId());
+            if (networkVmIds  != null && !networkVmIds.isEmpty()) {
+                vmIdsSet.addAll(networkVmIds);
+            }
+        }
+        List<Long> vmIds = new ArrayList<>();
+        vmIds.addAll(vmIdsSet);
+        return vmIds;
     }
 
     @Override
     public List<Long> getActiveVmsInVpcOnHost(long vpcId, long hostId) {
-        return null;
+        Set<Long> vmIdsSet = new HashSet<>();
+        List<? extends Network> vpcNetworks =  _vpcMgr.getVpcNetworks(vpcId);
+        for (Network network : vpcNetworks) {
+            List<Long> networkVmIds = getActiveVmsInNetworkOnHost(network.getId(), hostId);
+            if (networkVmIds  != null && !networkVmIds.isEmpty()) {
+                vmIdsSet.addAll(networkVmIds);
+            }
+        }
+        List<Long> vmIds = new ArrayList<>();
+        vmIds.addAll(vmIdsSet);
+        return vmIds;
+    }
+
+    @Override
+    public List<Long> getActiveVmsInNetworkOnHost(long networkId, long hostId) {
+        List <Long> vmIds = new ArrayList<>();
+        List<UserVmVO> vms = _userVmDao.listByNetworkIdAndStates(networkId,
+                VirtualMachine.State.Running, VirtualMachine.State.Starting, VirtualMachine.State.Stopping, VirtualMachine.State.Unknown,
+                VirtualMachine.State.Migrating);
+        // Find routers for the network
+        List<DomainRouterVO> routers = _routerDao.findByNetwork(networkId);
+        List<VMInstanceVO> ins = new ArrayList<VMInstanceVO>();
+
+        if (vms != null) {
+            for (UserVmVO vm : vms) {
+                if (vm.getHostId() == hostId)
+                    vmIds.add(vm.getId());
+            }
+        }
+        if (routers.size() != 0) {
+            for (DomainRouterVO router: routers) {
+                if (router.getHostId() == hostId)
+                    vmIds.add(router.getId());
+            }
+        }
+        return  vmIds;
     }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eeec82b4/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
index ae37095..82dbfed 100644
--- a/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
+++ b/plugins/network-elements/ovs/src/com/cloud/network/ovs/OvsTunnelManagerImpl.java
@@ -18,10 +18,10 @@ package com.cloud.network.ovs;
 
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.vpc.VpcManager;
+import com.cloud.vm.dao.VMInstanceDao;
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.VirtualMachine;
-import com.cloud.vm.dao.VMInstanceDao;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -260,9 +260,9 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
         int key = 0;
         try {
             //The GRE key is actually in the host part of the URI
-            String keyStr = BroadcastDomainType.getValue(network.getBroadcastUri());
+            String keyStr = network.getBroadcastUri().getAuthority();
             if (keyStr.contains(".")) {
-                String[] parts = keyStr.split(".");
+                String[] parts = keyStr.split("\\.");
                 key = Integer.parseInt(parts[1]);
             } else {
                 key = Integer.parseInt(keyStr);
@@ -445,34 +445,72 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
     @Override
     public void checkAndRemoveHostFromTunnelNetwork(Network nw, Host host) {
 
-        try {
-            /* Now we are last one on host, destroy the bridge with all
-             * the tunnels for this network  */
-            int key = getGreKey(nw);
-            String bridgeName = generateBridgeName(nw, key);
-            Command cmd = new OvsDestroyBridgeCommand(nw.getId(), bridgeName);
-            s_logger.debug("Destroying bridge for network " + nw.getId() + " on host:" + host.getId());
-            Answer ans = _agentMgr.send(host.getId(), cmd);
-            handleDestroyBridgeAnswer(ans, host.getId(), nw.getId());
-
-            /* Then ask hosts have peer tunnel with me to destroy them */
-            List<OvsTunnelNetworkVO> peers =
-                    _tunnelNetworkDao.listByToNetwork(host.getId(),
-                            nw.getId());
-            for (OvsTunnelNetworkVO p : peers) {
-                // If the tunnel was not successfully created don't bother to remove it
-                if (p.getState().equals(OvsTunnel.State.Established.name())) {
-                    cmd = new OvsDestroyTunnelCommand(p.getNetworkId(), bridgeName,
-                            p.getPortName());
-                    s_logger.debug("Destroying tunnel to " + host.getId() +
-                            " from " + p.getFrom());
-                    ans = _agentMgr.send(p.getFrom(), cmd);
-                    handleDestroyTunnelAnswer(ans, p.getFrom(),
-                            p.getTo(), p.getNetworkId());
+        if (nw.getVpcId() != null && isVpcEnabledForDistributedRouter(nw.getVpcId())) {
+            List<Long> vmIds = _ovsNetworkToplogyGuru.getActiveVmsInVpcOnHost(nw.getVpcId(), host.getId());
+            if (vmIds != null && !vmIds.isEmpty()) {
+                return;
+            }
+            List<? extends Network> vpcNetworks =  _vpcMgr.getVpcNetworks(nw.getVpcId());
+            try {
+                for (Network network: vpcNetworks) {
+                    int key = getGreKey(nw);
+                    String bridgeName = generateBridgeName(nw, key);
+                    /* Then ask hosts have peer tunnel with me to destroy them */
+                    List<OvsTunnelNetworkVO> peers = _tunnelNetworkDao.listByToNetwork(host.getId(),nw.getId());
+                    for (OvsTunnelNetworkVO p : peers) {
+                        // If the tunnel was not successfully created don't bother to remove it
+                        if (p.getState().equals(OvsTunnel.State.Established.name())) {
+                            Command cmd= new OvsDestroyTunnelCommand(p.getNetworkId(), bridgeName,
+                                    p.getPortName());
+                            s_logger.debug("Destroying tunnel to " + host.getId() +
+                                    " from " + p.getFrom());
+                            Answer ans = _agentMgr.send(p.getFrom(), cmd);
+                            handleDestroyTunnelAnswer(ans, p.getFrom(), p.getTo(), p.getNetworkId());
+                        }
+                    }
                 }
+
+                Command cmd = new OvsDestroyBridgeCommand(nw.getId(), generateBridgeNameForVpc(nw.getVpcId()));
+                s_logger.debug("Destroying bridge for network " + nw.getId() + " on host:" + host.getId());
+                Answer ans = _agentMgr.send(host.getId(), cmd);
+                handleDestroyBridgeAnswer(ans, host.getId(), nw.getId());
+            } catch (Exception e) {
+
+            }
+        } else {
+            List<Long> vmIds = _ovsNetworkToplogyGuru.getActiveVmsInNetworkOnHost(nw.getId(), host.getId());
+            if (vmIds != null && !vmIds.isEmpty()) {
+                return;
+            }
+            try {
+                /* Now we are last one on host, destroy the bridge with all
+                * the tunnels for this network  */
+                int key = getGreKey(nw);
+                String bridgeName = generateBridgeName(nw, key);
+                Command cmd = new OvsDestroyBridgeCommand(nw.getId(), bridgeName);
+                s_logger.debug("Destroying bridge for network " + nw.getId() + " on host:" + host.getId());
+                Answer ans = _agentMgr.send(host.getId(), cmd);
+                handleDestroyBridgeAnswer(ans, host.getId(), nw.getId());
+
+                /* Then ask hosts have peer tunnel with me to destroy them */
+                List<OvsTunnelNetworkVO> peers =
+                        _tunnelNetworkDao.listByToNetwork(host.getId(),
+                                nw.getId());
+                for (OvsTunnelNetworkVO p : peers) {
+                    // If the tunnel was not successfully created don't bother to remove it
+                    if (p.getState().equals(OvsTunnel.State.Established.name())) {
+                        cmd = new OvsDestroyTunnelCommand(p.getNetworkId(), bridgeName,
+                                p.getPortName());
+                        s_logger.debug("Destroying tunnel to " + host.getId() +
+                                " from " + p.getFrom());
+                        ans = _agentMgr.send(p.getFrom(), cmd);
+                        handleDestroyTunnelAnswer(ans, p.getFrom(),
+                                p.getTo(), p.getNetworkId());
+                    }
+                }
+            } catch (Exception e) {
+                s_logger.warn(String.format("Destroy tunnel failed", e));
             }
-        } catch (Exception e) {
-            s_logger.warn(String.format("Destroy tunnel failed", e));
         }
     }
 
@@ -514,9 +552,9 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
         List<Long> hostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
         List<Long> vmIds = _ovsNetworkToplogyGuru.getAllActiveVmsInVpc(vpcId);
 
-        List<OvsVpcPhysicalTopologyConfigCommand.Host> hosts = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Host>();
-        List<OvsVpcPhysicalTopologyConfigCommand.Tier> tiers = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Tier>();
-        List<OvsVpcPhysicalTopologyConfigCommand.Vm> vms = new ArrayList<OvsVpcPhysicalTopologyConfigCommand.Vm>();
+        List<OvsVpcPhysicalTopologyConfigCommand.Host> hosts = new ArrayList<>();
+        List<OvsVpcPhysicalTopologyConfigCommand.Tier> tiers = new ArrayList<>();
+        List<OvsVpcPhysicalTopologyConfigCommand.Vm> vms = new ArrayList<>();
 
         for (Long hostId : hostIds) {
             HostVO hostDetails = _hostDao.findById(hostId);
@@ -533,10 +571,10 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
         }
 
         for (Network network: vpcNetworks) {
-            String key = BroadcastDomainType.getValue(network.getBroadcastUri());
+            String key = network.getBroadcastUri().getAuthority();
             long gre_key;
             if (key.contains(".")) {
-                String[] parts = key.split(".");
+                String[] parts = key.split("\\.");
                 gre_key = Long.parseLong(parts[1]);
             } else {
                 try {
@@ -580,6 +618,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
         List<? extends Network> vpcNetworks =  _vpcMgr.getVpcNetworks(vpcId);
         List<Long> vpcSpannedHostIds = _ovsNetworkToplogyGuru.getVpcSpannedHosts(vpcId);
         String bridgeName=generateBridgeNameForVpc(vpcId);
+        boolean bridgeNotSetup = true;
 
         for (Network vpcNetwork: vpcNetworks) {
             int key = getGreKey(vpcNetwork);
@@ -643,7 +682,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                             + " to create gre tunnel to " + i);
                     Answer[] answers = _agentMgr.send(hostId, cmds);
                     handleCreateTunnelAnswer(answers);
-                    noHost = false;
+                    bridgeNotSetup = false;
                 }
 
                 for (Long i : fromHostIds) {
@@ -656,7 +695,7 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
                             + hostId);
                     Answer[] answers = _agentMgr.send(i, cmds);
                     handleCreateTunnelAnswer(answers);
-                    noHost = false;
+                    bridgeNotSetup = false;
                 }
             } catch (GreTunnelException | OperationTimedoutException | AgentUnavailableException e) {
                 // I really thing we should do a better handling of these exceptions
@@ -664,6 +703,20 @@ public class OvsTunnelManagerImpl extends ManagerBase implements OvsTunnelManage
             }
         }
 
+        // If no tunnels have been configured, perform the bridge setup
+        // anyway. This will ensure VIF rules will be triggered
+        if (bridgeNotSetup) {
+            try {
+                Commands cmds = new Commands(new OvsSetupBridgeCommand(bridgeName, hostId, null));
+                s_logger.debug("Ask host " + hostId + " to configure bridge for vpc");
+                Answer[] answers = _agentMgr.send(hostId, cmds);
+                handleSetupBridgeAnswer(answers);
+            } catch (OperationTimedoutException | AgentUnavailableException e) {
+                // I really thing we should do a better handling of these exceptions
+                s_logger.warn("Ovs Tunnel network created tunnel failed", e);
+            }
+        }
+
         OvsVpcPhysicalTopologyConfigCommand topologyConfigCommand = prepareVpcTopologyUpdate(vpcId);
         for (Long id: vpcSpannedHostIds) {
             if (!sendVpcTopologyChangeUpdate(topologyConfigCommand, id, bridgeName)) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eeec82b4/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
index d2b95dc..dbcc288 100644
--- a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
+++ b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py
@@ -21,7 +21,7 @@ import ConfigParser
 import logging
 import os
 import subprocess
-import json
+import simplejson as json
 
 from time import localtime, asctime
 
@@ -181,7 +181,7 @@ def _build_flow_expr(**kwargs):
     proto = 'proto' in kwargs and ",%s" % kwargs['proto'] or ''
     ip = ('nw_src' in kwargs or 'nw_dst' in kwargs) and ',ip' or ''
     flow = (flow + in_port + dl_type + dl_src + dl_dst +
-            (ip or proto) + nw_src + nw_dst)
+            (ip or proto) + nw_src + nw_dst + table)
     return flow
 
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eeec82b4/scripts/vm/hypervisor/xenserver/ovstunnel
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/ovstunnel b/scripts/vm/hypervisor/xenserver/ovstunnel
index 64a2d36..9ef0f7b 100755
--- a/scripts/vm/hypervisor/xenserver/ovstunnel
+++ b/scripts/vm/hypervisor/xenserver/ovstunnel
@@ -137,8 +137,8 @@ def setup_ovs_bridge_for_distributed_routing(session, args):
 
     logging.debug("About to manually create the bridge:%s" % bridge)
     # create a bridge with the same name as the xapi network
-    res = lib.do_cmd([lib.VSCTL_PATH, "--", "--may-exist", "add-br", bridge,
-                                     "--", "set", "bridge", bridge])
+    res = lib.do_cmd([lib.VSCTL_PATH, "--", "--may-exist", "add-br", bridge])
+
     logging.debug("Bridge has been manually created:%s" % res)
     # TODO: Make sure xs-network-uuid is set into external_ids
     lib.do_cmd([lib.VSCTL_PATH, "set", "Bridge", bridge,
@@ -149,12 +149,8 @@ def setup_ovs_bridge_for_distributed_routing(session, args):
         result = "FAILURE:%s" % res
     else:
         # Verify the bridge actually exists, with the gre_key properly set
-        res = lib.do_cmd([lib.VSCTL_PATH, "get", "bridge",
-                                          bridge, "other_config:gre_key"])
-        if key in res:
-            result = "SUCCESS:%s" % bridge
-        else:
-            result = "FAILURE:%s" % res
+        res = lib.do_cmd([lib.VSCTL_PATH, "list", "bridge", bridge])
+
         # Finally note in the xenapi network object that the network has
         # been configured
         xs_nw_uuid = lib.do_cmd([lib.XE_PATH, "network-list",
@@ -191,6 +187,8 @@ def setup_ovs_bridge_for_distributed_routing(session, args):
         # add a default rule in egress table to forward packet to L3 lookup table
         lib.add_flow(bridge, priority=0, table=5, actions='drop')
 
+        result = "SUCCESS: successfully setup bridge with flow rules"
+
     logging.debug("Setup_ovs_bridge completed with result:%s" % result)
     return result
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/eeec82b4/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
index 414eb7b..13246a7 100644
--- a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
@@ -107,6 +107,10 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru {
     @Override
     public Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, Account owner) {
 
+        if (_networkModel.areServicesSupportedByNetworkOffering(offering.getId(), Network.Service.Connectivity)) {
+            return null;
+        }
+
         NetworkVO config = (NetworkVO)super.design(offering, plan, userSpecified, owner);
         if (config == null) {
             return null;