You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2012/06/26 06:01:14 UTC
[13/16] VPC: implemented add/delete Private gateway
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/030458a3/server/src/com/cloud/network/vpc/VpcGatewayVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcGatewayVO.java b/server/src/com/cloud/network/vpc/VpcGatewayVO.java
index 277c440..35a1738 100644
--- a/server/src/com/cloud/network/vpc/VpcGatewayVO.java
+++ b/server/src/com/cloud/network/vpc/VpcGatewayVO.java
@@ -12,11 +12,119 @@
// Automatically generated by addcopyright.py at 04/03/2012
package com.cloud.network.vpc;
+import java.util.Date;
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import com.cloud.utils.db.GenericDao;
+
/**
* @author Alena Prokharchyk
*/
-public class VpcGatewayVO {
+
+@Entity
+@Table(name="vpc_gateways")
+public class VpcGatewayVO implements VpcGateway{
+
+ @Id
+ @GeneratedValue(strategy=GenerationType.IDENTITY)
+ @Column(name="id")
+ private long id;
+
+ @Column(name = "ip4_address")
+ String ip4Address;
+
+ @Column(name = "type")
+ @Enumerated(value = EnumType.STRING)
+ VpcGateway.Type type;
+
+ @Column(name="vpc_id")
+ Long vpcId;
+
+ @Column(name="zone_id")
+ long zoneId;
+
+ @Column(name="network_id")
+ Long networkId;
+
+ @Column(name=GenericDao.CREATED_COLUMN)
+ Date created;
+
+ @Column(name=GenericDao.REMOVED_COLUMN)
+ Date removed;
+
+ @Column(name="uuid")
+ private String uuid;
+
+ protected VpcGatewayVO(){
+ this.uuid = UUID.randomUUID().toString();
+ }
+
+ /**
+ * @param ip4Address
+ * @param type
+ * @param vpcId
+ * @param zoneId
+ * @param networkId
+ * @param account_id
+ */
+ public VpcGatewayVO(String ip4Address, Type type, Long vpcId, long zoneId, Long networkId) {
+ super();
+ this.ip4Address = ip4Address;
+ this.type = type;
+ this.vpcId = vpcId;
+ this.zoneId = zoneId;
+ this.networkId = networkId;
+ this.uuid = UUID.randomUUID().toString();
+ }
+
+ @Override
+ public String getUuid() {
+ return this.uuid;
+ }
+
+ @Override
+ public long getId() {
+ return id;
+ }
+
+ @Override
+ public String getIp4Address() {
+ return ip4Address;
+ }
+
+ @Override
+ public VpcGateway.Type getType() {
+ return type;
+ }
+
+ @Override
+ public Long getVpcId() {
+ return vpcId;
+ }
+
+ @Override
+ public long getZoneId() {
+ return zoneId;
+ }
+
+ @Override
+ public Long getNetworkId() {
+ return networkId;
+ }
- public VpcGatewayVO() {
+ @Override
+ public String toString() {
+ StringBuilder buf = new StringBuilder("VpcGateway[");
+ buf.append(id).append("|").append(ip4Address.toString()).append("|").append(vpcId).append("]");
+ return buf.toString();
}
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/030458a3/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 55e95be..02fdce9 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -34,6 +34,7 @@ import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.UnsupportedServiceException;
import com.cloud.network.IPAddressVO;
@@ -42,11 +43,15 @@ import com.cloud.network.Network.GuestType;
import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.NetworkManager;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PhysicalNetwork;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.element.VpcProvider;
import com.cloud.network.vpc.VpcOffering.State;
+import com.cloud.network.vpc.Dao.PrivateIpDao;
import com.cloud.network.vpc.Dao.VpcDao;
+import com.cloud.network.vpc.Dao.VpcGatewayDao;
import com.cloud.network.vpc.Dao.VpcOfferingDao;
import com.cloud.network.vpc.Dao.VpcOfferingServiceMapDao;
import com.cloud.offering.NetworkOffering;
@@ -97,6 +102,10 @@ public class VpcManagerImpl implements VpcManager, Manager{
IPAddressDao _ipAddressDao;
@Inject
DomainRouterDao _routerDao;
+ @Inject
+ VpcGatewayDao _vpcGatewayDao;
+ @Inject
+ PrivateIpDao _privateIpDao;
private VpcProvider vpcElement = null;
@@ -223,9 +232,6 @@ public class VpcManagerImpl implements VpcManager, Manager{
}
}
}
-
-
-
txn.commit();
UserContext.current().setEventDetails(" Id: " + offering.getId() + " Name: " + name);
@@ -875,7 +881,7 @@ public class VpcManagerImpl implements VpcManager, Manager{
@Override
@ActionEvent(eventType = EventTypes.EVENT_VPC_RESTART, eventDescription = "restarting vpc")
- public boolean restartVpc(Long vpcId) throws ConcurrentOperationException, ResourceUnavailableException,
+ public boolean restartVpc(long vpcId) throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
Account caller = UserContext.current().getCaller();
@@ -916,4 +922,132 @@ public class VpcManagerImpl implements VpcManager, Manager{
public List<DomainRouterVO> getVpcRouters(long vpcId) {
return _routerDao.listRoutersByVpcId(vpcId);
}
+
+ @Override
+ public PrivateGateway getVpcPrivateGateway(long id) {
+ VpcGateway gateway = _vpcGatewayDao.findById(id);
+
+ if (gateway == null || gateway.getType() != VpcGateway.Type.Private) {
+ return null;
+ }
+ Network network = _ntwkMgr.getNetwork(gateway.getNetworkId());
+ String vlanTag = network.getBroadcastUri().getHost();
+ String netmask = NetUtils.getCidrNetmask(network.getCidr());
+ return new PrivateGatewayProfile(gateway, vlanTag, network.getGateway(),netmask, network.getPhysicalNetworkId());
+ }
+
+ @Override
+ @DB
+ public PrivateGateway createVpcPrivateGateway(long vpcId, Long physicalNetworkId, String vlan, String ipAddress,
+ String gateway, String netmask, long gatewayOwnerId) throws ResourceAllocationException,
+ ConcurrentOperationException, InsufficientCapacityException {
+
+ //Validate parameters
+ Vpc vpc = getVpc(vpcId);
+ if (vpc == null) {
+ throw new InvalidParameterValueException("Unable to find VPC by id given");
+ }
+
+ //allow only one private gateway per vpc
+ VpcGatewayVO gatewayVO = _vpcGatewayDao.getPrivateGateway(vpcId);
+ if (gatewayVO != null) {
+ throw new InvalidParameterValueException("Private ip address already exists for vpc " + vpc);
+ }
+
+ //Validate physical network
+ if (physicalNetworkId == null) {
+ List<? extends PhysicalNetwork> pNtwks = _ntwkMgr.getPhysicalNtwksSupportingTrafficType(vpc.getZoneId(), TrafficType.Guest);
+ if (pNtwks.isEmpty() || pNtwks.size() != 1) {
+ throw new InvalidParameterValueException("Physical network can't be determined; pass physical network id");
+ }
+ physicalNetworkId = pNtwks.get(0).getId();
+ }
+
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ s_logger.debug("Creating Private gateway for VPC " + vpc);
+ //1) create private network
+ String networkName = "vpc-" + vpc.getName() + "-privateNetwork";
+ Network privateNtwk = _ntwkMgr.createPrivateNetwork(networkName, networkName, physicalNetworkId,
+ vlan, ipAddress, null, gateway, netmask, gatewayOwnerId);
+
+ //2) create gateway entry
+ gatewayVO = new VpcGatewayVO(ipAddress, VpcGateway.Type.Private, vpcId, privateNtwk.getDataCenterId(),
+ privateNtwk.getId());
+ _vpcGatewayDao.persist(gatewayVO);
+
+ s_logger.debug("Created vpc gateway entry " + gatewayVO);
+
+ txn.commit();
+
+ return getVpcPrivateGateway(gatewayVO.getId());
+ }
+
+
+ @Override
+ public PrivateGateway applyVpcGateway(Long gatewayId) throws ConcurrentOperationException, ResourceUnavailableException {
+ PrivateGateway gateway = getVpcPrivateGateway(gatewayId);
+ if (getVpcElement().createPrivateGateway(gateway)) {
+ s_logger.debug("Private gateway " + gateway + " was applied succesfully on the backend");
+ return gateway;
+ } else {
+ s_logger.warn("Private gateway " + gateway + " failed to apply on the backend");
+ return null;
+ }
+ }
+
+ @Override
+ public boolean deleteVpcPrivateGateway(Long gatewayId) throws ConcurrentOperationException, ResourceUnavailableException {
+ VpcGatewayVO gatewayVO = _vpcGatewayDao.findById(gatewayId);
+ if (gatewayVO == null || gatewayVO.getType() != VpcGateway.Type.Private) {
+ throw new InvalidParameterValueException("Can't find private gateway by id specified");
+ }
+
+ //1) delete the gateaway on the backend
+ PrivateGateway gateway = getVpcPrivateGateway(gatewayId);
+ if (getVpcElement().deletePrivateGateway(gateway)) {
+ s_logger.debug("Private gateway " + gateway + " was applied succesfully on the backend");
+ } else {
+ s_logger.warn("Private gateway " + gateway + " failed to apply on the backend");
+ return false;
+ }
+
+ //2) Delete private gateway
+ return deletePrivateGateway(gateway);
+ }
+
+ @DB
+ public boolean deletePrivateGateway(PrivateGateway gateway) {
+ //check if there are ips allocted in the network
+ long networkId = gateway.getNetworkId();
+ boolean deleteNetwork = true;
+ List<PrivateIpVO> privateIps = _privateIpDao.listByNetworkId(networkId);
+ if (privateIps.size() > 1 || !privateIps.get(0).getIpAddress().equalsIgnoreCase(gateway.getIp4Address())) {
+ s_logger.debug("Not removing network id=" + gateway.getNetworkId() + " as it has private ip addresses for other gateways");
+ deleteNetwork = false;
+ }
+
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+
+ PrivateIpVO ip = _privateIpDao.findByIpAndSourceNetworkId(gateway.getNetworkId(), gateway.getIp4Address());
+ if (ip != null) {
+ _privateIpDao.remove(ip.getId());
+ s_logger.debug("Deleted private ip " + ip);
+ }
+
+ if (deleteNetwork) {
+ User callerUser = _accountMgr.getActiveUser(UserContext.current().getCallerUserId());
+ Account owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM);
+ ReservationContext context = new ReservationContextImpl(null, null, callerUser, owner);
+ _ntwkMgr.destroyNetwork(networkId, context);
+ s_logger.debug("Deleted private network id=" + networkId);
+ }
+
+ _vpcGatewayDao.remove(gateway.getId());
+ s_logger.debug("Deleted private gateway " + gateway);
+
+ txn.commit();
+ return true;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/030458a3/server/src/com/cloud/projects/ProjectVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/projects/ProjectVO.java b/server/src/com/cloud/projects/ProjectVO.java
index 631d4c9..ad61dac 100644
--- a/server/src/com/cloud/projects/ProjectVO.java
+++ b/server/src/com/cloud/projects/ProjectVO.java
@@ -92,7 +92,6 @@ public class ProjectVO implements Project, Identity {
return domainId;
}
-
@Override
public long getId() {
return id;
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/030458a3/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
index 594986c..0c7e622 100644
--- a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@ -43,7 +43,6 @@ import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.NicVO;
-import com.cloud.vm.UserVmVO;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.Event;
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/030458a3/setup/db/create-schema.sql
----------------------------------------------------------------------
diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql
index 83c76c8..88c2e38 100755
--- a/setup/db/create-schema.sql
+++ b/setup/db/create-schema.sql
@@ -2213,7 +2213,7 @@ CREATE TABLE `cloud`.`vpc_gateways` (
`network_id` bigint unsigned NOT NULL COMMENT 'network id vpc gateway belongs to',
`vpc_id` bigint unsigned NOT NULL COMMENT 'id of the vpc the gateway belongs to',
`zone_id` bigint unsigned NOT NULL COMMENT 'id of the zone the gateway belongs to',
- `created` datetime NOT NULL COMMENT 'date created',
+ `created` datetime COMMENT 'date created',
`removed` datetime COMMENT 'date removed if not null',
PRIMARY KEY (`id`),
CONSTRAINT `fk_vpc_gateways__network_id` FOREIGN KEY `fk_vpc_gateways__network_id`(`network_id`) REFERENCES `networks`(`id`),
@@ -2228,6 +2228,7 @@ CREATE TABLE `cloud`.`private_ip_address` (
`ip_address` char(40) NOT NULL COMMENT 'ip address',
`network_id` bigint unsigned NOT NULL COMMENT 'id of the network ip belongs to',
`reservation_id` char(40) COMMENT 'reservation id',
+ `mac_address` varchar(17) COMMENT 'mac address',
`taken` datetime COMMENT 'Date taken',
PRIMARY KEY (`id`),
CONSTRAINT `fk_private_ip_address__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks` (`id`) ON DELETE CASCADE