Search in sources :

Example 1 with SetStaticNatRulesAnswer

use of com.cloud.agent.api.routing.SetStaticNatRulesAnswer in project cloudstack by apache.

the class NetscalerElement method applyStaticNats.

@Override
public boolean applyStaticNats(Network config, List<? extends StaticNat> rules) throws ResourceUnavailableException {
    if (!canHandle(config, Service.StaticNat)) {
        return false;
    }
    boolean multiNetScalerDeployment = Boolean.valueOf(_configDao.getValue(Config.EIPWithMultipleNetScalersEnabled.key()));
    try {
        if (!multiNetScalerDeployment) {
            String errMsg;
            ExternalLoadBalancerDeviceVO lbDevice = getExternalLoadBalancerForNetwork(config);
            if (lbDevice == null) {
                try {
                    lbDevice = allocateLoadBalancerForNetwork(config);
                } catch (Exception e) {
                    errMsg = "Could not allocate a NetSclaer load balancer for configuring static NAT rules due to" + e.getMessage();
                    s_logger.error(errMsg);
                    throw new ResourceUnavailableException(errMsg, this.getClass(), 0);
                }
            }
            if (!isNetscalerDevice(lbDevice.getDeviceName())) {
                errMsg = "There are no NetScaler load balancer assigned for this network. So NetScaler element will not be handling the static nat rules.";
                s_logger.error(errMsg);
                throw new ResourceUnavailableException(errMsg, this.getClass(), 0);
            }
            SetStaticNatRulesAnswer answer = null;
            List<StaticNatRuleTO> rulesTO = null;
            if (rules != null) {
                rulesTO = new ArrayList<StaticNatRuleTO>();
                for (StaticNat rule : rules) {
                    IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId());
                    StaticNatRuleTO ruleTO = new StaticNatRuleTO(0, sourceIp.getAddress().addr(), null, null, rule.getDestIpAddress(), null, null, null, rule.isForRevoke(), false);
                    rulesTO.add(ruleTO);
                }
            }
            SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(rulesTO, null);
            answer = (SetStaticNatRulesAnswer) _agentMgr.send(lbDevice.getHostId(), cmd);
            if (answer == null) {
                return false;
            } else {
                return answer.getResult();
            }
        } else {
            if (rules != null) {
                for (StaticNat rule : rules) {
                    // validate if EIP rule can be configured.
                    ExternalLoadBalancerDeviceVO lbDevice = getNetScalerForEIP(rule);
                    if (lbDevice == null) {
                        String errMsg = "There is no NetScaler device configured to perform EIP to guest IP address: " + rule.getDestIpAddress();
                        s_logger.error(errMsg);
                        throw new ResourceUnavailableException(errMsg, this.getClass(), 0);
                    }
                    List<StaticNatRuleTO> rulesTO = new ArrayList<StaticNatRuleTO>();
                    IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId());
                    StaticNatRuleTO ruleTO = new StaticNatRuleTO(0, sourceIp.getAddress().addr(), null, null, rule.getDestIpAddress(), null, null, null, rule.isForRevoke(), false);
                    rulesTO.add(ruleTO);
                    SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(rulesTO, null);
                    // send commands to configure INAT rule on the NetScaler
                    // device
                    SetStaticNatRulesAnswer answer = (SetStaticNatRulesAnswer) _agentMgr.send(lbDevice.getHostId(), cmd);
                    if (answer == null) {
                        String errMsg = "Failed to configure INAT rule on NetScaler device " + lbDevice.getHostId();
                        s_logger.error(errMsg);
                        throw new ResourceUnavailableException(errMsg, this.getClass(), 0);
                    }
                }
                return true;
            }
        }
        return true;
    } catch (Exception e) {
        s_logger.error("Failed to configure StaticNat rule due to " + e.getMessage());
        return false;
    }
}
Also used : StaticNatRuleTO(com.cloud.agent.api.to.StaticNatRuleTO) SetStaticNatRulesCommand(com.cloud.agent.api.routing.SetStaticNatRulesCommand) ArrayList(java.util.ArrayList) AgentUnavailableException(com.cloud.exception.AgentUnavailableException) JSONException(org.json.JSONException) InsufficientCapacityException(com.cloud.exception.InsufficientCapacityException) ServerApiException(org.apache.cloudstack.api.ServerApiException) ResourceUnavailableException(com.cloud.exception.ResourceUnavailableException) CloudRuntimeException(com.cloud.utils.exception.CloudRuntimeException) InsufficientNetworkCapacityException(com.cloud.exception.InsufficientNetworkCapacityException) InvalidParameterValueException(com.cloud.exception.InvalidParameterValueException) ConcurrentOperationException(com.cloud.exception.ConcurrentOperationException) ConfigurationException(javax.naming.ConfigurationException) StaticNat(com.cloud.network.rules.StaticNat) ExternalLoadBalancerDeviceVO(com.cloud.network.dao.ExternalLoadBalancerDeviceVO) ResourceUnavailableException(com.cloud.exception.ResourceUnavailableException) IpAddress(com.cloud.network.IpAddress) PublicIpAddress(com.cloud.network.PublicIpAddress) SetStaticNatRulesAnswer(com.cloud.agent.api.routing.SetStaticNatRulesAnswer)

