VPC: apply firewall ACLs as a part of VPC router start/restart and VPC network
implement
Conflicts:
server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.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/1b1e52dd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/1b1e52dd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/1b1e52dd
Branch: refs/heads/vpc
Commit: 1b1e52ddb0f2c98a59a6c8d5d73523908d442e96
Parents: 8879706
Author: Alena Prokharchyk <[email protected]>
Authored: Thu Jun 21 14:58:28 2012 -0700
Committer: Alena Prokharchyk <[email protected]>
Committed: Mon Jun 25 20:47:29 2012 -0700
----------------------------------------------------------------------
.../cloud/network/firewall/NetworkACLService.java | 2 +
.../src/com/cloud/network/NetworkManagerImpl.java | 14 +-
.../network/firewall/NetworkACLManagerImpl.java | 6 +
.../router/VirtualNetworkApplianceManagerImpl.java | 46 ++--
.../VpcVirtualNetworkApplianceManagerImpl.java | 274 ++++++++-------
server/src/com/cloud/vm/VirtualMachineManager.java | 8 +
.../com/cloud/vm/VirtualMachineManagerImpl.java | 10 +-
7 files changed, 206 insertions(+), 154 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b1e52dd/api/src/com/cloud/network/firewall/NetworkACLService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/firewall/NetworkACLService.java
b/api/src/com/cloud/network/firewall/NetworkACLService.java
index 7397793..f7b0f9d 100644
--- a/api/src/com/cloud/network/firewall/NetworkACLService.java
+++ b/api/src/com/cloud/network/firewall/NetworkACLService.java
@@ -43,4 +43,6 @@ public interface NetworkACLService {
* @return
*/
List<? extends NetworkACL> listNetworkACLs(ListNetworkACLsCmd cmd);
+
+ List<? extends NetworkACL> listNetworkACLs(long guestNtwkId);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b1e52dd/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 ed94884..e89d9e8 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -134,6 +134,7 @@ import com.cloud.network.element.StaticNatServiceProvider;
import com.cloud.network.element.UserDataServiceProvider;
import com.cloud.network.element.VirtualRouterElement;
import com.cloud.network.element.VpcVirtualRouterElement;
+import com.cloud.network.firewall.NetworkACLService;
import com.cloud.network.guru.NetworkGuru;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRule.LbDestination;
@@ -307,6 +308,8 @@ public class NetworkManagerImpl implements NetworkManager,
NetworkService, Manag
VpcManager _vpcMgr;
@Inject
PrivateIpDao _privateIpDao;
+ @Inject
+ NetworkACLService _networkACLMgr;
private final HashMap<String, NetworkOfferingVO> _systemNetworks = new
HashMap<String, NetworkOfferingVO>(5);
@@ -3924,6 +3927,13 @@ public class NetworkManagerImpl implements
NetworkManager, NetworkService, Manag
}
}
}
+
+ //apply network ACLs
+ if (!_networkACLMgr.applyNetworkACLs(networkId, caller)) {
+ s_logger.warn("Failed to reapply network ACLs as a part of of
network id=" + networkId + " restart");
+ success = false;
+ }
+
return success;
}
@@ -4000,11 +4010,11 @@ public class NetworkManagerImpl implements
NetworkManager, NetworkService, Manag
}
// FIXME - in post 3.0 we are going to support multiple providers for
the same service per network offering, so
-// we have to calculate capabilities for all of them
+ // we have to calculate capabilities for all of them
String provider = providers.get(0);
// FIXME we return the capabilities of the first provider of the
service - what if we have multiple providers
-// for same Service?
+ // for same Service?
NetworkElement element = getElementImplementingProvider(provider);
if (element != null) {
Map<Service, Map<Capability, String>> elementCapabilities =
element.getCapabilities();
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b1e52dd/server/src/com/cloud/network/firewall/NetworkACLManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/firewall/NetworkACLManagerImpl.java
b/server/src/com/cloud/network/firewall/NetworkACLManagerImpl.java
index 235d2a6..50613f6 100644
--- a/server/src/com/cloud/network/firewall/NetworkACLManagerImpl.java
+++ b/server/src/com/cloud/network/firewall/NetworkACLManagerImpl.java
@@ -361,5 +361,11 @@ public class NetworkACLManagerImpl implements
Manager,NetworkACLService{
return _firewallDao.search(sc, filter);
}
+
+
+ @Override
+ public List<? extends NetworkACL> listNetworkACLs(long guestNtwkId) {
+ return _firewallDao.listByNetworkAndPurpose(guestNtwkId,
Purpose.NetworkACL);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b1e52dd/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 c3d32ca..d7780fd 100755
---
a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++
b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -1925,19 +1925,19 @@ public class VirtualNetworkApplianceManagerImpl
implements VirtualNetworkApplian
List<PublicIp> allPublicIps = new ArrayList<PublicIp>();
if (userIps != null && !userIps.isEmpty()) {
for (IPAddressVO userIp : userIps) {
- PublicIp publicIp = new PublicIp(userIp,
_vlanDao.findById(userIp.getVlanId()),
-
NetUtils.createSequenceBasedMacAddress(userIp.getMacAddress()));
- allPublicIps.add(publicIp);
+ PublicIp publicIp = new PublicIp(userIp,
_vlanDao.findById(userIp.getVlanId()),
+
NetUtils.createSequenceBasedMacAddress(userIp.getMacAddress()));
+ allPublicIps.add(publicIp);
}
}
-
+
//Get public Ips that should be handled by router
Network network = _networkDao.findById(guestNetworkId);
Map<PublicIp, Set<Service>> ipToServices =
_networkMgr.getIpToServices(allPublicIps, false, false);
Map<Provider, ArrayList<PublicIp>> providerToIpList =
_networkMgr.getProviderToIpList(network, ipToServices);
// Only cover virtual router for now, if ELB use it this need
to be modified
ArrayList<PublicIp> publicIps =
providerToIpList.get(Provider.VirtualRouter);
-
+
s_logger.debug("Found " + publicIps.size() + " ip(s) to apply
as a part of domR " + router + " start.");
if (!publicIps.isEmpty()) {
@@ -1953,27 +1953,26 @@ public class VirtualNetworkApplianceManagerImpl
implements VirtualNetworkApplian
createAssociateIPCommands(router, publicIps, cmds, 0);
}
- //Get information about all the rules (StaticNats and
StaticNatRules; PFVPN to reapply on domR start)
- for (PublicIp ip : publicIps) {
- if
(_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId,
Service.PortForwarding, provider)) {
-
pfRules.addAll(_pfRulesDao.listForApplication(ip.getId()));
- }
- if
(_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId,
Service.StaticNat, provider)) {
-
staticNatFirewallRules.addAll(_rulesDao.listByIpAndPurpose(ip.getId(),
Purpose.StaticNat));
- }
- if
(_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId,
Service.Firewall, provider)) {
-
firewallRules.addAll(_rulesDao.listByIpAndPurpose(ip.getId(),
Purpose.Firewall));
- }
+ //Get information about all the rules (StaticNats and
StaticNatRules; PFVPN to reapply on domR start)
+ for (PublicIp ip : publicIps) {
+ if
(_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId,
Service.PortForwarding, provider)) {
+
pfRules.addAll(_pfRulesDao.listForApplication(ip.getId()));
+ }
+ if
(_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId,
Service.StaticNat, provider)) {
+
staticNatFirewallRules.addAll(_rulesDao.listByIpAndPurpose(ip.getId(),
Purpose.StaticNat));
+ }
+ if
(_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId,
Service.Firewall, provider)) {
+
firewallRules.addAll(_rulesDao.listByIpAndPurpose(ip.getId(),
Purpose.Firewall));
+ }
- if
(_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Vpn,
provider)) {
- RemoteAccessVpn vpn = _vpnDao.findById(ip.getId());
- if (vpn != null) {
- vpns.add(vpn);
- }
+ if
(_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Vpn,
provider)) {
+ RemoteAccessVpn vpn = _vpnDao.findById(ip.getId());
+ if (vpn != null) {
+ vpns.add(vpn);
}
- if
(_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId,
Service.StaticNat, provider)) {
- if (ip.isOneToOneNat()) {
+ if
(_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId,
Service.StaticNat, provider)) {
+ if (ip.isOneToOneNat()) {
String dstIp =
_networkMgr.getIpInNetwork(ip.getAssociatedWithVmId(), guestNetworkId);
StaticNatImpl staticNat = new
StaticNatImpl(ip.getAccountId(), ip.getDomainId(), guestNetworkId, ip.getId(),
dstIp, false);
staticNats.add(staticNat);
@@ -2035,6 +2034,7 @@ public class VirtualNetworkApplianceManagerImpl
implements VirtualNetworkApplian
}
}
+ }
}
if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId,
Service.Dhcp, provider)) {
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b1e52dd/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 2dbe053..4bb5c18 100644
---
a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++
b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -48,7 +48,6 @@ import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InsufficientServerCapacityException;
-import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
import com.cloud.exception.OperationTimedoutException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.StorageUnavailableException;
@@ -69,7 +68,7 @@ import
com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType;
import com.cloud.network.VpcVirtualNetworkApplianceService;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.PhysicalNetworkDao;
-import com.cloud.network.router.VirtualRouter.Role;
+import com.cloud.network.firewall.NetworkACLService;
import com.cloud.network.rules.NetworkACL;
import com.cloud.network.vpc.Vpc;
import com.cloud.network.vpc.Dao.VpcDao;
@@ -84,8 +83,10 @@ import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.Nic;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.VirtualMachineProfile.Param;
+import com.cloud.vm.dao.VMInstanceDao;
/**
* @author Alena Prokharchyk
@@ -103,6 +104,10 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
PhysicalNetworkDao _pNtwkDao = null;
@Inject
NetworkService _ntwkService = null;
+ @Inject
+ NetworkACLService _networkACLService = null;
+ @Inject
+ VMInstanceDao _vmDao;
@Override
public List<DomainRouterVO> deployVirtualRouterInVpc(Vpc vpc,
DeployDestination dest, Account owner,
@@ -180,21 +185,11 @@ public class VpcVirtualNetworkApplianceManagerImpl
extends VirtualNetworkApplian
return new Pair<DeploymentPlan, List<DomainRouterVO>>(plan, routers);
}
+
@Override
public boolean addVpcRouterToGuestNetwork(VirtualRouter router, Network
network, boolean isRedundant)
throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
- boolean dnsProvided =
_networkMgr.isProviderSupportServiceInNetwork(network.getId(), Service.Dns,
Provider.VPCVirtualRouter);
- boolean dhcpProvided =
_networkMgr.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp,
- Provider.VPCVirtualRouter);
-
- boolean setupDns = dnsProvided || dhcpProvided;
-
- return addVpcRouterToGuestNetwork(router, network, isRedundant,
setupDns);
- }
-
- protected boolean addVpcRouterToGuestNetwork(VirtualRouter router, Network
network, boolean isRedundant, boolean setupDns)
- throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
if (network.getTrafficType() != TrafficType.Guest) {
s_logger.warn("Network " + network + " is not of type " +
TrafficType.Guest);
@@ -212,7 +207,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
NicProfile guestNic = _itMgr.addVmToNetwork(router, network, null);
//setup guest network
if (guestNic != null) {
- result = setupVpcGuestNetwork(network, router, true,
isRedundant, guestNic, setupDns);
+ result = setupVpcGuestNetwork(network, router, true, guestNic);
} else {
s_logger.warn("Failed to add router " + router + " to guest
network " + network);
result = false;
@@ -248,7 +243,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
return true;
}
- boolean result = setupVpcGuestNetwork(network, router, false,
isRedundant, _networkMgr.getNicProfile(router, network.getId()), false);
+ boolean result = setupVpcGuestNetwork(network, router, false,
_networkMgr.getNicProfile(router, network.getId()));
if (!result) {
s_logger.warn("Failed to destroy guest network config " + network
+ " on router " + router);
return false;
@@ -351,7 +346,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
List<PublicIp> publicIps = new ArrayList<PublicIp>(1);
publicIps.add(ipAddress);
Commands cmds = new Commands(OnError.Stop);
- createVpcAssociateIPCommands(router, publicIps, cmds, 0);
+ createVpcAssociateIPCommands(router, publicIps, cmds);
if (sendCommandsToRouter(router, cmds)) {
s_logger.debug("Successfully applied ip association for ip " +
ipAddress + " in vpc network " + network);
@@ -362,64 +357,6 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
}
}
-
- @Override
- public boolean finalizeStart(VirtualMachineProfile<DomainRouterVO>
profile, long hostId, Commands cmds,
- ReservationContext context) {
-
- if (!super.finalizeStart(profile, hostId, cmds, context)) {
- return false;
- } else if (profile.getVirtualMachine().getVpcId() == null) {
- return true;
- }
-
- DomainRouterVO router = profile.getVirtualMachine();
-
- //Get guest nic info
- Map<Nic, Network> guestNics = new HashMap<Nic, Network>();
- Map<Nic, Network> publicNics = new HashMap<Nic, Network>();
-
- List<? extends Nic> routerNics = _nicDao.listByVmId(profile.getId());
- for (Nic routerNic : routerNics) {
- Network network = _networkMgr.getNetwork(routerNic.getNetworkId());
- if (network.getTrafficType() == TrafficType.Guest) {
- guestNics.put(routerNic, network);
- } else if (network.getTrafficType() == TrafficType.Public) {
- publicNics.put(routerNic, network);
- }
- }
-
- try {
- //add VPC router to public and guest networks
- for (Nic publicNic : publicNics.keySet()) {
- Network publicNtwk = publicNics.get(publicNic);
- IPAddressVO userIp =
_ipAddressDao.findByIpAndSourceNetworkId(publicNtwk.getId(),
- publicNic.getIp4Address());
- PublicIp publicIp = new PublicIp(userIp,
_vlanDao.findById(userIp.getVlanId()),
-
NetUtils.createSequenceBasedMacAddress(userIp.getMacAddress()));
- if (!addPublicIpToVpc(router, publicNtwk, publicIp)) {
- s_logger.warn("Failed to add router router " + router + "
to public network " + publicNtwk);
- return false;
- }
- }
-
- for (Nic guestNic : guestNics.keySet()) {
- Network guestNtwk = guestNics.get(guestNic);
- boolean setupDns = _networkMgr.setupDns(guestNtwk,
Provider.VPCVirtualRouter);
-
- if (!addVpcRouterToGuestNetwork(router, guestNtwk, false,
setupDns)) {
- s_logger.warn("Failed to add router router " + router + "
to guest network " + guestNtwk);
- return false;
- }
- }
- } catch (Exception ex) {
- s_logger.warn("Failed to add router " + router + " to network due
to exception ", ex);
- return false;
- }
-
- return true;
- }
-
protected DomainRouterVO deployVpcRouter(Account owner, DeployDestination
dest, DeploymentPlan plan, Map<Param, Object> params,
boolean isRedundant, VirtualRouterProvider vrProvider, long
svcOffId,
Long vpcId, PublicIp sourceNatIp) throws
ConcurrentOperationException,
@@ -497,44 +434,55 @@ public class VpcVirtualNetworkApplianceManagerImpl
extends VirtualNetworkApplian
return result;
}
- protected boolean setupVpcGuestNetwork(Network network, VirtualRouter
router, boolean add, boolean isRedundant,
- NicProfile guestNic, boolean setupDns)
+ protected boolean setupVpcGuestNetwork(Network network, VirtualRouter
router, boolean add, NicProfile guestNic)
throws ConcurrentOperationException, ResourceUnavailableException{
-
- String networkDomain = network.getNetworkDomain();
- String dhcpRange = getGuestDhcpRange(guestNic, network,
_configMgr.getZone(network.getDataCenterId()));
-
+
boolean result = true;
- Nic nic = _nicDao.findByInstanceIdAndNetworkId(network.getId(),
router.getId());
- long guestVlanTag = Long.parseLong(nic.getBroadcastUri().getHost());
+ SetupGuestNetworkCommand setupCmd =
createSetupGuestNetworkCommand(router, add, guestNic);
+
+ Commands cmds = new Commands(OnError.Stop);
+ cmds.addCommand("setupguestnetwork", setupCmd);
+ sendCommandsToRouter(router, cmds);
- String brd =
NetUtils.long2Ip(NetUtils.ip2Long(guestNic.getIp4Address()) |
~NetUtils.ip2Long(guestNic.getNetmask()));
- Integer priority = null;
- if (isRedundant) {
- List<DomainRouterVO> routers =
_routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
- try {
- getUpdatedPriority(network, routers,
_routerDao.findById(router.getId()));
- } catch (InsufficientVirtualNetworkCapcityException e) {
- s_logger.error("Failed to get update priority!", e);
- throw new CloudRuntimeException("Failed to get update
priority!");
- }
- }
+ SetupGuestNetworkAnswer setupAnswer =
cmds.getAnswer(SetupGuestNetworkAnswer.class);
+ String setup = add ? "set" : "destroy";
+ if (!(setupAnswer != null && setupAnswer.getResult())) {
+ s_logger.warn("Unable to " + setup + " guest network on router " +
router);
+ result = false;
+ }
+
+ return result;
+ }
+
+ protected SetupGuestNetworkCommand
createSetupGuestNetworkCommand(VirtualRouter router, boolean add, NicProfile
guestNic) {
+ Network network = _networkMgr.getNetwork(guestNic.getNetworkId());
String defaultDns1 = null;
String defaultDns2 = null;
+ boolean dnsProvided =
_networkMgr.isProviderSupportServiceInNetwork(network.getId(), Service.Dns,
Provider.VPCVirtualRouter);
+ boolean dhcpProvided =
_networkMgr.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp,
+ Provider.VPCVirtualRouter);
+
+ boolean setupDns = dnsProvided || dhcpProvided;
+
if (setupDns) {
defaultDns1 = guestNic.getDns1();
defaultDns2 = guestNic.getDns2();
}
- NicProfile nicProfile = new NicProfile(nic, network,
nic.getBroadcastUri(), nic.getIsolationUri(),
- _networkMgr.getNetworkRate(network.getId(), router.getId()),
- _networkMgr.isSecurityGroupSupportedInNetwork(network),
_networkMgr.getNetworkTag(router.getHypervisorType(), network));
+ Nic nic = _nicDao.findByInstanceIdAndNetworkId(network.getId(),
router.getId());
+ String networkDomain = network.getNetworkDomain();
+ String dhcpRange = getGuestDhcpRange(guestNic, network,
_configMgr.getZone(network.getDataCenterId()));
+
+ VirtualMachine vm = _vmDao.findById(router.getId());
+ NicProfile nicProfile = _networkMgr.getNicProfile(router,
nic.getNetworkId());
- SetupGuestNetworkCommand setupCmd = new
SetupGuestNetworkCommand(dhcpRange, networkDomain, isRedundant, priority,
+ SetupGuestNetworkCommand setupCmd = new
SetupGuestNetworkCommand(dhcpRange, networkDomain, false, null,
defaultDns1, defaultDns2, add, _itMgr.toNicTO(nicProfile,
router.getHypervisorType()));
+ long guestVlanTag =
Long.parseLong(network.getBroadcastUri().getHost());
+ String brd =
NetUtils.long2Ip(NetUtils.ip2Long(guestNic.getIp4Address()) |
~NetUtils.ip2Long(guestNic.getNetmask()));
setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP,
getRouterControlIp(router.getId()));
setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP,
getRouterIpInNetwork(network.getId(), router.getId()));
setupCmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG,
String.valueOf(guestVlanTag));
@@ -542,22 +490,11 @@ public class VpcVirtualNetworkApplianceManagerImpl
extends VirtualNetworkApplian
setupCmd.setAccessDetail(NetworkElementCommand.GUEST_BRIDGE, brd);
setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME,
router.getInstanceName());
- Commands cmds = new Commands(OnError.Stop);
- cmds.addCommand("setupguestnetwork", setupCmd);
- sendCommandsToRouter(router, cmds);
-
- SetupGuestNetworkAnswer setupAnswer =
cmds.getAnswer(SetupGuestNetworkAnswer.class);
- String setup = add ? "set" : "destroy";
- if (!(setupAnswer != null && setupAnswer.getResult())) {
- s_logger.warn("Unable to " + setup + " guest network on router " +
router);
- result = false;
- }
-
- return result;
+ return setupCmd;
}
private void createVpcAssociateIPCommands(final VirtualRouter router,
final List<? extends PublicIpAddress> ips,
- Commands cmds, long vmId) {
+ Commands cmds) {
Pair<IpAddressTO, Long> sourceNatIpAdd = null;
Boolean addSourceNat = null;
@@ -615,16 +552,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
//set source nat ip
if (sourceNatIpAdd != null) {
IpAddressTO sourceNatIp = sourceNatIpAdd.first();
- Long publicNetworkId = sourceNatIpAdd.second();
-
- Network guestNetwork = _networkMgr.getNetwork(publicNetworkId);
- Nic nic =
_nicDao.findByInstanceIdAndNetworkId(guestNetwork.getId(), router.getId());
- NicProfile nicProfile = new NicProfile(nic, guestNetwork,
nic.getBroadcastUri(), nic.getIsolationUri(),
- _networkMgr.getNetworkRate(guestNetwork.getId(),
router.getId()),
-
_networkMgr.isSecurityGroupSupportedInNetwork(guestNetwork),
- _networkMgr.getNetworkTag(router.getHypervisorType(),
guestNetwork));
-
- SetSourceNatCommand cmd = new SetSourceNatCommand(sourceNatIp,
addSourceNat, _itMgr.toNicTO(nicProfile, router.getHypervisorType()));
+ SetSourceNatCommand cmd = new SetSourceNatCommand(sourceNatIp,
addSourceNat, null);
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP,
getRouterControlIp(router.getId()));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME,
router.getInstanceName());
DataCenterVO dcVo =
_dcDao.findById(router.getDataCenterIdToDeployIn());
@@ -632,6 +560,13 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
cmds.addCommand("SetSourceNatCommand", cmd);
}
}
+
+ protected NicTO getNicTO(final VirtualRouter router, Long guestNetworkId) {
+ VirtualMachine vm = _vmDao.findById(router.getId());
+ NicProfile nicProfile = _networkMgr.getNicProfile(router,
guestNetworkId);
+
+ return _itMgr.toNicTO(nicProfile, router.getHypervisorType());
+ }
@Override
public boolean associateIP(Network network, final List<? extends
PublicIpAddress> ipAddress, List<? extends VirtualRouter> routers)
@@ -688,7 +623,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
@Override
public boolean execute(Network network, VirtualRouter router)
throws ResourceUnavailableException {
Commands cmds = new Commands(OnError.Continue);
- createVpcAssociateIPCommands(router, ipAddress, cmds, 0);
+ createVpcAssociateIPCommands(router, ipAddress, cmds);
return sendCommandsToRouter(router, cmds);
}
});
@@ -755,13 +690,8 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
}
}
- Network network = _networkMgr.getNetwork(guestNetworkId);
- Nic nic = _nicDao.findByInstanceIdAndNetworkId(network.getId(),
router.getId());
- NicProfile nicProfile = new NicProfile(nic, network,
nic.getBroadcastUri(), nic.getIsolationUri(),
- _networkMgr.getNetworkRate(network.getId(), router.getId()),
- _networkMgr.isSecurityGroupSupportedInNetwork(network),
_networkMgr.getNetworkTag(router.getHypervisorType(), network));
- SetNetworkACLCommand cmd = new SetNetworkACLCommand(rulesTO,
_itMgr.toNicTO(nicProfile, router.getHypervisorType()));
+ SetNetworkACLCommand cmd = new SetNetworkACLCommand(rulesTO,
getNicTO(router, guestNetworkId));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP,
getRouterControlIp(router.getId()));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP,
getRouterIpInNetwork(guestNetworkId, router.getId()));
cmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, guestVlan);
@@ -770,4 +700,94 @@ public class VpcVirtualNetworkApplianceManagerImpl extends
VirtualNetworkApplian
cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE,
dcVo.getNetworkType().toString());
cmds.addCommand(cmd);
}
+
+ @Override
+ public boolean finalizeCommandsOnStart(Commands cmds,
VirtualMachineProfile<DomainRouterVO> profile) {
+ DomainRouterVO router = profile.getVirtualMachine();
+
+ boolean isVpc = (router.getVpcId() != null);
+ boolean result = super.finalizeCommandsOnStart(cmds, profile);
+
+ if (!isVpc) {
+ return result;
+ }
+
+ //Get guest nic info
+ Map<Nic, Network> guestNics = new HashMap<Nic, Network>();
+ Map<Nic, Network> publicNics = new HashMap<Nic, Network>();
+
+ List<? extends Nic> routerNics = _nicDao.listByVmId(profile.getId());
+ for (Nic routerNic : routerNics) {
+ Network network = _networkMgr.getNetwork(routerNic.getNetworkId());
+ if (network.getTrafficType() == TrafficType.Guest) {
+ guestNics.put(routerNic, network);
+ } else if (network.getTrafficType() == TrafficType.Public) {
+ publicNics.put(routerNic, network);
+ }
+ }
+
+ List<PublicIp> publicIps = new ArrayList<PublicIp>(1);
+ try {
+ //add VPC router to public networks
+ for (Nic publicNic : publicNics.keySet()) {
+ Network publicNtwk = publicNics.get(publicNic);
+ IPAddressVO userIp =
_ipAddressDao.findByIpAndSourceNetworkId(publicNtwk.getId(),
+ publicNic.getIp4Address());
+ PublicIp publicIp = new PublicIp(userIp,
_vlanDao.findById(userIp.getVlanId()),
+
NetUtils.createSequenceBasedMacAddress(userIp.getMacAddress()));
+
+
+ if (publicIp.isSourceNat()) {
+ publicIps.add(publicIp);
+ }
+
+ PlugNicCommand plugNicCmd = new
PlugNicCommand(_itMgr.toVmTO(profile), getNicTO(router,
publicNic.getNetworkId()));
+ cmds.addCommand(plugNicCmd);
+ }
+
+ //if ip is source nat, create source nat command
+ if (!publicIps.isEmpty()) {
+ createVpcAssociateIPCommands(router, publicIps, cmds);
+ }
+
+ for (Nic guestNic : guestNics.keySet()) {
+ //plug guest nic
+ PlugNicCommand plugNicCmd = new
PlugNicCommand(_itMgr.toVmTO(profile), getNicTO(router,
guestNic.getNetworkId()));
+ cmds.addCommand(plugNicCmd);
+
+ //and set guest network
+ VirtualMachine vm = _vmDao.findById(router.getId());
+ NicProfile nicProfile = _networkMgr.getNicProfile(vm,
guestNic.getNetworkId());
+ SetupGuestNetworkCommand setupCmd =
createSetupGuestNetworkCommand(router, true, nicProfile);
+ cmds.addCommand(setupCmd);
+
+ }
+ } catch (Exception ex) {
+ s_logger.warn("Failed to add router " + router + " to network due
to exception ", ex);
+ return false;
+ }
+
+ boolean reprogramGuestNtwks = true;
+ if (profile.getParameter(Param.ReProgramGuestNetworks) != null &&
(Boolean) profile.getParameter(Param.ReProgramGuestNetworks) == false) {
+ reprogramGuestNtwks = false;
+ }
+
+ //get network ACLs for the router
+ List<Long> routerGuestNtwkIds =
_routerDao.getRouterNetworks(router.getId());
+ if (reprogramGuestNtwks) {
+ for (Long guestNetworkId : routerGuestNtwkIds) {
+ s_logger.debug("Resending network ACLs as a part of VPC
Virtual router start");
+
+ if
(_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId,
Service.Firewall, Provider.VPCVirtualRouter)) {
+ List<? extends NetworkACL> networkACLs =
_networkACLService.listNetworkACLs(guestNetworkId);
+ s_logger.debug("Found " + networkACLs.size() + " network
ACLs to apply as a part of VPC VR " + router + " start.");
+ if (!networkACLs.isEmpty()) {
+
createNetworkACLsCommands((List<NetworkACL>)networkACLs, router, cmds,
guestNetworkId);
+ }
+ }
+ }
+ }
+
+ return result;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b1e52dd/server/src/com/cloud/vm/VirtualMachineManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VirtualMachineManager.java
b/server/src/com/cloud/vm/VirtualMachineManager.java
index 56dc483..1f2b4b5 100644
--- a/server/src/com/cloud/vm/VirtualMachineManager.java
+++ b/server/src/com/cloud/vm/VirtualMachineManager.java
@@ -17,6 +17,7 @@ import java.util.List;
import java.util.Map;
import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.exception.AgentUnavailableException;
@@ -164,4 +165,11 @@ public interface VirtualMachineManager extends Manager {
*/
NicTO toNicTO(NicProfile nic, HypervisorType hypervisorType);
+ /**
+ * @param profile
+ * @param hvGuru
+ * @return
+ */
+ VirtualMachineTO toVmTO(VirtualMachineProfile<? extends VMInstanceVO>
profile);
+
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1b1e52dd/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 06699ae..af066ab 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1304,9 +1304,8 @@ public class VirtualMachineManagerImpl implements
VirtualMachineManager, Listene
VirtualMachineProfile<VMInstanceVO> profile = new
VirtualMachineProfileImpl<VMInstanceVO>(vm);
_networkMgr.prepareNicForMigration(profile, dest);
_storageMgr.prepareForMigration(profile, dest);
- HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType());
- VirtualMachineTO to = hvGuru.implement(profile);
+ VirtualMachineTO to = toVmTO(profile);
PrepareForMigrationCommand pfmc = new PrepareForMigrationCommand(to);
ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId,
State.Migrating, vm.getType(), vm.getId());
@@ -1411,6 +1410,13 @@ public class VirtualMachineManagerImpl implements
VirtualMachineManager, Listene
}
}
+ @Override
+ public VirtualMachineTO toVmTO(VirtualMachineProfile<? extends
VMInstanceVO> profile) {
+ HypervisorGuru hvGuru =
_hvGuruMgr.getGuru(profile.getVirtualMachine().getHypervisorType());
+ VirtualMachineTO to = hvGuru.implement(profile);
+ return to;
+ }
+
protected void cancelWorkItems(long nodeId) {
GlobalLock scanLock =
GlobalLock.getInternLock("vmmgr.cancel.workitem");