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