Adding load balancer ips to topology cluster object and fixing access URLs

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

Branch: refs/heads/stratos-4.1.x
Commit: bd15da63066dcef6da372ad41f2564c2a0a5a99e
Parents: 3481034
Author: Imesh Gunaratne <[email protected]>
Authored: Tue Oct 13 15:40:19 2015 +0530
Committer: Imesh Gunaratne <[email protected]>
Committed: Tue Oct 13 15:40:49 2015 +0530

----------------------------------------------------------------------
 .../applications/topic/ApplicationBuilder.java  |  27 +
 .../autoscaler/util/AutoscalerConstants.java    |   1 +
 .../messaging/topology/TopologyBuilder.java     |  78 +-
 .../impl/CloudControllerServiceImpl.java        | 107 ++-
 .../util/CloudControllerConstants.java          |   2 +
 .../beans/topology/ClusterInstanceBean.java     |   9 +
 .../theme0/js/custom/applications_topology.js   |  21 +-
 .../messaging/domain/topology/Cluster.java      |  19 +-
 .../topology/ClusterInstanceActivatedEvent.java |  10 +
 .../ClusterInstanceActivatedProcessor.java      |   3 +-
 .../util/converter/ObjectConverter.java         |   4 +-
 .../src/main/resources/AutoscalerService.wsdl   | 586 ++++++------
 .../main/resources/CloudControllerService.wsdl  | 916 +++++++++----------
 13 files changed, 958 insertions(+), 825 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/bd15da63/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
index 1c99a1c..f8bb29b 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
@@ -27,10 +27,16 @@ import 
org.apache.stratos.autoscaler.client.AutoscalerCloudControllerClient;
 import org.apache.stratos.autoscaler.context.AutoscalerContext;
 import 
org.apache.stratos.autoscaler.context.partition.network.NetworkPartitionContext;
 import 
org.apache.stratos.autoscaler.event.publisher.ClusterStatusEventPublisher;
+import org.apache.stratos.autoscaler.exception.AutoScalerException;
 import org.apache.stratos.autoscaler.monitor.Monitor;
 import org.apache.stratos.autoscaler.monitor.component.ApplicationMonitor;
 import org.apache.stratos.autoscaler.monitor.component.GroupMonitor;
+import org.apache.stratos.autoscaler.pojo.policy.PolicyManager;
+import org.apache.stratos.autoscaler.pojo.policy.deployment.DeploymentPolicy;
 import org.apache.stratos.autoscaler.registry.RegistryManager;
+import org.apache.stratos.autoscaler.util.AutoscalerConstants;
+import org.apache.stratos.common.Property;
+import org.apache.stratos.common.partition.NetworkPartitionRef;
 import org.apache.stratos.messaging.domain.application.*;
 import org.apache.stratos.messaging.domain.instance.ApplicationInstance;
 import org.apache.stratos.messaging.domain.instance.ClusterInstance;
@@ -75,6 +81,27 @@ public class ApplicationBuilder {
                     application.getUniqueIdentifier());
         }
         ApplicationHolder.persistApplication(application);
+        // Add network partition ids to application cluster contexts to be 
used by cloud controller
+        for(ApplicationClusterContext appClusterContext : appClusterContexts) {
+            DeploymentPolicy deploymentPolicy = PolicyManager.getInstance().
+                    
getDeploymentPolicy(appClusterContext.getDeploymentPolicyName());
+            if(deploymentPolicy == null) {
+                throw new AutoScalerException(String.format("Deployment policy 
not found: [application] %s " +
+                        "[deployment-policy] %s", 
application.getUniqueIdentifier(),
+                        appClusterContext.getDeploymentPolicyName()));
+            }
+            StringBuilder stringBuilder = new StringBuilder();
+            for(NetworkPartitionRef networkPartitionRef : 
deploymentPolicy.getNetworkPartitionRefs()) {
+                if(stringBuilder.length() > 0) {
+                    stringBuilder.append(",");
+                }
+                stringBuilder.append(networkPartitionRef.getId());
+            }
+            Property npIdListProperty = new 
Property(AutoscalerConstants.NETWORK_PARTITION_ID_LIST,
+                    stringBuilder.toString());
+            appClusterContext.getProperties().addProperty(npIdListProperty);
+        }
+
         
