Hi,

I am attaching the patch for topology changes.

@Chamila,

Please do the changes in python agent accordingly. Basic idea is that
topology and topology events are carrying

   - list of private IPs
   - list of public IPs
   - a default public IP (for LB routing)
   - a default private IP (for LB routing)

Thanks.

On Fri, Dec 5, 2014 at 10:59 AM, Reka Thirunavukkarasu <r...@wso2.com>
wrote:

> HI Raj,
>
> On Fri, Dec 5, 2014 at 8:20 AM, Rajkumar Rajaratnam <rajkum...@wso2.com>
> wrote:
>
>> Okay.
>>
>> @Reka, Please let me know when are done with testing.
>>
>
> Sure..We are in the process of stabilising grouping feature in the master.
> Will update once we have the complete flow working fine..
>
>>
>> I will make a diff in meantime.
>>
>
> +1. Anyway, you might need to rebase it when you apply it as we are also
> fixing bugs in the same code..
>
> Thanks,
> Reka
>
>>
>> Thanks.
>>
>> On Fri, Dec 5, 2014 at 8:08 AM, Lakmal Warusawithana <lak...@wso2.com>
>> wrote:
>>
>>> Sure, shall we do this after complete full work flow test in grouping.
>>>
>>> On Fri, Dec 5, 2014 at 8:00 AM, Rajkumar Rajaratnam <rajkum...@wso2.com>
>>> wrote:
>>>
>>>> Hi,
>>>>
>>>> Please let me know the decision on this before code freeze. This is a
>>>> simple change to do.
>>>>
>>>> Thanks.
>>>>
>>>> On Fri, Dec 5, 2014 at 1:41 AM, Rajkumar Rajaratnam <rajkum...@wso2.com
>>>> > wrote:
>>>>
>>>>> Hi Devs,
>>>>>
>>>>> I have integrated multiple network interfaces support into the master
>>>>> branch and it is working fine.
>>>>>
>>>>> Now we should modify the topology to include list of private/public IP
>>>>> addresses. Currently topology and topology events supports max of one
>>>>> public IP and one private IP.
>>>>>
>>>>> Can I go ahead and do this change?
>>>>>
>>>>> Thanks.
>>>>>
>>>>> --
>>>>> Rajkumar Rajaratnam
>>>>> Committer & PMC Member, Apache Stratos
>>>>> Software Engineer, WSO2
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Rajkumar Rajaratnam
>>>> Committer & PMC Member, Apache Stratos
>>>> Software Engineer, WSO2
>>>>
>>>
>>>
>>>
>>> --
>>> Lakmal Warusawithana
>>> Vice President, Apache Stratos
>>> Director - Cloud Architecture; WSO2 Inc.
>>> Mobile : +94714289692
>>> Blog : http://lakmalsview.blogspot.com/
>>>
>>>
>>
>>
>> --
>> Rajkumar Rajaratnam
>> Committer & PMC Member, Apache Stratos
>> Software Engineer, WSO2
>>
>
>
>
> --
> Reka Thirunavukkarasu
> Senior Software Engineer,
> WSO2, Inc.:http://wso2.com,
> Mobile: +94776442007
>
>
>


-- 
Rajkumar Rajaratnam
Committer & PMC Member, Apache Stratos
Software Engineer, WSO2
commit 0fc89761400cbc50ee7a285d9708ea1c03516706
Author: R-Rajkumar <rraju1...@gmail.com>
Date:   Fri Dec 5 18:56:30 2014 +0530

    topology changes to allow multiple IPs

diff --git 
a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/DefaultExtensionHandler.java
 