Example 2 with SetStaticNatRulesAnswer

use of com.cloud.agent.api.routing.SetStaticNatRulesAnswer in project cloudstack by apache.

the class NetscalerResource method execute.

private synchronized Answer execute(final SetStaticNatRulesCommand cmd, final int numRetries) {
    if (_isSdx) {
        return Answer.createUnsupportedCommandAnswer(cmd);
    }
    final String[] results = new String[cmd.getRules().length];
    int i = 0;
    boolean endResult = true;
    try {
        for (final StaticNatRuleTO rule : cmd.getRules()) {
            final String srcIp = rule.getSrcIp();
            final String dstIP = rule.getDstIp();
            final String iNatRuleName = generateInatRuleName(srcIp, dstIP);
            final String rNatRuleName = generateRnatRuleName(srcIp, dstIP);
            inat iNatRule = null;
            rnat rnatRule = null;
            if (!rule.revoked()) {
                try {
                    iNatRule = inat.get(_netscalerService, iNatRuleName);
                } catch (final nitro_exception e) {
                    if (e.getErrorCode() != NitroError.NS_RESOURCE_NOT_EXISTS) {
                        throw e;
                    }
                }
                if (iNatRule == null) {
                    iNatRule = new inat();
                    iNatRule.set_name(iNatRuleName);
                    iNatRule.set_publicip(srcIp);
                    iNatRule.set_privateip(dstIP);
                    iNatRule.set_usnip("OFF");
                    iNatRule.set_usip("ON");
                    try {
                        apiCallResult = inat.add(_netscalerService, iNatRule);
                    } catch (final nitro_exception e) {
                        if (e.getErrorCode() != NitroError.NS_RESOURCE_EXISTS) {
                            throw e;
                        }
                    }
                    s_logger.debug("Created Inat rule on the Netscaler device " + _ip + " to enable static NAT from " + srcIp + " to " + dstIP);
                }
                try {
                    final rnat[] rnatRules = rnat.get(_netscalerService);
                    if (rnatRules != null) {
                        for (final rnat rantrule : rnatRules) {
                            if (rantrule.get_network().equalsIgnoreCase(rNatRuleName)) {
                                rnatRule = rantrule;
                                break;
                            }
                        }
                    }
                } catch (final nitro_exception e) {
                    throw e;
                }
                if (rnatRule == null) {
                    rnatRule = new rnat();
                    rnatRule.set_natip(srcIp);
                    rnatRule.set_network(dstIP);
                    rnatRule.set_netmask("255.255.255.255");
                    try {
                        apiCallResult = rnat.update(_netscalerService, rnatRule);
                    } catch (final nitro_exception e) {
                        if (e.getErrorCode() != NitroError.NS_RESOURCE_EXISTS) {
                            throw e;
                        }
                    }
                    s_logger.debug("Created Rnat rule on the Netscaler device " + _ip + " to enable revese static NAT from " + dstIP + " to " + srcIp);
                }
            } else {
                try {
                    inat.delete(_netscalerService, iNatRuleName);
                    final rnat[] rnatRules = rnat.get(_netscalerService);
                    if (rnatRules != null) {
                        for (final rnat rantrule : rnatRules) {
                            if (rantrule.get_network().equalsIgnoreCase(dstIP)) {
                                rnatRule = rantrule;
                                rnat.clear(_netscalerService, rnatRule);
                                break;
                            }
                        }
                    }
                } catch (final nitro_exception e) {
                    if (e.getErrorCode() != NitroError.NS_RESOURCE_NOT_EXISTS) {
                        throw e;
                    }
                }
                s_logger.debug("Deleted Inat rule on the Netscaler device " + _ip + " to remove static NAT from " + srcIp + " to " + dstIP);
            }
            saveConfiguration();
            results[i++] = "Static nat rule from " + srcIp + " to " + dstIP + " successfully " + (rule.revoked() ? " revoked." : " created.");
        }
    } catch (final Exception e) {
        if (shouldRetry(numRetries)) {
            return retry(cmd, numRetries);
        }
        results[i++] = "Configuring static nat rule failed due to " + e.getMessage();
        endResult = false;
        return new SetStaticNatRulesAnswer(cmd, results, endResult);
    }
    return new SetStaticNatRulesAnswer(cmd, results, endResult);
}
Also used : StaticNatRuleTO(com.cloud.agent.api.to.StaticNatRuleTO) com.citrix.netscaler.nitro.exception.nitro_exception(com.citrix.netscaler.nitro.exception.nitro_exception) com.citrix.netscaler.nitro.resource.config.network.inat(com.citrix.netscaler.nitro.resource.config.network.inat) com.citrix.netscaler.nitro.resource.config.network.rnat(com.citrix.netscaler.nitro.resource.config.network.rnat) ExecutionException(com.cloud.utils.exception.ExecutionException) IOException(java.io.IOException) ConfigurationException(javax.naming.ConfigurationException) SetStaticNatRulesAnswer(com.cloud.agent.api.routing.SetStaticNatRulesAnswer)

