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
