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 <[email protected]> Authored: Wed Sep 23 19:00:43 2015 +0530 Committer: Imesh Gunaratne <[email protected]> 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 " +
