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);