CLOUDSTACK-3214: transferring portable IP across zones with enableStatic
NAT does not work

making an exception for portabe IP, so that if the current datacenter with
portable IP is associated is different from destiantion data center

also on transfer on to new zone, transfer the portable ip association to
new data center, physical network id's


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

Branch: refs/heads/vmsync
Commit: ff167134e45a3321dd5d9a3f45e3f9621b16d759
Parents: 1c102a0
Author: Murali Reddy <muralimmre...@gmail.com>
Authored: Wed Jun 26 19:27:09 2013 +0530
Committer: Murali Reddy <muralimmre...@gmail.com>
Committed: Wed Jun 26 19:29:55 2013 +0530

----------------------------------------------------------------------
 engine/schema/src/com/cloud/dc/VlanVO.java      |  4 ++++
 .../src/com/cloud/network/dao/IPAddressVO.java  |  4 ++++
 .../com/cloud/network/NetworkManagerImpl.java   | 21 +++++++++++++++++++-
 .../cloud/network/rules/RulesManagerImpl.java   |  5 ++++-
 4 files changed, 32 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ff167134/engine/schema/src/com/cloud/dc/VlanVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/VlanVO.java 
b/engine/schema/src/com/cloud/dc/VlanVO.java
index af6b5fc..a2f7a9c 100644
--- a/engine/schema/src/com/cloud/dc/VlanVO.java
+++ b/engine/schema/src/com/cloud/dc/VlanVO.java
@@ -120,6 +120,10 @@ public class VlanVO implements Vlan {
                return dataCenterId;
        }
 
+    public void setDataCenterId(long dcId) {
+        this.dataCenterId = dcId;
+    }
+
        @Override
     public String getIpRange() {
                return ipRange;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ff167134/engine/schema/src/com/cloud/network/dao/IPAddressVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressVO.java 
b/engine/schema/src/com/cloud/network/dao/IPAddressVO.java
index 5eb2500..c5f17504 100644
--- a/engine/schema/src/com/cloud/network/dao/IPAddressVO.java
+++ b/engine/schema/src/com/cloud/network/dao/IPAddressVO.java
@@ -158,6 +158,10 @@ public class IPAddressVO implements IpAddress {
            return dataCenterId;
        }
 
+    public void setDataCenterId(long dcId) {
+        this.dataCenterId = dcId;
+    }
+
        @Override
     public Ip getAddress() {
                return address;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ff167134/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java 
b/server/src/com/cloud/network/NetworkManagerImpl.java
index 8e90cb7..cb3cbbf 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -1125,7 +1125,6 @@ public class NetworkManagerImpl extends ManagerBase 
implements NetworkManager, L
         }
 
         Transaction txn = Transaction.currentTxn();
-        txn.start();
 
         assert(isPortableIpTransferableFromNetwork(ipAddrId, 
currentNetworkId));
 
@@ -1135,8 +1134,27 @@ public class NetworkManagerImpl extends ManagerBase 
implements NetworkManager, L
             disassociatePortableIPToGuestNetwork(ipAddrId, currentNetworkId);
         }
 
+        if (srcNetwork.getDataCenterId() != dstNetwork.getDataCenterId()) {
+            // portable IP need to be transferred across the zones, so mark 
the entry corresponding to portable ip
+            // in user_ip_address as provisioned in destination data center
+            txn.start();
+            ip.setDataCenterId(dstNetwork.getDataCenterId());
+            ip.setPhysicalNetworkId(dstNetwork.getPhysicalNetworkId());
+            _ipAddressDao.update(ipAddrId, ip);
+
+            VlanVO vlan = _vlanDao.findById(ip.getVlanId());
+            vlan.setPhysicalNetworkId(dstNetwork.getPhysicalNetworkId());
+            vlan.setNetworkId(newNetworkId);
+            vlan.setDataCenterId(dstNetwork.getDataCenterId());
+            _vlanDao.update(ip.getVlanId(), vlan);
+            txn.commit();
+        }
+
         associatePortableIPToGuestNetwork(ipAddrId, newNetworkId, false);
 
+
+        txn.start();
+
         if (dstNetwork.getVpcId() != null) {
             ip.setVpcId(dstNetwork.getVpcId());
         } else {
@@ -1144,6 +1162,7 @@ public class NetworkManagerImpl extends ManagerBase 
implements NetworkManager, L
         }
 
         _ipAddressDao.update(ipAddrId, ip);
+
         txn.commit();
         ActionEventUtils.onActionEvent(User.UID_SYSTEM, 
Account.ACCOUNT_ID_SYSTEM, Domain.ROOT_DOMAIN,
                 EventTypes.EVENT_PORTABLE_IP_TRANSFER, "Portable IP associated 
is transferred from network "

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ff167134/server/src/com/cloud/network/rules/RulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java 
b/server/src/com/cloud/network/rules/RulesManagerImpl.java
index bcda32d..0f733fb 100755
--- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@ -159,7 +159,10 @@ public class RulesManagerImpl extends ManagerBase 
implements RulesManager, Rules
 
         // validate that userVM is in the same availability zone as the IP 
address
         if (ipAddress.getDataCenterId() != userVm.getDataCenterId()) {
-            throw new InvalidParameterValueException("Unable to create ip 
forwarding rule, IP address " + ipAddress + " is not in the same availability 
zone as virtual machine " + userVm.toString());
+            //make an exception for portable IP
+            if (!ipAddress.isPortable()) {
+                throw new InvalidParameterValueException("Unable to create ip 
forwarding rule, IP address " + ipAddress + " is not in the same availability 
zone as virtual machine " + userVm.toString());
+            }
         }
 
     }

Reply via email to