Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

93 changes: 52 additions & 41 deletions server/src/com/cloud/network/element/VirtualRouterElement.java
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@
import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
Expand Down Expand Up @@ -262,6 +261,7 @@ public boolean prepare(final Network network, final NicProfile nic, final Virtua

@Override
public boolean applyFWRules(final Network network, final List<? extends FirewallRule> rules) throws ResourceUnavailableException {
boolean result = true;
if (canHandle(network, Service.Firewall)) {
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
Expand All @@ -281,14 +281,11 @@ public boolean applyFWRules(final Network network, final List<? extends Firewall
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);

if (!networkTopology.applyFirewallRules(network, rules, routers)) {
throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
} else {
return true;
for (final DomainRouterVO domainRouterVO : routers) {
result = result && networkTopology.applyFirewallRules(network, rules, domainRouterVO);
}
} else {
return true;
}
return result;
}

/*
Expand Down Expand Up @@ -405,6 +402,7 @@ public boolean validateLBRule(final Network network, final LoadBalancingRule rul

@Override
public boolean applyLBRules(final Network network, final List<LoadBalancingRule> rules) throws ResourceUnavailableException {
boolean result = true;
if (canHandle(network, Service.Lb)) {
if (!canHandleLbRules(rules)) {
return false;
Expand All @@ -419,14 +417,11 @@ public boolean applyLBRules(final Network network, final List<LoadBalancingRule>
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);

if (!networkTopology.applyLoadBalancingRules(network, rules, routers)) {
throw new CloudRuntimeException("Failed to apply load balancing rules in network " + network.getId());
} else {
return true;
for (final DomainRouterVO domainRouterVO : routers) {
result = result && networkTopology.applyLoadBalancingRules(network, rules, domainRouterVO);
}
} else {
return false;
}
return result;
}

@Override
Expand Down Expand Up @@ -502,6 +497,7 @@ public boolean applyIps(final Network network, final List<? extends PublicIpAddr
break;
}
}
boolean result = true;
if (canHandle) {
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
Expand All @@ -512,10 +508,11 @@ public boolean applyIps(final Network network, final List<? extends PublicIpAddr
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);

return networkTopology.associatePublicIP(network, ipAddress, routers);
} else {
return false;
for (final DomainRouterVO domainRouterVO : routers) {
result = result && networkTopology.associatePublicIP(network, ipAddress, domainRouterVO);
}
}
return result;
}

@Override
Expand Down Expand Up @@ -659,6 +656,7 @@ private static Map<Service, Map<Capability, String>> setCapabilities() {

@Override
public boolean applyStaticNats(final Network network, final List<? extends StaticNat> rules) throws ResourceUnavailableException {
boolean result = true;
if (canHandle(network, Service.StaticNat)) {
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
Expand All @@ -669,10 +667,11 @@ public boolean applyStaticNats(final Network network, final List<? extends Stati
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);

return networkTopology.applyStaticNats(network, rules, routers);
} else {
return true;
for (final DomainRouterVO domainRouterVO : routers) {
result = result && networkTopology.applyStaticNats(network, rules, domainRouterVO);
}
}
return result;
}

@Override
Expand All @@ -681,20 +680,21 @@ public boolean shutdown(final Network network, final ReservationContext context,
if (routers == null || routers.isEmpty()) {
return true;
}
boolean result = true;
boolean stopResult = true;
boolean destroyResult = true;
for (final DomainRouterVO router : routers) {
result = result && _routerMgr.stop(router, false, context.getCaller(), context.getAccount()) != null;
stopResult = stopResult && _routerMgr.stop(router, false, context.getCaller(), context.getAccount()) != null;
if (!stopResult) {
s_logger.warn("Failed to stop virtual router element " + router + ", but would try to process clean up anyway.");
}
if (cleanup) {
if (!result) {
s_logger.warn("Failed to stop virtual router element " + router + ", but would try to process clean up anyway.");
}
result = _routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null;
if (!result) {
destroyResult = destroyResult && _routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null;
if (!destroyResult) {
s_logger.warn("Failed to clean up virtual router element " + router);
}
}
}
return result;
return stopResult & destroyResult;
}

@Override
Expand Down Expand Up @@ -735,7 +735,7 @@ public boolean savePassword(final Network network, final NicProfile nic, final V
// save the password in DB
for (final VirtualRouter router : routers) {
if (router.getState() == State.Running) {
return networkTopology.savePasswordToRouter(network, nic, uservm, routers);
return networkTopology.savePasswordToRouter(network, nic, uservm, router);
}
}
final String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword);
Expand Down Expand Up @@ -768,7 +768,11 @@ public boolean saveSSHKey(final Network network, final NicProfile nic, final Vir
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);

return networkTopology.saveSSHPublicKeyToRouter(network, nic, uservm, routers, sshPublicKey);
boolean result = true;
for (final DomainRouterVO domainRouterVO : routers) {
result = result && networkTopology.saveSSHPublicKeyToRouter(network, nic, uservm, domainRouterVO, sshPublicKey);
}
return result;
}

@Override
Expand All @@ -787,7 +791,11 @@ public boolean saveUserData(final Network network, final NicProfile nic, final V
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);

return networkTopology.saveUserDataToRouter(network, nic, uservm, routers);
boolean result = true;
for (final DomainRouterVO domainRouterVO : routers) {
result = result && networkTopology.saveUserDataToRouter(network, nic, uservm, domainRouterVO);
}
return result;
}

@Override
Expand Down Expand Up @@ -844,6 +852,7 @@ public VirtualRouterProvider addElement(final Long nspId, final Type providerTyp

@Override
public boolean applyPFRules(final Network network, final List<PortForwardingRule> rules) throws ResourceUnavailableException {
boolean result = true;
if (canHandle(network, Service.PortForwarding)) {
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
Expand All @@ -854,14 +863,11 @@ public boolean applyPFRules(final Network network, final List<PortForwardingRule
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);

if (!networkTopology.applyFirewallRules(network, rules, routers)) {
throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
} else {
return true;
for (final DomainRouterVO domainRouterVO : routers) {
result = result && networkTopology.applyFirewallRules(network, rules, domainRouterVO);
}
} else {
return true;
}
return result;
}

@Override
Expand Down Expand Up @@ -960,13 +966,13 @@ public boolean removeDhcpSupportForSubnet(final Network network) throws Resource
@Override
public boolean addDhcpEntry(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
boolean result = true;
if (canHandle(network, Service.Dhcp)) {
if (vm.getType() != VirtualMachine.Type.User) {
return false;
}

final VirtualMachineProfile uservm = vm;

final List<DomainRouterVO> routers = getRouters(network, dest);

if (routers == null || routers.size() == 0) {
Expand All @@ -976,14 +982,17 @@ public boolean addDhcpEntry(final Network network, final NicProfile nic, final V
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);

return networkTopology.applyDhcpEntry(network, nic, uservm, dest, routers);
for (final DomainRouterVO domainRouterVO : routers) {
result = result && networkTopology.applyDhcpEntry(network, nic, uservm, dest, domainRouterVO);
}
}
return false;
return result;
}

@Override
public boolean addPasswordAndUserdata(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest,
final ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
boolean result = true;
if (canHandle(network, Service.UserData)) {
if (vm.getType() != VirtualMachine.Type.User) {
return false;
Expand All @@ -1005,9 +1014,11 @@ public boolean addPasswordAndUserdata(final Network network, final NicProfile ni
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);

return networkTopology.applyUserData(network, nic, uservm, dest, routers);
for (final DomainRouterVO domainRouterVO : routers) {
result = result && networkTopology.applyUserData(network, nic, uservm, dest, domainRouterVO);
}
}
return false;
return result;
}

protected List<DomainRouterVO> getRouters(final Network network, final DeployDestination dest) {
Expand Down
Loading