Updated Branches:
  refs/heads/nicira-l3support dd68a0033 -> c5634b968

Wire the PortForwarding and StaticNat calls

Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/c5634b96
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/c5634b96
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/c5634b96

Branch: refs/heads/nicira-l3support
Commit: c5634b96873ec69c43c210ed172855c9d9b2ff7d
Parents: d4d82fa
Author: Hugo Trippaers <[email protected]>
Authored: Sun Sep 30 10:20:54 2012 -0700
Committer: Hugo Trippaers <[email protected]>
Committed: Sun Sep 30 10:20:54 2012 -0700

----------------------------------------------------------------------
 .../agent/api/AssignIpToLogicalRouterAnswer.java   |   35 -----
 .../agent/api/AssignIpToLogicalRouterCommand.java  |   98 --------------
 ...rePortForwardingRulesOnLogicalRouterAnswer.java |   34 +++++
 ...ePortForwardingRulesOnLogicalRouterCommand.java |   61 +++++++++
 ...nfigureStaticNatRulesOnLogicalRouterAnswer.java |   43 ++++++
 ...figureStaticNatRulesOnLogicalRouterCommand.java |   64 +++++++++
 .../cloud/agent/api/CreateLogicalRouterAnswer.java |    2 +-
 .../cloud/network/element/NiciraNvpElement.java    |  102 ++++++++++++--
 .../cloud/network/nicira/DestinationNatRule.java   |   49 +-------
 .../src/com/cloud/network/nicira/NatRule.java      |   89 +++++++++++++-
 .../src/com/cloud/network/nicira/NiciraNvpApi.java |    6 +
 .../com/cloud/network/nicira/SourceNatRule.java    |   58 +--------
 .../cloud/network/resource/NiciraNvpResource.java  |   95 ++++++--------
 13 files changed, 432 insertions(+), 304 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/AssignIpToLogicalRouterAnswer.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/AssignIpToLogicalRouterAnswer.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/AssignIpToLogicalRouterAnswer.java