b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/DefaultExtensionHandler.java
index c7da75a..a069c5c 100644
--- 
a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/DefaultExtensionHandler.java
+++ 
b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/extensions/DefaultExtensionHandler.java
@@ -254,7 +254,7 @@ public class DefaultExtensionHandler implements 
ExtensionHandler {
         // check whether member activated event is received from the same 
cluster, lbcluster or service group
         if 
(ExtensionUtils.isRelevantMemberEvent(memberActivatedEvent.getServiceName(), 
memberActivatedEvent.getClusterId(), lbClusterId)) {
             Map<String, String> env = new HashMap<String, String>();
-            env.put("STRATOS_MEMBER_ACTIVATED_MEMBER_IP", 
memberActivatedEvent.getMemberIp());
+            env.put("STRATOS_MEMBER_ACTIVATED_MEMBER_IP", 
memberActivatedEvent.getDefaultPrivateIP());
             env.put("STRATOS_MEMBER_ACTIVATED_MEMBER_ID", 
memberActivatedEvent.getMemberId());
             env.put("STRATOS_MEMBER_ACTIVATED_CLUSTER_ID", 
memberActivatedEvent.getClusterId());
             env.put("STRATOS_MEMBER_ACTIVATED_LB_CLUSTER_ID", lbClusterId);
@@ -291,7 +291,7 @@ public class DefaultExtensionHandler implements 
ExtensionHandler {
                 }
                 boolean hasWKIpChanged = true;
                 for (Member m : this.wkMembers) {
-                    if 
(m.getMemberIp().equals(memberActivatedEvent.getMemberIp())) {
+                    if 
(m.getDefaultPrivateIP().equals(memberActivatedEvent.getDefaultPrivateIP())) {
                         hasWKIpChanged = false;
                     }
                 }
@@ -422,7 +422,7 @@ public class DefaultExtensionHandler implements 
ExtensionHandler {
 
             Collection<Member> members = cluster.getMembers();
             Map<String, String> env = new HashMap<String, String>();
-            env.put("STRATOS_MEMBER_TERMINATED_MEMBER_IP", 
terminatedMember.getMemberIp());
+            env.put("STRATOS_MEMBER_TERMINATED_MEMBER_IP", 
terminatedMember.getDefaultPrivateIP());
             env.put("STRATOS_MEMBER_TERMINATED_MEMBER_ID", 
memberTerminatedEvent.getMemberId());
             env.put("STRATOS_MEMBER_TERMINATED_CLUSTER_ID", 
memberTerminatedEvent.getClusterId());
             env.put("STRATOS_MEMBER_TERMINATED_LB_CLUSTER_ID", lbClusterId);
@@ -480,7 +480,7 @@ public class DefaultExtensionHandler implements 
ExtensionHandler {
                 memberSuspendedEvent.getClusterId(), lbClusterId)) {
             Collection<Member> members = cluster.getMembers();
             Map<String, String> env = new HashMap<String, String>();
-            env.put("STRATOS_MEMBER_SUSPENDED_MEMBER_IP", 
suspendedMember.getMemberIp());
+            env.put("STRATOS_MEMBER_SUSPENDED_MEMBER_IP", 
suspendedMember.getDefaultPrivateIP());
             env.put("STRATOS_MEMBER_SUSPENDED_MEMBER_ID", 
memberSuspendedEvent.getMemberId());
             env.put("STRATOS_MEMBER_SUSPENDED_CLUSTER_ID", 
memberSuspendedEvent.getClusterId());
             env.put("STRATOS_MEMBER_SUSPENDED_LB_CLUSTER_ID", lbClusterId);
@@ -536,7 +536,7 @@ public class DefaultExtensionHandler implements 
ExtensionHandler {
                 memberStartedEvent.getClusterId(), lbClusterId)) {
             Collection<Member> members = cluster.getMembers();
             Map<String, String> env = new HashMap<String, String>();
-            env.put("STRATOS_MEMBER_STARTED_MEMBER_IP", 
startedMember.getMemberIp());
+            env.put("STRATOS_MEMBER_STARTED_MEMBER_IP", 
startedMember.getDefaultPrivateIP());
             env.put("STRATOS_MEMBER_STARTED_MEMBER_ID", 
memberStartedEvent.getMemberId());
             env.put("STRATOS_MEMBER_STARTED_CLUSTER_ID", 
memberStartedEvent.getClusterId());
             env.put("STRATOS_MEMBER_STARTED_LB_CLUSTER_ID", lbClusterId);
@@ -594,9 +594,9 @@ public class DefaultExtensionHandler implements 
ExtensionHandler {
                     return false;
                 }
                 Member apistoreMember = apistoreMemberList.get(0);
-                envParameters.put("STRATOS_WK_APISTORE_MEMBER_IP", 
apistoreMember.getMemberIp());
+                envParameters.put("STRATOS_WK_APISTORE_MEMBER_IP", 
apistoreMember.getDefaultPrivateIP());
                 if (log.isDebugEnabled()) {
-                    log.debug("STRATOS_WK_APISTORE_MEMBER_IP: " + 
apistoreMember.getMemberIp());
+                    log.debug("STRATOS_WK_APISTORE_MEMBER_IP: " + 
apistoreMember.getDefaultPrivateIP());
                 }
 
                 List<Member> publisherMemberList = new ArrayList<Member>();
@@ -613,9 +613,9 @@ public class DefaultExtensionHandler implements 
ExtensionHandler {
                     return false;
                 }
                 Member publisherMember = publisherMemberList.get(0);
-                envParameters.put("STRATOS_WK_PUBLISHER_MEMBER_IP", 
publisherMember.getMemberIp());
+                envParameters.put("STRATOS_WK_PUBLISHER_MEMBER_IP", 
publisherMember.getDefaultPrivateIP());
                 if (log.isDebugEnabled()) {
-                    log.debug("STRATOS_WK_PUBLISHER_MEMBER_IP: " + 
publisherMember.getMemberIp());
+                    log.debug("STRATOS_WK_PUBLISHER_MEMBER_IP: " + 
publisherMember.getDefaultPrivateIP());
                 }
 
                 return true;
@@ -668,16 +668,16 @@ public class DefaultExtensionHandler implements 
ExtensionHandler {
                     wkMembers.add(member);
                     this.wkMembers.add(member);
                     if (log.isDebugEnabled()) {
-                        log.debug("Found WKA: STRATOS_WK_MEMBER_IP: " + 
member.getMemberIp());
+                        log.debug("Found WKA: STRATOS_WK_MEMBER_IP: " + 
member.getDefaultPrivateIP());
                     }
                 }
             }
             if (wkMembers.size() >= minCount) {
                 int idx = 0;
                 for (Member member : wkMembers) {
-                    envParameters.put("STRATOS_WK_MEMBER_" + idx + "_IP", 
member.getMemberIp());
+                    envParameters.put("STRATOS_WK_MEMBER_" + idx + "_IP", 
member.getDefaultPrivateIP());
                     if (log.isDebugEnabled()) {
-                        log.debug("STRATOS_WK_MEMBER_" + idx + "_IP: " + 
member.getMemberIp());
+                        log.debug("STRATOS_WK_MEMBER_" + idx + "_IP: " + 
member.getDefaultPrivateIP());
                     }
                     idx++;
                 }
@@ -757,9 +757,9 @@ public class DefaultExtensionHandler implements 
ExtensionHandler {
                 minManagerInstancesAvailable = true;
                 int idx = 0;
                 for (Member member : managerWkaMembers) {
-                    envParameters.put("STRATOS_WK_MANAGER_MEMBER_" + idx + 
"_IP", member.getMemberIp());
+                    envParameters.put("STRATOS_WK_MANAGER_MEMBER_" + idx + 
"_IP", member.getDefaultPrivateIP());
                     if (log.isDebugEnabled()) {
-                        log.debug("STRATOS_WK_MANAGER_MEMBER_" + idx + "_IP: " 
+ member.getMemberIp());
+                        log.debug("STRATOS_WK_MANAGER_MEMBER_" + idx + "_IP: " 
+ member.getDefaultPrivateIP());
                     }
                     idx++;
                 }
@@ -833,9 +833,9 @@ public class DefaultExtensionHandler implements 
ExtensionHandler {
                 minWorkerInstancesAvailable = true;
                 int idx = 0;
                 for (Member member : workerWkaMembers) {
-                    envParameters.put("STRATOS_WK_WORKER_MEMBER_" + idx + 
"_IP", member.getMemberIp());
+                    envParameters.put("STRATOS_WK_WORKER_MEMBER_" + idx + 
"_IP", member.getDefaultPrivateIP());
                     if (log.isDebugEnabled()) {
-                        log.debug("STRATOS_WK_WORKER_MEMBER_" + idx + "_IP: " 
+ member.getMemberIp());
+                        log.debug("STRATOS_WK_WORKER_MEMBER_" + idx + "_IP: " 
+ member.getDefaultPrivateIP());
                     }
                     idx++;
                 }
diff --git 
a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/ExtensionUtils.java
 
b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/ExtensionUtils.java
index 994c589..79ac604 100644
--- 
a/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/ExtensionUtils.java
+++ 
b/components/org.apache.stratos.cartridge.agent/src/main/java/org/apache/stratos/cartridge/agent/util/ExtensionUtils.java
@@ -127,7 +127,7 @@ public class ExtensionUtils {
                 Collection<Member> memberCollection = cluster.getMembers();
                 for (Member member : memberCollection) {
                     if (member.getClusterId().equals(lbClusterId)) {
-                        return new String[]{member.getMemberIp(), 
member.getMemberPublicIp()};
+                        return new String[]{member.getDefaultPrivateIP(), 
member.getDefaultPublicIP()};
                     }
                 }
             }
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
index a5ab367..b1138c4 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/MemberContext.java
@@ -22,6 +22,7 @@ import org.apache.stratos.common.Properties;
 import org.apache.stratos.common.Property;
 
 import java.io.Serializable;
+import java.util.Arrays;
 
 /**
  * Holds information about a Member.
@@ -42,12 +43,14 @@ public class MemberContext implements Serializable {
     private Partition partition;
     // cartridge type this member belongs to.
     private String cartridgeType;
-    // private ip
-    private String privateIpAddress;
-    // public ip
-    private String publicIpAddress;
-    // manually allocated ip
-    private String allocatedIpAddress;
+    // private ips
+    private String[] privateIPs;
+    private String defaultPrivateIP;
+    // public ips
+    private String[] publicIPs;
+    private String defaultPublicIP;
+    // manually allocated ips
+    private String[] allocatedIPs;
     // member initiated time
     private long initTime;
     // lb cluster id of this member
@@ -109,28 +112,29 @@ public class MemberContext implements Serializable {
         this.partition = partition;
     }
 
-    public String getPublicIpAddress() {
-        return publicIpAddress;
+    public String[] getPublicIPs() {
+       return publicIPs;
     }
 
-    public void setPublicIpAddress(String publicIpAddress) {
-        this.publicIpAddress = publicIpAddress;
-    }
 
-    public String getPrivateIpAddress() {
-        return privateIpAddress;
+    public void setPublicIPs(String[] publicIPs) {
+       this.publicIPs = publicIPs;
     }
 
-    public void setPrivateIpAddress(String privateIpAddress) {
-        this.privateIpAddress = privateIpAddress;
+    public String[] getPrivateIPs() {
+       return privateIPs;
     }
 
-    public String getAllocatedIpAddress() {
-        return allocatedIpAddress;
+    public void setPrivateIPs(String[] privateIPs) {
+       this.privateIPs = privateIPs;
     }
-
-    public void setAllocatedIpAddress(String allocatedIpAddress) {
-        this.allocatedIpAddress = allocatedIpAddress;
+    
+    public String[] getAllocatedIPs() {
+       return allocatedIPs;
+    }
+    
+    public void setAllocatedIPs(String[] allocatedIPs) {
+       this.allocatedIPs = allocatedIPs;
     }
 
     public long getInitTime() {
@@ -228,14 +232,31 @@ public class MemberContext implements Serializable {
     public void setProperties(Properties properties) {
         this.properties = properties;
     }
+    
+    public String getDefaultPrivateIP() {
+               return defaultPrivateIP;
+       }
 
-    @Override
+       public void setDefaultPrivateIP(String defaultPrivateIP) {
+               this.defaultPrivateIP = defaultPrivateIP;
+       }
+
+       public String getDefaultPublicIP() {
+               return defaultPublicIP;
+       }
+
+       public void setDefaultPublicIP(String defaultPublicIP) {
+               this.defaultPublicIP = defaultPublicIP;
+       }
+
+       @Override
     public String toString() {
         return "MemberContext [memberId=" + memberId + ", nodeId=" + nodeId + 
", instanceId="
                 + instanceId + ", clusterId=" + clusterId + ", partition=" + 
partition
-                + ", cartridgeType=" + cartridgeType + ", privateIpAddress=" + 
privateIpAddress
-                + ", publicIpAddress=" + publicIpAddress + ", 
allocatedIpAddress="
-                + allocatedIpAddress + ", initTime=" + initTime + ", 
lbClusterId=" + lbClusterId
+                + ", cartridgeType=" + cartridgeType + ", privateIpAddresses=" 
+ Arrays.toString(privateIPs)
+                + ", publicIpAddresses=" + Arrays.toString(publicIPs) + ", 
allocatedIpAddresses="
+                + Arrays.toString(allocatedIPs) + ", defaultPublicIP=" + 
defaultPublicIP + ", defaultPrivateIP=" + defaultPrivateIP 
+                + ", initTime=" + initTime + ", lbClusterId=" + lbClusterId
                 + ", networkPartitionId=" + networkPartitionId + ", 
properties=" + properties + "]";
     }
     
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/PodToMemberContext.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/PodToMemberContext.java
index c6e920d..d5a4077 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/PodToMemberContext.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/functions/PodToMemberContext.java
@@ -36,8 +36,10 @@ public class PodToMemberContext implements Function<Pod, 
MemberContext> {
         }
         MemberContext memberContext = new MemberContext();
         memberContext.setMemberId(pod.getId());
-        memberContext.setPrivateIpAddress(pod.getCurrentState().getHostIP());
-        memberContext.setPublicIpAddress(pod.getCurrentState().getHostIP());
+        memberContext.setPrivateIPs(new 
String[]{pod.getCurrentState().getHostIP()});
+        memberContext.setDefaultPrivateIP(pod.getCurrentState().getHostIP());
+        memberContext.setPublicIPs(new 
String[]{pod.getCurrentState().getHostIP()});
+        memberContext.setDefaultPublicIP(pod.getCurrentState().getHostIP());
         memberContext.setInitTime(System.currentTimeMillis());
         
         return memberContext;
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java
index 6519dfb..e32c56a 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java
@@ -265,7 +265,7 @@ public class AWSEC2Iaas extends Iaas {
        }
 
        @Override
-       public synchronized String associateAddress(NodeMetadata node) {
+       public synchronized List<String> associateAddresses(NodeMetadata node) {
 
                IaasProvider iaasInfo = getIaasProvider();
                
@@ -330,8 +330,11 @@ public class AWSEC2Iaas extends Iaas {
 
                log.debug("Successfully associated an IP address " + ip
                                + " for node with id: " + node.getId());
+               
+               List<String> associatedIPs = new ArrayList<String>();
+               associatedIPs.add(ip);
 
-               return ip;
+               return associatedIPs;
 
        }
        
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/CloudstackIaas.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/CloudstackIaas.java
index a67fe8d..2184d44 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/CloudstackIaas.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/CloudstackIaas.java
@@ -26,8 +26,10 @@ import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.domain.Location;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeoutException;
@@ -203,7 +205,7 @@ public class CloudstackIaas extends Iaas {
      * So  this method will find the IP that has been assigned to the vm and 
return it.
      */
     @Override
-    public String associateAddress(NodeMetadata node) {
+    public List<String> associateAddresses(NodeMetadata node) {
 
         IaasProvider iaasInfo = getIaasProvider();
         ComputeServiceContext context = 
iaasInfo.getComputeService().getContext();
@@ -237,7 +239,10 @@ public class CloudstackIaas extends Iaas {
             throw new CloudControllerException(msg);
         }
 
-        return ip;
+               List<String> associatedIPs = new ArrayList<String>();
+               associatedIPs.add(ip);
+
+               return associatedIPs;
     }
 
     @Override
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/DockerIaas.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/DockerIaas.java
index da2916b..6807622 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/DockerIaas.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/DockerIaas.java
@@ -34,6 +34,7 @@ import org.jclouds.compute.domain.Image;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.Template;
 
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -62,7 +63,7 @@ public class DockerIaas extends Iaas {
     }
 
     @Override
-    public String associateAddress(NodeMetadata node) {
+    public List<String> associateAddresses(NodeMetadata node) {
         log.warn("Not implemented: DockerIaas.associateAddress()");
         return null;
     }
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java
index ba186b2..e56c3e4 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java
@@ -217,10 +217,10 @@ public class GCEIaas extends Iaas {
        }
 
        @Override
-       public String associateAddress(NodeMetadata node) {
+       public List<String> associateAddresses(NodeMetadata node) {
 
                // TODO
-               return "";
+               return null;
 
        }
 
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
index 5faeca1..24b0ba9 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
@@ -18,6 +18,8 @@
  */
 package org.apache.stratos.cloud.controller.iaases;
 
+import java.util.List;
+
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.Template;
@@ -64,11 +66,11 @@ public abstract class Iaas {
     public abstract void setDynamicPayload();
     
     /**
-     * This will obtain an IP address from the allocated list and associate 
that IP with this node.
+     * This will obtain an IP addresses from the allocated list and associate 
that IP with this node.
      * @param node Node to be associated with an IP.
-     * @return associated public IP.
+     * @return list og associated public IPs.
      */
-    public abstract String associateAddress(NodeMetadata node);
+    public abstract List<String> associateAddresses(NodeMetadata node);
     
     /**
      * This will obtain a predefined IP address and associate that IP with 
this node, if ip is already in use allocate ip from pool 
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
index 2740397..e201c07 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
@@ -19,6 +19,7 @@
 package org.apache.stratos.cloud.controller.iaases;
 
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeoutException;
 
@@ -231,9 +232,9 @@ public class OpenstackNovaIaas extends Iaas {
        }
 
        @Override
-       public synchronized String associateAddress(NodeMetadata node) {
+       public synchronized List<String> associateAddresses(NodeMetadata node) {
                //TODO return the list of IP addresses once the topology 
changes is done
-               return 
openstackNetworkingApi.associateAddresses(node).iterator().next();
+               return openstackNetworkingApi.associateAddresses(node);
        }
        
        @Override
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java
index 6e10628..7ad6f7f 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java
@@ -37,6 +37,7 @@ import org.wso2.carbon.utils.CarbonUtils;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.List;
 
 public class VCloudIaas extends Iaas {
 
@@ -190,10 +191,10 @@ public class VCloudIaas extends Iaas {
        }
 
        @Override
-       public String associateAddress(NodeMetadata node) {
+       public List<String> associateAddresses(NodeMetadata node) {
 
                // TODO
-               return "";
+               return null;
 
        }
 
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/CartridgeInstanceDataPublisher.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/CartridgeInstanceDataPublisher.java
index 5f27a7a..dab4e17 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/CartridgeInstanceDataPublisher.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/publisher/CartridgeInstanceDataPublisher.java
@@ -37,6 +37,7 @@ import org.wso2.carbon.databridge.commons.StreamDefinition;
 import org.wso2.carbon.utils.CarbonUtils;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 
@@ -118,9 +119,9 @@ public class CartridgeInstanceDataPublisher {
             payload.add("");
         }
 
-        payload.add(handleNull(memberContext.getPrivateIpAddress()));
-        payload.add(handleNull(memberContext.getPublicIpAddress()));
-        payload.add(handleNull(memberContext.getAllocatedIpAddress()));
+        
payload.add(handleNull(Arrays.toString(memberContext.getPrivateIPs())));
+        payload.add(handleNull(Arrays.toString(memberContext.getPublicIPs())));
+        
payload.add(handleNull(Arrays.toString(memberContext.getAllocatedIPs())));
 
         Event event = new Event();
         event.setPayloadData(payload.toArray());
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
index f49cda2..b2c55ab 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
@@ -407,7 +407,7 @@ public class TopologyBuilder {
 
        public static void handleMemberSpawned(String serviceName,
                        String clusterId, String partitionId,
-                       String privateIp, String publicIp, MemberContext 
context) {
+                       List<String> privateIPs, String defaultPrivateIP, 
List<String> publicIPs, String defaultPublicIP, MemberContext context) {
                // adding the new member to the cluster after it is 
successfully started
                // in IaaS.
                Topology topology = TopologyManager.getTopology();
@@ -429,9 +429,11 @@ public class TopologyBuilder {
                                        networkPartitionId, partitionId, 
memberId, initTime);
                        member.setStatus(MemberStatus.Created);
             member.setInstanceId(context.getInstanceId());
-                       member.setMemberIp(privateIp);
+            member.setMemberPrivateIPs(privateIPs);
+            member.setDefaultPrivateIP(defaultPrivateIP);
                        member.setLbClusterId(lbClusterId);
-                       member.setMemberPublicIp(publicIp);
+                       member.setMemberPublicIPs(publicIPs);
+                       member.setDefaultPublicIP(defaultPublicIP);
                        
member.setProperties(CloudControllerUtil.toJavaUtilProperties(context.getProperties()));
             try {
 
@@ -479,7 +481,7 @@ public class TopologyBuilder {
                
                TopologyEventPublisher.sendInstanceSpawnedEvent(serviceName, 
clusterId,
                                networkPartitionId, partitionId, memberId, 
lbClusterId,
-                               publicIp, privateIp, context);
+                               publicIPs, defaultPublicIP, privateIPs, 
defaultPrivateIP, context);
        }
     
     public static void handleMemberStarted(InstanceStartedEvent 
instanceStartedEvent) {
@@ -587,8 +589,8 @@ public class TopologyBuilder {
                 memberActivatedEvent.addPort(port);
             }
 
-            memberActivatedEvent.setMemberIp(member.getMemberIp());
-            memberActivatedEvent.setMemberPublicIp(member.getMemberPublicIp());
+            
memberActivatedEvent.setMemberPrivateIPs(member.getMemberPrivateIPs());
+            
memberActivatedEvent.setMemberPublicIPs(member.getMemberPublicIPs());
             TopologyManager.updateTopology(topology);
 
         } finally {
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyEventPublisher.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyEventPublisher.java
index eea941c..4d469b3 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyEventPublisher.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyEventPublisher.java
@@ -139,16 +139,18 @@ public class TopologyEventPublisher {
 
     public static void sendInstanceSpawnedEvent(String serviceName,
                                                 String clusterId, String 
networkPartitionId, String partitionId,
-                                                String memberId, String 
lbClusterId, String publicIp,
-                                                String privateIp, 
MemberContext context) {
+                                                String memberId, String 
lbClusterId, List<String> publicIPs,
+                                                String defaultPublicIP, 
List<String> privateIPs, String defaultPrivateIP, MemberContext context) {
 
         long initTime = context.getInitTime();
         InstanceSpawnedEvent instanceSpawnedEvent = new InstanceSpawnedEvent(
                 serviceName, clusterId, networkPartitionId, partitionId,
                 memberId, initTime, context.getInstanceId());
         instanceSpawnedEvent.setLbClusterId(lbClusterId);
-        instanceSpawnedEvent.setMemberIp(privateIp);
-        instanceSpawnedEvent.setMemberPublicIp(publicIp);
+        instanceSpawnedEvent.setMemberPrivateIPs(privateIPs);
+        instanceSpawnedEvent.setDefaultPrivateIP(defaultPrivateIP);
+        instanceSpawnedEvent.setMemberPublicIPs(publicIPs);
+        instanceSpawnedEvent.setDefaultPublicIP(defaultPublicIP);
         instanceSpawnedEvent.setProperties(CloudControllerUtil
                 .toJavaUtilProperties(context.getProperties()));
         log.info(String.format("Publishing instance spawned event: [service] 
%s [cluster] %s " +
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
index 33567bd..6620f85 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
@@ -868,7 +868,7 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
                             
iaasProvider.getProperty(CloudControllerConstants.FLOATING_IP_PROPERTY);
 
                     // reset ip
-                    String ip = "";
+                    List<String> associatedIPs = new ArrayList<String>();
 
                     // default behavior is autoIpAssign=false
                     if (autoAssignIpProp == null ||
@@ -880,7 +880,7 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
                                 if (LOG.isDebugEnabled()) {
                                     
LOG.debug("CloudControllerServiceImpl:IpAllocator:pre_defined_ip: invoking 
associatePredefinedAddress" + pre_defined_ip);
                                 }
-                                ip = iaas.associatePredefinedAddress(node, 
pre_defined_ip);
+                                String ip = 
iaas.associatePredefinedAddress(node, pre_defined_ip);
 
                                 if (ip == null || "".equals(ip) || 
!pre_defined_ip.equals(ip)) {
                                     // throw exception and stop instance 
creation
@@ -893,6 +893,7 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
                                             node.getId(), memberContext);
                                     throw new CloudControllerException(msg);
                                 }
+                                associatedIPs.add(ip);
                             } else {
                                 String msg = "Invalid floating ip address 
configured: " + pre_defined_ip +
                                         " - terminating node:" + 
memberContext.toString();
@@ -908,58 +909,49 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
                                 
LOG.debug("CloudControllerServiceImpl:IpAllocator:no (valid) predefined 
floating ip configured, "
                                         + "selecting available one from pool");
                             }
-                            // allocate an IP address - manual IP assigning 
mode
-                            ip = iaas.associateAddress(node);
-
-                            if (ip != null) {
-                                memberContext.setAllocatedIpAddress(ip);
-                                if (LOG.isDebugEnabled()) {
-                                    LOG.debug("Allocated an ip address: "
-                                            + memberContext.toString());
-                                } else if (LOG.isInfoEnabled()) {
-                                    LOG.info("Allocated ip address [ " + 
memberContext.getAllocatedIpAddress() +
-                                            " ] to member with id: " + 
memberContext.getMemberId());
-                                }
+                            // allocate IP addresses - manual IP assigning 
mode from stratos point of view
+                            associatedIPs = iaas.associateAddresses(node);
+                            
+                            // checking for null and empty is enough. If there 
are elements in this list, they are valid IPs
+                            // because we are validating before putting into 
the list
+                            if (associatedIPs == null || 
associatedIPs.isEmpty()) {
+                               // throw exception and stop instance creation
+                               String msg = "Error occurred while allocating 
floating ip addresses. Terminating node : "  + memberContext.toString();
+                               LOG.error(msg);
+                               // terminate instance
+                               terminate(iaasProvider, node.getId(), 
memberContext);
+                               throw new CloudControllerException(msg);
                             }
-                        }
-
-                        if (ip == null) {
-                            String msg = "No IP address found. IP allocation 
failed for " + memberContext;
-                            LOG.error(msg);
-                            throw new CloudControllerException(msg);
-                        }
+                            
+                            
memberContext.setAllocatedIPs(associatedIPs.toArray(new 
String[associatedIPs.size()]));
+                            LOG.info("Allocated IP addresses : "+ 
memberContext.toString());
 
                         // build the node with the new ip
                         node = NodeMetadataBuilder.fromNodeMetadata(node)
-                                .publicAddresses(ImmutableSet.of(ip)).build();
+                                .publicAddresses(associatedIPs).build();
                     }
 
-
-                    // public ip
-                    if (node.getPublicAddresses() != null &&
-                            node.getPublicAddresses().iterator().hasNext()) {
-                        ip = node.getPublicAddresses().iterator().next();
-                        publicIp = ip;
-                        memberContext.setPublicIpAddress(ip);
-                        if (LOG.isDebugEnabled()) {
-                            LOG.debug("Retrieving Public IP Address : " + 
memberContext.toString());
-                        } else if (LOG.isInfoEnabled()) {
-                            LOG.info("Retrieving Public IP Address: " + 
memberContext.getPublicIpAddress() +
-                                    ", member id: " + 
memberContext.getMemberId());
-                        }
+                    // public IPs
+                    Set<String> publicIPAddresses = node.getPublicAddresses();
+                    if (publicIPAddresses != null && 
!publicIPAddresses.isEmpty()) {
+                       
memberContext.setPublicIPs(publicIPAddresses.toArray(new 
String[publicIPAddresses.size()]));
+                       //TODO set a flag in cartridge definition to specify 
the default public IP or the interface
+                       
memberContext.setDefaultPublicIP(publicIPAddresses.iterator().next());
+                       LOG.info("Retrieving Public IP Addresses : " + 
memberContext.toString());
+                    } else {
+                       memberContext.setPublicIPs(new String[0]);
                     }
 
-                    // private IP
-                    if (node.getPrivateAddresses() != null &&
-                            node.getPrivateAddresses().iterator().hasNext()) {
-                        ip = node.getPrivateAddresses().iterator().next();
-                        memberContext.setPrivateIpAddress(ip);
-                        if (LOG.isDebugEnabled()) {
-                            LOG.debug("Retrieving Private IP Address. " + 
memberContext.toString());
-                        } else if (LOG.isInfoEnabled()) {
-                            LOG.info("Retrieving Private IP Address: " + 
memberContext.getPrivateIpAddress() +
-                                    ", member id: " + 
memberContext.getMemberId());
-                        }
+                    // private IPs
+                    Set<String> privateIPAddresses = 
node.getPrivateAddresses();
+                    if (privateIPAddresses != null && 
!privateIPAddresses.isEmpty()) {
+                       
memberContext.setPrivateIPs(privateIPAddresses.toArray(new 
String[privateIPAddresses.size()]));
+                       //TODO set a flag in cartridge definition to specify 
the default private IP or the interface
+                       
memberContext.setDefaultPrivateIP(privateIPAddresses.iterator().next());
+                       LOG.info("Retrieving Private IP Addresses " + 
memberContext.toString());
+                    } else {
+                       memberContext.setPrivateIPs(new String[0]);
+                    }                     
                     }
 
                     
CloudControllerContext.getInstance().addMemberContext(memberContext);
@@ -967,10 +959,18 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
                     // persist in registry
                     persist();
 
-
+                    List<String> privateIPs = null;
+                    if (memberContext.getPrivateIPs() != null) {
+                       privateIPs = 
Arrays.asList(memberContext.getPrivateIPs());
+                    }
+                    List<String> publicIPs = null;
+                    if (memberContext.getPublicIPs() != null) {
+                       publicIPs = Arrays.asList(memberContext.getPublicIPs());
+                    }
                     // trigger topology
                     TopologyBuilder.handleMemberSpawned(cartridgeType, 
clusterId,
-                            partition.getId(), ip, publicIp, memberContext);
+                            partition.getId(), privateIPs, 
memberContext.getDefaultPrivateIP(), 
+                            publicIPs, memberContext.getDefaultPublicIP(), 
memberContext);
 
                     String memberID = memberContext.getMemberId();
 
@@ -1064,9 +1064,11 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
         // destroy the node
         iaasProvider.getComputeService().destroyNode(nodeId);
 
-        // release allocated IP address
-        if (ctxt.getAllocatedIpAddress() != null) {
-            iaas.releaseAddress(ctxt.getAllocatedIpAddress());
+        // releasing all allocated IPs
+        if (ctxt.getAllocatedIPs() != null) {
+               for (String allocatedIP : ctxt.getAllocatedIPs()) {
+                       iaas.releaseAddress(allocatedIP);
+               }
         }
 
         if (LOG.isDebugEnabled()) {
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/PodActivationWatcher.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/PodActivationWatcher.java
index d03f0d9..3488a8c 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/PodActivationWatcher.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/PodActivationWatcher.java
@@ -19,6 +19,9 @@
 package org.apache.stratos.cloud.controller.util;
 
 
+import java.util.ArrayList;
+import java.util.Arrays;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.context.CloudControllerContext;
@@ -53,14 +56,14 @@ public class PodActivationWatcher implements Runnable {
             if (LOG.isDebugEnabled()) {
                 LOG.debug("PodActivationWatcher running : 
"+pod.getCurrentState().getStatus());
             }
-            if ("Running".equals(pod.getCurrentState().getStatus()) && 
ctxt.getPublicIpAddress() == null) {
+            if ("Running".equals(pod.getCurrentState().getStatus()) && 
ctxt.getPublicIPs() == null) {
                 String hostIP = pod.getCurrentState().getHost();
-                ctxt.setPublicIpAddress(hostIP);
-                ctxt.setPrivateIpAddress(hostIP);
+                ctxt.setPublicIPs(new String[]{hostIP});
+                ctxt.setPrivateIPs(new String[]{hostIP});
                 cloudControllerContext.addMemberContext(ctxt);
                 // trigger topology
                 TopologyBuilder.handleMemberSpawned(ctxt.getCartridgeType(), 
ctxt.getClusterId(), 
-                        null, hostIP, hostIP, ctxt);
+                        null, Arrays.asList(ctxt.getPrivateIPs()), hostIP, 
Arrays.asList(ctxt.getPublicIPs()), hostIP, ctxt);
                 
                 cloudControllerContext.persist();
             }
diff --git 
a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
 
b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
index b62c3e1..c097722 100644
--- 
a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
+++ 
b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
@@ -477,7 +477,10 @@ public class LoadBalancerConfiguration {
                             String ip = 
memberNode.getProperty(Constants.CONF_PROPERTY_IP);
                             
validateRequiredPropertyInNode(Constants.CONF_PROPERTY_IP, ip, 
String.format("member %s", memberId));
 
-                            member.setMemberIp(ip);
+                            List<String> memberPrivateIPs = new 
ArrayList<String>();
+                            memberPrivateIPs.add(ip);
+                            member.setMemberPrivateIPs(memberPrivateIPs);
+                            member.setDefaultPrivateIP(ip);
                             Node portsNode = 
memberNode.findChildNodeByName(Constants.CONF_ELEMENT_PORTS);
                             validateRequiredNode(portsNode, 
Constants.CONF_ELEMENT_PORTS, String.format("member %s", memberId));
 
diff --git 
a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/endpoint/TenantAwareLoadBalanceEndpoint.java
 
b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/endpoint/TenantAwareLoadBalanceEndpoint.java
index 83002c9..ec25537 100644
--- 
a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/endpoint/TenantAwareLoadBalanceEndpoint.java
+++ 
b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/endpoint/TenantAwareLoadBalanceEndpoint.java
@@ -412,29 +412,29 @@ public class TenantAwareLoadBalanceEndpoint extends 
org.apache.synapse.endpoints
         if 
(LoadBalancerConfiguration.getInstance().isTopologyEventListenerEnabled()) {
             if 
(LoadBalancerConfiguration.getInstance().getTopologyMemberIpType() == 
MemberIpType.Public) {
                 // Return member's public IP address
-                if (StringUtils.isBlank(member.getMemberPublicIp())) {
+                if (StringUtils.isBlank(member.getDefaultPublicIP())) {
                     if (log.isErrorEnabled()) {
                         log.error(String.format("Member public IP address not 
found: [member] %s", member.getMemberId()));
                     }
                     throwSynapseException(synCtx, 500, "Internal server 
error");
                 }
                 if (log.isDebugEnabled()) {
-                    log.debug(String.format("Using member public IP address: 
[member] %s [ip] %s", member.getMemberId(), member.getMemberPublicIp()));
+                    log.debug(String.format("Using member public IP address: 
[member] %s [ip] %s", member.getMemberId(), member.getDefaultPublicIP()));
                 }
-                return member.getMemberPublicIp();
+                return member.getDefaultPublicIP();
             }
         }
         // Return member's private IP address
-        if (StringUtils.isBlank(member.getMemberIp())) {
+        if (StringUtils.isBlank(member.getDefaultPrivateIP())) {
             if (log.isErrorEnabled()) {
                 log.error(String.format("Member IP address not found: [member] 
%s", member.getMemberId()));
             }
             throwSynapseException(synCtx, 500, "Internal server error");
         }
         if (log.isDebugEnabled()) {
-            log.debug(String.format("Using member IP address: [member] %s [ip] 
%s", member.getMemberId(), member.getMemberIp()));
+            log.debug(String.format("Using member IP address: [member] %s [ip] 
%s", member.getMemberId(), member.getDefaultPrivateIP()));
         }
-        return member.getMemberIp();
+        return member.getDefaultPrivateIP();
     }
 
     /**
diff --git 
a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTopologyEventReceiver.java
 
b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTopologyEventReceiver.java
index 657d18e..843e53e 100644
--- 
a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTopologyEventReceiver.java
+++ 
b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/messaging/LoadBalancerTopologyEventReceiver.java
@@ -364,39 +364,39 @@ public class LoadBalancerTopologyEventReceiver {
             }
         }
 
-        if (StringUtils.isNotBlank(member.getMemberIp())) {
-            
LoadBalancerContext.getInstance().getMemberIpHostnameMap().put(member.getMemberIp(),
 hostname);
+        if (StringUtils.isNotBlank(member.getDefaultPrivateIP())) {
+            
LoadBalancerContext.getInstance().getMemberIpHostnameMap().put(member.getDefaultPrivateIP(),
 hostname);
             if (log.isDebugEnabled()) {
                 log.debug(String.format("Member private ip added to member-ip 
-> hostname map: [service] %s [cluster] " +
                                 "%s [member] %s [private-ip] %s", 
member.getServiceName(), member.getClusterId(),
-                        member.getMemberId(), member.getMemberIp()
+                        member.getMemberId(), member.getDefaultPrivateIP()
                 ));
             }
         }
-        if (StringUtils.isNotBlank(member.getMemberPublicIp())) {
-            
LoadBalancerContext.getInstance().getMemberIpHostnameMap().put(member.getMemberPublicIp(),
 hostname);
+        if (StringUtils.isNotBlank(member.getDefaultPublicIP())) {
+            
LoadBalancerContext.getInstance().getMemberIpHostnameMap().put(member.getDefaultPublicIP(),
 hostname);
             if (log.isDebugEnabled()) {
                 log.debug(String.format("Member public ip added to member-ip 
-> hostname map: [service] %s [cluster] " +
                                 "%s [member] %s [public-ip] %s", 
member.getServiceName(), member.getClusterId(),
-                        member.getMemberId(), member.getMemberPublicIp()
+                        member.getMemberId(), member.getDefaultPublicIP()
                 ));
             }
         }
     }
 
     private void removeMemberIpsFromMemberIpHostnameMap(Member member) {
-        if (StringUtils.isNotBlank(member.getMemberIp())) {
-            
LoadBalancerContext.getInstance().getMemberIpHostnameMap().remove(member.getMemberIp());
+        if (StringUtils.isNotBlank(member.getDefaultPrivateIP())) {
+            
LoadBalancerContext.getInstance().getMemberIpHostnameMap().remove(member.getDefaultPrivateIP());
             if (log.isDebugEnabled()) {
                 log.debug(String.format("Member private ip removed from 
member-ip -> hostname map: [private-ip] %s",
-                        member.getMemberIp()));
+                        member.getDefaultPrivateIP()));
             }
         }
-        if (StringUtils.isNotBlank(member.getMemberPublicIp())) {
-            
LoadBalancerContext.getInstance().getMemberIpHostnameMap().remove(member.getMemberPublicIp());
+        if (StringUtils.isNotBlank(member.getDefaultPublicIP())) {
+            
LoadBalancerContext.getInstance().getMemberIpHostnameMap().remove(member.getDefaultPublicIP());
             if (log.isDebugEnabled()) {
                 log.debug(String.format("Member public ip removed from 
member-ip -> hostname map: [public-ip] %s",
-                        member.getMemberPublicIp()));
+                        member.getDefaultPublicIP()));
             }
         }
     }
diff --git 
a/components/org.apache.stratos.load.balancer/src/test/java/org/apache/stratos/load/balancer/test/LoadBalancerConfigurationTest.java
 
b/components/org.apache.stratos.load.balancer/src/test/java/org/apache/stratos/load/balancer/test/LoadBalancerConfigurationTest.java
index a3c834d..0848a73 100755
--- 
a/components/org.apache.stratos.load.balancer/src/test/java/org/apache/stratos/load/balancer/test/LoadBalancerConfigurationTest.java
+++ 
b/components/org.apache.stratos.load.balancer/src/test/java/org/apache/stratos/load/balancer/test/LoadBalancerConfigurationTest.java
@@ -126,7 +126,7 @@ public class LoadBalancerConfigurationTest {
             String memberId = "m1";
             Member m1 = cluster1.getMember(memberId);
             Assert.assertNotNull(String.format("%s, member not found: [member] 
%s", validationError, memberId), m1);
-            Assert.assertEquals(String.format("%s, member ip not valid", 
validationError), "10.0.0.10", m1.getMemberIp());
+            Assert.assertEquals(String.format("%s, member ip not valid", 
validationError), "10.0.0.10", m1.getDefaultPrivateIP());
 
             int proxyPort = 80;
             Port m1Http = m1.getPort(proxyPort);
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
index 3269746..38aa8f7 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Member.java
@@ -45,9 +45,11 @@ public class Member implements Serializable, 
LifeCycleStateTransitionBehavior<Me
     // Key: Port.proxy
     @XmlJavaTypeAdapter(MapAdapter.class)
     private final Map<Integer, Port> portMap;
-    private String memberPublicIp;
+    private List<String> memberPublicIPs;
+    private String defaultPublicIP;
     //private MemberStatus status;
-    private String memberIp;
+    private List<String> memberPrivateIPs;
+    private String defaultPrivateIP;
     @XmlJavaTypeAdapter(MapAdapter.class)
     private Properties properties;
     private String lbClusterId;
@@ -143,12 +145,12 @@ public class Member implements Serializable, 
LifeCycleStateTransitionBehavior<Me
         this.properties = properties;
     }
 
-    public String getMemberIp() {
-        return memberIp;
+    public List<String> getMemberPrivateIPs() {
+        return memberPrivateIPs;
     }
 
-    public void setMemberIp(String memberIp) {
-        this.memberIp = memberIp;
+    public void setMemberPrivateIPs(List<String> memberPrivateIPs) {
+        this.memberPrivateIPs = memberPrivateIPs;
     }
 
     public String getPartitionId() {
@@ -167,19 +169,36 @@ public class Member implements Serializable, 
LifeCycleStateTransitionBehavior<Me
         return networkPartitionId;
     }
 
-    public String getMemberPublicIp() {
-        return memberPublicIp;
+    public List<String> getMemberPublicIPs() {
+        return memberPublicIPs;
     }
 
-    public void setMemberPublicIp(String memberPublicIp) {
-        this.memberPublicIp = memberPublicIp;
+    public void setMemberPublicIPs(List<String> memberPublicIPs) {
+        this.memberPublicIPs = memberPublicIPs;
     }
+    
+    public String getDefaultPublicIP() {
+               return defaultPublicIP;
+       }
 
-    @Override
+       public void setDefaultPublicIP(String defaultPublicIP) {
+               this.defaultPublicIP = defaultPublicIP;
+       }
+
+       public String getDefaultPrivateIP() {
+               return defaultPrivateIP;
+       }
+
+       public void setDefaultPrivateIP(String defaultPrivateIP) {
+               this.defaultPrivateIP = defaultPrivateIP;
+       }
+
+       @Override
     public String toString() {
         return "Member [serviceName=" + serviceName + ", clusterId=" + 
clusterId + ", networkPartitionId="
                 + networkPartitionId + ", partitionId=" + partitionId + ", 
memberId=" + memberId + ", initTime=" + initTime + ", portMap="
-                + portMap + ", memberPublicIp=" + memberPublicIp + ", status=" 
+ getStatus() + ", memberIp=" + memberIp
+                + portMap + ", memberPublicIPs=" + memberPublicIPs.toString() 
+ ", status=" + getStatus() 
+                + ", memberPrivateIPs=" + memberPrivateIPs.toString() + ", 
defaultPublicIP=" + defaultPublicIP + ", defaultPrivateIP=" + defaultPrivateIP
                 + ", properties=" + properties + ", lbClusterId=" + 
lbClusterId + "]";
     }
 
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/InstanceSpawnedEvent.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/InstanceSpawnedEvent.java
index e4b9b88..a4badc0 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/InstanceSpawnedEvent.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/InstanceSpawnedEvent.java
@@ -20,6 +20,7 @@ package org.apache.stratos.messaging.event.topology;
 
 
 import java.io.Serializable;
+import java.util.List;
 import java.util.Properties;
 
 
@@ -36,8 +37,10 @@ public class InstanceSpawnedEvent extends TopologyEvent 
implements Serializable
     private final String memberId;
     private final long initTime;
     private String lbClusterId;
-    private String memberPublicIp;
-    private String memberIp;
+    private List<String> memberPublicIPs;
+    private String defaultPublicIP;
+    private List<String> memberPrivateIPs;
+    private String defaultPrivateIP;
     private String instanceId;
     private Properties properties;
 
@@ -90,20 +93,20 @@ public class InstanceSpawnedEvent extends TopologyEvent 
implements Serializable
         this.lbClusterId = lbClusterId;
     }
 
-       public String getMemberPublicIp() {
-               return memberPublicIp;
+       public List<String> getMemberPublicIPs() {
+               return memberPublicIPs;
        }
 
-       public void setMemberPublicIp(String memberPublicIp) {
-               this.memberPublicIp = memberPublicIp;
+       public void setMemberPublicIPs(List<String> memberPublicIPs) {
+               this.memberPublicIPs = memberPublicIPs;
        }
 
-       public String getMemberIp() {
-               return memberIp;
+       public List<String> getMemberPrivateIPs() {
+               return memberPrivateIPs;
        }
 
-       public void setMemberIp(String memberIp) {
-               this.memberIp = memberIp;
+       public void setMemberPrivateIPs(List<String> memberPrivateIPs) {
+               this.memberPrivateIPs = memberPrivateIPs;
        }
 
     public Properties getProperties() {
@@ -113,4 +116,20 @@ public class InstanceSpawnedEvent extends TopologyEvent 
implements Serializable
     public void setProperties(Properties properties) {
         this.properties = properties;
     }
+
+       public String getDefaultPublicIP() {
+               return defaultPublicIP;
+       }
+
+       public void setDefaultPublicIP(String defaultPublicIP) {
+               this.defaultPublicIP = defaultPublicIP;
+       }
+
+       public String getDefaultPrivateIP() {
+               return defaultPrivateIP;
+       }
+
+       public void setDefaultPrivateIP(String defaultPrivateIP) {
+               this.defaultPrivateIP = defaultPrivateIP;
+       }
 }
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberActivatedEvent.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberActivatedEvent.java
index dd10c95..f66b5fc 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberActivatedEvent.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/MemberActivatedEvent.java
@@ -41,10 +41,12 @@ public class MemberActivatedEvent extends TopologyEvent 
implements Serializable
     private final String memberId;
     // Key: Port.proxy
     private Map<Integer, Port> portMap;
-    private String memberIp;
+    private List<String> memberPrivateIPs;
+    private String defaultPrivateIP;
     private String groupId;
     private String applicationId;
-    private String memberPublicIp;
+    private List<String> memberPublicIPs;
+    private String defaultPublicIP;
     private String instanceId;
 
     public MemberActivatedEvent(String serviceName, String clusterId, String 
networkPartitionId,
@@ -107,12 +109,12 @@ public class MemberActivatedEvent extends TopologyEvent 
implements Serializable
         return this.portMap.containsKey(port.getProxy());
     }
 
-    public String getMemberIp() {
-        return memberIp;
+    public List<String> getMemberPrivateIPs() {
+        return memberPrivateIPs;
     }
 
-    public void setMemberIp(String memberIp) {
-        this.memberIp = memberIp;
+    public void setMemberPrivateIPs(List<String> memberPrivateIPs) {
+        this.memberPrivateIPs = memberPrivateIPs;
     }
 
     public String getGroupId() {
@@ -131,15 +133,31 @@ public class MemberActivatedEvent extends TopologyEvent 
implements Serializable
         this.applicationId = applicationId;
     }
 
-    public String getMemberPublicIp() {
-        return memberPublicIp;
+    public List<String> getMemberPublicIPs() {
+        return memberPublicIPs;
     }
 
-    public void setMemberPublicIp(String memberPublicIp) {
-        this.memberPublicIp = memberPublicIp;
+    public void setMemberPublicIPs(List<String> memberPublicIp) {
+        this.memberPublicIPs = memberPublicIp;
     }
 
     public String getInstanceId() {
         return instanceId;
     }
+
+       public String getDefaultPrivateIP() {
+               return defaultPrivateIP;
+       }
+
+       public void setDefaultPrivateIP(String defaultPrivateIP) {
+               this.defaultPrivateIP = defaultPrivateIP;
+       }
+
+       public String getDefaultPublicIP() {
+               return defaultPublicIP;
+       }
+
+       public void setDefaultPublicIP(String defaultPublicIP) {
+               this.defaultPublicIP = defaultPublicIP;
+       }
 }
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
index 98b74f0..e6300d1 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
@@ -132,8 +132,10 @@ public class InstanceSpawnedMessageProcessor extends 
MessageProcessor {
             // Apply changes to the topology
             Member member = new Member(event.getServiceName(), 
event.getClusterId(), event.getNetworkPartitionId(), event.getPartitionId(), 
event.getMemberId(), event.getInitTime());
             //member.setStatus(MemberStatus.Created);
-            member.setMemberPublicIp(event.getMemberPublicIp());
-            member.setMemberIp(event.getMemberIp());
+            member.setMemberPublicIPs(event.getMemberPublicIPs());
+            member.setDefaultPublicIP(event.getDefaultPublicIP());
+            member.setMemberPrivateIPs(event.getMemberPrivateIPs());
+            member.setDefaultPrivateIP(event.getDefaultPrivateIP());
             member.setLbClusterId(event.getLbClusterId());
             member.setProperties(event.getProperties());
             cluster.addMember(member);
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
index 36ab6d0..3330a61 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
@@ -98,7 +98,7 @@ public class MemberActivatedMessageProcessor extends 
MessageProcessor {
         }
 
         // Validate event properties
-        if ((event.getMemberIp() == null) || event.getMemberIp().isEmpty()) {
+        if ((event.getMemberPrivateIPs() == null) || 
event.getMemberPrivateIPs().isEmpty()) {
             throw new RuntimeException(String.format("No ip address found in 
member activated event: [service] %s [cluster] %s [member] %s",
                     event.getServiceName(),
                     event.getClusterId(),
@@ -159,7 +159,8 @@ public class MemberActivatedMessageProcessor extends 
MessageProcessor {
 
             // Apply changes to the topology
             member.addPorts(event.getPorts());
-            member.setMemberIp(event.getMemberIp());
+            member.setMemberPrivateIPs(event.getMemberPrivateIPs());
+            member.setDefaultPrivateIP(event.getDefaultPrivateIP());
             if (!member.isStateTransitionValid(MemberStatus.Activated)) {
                 log.error("Invalid State Transition from " + 
member.getStatus() + " to " + MemberStatus.Activated);
             }
diff --git 
a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/topology/Member.java
 
b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/topology/Member.java
index 2de7c0e..415de41 100644
--- 
a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/topology/Member.java
+++ 
b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/topology/Member.java
@@ -31,16 +31,16 @@ public class Member {
     public String memberId;
 
     public String status;
-    public String memberIp;
+    public List<String> memberPrivateIPs;
     public String lbClusterId;
-    public String memberPublicIp;
+    public List<String> memberPublicIPs;
     public List<PropertyBean> property;
     
     @Override
     public String toString() {
         return "Member [serviceName=" + serviceName + ", clusterId=" + 
clusterId + ", networkPartitionId="
                 + networkPartitionId + ", partitionId=" + partitionId + ", 
memberId=" + memberId + ", status=" + status
-                + ", memberIp=" + memberIp + ", lbClusterId=" + lbClusterId + 
", memberPublicIp=" + memberPublicIp
+                + ", memberPrivateIPs=" + memberPrivateIPs.toString() + ", 
lbClusterId=" + lbClusterId + ", memberPublicIPs=" + memberPublicIPs.toString()
                 + ", property=" + property + "]";
     }
     
diff --git 
a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
 
b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
index 128a33e..d268cea 100644
--- 
a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
+++ 
b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
@@ -493,15 +493,15 @@ public class PojoConverter {
             member.networkPartitionId = tmp.getNetworkPartitionId();
             member.partitionId = tmp.getPartitionId();
             member.memberId = tmp.getMemberId();
-            if (tmp.getMemberIp() == null) {
-                member.memberIp = "NULL";
+            if (tmp.getMemberPrivateIPs() == null) {
+                member.memberPrivateIPs = null;
             } else {
-                member.memberIp = tmp.getMemberIp();
+                member.memberPrivateIPs = tmp.getMemberPrivateIPs();
             }
-            if (tmp.getMemberPublicIp() == null) {
-                member.memberPublicIp = "NULL";
+            if (tmp.getMemberPublicIPs() == null) {
+                member.memberPublicIPs = null;
             } else {
-                member.memberPublicIp = tmp.getMemberPublicIp();
+                member.memberPublicIPs = tmp.getMemberPublicIPs();
             }
             member.serviceName = tmp.getServiceName();
             member.status = tmp.getStatus().toString();
diff --git 
a/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyConfigWriter.java
 
b/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyConfigWriter.java
index f7349d9..45feb6a 100644
--- 
a/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyConfigWriter.java
+++ 
b/extensions/load-balancer/haproxy-extension/src/main/java/org/apache/stratos/haproxy/extension/HAProxyConfigWriter.java
@@ -179,7 +179,7 @@ public class HAProxyConfigWriter {
                     for (Member member : cluster.getMembers()) {
                         if 
(member.getNetworkPartitionId().equals(HAProxyContext.getInstance().getNetworkPartitionId()))
 {
                             backEndHttp.append("\tserver 
").append(member.getMemberId()).append(" ")
-                                    
.append(member.getMemberIp()).append(":").append(port.getValue()).append(NEW_LINE);
+                                    
.append(member.getDefaultPrivateIP()).append(":").append(port.getValue()).append(NEW_LINE);
                         }
                     }
                     backEndHttp.append(NEW_LINE);
@@ -202,7 +202,7 @@ public class HAProxyConfigWriter {
                     for (Member member : cluster.getMembers()) {
                         if 
(member.getNetworkPartitionId().equals(HAProxyContext.getInstance().getNetworkPartitionId()))
 {
                             backEndHttps.append("\tserver 
").append(member.getMemberId()).append(" ")
-                                    
.append(member.getMemberIp()).append(":").append(port.getValue()).append(NEW_LINE);
+                                    
.append(member.getDefaultPrivateIP()).append(":").append(port.getValue()).append(NEW_LINE);
                         }
                     }
                     backEndHttps.append(NEW_LINE);

Reply via email to