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