CLOUDSTACK-9106 - Makes the router commands call more consistent.

- Checks the result of a call against the previous result. Either both are true or the method returns false.
   - Do not thrown exceptions because some calls are not handling/rethrowing them. It would cause runtime problems.
   - When doing a list.addAll(Arrays.asList(String[]{}) will cause problems when trying to cast the list.toArray() into an aray of String
     It would only work if instead of calling addAll() I would pass it straight into the constructor:
     e.g. List<String> l = new ArrayList(Arrays.asList(new String[]{});
          Stirng [] s = (String[]) l.toArray();
     But I did not like that implementation because it would require 2 arrays of string and combine them at the end.
This commit is contained in:
Wilder Rodrigues 2015-12-07 13:40:12 +01:00
parent 1738ce1740
commit 13eb789388
3 changed files with 75 additions and 92 deletions

View File

@ -70,7 +70,6 @@ import com.cloud.resource.ServerResource;
import com.cloud.resource.UnableDeleteHostException;
import com.cloud.utils.Pair;
import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
@ -439,7 +438,7 @@ StaticNatServiceProvider, IpDeployer {
break;
}
}
boolean result = false;
boolean result = true;
if (canHandle) {
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(
network.getId(), Role.VIRTUAL_ROUTER);
@ -454,7 +453,7 @@ StaticNatServiceProvider, IpDeployer {
final NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.associatePublicIP(network, ipAddress, domainRouterVO);
result = result && networkTopology.associatePublicIP(network, ipAddress, domainRouterVO);
}
}
return result;
@ -476,9 +475,9 @@ StaticNatServiceProvider, IpDeployer {
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
boolean result = false;
boolean result = true;
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.applyStaticNats(network, rules, domainRouterVO);
result = result && networkTopology.applyStaticNats(network, rules, domainRouterVO);
}
return result;
}
@ -486,9 +485,8 @@ StaticNatServiceProvider, IpDeployer {
@Override
public boolean applyPFRules(final Network network, final List<PortForwardingRule> rules)
throws ResourceUnavailableException {
boolean result = false;
if (!canHandle(network, Service.PortForwarding)) {
return result;
return false;
}
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(
network.getId(), Role.VIRTUAL_ROUTER);
@ -498,10 +496,11 @@ StaticNatServiceProvider, IpDeployer {
return true;
}
boolean result = true;
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.applyFirewallRules(network, rules, domainRouterVO);
result = result && networkTopology.applyFirewallRules(network, rules, domainRouterVO);
}
return result;
}
@ -509,10 +508,10 @@ StaticNatServiceProvider, IpDeployer {
@Override
public boolean applyLBRules(final Network network, final List<LoadBalancingRule> rules)
throws ResourceUnavailableException {
boolean result = false;
boolean result = true;
if (canHandle(network, Service.Lb)) {
if (!canHandleLbRules(rules)) {
return result;
return false;
}
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(
@ -521,19 +520,16 @@ StaticNatServiceProvider, IpDeployer {
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual "
+ "router doesn't exist in the network "
+ network.getId());
result = true;
return result;
return true;
}
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.applyLoadBalancingRules(network, rules, domainRouterVO);
result = result && networkTopology.applyLoadBalancingRules(network, rules, domainRouterVO);
if (!result) {
throw new CloudRuntimeException(
"Failed to apply load balancing rules in network "
+ network.getId());
s_logger.debug("Failed to apply load balancing rules in network " + network.getId());
}
}
}

View File

@ -95,7 +95,6 @@ import com.cloud.utils.component.AdapterBase;
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;
@ -283,10 +282,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.applyFirewallRules(network, rules, domainRouterVO);
if (!result) {
throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
}
result = result && networkTopology.applyFirewallRules(network, rules, domainRouterVO);
}
}
return result;
@ -406,7 +402,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@Override
public boolean applyLBRules(final Network network, final List<LoadBalancingRule> rules) throws ResourceUnavailableException {
boolean result = false;
boolean result = true;
if (canHandle(network, Service.Lb)) {
if (!canHandleLbRules(rules)) {
return false;
@ -422,10 +418,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.applyLoadBalancingRules(network, rules, domainRouterVO);
if (!result) {
throw new CloudRuntimeException("Failed to apply load balancing rules in network " + network.getId());
}
result = result && networkTopology.applyLoadBalancingRules(network, rules, domainRouterVO);
}
}
return result;
@ -497,7 +490,6 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@Override
public boolean applyIps(final Network network, final List<? extends PublicIpAddress> ipAddress, final Set<Service> services) throws ResourceUnavailableException {
boolean result = false;
boolean canHandle = true;
for (final Service service : services) {
if (!canHandle(network, service)) {
@ -505,6 +497,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
break;
}
}
boolean result = true;
if (canHandle) {
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
@ -516,7 +509,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.associatePublicIP(network, ipAddress, domainRouterVO);
result = result && networkTopology.associatePublicIP(network, ipAddress, domainRouterVO);
}
}
return result;
@ -668,14 +661,14 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply static nat on the backend; virtual " + "router doesn't exist in the network " + network.getId());
return result;
return true;
}
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.applyStaticNats(network, rules, domainRouterVO);
result = result && networkTopology.applyStaticNats(network, rules, domainRouterVO);
}
}
return result;
@ -687,20 +680,21 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
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
@ -760,15 +754,13 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@Override
public boolean saveSSHKey(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final String sshPublicKey) throws ResourceUnavailableException {
boolean result = false;
if (!canHandle(network, null)) {
return result;
return false;
}
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Can't find virtual router element in network " + network.getId());
result = true;
return result;
return true;
}
final VirtualMachineProfile uservm = vm;
@ -776,23 +768,22 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
boolean result = true;
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.saveSSHPublicKeyToRouter(network, nic, uservm, domainRouterVO, sshPublicKey);
result = result && networkTopology.saveSSHPublicKeyToRouter(network, nic, uservm, domainRouterVO, sshPublicKey);
}
return result;
}
@Override
public boolean saveUserData(final Network network, final NicProfile nic, final VirtualMachineProfile vm) throws ResourceUnavailableException {
boolean result = false;
if (!canHandle(network, null)) {
return result;
return false;
}
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Can't find virtual router element in network " + network.getId());
result = true;
return result;
return true;
}
final VirtualMachineProfile uservm = vm;
@ -800,8 +791,9 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
boolean result = true;
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.saveUserDataToRouter(network, nic, uservm, domainRouterVO);
result = result && networkTopology.saveUserDataToRouter(network, nic, uservm, domainRouterVO);
}
return result;
}
@ -860,23 +852,19 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@Override
public boolean applyPFRules(final Network network, final List<PortForwardingRule> rules) throws ResourceUnavailableException {
boolean result = false;
boolean result = true;
if (canHandle(network, Service.PortForwarding)) {
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " + network.getId());
result = true;
return result;
return true;
}
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.applyFirewallRules(network, rules, domainRouterVO);
if (!result) {
throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
}
result = result && networkTopology.applyFirewallRules(network, rules, domainRouterVO);
}
}
return result;
@ -978,10 +966,10 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@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 = false;
boolean result = true;
if (canHandle(network, Service.Dhcp)) {
if (vm.getType() != VirtualMachine.Type.User) {
return result;
return false;
}
final VirtualMachineProfile uservm = vm;
@ -995,7 +983,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.applyDhcpEntry(network, nic, uservm, dest, domainRouterVO);
result = result && networkTopology.applyDhcpEntry(network, nic, uservm, dest, domainRouterVO);
}
}
return result;
@ -1004,16 +992,15 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@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 = false;
boolean result = true;
if (canHandle(network, Service.UserData)) {
if (vm.getType() != VirtualMachine.Type.User) {
return result;
return false;
}
if (network.getIp6Gateway() != null) {
s_logger.info("Skip password and userdata service setup for IPv6 VM");
result = true;
return result;
return true;
}
final VirtualMachineProfile uservm = vm;
@ -1028,7 +1015,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.applyUserData(network, nic, uservm, dest, domainRouterVO);
result = result && networkTopology.applyUserData(network, nic, uservm, dest, domainRouterVO);
}
}
return result;

