You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by sa...@apache.org on 2016/06/16 08:12:35 UTC
[34/50] [abbrv] git commit: updated refs/heads/deploy-from-snapshot
to 44ba14d
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/SingleDefaultRouteImplicitRoutingConfig.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/SingleDefaultRouteImplicitRoutingConfig.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/SingleDefaultRouteImplicitRoutingConfig.java
new file mode 100644
index 0000000..ea5df2c
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/SingleDefaultRouteImplicitRoutingConfig.java
@@ -0,0 +1,40 @@
+//
+// 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.nicira;
+
+/**
+ *
+ */
+public class SingleDefaultRouteImplicitRoutingConfig extends RoutingConfig {
+ public RouterNextHop defaultRouteNextHop;
+ public final String type = "SingleDefaultRouteImplicitRoutingConfig";
+
+ public SingleDefaultRouteImplicitRoutingConfig(final RouterNextHop routerNextHop) {
+ defaultRouteNextHop = routerNextHop;
+ }
+
+ public RouterNextHop getDefaultRouteNextHop() {
+ return defaultRouteNextHop;
+ }
+
+ public void setDefaultRouteNextHop(final RouterNextHop defaultRouteNextHop) {
+ this.defaultRouteNextHop = defaultRouteNextHop;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/SourceNatRule.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/SourceNatRule.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/SourceNatRule.java
new file mode 100644
index 0000000..b95cb9a
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/SourceNatRule.java
@@ -0,0 +1,119 @@
+//
+// 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.nicira;
+
+public class SourceNatRule extends NatRule {
+ private String toSourceIpAddressMax;
+ private String toSourceIpAddressMin;
+ private Integer toSourcePort;
+
+ public SourceNatRule() {
+ setType("SourceNatRule");
+ }
+
+ public String getToSourceIpAddressMax() {
+ return toSourceIpAddressMax;
+ }
+
+ public void setToSourceIpAddressMax(final String toSourceIpAddressMax) {
+ this.toSourceIpAddressMax = toSourceIpAddressMax;
+ }
+
+ public String getToSourceIpAddressMin() {
+ return toSourceIpAddressMin;
+ }
+
+ public void setToSourceIpAddressMin(final String toSourceIpAddressMin) {
+ this.toSourceIpAddressMin = toSourceIpAddressMin;
+ }
+
+ public Integer getToSourcePort() {
+ return toSourcePort;
+ }
+
+ public void setToSourcePort(final Integer toSourcePort) {
+ this.toSourcePort = toSourcePort;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((toSourceIpAddressMax == null) ? 0 : toSourceIpAddressMax.hashCode());
+ result = prime * result + ((toSourceIpAddressMin == null) ? 0 : toSourceIpAddressMin.hashCode());
+ result = prime * result + ((toSourcePort == null) ? 0 : toSourcePort.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SourceNatRule other = (SourceNatRule)obj;
+ if (toSourceIpAddressMax == null) {
+ if (other.toSourceIpAddressMax != null)
+ return false;
+ } else if (!toSourceIpAddressMax.equals(other.toSourceIpAddressMax))
+ return false;
+ if (toSourceIpAddressMin == null) {
+ if (other.toSourceIpAddressMin != null)
+ return false;
+ } else if (!toSourceIpAddressMin.equals(other.toSourceIpAddressMin))
+ return false;
+ if (toSourcePort == null) {
+ if (other.toSourcePort != null)
+ return false;
+ } else if (!toSourcePort.equals(other.toSourcePort))
+ return false;
+ return true;
+ }
+
+ @Override
+ public boolean equalsIgnoreUuid(final Object obj) {
+ if (this == obj)
+ return true;
+ if (!super.equalsIgnoreUuid(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SourceNatRule other = (SourceNatRule)obj;
+ if (toSourceIpAddressMax == null) {
+ if (other.toSourceIpAddressMax != null)
+ return false;
+ } else if (!toSourceIpAddressMax.equals(other.toSourceIpAddressMax))
+ return false;
+ if (toSourceIpAddressMin == null) {
+ if (other.toSourceIpAddressMin != null)
+ return false;
+ } else if (!toSourceIpAddressMin.equals(other.toSourceIpAddressMin))
+ return false;
+ if (toSourcePort == null) {
+ if (other.toSourcePort != null)
+ return false;
+ } else if (!toSourcePort.equals(other.toSourcePort))
+ return false;
+ return true;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/TransportZoneBinding.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/TransportZoneBinding.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/TransportZoneBinding.java
new file mode 100644
index 0000000..c643876
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/TransportZoneBinding.java
@@ -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.nicira;
+
+public class TransportZoneBinding {
+ private String zoneUuid;
+ private String transportType;
+
+ public TransportZoneBinding() {
+ }
+
+ public TransportZoneBinding(String zoneUuid, String transportType) {
+ this.zoneUuid = zoneUuid;
+ this.transportType = transportType;
+ }
+
+ public String getZoneUuid() {
+ return zoneUuid;
+ }
+
+ public void setZoneUuid(String zoneUuid) {
+ this.zoneUuid = zoneUuid;
+ }
+
+ public String getTransportType() {
+ return transportType;
+ }
+
+ public void setTransportType(String transportType) {
+ this.transportType = transportType;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/VifAttachment.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/VifAttachment.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/VifAttachment.java
new file mode 100644
index 0000000..fe7d93a
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/nicira/VifAttachment.java
@@ -0,0 +1,78 @@
+//
+// 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.nicira;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+
+public class VifAttachment extends Attachment {
+ private final String type = "VifAttachment";
+ private String vifUuid;
+
+ public VifAttachment() {
+ }
+
+ public VifAttachment(final String vifUuid) {
+ this.vifUuid = vifUuid;
+ }
+
+ public String getVifUuid() {
+ return vifUuid;
+ }
+
+ public void setVifUuid(final String vifUuid) {
+ this.vifUuid = vifUuid;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+
+ @Override
+ public String toString() {
+ return ReflectionToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE, false);
+ }
+
+ @Override
+ public int hashCode() {
+ return new HashCodeBuilder(17, 31)
+ .append(this.getClass())
+ .append(vifUuid)
+ .toHashCode();
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (obj == this) {
+ return true;
+ }
+ if (!(this.getClass().isInstance(obj))) {
+ return false;
+ }
+ final VifAttachment another = (VifAttachment) obj;
+ return new EqualsBuilder().append(vifUuid, another.vifUuid).isEquals();
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpRequestWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpRequestWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpRequestWrapper.java
new file mode 100644
index 0000000..9d261b2
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpRequestWrapper.java
@@ -0,0 +1,77 @@
+//
+// 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;
+
+import java.util.Hashtable;
+import java.util.Set;
+
+import org.reflections.Reflections;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.resource.RequestWrapper;
+import com.cloud.resource.ServerResource;
+
+public class NiciraNvpRequestWrapper extends RequestWrapper {
+
+ private static NiciraNvpRequestWrapper instance;
+
+ static {
+ instance = new NiciraNvpRequestWrapper();
+ }
+
+ Reflections baseWrappers = new Reflections("com.cloud.network.resource.wrapper");
+ @SuppressWarnings("rawtypes")
+ Set<Class<? extends CommandWrapper>> baseSet = baseWrappers.getSubTypesOf(CommandWrapper.class);
+
+ private NiciraNvpRequestWrapper() {
+ init();
+ }
+
+ @SuppressWarnings("rawtypes")
+ private void init() {
+ // NiciraNvpResource commands
+ final Hashtable<Class<? extends Command>, CommandWrapper> niciraCommands = processAnnotations(baseSet);
+
+ resources.put(NiciraNvpResource.class, niciraCommands);
+ }
+
+ public static NiciraNvpRequestWrapper getInstance() {
+ return instance;
+ }
+
+ @SuppressWarnings({"rawtypes" })
+ @Override
+ public Answer execute(final Command command, final ServerResource serverResource) {
+ final Class<? extends ServerResource> resourceClass = serverResource.getClass();
+
+ final Hashtable<Class<? extends Command>, CommandWrapper> resourceCommands = retrieveResource(command, resourceClass);
+
+ CommandWrapper<Command, Answer, ServerResource> commandWrapper = retrieveCommands(command.getClass(), resourceCommands);
+
+ while (commandWrapper == null) {
+ //Could not find the command in the given resource, will traverse the family tree.
+ commandWrapper = retryWhenAllFails(command, resourceClass, resourceCommands);
+ }
+
+ return commandWrapper.execute(command, serverResource);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpResource.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpResource.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpResource.java
new file mode 100644
index 0000000..df40db4
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpResource.java
@@ -0,0 +1,319 @@
+//
+// 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;
+
+import java.util.Map;
+
+import javax.naming.ConfigurationException;
+
+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.PingCommand;
+import com.cloud.agent.api.StartupCommand;
+import com.cloud.agent.api.StartupNiciraNvpCommand;
+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.Match;
+import com.cloud.network.nicira.NatRule;
+import com.cloud.network.nicira.NiciraNvpApi;
+import com.cloud.network.nicira.NiciraNvpApiException;
+import com.cloud.network.nicira.SourceNatRule;
+import com.cloud.network.utils.CommandRetryUtility;
+import com.cloud.resource.ServerResource;
+
+public class NiciraNvpResource implements ServerResource {
+
+ private static final Logger s_logger = Logger.getLogger(NiciraNvpResource.class);
+
+ public static final int NAME_MAX_LEN = 40;
+ public static final int NUM_RETRIES = 2;
+
+ private String name;
+ private String guid;
+ private String zoneId;
+
+ private NiciraNvpApi niciraNvpApi;
+ private NiciraNvpUtilities niciraNvpUtilities;
+ private CommandRetryUtility retryUtility;
+
+ protected NiciraNvpApi createNiciraNvpApi() {
+ return new NiciraNvpApi();
+ }
+
+ @Override
+ public boolean configure(final String ignoredName, final Map<String, Object> params) throws ConfigurationException {
+
+ name = (String)params.get("name");
+ if (name == null) {
+ throw new ConfigurationException("Unable to find name");
+ }
+
+ guid = (String)params.get("guid");
+ if (guid == null) {
+ throw new ConfigurationException("Unable to find the guid");
+ }
+
+ zoneId = (String)params.get("zoneId");
+ if (zoneId == null) {
+ throw new ConfigurationException("Unable to find zone");
+ }
+
+ final String ip = (String)params.get("ip");
+ if (ip == null) {
+ throw new ConfigurationException("Unable to find IP");
+ }
+
+ final String adminuser = (String)params.get("adminuser");
+ if (adminuser == null) {
+ throw new ConfigurationException("Unable to find admin username");
+ }
+
+ final String adminpass = (String)params.get("adminpass");
+ if (adminpass == null) {
+ throw new ConfigurationException("Unable to find admin password");
+ }
+
+ niciraNvpUtilities = NiciraNvpUtilities.getInstance();
+ retryUtility = CommandRetryUtility.getInstance();
+ retryUtility.setServerResource(this);
+
+ niciraNvpApi = createNiciraNvpApi();
+ niciraNvpApi.setControllerAddress(ip);
+ niciraNvpApi.setAdminCredentials(adminuser, adminpass);
+
+ return true;
+ }
+
+ public NiciraNvpApi getNiciraNvpApi() {
+ return niciraNvpApi;
+ }
+
+ public NiciraNvpUtilities getNiciraNvpUtilities() {
+ return niciraNvpUtilities;
+ }
+
+ public CommandRetryUtility getRetryUtility() {
+ return retryUtility;
+ }
+
+ @Override
+ public boolean start() {
+ return true;
+ }
+
+ @Override
+ public boolean stop() {
+ return true;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public Type getType() {
+ // Think up a better name for this Type?
+ return Host.Type.L2Networking;
+ }
+
+ @Override
+ public StartupCommand[] initialize() {
+ final StartupNiciraNvpCommand sc = new StartupNiciraNvpCommand();
+ sc.setGuid(guid);
+ sc.setName(name);
+ sc.setDataCenter(zoneId);
+ sc.setPod("");
+ sc.setPrivateIpAddress("");
+ sc.setStorageIpAddress("");
+ sc.setVersion(NiciraNvpResource.class.getPackage().getImplementationVersion());
+ return new StartupCommand[] {sc};
+ }
+
+ @Override
+ public PingCommand getCurrentStatus(final long id) {
+ try {
+ final ControlClusterStatus ccs = niciraNvpApi.getControlClusterStatus();
+ if (!"stable".equals(ccs.getClusterStatus())) {
+ s_logger.error("ControlCluster state is not stable: " + ccs.getClusterStatus());
+ return null;
+ }
+ } catch (final NiciraNvpApiException e) {
+ s_logger.error("getControlClusterStatus failed", e);
+ return null;
+ }
+ return new PingCommand(Host.Type.L2Networking, id);
+ }
+
+ @Override
+ public Answer executeRequest(final Command cmd) {
+ final NiciraNvpRequestWrapper wrapper = NiciraNvpRequestWrapper.getInstance();
+ try {
+ return wrapper.execute(cmd, this);
+ } catch (final Exception e) {
+ s_logger.debug("Received unsupported command " + cmd.toString());
+ return Answer.createUnsupportedCommandAnswer(cmd);
+ }
+ }
+
+ @Override
+ public void disconnected() {
+ }
+
+ @Override
+ public IAgentControl getAgentControl() {
+ return null;
+ }
+
+ @Override
+ public void setAgentControl(final IAgentControl agentControl) {
+ }
+
+ public String natRuleToString(final NatRule rule) {
+
+ final StringBuilder natRuleStr = new StringBuilder();
+ natRuleStr.append("Rule ");
+ natRuleStr.append(rule.getUuid());
+ natRuleStr.append(" (");
+ natRuleStr.append(rule.getType());
+ natRuleStr.append(") :");
+ final Match m = rule.getMatch();
+ natRuleStr.append("match (");
+ natRuleStr.append(m.getProtocol());
+ natRuleStr.append(" ");
+ natRuleStr.append(m.getSourceIpAddresses());
+ natRuleStr.append(" [");
+ natRuleStr.append(m.getSourcePort());
+ natRuleStr.append(" ] -> ");
+ natRuleStr.append(m.getDestinationIpAddresses());
+ natRuleStr.append(" [");
+ natRuleStr.append(m.getDestinationPort());
+ natRuleStr.append(" ]) -->");
+ if ("SourceNatRule".equals(rule.getType())) {
+ natRuleStr.append(((SourceNatRule)rule).getToSourceIpAddressMin());
+ natRuleStr.append("-");
+ natRuleStr.append(((SourceNatRule)rule).getToSourceIpAddressMax());
+ natRuleStr.append(" [");
+ natRuleStr.append(((SourceNatRule)rule).getToSourcePort());
+ natRuleStr.append(" ])");
+ } else {
+ natRuleStr.append(((DestinationNatRule)rule).getToDestinationIpAddress());
+ natRuleStr.append(" [");
+ natRuleStr.append(((DestinationNatRule)rule).getToDestinationPort());
+ natRuleStr.append(" ])");
+ }
+ return natRuleStr.toString();
+ }
+
+ public String truncate(final String string, final int length) {
+ if (string.length() <= length) {
+ return string;
+ } else {
+ return string.substring(0, length);
+ }
+ }
+
+ public NatRule[] generateStaticNatRulePair(final String insideIp, final String outsideIp) {
+ final NatRule[] rulepair = new NatRule[2];
+ rulepair[0] = new DestinationNatRule();
+ rulepair[0].setType("DestinationNatRule");
+ rulepair[0].setOrder(100);
+ rulepair[1] = new SourceNatRule();
+ rulepair[1].setType("SourceNatRule");
+ rulepair[1].setOrder(100);
+
+ Match m = new Match();
+ m.setDestinationIpAddresses(outsideIp);
+ rulepair[0].setMatch(m);
+ ((DestinationNatRule)rulepair[0]).setToDestinationIpAddress(insideIp);
+
+ // create matching snat rule
+ m = new Match();
+ m.setSourceIpAddresses(insideIp);
+ rulepair[1].setMatch(m);
+ ((SourceNatRule)rulepair[1]).setToSourceIpAddressMin(outsideIp);
+ ((SourceNatRule)rulepair[1]).setToSourceIpAddressMax(outsideIp);
+
+ return rulepair;
+
+ }
+
+ 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);
+
+ ((DestinationNatRule)rulepair[0]).setToDestinationPort(insidePorts[0]);
+ rulepair[0].getMatch().setDestinationPort(outsidePorts[0]);
+ rulepair[0].setOrder(50);
+ rulepair[0].getMatch().setEthertype("IPv4");
+ if ("tcp".equals(protocol)) {
+ rulepair[0].getMatch().setProtocol(6);
+ } else if ("udp".equals(protocol)) {
+ rulepair[0].getMatch().setProtocol(17);
+ }
+
+ ((SourceNatRule)rulepair[1]).setToSourcePort(outsidePorts[0]);
+ rulepair[1].getMatch().setSourcePort(insidePorts[0]);
+ rulepair[1].setOrder(50);
+ rulepair[1].getMatch().setEthertype("IPv4");
+ if ("tcp".equals(protocol)) {
+ rulepair[1].getMatch().setProtocol(6);
+ } else if ("udp".equals(protocol)) {
+ rulepair[1].getMatch().setProtocol(17);
+ }
+
+ return rulepair;
+
+ }
+
+ @Override
+ public void setName(final String name) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void setConfigParams(final Map<String, Object> params) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public Map<String, Object> getConfigParams() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getRunLevel() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void setRunLevel(final int level) {
+ // TODO Auto-generated method stub
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpUtilities.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpUtilities.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpUtilities.java
new file mode 100644
index 0000000..4edf5c3
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/NiciraNvpUtilities.java
@@ -0,0 +1,65 @@
+//
+// 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;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.cloud.agent.api.CreateLogicalSwitchPortCommand;
+import com.cloud.network.nicira.LogicalSwitch;
+import com.cloud.network.nicira.LogicalSwitchPort;
+import com.cloud.network.nicira.NiciraNvpTag;
+import com.cloud.network.nicira.VifAttachment;
+
+public class NiciraNvpUtilities {
+
+ private static NiciraNvpUtilities instance;
+
+ static {
+ instance = new NiciraNvpUtilities();
+ }
+
+ private NiciraNvpUtilities() {
+ }
+
+ public static NiciraNvpUtilities getInstance() {
+ return instance;
+ }
+
+ public LogicalSwitch createLogicalSwitch() {
+ final LogicalSwitch logicalSwitch = new LogicalSwitch();
+ return logicalSwitch;
+ }
+
+ public LogicalSwitchPort createLogicalSwitchPort(final CreateLogicalSwitchPortCommand command) {
+ final String attachmentUuid = command.getAttachmentUuid();
+
+ // Tags set to scope cs_account and account name
+ final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>();
+ tags.add(new NiciraNvpTag("cs_account", command.getOwnerName()));
+
+ final LogicalSwitchPort logicalSwitchPort = new LogicalSwitchPort(attachmentUuid, tags, true);
+ return logicalSwitchPort;
+ }
+
+ public VifAttachment createVifAttachment(final String attachmentUuid) {
+ return new VifAttachment(attachmentUuid);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigurePortForwardingRulesCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigurePortForwardingRulesCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigurePortForwardingRulesCommandWrapper.java
new file mode 100644
index 0000000..89e7a6e
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigurePortForwardingRulesCommandWrapper.java
@@ -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);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigurePublicIpsCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigurePublicIpsCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigurePublicIpsCommandWrapper.java
new file mode 100644
index 0000000..e5d2dcd
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigurePublicIpsCommandWrapper.java
@@ -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);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigureStaticNatRulesCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigureStaticNatRulesCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigureStaticNatRulesCommandWrapper.java
new file mode 100644
index 0000000..1ce3ceb
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpConfigureStaticNatRulesCommandWrapper.java
@@ -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);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalRouterCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalRouterCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalRouterCommandWrapper.java
new file mode 100644
index 0000000..1cddf4f
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalRouterCommandWrapper.java
@@ -0,0 +1,152 @@
+//
+// 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.NAME_MAX_LEN;
+import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CreateLogicalRouterAnswer;
+import com.cloud.agent.api.CreateLogicalRouterCommand;
+import com.cloud.network.nicira.L3GatewayAttachment;
+import com.cloud.network.nicira.LogicalRouter;
+import com.cloud.network.nicira.LogicalRouterPort;
+import com.cloud.network.nicira.LogicalSwitchPort;
+import com.cloud.network.nicira.Match;
+import com.cloud.network.nicira.NiciraNvpApi;
+import com.cloud.network.nicira.NiciraNvpApiException;
+import com.cloud.network.nicira.NiciraNvpTag;
+import com.cloud.network.nicira.PatchAttachment;
+import com.cloud.network.nicira.RouterNextHop;
+import com.cloud.network.nicira.SingleDefaultRouteImplicitRoutingConfig;
+import com.cloud.network.nicira.SourceNatRule;
+import com.cloud.network.resource.NiciraNvpResource;
+import com.cloud.network.utils.CommandRetryUtility;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.resource.ResourceWrapper;
+
+@ResourceWrapper(handles = CreateLogicalRouterCommand.class)
+public final class NiciraNvpCreateLogicalRouterCommandWrapper extends CommandWrapper<CreateLogicalRouterCommand, Answer, NiciraNvpResource> {
+
+ private static final Logger s_logger = Logger.getLogger(NiciraNvpCreateLogicalRouterCommandWrapper.class);
+
+ @Override
+ public Answer execute(final CreateLogicalRouterCommand command, final NiciraNvpResource niciraNvpResource) {
+ final String routerName = command.getName();
+ final String gatewayServiceUuid = command.getGatewayServiceUuid();
+ final String logicalSwitchUuid = command.getLogicalSwitchUuid();
+
+ final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>();
+ tags.add(new NiciraNvpTag("cs_account", command.getOwnerName()));
+
+ final String publicNetworkNextHopIp = command.getPublicNextHop();
+ final String publicNetworkIpAddress = command.getPublicIpCidr();
+ final String internalNetworkAddress = command.getInternalIpCidr();
+
+ s_logger.debug("Creating a logical router with external ip " + publicNetworkIpAddress + " and internal ip " + internalNetworkAddress + "on gateway service " +
+ gatewayServiceUuid);
+
+ final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
+
+ try {
+ // Create the Router
+ LogicalRouter lrc = new LogicalRouter();
+ lrc.setDisplayName(niciraNvpResource.truncate(routerName, NAME_MAX_LEN));
+ lrc.setTags(tags);
+ lrc.setRoutingConfig(new SingleDefaultRouteImplicitRoutingConfig(new RouterNextHop(publicNetworkNextHopIp)));
+ lrc = niciraNvpApi.createLogicalRouter(lrc);
+
+ // store the switchport for rollback
+ LogicalSwitchPort lsp = null;
+
+ try {
+ // Create the outside port for the router
+ LogicalRouterPort lrpo = new LogicalRouterPort();
+ lrpo.setAdminStatusEnabled(true);
+ lrpo.setDisplayName(niciraNvpResource.truncate(routerName + "-outside-port", NAME_MAX_LEN));
+ lrpo.setTags(tags);
+ final List<String> outsideIpAddresses = new ArrayList<String>();
+ outsideIpAddresses.add(publicNetworkIpAddress);
+ lrpo.setIpAddresses(outsideIpAddresses);
+ lrpo = niciraNvpApi.createLogicalRouterPort(lrc.getUuid(), lrpo);
+
+ // Attach the outside port to the gateway service on the correct VLAN
+ final L3GatewayAttachment attachment = new L3GatewayAttachment(gatewayServiceUuid);
+ if (command.getVlanId() != 0) {
+ attachment.setVlanId(command.getVlanId());
+ }
+ niciraNvpApi.updateLogicalRouterPortAttachment(lrc.getUuid(), lrpo.getUuid(), attachment);
+
+ // Create the inside port for the router
+ LogicalRouterPort lrpi = new LogicalRouterPort();
+ lrpi.setAdminStatusEnabled(true);
+ lrpi.setDisplayName(niciraNvpResource.truncate(routerName + "-inside-port", NAME_MAX_LEN));
+ lrpi.setTags(tags);
+ final List<String> insideIpAddresses = new ArrayList<String>();
+ insideIpAddresses.add(internalNetworkAddress);
+ lrpi.setIpAddresses(insideIpAddresses);
+ lrpi = niciraNvpApi.createLogicalRouterPort(lrc.getUuid(), lrpi);
+
+ // Create the inside port on the lswitch
+ lsp = new LogicalSwitchPort(niciraNvpResource.truncate(routerName + "-inside-port", NAME_MAX_LEN), tags, true);
+ lsp = niciraNvpApi.createLogicalSwitchPort(logicalSwitchUuid, lsp);
+
+ // Attach the inside router port to the lswitch port with a PatchAttachment
+ niciraNvpApi.updateLogicalRouterPortAttachment(lrc.getUuid(), lrpi.getUuid(), new PatchAttachment(lsp.getUuid()));
+
+ // Attach the inside lswitch port to the router with a PatchAttachment
+ niciraNvpApi.updateLogicalSwitchPortAttachment(logicalSwitchUuid, lsp.getUuid(), new PatchAttachment(lrpi.getUuid()));
+
+ // Setup the source nat rule
+ final SourceNatRule snr = new SourceNatRule();
+ snr.setToSourceIpAddressMin(publicNetworkIpAddress.split("/")[0]);
+ snr.setToSourceIpAddressMax(publicNetworkIpAddress.split("/")[0]);
+ final Match match = new Match();
+ match.setSourceIpAddresses(internalNetworkAddress);
+ snr.setMatch(match);
+ snr.setOrder(200);
+ niciraNvpApi.createLogicalRouterNatRule(lrc.getUuid(), snr);
+ } catch (final NiciraNvpApiException e) {
+ // We need to destroy the router if we already created it
+ // this will also take care of any router ports and rules
+ try {
+ niciraNvpApi.deleteLogicalRouter(lrc.getUuid());
+ if (lsp != null) {
+ niciraNvpApi.deleteLogicalSwitchPort(logicalSwitchUuid, lsp.getUuid());
+ }
+ } catch (final NiciraNvpApiException ex) {
+ }
+
+ throw e;
+ }
+
+ return new CreateLogicalRouterAnswer(command, true, "Logical Router created (uuid " + lrc.getUuid() + ")", lrc.getUuid());
+ } catch (final NiciraNvpApiException e) {
+ final CommandRetryUtility retryUtility = niciraNvpResource.getRetryUtility();
+ retryUtility.addRetry(command, NUM_RETRIES);
+ return retryUtility.retry(command, CreateLogicalRouterAnswer.class, e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalSwitchCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalSwitchCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalSwitchCommandWrapper.java
new file mode 100644
index 0000000..7d66ada
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalSwitchCommandWrapper.java
@@ -0,0 +1,73 @@
+//
+// 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 java.util.ArrayList;
+import java.util.List;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CreateLogicalSwitchAnswer;
+import com.cloud.agent.api.CreateLogicalSwitchCommand;
+import com.cloud.network.nicira.LogicalSwitch;
+import com.cloud.network.nicira.NiciraNvpApi;
+import com.cloud.network.nicira.NiciraNvpApiException;
+import com.cloud.network.nicira.NiciraNvpTag;
+import com.cloud.network.nicira.TransportZoneBinding;
+import com.cloud.network.resource.NiciraNvpResource;
+import com.cloud.network.resource.NiciraNvpUtilities;
+import com.cloud.network.utils.CommandRetryUtility;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.resource.ResourceWrapper;
+
+@ResourceWrapper(handles = CreateLogicalSwitchCommand.class)
+public final class NiciraNvpCreateLogicalSwitchCommandWrapper extends CommandWrapper<CreateLogicalSwitchCommand, Answer, NiciraNvpResource> {
+
+ @Override
+ public Answer execute(final CreateLogicalSwitchCommand command, final NiciraNvpResource niciraNvpResource) {
+ final NiciraNvpUtilities niciraNvpUtilities = niciraNvpResource.getNiciraNvpUtilities();
+
+ LogicalSwitch logicalSwitch = niciraNvpUtilities.createLogicalSwitch();
+ logicalSwitch.setDisplayName(niciraNvpResource.truncate("lswitch-" + command.getName(), NiciraNvpResource.NAME_MAX_LEN));
+ logicalSwitch.setPortIsolationEnabled(false);
+
+ // Set transport binding
+ final List<TransportZoneBinding> ltzb = new ArrayList<TransportZoneBinding>();
+ ltzb.add(new TransportZoneBinding(command.getTransportUuid(), command.getTransportType()));
+ logicalSwitch.setTransportZones(ltzb);
+
+ // Tags set to scope cs_account and account name
+ final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>();
+ tags.add(new NiciraNvpTag("cs_account", command.getOwnerName()));
+ logicalSwitch.setTags(tags);
+
+ try {
+ final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
+ logicalSwitch = niciraNvpApi.createLogicalSwitch(logicalSwitch);
+ final String switchUuid = logicalSwitch.getUuid();
+ return new CreateLogicalSwitchAnswer(command, true, "Logicalswitch " + switchUuid + " created", switchUuid);
+ } catch (final NiciraNvpApiException e) {
+ final CommandRetryUtility retryUtility = niciraNvpResource.getRetryUtility();
+ retryUtility.addRetry(command, NUM_RETRIES);
+ return retryUtility.retry(command, CreateLogicalSwitchAnswer.class, e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalSwitchPortCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalSwitchPortCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalSwitchPortCommandWrapper.java
new file mode 100644
index 0000000..42a4067
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpCreateLogicalSwitchPortCommandWrapper.java
@@ -0,0 +1,70 @@
+//
+// 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.CreateLogicalSwitchPortAnswer;
+import com.cloud.agent.api.CreateLogicalSwitchPortCommand;
+import com.cloud.network.nicira.LogicalSwitchPort;
+import com.cloud.network.nicira.NiciraNvpApi;
+import com.cloud.network.nicira.NiciraNvpApiException;
+import com.cloud.network.nicira.VifAttachment;
+import com.cloud.network.resource.NiciraNvpResource;
+import com.cloud.network.resource.NiciraNvpUtilities;
+import com.cloud.network.utils.CommandRetryUtility;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.resource.ResourceWrapper;
+
+@ResourceWrapper(handles = CreateLogicalSwitchPortCommand.class)
+public final class NiciraNvpCreateLogicalSwitchPortCommandWrapper extends CommandWrapper<CreateLogicalSwitchPortCommand, Answer, NiciraNvpResource> {
+
+ private static final Logger s_logger = Logger.getLogger(NiciraNvpCreateLogicalSwitchPortCommandWrapper.class);
+
+ @Override
+ public Answer execute(final CreateLogicalSwitchPortCommand command, final NiciraNvpResource niciraNvpResource) {
+ final NiciraNvpUtilities niciraNvpUtilities = niciraNvpResource.getNiciraNvpUtilities();
+
+ final String logicalSwitchUuid = command.getLogicalSwitchUuid();
+ final String attachmentUuid = command.getAttachmentUuid();
+
+ try {
+ final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
+
+ final LogicalSwitchPort logicalSwitchPort = niciraNvpUtilities.createLogicalSwitchPort(command);
+ final LogicalSwitchPort newPort = niciraNvpApi.createLogicalSwitchPort(logicalSwitchUuid, logicalSwitchPort);
+ try {
+ niciraNvpApi.updateLogicalSwitchPortAttachment(command.getLogicalSwitchUuid(), newPort.getUuid(), new VifAttachment(attachmentUuid));
+ } catch (final NiciraNvpApiException ex) {
+ s_logger.warn("modifyLogicalSwitchPort failed after switchport was created, removing switchport");
+ niciraNvpApi.deleteLogicalSwitchPort(command.getLogicalSwitchUuid(), newPort.getUuid());
+ throw ex; // Rethrow the original exception
+ }
+ return new CreateLogicalSwitchPortAnswer(command, true, "Logical switch port " + newPort.getUuid() + " created", newPort.getUuid());
+ } catch (final NiciraNvpApiException e) {
+ final CommandRetryUtility retryUtility = niciraNvpResource.getRetryUtility();
+ retryUtility.addRetry(command, NUM_RETRIES);
+ return retryUtility.retry(command, CreateLogicalSwitchPortAnswer.class, e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalRouterCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalRouterCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalRouterCommandWrapper.java
new file mode 100644
index 0000000..43665b2
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalRouterCommandWrapper.java
@@ -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);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalSwitchCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalSwitchCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalSwitchCommandWrapper.java
new file mode 100644
index 0000000..f7b8ab9
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalSwitchCommandWrapper.java
@@ -0,0 +1,49 @@
+//
+// 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.DeleteLogicalSwitchAnswer;
+import com.cloud.agent.api.DeleteLogicalSwitchCommand;
+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 = DeleteLogicalSwitchCommand.class)
+public final class NiciraNvpDeleteLogicalSwitchCommandWrapper extends CommandWrapper<DeleteLogicalSwitchCommand, Answer, NiciraNvpResource> {
+
+ @Override
+ public Answer execute(final DeleteLogicalSwitchCommand command, final NiciraNvpResource niciraNvpResource) {
+ try {
+ final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
+ niciraNvpApi.deleteLogicalSwitch(command.getLogicalSwitchUuid());
+ return new DeleteLogicalSwitchAnswer(command, true, "Logicalswitch " + command.getLogicalSwitchUuid() + " deleted");
+ } catch (final NiciraNvpApiException e) {
+ final CommandRetryUtility retryUtility = niciraNvpResource.getRetryUtility();
+ retryUtility.addRetry(command, NUM_RETRIES);
+ return retryUtility.retry(command, DeleteLogicalSwitchAnswer.class, e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalSwitchPortCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalSwitchPortCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalSwitchPortCommandWrapper.java
new file mode 100644
index 0000000..b8c69f2
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpDeleteLogicalSwitchPortCommandWrapper.java
@@ -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.DeleteLogicalSwitchPortAnswer;
+import com.cloud.agent.api.DeleteLogicalSwitchPortCommand;
+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 = DeleteLogicalSwitchPortCommand.class)
+public final class NiciraNvpDeleteLogicalSwitchPortCommandWrapper extends CommandWrapper<DeleteLogicalSwitchPortCommand, Answer, NiciraNvpResource> {
+
+ @Override
+ public Answer execute(final DeleteLogicalSwitchPortCommand command, final NiciraNvpResource niciraNvpResource) {
+ final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
+
+ try {
+ niciraNvpApi.deleteLogicalSwitchPort(command.getLogicalSwitchUuid(), command.getLogicalSwitchPortUuid());
+ return new DeleteLogicalSwitchPortAnswer(command, true, "Logical switch port " + command.getLogicalSwitchPortUuid() + " deleted");
+ } catch (final NiciraNvpApiException e) {
+ final CommandRetryUtility retryUtility = niciraNvpResource.getRetryUtility();
+ retryUtility.addRetry(command, NUM_RETRIES);
+ return retryUtility.retry(command, DeleteLogicalSwitchPortAnswer.class, e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpFindLogicalSwitchPortCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpFindLogicalSwitchPortCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpFindLogicalSwitchPortCommandWrapper.java
new file mode 100644
index 0000000..40d58fc
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpFindLogicalSwitchPortCommandWrapper.java
@@ -0,0 +1,59 @@
+//
+// 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.FindLogicalSwitchPortAnswer;
+import com.cloud.agent.api.FindLogicalSwitchPortCommand;
+import com.cloud.network.nicira.LogicalSwitchPort;
+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 = FindLogicalSwitchPortCommand.class)
+public final class NiciraNvpFindLogicalSwitchPortCommandWrapper extends CommandWrapper<FindLogicalSwitchPortCommand, Answer, NiciraNvpResource> {
+
+ @Override
+ public Answer execute(final FindLogicalSwitchPortCommand command, final NiciraNvpResource niciraNvpResource) {
+ final String logicalSwitchUuid = command.getLogicalSwitchUuid();
+ final String logicalSwitchPortUuid = command.getLogicalSwitchPortUuid();
+
+ final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
+
+ try {
+ final NiciraNvpList<LogicalSwitchPort> ports = niciraNvpApi.findLogicalSwitchPortsByUuid(logicalSwitchUuid, logicalSwitchPortUuid);
+ if (ports.getResultCount() == 0) {
+ return new FindLogicalSwitchPortAnswer(command, false, "Logical switchport " + logicalSwitchPortUuid + " not found", null);
+ } else {
+ return new FindLogicalSwitchPortAnswer(command, true, "Logical switchport " + logicalSwitchPortUuid + " found", logicalSwitchPortUuid);
+ }
+ } catch (final NiciraNvpApiException e) {
+ final CommandRetryUtility retryUtility = niciraNvpResource.getRetryUtility();
+ retryUtility.addRetry(command, NUM_RETRIES);
+ return retryUtility.retry(command, FindLogicalSwitchPortAnswer.class, e);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpMaintainCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpMaintainCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpMaintainCommandWrapper.java
new file mode 100644
index 0000000..3015378
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpMaintainCommandWrapper.java
@@ -0,0 +1,36 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.MaintainAnswer;
+import com.cloud.agent.api.MaintainCommand;
+import com.cloud.network.resource.NiciraNvpResource;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.resource.ResourceWrapper;
+
+@ResourceWrapper(handles = MaintainCommand.class)
+public final class NiciraNvpMaintainCommandWrapper extends CommandWrapper<MaintainCommand, Answer, NiciraNvpResource> {
+
+ @Override
+ public Answer execute(final MaintainCommand command, final NiciraNvpResource niciraNvpResource) {
+ return new MaintainAnswer(command);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpReadyCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpReadyCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpReadyCommandWrapper.java
new file mode 100644
index 0000000..3d0d3f3
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpReadyCommandWrapper.java
@@ -0,0 +1,36 @@
+//
+// 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 com.cloud.agent.api.Answer;
+import com.cloud.agent.api.ReadyAnswer;
+import com.cloud.agent.api.ReadyCommand;
+import com.cloud.network.resource.NiciraNvpResource;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.resource.ResourceWrapper;
+
+@ResourceWrapper(handles = ReadyCommand.class)
+public final class NiciraNvpReadyCommandWrapper extends CommandWrapper<ReadyCommand, Answer, NiciraNvpResource> {
+
+ @Override
+ public Answer execute(final ReadyCommand command, final NiciraNvpResource niciraNvpResource) {
+ return new ReadyAnswer(command);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93b0989d/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpUpdateLogicalSwitchPortCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpUpdateLogicalSwitchPortCommandWrapper.java b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpUpdateLogicalSwitchPortCommandWrapper.java
new file mode 100644
index 0000000..a0d7dc2
--- /dev/null
+++ b/plugins/network-elements/nicira-nvp/src/main/java/com/cloud/network/resource/wrapper/NiciraNvpUpdateLogicalSwitchPortCommandWrapper.java
@@ -0,0 +1,68 @@
+//
+// 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 java.util.ArrayList;
+import java.util.List;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.UpdateLogicalSwitchPortAnswer;
+import com.cloud.agent.api.UpdateLogicalSwitchPortCommand;
+import com.cloud.network.nicira.NiciraNvpApi;
+import com.cloud.network.nicira.NiciraNvpApiException;
+import com.cloud.network.nicira.NiciraNvpTag;
+import com.cloud.network.nicira.VifAttachment;
+import com.cloud.network.resource.NiciraNvpResource;
+import com.cloud.network.resource.NiciraNvpUtilities;
+import com.cloud.network.utils.CommandRetryUtility;
+import com.cloud.resource.CommandWrapper;
+import com.cloud.resource.ResourceWrapper;
+
+@ResourceWrapper(handles = UpdateLogicalSwitchPortCommand.class)
+public final class NiciraNvpUpdateLogicalSwitchPortCommandWrapper extends CommandWrapper<UpdateLogicalSwitchPortCommand, Answer, NiciraNvpResource> {
+
+ @Override
+ public Answer execute(final UpdateLogicalSwitchPortCommand command, final NiciraNvpResource niciraNvpResource) {
+ final NiciraNvpUtilities niciraNvpUtilities = niciraNvpResource.getNiciraNvpUtilities();
+
+ final String logicalSwitchUuid = command.getLogicalSwitchUuid();
+ final String logicalSwitchPortUuid = command.getLogicalSwitchPortUuid();
+ final String attachmentUuid = command.getAttachmentUuid();
+
+ final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
+
+ try {
+ // Tags set to scope cs_account and account name
+ final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>();
+ tags.add(new NiciraNvpTag("cs_account", command.getOwnerName()));
+
+ final VifAttachment vifAttachment = niciraNvpUtilities.createVifAttachment(attachmentUuid);
+
+ niciraNvpApi.updateLogicalSwitchPortAttachment(logicalSwitchUuid, logicalSwitchPortUuid, vifAttachment);
+ return new UpdateLogicalSwitchPortAnswer(command, true, "Attachment for " + logicalSwitchPortUuid + " updated", logicalSwitchPortUuid);
+ } catch (final NiciraNvpApiException e) {
+ final CommandRetryUtility retryUtility = niciraNvpResource.getRetryUtility();
+ retryUtility.addRetry(command, NUM_RETRIES);
+ return retryUtility.retry(command, UpdateLogicalSwitchPortAnswer.class, e);
+ }
+ }
+}
\ No newline at end of file