You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2015/09/23 15:31:11 UTC

stratos git commit: Fixing kubernetes service management methods in cluster context

Repository: stratos
Updated Branches:
  refs/heads/stratos-4.1.x 13bd7dca7 -> cf386347b


Fixing kubernetes service management methods in cluster context


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

Branch: refs/heads/stratos-4.1.x
Commit: cf386347bda836d2640f8dec6203bdbfcf0c7224
Parents: 13bd7dc
Author: Imesh Gunaratne <im...@apache.org>
Authored: Wed Sep 23 19:00:43 2015 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Wed Sep 23 19:01:00 2015 +0530

----------------------------------------------------------------------
 .../cloud/controller/domain/ClusterContext.java | 47 ++++------
 .../iaases/kubernetes/KubernetesIaas.java       | 97 +++-----------------
 .../messaging/topology/TopologyBuilder.java     |  2 +-
 3 files changed, 34 insertions(+), 112 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/cf386347/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ClusterContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ClusterContext.java
index 9e8b7d2..abfc287 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ClusterContext.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/ClusterContext.java
@@ -44,12 +44,12 @@ public class ClusterContext implements Serializable {
     // on an unregistration.
     private long timeoutInMillis;
     private Properties properties;
-    private Map<String, Map<String,KubernetesService>> kubernetesServices;
+    private Map<String, Map<String,KubernetesService>> clusterInstanceToKubernetesServicesMap;
 
     public ClusterContext(String applicationId, String cartridgeType, String clusterId, String payload, String hostName,
                           boolean isLbCluster, Properties properties) {
 
-        this.kubernetesServices = new HashMap<>();
+        this.clusterInstanceToKubernetesServicesMap = new HashMap<>();
         this.applicationId = applicationId;
         this.cartridgeType = cartridgeType;
         this.clusterId = clusterId;
@@ -116,38 +116,27 @@ public class ClusterContext implements Serializable {
     }
 
     public Collection<KubernetesService> getKubernetesServices(String clusterInstanceId) {
-        Collection<KubernetesService> arrayKubernetesList = new ArrayList<>();
-        if (kubernetesServices.get(clusterInstanceId) != null) {
-            arrayKubernetesList = kubernetesServices.get(clusterInstanceId).values();
+        Map<String, KubernetesService> kubernetesServicesMap =
+                clusterInstanceToKubernetesServicesMap.get(clusterInstanceId);
+        if (kubernetesServicesMap != null) {
+            return kubernetesServicesMap.values();
         }
-        return arrayKubernetesList;
-    }
-
-    public Collection<KubernetesService> getAllKubernetesServicesForCluster() {
-
-        Collection<KubernetesService> allServices = new ArrayList<>();
-
-        Iterator<Map.Entry<String, Map<String, KubernetesService>>> kubServicesPerInsatnceEntry = kubernetesServices.entrySet().iterator();
-        while (kubServicesPerInsatnceEntry.hasNext()) {
-            Map.Entry<String, Map<String, KubernetesService>> kubServicePerClusterInstance = kubServicesPerInsatnceEntry.next();
-            Iterator<Map.Entry<String, KubernetesService>> kubServiceEntry = kubServicePerClusterInstance.getValue().entrySet().iterator();
-            while (kubServiceEntry.hasNext()) {
-                allServices.add(kubServiceEntry.next().getValue());
-            }
-
-        }
-        return allServices;
-
+        return new ArrayList<KubernetesService>();
     }
 
     public void addKubernetesService(String clusterInstanceId,KubernetesService kubernetesService) {
-        HashMap<String, KubernetesService> kubernetesServiceHashMap = new HashMap<>();
-        kubernetesServiceHashMap.put(kubernetesService.getId(), kubernetesService);
-        this.kubernetesServices.put(clusterInstanceId, kubernetesServiceHashMap);
+        Map<String, KubernetesService> kubernetesServicesMap = clusterInstanceToKubernetesServicesMap.get(clusterInstanceId);
+        if(kubernetesServicesMap == null) {
+            kubernetesServicesMap = new HashMap<>();
+            this.clusterInstanceToKubernetesServicesMap.put(clusterInstanceId, kubernetesServicesMap);
+        }
+        kubernetesServicesMap.put(kubernetesService.getId(), kubernetesService);
     }
 
-    public void removeKubernetesService(String serviceName) {
-        kubernetesServices.remove(serviceName);
+    public void removeKubernetesService(String clusterInstanceId, String serviceName) {
+        Map<String, KubernetesService> kubernetesServicesMap = clusterInstanceToKubernetesServicesMap.get(clusterInstanceId);
+        if(kubernetesServicesMap != null) {
+            kubernetesServicesMap.remove(serviceName);
+        }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/cf386347/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
index 5a32c70..884e681 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java
@@ -519,7 +519,8 @@ public class KubernetesIaas extends Iaas {
 
         if (clusterPortMappings != null) {
             String serviceName = DigestUtils.md5Hex(clusterId);
-            Collection<KubernetesService> kubernetesServices = clusterContext.getKubernetesServices(memberContext.getClusterInstanceId());
+            Collection<KubernetesService> kubernetesServices =
+                    clusterContext.getKubernetesServices(memberContext.getClusterInstanceId());
 
             for (ClusterPortMapping clusterPortMapping : clusterPortMappings) {
                 // Skip if already created
@@ -698,14 +699,18 @@ public class KubernetesIaas extends Iaas {
     /**
      * Find a kubernetes service by container port
      *
-     * @param services
+     * @param kubernetesServices
      * @param containerPort
      * @return
      */
-    private KubernetesService findKubernetesService(Collection<KubernetesService> services, int containerPort) {
-        for (KubernetesService service : services) {
-            if (service.getContainerPort() == containerPort) {
-                return service;
+    private KubernetesService findKubernetesService(Collection<KubernetesService> kubernetesServices,
+                                                    int containerPort) {
+
+        if(kubernetesServices != null) {
+            for (KubernetesService kubernetesService : kubernetesServices) {
+                if (kubernetesService.getContainerPort() == containerPort) {
+                    return kubernetesService;
+                }
             }
         }
         return null;
@@ -839,79 +844,6 @@ public class KubernetesIaas extends Iaas {
     }
 
     /**
-     * Terminate all the containers belong to a cluster by cluster id.
-     *
-     * @param clusterId
-     * @return
-     * @throws InvalidClusterException
-     */
-    public MemberContext[] terminateContainers(String clusterId)
-            throws InvalidClusterException {
-        Lock lock = null;
-        try {
-            lock = CloudControllerContext.getInstance().acquireMemberContextWriteLock();
-
-            ClusterContext clusterContext = CloudControllerContext.getInstance().getClusterContext(clusterId);
-            handleNullObject(clusterContext, "Could not terminate containers, cluster not found: [cluster-id] "
-                    + clusterId);
-
-            // Remove kubernetes services
-            List<KubernetesService> kubernetesServices = Lists.newArrayList(clusterContext.getAllKubernetesServicesForCluster());
-            if (kubernetesServices != null) {
-                for (KubernetesService kubernetesService : kubernetesServices) {
-                    try {
-                        String kubernetesClusterId = kubernetesService.getKubernetesClusterId();
-                        handleNullObject(kubernetesClusterId,
-                                "Could not terminate containers, kubernetes cluster id not found: " +
-                                        "[cluster-id] " + clusterId);
-                        KubernetesClusterContext kubClusterContext = CloudControllerContext.getInstance().
-                                getKubernetesClusterContext(kubernetesClusterId);
-                        handleNullObject(kubClusterContext,
-                                "Could not terminate containers, kubernetes cluster not found: " +
-                                        "[kubernetes-cluster-id] " + kubernetesClusterId);
-
-                        KubernetesApiClient kubApi = kubClusterContext.getKubApi();
-
-                        String serviceId = kubernetesService.getId();
-                        kubApi.deleteService(serviceId);
-
-                        kubClusterContext.deallocatePort(kubernetesService.getPort());
-                        clusterContext.removeKubernetesService(serviceId);
-                    }
-                    catch (KubernetesClientException e) {
-                        log.error("Could not remove kubernetes service: [cluster-id] " + clusterId, e);
-                    }
-                }
-            }
-
-            List<MemberContext> memberContextsRemoved = new ArrayList<MemberContext>();
-            List<MemberContext> memberContexts =
-                    CloudControllerContext.getInstance().getMemberContextsOfClusterId(clusterId);
-            if (memberContexts != null) {
-                for (MemberContext memberContext : memberContexts) {
-                    try {
-                        MemberContext memberContextRemoved = terminateContainer(memberContext);
-                        memberContextsRemoved.add(memberContextRemoved);
-                    }
-                    catch (MemberTerminationFailedException e) {
-                        String message = "Could not terminate container: [member-id] " + memberContext.getMemberId();
-                        log.error(message);
-                    }
-                }
-            }
-
-            // Persist changes
-            CloudControllerContext.getInstance().persist();
-            return memberContextsRemoved.toArray(new MemberContext[memberContextsRemoved.size()]);
-        }
-        finally {
-            if (lock != null) {
-                CloudControllerContext.getInstance().releaseWriteLock(lock);
-            }
-        }
-    }
-
-    /**
      * Terminate a container by member id
      *
      * @param memberContext
@@ -1071,12 +1003,13 @@ public class KubernetesIaas extends Iaas {
      * Remove kubernetes services if available for application cluster.
      *
      * @param clusterContext
+     * @param clusterInstanceId
      */
-    public static void removeKubernetesServices(ClusterContext clusterContext) {
+    public static void removeKubernetesServices(ClusterContext clusterContext, String clusterInstanceId) {
 
         if (clusterContext != null) {
             ArrayList<KubernetesService> kubernetesServices =
-                    Lists.newArrayList(clusterContext.getAllKubernetesServicesForCluster());
+                    Lists.newArrayList(clusterContext.getKubernetesServices(clusterInstanceId));
 
             for (KubernetesService kubernetesService : kubernetesServices) {
                 KubernetesClusterContext kubernetesClusterContext =
@@ -1090,7 +1023,7 @@ public class KubernetesIaas extends Iaas {
                 try {
                     kubernetesApiClient.deleteService(serviceId);
                     kubernetesClusterContext.deallocatePort(kubernetesService.getPort());
-                    clusterContext.removeKubernetesService(serviceId);
+                    clusterContext.removeKubernetesService(clusterInstanceId, serviceId);
                 }
                 catch (KubernetesClientException e) {
                     log.error(String.format("Could not delete kubernetes service: [application-id] %s " +

http://git-wip-us.apache.org/repos/asf/stratos/blob/cf386347/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 e94bb52..0131f3e 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
@@ -1065,7 +1065,7 @@ public class TopologyBuilder {
                 ClusterContext clusterContext =
                         CloudControllerContext.getInstance().getClusterContext(event.getClusterId());
 
-                KubernetesIaas.removeKubernetesServices(clusterContext);
+                KubernetesIaas.removeKubernetesServices(clusterContext, context.getInstanceId());
 
             } else {
                 log.error(String.format("Cluster state transition is not valid: [cluster-id] %s " +