View File

@ -16,6 +16,8 @@
// under the License.
package com.cloud.network.element;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -116,8 +118,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
@Qualifier("vpcNetworkHelper")
private VpcNetworkHelperImpl _vpcNetWprkHelper;
@Inject
private RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder;
@Inject RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder;
@Override
protected boolean canHandle(final Network network, final Service service) {
@ -278,13 +279,13 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
@Override
public boolean shutdown(final Network network, final ReservationContext context, final boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
boolean success = true;
final Long vpcId = network.getVpcId();
if (vpcId == null) {
s_logger.debug("Network " + network + " doesn't belong to any vpc, so skipping unplug nic part");
return success;
return true;
}
boolean success = true;
final List<? extends VirtualRouter> routers = _routerDao.listByVpcId(vpcId);
for (final VirtualRouter router : routers) {
// 1) Check if router is already a part of the network
@ -306,13 +307,13 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
@Override
public boolean destroy(final Network config, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
boolean success = true;
final Long vpcId = config.getVpcId();
if (vpcId == null) {
s_logger.debug("Network " + config + " doesn't belong to any vpc, so skipping unplug nic part");
return success;
return true;
}
boolean success = true;
final List<? extends VirtualRouter> routers = _routerDao.listByVpcId(vpcId);
for (final VirtualRouter router : routers) {
// 1) Check if router is already a part of the network
@ -412,18 +413,15 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
@Override
public boolean createPrivateGateway(final PrivateGateway gateway) throws ConcurrentOperationException, ResourceUnavailableException {
boolean result = false;
if (gateway.getType() != VpcGateway.Type.Private) {
s_logger.warn("Type of vpc gateway is not " + VpcGateway.Type.Private);
return result;
return true;
}
final List<DomainRouterVO> routers = _vpcRouterMgr.getVpcRouters(gateway.getVpcId());
if (routers == null || routers.isEmpty()) {
s_logger.debug(getName() + " element doesn't need to create Private gateway on the backend; VPC virtual " + "router doesn't exist in the vpc id=" + gateway.getVpcId());
result = true;
return result;
return true;
}
s_logger.info("Adding VPC routers to Guest Network: " + routers.size() + " to be added!");
@ -431,6 +429,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
final DataCenterVO dcVO = _dcDao.findById(gateway.getZoneId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
boolean result = true;
final Network network = _networkDao.findById(gateway.getNetworkId());
final boolean isPrivateGateway = true;
@ -438,13 +437,10 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
if (networkTopology.setupPrivateGateway(gateway, domainRouterVO)) {
try {
final List<NetworkACLItemVO> rules = _networkACLItemDao.listByACL(gateway.getNetworkACLId());
result = networkTopology.applyNetworkACLs(network, rules, domainRouterVO, isPrivateGateway);
if (!result) {
throw new CloudRuntimeException("Failed to apply network acl in network " + network.getId());
}
result = result && networkTopology.applyNetworkACLs(network, rules, domainRouterVO, isPrivateGateway);
} catch (final Exception ex) {
s_logger.debug("Failed to apply network acl id " + gateway.getNetworkACLId() + " on gateway ");
return result;
return false;
}
}
}
@ -486,20 +482,20 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
break;
}
}
boolean result = false;
boolean result = true;
if (canHandle) {
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug(getName() + " element doesn't need to associate ip addresses on the backend; VPC virtual " + "router doesn't exist in the network "
+ network.getId());
return result;
return false;
}
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.associatePublicIP(network, ipAddress, domainRouterVO);
result = result && networkTopology.associatePublicIP(network, ipAddress, domainRouterVO);
}
}
return result;
@ -512,7 +508,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
final List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " + network.getId());
return result;
return true;
}
final DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
@ -520,7 +516,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
for (final DomainRouterVO domainRouterVO : routers) {
try {
result = networkTopology.applyNetworkACLs(network, rules, domainRouterVO, false);
result = result && networkTopology.applyNetworkACLs(network, rules, domainRouterVO, false);
} catch (final Exception ex) {
s_logger.debug("Failed to apply network acl in network " + network.getId());
}
@ -569,10 +565,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
boolean result = true;
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.applyNetworkACLs(network, rules, domainRouterVO, isPrivateGateway);
if (!result) {
throw new CloudRuntimeException("Failed to apply network acl in network " + network.getId());
}
result = result && networkTopology.applyNetworkACLs(network, rules, domainRouterVO, isPrivateGateway);
}
return result;
}
@ -642,24 +635,31 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
@Override
public String[] applyVpnUsers(final RemoteAccessVpn vpn, final List<? extends VpnUser> users) throws ResourceUnavailableException {
if (vpn.getVpcId() == null) {
final Long vpcId = vpn.getVpcId();
if (vpcId == null) {
return null;
}
final List<DomainRouterVO> routers = _vpcRouterMgr.getVpcRouters(vpn.getVpcId());
final List<DomainRouterVO> routers = _vpcRouterMgr.getVpcRouters(vpcId);
if (routers == null) {
s_logger.debug("Cannot apply vpn users on the backend; virtual router doesn't exist in the network " + vpn.getVpcId());
s_logger.debug("Cannot apply vpn users on the backend; virtual router doesn't exist in the network " + vpcId);
return null;
}
final Vpc vpc = _entityMgr.findById(Vpc.class, vpn.getVpcId());
final Vpc vpc = _entityMgr.findById(Vpc.class, vpcId);
final DataCenterVO dcVO = _dcDao.findById(vpc.getZoneId());
final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
String[] result = null;
final List<String> combinedResults = new ArrayList<String>();
for (final DomainRouterVO domainRouterVO : routers) {
result = networkTopology.applyVpnUsers(vpn, users, domainRouterVO);
combinedResults.addAll(Arrays.asList(result));
}
result = new String[combinedResults.size()];
final Object [] resultCast = combinedResults.toArray();
System.arraycopy(resultCast, 0, result, 0, resultCast.length);
return result;
}