VPC: added global configuration for limiting number of networks per vpc 
(vpc.max.networks)

Conflicts:

        server/src/com/cloud/network/vpc/VpcManagerImpl.java


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

Branch: refs/heads/vpc
Commit: 807a9ed2c3d312c2d4e58e7466b7ae60345a0db7
Parents: 1903292
Author: Alena Prokharchyk <[email protected]>
Authored: Thu Jul 26 14:05:56 2012 -0700
Committer: Alena Prokharchyk <[email protected]>
Committed: Fri Jul 27 13:56:25 2012 -0700

----------------------------------------------------------------------
 server/src/com/cloud/configuration/Config.java     |    5 ++-
 server/src/com/cloud/network/dao/NetworkDao.java   |    2 +
 .../src/com/cloud/network/dao/NetworkDaoImpl.java  |   13 +++++++++++
 server/src/com/cloud/network/vpc/VpcManager.java   |    6 ++++-
 .../src/com/cloud/network/vpc/VpcManagerImpl.java  |   17 +++++++++++++-
 5 files changed, 38 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/807a9ed2/server/src/com/cloud/configuration/Config.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/Config.java 
b/server/src/com/cloud/configuration/Config.java
index bac9992..fb52168 100755
--- a/server/src/com/cloud/configuration/Config.java
+++ b/server/src/com/cloud/configuration/Config.java
@@ -341,8 +341,9 @@ public enum Config {
        ConsoleProxyServiceOffering("Advanced", ManagementServer.class, 
Long.class, "consoleproxy.service.offering", null, "Service offering used by 
console proxy; if NULL - system offering will be used", null),
        SecondaryStorageServiceOffering("Advanced", ManagementServer.class, 
Long.class, "secstorage.service.offering", null, "Service offering used by 
secondary storage; if NULL - system offering will be used", null),
        HaTag("Advanced", ManagementServer.class, String.class, "ha.tag", null, 
"HA tag defining that the host marked with this tag can be used for HA purposes 
only", null),
-       VpcCleanupInterval("Advanced", ManagementServer.class, Integer.class, 
"vpc.cleanup.interval", "3600", "The interval (in seconds) between cleanup for 
Inactive VPCs", null);
-
+       VpcCleanupInterval("Advanced", ManagementServer.class, Integer.class, 
"vpc.cleanup.interval", "3600", "The interval (in seconds) between cleanup for 
Inactive VPCs", null),
+    VpcMaxNetworks("Advanced", ManagementServer.class, Integer.class, 
"vpc.max.networks", "3", "Maximum number of networks per vpc", null);
+       
        
        private final String _category;
        private final Class<?> _componentClass;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/807a9ed2/server/src/com/cloud/network/dao/NetworkDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/dao/NetworkDao.java 
b/server/src/com/cloud/network/dao/NetworkDao.java
index 63b6f08..1b1f769 100644
--- a/server/src/com/cloud/network/dao/NetworkDao.java
+++ b/server/src/com/cloud/network/dao/NetworkDao.java
@@ -105,5 +105,7 @@ public interface NetworkDao extends GenericDao<NetworkVO, 
Long> {
     List<NetworkVO> listByVpc(long vpcId);
     
     NetworkVO getPrivateNetwork(String broadcastUri, String cidr, long 
accountId, long zoneId);
+    
+    long countVpcNetworks(long vpcId);
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/807a9ed2/server/src/com/cloud/network/dao/NetworkDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/dao/NetworkDaoImpl.java 
b/server/src/com/cloud/network/dao/NetworkDaoImpl.java
index d644286..e3a1cc7 100644
--- a/server/src/com/cloud/network/dao/NetworkDaoImpl.java
+++ b/server/src/com/cloud/network/dao/NetworkDaoImpl.java
@@ -71,6 +71,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, 
Long> implements N
     private final GenericSearchBuilder<NetworkVO, Integer> NetworksCount;
     final SearchBuilder<NetworkVO> SourceNATSearch;
     final GenericSearchBuilder<NetworkVO, Long>  CountByZoneAndURI;
+    final GenericSearchBuilder<NetworkVO, Long> VpcNetworksCount;
     
     
     ResourceTagsDaoImpl _tagsDao = 
ComponentLocator.inject(ResourceTagsDaoImpl.class);
@@ -194,6 +195,11 @@ public class NetworkDaoImpl extends 
GenericDaoBase<NetworkVO, Long> implements N
         join6.and("service", join6.entity().getService(), Op.EQ);
         SourceNATSearch.join("services", join6, 
SourceNATSearch.entity().getId(), join6.entity().getNetworkId(), 
JoinBuilder.JoinType.INNER);
         SourceNATSearch.done();
+        
+        VpcNetworksCount = createSearchBuilder(Long.class);
+        VpcNetworksCount.and("vpcId", VpcNetworksCount.entity().getVpcId(), 
Op.EQ);
+        VpcNetworksCount.select(null, Func.COUNT, 
VpcNetworksCount.entity().getId());
+        VpcNetworksCount.done();
 
     }
 
@@ -534,4 +540,11 @@ public class NetworkDaoImpl extends 
GenericDaoBase<NetworkVO, Long> implements N
         txn.commit();
         return result;
     }
+
+    @Override
+    public long countVpcNetworks(long vpcId) {
+        SearchCriteria<Long> sc = VpcNetworksCount.create();
+        sc.setParameters("vpcId", vpcId);
+        return customSearch(sc, null).get(0);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/807a9ed2/server/src/com/cloud/network/vpc/VpcManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManager.java 
b/server/src/com/cloud/network/vpc/VpcManager.java
index 8a4b03a..b6724b0 100644
--- a/server/src/com/cloud/network/vpc/VpcManager.java
+++ b/server/src/com/cloud/network/vpc/VpcManager.java
@@ -22,7 +22,6 @@ import java.util.Set;
 
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.network.IpAddress;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
 import com.cloud.network.element.VpcProvider;
@@ -111,4 +110,9 @@ public interface VpcManager extends VpcService{
      * @return
      */
     VpcGateway getPrivateGatewayForVpc(long vpcId);
+
+    /**
+     * @return
+     */
+    int getMaxNetworksPerVpc();
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/807a9ed2/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 b3475f2..7ee87b0 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -152,11 +152,11 @@ public class VpcManagerImpl implements VpcManager, 
Manager{
     Site2SiteVpnManager _s2sVpnMgr;
 
     private final ScheduledExecutorService _executor = 
Executors.newScheduledThreadPool(1, new NamedThreadFactory("VpcChecker"));
-    
     private VpcProvider vpcElement = null;
     
     String _name;
     int _cleanupInterval;
+    int _maxNetworks;
 
     @Override
     @DB
@@ -194,7 +194,9 @@ public class VpcManagerImpl implements VpcManager, Manager{
         Map<String, String> configs = configDao.getConfiguration(params);
         String value = configs.get(Config.VpcCleanupInterval.key());
         _cleanupInterval = NumbersUtil.parseInt(value, 60 * 60); // 1 hour
-        
+
+        String maxNtwks = configs.get(Config.VpcMaxNetworks.key());
+        _maxNetworks = NumbersUtil.parseInt(maxNtwks, 3); // max=3 is default
         return true;
     }
 
@@ -943,6 +945,13 @@ public class VpcManagerImpl implements VpcManager, Manager{
         }
         
         try {
+            //check number of active networks in vpc
+            if (_ntwkDao.countVpcNetworks(vpc.getId()) >= _maxNetworks) {
+                throw new CloudRuntimeException("Number of networks per VPC 
can't extend " 
+                        + _maxNetworks + "; increase it using global config " 
+ Config.VpcMaxNetworks);
+            }
+            
+            
             //1) CIDR is required
             if (cidr == null) {
                 throw new InvalidParameterValueException("Gateway/netmask are 
required when create network for VPC");
@@ -1610,4 +1619,8 @@ public class VpcManagerImpl implements VpcManager, 
Manager{
         return _vpcGatewayDao.getPrivateGatewayForVpc(vpcId);
     }
     
+    public int getMaxNetworksPerVpc() {
+        return _maxNetworks;
+    }
+    
 }

Reply via email to