Example 3 with SetStaticNatRulesAnswer

use of com.cloud.agent.api.routing.SetStaticNatRulesAnswer in project cloudstack by apache.

the class HypervDirectConnectResource method execute.

protected Answer execute(final SetStaticNatRulesCommand cmd) {
    if (cmd.getVpcId() != null) {
    // return SetVPCStaticNatRules(cmd);
    }
    if (s_logger.isInfoEnabled()) {
        s_logger.info("Executing resource SetFirewallRuleCommand: " + s_gson.toJson(cmd));
    }
    String args = null;
    final String[] results = new String[cmd.getRules().length];
    int i = 0;
    boolean endResult = true;
    for (final StaticNatRuleTO rule : cmd.getRules()) {
        // 1:1 NAT needs instanceip;publicip;domrip;op
        args = rule.revoked() ? " -D " : " -A ";
        args += " -l " + rule.getSrcIp();
        args += " -r " + rule.getDstIp();
        if (rule.getProtocol() != null) {
            args += " -P " + rule.getProtocol().toLowerCase();
        }
        args += " -d " + rule.getStringSrcPortRange();
        args += " -G ";
        try {
            final String controlIp = getRouterSshControlIp(cmd);
            final Pair<Boolean, String> result = SshHelper.sshExecute(controlIp, DEFAULT_DOMR_SSHPORT, "root", getSystemVMKeyFile(), null, "/root/firewall.sh " + args);
            if (s_logger.isDebugEnabled()) {
                s_logger.debug("Executing script on domain router " + controlIp + ": /root/firewall.sh " + args);
            }
            if (!result.first()) {
                s_logger.error("SetStaticNatRulesCommand failure on setting one rule. args: " + args);
                results[i++] = "Failed";
                endResult = false;
            } else {
                results[i++] = null;
            }
        } catch (final Throwable e) {
            s_logger.error("SetStaticNatRulesCommand (args: " + args + ") failed on setting one rule due to " + e.getMessage());
            results[i++] = "Failed";
            endResult = false;
        }
    }
    return new SetStaticNatRulesAnswer(cmd, results, endResult);
}
Also used : StaticNatRuleTO(com.cloud.agent.api.to.StaticNatRuleTO) SetStaticNatRulesAnswer(com.cloud.agent.api.routing.SetStaticNatRulesAnswer)

Aggregations

SetStaticNatRulesAnswer (com.cloud.agent.api.routing.SetStaticNatRulesAnswer)3 StaticNatRuleTO (com.cloud.agent.api.to.StaticNatRuleTO)3 ConfigurationException (javax.naming.ConfigurationException)2 com.citrix.netscaler.nitro.exception.nitro_exception (com.citrix.netscaler.nitro.exception.nitro_exception)1 com.citrix.netscaler.nitro.resource.config.network.inat (com.citrix.netscaler.nitro.resource.config.network.inat)1 com.citrix.netscaler.nitro.resource.config.network.rnat (com.citrix.netscaler.nitro.resource.config.network.rnat)1 SetStaticNatRulesCommand (com.cloud.agent.api.routing.SetStaticNatRulesCommand)1 AgentUnavailableException (com.cloud.exception.AgentUnavailableException)1 ConcurrentOperationException (com.cloud.exception.ConcurrentOperationException)1 InsufficientCapacityException (com.cloud.exception.InsufficientCapacityException)1 InsufficientNetworkCapacityException (com.cloud.exception.InsufficientNetworkCapacityException)1 InvalidParameterValueException (com.cloud.exception.InvalidParameterValueException)1 ResourceUnavailableException (com.cloud.exception.ResourceUnavailableException)1 IpAddress (com.cloud.network.IpAddress)1 PublicIpAddress (com.cloud.network.PublicIpAddress)1 ExternalLoadBalancerDeviceVO (com.cloud.network.dao.ExternalLoadBalancerDeviceVO)1 StaticNat (com.cloud.network.rules.StaticNat)1 CloudRuntimeException (com.cloud.utils.exception.CloudRuntimeException)1 ExecutionException (com.cloud.utils.exception.ExecutionException)1 IOException (java.io.IOException)1