deleted file mode 100644
index 1eda213..0000000
--- 
a/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/AssignIpToLogicalRouterAnswer.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// 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.agent.api;
-
-import com.cloud.agent.api.Command;
-
-/**
- * 
- */
-public class AssignIpToLogicalRouterAnswer extends Answer {
-       
-    public AssignIpToLogicalRouterAnswer(Command command, boolean success,
-            String details) {
-        super(command, success, details);
-    }
-    
-    public AssignIpToLogicalRouterAnswer(Command command, Exception e) {
-        super(command, e);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/AssignIpToLogicalRouterCommand.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/AssignIpToLogicalRouterCommand.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/AssignIpToLogicalRouterCommand.java
deleted file mode 100644
index 98c36a8..0000000
--- 
a/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/AssignIpToLogicalRouterCommand.java
+++ /dev/null
@@ -1,98 +0,0 @@
-// 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.agent.api;
-
-import com.cloud.network.IpAddress;
-
-/**
- * 
- */
-public class AssignIpToLogicalRouterCommand extends Command {
-       private String logicalRouterUuid;
-       private String gatewayServiceUuid;
-       private String publicIpCidr;
-       private long publicIpVlan;
-       private boolean sourceNat;
-       private String internalNetworkCidr;
-
-       public AssignIpToLogicalRouterCommand(String logicalRouterUuid, String 
gatewayServiceUuid, String publicIpCidr, long publicIpVlan, boolean sourceNat, 
String internetNetworkCidr) {
-               this.logicalRouterUuid = logicalRouterUuid;
-               this.gatewayServiceUuid = gatewayServiceUuid;
-               this.publicIpCidr = publicIpCidr;
-               this.sourceNat = sourceNat;
-               this.internalNetworkCidr = internetNetworkCidr;
-               this.publicIpVlan = publicIpVlan;
-       }
-       
-       public String getLogicalRouterUuid() {
-               return logicalRouterUuid;
-       }
-
-       public void setLogicalRouterUuid(String logicalRouterUuid) {
-               this.logicalRouterUuid = logicalRouterUuid;
-       }
-
-       public String getGatewayServiceUuid() {
-               return gatewayServiceUuid;
-       }
-
-       public void setGatewayServiceUuid(String gatewayServiceUuid) {
-               this.gatewayServiceUuid = gatewayServiceUuid;
-       }
-
-       public String getPublicIpCidr() {
-               return publicIpCidr;
-       }
-
-       public void setPublicIpCidr(String publicIpCidr) {
-               this.publicIpCidr = publicIpCidr;
-       }
-
-       public long getPublicIpVlan() {
-               return publicIpVlan;
-       }
-
-       public void setPublicIpVlan(long publicIpVlan) {
-               this.publicIpVlan = publicIpVlan;
-       }
-
-       public boolean isSourceNat() {
-               return sourceNat;
-       }
-
-       public void setSourceNat(boolean sourceNat) {
-               this.sourceNat = sourceNat;
-       }
-
-       public String getInternalNetworkCidr() {
-               return internalNetworkCidr;
-       }
-
-       public void setInternalNetworkCidr(String internalNetworkCidr) {
-               this.internalNetworkCidr = internalNetworkCidr;
-       }
-
-       /* (non-Javadoc)
-        * @see com.cloud.agent.api.Command#executeInSequence()
-        */
-       @Override
-       public boolean executeInSequence() {
-               // TODO Auto-generated method stub
-               return false;
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigurePortForwardingRulesOnLogicalRouterAnswer.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigurePortForwardingRulesOnLogicalRouterAnswer.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigurePortForwardingRulesOnLogicalRouterAnswer.java
new file mode 100644
index 0000000..40bde6c
--- /dev/null
+++ 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigurePortForwardingRulesOnLogicalRouterAnswer.java
@@ -0,0 +1,34 @@
+// 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.agent.api;
+
+/**
+ * 
+ */
+public class ConfigurePortForwardingRulesOnLogicalRouterAnswer extends Answer {
+
+       public ConfigurePortForwardingRulesOnLogicalRouterAnswer(Command 
command,
+                       boolean success, String details) {
+               super(command, success, details);
+       }
+
+       public ConfigurePortForwardingRulesOnLogicalRouterAnswer(Command 
command,
+                       Exception e) {
+               super(command, e);
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigurePortForwardingRulesOnLogicalRouterCommand.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigurePortForwardingRulesOnLogicalRouterCommand.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigurePortForwardingRulesOnLogicalRouterCommand.java
new file mode 100644
index 0000000..1d57e35
--- /dev/null
+++ 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigurePortForwardingRulesOnLogicalRouterCommand.java
@@ -0,0 +1,61 @@
+// 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.agent.api;
+
+import java.util.List;
+
+import com.cloud.agent.api.to.PortForwardingRuleTO;
+
+/**
+ * 
+ */
+public class ConfigurePortForwardingRulesOnLogicalRouterCommand extends 
Command {
+       
+       private String logicalRouterUuid;
+       private List<PortForwardingRuleTO> rules;
+
+       public ConfigurePortForwardingRulesOnLogicalRouterCommand(String 
logicalRouterUuid, List<PortForwardingRuleTO> rules) {
+               this.logicalRouterUuid = logicalRouterUuid;
+               this.rules = rules;
+       }
+       
+       public String getLogicalRouterUuid() {
+               return logicalRouterUuid;
+       }
+
+       public void setLogicalRouterUuid(String logicalRouterUuid) {
+               this.logicalRouterUuid = logicalRouterUuid;
+       }
+
+       public List<PortForwardingRuleTO> getRules() {
+               return rules;
+       }
+
+       public void setRules(List<PortForwardingRuleTO> rules) {
+               this.rules = rules;
+       }
+
+       /* (non-Javadoc)
+        * @see com.cloud.agent.api.Command#executeInSequence()
+        */
+       @Override
+       public boolean executeInSequence() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigureStaticNatRulesOnLogicalRouterAnswer.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigureStaticNatRulesOnLogicalRouterAnswer.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigureStaticNatRulesOnLogicalRouterAnswer.java
new file mode 100644
index 0000000..463dd46
--- /dev/null
+++ 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigureStaticNatRulesOnLogicalRouterAnswer.java
@@ -0,0 +1,43 @@
+// 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.agent.api;
+
+/**
+ * 
+ */
+public class ConfigureStaticNatRulesOnLogicalRouterAnswer extends Answer {
+
+       /**
+        * @param command
+        * @param success
+        * @param details
+        */
+       public ConfigureStaticNatRulesOnLogicalRouterAnswer(Command command,
+                       boolean success, String details) {
+               super(command, success, details);
+       }
+
+       /**
+        * @param command
+        * @param e
+        */
+       public ConfigureStaticNatRulesOnLogicalRouterAnswer(Command command,
+                       Exception e) {
+               super(command, e);
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigureStaticNatRulesOnLogicalRouterCommand.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigureStaticNatRulesOnLogicalRouterCommand.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigureStaticNatRulesOnLogicalRouterCommand.java
new file mode 100644
index 0000000..4e5d37c
--- /dev/null
+++ 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/ConfigureStaticNatRulesOnLogicalRouterCommand.java
@@ -0,0 +1,64 @@
+// 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.agent.api;
+
+import java.util.List;
+
+import com.cloud.agent.api.to.StaticNatRuleTO;
+
+/**
+ * 
+ */
+public class ConfigureStaticNatRulesOnLogicalRouterCommand extends Command {
+       
+       private String logicalRouterUuid;
+       private List<StaticNatRuleTO> rules;
+
+       public ConfigureStaticNatRulesOnLogicalRouterCommand(
+                       String logicalRouterUuid, List<StaticNatRuleTO> rules) {
+               super();
+               this.logicalRouterUuid = logicalRouterUuid;
+               this.rules = rules;
+
+       }
+
+       public String getLogicalRouterUuid() {
+               return logicalRouterUuid;
+       }
+
+       public void setLogicalRouterUuid(String logicalRouterUuid) {
+               this.logicalRouterUuid = logicalRouterUuid;
+       }
+
+       public List<StaticNatRuleTO> getRules() {
+               return rules;
+       }
+
+       public void setRules(List<StaticNatRuleTO> rules) {
+               this.rules = rules;
+       }
+
+       /* (non-Javadoc)
+        * @see com.cloud.agent.api.Command#executeInSequence()
+        */
+       @Override
+       public boolean executeInSequence() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/CreateLogicalRouterAnswer.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/CreateLogicalRouterAnswer.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/CreateLogicalRouterAnswer.java
index 3337e92..4a09e44 100644
--- 
a/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/CreateLogicalRouterAnswer.java
+++ 
b/plugins/network-elements/nicira-nvp/src/com/cloud/agent/api/CreateLogicalRouterAnswer.java
@@ -33,7 +33,7 @@ public class CreateLogicalRouterAnswer extends Answer {
         super(command, e);
     }
 
-    public String getLogicalSwitchUuid() {
+    public String getLogicalRouterUuid() {
         return _logicalRouterUuid;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/network/element/NiciraNvpElement.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/element/NiciraNvpElement.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/element/NiciraNvpElement.java
index 7a0b268..716cd78 100644
--- 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/element/NiciraNvpElement.java
+++ 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/element/NiciraNvpElement.java
@@ -47,6 +47,10 @@ import javax.naming.ConfigurationException;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.ConfigurePortForwardingRulesOnLogicalRouterAnswer;
+import com.cloud.agent.api.ConfigurePortForwardingRulesOnLogicalRouterCommand;
+import com.cloud.agent.api.ConfigureStaticNatRulesOnLogicalRouterAnswer;
+import com.cloud.agent.api.ConfigureStaticNatRulesOnLogicalRouterCommand;
 import com.cloud.agent.api.CreateLogicalRouterAnswer;
 import com.cloud.agent.api.CreateLogicalRouterCommand;
 import com.cloud.agent.api.CreateLogicalSwitchPortAnswer;
@@ -61,6 +65,8 @@ import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupNiciraNvpCommand;
 import com.cloud.agent.api.UpdateLogicalSwitchPortAnswer;
 import com.cloud.agent.api.UpdateLogicalSwitchPortCommand;
+import com.cloud.agent.api.to.PortForwardingRuleTO;
+import com.cloud.agent.api.to.StaticNatRuleTO;
 import com.cloud.api.commands.AddNiciraNvpDeviceCmd;
 import com.cloud.api.commands.DeleteNiciraNvpDeviceCmd;
 import com.cloud.api.commands.ListNiciraNvpDeviceNetworksCmd;
@@ -87,6 +93,7 @@ import com.cloud.network.Network.Service;
 import com.cloud.network.NetworkVO;
 import com.cloud.network.Networks;
 import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.IpAddress;
 import com.cloud.network.NetworkManager;
 import com.cloud.network.NiciraNvpDeviceVO;
 import com.cloud.network.NiciraNvpNicMappingVO;
@@ -105,8 +112,11 @@ import 
com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
 import com.cloud.network.guru.NiciraNvpGuestNetworkGuru;
 import com.cloud.network.resource.NiciraNvpResource;
+import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.PortForwardingRule;
 import com.cloud.network.rules.StaticNat;
+import com.cloud.network.rules.StaticNatRule;
+import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.resource.ResourceManager;
 import com.cloud.resource.ResourceState;
@@ -291,7 +301,7 @@ public class NiciraNvpElement extends AdapterBase implements
                                
                                // Store the uuid so we can easily find it 
during cleanup
                                NiciraNvpRouterMappingVO routermapping = 
-                                               new 
NiciraNvpRouterMappingVO(cmd.getLogicalSwitchUuid(), network.getId());
+                                               new 
NiciraNvpRouterMappingVO(answer.getLogicalRouterUuid(), network.getId());
                                
_niciraNvpRouterMappingDao.persist(routermapping);
                        }
                } finally {
@@ -518,8 +528,8 @@ public class NiciraNvpElement extends AdapterBase implements
                        s_logger.warn("Unable to provide services without 
Connectivity service enabled for this element");
                        return false;
                }
-               if ((services.contains(Service.PortForwarding) || 
services.contains(Service.StaticNat)) && 
!services.contains(Service.PortForwarding)) {
-                       s_logger.warn("Unable to provider StaticNat and/or 
PortForwarding without the SourceNat service");
+               if ((services.contains(Service.PortForwarding) || 
services.contains(Service.StaticNat)) && !services.contains(Service.SourceNat)) 
{
+                       s_logger.warn("Unable to provide StaticNat and/or 
PortForwarding without the SourceNat service");
                        return false;
                }
                return true;
@@ -833,15 +843,49 @@ public class NiciraNvpElement extends AdapterBase 
implements
         * From interface StaticNatServiceProvider
         */
        @Override
-       public boolean applyStaticNats(Network config,
+       public boolean applyStaticNats(Network network,
                        List<? extends StaticNat> rules)
                        throws ResourceUnavailableException {
-               // FIXME Implement this
-               s_logger.debug("Entering applyStaticNats"); // TODO Remove this 
line
-               for (StaticNat rule : rules) {
-                       s_logger.debug ("StaticNat rule : from " + 
rule.getSourceIpAddressId() + " to " + rule.getDestIpAddress() + 
(rule.isForRevoke() ? " for revoke" : ""));
+        if (!canHandle(network, Service.StaticNat)) {
+            return false;
+        }
+
+               List<NiciraNvpDeviceVO> devices = _niciraNvpDao
+                               
.listByPhysicalNetwork(network.getPhysicalNetworkId());
+               if (devices.isEmpty()) {
+                       s_logger.error("No NiciraNvp Controller on physical 
network "
+                                       + network.getPhysicalNetworkId());
+                       return false;
                }
-               return true;
+               NiciraNvpDeviceVO niciraNvpDevice = devices.get(0);
+               HostVO niciraNvpHost = 
_hostDao.findById(niciraNvpDevice.getHostId());
+               
+               NiciraNvpRouterMappingVO routermapping = 
_niciraNvpRouterMappingDao
+                               .findByNetworkIdI(network.getId());
+               if (routermapping == null) {
+                       s_logger.error("No logical router uuid found for 
network "
+                                       + network.getDisplayText());
+                       return false;
+               }
+
+               List<StaticNatRuleTO> staticNatRules = new 
ArrayList<StaticNatRuleTO>(); 
+        for (StaticNat rule : rules) {
+            IpAddress sourceIp = 
_networkManager.getIp(rule.getSourceIpAddressId());
+            // Force the nat rule into the StaticNatRuleTO, no use making a 
new TO object
+            // we only need the source and destination ip. Unfortunately no 
mention if a rule
+            // is new.
+            StaticNatRuleTO ruleTO = new StaticNatRuleTO(1, 
+                       sourceIp.getAddress().addr(), 0, 65535, 
+                       rule.getDestIpAddress(), 0, 65535,
+                       "any", rule.isForRevoke(), false);
+            staticNatRules.add(ruleTO);
+        }
+        
+        ConfigureStaticNatRulesOnLogicalRouterCommand cmd = 
+                       new 
ConfigureStaticNatRulesOnLogicalRouterCommand(routermapping.getLogicalRouterUuid(),
 staticNatRules);
+        ConfigureStaticNatRulesOnLogicalRouterAnswer answer = 
(ConfigureStaticNatRulesOnLogicalRouterAnswer) 
_agentMgr.easySend(niciraNvpHost.getId(), cmd);
+        
+        return answer.getResult();
        }
 
        /**
@@ -850,13 +894,41 @@ public class NiciraNvpElement extends AdapterBase 
implements
        @Override
        public boolean applyPFRules(Network network, List<PortForwardingRule> 
rules)
                        throws ResourceUnavailableException {
-               // FIXME Implement this
-               s_logger.debug("Entering applyPFRules"); // TODO Remove this 
line
-               for (PortForwardingRule rule : rules) {
-                       s_logger.debug ("PortForwardingRule rule : from " + 
rule.getSourceIpAddressId() + 
-                                       " to " + 
rule.getDestinationIpAddress().addr() + " port " + 
rule.getDestinationPortStart() + "-" + rule.getDestinationPortEnd());
+        if (!canHandle(network, Service.PortForwarding)) {
+            return false;
+        }
+        
+               List<NiciraNvpDeviceVO> devices = _niciraNvpDao
+                               
.listByPhysicalNetwork(network.getPhysicalNetworkId());
+               if (devices.isEmpty()) {
+                       s_logger.error("No NiciraNvp Controller on physical 
network "
+                                       + network.getPhysicalNetworkId());
+                       return false;
                }
-               return false;
+               NiciraNvpDeviceVO niciraNvpDevice = devices.get(0);
+               HostVO niciraNvpHost = 
_hostDao.findById(niciraNvpDevice.getHostId());
+               
+               NiciraNvpRouterMappingVO routermapping = 
_niciraNvpRouterMappingDao
+                               .findByNetworkIdI(network.getId());
+               if (routermapping == null) {
+                       s_logger.error("No logical router uuid found for 
network "
+                                       + network.getDisplayText());
+                       return false;
+               }
+               
+               List<PortForwardingRuleTO> portForwardingRules = new 
ArrayList<PortForwardingRuleTO>(); 
+        for (PortForwardingRule rule : rules) {
+            IpAddress sourceIp = 
_networkManager.getIp(rule.getSourceIpAddressId());
+            Vlan vlan = _vlanDao.findById(sourceIp.getVlanId());
+            PortForwardingRuleTO ruleTO = new 
PortForwardingRuleTO((PortForwardingRule) rule, vlan.getVlanTag(), 
sourceIp.getAddress().addr());
+            portForwardingRules.add(ruleTO);
+        }
+        
+        ConfigurePortForwardingRulesOnLogicalRouterCommand cmd = 
+                       new 
ConfigurePortForwardingRulesOnLogicalRouterCommand(routermapping.getLogicalRouterUuid(),
 portForwardingRules);
+        ConfigurePortForwardingRulesOnLogicalRouterAnswer answer = 
(ConfigurePortForwardingRulesOnLogicalRouterAnswer) 
_agentMgr.easySend(niciraNvpHost.getId(), cmd);
+        
+        return answer.getResult();
        }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/DestinationNatRule.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/DestinationNatRule.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/DestinationNatRule.java
index 2cbdace..b1ef12f 100644
--- 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/DestinationNatRule.java
+++ 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/DestinationNatRule.java
@@ -1,53 +1,8 @@
 package com.cloud.network.nicira;
 
 public class DestinationNatRule extends NatRule {
-       private Match match;
-       private String to_destination_ip_address_min;
-       private String to_destination_ip_address_max;
-       private Integer to_destination_port;
-       private String uuid;
-       private String type = "DestinationNatRule";
-       
-       public Match getMatch() {
-               return match;
-       }
-       
-       public void setMatch(Match match) {
-               this.match = match;
-       }
-       
-       public String getToDestinationIpAddressMin() {
-               return to_destination_ip_address_min;
-       }
-       
-       public void setToDestinationIpAddressMin(
-                       String to_destination_ip_address_min) {
-               this.to_destination_ip_address_min = 
to_destination_ip_address_min;
-       }
-       
-       public String getToDestinationIpAddressMax() {
-               return to_destination_ip_address_max;
-       }
-       
-       public void setToDestinationIpAddressMax(
-                       String to_destination_ip_address_max) {
-               this.to_destination_ip_address_max = 
to_destination_ip_address_max;
-       }
-       
-       public Integer getToDestinationPort() {
-               return to_destination_port;
-       }
-       
-       public void setToDestinationPort(Integer to_destination_port) {
-               this.to_destination_port = to_destination_port;
-       }
-       
-       public String getUuid() {
-               return uuid;
-       }
-       
-       public void setUuid(String uuid) {
-               this.uuid = uuid;
+       {
+               type = "DestinationNatRule";
        }
        
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NatRule.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NatRule.java 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NatRule.java
index 30196f0..82a3378 100644
--- 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NatRule.java
+++ 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NatRule.java
@@ -20,5 +20,92 @@ package com.cloud.network.nicira;
  * 
  */
 public abstract class NatRule {
-
+       protected Match match;
+       protected String to_source_ip_address_min;
+       protected String to_source_ip_address_max;
+       protected Integer to_source_port_min;
+       protected Integer to_source_port_max;
+       protected String uuid;
+       protected String type;
+       protected String to_destination_ip_address_min;
+       protected String to_destination_ip_address_max;
+       protected Integer to_destination_port;
+       
+       public Match getMatch() {
+               return match;
+       }
+       
+       public void setMatch(Match match) {
+               this.match = match;
+       }
+       
+       public String getToSourceIpAddressMin() {
+               return to_source_ip_address_min;
+       }
+       
+       public void setToSourceIpAddressMin(String to_source_ip_address_min) {
+               this.to_source_ip_address_min = to_source_ip_address_min;
+       }
+       
+       public String getToSourceIpAddressMax() {
+               return to_source_ip_address_max;
+       }
+       
+       public void setToSourceIpAddressMax(String to_source_ip_address_max) {
+               this.to_source_ip_address_max = to_source_ip_address_max;
+       }
+       
+       public Integer getToSourcePortMin() {
+               return to_source_port_min;
+       }
+       
+       public void setToSourcePortMin(Integer to_source_port_min) {
+               this.to_source_port_min = to_source_port_min;
+       }
+       
+       public Integer getToSourcePortMax() {
+               return to_source_port_max;
+       }
+       
+       public void setToSourcePortMax(Integer to_source_port_max) {
+               this.to_source_port_max = to_source_port_max;
+       }
+       
+       public String getUuid() {
+               return uuid;
+       }
+       
+       public void setUuid(String uuid) {
+               this.uuid = uuid;
+       }
+       
+       public String getToDestinationIpAddressMin() {
+               return to_destination_ip_address_min;
+       }
+       
+       public void setToDestinationIpAddressMin(
+                       String to_destination_ip_address_min) {
+               this.to_destination_ip_address_min = 
to_destination_ip_address_min;
+       }
+       
+       public String getToDestinationIpAddressMax() {
+               return to_destination_ip_address_max;
+       }
+       
+       public void setToDestinationIpAddressMax(
+                       String to_destination_ip_address_max) {
+               this.to_destination_ip_address_max = 
to_destination_ip_address_max;
+       }
+       
+       public Integer getToDestinationPort() {
+               return to_destination_port;
+       }
+       
+       public void setToDestinationPort(Integer to_destination_port) {
+               this.to_destination_port = to_destination_port;
+       }
+       
+       public String getType() {
+               return type;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpApi.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpApi.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpApi.java
index a04dd1e..fe4deec 100644
--- 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpApi.java
+++ 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/NiciraNvpApi.java
@@ -284,6 +284,12 @@ public class NiciraNvpApi {
        executeUpdateObject(logicalRouterPort, uri, 
Collections.<String,String>emptyMap());
     }
     
+    public NiciraNvpList<NatRule> findNatRulesByLogicalRouterUuid(String 
logicalRouterUuid) throws NiciraNvpApiException {
+       String uri = "/ws.v1/lrouter/" + logicalRouterUuid + "/nat";
+       
+       return executeRetrieveObject(new 
TypeToken<NiciraNvpList<NatRule>>(){}.getType(), uri, 
Collections.<String,String>emptyMap());
+    }
+    
     private <T> void executeUpdateObject(T newObject, String uri, 
Map<String,String> parameters) throws NiciraNvpApiException {
         String url;
         try {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SourceNatRule.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SourceNatRule.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SourceNatRule.java
index 7d1c13d..acbf21e 100644
--- 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SourceNatRule.java
+++ 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/nicira/SourceNatRule.java
@@ -20,60 +20,8 @@ package com.cloud.network.nicira;
  * 
  */
 public class SourceNatRule extends NatRule {
-       private Match match;
-       private String to_source_ip_address_min;
-       private String to_source_ip_address_max;
-       private Integer to_source_port_min;
-       private Integer to_source_port_max;
-       private String uuid;
-       private String type = "SourceNatRule";
-       
-       public Match getMatch() {
-               return match;
-       }
-       
-       public void setMatch(Match match) {
-               this.match = match;
-       }
-       
-       public String getToSourceIpAddressMin() {
-               return to_source_ip_address_min;
-       }
-       
-       public void setToSourceIpAddressMin(String to_source_ip_address_min) {
-               this.to_source_ip_address_min = to_source_ip_address_min;
-       }
-       
-       public String getToSourceIpAddressMax() {
-               return to_source_ip_address_max;
-       }
-       
-       public void setToSourceIpAddressMax(String to_source_ip_address_max) {
-               this.to_source_ip_address_max = to_source_ip_address_max;
-       }
-       
-       public Integer getToSourcePortMin() {
-               return to_source_port_min;
-       }
-       
-       public void setToSourcePortMin(Integer to_source_port_min) {
-               this.to_source_port_min = to_source_port_min;
-       }
-       
-       public Integer getToSourcePortMax() {
-               return to_source_port_max;
-       }
-       
-       public void setToSourcePortMax(Integer to_source_port_max) {
-               this.to_source_port_max = to_source_port_max;
-       }
-       
-       public String getUuid() {
-               return uuid;
-       }
-       
-       public void setUuid(String uuid) {
-               this.uuid = uuid;
-       }
+       {
+               type = "SourceNatRule";
+       }       
        
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/c5634b96/plugins/network-elements/nicira-nvp/src/com/cloud/network/resource/NiciraNvpResource.java
----------------------------------------------------------------------
diff --git 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/resource/NiciraNvpResource.java
 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/resource/NiciraNvpResource.java
index 96ed856..0908101 100644
--- 
a/plugins/network-elements/nicira-nvp/src/com/cloud/network/resource/NiciraNvpResource.java
+++ 
b/plugins/network-elements/nicira-nvp/src/com/cloud/network/resource/NiciraNvpResource.java
@@ -26,9 +26,11 @@ import org.apache.log4j.Logger;
 
 import com.cloud.agent.IAgentControl;
 import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.AssignIpToLogicalRouterAnswer;
-import com.cloud.agent.api.AssignIpToLogicalRouterCommand;
 import com.cloud.agent.api.Command;
+import com.cloud.agent.api.ConfigurePortForwardingRulesOnLogicalRouterAnswer;
+import com.cloud.agent.api.ConfigurePortForwardingRulesOnLogicalRouterCommand;
+import com.cloud.agent.api.ConfigureStaticNatRulesOnLogicalRouterAnswer;
+import com.cloud.agent.api.ConfigureStaticNatRulesOnLogicalRouterCommand;
 import com.cloud.agent.api.CreateLogicalRouterAnswer;
 import com.cloud.agent.api.CreateLogicalRouterCommand;
 import com.cloud.agent.api.CreateLogicalSwitchAnswer;
@@ -52,6 +54,7 @@ import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupNiciraNvpCommand;
 import com.cloud.agent.api.UpdateLogicalSwitchPortAnswer;
 import com.cloud.agent.api.UpdateLogicalSwitchPortCommand;
+import com.cloud.agent.api.to.StaticNatRuleTO;
 import com.cloud.host.Host;
 import com.cloud.host.Host.Type;
 import com.cloud.network.nicira.Attachment;
@@ -62,6 +65,7 @@ import com.cloud.network.nicira.LogicalRouterPort;
 import com.cloud.network.nicira.LogicalSwitch;
 import com.cloud.network.nicira.LogicalSwitchPort;
 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;
@@ -220,10 +224,12 @@ public class NiciraNvpResource implements ServerResource {
         else if (cmd instanceof DeleteLogicalRouterCommand) {
                return executeRequest((DeleteLogicalRouterCommand) cmd, 
numRetries);
         }
-        else if (cmd instanceof AssignIpToLogicalRouterCommand) {
-               return executeRequest((AssignIpToLogicalRouterCommand) cmd, 
numRetries);
+        else if (cmd instanceof ConfigureStaticNatRulesOnLogicalRouterCommand) 
{
+               return 
executeRequest((ConfigureStaticNatRulesOnLogicalRouterCommand) cmd, numRetries);
         }
-        s_logger.debug("Received unsupported command " + cmd.toString());
+        else if (cmd instanceof 
ConfigurePortForwardingRulesOnLogicalRouterCommand) {
+               return 
executeRequest((ConfigurePortForwardingRulesOnLogicalRouterCommand) cmd, 
numRetries);
+        }        s_logger.debug("Received unsupported command " + 
cmd.toString());
         return Answer.createUnsupportedCommandAnswer(cmd);
     }
 
@@ -475,64 +481,49 @@ public class NiciraNvpResource implements ServerResource {
         }
     }
     
-    private Answer executeRequest(AssignIpToLogicalRouterCommand cmd, int 
numRetries) {
+    private Answer 
executeRequest(ConfigureStaticNatRulesOnLogicalRouterCommand cmd, int 
numRetries) {
        try {
                LogicalRouterConfig lrc = 
_niciraNvpApi.findOneLogicalRouterByUuid(cmd.getLogicalRouterUuid());
+               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
                
-               NiciraNvpList<LogicalRouterPort> ports = 
-                               
_niciraNvpApi.findLogicalRouterPortByGatewayServiceAndVlanId(cmd.getLogicalRouterUuid(),
 
-                                               cmd.getGatewayServiceUuid(), 
cmd.getPublicIpVlan());
-               
-               String publicNetworkIpAddress = cmd.getPublicIpCidr();          
        
-               
-               if (ports.isEmpty()) {
-                       // No attachment on this network, we need to create one
-                       // Create the outside port for the router
-                       LogicalRouterPort lrpo = new LogicalRouterPort();
-                       lrpo.setAdminStatusEnabled(true);
-                       lrpo.setDisplayName(lrc.getDisplayName() + 
"-outside-port");
-                       lrpo.setTags(lrc.getTags());
-                       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
-                       L3GatewayAttachment attachment = new 
L3GatewayAttachment(cmd.getGatewayServiceUuid());
-                       if (cmd.getPublicIpVlan() != 0) {
-                               attachment.setVlanId(cmd.getPublicIpVlan());
-                       }
-                       
_niciraNvpApi.modifyLogicalRouterPortAttachment(lrc.getUuid(), lrpo.getUuid(), 
attachment);
-                       return new AssignIpToLogicalRouterAnswer(cmd, true, "Ip 
address configured on new logical router port");
-               }
-               else {
-                       // There is already and attachment to this public 
network, see if we need to add this IP
-                       boolean found = false;
-                       LogicalRouterPort publicPort = null;
-                       for (LogicalRouterPort port : ports.getResults()) {
-                               for (String cidr : port.getIpAddresses()) {
-                                       if 
(publicNetworkIpAddress.equals(cidr)) {
-                                               found = true;
-                                               publicPort = port;
-                                               break;
-                                       }
+               for (StaticNatRuleTO rule : cmd.getRules()) {
+                       // Find if a DestinationNat rule exists for this rule
+                       for (NatRule storedRule : existingRules.getResults()) {
+                               if 
("SourceNatRule".equals(storedRule.getType())) {
+                                       continue;
                                }
+                               String insideCidr = rule.getDstIp() + "/32";
+                               String outsideCidr = rule.getSrcIp() + "/32";
+                               //if 
(insideCidr.equals(storedRule.getMatch().getDestinationIpAddresses()))
                        }
-                       if (found) {
-                               s_logger.warn("Ip " + publicNetworkIpAddress + 
" is already configured on logical router " + cmd.getLogicalRouterUuid());
-                               return new AssignIpToLogicalRouterAnswer(cmd, 
true, "Ip address already alocated on logical Router");
-                       }
-                       
-                       publicPort.getIpAddresses().add(publicNetworkIpAddress);
-                       
_niciraNvpApi.updateLogicalRouterPortConfig(cmd.getLogicalRouterUuid(), 
publicPort);
-                       return new AssignIpToLogicalRouterAnswer(cmd, true, "Ip 
address configured on existing logical router port");
                }
+               //FIXME implement!
+               return new ConfigureStaticNatRulesOnLogicalRouterAnswer(cmd, 
true, cmd.getRules().size() +" StaticNat rules applied");
         } catch (NiciraNvpApiException e) {
                if (numRetries > 0) {
                        return retry(cmd, --numRetries);
                } 
                else {
-                       return new DeleteLogicalRouterAnswer(cmd, e);
+                       return new 
ConfigureStaticNatRulesOnLogicalRouterAnswer(cmd, e);
+               }
+        }
+       
+    }
+
+    private Answer 
executeRequest(ConfigurePortForwardingRulesOnLogicalRouterCommand cmd, int 
numRetries) {
+       try {
+               LogicalRouterConfig lrc = 
_niciraNvpApi.findOneLogicalRouterByUuid(cmd.getLogicalRouterUuid());
+               //FIXME implement!
+               return new 
ConfigurePortForwardingRulesOnLogicalRouterAnswer(cmd, true, 
cmd.getRules().size() +" PortForwarding rules applied");
+        } catch (NiciraNvpApiException e) {
+               if (numRetries > 0) {
+                       return retry(cmd, --numRetries);
+               } 
+               else {
+                       return new 
ConfigurePortForwardingRulesOnLogicalRouterAnswer(cmd, e);
                }
         }
        

Reply via email to