AutoscalerCloudControllerClient.getInstance().createApplicationClusters(application.getUniqueIdentifier(),
                 appClusterContexts);
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/bd15da63/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerConstants.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerConstants.java
 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerConstants.java
index caea65a..997ab0c 100644
--- 
a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerConstants.java
+++ 
b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerConstants.java
@@ -137,4 +137,5 @@ public final class AutoscalerConstants {
     public static final String ACTIVE_INSTANCE_COUNT = "active_instance_count";
     public static final String ADDITIONAL_INSTANCE_COUNT = 
"additional_instance_count";
     public static final String SCALING_REASON = "scaling_reason";
+    public static final String NETWORK_PARTITION_ID_LIST = 
"NETWORK_PARTITION_ID_LIST";
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/bd15da63/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/messaging/topology/TopologyBuilder.java
----------------------------------------------------------------------
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 d33264d..21378c2 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
@@ -39,15 +39,12 @@ import 
org.apache.stratos.kubernetes.client.KubernetesConstants;
 import org.apache.stratos.messaging.domain.application.ClusterDataHolder;
 import org.apache.stratos.messaging.domain.instance.ClusterInstance;
 import org.apache.stratos.messaging.domain.topology.*;
-import 
org.apache.stratos.messaging.event.application.ApplicationInstanceTerminatedEvent;
 import org.apache.stratos.messaging.event.cluster.status.*;
 import 
org.apache.stratos.messaging.event.instance.status.InstanceActivatedEvent;
 import 
org.apache.stratos.messaging.event.instance.status.InstanceMaintenanceModeEvent;
 import 
org.apache.stratos.messaging.event.instance.status.InstanceReadyToShutdownEvent;
 import org.apache.stratos.messaging.event.instance.status.InstanceStartedEvent;
 import org.apache.stratos.messaging.event.topology.*;
-import 
org.apache.stratos.metadata.client.defaults.DefaultMetaDataServiceClient;
-import org.apache.stratos.metadata.client.defaults.MetaDataServiceClient;
 import org.wso2.carbon.registry.core.exceptions.RegistryException;
 
 import java.net.URI;
@@ -850,6 +847,7 @@ public class TopologyBuilder {
                     clusterStatusClusterActivatedEvent.getServiceName()));
         }
 
+        String applicationId = cluster.getAppId();
         String clusterId = cluster.getClusterId();
         ClusterContext clusterContext = 
