mirror of https://github.com/apache/cloudstack.git
CLOUDSTACK-8590 - Refactoring NiciraNVP resource
- Adding remaining command wrappers Signed-off-by: wilderrodrigues <wrodrigues@schubergphilis.com>
This commit is contained in:
parent
b54126918b
commit
644458f5ac
|
|
@ -28,29 +28,17 @@ import org.apache.log4j.Logger;
|
|||
import com.cloud.agent.IAgentControl;
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.Command;
|
||||
import com.cloud.agent.api.ConfigurePortForwardingRulesOnLogicalRouterAnswer;
|
||||
import com.cloud.agent.api.ConfigurePortForwardingRulesOnLogicalRouterCommand;
|
||||
import com.cloud.agent.api.ConfigurePublicIpsOnLogicalRouterAnswer;
|
||||
import com.cloud.agent.api.ConfigurePublicIpsOnLogicalRouterCommand;
|
||||
import com.cloud.agent.api.ConfigureStaticNatRulesOnLogicalRouterAnswer;
|
||||
import com.cloud.agent.api.ConfigureStaticNatRulesOnLogicalRouterCommand;
|
||||
import com.cloud.agent.api.DeleteLogicalRouterAnswer;
|
||||
import com.cloud.agent.api.DeleteLogicalRouterCommand;
|
||||
import com.cloud.agent.api.PingCommand;
|
||||
import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.agent.api.StartupNiciraNvpCommand;
|
||||
import com.cloud.agent.api.to.PortForwardingRuleTO;
|
||||
import com.cloud.agent.api.to.StaticNatRuleTO;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.Host.Type;
|
||||
import com.cloud.network.nicira.ControlClusterStatus;
|
||||
import com.cloud.network.nicira.DestinationNatRule;
|
||||
import com.cloud.network.nicira.LogicalRouterPort;
|
||||
import com.cloud.network.nicira.Match;
|
||||
import com.cloud.network.nicira.NatRule;
|
||||
import com.cloud.network.nicira.NiciraNvpApi;
|
||||
import com.cloud.network.nicira.NiciraNvpApiException;
|
||||
import com.cloud.network.nicira.NiciraNvpList;
|
||||
import com.cloud.network.nicira.SourceNatRule;
|
||||
import com.cloud.network.utils.CommandRetryUtility;
|
||||
import com.cloud.resource.ServerResource;
|
||||
|
|
@ -185,21 +173,9 @@ public class NiciraNvpResource implements ServerResource {
|
|||
try {
|
||||
return wrapper.execute(cmd, this);
|
||||
} catch (final Exception e) {
|
||||
//return Answer.createUnsupportedCommandAnswer(cmd);
|
||||
// [TODO] Remove when all the commands are refactored.
|
||||
s_logger.debug("Received unsupported command " + cmd.toString());
|
||||
return Answer.createUnsupportedCommandAnswer(cmd);
|
||||
}
|
||||
|
||||
if (cmd instanceof DeleteLogicalRouterCommand) {
|
||||
return executeRequest((DeleteLogicalRouterCommand)cmd, NUM_RETRIES);
|
||||
} else if (cmd instanceof ConfigureStaticNatRulesOnLogicalRouterCommand) {
|
||||
return executeRequest((ConfigureStaticNatRulesOnLogicalRouterCommand)cmd, NUM_RETRIES);
|
||||
} else if (cmd instanceof ConfigurePortForwardingRulesOnLogicalRouterCommand) {
|
||||
return executeRequest((ConfigurePortForwardingRulesOnLogicalRouterCommand)cmd, NUM_RETRIES);
|
||||
} else if (cmd instanceof ConfigurePublicIpsOnLogicalRouterCommand) {
|
||||
return executeRequest((ConfigurePublicIpsOnLogicalRouterCommand)cmd, NUM_RETRIES);
|
||||
}
|
||||
s_logger.debug("Received unsupported command " + cmd.toString());
|
||||
return Answer.createUnsupportedCommandAnswer(cmd);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -215,175 +191,7 @@ public class NiciraNvpResource implements ServerResource {
|
|||
public void setAgentControl(final IAgentControl agentControl) {
|
||||
}
|
||||
|
||||
private Answer executeRequest(final DeleteLogicalRouterCommand cmd, final int numRetries) {
|
||||
try {
|
||||
niciraNvpApi.deleteLogicalRouter(cmd.getLogicalRouterUuid());
|
||||
return new DeleteLogicalRouterAnswer(cmd, true, "Logical Router deleted (uuid " + cmd.getLogicalRouterUuid() + ")");
|
||||
} catch (final NiciraNvpApiException e) {
|
||||
retryUtility.addRetry(cmd, NUM_RETRIES);
|
||||
return retryUtility.retry(cmd, DeleteLogicalRouterAnswer.class, e);
|
||||
}
|
||||
}
|
||||
|
||||
private Answer executeRequest(final ConfigurePublicIpsOnLogicalRouterCommand cmd, final int numRetries) {
|
||||
try {
|
||||
final NiciraNvpList<LogicalRouterPort> ports = niciraNvpApi.findLogicalRouterPortByGatewayServiceUuid(cmd.getLogicalRouterUuid(), cmd.getL3GatewayServiceUuid());
|
||||
if (ports.getResultCount() != 1) {
|
||||
return new ConfigurePublicIpsOnLogicalRouterAnswer(cmd, false, "No logical router ports found, unable to set ip addresses");
|
||||
}
|
||||
final LogicalRouterPort lrp = ports.getResults().get(0);
|
||||
lrp.setIpAddresses(cmd.getPublicCidrs());
|
||||
niciraNvpApi.updateLogicalRouterPort(cmd.getLogicalRouterUuid(), lrp);
|
||||
|
||||
return new ConfigurePublicIpsOnLogicalRouterAnswer(cmd, true, "Configured " + cmd.getPublicCidrs().size() + " ip addresses on logical router uuid " +
|
||||
cmd.getLogicalRouterUuid());
|
||||
} catch (final NiciraNvpApiException e) {
|
||||
retryUtility.addRetry(cmd, NUM_RETRIES);
|
||||
return retryUtility.retry(cmd, ConfigurePublicIpsOnLogicalRouterAnswer.class, e);
|
||||
}
|
||||
}
|
||||
|
||||
private Answer executeRequest(final ConfigureStaticNatRulesOnLogicalRouterCommand cmd, final int numRetries) {
|
||||
try {
|
||||
final NiciraNvpList<NatRule> existingRules = niciraNvpApi.findNatRulesByLogicalRouterUuid(cmd.getLogicalRouterUuid());
|
||||
// Rules of the game (also known as assumptions-that-will-make-stuff-break-later-on)
|
||||
// A SourceNat rule with a match other than a /32 cidr is assumed to be the "main" SourceNat rule
|
||||
// Any other SourceNat rule should have a corresponding DestinationNat rule
|
||||
|
||||
for (final StaticNatRuleTO rule : cmd.getRules()) {
|
||||
|
||||
final NatRule[] rulepair = generateStaticNatRulePair(rule.getDstIp(), rule.getSrcIp());
|
||||
|
||||
NatRule incoming = null;
|
||||
NatRule outgoing = null;
|
||||
|
||||
for (final NatRule storedRule : existingRules.getResults()) {
|
||||
if (storedRule.equalsIgnoreUuid(rulepair[1])) {
|
||||
// The outgoing rule exists
|
||||
outgoing = storedRule;
|
||||
s_logger.debug("Found matching outgoing rule " + outgoing.getUuid());
|
||||
if (incoming != null) {
|
||||
break;
|
||||
}
|
||||
} else if (storedRule.equalsIgnoreUuid(rulepair[0])) {
|
||||
// The incoming rule exists
|
||||
incoming = storedRule;
|
||||
s_logger.debug("Found matching incoming rule " + incoming.getUuid());
|
||||
if (outgoing != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (incoming != null && outgoing != null) {
|
||||
if (rule.revoked()) {
|
||||
s_logger.debug("Deleting incoming rule " + incoming.getUuid());
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(cmd.getLogicalRouterUuid(), incoming.getUuid());
|
||||
|
||||
s_logger.debug("Deleting outgoing rule " + outgoing.getUuid());
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(cmd.getLogicalRouterUuid(), outgoing.getUuid());
|
||||
}
|
||||
} else {
|
||||
if (rule.revoked()) {
|
||||
s_logger.warn("Tried deleting a rule that does not exist, " + rule.getSrcIp() + " -> " + rule.getDstIp());
|
||||
break;
|
||||
}
|
||||
|
||||
rulepair[0] = niciraNvpApi.createLogicalRouterNatRule(cmd.getLogicalRouterUuid(), rulepair[0]);
|
||||
s_logger.debug("Created " + natRuleToString(rulepair[0]));
|
||||
|
||||
try {
|
||||
rulepair[1] = niciraNvpApi.createLogicalRouterNatRule(cmd.getLogicalRouterUuid(), rulepair[1]);
|
||||
s_logger.debug("Created " + natRuleToString(rulepair[1]));
|
||||
} catch (final NiciraNvpApiException ex) {
|
||||
s_logger.debug("Failed to create SourceNatRule, rolling back DestinationNatRule");
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(cmd.getLogicalRouterUuid(), rulepair[0].getUuid());
|
||||
throw ex; // Rethrow original exception
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return new ConfigureStaticNatRulesOnLogicalRouterAnswer(cmd, true, cmd.getRules().size() + " StaticNat rules applied");
|
||||
} catch (final NiciraNvpApiException e) {
|
||||
retryUtility.addRetry(cmd, NUM_RETRIES);
|
||||
return retryUtility.retry(cmd, ConfigureStaticNatRulesOnLogicalRouterAnswer.class, e);
|
||||
}
|
||||
}
|
||||
|
||||
private Answer executeRequest(final ConfigurePortForwardingRulesOnLogicalRouterCommand cmd, final int numRetries) {
|
||||
try {
|
||||
final NiciraNvpList<NatRule> existingRules = niciraNvpApi.findNatRulesByLogicalRouterUuid(cmd.getLogicalRouterUuid());
|
||||
// Rules of the game (also known as assumptions-that-will-make-stuff-break-later-on)
|
||||
// A SourceNat rule with a match other than a /32 cidr is assumed to be the "main" SourceNat rule
|
||||
// Any other SourceNat rule should have a corresponding DestinationNat rule
|
||||
|
||||
for (final PortForwardingRuleTO rule : cmd.getRules()) {
|
||||
if (rule.isAlreadyAdded() && !rule.revoked()) {
|
||||
// Don't need to do anything
|
||||
continue;
|
||||
}
|
||||
|
||||
if (rule.getDstPortRange()[0] != rule.getDstPortRange()[1] || rule.getSrcPortRange()[0] != rule.getSrcPortRange()[1]) {
|
||||
return new ConfigurePortForwardingRulesOnLogicalRouterAnswer(cmd, false, "Nicira NVP doesn't support port ranges for port forwarding");
|
||||
}
|
||||
|
||||
final NatRule[] rulepair = generatePortForwardingRulePair(rule.getDstIp(), rule.getDstPortRange(), rule.getSrcIp(), rule.getSrcPortRange(), rule.getProtocol());
|
||||
|
||||
NatRule incoming = null;
|
||||
NatRule outgoing = null;
|
||||
|
||||
for (final NatRule storedRule : existingRules.getResults()) {
|
||||
if (storedRule.equalsIgnoreUuid(rulepair[1])) {
|
||||
// The outgoing rule exists
|
||||
outgoing = storedRule;
|
||||
s_logger.debug("Found matching outgoing rule " + outgoing.getUuid());
|
||||
if (incoming != null) {
|
||||
break;
|
||||
}
|
||||
} else if (storedRule.equalsIgnoreUuid(rulepair[0])) {
|
||||
// The incoming rule exists
|
||||
incoming = storedRule;
|
||||
s_logger.debug("Found matching incoming rule " + incoming.getUuid());
|
||||
if (outgoing != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (incoming != null && outgoing != null) {
|
||||
if (rule.revoked()) {
|
||||
s_logger.debug("Deleting incoming rule " + incoming.getUuid());
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(cmd.getLogicalRouterUuid(), incoming.getUuid());
|
||||
|
||||
s_logger.debug("Deleting outgoing rule " + outgoing.getUuid());
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(cmd.getLogicalRouterUuid(), outgoing.getUuid());
|
||||
}
|
||||
} else {
|
||||
if (rule.revoked()) {
|
||||
s_logger.warn("Tried deleting a rule that does not exist, " + rule.getSrcIp() + " -> " + rule.getDstIp());
|
||||
break;
|
||||
}
|
||||
|
||||
rulepair[0] = niciraNvpApi.createLogicalRouterNatRule(cmd.getLogicalRouterUuid(), rulepair[0]);
|
||||
s_logger.debug("Created " + natRuleToString(rulepair[0]));
|
||||
|
||||
try {
|
||||
rulepair[1] = niciraNvpApi.createLogicalRouterNatRule(cmd.getLogicalRouterUuid(), rulepair[1]);
|
||||
s_logger.debug("Created " + natRuleToString(rulepair[1]));
|
||||
} catch (final NiciraNvpApiException ex) {
|
||||
s_logger.warn("NiciraNvpApiException during create call, rolling back previous create");
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(cmd.getLogicalRouterUuid(), rulepair[0].getUuid());
|
||||
throw ex; // Rethrow the original exception
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return new ConfigurePortForwardingRulesOnLogicalRouterAnswer(cmd, true, cmd.getRules().size() + " PortForwarding rules applied");
|
||||
} catch (final NiciraNvpApiException e) {
|
||||
retryUtility.addRetry(cmd, NUM_RETRIES);
|
||||
return retryUtility.retry(cmd, ConfigurePortForwardingRulesOnLogicalRouterAnswer.class, e);
|
||||
}
|
||||
}
|
||||
|
||||
private String natRuleToString(final NatRule rule) {
|
||||
public String natRuleToString(final NatRule rule) {
|
||||
|
||||
final StringBuilder natRuleStr = new StringBuilder();
|
||||
natRuleStr.append("Rule ");
|
||||
|
|
@ -427,7 +235,7 @@ public class NiciraNvpResource implements ServerResource {
|
|||
}
|
||||
}
|
||||
|
||||
protected NatRule[] generateStaticNatRulePair(final String insideIp, final String outsideIp) {
|
||||
public NatRule[] generateStaticNatRulePair(final String insideIp, final String outsideIp) {
|
||||
final NatRule[] rulepair = new NatRule[2];
|
||||
rulepair[0] = new DestinationNatRule();
|
||||
rulepair[0].setType("DestinationNatRule");
|
||||
|
|
@ -452,7 +260,7 @@ public class NiciraNvpResource implements ServerResource {
|
|||
|
||||
}
|
||||
|
||||
protected NatRule[] generatePortForwardingRulePair(final String insideIp, final int[] insidePorts, final String outsideIp, final int[] outsidePorts,
|
||||
public NatRule[] generatePortForwardingRulePair(final String insideIp, final int[] insidePorts, final String outsideIp, final int[] outsidePorts,
|
||||
final String protocol) {
|
||||
// Start with a basic static nat rule, then add port and protocol details
|
||||
final NatRule[] rulepair = generateStaticNatRulePair(insideIp, outsideIp);
|
||||
|
|
@ -508,4 +316,4 @@ public class NiciraNvpResource implements ServerResource {
|
|||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
//
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
//
|
||||
|
||||
package com.cloud.network.resource.wrapper;
|
||||
|
||||
import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.ConfigurePortForwardingRulesOnLogicalRouterAnswer;
|
||||
import com.cloud.agent.api.ConfigurePortForwardingRulesOnLogicalRouterCommand;
|
||||
import com.cloud.agent.api.to.PortForwardingRuleTO;
|
||||
import com.cloud.network.nicira.NatRule;
|
||||
import com.cloud.network.nicira.NiciraNvpApi;
|
||||
import com.cloud.network.nicira.NiciraNvpApiException;
|
||||
import com.cloud.network.nicira.NiciraNvpList;
|
||||
import com.cloud.network.resource.NiciraNvpResource;
|
||||
import com.cloud.network.utils.CommandRetryUtility;
|
||||
import com.cloud.resource.CommandWrapper;
|
||||
import com.cloud.resource.ResourceWrapper;
|
||||
|
||||
@ResourceWrapper(handles = ConfigurePortForwardingRulesOnLogicalRouterCommand.class)
|
||||
public final class NiciraNvpConfigurePortForwardingRulesCommandWrapper extends CommandWrapper<ConfigurePortForwardingRulesOnLogicalRouterCommand, Answer, NiciraNvpResource> {
|
||||
|
||||
private static final Logger s_logger = Logger.getLogger(NiciraNvpConfigurePortForwardingRulesCommandWrapper.class);
|
||||
|
||||
@Override
|
||||
public Answer execute(final ConfigurePortForwardingRulesOnLogicalRouterCommand command, final NiciraNvpResource niciraNvpResource) {
|
||||
final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
|
||||
try {
|
||||
final NiciraNvpList<NatRule> existingRules = niciraNvpApi.findNatRulesByLogicalRouterUuid(command.getLogicalRouterUuid());
|
||||
// Rules of the game (also known as assumptions-that-will-make-stuff-break-later-on)
|
||||
// A SourceNat rule with a match other than a /32 cidr is assumed to be the "main" SourceNat rule
|
||||
// Any other SourceNat rule should have a corresponding DestinationNat rule
|
||||
|
||||
for (final PortForwardingRuleTO rule : command.getRules()) {
|
||||
if (rule.isAlreadyAdded() && !rule.revoked()) {
|
||||
// Don't need to do anything
|
||||
continue;
|
||||
}
|
||||
|
||||
if (rule.getDstPortRange()[0] != rule.getDstPortRange()[1] || rule.getSrcPortRange()[0] != rule.getSrcPortRange()[1]) {
|
||||
return new ConfigurePortForwardingRulesOnLogicalRouterAnswer(command, false, "Nicira NVP doesn't support port ranges for port forwarding");
|
||||
}
|
||||
|
||||
final NatRule[] rulepair = niciraNvpResource.generatePortForwardingRulePair(rule.getDstIp(), rule.getDstPortRange(), rule.getSrcIp(), rule.getSrcPortRange(), rule.getProtocol());
|
||||
|
||||
NatRule incoming = null;
|
||||
NatRule outgoing = null;
|
||||
|
||||
for (final NatRule storedRule : existingRules.getResults()) {
|
||||
if (storedRule.equalsIgnoreUuid(rulepair[1])) {
|
||||
// The outgoing rule exists
|
||||
outgoing = storedRule;
|
||||
s_logger.debug("Found matching outgoing rule " + outgoing.getUuid());
|
||||
if (incoming != null) {
|
||||
break;
|
||||
}
|
||||
} else if (storedRule.equalsIgnoreUuid(rulepair[0])) {
|
||||
// The incoming rule exists
|
||||
incoming = storedRule;
|
||||
s_logger.debug("Found matching incoming rule " + incoming.getUuid());
|
||||
if (outgoing != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (incoming != null && outgoing != null) {
|
||||
if (rule.revoked()) {
|
||||
s_logger.debug("Deleting incoming rule " + incoming.getUuid());
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(command.getLogicalRouterUuid(), incoming.getUuid());
|
||||
|
||||
s_logger.debug("Deleting outgoing rule " + outgoing.getUuid());
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(command.getLogicalRouterUuid(), outgoing.getUuid());
|
||||
}
|
||||
} else {
|
||||
if (rule.revoked()) {
|
||||
s_logger.warn("Tried deleting a rule that does not exist, " + rule.getSrcIp() + " -> " + rule.getDstIp());
|
||||
break;
|
||||
}
|
||||
|
||||
rulepair[0] = niciraNvpApi.createLogicalRouterNatRule(command.getLogicalRouterUuid(), rulepair[0]);
|
||||
s_logger.debug("Created " + niciraNvpResource.natRuleToString(rulepair[0]));
|
||||
|
||||
try {
|
||||
rulepair[1] = niciraNvpApi.createLogicalRouterNatRule(command.getLogicalRouterUuid(), rulepair[1]);
|
||||
s_logger.debug("Created " + niciraNvpResource.natRuleToString(rulepair[1]));
|
||||
} catch (final NiciraNvpApiException ex) {
|
||||
s_logger.warn("NiciraNvpApiException during create call, rolling back previous create");
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(command.getLogicalRouterUuid(), rulepair[0].getUuid());
|
||||
throw ex; // Rethrow the original exception
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return new ConfigurePortForwardingRulesOnLogicalRouterAnswer(command, true, command.getRules().size() + " PortForwarding rules applied");
|
||||
} catch (final NiciraNvpApiException e) {
|
||||
final CommandRetryUtility retryUtility = niciraNvpResource.getRetryUtility();
|
||||
retryUtility.addRetry(command, NUM_RETRIES);
|
||||
return retryUtility.retry(command, ConfigurePortForwardingRulesOnLogicalRouterAnswer.class, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
//
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
//
|
||||
|
||||
package com.cloud.network.resource.wrapper;
|
||||
|
||||
import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES;
|
||||
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.ConfigurePublicIpsOnLogicalRouterAnswer;
|
||||
import com.cloud.agent.api.ConfigurePublicIpsOnLogicalRouterCommand;
|
||||
import com.cloud.network.nicira.LogicalRouterPort;
|
||||
import com.cloud.network.nicira.NiciraNvpApi;
|
||||
import com.cloud.network.nicira.NiciraNvpApiException;
|
||||
import com.cloud.network.nicira.NiciraNvpList;
|
||||
import com.cloud.network.resource.NiciraNvpResource;
|
||||
import com.cloud.network.utils.CommandRetryUtility;
|
||||
import com.cloud.resource.CommandWrapper;
|
||||
import com.cloud.resource.ResourceWrapper;
|
||||
|
||||
@ResourceWrapper(handles = ConfigurePublicIpsOnLogicalRouterCommand.class)
|
||||
public final class NiciraNvpConfigurePublicIpsCommandWrapper extends CommandWrapper<ConfigurePublicIpsOnLogicalRouterCommand, Answer, NiciraNvpResource> {
|
||||
|
||||
@Override
|
||||
public Answer execute(final ConfigurePublicIpsOnLogicalRouterCommand command, final NiciraNvpResource niciraNvpResource) {
|
||||
final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
|
||||
|
||||
try {
|
||||
final NiciraNvpList<LogicalRouterPort> ports = niciraNvpApi.findLogicalRouterPortByGatewayServiceUuid(command.getLogicalRouterUuid(), command.getL3GatewayServiceUuid());
|
||||
if (ports.getResultCount() != 1) {
|
||||
return new ConfigurePublicIpsOnLogicalRouterAnswer(command, false, "No logical router ports found, unable to set ip addresses");
|
||||
}
|
||||
final LogicalRouterPort lrp = ports.getResults().get(0);
|
||||
lrp.setIpAddresses(command.getPublicCidrs());
|
||||
niciraNvpApi.updateLogicalRouterPort(command.getLogicalRouterUuid(), lrp);
|
||||
|
||||
return new ConfigurePublicIpsOnLogicalRouterAnswer(command, true, "Configured " + command.getPublicCidrs().size() + " ip addresses on logical router uuid " +
|
||||
command.getLogicalRouterUuid());
|
||||
} catch (final NiciraNvpApiException e) {
|
||||
final CommandRetryUtility retryUtility = niciraNvpResource.getRetryUtility();
|
||||
retryUtility.addRetry(command, NUM_RETRIES);
|
||||
return retryUtility.retry(command, ConfigurePublicIpsOnLogicalRouterAnswer.class, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
//
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
//
|
||||
|
||||
package com.cloud.network.resource.wrapper;
|
||||
|
||||
import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.ConfigureStaticNatRulesOnLogicalRouterAnswer;
|
||||
import com.cloud.agent.api.ConfigureStaticNatRulesOnLogicalRouterCommand;
|
||||
import com.cloud.agent.api.to.StaticNatRuleTO;
|
||||
import com.cloud.network.nicira.NatRule;
|
||||
import com.cloud.network.nicira.NiciraNvpApi;
|
||||
import com.cloud.network.nicira.NiciraNvpApiException;
|
||||
import com.cloud.network.nicira.NiciraNvpList;
|
||||
import com.cloud.network.resource.NiciraNvpResource;
|
||||
import com.cloud.network.utils.CommandRetryUtility;
|
||||
import com.cloud.resource.CommandWrapper;
|
||||
import com.cloud.resource.ResourceWrapper;
|
||||
|
||||
@ResourceWrapper(handles = ConfigureStaticNatRulesOnLogicalRouterCommand.class)
|
||||
public final class NiciraNvpConfigureStaticNatRulesCommandWrapper extends CommandWrapper<ConfigureStaticNatRulesOnLogicalRouterCommand, Answer, NiciraNvpResource> {
|
||||
|
||||
private static final Logger s_logger = Logger.getLogger(NiciraNvpConfigureStaticNatRulesCommandWrapper.class);
|
||||
|
||||
@Override
|
||||
public Answer execute(final ConfigureStaticNatRulesOnLogicalRouterCommand command, final NiciraNvpResource niciraNvpResource) {
|
||||
final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
|
||||
|
||||
try {
|
||||
final NiciraNvpList<NatRule> existingRules = niciraNvpApi.findNatRulesByLogicalRouterUuid(command.getLogicalRouterUuid());
|
||||
// Rules of the game (also known as assumptions-that-will-make-stuff-break-later-on)
|
||||
// A SourceNat rule with a match other than a /32 cidr is assumed to be the "main" SourceNat rule
|
||||
// Any other SourceNat rule should have a corresponding DestinationNat rule
|
||||
|
||||
for (final StaticNatRuleTO rule : command.getRules()) {
|
||||
|
||||
final NatRule[] rulepair = niciraNvpResource.generateStaticNatRulePair(rule.getDstIp(), rule.getSrcIp());
|
||||
|
||||
NatRule incoming = null;
|
||||
NatRule outgoing = null;
|
||||
|
||||
for (final NatRule storedRule : existingRules.getResults()) {
|
||||
if (storedRule.equalsIgnoreUuid(rulepair[1])) {
|
||||
// The outgoing rule exists
|
||||
outgoing = storedRule;
|
||||
s_logger.debug("Found matching outgoing rule " + outgoing.getUuid());
|
||||
if (incoming != null) {
|
||||
break;
|
||||
}
|
||||
} else if (storedRule.equalsIgnoreUuid(rulepair[0])) {
|
||||
// The incoming rule exists
|
||||
incoming = storedRule;
|
||||
s_logger.debug("Found matching incoming rule " + incoming.getUuid());
|
||||
if (outgoing != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (incoming != null && outgoing != null) {
|
||||
if (rule.revoked()) {
|
||||
s_logger.debug("Deleting incoming rule " + incoming.getUuid());
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(command.getLogicalRouterUuid(), incoming.getUuid());
|
||||
|
||||
s_logger.debug("Deleting outgoing rule " + outgoing.getUuid());
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(command.getLogicalRouterUuid(), outgoing.getUuid());
|
||||
}
|
||||
} else {
|
||||
if (rule.revoked()) {
|
||||
s_logger.warn("Tried deleting a rule that does not exist, " + rule.getSrcIp() + " -> " + rule.getDstIp());
|
||||
break;
|
||||
}
|
||||
|
||||
rulepair[0] = niciraNvpApi.createLogicalRouterNatRule(command.getLogicalRouterUuid(), rulepair[0]);
|
||||
s_logger.debug("Created " + niciraNvpResource.natRuleToString(rulepair[0]));
|
||||
|
||||
try {
|
||||
rulepair[1] = niciraNvpApi.createLogicalRouterNatRule(command.getLogicalRouterUuid(), rulepair[1]);
|
||||
s_logger.debug("Created " + niciraNvpResource.natRuleToString(rulepair[1]));
|
||||
} catch (final NiciraNvpApiException ex) {
|
||||
s_logger.debug("Failed to create SourceNatRule, rolling back DestinationNatRule");
|
||||
niciraNvpApi.deleteLogicalRouterNatRule(command.getLogicalRouterUuid(), rulepair[0].getUuid());
|
||||
throw ex; // Rethrow original exception
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return new ConfigureStaticNatRulesOnLogicalRouterAnswer(command, true, command.getRules().size() + " StaticNat rules applied");
|
||||
} catch (final NiciraNvpApiException e) {
|
||||
final CommandRetryUtility retryUtility = niciraNvpResource.getRetryUtility();
|
||||
retryUtility.addRetry(command, NUM_RETRIES);
|
||||
return retryUtility.retry(command, ConfigureStaticNatRulesOnLogicalRouterAnswer.class, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
//
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
//
|
||||
|
||||
package com.cloud.network.resource.wrapper;
|
||||
|
||||
import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES;
|
||||
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.DeleteLogicalRouterAnswer;
|
||||
import com.cloud.agent.api.DeleteLogicalRouterCommand;
|
||||
import com.cloud.network.nicira.NiciraNvpApi;
|
||||
import com.cloud.network.nicira.NiciraNvpApiException;
|
||||
import com.cloud.network.resource.NiciraNvpResource;
|
||||
import com.cloud.network.utils.CommandRetryUtility;
|
||||
import com.cloud.resource.CommandWrapper;
|
||||
import com.cloud.resource.ResourceWrapper;
|
||||
|
||||
@ResourceWrapper(handles = DeleteLogicalRouterCommand.class)
|
||||
public final class NiciraNvpDeleteLogicalRouterCommandWrapper extends CommandWrapper<DeleteLogicalRouterCommand, Answer, NiciraNvpResource> {
|
||||
|
||||
@Override
|
||||
public Answer execute(final DeleteLogicalRouterCommand command, final NiciraNvpResource niciraNvpResource) {
|
||||
final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
|
||||
|
||||
try {
|
||||
niciraNvpApi.deleteLogicalRouter(command.getLogicalRouterUuid());
|
||||
return new DeleteLogicalRouterAnswer(command, true, "Logical Router deleted (uuid " + command.getLogicalRouterUuid() + ")");
|
||||
} catch (final NiciraNvpApiException e) {
|
||||
final CommandRetryUtility retryUtility = niciraNvpResource.getRetryUtility();
|
||||
retryUtility.addRetry(command, NUM_RETRIES);
|
||||
return retryUtility.retry(command, DeleteLogicalRouterAnswer.class, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue