VPC: added vpc_id to private_ip_address table to indicate which vpc the ip
belongs to
Conflicts:
server/src/com/cloud/network/NetworkManagerImpl.java
server/src/com/cloud/network/vpc/VpcManager.java
server/src/com/cloud/vm/VirtualMachineManagerImpl.java
server/test/com/cloud/network/MockNetworkManagerImpl.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/21519070
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/21519070
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/21519070
Branch: refs/heads/vpc
Commit: 21519070fcd4289c897a355c6d576a7d28e3e1dd
Parents: d52c6e2
Author: Alena Prokharchyk <[email protected]>
Authored: Mon Jul 9 12:59:40 2012 -0700
Committer: Alena Prokharchyk <[email protected]>
Committed: Mon Jul 9 18:23:35 2012 -0700
----------------------------------------------------------------------
.../api/commands/CreatePrivateNetworkCmd.java | 2 +-
api/src/com/cloud/api/commands/CreateVPCCmd.java | 2 +-
api/src/com/cloud/network/NetworkService.java | 3 +-
api/src/com/cloud/network/vpc/VpcService.java | 3 +-
api/src/com/cloud/vm/NicProfile.java | 1 +
server/src/com/cloud/network/NetworkManager.java | 17 ++++
.../src/com/cloud/network/NetworkManagerImpl.java | 60 +++++++++++++-
.../com/cloud/network/guru/PrivateNetworkGuru.java | 7 +-
.../router/VirtualNetworkApplianceManagerImpl.java | 14 +--
.../VpcVirtualNetworkApplianceManagerImpl.java | 63 +++++++++++++--
.../com/cloud/network/vpc/Dao/PrivateIpDao.java | 11 +++-
.../cloud/network/vpc/Dao/PrivateIpDaoImpl.java | 19 ++++-
.../com/cloud/network/vpc/Dao/VpcGatewayDao.java | 2 +-
.../cloud/network/vpc/Dao/VpcGatewayDaoImpl.java | 2 +-
server/src/com/cloud/network/vpc/PrivateIpVO.java | 10 ++-
server/src/com/cloud/network/vpc/VpcManager.java | 13 +++
.../src/com/cloud/network/vpc/VpcManagerImpl.java | 19 +++--
.../com/cloud/vm/VirtualMachineManagerImpl.java | 33 +-------
.../com/cloud/network/MockNetworkManagerImpl.java | 57 +++++++++----
setup/db/create-schema.sql | 2 +
20 files changed, 251 insertions(+), 89 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/api/src/com/cloud/api/commands/CreatePrivateNetworkCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/CreatePrivateNetworkCmd.java
b/api/src/com/cloud/api/commands/CreatePrivateNetworkCmd.java
index 276c1fb..1a6ce09 100644
--- a/api/src/com/cloud/api/commands/CreatePrivateNetworkCmd.java
+++ b/api/src/com/cloud/api/commands/CreatePrivateNetworkCmd.java
@@ -139,7 +139,7 @@ public class CreatePrivateNetworkCmd extends
BaseAsyncCreateCmd {
Network result = null;
try {
result = _networkService.createPrivateNetwork(getNetworkName(),
getDisplayText(), getPhysicalNetworkId(), getVlan(),
- getStartIp(), getEndIp(), getGateway(), getNetmask(),
getEntityOwnerId());
+ getStartIp(), getEndIp(), getGateway(), getNetmask(),
getEntityOwnerId(), null);
} catch (InsufficientCapacityException ex){
s_logger.info(ex);
s_logger.trace(ex);
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/api/src/com/cloud/api/commands/CreateVPCCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/CreateVPCCmd.java
b/api/src/com/cloud/api/commands/CreateVPCCmd.java
index 7d35aa3..d29c730 100644
--- a/api/src/com/cloud/api/commands/CreateVPCCmd.java
+++ b/api/src/com/cloud/api/commands/CreateVPCCmd.java
@@ -118,7 +118,7 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd{
public void execute() {
Vpc vpc = null;
try {
- if (_vpcService.startVpc(this.getEntityId())) {
+ if (_vpcService.startVpc(this.getEntityId(), true)) {
vpc = _vpcService.getVpc(getEntityId());
}
} catch (ResourceUnavailableException ex) {
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/api/src/com/cloud/network/NetworkService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/NetworkService.java
b/api/src/com/cloud/network/NetworkService.java
index be54e84..6a60ebf 100755
--- a/api/src/com/cloud/network/NetworkService.java
+++ b/api/src/com/cloud/network/NetworkService.java
@@ -160,13 +160,14 @@ public interface NetworkService {
* @param gateway
* @param netmask
* @param networkOwnerId
+ * @param vpcId TODO
* @return
* @throws InsufficientCapacityException
* @throws ConcurrentOperationException
* @throws ResourceAllocationException
*/
Network createPrivateNetwork(String networkName, String displayText, long
physicalNetworkId, String vlan,
- String startIp, String endIP, String gateway, String netmask, long
networkOwnerId)
+ String startIp, String endIP, String gateway, String netmask, long
networkOwnerId, Long vpcId)
throws ResourceAllocationException,
ConcurrentOperationException, InsufficientCapacityException;
/**
* @param network
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/api/src/com/cloud/network/vpc/VpcService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/vpc/VpcService.java
b/api/src/com/cloud/network/vpc/VpcService.java
index 8585226..f5be917 100644
--- a/api/src/com/cloud/network/vpc/VpcService.java
+++ b/api/src/com/cloud/network/vpc/VpcService.java
@@ -114,12 +114,13 @@ public interface VpcService {
/**
* @param vpcId
+ * @param destroyOnFailure TODO
* @return
* @throws InsufficientCapacityException
* @throws ResourceUnavailableException
* @throws ConcurrentOperationException
*/
- boolean startVpc(long vpcId) throws ConcurrentOperationException,
ResourceUnavailableException, InsufficientCapacityException;
+ boolean startVpc(long vpcId, boolean destroyOnFailure) throws
ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException;
/**
* @param vpcId
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/api/src/com/cloud/vm/NicProfile.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/NicProfile.java
b/api/src/com/cloud/vm/NicProfile.java
index 67753c6..2eda387 100644
--- a/api/src/com/cloud/vm/NicProfile.java
+++ b/api/src/com/cloud/vm/NicProfile.java
@@ -298,4 +298,5 @@ public class NicProfile {
public String toString() {
return new
StringBuilder("NicProfile[").append(id).append("-").append(vmId).append("-").append(reservationId).toString();
}
+
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/src/com/cloud/network/NetworkManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManager.java
b/server/src/com/cloud/network/NetworkManager.java
index 70aaa4a..0e62439 100755
--- a/server/src/com/cloud/network/NetworkManager.java
+++ b/server/src/com/cloud/network/NetworkManager.java
@@ -61,6 +61,7 @@ import com.cloud.vm.ReservationContext;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.VirtualMachineProfileImpl;
/**
* NetworkManager manages the network for the different end users.
@@ -468,6 +469,22 @@ public interface NetworkManager extends NetworkService {
* @return
*/
boolean isPrivateGateway(Nic guestNic);
+
+
+ /**
+ * @param network
+ * @param requested
+ * @param context
+ * @param vmProfile
+ * @return
+ * @throws InsufficientVirtualNetworkCapcityException
+ * @throws InsufficientAddressCapacityException
+ * @throws ConcurrentOperationException
+ * @throws InsufficientCapacityException
+ * @throws ResourceUnavailableException
+ */
+ NicProfile allocateAndPrepareNic(Network network, NicProfile requested,
ReservationContext context, VirtualMachineProfileImpl<VMInstanceVO> vmProfile)
throws InsufficientVirtualNetworkCapcityException,
+ InsufficientAddressCapacityException,
ConcurrentOperationException, InsufficientCapacityException,
ResourceUnavailableException;
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java
b/server/src/com/cloud/network/NetworkManagerImpl.java
index 0c6e5cb..86258fa 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -99,6 +99,7 @@ import com.cloud.exception.PermissionDeniedException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.UnsupportedServiceException;
+import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.host.Status;
import com.cloud.host.dao.HostDao;
@@ -212,6 +213,7 @@ import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.Type;
import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.VirtualMachineProfileImpl;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.UserVmDao;
@@ -7256,7 +7258,7 @@ public class NetworkManagerImpl implements
NetworkManager, NetworkService, Manag
@Override @DB
public Network createPrivateNetwork(String networkName, String
displayText, long physicalNetworkId,
- String vlan, String startIp, String endIp, String gateway, String
netmask, long networkOwnerId)
+ String vlan, String startIp, String endIp, String gateway, String
netmask, long networkOwnerId, Long vpcId)
throws ResourceAllocationException,
ConcurrentOperationException, InsufficientCapacityException {
Account owner = _accountMgr.getAccount(networkOwnerId);
@@ -7323,8 +7325,8 @@ public class NetworkManagerImpl implements
NetworkManager, NetworkService, Manag
Long mac = dc.getMacAddress();
Long nextMac = mac + 1;
dc.setMacAddress(nextMac);
-
- privateIp = new PrivateIpVO(startIp, privateNetwork.getId(), nextMac);
+
+ privateIp = new PrivateIpVO(startIp, privateNetwork.getId(), nextMac,
vpcId);
_privateIpDao.persist(privateIp);
_dcDao.update(dc.getId(), dc);
@@ -7369,4 +7371,56 @@ public class NetworkManagerImpl implements
NetworkManager, NetworkService, Manag
}
return true;
}
+
+ @Override
+ public NicProfile allocateAndPrepareNic(Network network, NicProfile
requested, ReservationContext context,
+ VirtualMachineProfileImpl<VMInstanceVO> vmProfile)
+ throws InsufficientVirtualNetworkCapcityException,
InsufficientAddressCapacityException,
+ ConcurrentOperationException, InsufficientCapacityException,
ResourceUnavailableException {
+
+ VirtualMachine vm = vmProfile.getVirtualMachine();
+ NetworkVO networkVO = _networksDao.findById(network.getId());
+ DataCenter dc = _configMgr.getZone(network.getDataCenterId());
+ Host host = _hostDao.findById(vm.getHostId());
+ DeployDestination dest = new DeployDestination(dc, null, null, host);
+
+ NicProfile nic = null;
+ String broadcastUri = null;
+ if (requested != null && requested.getBroadCastUri() != null) {
+ broadcastUri = requested.getBroadCastUri().toString();
+ NicVO nicVO =
_nicDao.findByInstanceIdNetworkIdAndBroadcastUri(network.getId(), vm.getId(),
broadcastUri);
+ if (nicVO != null) {
+ nic = getNicProfile(vm, network.getId());
+ }
+ } else {
+ NicVO nicVO =
_nicDao.findByInstanceIdAndNetworkId(network.getId(), vm.getId());
+ if (nicVO != null) {
+ nic = getNicProfile(vm, network.getId());
+ }
+ }
+
+ //1) allocate nic (if needed)
+ if (nic == null) {
+ s_logger.debug("Allocating nic for the " + vm + " in network " +
network);
+ int deviceId = _nicDao.countNics(vm.getId());
+
+ nic = allocateNic(requested, network, false,
+ deviceId, vmProfile).first();
+
+ if (nic == null) {
+ throw new CloudRuntimeException("Failed to allocate nic for vm
" + vm + " in network " + network);
+ }
+
+ s_logger.debug("Nic is allocated successfully for vm " + vm + " in
network " + network);
+
+
+
+ s_logger.debug("Nic is prepared successfully for vm " + vm + " in
network " + network);
+ }
+
+ //2) prepare nic
+ nic = prepareNic(vmProfile, dest, context, nic.getId(), networkVO);
+
+ return nic;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/src/com/cloud/network/guru/PrivateNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/PrivateNetworkGuru.java
b/server/src/com/cloud/network/guru/PrivateNetworkGuru.java
index ab07874..0546f23 100644
--- a/server/src/com/cloud/network/guru/PrivateNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/PrivateNetworkGuru.java
@@ -101,7 +101,7 @@ public class PrivateNetworkGuru extends AdapterBase
implements NetworkGuru {
return null;
}
- NetworkVO network = new NetworkVO(offering.getTrafficType(),
Mode.Dhcp, BroadcastDomainType.Vlan, offering.getId(),
+ NetworkVO network = new NetworkVO(offering.getTrafficType(),
Mode.Static, BroadcastDomainType.Vlan, offering.getId(),
State.Allocated, plan.getDataCenterId(),
plan.getPhysicalNetworkId());
if (userSpecified != null) {
if ((userSpecified.getCidr() == null && userSpecified.getGateway()
!= null) ||
@@ -175,10 +175,9 @@ public class PrivateNetworkGuru extends AdapterBase
implements NetworkGuru {
protected void getIp(NicProfile nic, DataCenter dc, Network network)
- throws InsufficientVirtualNetworkCapcityException,
- InsufficientAddressCapacityException {
+ throws
InsufficientVirtualNetworkCapcityException,InsufficientAddressCapacityException
{
if (nic.getIp4Address() == null) {
- PrivateIpVO ipVO =
_privateIpDao.allocateIpAddress(network.getDataCenterId(), network.getId());
+ PrivateIpVO ipVO =
_privateIpDao.allocateIpAddress(network.getDataCenterId(), network.getId(),
null);
String vlanTag = network.getBroadcastUri().getHost();
String netmask = NetUtils.getCidrNetmask(network.getCidr());
PrivateIpAddress ip = new PrivateIpAddress(ipVO, vlanTag,
network.getGateway(), netmask, ipVO.getMacAddress());
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git
a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index b003342..16ef4cc 100755
---
a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++
b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -1281,8 +1281,10 @@ public class VirtualNetworkApplianceManagerImpl
implements VirtualNetworkApplian
//3) deploy virtual router(s)
int count = routerCount - routers.size();
for (int i = 0; i < count; i++) {
+ List<Pair<NetworkVO, NicProfile>> networks =
createRouterNetworks(owner, isRedundant, plan, guestNetwork,
+ new Pair<Boolean, PublicIp>(publicNetwork,
sourceNatIp));
DomainRouterVO router = deployRouter(owner, dest, plan,
params, isRedundant, vrProvider, offeringId,
- null, publicNetwork, guestNetwork, new Pair<Boolean,
PublicIp>(publicNetwork, sourceNatIp));
+ null, networks);
//add router to router network map
if (!_routerDao.isRouterPartOfGuestNetwork(router.getId(),
network.getId())) {
DomainRouterVO routerVO =
_routerDao.findById(router.getId());
@@ -1300,7 +1302,7 @@ public class VirtualNetworkApplianceManagerImpl
implements VirtualNetworkApplian
protected DomainRouterVO deployRouter(Account owner, DeployDestination
dest, DeploymentPlan plan, Map<Param, Object> params,
boolean isRedundant, VirtualRouterProvider vrProvider, long
svcOffId,
- Long vpcId, boolean setupPublicNetwork, Network guestNetwork,
Pair<Boolean, PublicIp> publicNetwork) throws ConcurrentOperationException,
+ Long vpcId, List<Pair<NetworkVO, NicProfile>> networks) throws
ConcurrentOperationException,
InsufficientAddressCapacityException,
InsufficientServerCapacityException, InsufficientCapacityException,
StorageUnavailableException, ResourceUnavailableException {
@@ -1308,15 +1310,10 @@ public class VirtualNetworkApplianceManagerImpl
implements VirtualNetworkApplian
if (s_logger.isDebugEnabled()) {
s_logger.debug("Creating the router " + id + " in datacenter " +
dest.getDataCenter());
}
-
- //1) Create router networks
- List<Pair<NetworkVO, NicProfile>> networks =
createRouterNetworks(owner, isRedundant, plan, guestNetwork,
- publicNetwork);
-
ServiceOfferingVO routerOffering =
_serviceOfferingDao.findById(svcOffId);
- //2) Router is the network element, we don't know the hypervisor type
yet.
+ // Router is the network element, we don't know the hypervisor type
yet.
//Try to allocate the domR twice using diff hypervisors, and when
failed both times, throw the exception up
List<HypervisorType> supportedHypervisors = new
ArrayList<HypervisorType>();
HypervisorType defaults =
_resourceMgr.getDefaultHypervisor(dest.getDataCenter().getId());
@@ -1480,7 +1477,6 @@ public class VirtualNetworkApplianceManagerImpl
implements VirtualNetworkApplian
networks.add(new Pair<NetworkVO,
NicProfile>(publicNetworks.get(0), defaultNic));
}
-
return networks;
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git
a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
index 6f6f0d9..887f284 100644
---
a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++
b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -60,6 +60,8 @@ import com.cloud.network.Network;
import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.NetworkService;
+import com.cloud.network.NetworkVO;
+import com.cloud.network.Networks.AddressFormat;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.IsolationType;
import com.cloud.network.Networks.TrafficType;
@@ -391,10 +393,10 @@ public class VpcVirtualNetworkApplianceManagerImpl
extends VirtualNetworkApplian
InsufficientAddressCapacityException,
InsufficientServerCapacityException, InsufficientCapacityException,
StorageUnavailableException, ResourceUnavailableException {
-
+ List<Pair<NetworkVO, NicProfile>> networks =
createVpcRouterNetworks(owner, isRedundant, plan, new Pair<Boolean,
PublicIp>(true, sourceNatIp),
+ vpcId);
DomainRouterVO router =
- super.deployRouter(owner, dest, plan, params, isRedundant,
vrProvider, svcOffId, vpcId, false,
- null, new Pair<Boolean, PublicIp>(true, sourceNatIp));
+ super.deployRouter(owner, dest, plan, params, isRedundant,
vrProvider, svcOffId, vpcId, networks);
return router;
}
@@ -792,6 +794,10 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
}
}
+
+
+
+ //4) PREPARE PLUG NIC COMMANDS
try {
//add VPC router to public networks
List<PublicIp> sourceNat = new ArrayList<PublicIp>(1);
@@ -853,7 +859,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
return false;
}
- //3) RE-APPLY ALL STATIC ROUTE RULES
+ //5) RE-APPLY ALL STATIC ROUTE RULES
List<? extends StaticRoute> routes =
_staticRouteDao.listByVpcId(router.getVpcId());
List<StaticRouteProfile> staticRouteProfiles = new
ArrayList<StaticRouteProfile>(routes.size());
Map<Long, VpcGateway> gatewayMap = new HashMap<Long, VpcGateway>();
@@ -872,9 +878,9 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
createStaticRouteCommands(staticRouteProfiles, router, cmds);
}
- //4) REISSUE VPN CONNECTION
+ //6) REISSUE VPN CONNECTION
- //5) REPROGRAM GUEST NETWORK
+ //7) REPROGRAM GUEST NETWORK
boolean reprogramGuestNtwks = true;
if (profile.getParameter(Param.ReProgramGuestNetworks) != null
&& (Boolean)
profile.getParameter(Param.ReProgramGuestNetworks) == false) {
@@ -924,7 +930,9 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
boolean result = true;
try {
Network network = _networkMgr.getNetwork(gateway.getNetworkId());
- NicProfile guestNic = _itMgr.addVmToNetwork(router, network, null);
+ NicProfile requested = createPrivateNicProfile(gateway);
+
+ NicProfile guestNic = _itMgr.addVmToNetwork(router, network,
requested);
//setup source nat
if (guestNic != null) {
@@ -1160,4 +1168,45 @@ public class VpcVirtualNetworkApplianceManagerImpl
extends VirtualNetworkApplian
cmds.addCommand("IPAssocVpcCommand", cmd);
}
}
+
+
+ protected List<Pair<NetworkVO, NicProfile>>
createVpcRouterNetworks(Account owner, boolean isRedundant,
+ DeploymentPlan plan, Pair<Boolean, PublicIp> publicNetwork, long
vpcId) throws ConcurrentOperationException,
+ InsufficientAddressCapacityException {
+
+ List<Pair<NetworkVO, NicProfile>> networks = new
ArrayList<Pair<NetworkVO, NicProfile>>(4);
+ networks = super.createRouterNetworks(owner, isRedundant, plan, null,
publicNetwork);
+
+ //allocate nic for private gateway if needed
+ VpcGateway privateGateway = _vpcMgr.getPrivateGatewayForVpc(vpcId);
+ if (privateGateway != null) {
+ NicProfile privateNic = createPrivateNicProfile(privateGateway);
+ Network privateNetwork =
_networkMgr.getNetwork(privateGateway.getNetworkId());
+ networks.add(new Pair<NetworkVO, NicProfile>((NetworkVO)
privateNetwork, privateNic));
+ }
+
+ return networks;
+ }
+
+ @DB
+ protected NicProfile createPrivateNicProfile(VpcGateway privateGateway) {
+ Network network =
_networkMgr.getNetwork(privateGateway.getNetworkId());
+ PrivateIpVO ipVO =
_privateIpDao.allocateIpAddress(network.getDataCenterId(), network.getId(),
privateGateway.getIp4Address());
+
+ NicProfile privateNic = new NicProfile();
+ String vlanTag = network.getBroadcastUri().getHost();
+ String netmask = NetUtils.getCidrNetmask(network.getCidr());
+ PrivateIpAddress ip = new PrivateIpAddress(ipVO, vlanTag,
network.getGateway(), netmask, ipVO.getMacAddress());
+
+ privateNic.setIp4Address(ip.getIpAddress());
+ privateNic.setGateway(ip.getGateway());
+ privateNic.setNetmask(ip.getNetmask());
+ privateNic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
+ privateNic.setBroadcastUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
+ privateNic.setBroadcastType(BroadcastDomainType.Vlan);
+ privateNic.setFormat(AddressFormat.Ip4);
+ privateNic.setReservationId(String.valueOf(ip.getVlanTag()));
+ privateNic.setMacAddress(ip.getMacAddress());
+ return privateNic;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/src/com/cloud/network/vpc/Dao/PrivateIpDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/Dao/PrivateIpDao.java
b/server/src/com/cloud/network/vpc/Dao/PrivateIpDao.java
index 4c9e87a..f4dd76e 100644
--- a/server/src/com/cloud/network/vpc/Dao/PrivateIpDao.java
+++ b/server/src/com/cloud/network/vpc/Dao/PrivateIpDao.java
@@ -22,9 +22,10 @@ public interface PrivateIpDao extends
GenericDao<PrivateIpVO, Long>{
/**
* @param dcId
* @param networkId
+ * @param requestedIp TODO
* @return
*/
- PrivateIpVO allocateIpAddress(long dcId, long networkId);
+ PrivateIpVO allocateIpAddress(long dcId, long networkId, String
requestedIp);
/**
* @param ipAddress
@@ -58,5 +59,13 @@ public interface PrivateIpDao extends
GenericDao<PrivateIpVO, Long>{
int countByNetworkId(long ntwkId);
+ /**
+ * @param vpcId
+ * @param ip4Address
+ * @return
+ */
+ PrivateIpVO findByIpAndVpcId(long vpcId, String ip4Address);
+
+
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/src/com/cloud/network/vpc/Dao/PrivateIpDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/Dao/PrivateIpDaoImpl.java
b/server/src/com/cloud/network/vpc/Dao/PrivateIpDaoImpl.java
index f67b61a..88d5440 100644
--- a/server/src/com/cloud/network/vpc/Dao/PrivateIpDaoImpl.java
+++ b/server/src/com/cloud/network/vpc/Dao/PrivateIpDaoImpl.java
@@ -45,6 +45,7 @@ public class PrivateIpDaoImpl extends
GenericDaoBase<PrivateIpVO, Long> implemen
AllFieldsSearch.and("networkId",
AllFieldsSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
AllFieldsSearch.and("ipAddress",
AllFieldsSearch.entity().getIpAddress(), SearchCriteria.Op.EQ);
AllFieldsSearch.and("taken", AllFieldsSearch.entity().getTakenAt(),
SearchCriteria.Op.EQ);
+ AllFieldsSearch.and("vpcId", AllFieldsSearch.entity().getVpcId(),
SearchCriteria.Op.EQ);
AllFieldsSearch.done();
CountAllocatedByNetworkId = createSearchBuilder(Integer.class);
@@ -60,11 +61,15 @@ public class PrivateIpDaoImpl extends
GenericDaoBase<PrivateIpVO, Long> implemen
}
@Override
- public PrivateIpVO allocateIpAddress(long dcId, long networkId) {
+ public PrivateIpVO allocateIpAddress(long dcId, long networkId, String
requestedIp) {
SearchCriteria<PrivateIpVO> sc = AllFieldsSearch.create();
sc.setParameters("networkId", networkId);
sc.setParameters("taken", (Date)null);
+ if (requestedIp != null) {
+ sc.setParameters("ipAddress", requestedIp);
+ }
+
Transaction txn = Transaction.currentTxn();
txn.start();
PrivateIpVO vo = lockOneRandomRow(sc, true);
@@ -93,9 +98,7 @@ public class PrivateIpDaoImpl extends
GenericDaoBase<PrivateIpVO, Long> implemen
update(vo, sc);
}
- /* (non-Javadoc)
- * @see
com.cloud.network.vpc.Dao.PrivateIpDao#findByIpAndSourceNetworkId(long,
java.lang.String)
- */
+
@Override
public PrivateIpVO findByIpAndSourceNetworkId(long networkId, String
ip4Address) {
SearchCriteria<PrivateIpVO> sc = AllFieldsSearch.create();
@@ -105,6 +108,14 @@ public class PrivateIpDaoImpl extends
GenericDaoBase<PrivateIpVO, Long> implemen
}
@Override
+ public PrivateIpVO findByIpAndVpcId(long vpcId, String ip4Address) {
+ SearchCriteria<PrivateIpVO> sc = AllFieldsSearch.create();
+ sc.setParameters("ip", ip4Address);
+ sc.setParameters("vpcId", vpcId);
+ return findOneBy(sc);
+ }
+
+ @Override
public List<PrivateIpVO> listByNetworkId(long networkId) {
SearchCriteria<PrivateIpVO> sc = AllFieldsSearch.create();
sc.setParameters("networkId", networkId);
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/src/com/cloud/network/vpc/Dao/VpcGatewayDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/Dao/VpcGatewayDao.java
b/server/src/com/cloud/network/vpc/Dao/VpcGatewayDao.java
index cbc6f17..69666a8 100644
--- a/server/src/com/cloud/network/vpc/Dao/VpcGatewayDao.java
+++ b/server/src/com/cloud/network/vpc/Dao/VpcGatewayDao.java
@@ -17,5 +17,5 @@ import com.cloud.utils.db.GenericDao;
public interface VpcGatewayDao extends GenericDao<VpcGatewayVO, Long>{
- VpcGatewayVO getPrivateGateway(long vpcId);
+ VpcGatewayVO getPrivateGatewayForVpc(long vpcId);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/src/com/cloud/network/vpc/Dao/VpcGatewayDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/Dao/VpcGatewayDaoImpl.java
b/server/src/com/cloud/network/vpc/Dao/VpcGatewayDaoImpl.java
index 64a7580..31fd92b 100644
--- a/server/src/com/cloud/network/vpc/Dao/VpcGatewayDaoImpl.java
+++ b/server/src/com/cloud/network/vpc/Dao/VpcGatewayDaoImpl.java
@@ -36,7 +36,7 @@ public class VpcGatewayDaoImpl extends
GenericDaoBase<VpcGatewayVO, Long> implem
@Override
- public VpcGatewayVO getPrivateGateway(long vpcId) {
+ public VpcGatewayVO getPrivateGatewayForVpc(long vpcId) {
SearchCriteria<VpcGatewayVO> sc = AllFieldsSearch.create();
sc.setParameters("vpcId", vpcId);
sc.setParameters("type", VpcGateway.Type.Private);
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/src/com/cloud/network/vpc/PrivateIpVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/PrivateIpVO.java
b/server/src/com/cloud/network/vpc/PrivateIpVO.java
index 75dd2cd..69fcfd9 100644
--- a/server/src/com/cloud/network/vpc/PrivateIpVO.java
+++ b/server/src/com/cloud/network/vpc/PrivateIpVO.java
@@ -46,13 +46,17 @@ public class PrivateIpVO{
@Column(name="network_id", updatable=false, nullable=false)
private long networkId;
+ @Column(name="vpc_id")
+ private Long vpcId;
+
public PrivateIpVO() {
}
- public PrivateIpVO(String ipAddress, long networkId, long macAddress) {
+ public PrivateIpVO(String ipAddress, long networkId, long macAddress, long
vpcId) {
this.ipAddress = ipAddress;
this.networkId = networkId;
this.macAddress = macAddress;
+ this.vpcId = vpcId;
}
public void setTakenAt(Date takenDate) {
@@ -78,4 +82,8 @@ public class PrivateIpVO{
public long getMacAddress() {
return macAddress;
}
+
+ public Long getVpcId() {
+ return vpcId;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/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 bc15452..7957858 100644
--- a/server/src/com/cloud/network/vpc/VpcManager.java
+++ b/server/src/com/cloud/network/vpc/VpcManager.java
@@ -93,4 +93,17 @@ public interface VpcManager extends VpcService{
* @return
*/
List<DomainRouterVO> getVpcRouters(long vpcId);
+
+
+ /**
+ * @param zoneId
+ * @return
+ */
+ boolean vpcProviderEnabledInZone(long zoneId);
+
+ /**
+ * @param vpcId
+ * @return
+ */
+ VpcGateway getPrivateGatewayForVpc(long vpcId);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/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 76ea216..8f5db9a 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -766,7 +766,7 @@ public class VpcManagerImpl implements VpcManager, Manager{
}
@Override
- public boolean startVpc(long vpcId) throws ConcurrentOperationException,
ResourceUnavailableException,
+ public boolean startVpc(long vpcId, boolean destroyOnFailure) throws
ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
UserContext ctx = UserContext.current();
Account caller = ctx.getCaller();
@@ -800,7 +800,7 @@ public class VpcManagerImpl implements VpcManager, Manager{
result = false;
} finally {
//do cleanup
- if (!result) {
+ if (!result && destroyOnFailure) {
s_logger.debug("Destroying vpc " + vpc + " that failed to
start");
if (destroyVpc(vpc)) {
s_logger.warn("Successfully destroyed vpc " + vpc + " that
failed to start");
@@ -998,7 +998,7 @@ public class VpcManagerImpl implements VpcManager, Manager{
}
//3) Delete private gateway
- PrivateGateway gateway = getVpcPrivateGateway(vpcId);
+ VpcGateway gateway = getPrivateGatewayForVpc(vpcId);
if (gateway != null) {
s_logger.debug("Deleting private gateway " + gateway + " as a part
of vpc " + vpcId + " resources cleanup");
if (!deleteVpcPrivateGateway(gateway.getId())) {
@@ -1040,7 +1040,7 @@ public class VpcManagerImpl implements VpcManager,
Manager{
}
s_logger.debug("Starting VPC " + vpc + " as a part of VPC restart
process");
- if (!startVpc(vpcId)) {
+ if (!startVpc(vpcId, false)) {
s_logger.warn("Failed to start vpc as a part of VPC " + vpc +
" restart process");
restartRequired = true;
return false;
@@ -1096,7 +1096,7 @@ public class VpcManagerImpl implements VpcManager,
Manager{
}
//allow only one private gateway per vpc
- VpcGatewayVO gatewayVO = _vpcGatewayDao.getPrivateGateway(vpcId);
+ VpcGatewayVO gatewayVO = _vpcGatewayDao.getPrivateGatewayForVpc(vpcId);
if (gatewayVO != null) {
throw new InvalidParameterValueException("Private ip address
already exists for vpc " + vpc);
}
@@ -1116,7 +1116,7 @@ public class VpcManagerImpl implements VpcManager,
Manager{
//1) create private network
String networkName = "vpc-" + vpc.getName() + "-privateNetwork";
Network privateNtwk = _ntwkMgr.createPrivateNetwork(networkName,
networkName, physicalNetworkId,
- vlan, ipAddress, null, gateway, netmask, gatewayOwnerId);
+ vlan, ipAddress, null, gateway, netmask, gatewayOwnerId,
vpcId);
//2) create gateway entry
gatewayVO = new VpcGatewayVO(ipAddress, VpcGateway.Type.Private,
vpcId, privateNtwk.getDataCenterId(),
@@ -1186,7 +1186,7 @@ public class VpcManagerImpl implements VpcManager,
Manager{
Transaction txn = Transaction.currentTxn();
txn.start();
- PrivateIpVO ip =
_privateIpDao.findByIpAndSourceNetworkId(gateway.getNetworkId(),
gateway.getIp4Address());
+ PrivateIpVO ip = _privateIpDao.findByIpAndVpcId(gateway.getVpcId(),
gateway.getIp4Address());
if (ip != null) {
_privateIpDao.remove(ip.getId());
s_logger.debug("Deleted private ip " + ip);
@@ -1527,4 +1527,9 @@ public class VpcManagerImpl implements VpcManager,
Manager{
}
}
}
+
+ @Override
+ public VpcGateway getPrivateGatewayForVpc(long vpcId) {
+ return _vpcGatewayDao.getPrivateGatewayForVpc(vpcId);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 43a8d6d..da2790d 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -2448,7 +2448,6 @@ public class VirtualMachineManagerImpl implements
VirtualMachineManager, Listene
s_logger.debug("Adding vm " + vm + " to network " + network);
VMInstanceVO vmVO = _vmDao.findById(vm.getId());
- NetworkVO networkVO = _networkDao.findById(network.getId());
ReservationContext context = new ReservationContextImpl(null, null,
_accountMgr.getActiveUser(User.UID_SYSTEM),
_accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM));
@@ -2459,35 +2458,8 @@ public class VirtualMachineManagerImpl implements
VirtualMachineManager, Listene
Host host = _hostDao.findById(vm.getHostId());
DeployDestination dest = new DeployDestination(dc, null, null, host);
- NicProfile nic = null;
- String broadcastUri = null;
- if (requested != null && requested.getBroadCastUri() != null) {
- broadcastUri = requested.getBroadCastUri().toString();
- NicVO nicVO =
_nicsDao.findByInstanceIdNetworkIdAndBroadcastUri(network.getId(), vm.getId(),
broadcastUri);
- if (nicVO != null) {
- nic = _networkMgr.getNicProfile(vm, network.getId());
- }
- }
-
- if (nic == null) {
- s_logger.debug("Allocating nic for the " + vm + " in network " +
network);
- //1) allocate nic and prepare nic if needed
- int deviceId = _nicsDao.countNics(vm.getId());
-
- nic = _networkMgr.allocateNic(requested, network, false,
- deviceId, vmProfile).first();
-
- if (nic == null) {
- throw new CloudRuntimeException("Failed to allocate nic for vm
" + vm + " in network " + network);
- }
-
- s_logger.debug("Nic is allocated successfully for vm " + vm + " in
network " + network);
-
- nic = _networkMgr.prepareNic(vmProfile, dest, context,
nic.getId(), networkVO);
-
- s_logger.debug("Nic is prepared successfully for vm " + vm + " in
network " + network);
-
- }
+ //1) allocate and prepare nic
+ NicProfile nic = _networkMgr.allocateAndPrepareNic(network, requested,
context, vmProfile);
//2) Convert vmProfile to vmTO
HypervisorGuru hvGuru =
_hvGuruMgr.getGuru(vmProfile.getVirtualMachine().getHypervisorType());
@@ -2509,6 +2481,7 @@ public class VirtualMachineManagerImpl implements
VirtualMachineManager, Listene
}
}
+
@Override
public NicTO toNicTO(NicProfile nic, HypervisorType hypervisorType) {
HypervisorGuru hvGuru = _hvGuruMgr.getGuru(hypervisorType);
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/server/test/com/cloud/network/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java
b/server/test/com/cloud/network/MockNetworkManagerImpl.java
index 0819a31..e245a9a 100755
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@ -51,6 +51,7 @@ import com.cloud.network.Networks.TrafficType;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.element.NetworkElement;
import com.cloud.network.element.RemoteAccessVPNServiceProvider;
+import com.cloud.network.element.Site2SiteVpnServiceProvider;
import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.network.guru.NetworkGuru;
import com.cloud.network.rules.FirewallRule;
@@ -68,6 +69,7 @@ import com.cloud.vm.ReservationContext;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.VirtualMachineProfileImpl;
@Local(value = { NetworkManager.class, NetworkService.class })
public class MockNetworkManagerImpl implements NetworkManager, Manager,
NetworkService {
@@ -851,7 +853,8 @@ public class MockNetworkManagerImpl implements
NetworkManager, Manager, NetworkS
* @see com.cloud.network.NetworkService#updateGuestNetwork(long,
java.lang.String, java.lang.String, com.cloud.user.Account,
com.cloud.user.User, java.lang.String, java.lang.Long, java.lang.Boolean)
*/
@Override
- public Network updateGuestNetwork(long networkId, String name, String
displayText, Account callerAccount, User callerUser, String domainSuffix, Long
networkOfferingId, Boolean changeCidr) {
+ public Network createPrivateNetwork(String networkName, String
displayText, long physicalNetworkId, String vlan, String startIp, String endIP,
String gateway, String netmask, long networkOwnerId, Long vpcId)
+ throws ResourceAllocationException, ConcurrentOperationException,
InsufficientCapacityException {
// TODO Auto-generated method stub
return null;
}
@@ -999,15 +1002,6 @@ public class MockNetworkManagerImpl implements
NetworkManager, Manager, NetworkS
return false;
}
- /* (non-Javadoc)
- * @see
com.cloud.network.NetworkService#createPrivateNetwork(java.lang.String,
java.lang.String, long, java.lang.String, java.lang.String, java.lang.String,
java.lang.String, java.lang.String, long)
- */
- @Override
- public Network createPrivateNetwork(String networkName, String
displayText, long physicalNetworkId, String vlan, String startIp, String endIP,
String gateway, String netmask, long networkOwnerId)
- throws ResourceAllocationException, ConcurrentOperationException,
InsufficientCapacityException {
- // TODO Auto-generated method stub
- return null;
- }
/* (non-Javadoc)
* @see
com.cloud.network.NetworkManager#checkVirtualNetworkCidrOverlap(java.lang.Long,
java.lang.String)
@@ -1090,29 +1084,58 @@ public class MockNetworkManagerImpl implements
NetworkManager, Manager, NetworkS
return null;
}
+
/* (non-Javadoc)
- * @see com.cloud.network.NetworkManager#isPrivateGateway(com.cloud.vm.Nic)
+ * @see com.cloud.network.NetworkManager#assignPublicIpAddress(long,
java.lang.Long, com.cloud.user.Account, com.cloud.dc.Vlan.VlanType,
java.lang.Long, java.lang.String, boolean)
*/
@Override
- public boolean isPrivateGateway(long nicId) {
+ public PublicIp assignPublicIpAddress(long dcId, Long podId, Account
owner, VlanType type, Long networkId, String requestedIp, boolean isSystem)
throws InsufficientAddressCapacityException {
// TODO Auto-generated method stub
- return false;
+ return null;
}
/* (non-Javadoc)
- * @see com.cloud.network.NetworkManager#assignPublicIpAddress(long,
java.lang.Long, com.cloud.user.Account, com.cloud.dc.Vlan.VlanType,
java.lang.Long, java.lang.String, boolean)
+ * @see com.cloud.network.NetworkManager#getAccountNetworkDomain(long,
long)
*/
@Override
- public PublicIp assignPublicIpAddress(long dcId, Long podId, Account
owner, VlanType type, Long networkId, String requestedIp, boolean isSystem)
throws InsufficientAddressCapacityException {
+ public String getAccountNetworkDomain(long accountId, long zoneId) {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
- * @see com.cloud.network.NetworkManager#getAccountNetworkDomain(long,
long)
+ * @see com.cloud.network.NetworkService#updateGuestNetwork(long,
java.lang.String, java.lang.String, com.cloud.user.Account,
com.cloud.user.User, java.lang.String, java.lang.Long, java.lang.Boolean)
*/
@Override
- public String getAccountNetworkDomain(long accountId, long zoneId) {
+ public Network updateGuestNetwork(long networkId, String name, String
displayText, Account callerAccount, User callerUser, String domainSuffix, Long
networkOfferingId, Boolean changeCidr) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see com.cloud.network.NetworkManager#getSite2SiteVpnElements()
+ */
+ @Override
+ public List<? extends Site2SiteVpnServiceProvider>
getSite2SiteVpnElements() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see com.cloud.network.NetworkManager#isPrivateGateway(com.cloud.vm.Nic)
+ */
+ @Override
+ public boolean isPrivateGateway(Nic guestNic) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see
com.cloud.network.NetworkManager#allocateAndPrepareNic(com.cloud.network.Network,
com.cloud.vm.NicProfile, com.cloud.vm.ReservationContext,
com.cloud.vm.VirtualMachineProfileImpl)
+ */
+ @Override
+ public NicProfile allocateAndPrepareNic(Network network, NicProfile
requested, ReservationContext context, VirtualMachineProfileImpl<VMInstanceVO>
vmProfile) throws InsufficientVirtualNetworkCapcityException,
+ InsufficientAddressCapacityException,
ConcurrentOperationException, InsufficientCapacityException,
ResourceUnavailableException {
// TODO Auto-generated method stub
return null;
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/21519070/setup/db/create-schema.sql
----------------------------------------------------------------------
diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql
index e369340..8037f99 100755
--- a/setup/db/create-schema.sql
+++ b/setup/db/create-schema.sql
@@ -2277,8 +2277,10 @@ CREATE TABLE `cloud`.`private_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',
+ `vpc_id` bigint unsigned COMMENT 'vpc this ip belongs to',
`taken` datetime COMMENT 'Date taken',
PRIMARY KEY (`id`),
+ CONSTRAINT `fk_private_ip_address__vpc_id` FOREIGN KEY
`fk_private_ip_address__vpc_id`(`vpc_id`) REFERENCES `vpc`(`id`),
CONSTRAINT `fk_private_ip_address__network_id` FOREIGN KEY (`network_id`)
REFERENCES `networks` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;