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;