CloudControllerContext.getInstance().getClusterContext(clusterId);
         if (clusterContext == null) {
@@ -861,44 +859,64 @@ public class TopologyBuilder {
                 clusterStatusClusterActivatedEvent.getClusterId(), 
clusterStatusClusterActivatedEvent.getInstanceId());
         try {
             TopologyManager.acquireWriteLock();
+
             Collection<KubernetesService> kubernetesServices = clusterContext
                     
.getKubernetesServices(clusterStatusClusterActivatedEvent.getInstanceId());
 
             if (kubernetesServices != null) {
-
                 try {
                     // Generate access URLs for kubernetes services
+                    List<String> nodePublicIps = new ArrayList<>();
                     for (KubernetesService kubernetesService : 
kubernetesServices) {
+                        // Add node ips as load balancer ips
+                        
nodePublicIps.addAll(Arrays.asList(kubernetesService.getPublicIPs()));
 
+                        // Only expose services of type node port
                         if 
(kubernetesService.getServiceType().equals(KubernetesConstants.NODE_PORT)) {
-                            // Public IP = Kubernetes minion public IP
-                            String[] publicIPs = 
kubernetesService.getPublicIPs();
-                            if ((publicIPs != null) && (publicIPs.length > 0)) 
{
-                                for (String publicIP : publicIPs) {
-                                    // There can be a String array with null 
values
-                                    if (publicIP != null) {
-                                        // Using type URI since only http, 
https, ftp, file, jar protocols are
-                                        // supported in URL
-                                        URI accessURL = new 
URI(kubernetesService.getProtocol(), null, publicIP,
-                                                kubernetesService.getPort(), 
null, null, null);
-                                        
cluster.addAccessUrl(clusterStatusClusterActivatedEvent.getInstanceId(),
-                                                accessURL.toString());
-                                        
clusterInstanceActivatedEvent.addAccessUrl(accessURL.toString());
-                                    } else {
-                                        log.error(String.format(
-                                                "Could not create access URL 
for [Kubernetes-service] %s , "
-                                                        + "since Public IP is 
not available",
-                                                kubernetesService.getId()));
-                                    }
+                            for (String hostname : cluster.getHostNames()) {
+                                // Using type URI since only http, https, ftp, 
file, jar protocols are
+                                // supported in URL
+                                int port = kubernetesService.getPort();
+                                if(cluster.getLoadBalancerIps().size() > 0) {
+                                    // Load balancer ips have been provided, 
need to use proxy port
+                                    port = findProxyPort(applicationId, 
clusterId, kubernetesService.getPortName());
                                 }
+                                URI accessURL = new 
URI(kubernetesService.getProtocol(), null, hostname,
+                                        port, null, null, null);
+                                
cluster.addAccessUrl(clusterStatusClusterActivatedEvent.getInstanceId(),
+                                        accessURL.toString());
+                                
clusterInstanceActivatedEvent.addAccessUrl(accessURL.toString());
                             }
                         }
                     }
+                    if(cluster.getLoadBalancerIps().size() == 0) {
+                        // Load balancer ips not given, use node public ips as 
load balancer ips
+                        
clusterInstanceActivatedEvent.setLoadBalancerIps(nodePublicIps);
+                    }
+                } catch (URISyntaxException e) {
+                    log.error("Could not create generate URLs for Kubernetes 
services", e);
+                }
+            } else {
+                try {
+                    List<ClusterPortMapping> portMappings = 
CloudControllerContext.getInstance().
+                            getClusterPortMappings(applicationId, clusterId);
+                    for (ClusterPortMapping portMapping : portMappings) {
+                        for (String hostname : cluster.getHostNames()) {
+                            URI accessURL = new URI(portMapping.getProtocol(), 
null, hostname,
+                                    portMapping.getPort(), null, null, null);
+                            
cluster.addAccessUrl(clusterStatusClusterActivatedEvent.getInstanceId(),
+                                    accessURL.toString());
+                            
clusterInstanceActivatedEvent.addAccessUrl(accessURL.toString());
+                        }
+                    }
                 } catch (URISyntaxException e) {
-                    log.error("Could not create access URLs for Kubernetes 
services", e);
+                    log.error("Could not generate access URLs", e);
                 }
             }
 
+            log.info(String.format("Access URLs generated: [application] %s 
[cluster] %s [access-urls] %s",
+                    applicationId, clusterId, 
clusterInstanceActivatedEvent.getAccessUrls()));
+
             ClusterInstance context = 
cluster.getInstanceContexts(clusterStatusClusterActivatedEvent.getInstanceId());
 
             if (context == null) {
@@ -925,6 +943,18 @@ public class TopologyBuilder {
 
     }
 
+    private static int findProxyPort(String applicationId, String clusterId, 
String portName) {
+        List<ClusterPortMapping> portMappings = 
CloudControllerContext.getInstance().
+                getClusterPortMappings(applicationId, clusterId);
+        for(ClusterPortMapping portMapping : portMappings) {
+            if(portMapping.getName().equals(portName)) {
+                return portMapping.getProxyPort();
+            }
+        }
+        throw new RuntimeException(String.format("Port mapping not found: 
[application] %s [cluster] %s " +
+                        "[port-name] %s", applicationId, clusterId, portName));
+    }
+
     public static void 
handleClusterInactivateEvent(ClusterStatusClusterInactivateEvent 
clusterInactivateEvent)
             throws RegistryException {
         Topology topology = TopologyManager.getTopology();

http://git-wip-us.apache.org/repos/asf/stratos/blob/bd15da63/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
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 86e5f45..d9449b2 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
@@ -33,6 +33,7 @@ import org.apache.stratos.cloud.controller.iaases.Iaas;
 import org.apache.stratos.cloud.controller.messaging.topology.TopologyBuilder;
 import org.apache.stratos.cloud.controller.messaging.topology.TopologyManager;
 import org.apache.stratos.cloud.controller.services.CloudControllerService;
+import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.apache.stratos.common.Property;
 import org.apache.stratos.common.domain.LoadBalancingIPType;
@@ -40,8 +41,6 @@ import org.apache.stratos.common.threading.StratosThreadPool;
 import org.apache.stratos.messaging.domain.topology.*;
 import org.wso2.carbon.registry.core.exceptions.RegistryException;
 
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.*;
 import java.util.Map.Entry;
 import java.util.concurrent.Callable;
@@ -1072,48 +1071,9 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
         Lock lock = null;
         try {
             lock = 
CloudControllerContext.getInstance().acquireClusterContextWriteLock();
+            // Create a cluster context & cluster object for each cluster in 
the application
 
-            // Create a Cluster Context obj. for each of the Clusters in the 
Application
             List<Cluster> clusters = new ArrayList<>();
-            Map<String, List<String>> accessUrls = new HashMap<>();
-
-            for (ApplicationClusterContext appClusterCtxt : 
appClustersContexts) {
-                String clusterId = appClusterCtxt.getClusterId();
-                if (appClusterCtxt.isLbCluster()) {
-                    String[] dependencyClusterIDs = 
appClusterCtxt.getDependencyClusterIds();
-                    if (dependencyClusterIDs != null) {
-                        for (String dependencyClusterID : 
dependencyClusterIDs) {
-
-                            List<String> accessUrlPerCluster = new 
ArrayList<>();
-                            Collection<ClusterPortMapping> clusterPortMappings 
= CloudControllerContext.getInstance()
-                                    .getClusterPortMappings(appId, clusterId);
-
-                            for (ClusterPortMapping clusterPortMapping : 
clusterPortMappings) {
-                                try {
-                                    if (clusterPortMapping.isKubernetes()) {
-                                        // Using type URI since only http, 
https, ftp, file, jar protocols are
-                                        // supported in URL
-                                        URI accessUrl = new 
URI(clusterPortMapping.getProtocol(), null,
-                                                appClusterCtxt.getHostName(),
-                                                
clusterPortMapping.getKubernetesServicePort(), null, null, null);
-                                        
accessUrlPerCluster.add(accessUrl.toString());
-                                    } else {
-                                        URI accessUrl = new 
URI(clusterPortMapping.getProtocol(), null,
-                                                appClusterCtxt.getHostName(), 
clusterPortMapping.getProxyPort(), null,
-                                                null, null);
-                                        
accessUrlPerCluster.add(accessUrl.toString());
-                                    }
-                                } catch (URISyntaxException e) {
-                                    String message = "Could not generate 
access URL";
-                                    log.error(message, e);
-                                }
-                            }
-                            accessUrls.put(dependencyClusterID, 
accessUrlPerCluster);
-                        }
-                    }
-                }
-            }
-
             for (ApplicationClusterContext appClusterCtxt : 
appClustersContexts) {
                 ClusterContext clusterContext = new ClusterContext(appId, 
appClusterCtxt.getCartridgeType(),
                         appClusterCtxt.getClusterId(), 
appClusterCtxt.getTextPayload(), appClusterCtxt.getHostName(),
@@ -1126,18 +1086,18 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
                 
CloudControllerContext.getInstance().addClusterContext(clusterContext);
 
                 // Create cluster object
+                List<String> loadBalancerIps = findLoadBalancerIPList(appId, 
appClusterCtxt);
                 Cluster cluster = new 
Cluster(appClusterCtxt.getCartridgeType(), appClusterCtxt.getClusterId(),
                         appClusterCtxt.getDeploymentPolicyName(), 
appClusterCtxt.getAutoscalePolicyName(), appId);
                 cluster.setLbCluster(false);
                 cluster.setTenantRange(appClusterCtxt.getTenantRange());
                 
cluster.setHostNames(Collections.singletonList(appClusterCtxt.getHostName()));
-                cluster.setAccessUrls(accessUrls);
+                cluster.setLoadBalancerIps(loadBalancerIps);
 
                 if (appClusterCtxt.getProperties() != null) {
                     Properties properties = 
CloudControllerUtil.toJavaUtilProperties(appClusterCtxt.getProperties());
                     cluster.setProperties(properties);
                 }
-
                 clusters.add(cluster);
             }
             TopologyBuilder.handleApplicationClustersCreated(appId, clusters);
@@ -1152,6 +1112,65 @@ public class CloudControllerServiceImpl implements 
CloudControllerService {
         return true;
     }
 
+    private List<String> findLoadBalancerIPList(String applicationId, 
ApplicationClusterContext applicationClusterContext) {
+
+        Cartridge cartridge = CloudControllerContext.getInstance().
+                getCartridge(applicationClusterContext.getCartridgeType());
+        if (cartridge == null) {
+            throw new CloudControllerException("Cartridge not found: " + 
applicationClusterContext.getCartridgeType());
+        }
+
+        String clusterId = applicationClusterContext.getClusterId();
+        Property ipListProperty = applicationClusterContext.getProperties().
+                getProperty(CloudControllerConstants.LOAD_BALANCER_IPS);
+        if (ipListProperty != null) {
+            log.info(String.format("Load balancer IP list found in 
application: [application] %s [cluster] %s " +
+                            "[load-balancer-ip-list] %s", applicationId, 
clusterId,
+                    ipListProperty.getValue()));
+            return transformToList(ipListProperty);
+        }
+
+        Property npListProperty = applicationClusterContext.getProperties().
+                
getProperty(CloudControllerConstants.NETWORK_PARTITION_ID_LIST);
+        if(npListProperty != null) {
+            String npIdListStr = npListProperty.getValue();
+            if(StringUtils.isNotEmpty(npIdListStr)) {
+                List<String> loadBalancerIps = new ArrayList<>();
+                String[] npIdArray = npIdListStr.split(",");
+                for(String networkPartitionId : npIdArray) {
+                    NetworkPartition networkPartition = 
CloudControllerContext.getInstance().
+                            getNetworkPartition(networkPartitionId);
+                    if(networkPartition == null) {
+                        throw new 
CloudControllerException(String.format("Network partition not found: 
[application] %s " +
+                                "[network-partition] %s", applicationId, 
networkPartitionId));
+                    }
+                    ipListProperty = networkPartition.getProperties().
+                            
getProperty(CloudControllerConstants.LOAD_BALANCER_IPS);
+                    if (ipListProperty != null) {
+                        log.debug(String.format("Load balancer IP list found 
in network partition: " +
+                                        "[application] %s [cluster] %s 
[load-balancer-ip-list] %s", applicationId,
+                                clusterId, ipListProperty.getValue()));
+                        String[] ipArray = 
ipListProperty.getValue().split(",");
+                        for(String ip : ipArray) {
+                            loadBalancerIps.add(ip);
+                        }
+                    }
+                }
+                return loadBalancerIps;
+            }
+        }
+        return null;
+    }
+
+    private List<String> transformToList(Property listProperty) {
+        List<String> stringList = new ArrayList<>();
+        String[] array = listProperty.getValue().split(",");
+        for(String item : array) {
+            stringList.add(item);
+        }
+        return stringList;
+    }
+
     public boolean createClusterInstance(String serviceType, String clusterId, 
String alias, String instanceId,
             String partitionId, String networkPartitionId) throws 
ClusterInstanceCreationException {
         Lock lock = null;

http://git-wip-us.apache.org/repos/asf/stratos/blob/bd15da63/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
index 4d5c59f..d8d7004 100644
--- 
a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
+++ 
b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/util/CloudControllerConstants.java
@@ -342,4 +342,6 @@ public final class CloudControllerConstants {
     public static final String LOADBALANCING_IP_TYPE_PUBLIC = "public";
 
     public static final String PORT_NAME_LABEL = "portName";
+    public static final String LOAD_BALANCER_IPS = "LOAD_BALANCER_IPS";
+    public static final String NETWORK_PARTITION_ID_LIST = 
"NETWORK_PARTITION_ID_LIST";
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/bd15da63/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/topology/ClusterInstanceBean.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/topology/ClusterInstanceBean.java
 
b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/topology/ClusterInstanceBean.java
index ec21b4d..b10ca87 100644
--- 
a/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/topology/ClusterInstanceBean.java
+++ 
b/components/org.apache.stratos.common/src/main/java/org/apache/stratos/common/beans/topology/ClusterInstanceBean.java
@@ -38,6 +38,7 @@ public class ClusterInstanceBean implements Serializable {
     private List<String> hostNames;
     private List<String> accessUrls;
     private List<KubernetesServiceBean> kubernetesServices;
+    private List<String> loadBalancerIps;
 
     public String getStatus() {
         return status;
@@ -133,4 +134,12 @@ public class ClusterInstanceBean implements Serializable {
     public List<KubernetesServiceBean> getKubernetesServices() {
         return kubernetesServices;
     }
+
+    public List<String> getLoadBalancerIps() {
+        return loadBalancerIps;
+    }
+
+    public void setLoadBalancerIps(List<String> loadBalancerIps) {
+        this.loadBalancerIps = loadBalancerIps;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/bd15da63/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_topology.js
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_topology.js
 
b/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_topology.js
index afd7f92..2612ae6 100644
--- 
a/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_topology.js
+++ 
b/components/org.apache.stratos.manager.console/console/themes/theme0/js/custom/applications_topology.js
@@ -61,11 +61,16 @@ function genTree(data) {
                 } else {
                     accessUrls = '';
                 }
+                if(items[prop].loadBalancerIps) {
+                    loadBalancerIps = items[prop].loadBalancerIps;
+                } else {
+                    loadBalancerIps = '';
+                }
                 var type = 'clusters';
                 rawout.push({
                     "name": cur_name, "parent": parent, "type": type, 
"status": status,
                     "alias": alias, "hostNames": hostNames, "serviceName": 
serviceName,
-                    "accessUrls": accessUrls
+                    "accessUrls": accessUrls, "loadBalancerIps": 
loadBalancerIps,
                 });
                 clustermembers(items[prop].member, collector, cur_name)
             }
@@ -212,10 +217,24 @@ function update(source) {
                 } else {
                     var accessURLHTML = '';
                 }
+                if(d.loadBalancerIps != '') {
+                    var loadBalancerIpsHTML = "<strong>Load Balancer IPs: 
</strong>";
+                    for (var i = 0; i < d.loadBalancerIps.length; i++) {
+                        if(i > 0) {
+                            loadBalancerIpsHTML += ", ";
+                        }
+                        loadBalancerIpsHTML += loadBalancerIps[i] + "";
+                    }
+                    loadBalancerIpsHTML += "<br/>"
+                } else {
+                    var loadBalancerIpsHTML = '';
+                }
+
                 div_html = "<strong>Cluster Id: </strong>" + d.name + "<br/>" +
                     "<strong>Cluster Alias: </strong>" + d.alias + "<br/>" +
                     accessURLHTML +
                     "<strong>HostNames: </strong>" + d.hostNames + "<br/>" +
+                    loadBalancerIpsHTML +
                     "<strong>Service Name: </strong>" + d.serviceName + 
"<br/>" +
                     "<strong>Status: </strong>" + d.status + "<br/>";
                 if (dasStatsPublisherEnabled) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/bd15da63/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
index 0fde36e..4668d97 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/Cluster.java
@@ -63,6 +63,7 @@ public class Cluster implements Serializable {
     //private LifeCycleStateManager<ClusterStatus> clusterStateManager;
     private Map<String,List<String>> accessUrls;
     private List<KubernetesService> kubernetesServices;
+    private List<String> loadBalancerIps;
 
     public Cluster(Cluster cluster) {
         this.serviceName = cluster.getServiceName();
@@ -81,6 +82,7 @@ public class Cluster implements Serializable {
         this.setKubernetesCluster(cluster.isKubernetesCluster());
         this.accessUrls = cluster.getAccessUrls();
         this.kubernetesServices = cluster.getKubernetesServices();
+        this.loadBalancerIps = cluster.getLoadBalancerIps();
     }
 
     public Cluster(String serviceName, String clusterId, String 
deploymentPolicyName,
@@ -95,6 +97,7 @@ public class Cluster implements Serializable {
         this.setInstanceIdToInstanceContextMap(new ConcurrentHashMap<String, 
ClusterInstance>());
         this.accessUrls = new HashMap<>();
         this.kubernetesServices = new ArrayList<KubernetesService>();
+        this.loadBalancerIps = new ArrayList<String>();
     }
 
     public String getServiceName() {
@@ -365,13 +368,25 @@ public class Cluster implements Serializable {
         setKubernetesCluster((kubernetesServices != null) && 
(kubernetesServices.size() > 0));
     }
 
+    public List<String> getLoadBalancerIps() {
+        return loadBalancerIps;
+    }
+
+    public void setLoadBalancerIps(List<String> loadBalancerIps) {
+        this.loadBalancerIps = loadBalancerIps;
+    }
+
+    public void addLoadBalancerIps(List<String> loadBalancerIps) {
+        loadBalancerIps.addAll(loadBalancerIps);
+    }
+
     @Override
     public String toString() {
         return String.format("[serviceName=%s, clusterId=%s, 
autoscalePolicyName=%s, deploymentPolicyName=%s, " +
                         "hostNames=%s, tenantRange=%s, 
loadBalanceAlgorithmName=%s, appId=%s, parentId=%s, " +
-                        "accessUrls=%s, kubernetesServices=%s]", serviceName, 
clusterId, autoscalePolicyName,
+                        "accessUrls=%s, kubernetesServices=%s, 
loadBalancerIps=%s]", serviceName, clusterId, autoscalePolicyName,
                 deploymentPolicyName, hostNames, tenantRange, 
loadBalanceAlgorithmName, appId, parentId,
-                accessUrls, kubernetesServices);
+                accessUrls, kubernetesServices, loadBalancerIps);
     }
 }
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/bd15da63/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ClusterInstanceActivatedEvent.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ClusterInstanceActivatedEvent.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ClusterInstanceActivatedEvent.java
index 65b262f..3318e7d 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ClusterInstanceActivatedEvent.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/event/topology/ClusterInstanceActivatedEvent.java
@@ -34,6 +34,7 @@ public class ClusterInstanceActivatedEvent extends Event {
     private String appId;
     private String instanceId;
     private List<String> accessUrls;
+    private List<String> loadBalancerIps;
 
     public ClusterInstanceActivatedEvent(String appId, String serviceName, 
String clusterId, String instanceId) {
         this.serviceName = serviceName;
@@ -41,6 +42,7 @@ public class ClusterInstanceActivatedEvent extends Event {
         this.appId = appId;
         this.instanceId = instanceId;
         this.accessUrls = new ArrayList<String>();
+        this.loadBalancerIps = new ArrayList<String>();
     }
 
     public String getServiceName() {
@@ -81,4 +83,12 @@ public class ClusterInstanceActivatedEvent extends Event {
             accessUrls.add(accessUrl);
         }
     }
+
+    public void setLoadBalancerIps(List<String> loadBalancerIps) {
+        this.loadBalancerIps = loadBalancerIps;
+    }
+
+    public List<String> getLoadBalancerIps() {
+        return loadBalancerIps;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/bd15da63/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterInstanceActivatedProcessor.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterInstanceActivatedProcessor.java
 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterInstanceActivatedProcessor.java
index 5c57231..98f4bd1 100644
--- 
a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterInstanceActivatedProcessor.java
+++ 
b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterInstanceActivatedProcessor.java
@@ -119,7 +119,8 @@ public class ClusterInstanceActivatedProcessor extends 
MessageProcessor {
             }
         } else {
             // Apply changes to the topology
-            
cluster.addAccessUrlList(event.getInstanceId(),event.getAccessUrls());
+            cluster.addAccessUrlList(event.getInstanceId(), 
event.getAccessUrls());
+            cluster.addLoadBalancerIps(event.getLoadBalancerIps());
 
             ClusterInstance context = 
cluster.getInstanceContexts(event.getInstanceId());
             if (context == null) {

http://git-wip-us.apache.org/repos/asf/stratos/blob/bd15da63/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
----------------------------------------------------------------------
diff --git 
a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
 
b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
index aaef07e..12600c7 100644
--- 
a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
+++ 
b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/util/converter/ObjectConverter.java
@@ -716,12 +716,14 @@ public class ObjectConverter {
                 clusterInstanceBean.getMember().add(memberBean);
             }
         }
-        if(cluster.getAccessUrls()!=null) {
+        if(cluster.getAccessUrls() != null) {
             
clusterInstanceBean.setAccessUrls(cluster.getAccessUrls().get(instanceId));
         }
         for (String hostname : cluster.getHostNames()) {
             clusterInstanceBean.getHostNames().add(hostname);
         }
+
+        clusterInstanceBean.setLoadBalancerIps(cluster.getLoadBalancerIps());
         
clusterInstanceBean.setKubernetesServices(convertKubernetesServiceToKubernetesServiceBean(
                 cluster.getKubernetesServices()));
         return clusterInstanceBean;

Reply via email to