From 41f00dd07c121fd07334bb1b6955cddeb8677029 Mon Sep 17 00:00:00 2001 From: "Yuanbin.Chen" Date: Wed, 28 Mar 2018 18:07:59 +0800 Subject: [PATCH] Kubernetes: Add cluster delete dependents attribute This patch add kubernetes cluster dependents, master cluster record work cluster uuid to dependents. Master cluster delete check dependents, if work cluster dependents exist, the master cluster delete faild. kubernetes cluster work cluster delete before master cluster delete. Change-Id: Ie6f550f2187d629d396065269af9d4e9fba5acda Signed-off-by: Yuanbin.Chen --- contrib/kubernetes/kube/master.py | 7 ++++++ contrib/kubernetes/kube/worker.py | 37 +++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/contrib/kubernetes/kube/master.py b/contrib/kubernetes/kube/master.py index b34505c50..050ae80df 100644 --- a/contrib/kubernetes/kube/master.py +++ b/contrib/kubernetes/kube/master.py @@ -97,6 +97,13 @@ class ServerProfile(base.KubeBaseProfile): self._create_network(obj) def do_cluster_delete(self, obj): + if obj.dependents and 'kube-node' in obj.dependents: + msg = ("Cluster %s delete failed, " + "Node clusters %s must be deleted first." % + (obj.id, obj.dependents['kube-node'])) + raise exc.EResourceDeletion(type='kubernetes.master', + id=obj.id, + message=msg) self._delete_network(obj) self._delete_security_group(obj) diff --git a/contrib/kubernetes/kube/worker.py b/contrib/kubernetes/kube/worker.py index 75e7b93c5..2d22e7cf6 100644 --- a/contrib/kubernetes/kube/worker.py +++ b/contrib/kubernetes/kube/worker.py @@ -116,6 +116,41 @@ class ServerProfile(base.KubeBaseProfile): return cluster.data + def _set_cluster_dependents(self, obj): + ctx = context.get_service_context(user_id=obj.user, + project_id=obj.project) + master = self.properties[self.MASTER_CLUSTER] + try: + master_cluster = cluster_obj.Cluster.find(ctx, master) + except exc.ResourceNotFound: + msg = _("Cannot find the given cluster: %s") % master + raise exc.BadRequest(msg=msg) + if master_cluster: + # configure kube master dependents, kube master record kube node + # cluster uuid + master_dependents = master_cluster.dependents + master_dependents['kube-node'] = obj.id + cluster_obj.Cluster.update(ctx, master_cluster.id, + {'dependents': master_dependents}) + + def _del_cluster_dependents(self, obj): + ctx = context.get_service_context(user_id=obj.user, + project_id=obj.project) + master = self.properties[self.MASTER_CLUSTER] + try: + master_cluster = cluster_obj.Cluster.find(ctx, master) + except exc.ResourceNotFound: + msg = _("Cannot find the given cluster: %s") % master + raise exc.BadRequest(msg=msg) + + if master_cluster: + # remove kube master record kube node dependents + master_dependents = master_cluster.dependents + if master_dependents and 'kube-node' in master_dependents: + master_dependents.pop('kube-node') + cluster_obj.Cluster.update(ctx, master_cluster.id, + {'dependents': master_dependents}) + def _get_cluster_data(self, obj): ctx = context.get_service_context(user_id=obj.user, project_id=obj.project) @@ -127,9 +162,11 @@ class ServerProfile(base.KubeBaseProfile): def do_cluster_create(self, obj): self._create_security_group(obj) + self._set_cluster_dependents(obj) def do_cluster_delete(self, obj): self._delete_security_group(obj) + self._del_cluster_dependents(obj) def do_validate(self, obj): """Validate if the spec has provided valid info for server creation.