From 621a13afba80c85b3855e53633ebb7971d578711 Mon Sep 17 00:00:00 2001 From: Quang Hiep Date: Fri, 15 May 2020 07:09:18 +0000 Subject: [PATCH] Use API apps/v1 to create deployment In Kubernetes version 1.16, deployment in ExtensionsV1beta1Deployment is deprecated [1], so it is unable to create cnf. In this patch, I first create method to get AppsV1Api [2], then I include app_v1_api_client in Kubernetes translate_template to create deployment. [1]: https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/ [2]: https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/AppsV1Api.md Related-Bug: #1878753 Change-Id: I0004f5045a6f4aeae84c2105a1dac4369ab3b2fe --- tacker/common/container/kubernetes_utils.py | 4 ++++ .../kubernetes/k8s/translate_outputs.py | 20 +++++++++---------- .../kubernetes/kubernetes_driver.py | 18 ++++++++--------- .../kubernetes/translate_template.py | 6 +++--- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/tacker/common/container/kubernetes_utils.py b/tacker/common/container/kubernetes_utils.py index 98131f143..e9345b842 100644 --- a/tacker/common/container/kubernetes_utils.py +++ b/tacker/common/container/kubernetes_utils.py @@ -67,6 +67,10 @@ class KubernetesHTTPAPI(object): k8s_client = self.get_k8s_client(auth_plugin=auth) return client.AutoscalingV1Api(api_client=k8s_client) + def get_app_v1_api_client(self, auth): + k8s_client = self.get_k8s_client(auth_plugin=auth) + return client.AppsV1Api(api_client=k8s_client) + @staticmethod def create_ca_cert_tmp_file(ca_cert): file_descriptor, file_path = tempfile.mkstemp() diff --git a/tacker/vnfm/infra_drivers/kubernetes/k8s/translate_outputs.py b/tacker/vnfm/infra_drivers/kubernetes/k8s/translate_outputs.py index 099f1afa7..1a81bd7c9 100644 --- a/tacker/vnfm/infra_drivers/kubernetes/k8s/translate_outputs.py +++ b/tacker/vnfm/infra_drivers/kubernetes/k8s/translate_outputs.py @@ -33,10 +33,10 @@ DASH_CHARACTER = '_' class Transformer(object): """Transform TOSCA template to Kubernetes resources""" - def __init__(self, core_v1_api_client, extension_api_client, + def __init__(self, core_v1_api_client, app_v1_api_client, scaling_api_client): self.core_v1_api_client = core_v1_api_client - self.extension_api_client = extension_api_client + self.app_v1_api_client = app_v1_api_client self.scaling_api_client = scaling_api_client def transform(self, tosca_kube_objects): @@ -101,7 +101,7 @@ class Transformer(object): LOG.debug('Successfully created ConfigMap %s', k8s_object.metadata.name) elif object_type == 'Deployment': - self.extension_api_client.create_namespaced_deployment( + self.app_v1_api_client.create_namespaced_deployment( namespace=namespace, body=k8s_object) LOG.debug('Successfully created Deployment %s', @@ -221,15 +221,15 @@ class Transformer(object): metadata=client.V1ObjectMeta( labels=labels, annotations=tosca_kube_obj.annotations), spec=client.V1PodSpec(containers=containers)) - # Create the specification of deployment - deployment_spec = client.ExtensionsV1beta1DeploymentSpec( - template=pod_template) - metadata = client.V1ObjectMeta(name=deployment_name) + label_selector = client.V1LabelSelector(match_labels=labels) + deployment_spec = client.V1DeploymentSpec( + template=pod_template, selector=label_selector) + metadata = client.V1ObjectMeta(name=deployment_name, labels=labels) # Instantiate the deployment object - deployment = client.ExtensionsV1beta1Deployment( - api_version="extensions/v1beta1", + deployment = client.V1Deployment( + api_version="apps/v1", kind="Deployment", metadata=metadata, spec=deployment_spec) @@ -247,7 +247,7 @@ class Transformer(object): # Create target Deployment object target = client.V1CrossVersionObjectReference( - api_version="extensions/v1beta1", + api_version="apps/v1", kind="Deployment", name=deployment_name) # Create the specification of horizon pod auto-scaling diff --git a/tacker/vnfm/infra_drivers/kubernetes/kubernetes_driver.py b/tacker/vnfm/infra_drivers/kubernetes/kubernetes_driver.py index 80cba146c..4f837c6bc 100644 --- a/tacker/vnfm/infra_drivers/kubernetes/kubernetes_driver.py +++ b/tacker/vnfm/infra_drivers/kubernetes/kubernetes_driver.py @@ -92,14 +92,14 @@ class Kubernetes(abstract_driver.VnfAbstractDriver, try: core_v1_api_client = self.kubernetes.get_core_v1_api_client( auth=auth_cred) - extension_api_client = self.kubernetes.get_extension_api_client( + app_v1_api_client = self.kubernetes.get_app_v1_api_client( auth=auth_cred) scaling_api_client = self.kubernetes.get_scaling_api_client( auth=auth_cred) tosca_to_kubernetes = translate_template.TOSCAToKubernetes( vnf=vnf, core_v1_api_client=core_v1_api_client, - extension_api_client=extension_api_client, + app_v1_api_client=app_v1_api_client, scaling_api_client=scaling_api_client) deployment_names = tosca_to_kubernetes.deploy_kubernetes_objects() except Exception as e: @@ -272,7 +272,7 @@ class Kubernetes(abstract_driver.VnfAbstractDriver, try: core_v1_api_client = self.kubernetes.get_core_v1_api_client( auth=auth_cred) - extension_api_client = self.kubernetes.get_extension_api_client( + app_v1_api_client = self.kubernetes.get_app_v1_api_client( auth=auth_cred) scaling_api_client = self.kubernetes.get_scaling_api_client( auth=auth_cred) @@ -321,7 +321,7 @@ class Kubernetes(abstract_driver.VnfAbstractDriver, body = client.V1DeleteOptions( propagation_policy='Foreground', grace_period_seconds=5) - extension_api_client.delete_namespaced_deployment( + app_v1_api_client.delete_namespaced_deployment( namespace=namespace, name=deployment_name, body=body) @@ -350,7 +350,7 @@ class Kubernetes(abstract_driver.VnfAbstractDriver, try: core_v1_api_client = self.kubernetes.get_core_v1_api_client( auth=auth_cred) - extension_api_client = self.kubernetes.get_extension_api_client( + app_v1_api_client = self.kubernetes.get_app_v1_api_client( auth=auth_cred) scaling_api_client = self.kubernetes.get_scaling_api_client( auth=auth_cred) @@ -386,7 +386,7 @@ class Kubernetes(abstract_driver.VnfAbstractDriver, except Exception: pass try: - extension_api_client.read_namespaced_deployment( + app_v1_api_client.read_namespaced_deployment( namespace=namespace, name=deployment_name) count = count + 1 @@ -416,7 +416,7 @@ class Kubernetes(abstract_driver.VnfAbstractDriver, # initialize Kubernetes APIs auth_cred, file_descriptor = self._get_auth_creds(auth_attr) try: - extension_api_client = self.kubernetes.get_extension_api_client( + app_v1_api_client = self.kubernetes.get_app_v1_api_client( auth=auth_cred) scaling_api_client = self.kubernetes.get_scaling_api_client( auth=auth_cred) @@ -427,7 +427,7 @@ class Kubernetes(abstract_driver.VnfAbstractDriver, for i in range(0, len(deployment_names), 2): namespace = deployment_names[i] deployment_name = deployment_names[i + 1] - deployment_info = extension_api_client.\ + deployment_info = app_v1_api_client.\ read_namespaced_deployment(namespace=namespace, name=deployment_name) scaling_info = scaling_api_client.\ @@ -454,7 +454,7 @@ class Kubernetes(abstract_driver.VnfAbstractDriver, {'number': replicas}) scale_replicas = replicas deployment_info.spec.replicas = scale_replicas - extension_api_client.patch_namespaced_deployment_scale( + app_v1_api_client.patch_namespaced_deployment_scale( namespace=namespace, name=deployment_name, body=deployment_info) diff --git a/tacker/vnfm/infra_drivers/kubernetes/translate_template.py b/tacker/vnfm/infra_drivers/kubernetes/translate_template.py index 315e3abfd..e893d1622 100644 --- a/tacker/vnfm/infra_drivers/kubernetes/translate_template.py +++ b/tacker/vnfm/infra_drivers/kubernetes/translate_template.py @@ -33,10 +33,10 @@ CONF = cfg.CONF class TOSCAToKubernetes(object): def __init__(self, vnf, core_v1_api_client, - extension_api_client, scaling_api_client): + app_v1_api_client, scaling_api_client): self.vnf = vnf self.core_v1_api_client = core_v1_api_client - self.extension_api_client = extension_api_client + self.app_v1_api_client = app_v1_api_client self.scaling_api_client = scaling_api_client self.attributes = {} self.vnfd_yaml = None @@ -57,7 +57,7 @@ class TOSCAToKubernetes(object): tosca_kube_objects = self.generate_tosca_kube_objects() transformer = translate_outputs.Transformer( core_v1_api_client=self.core_v1_api_client, - extension_api_client=self.extension_api_client, + app_v1_api_client=self.app_v1_api_client, scaling_api_client=self.scaling_api_client) kubernetes_objects = transformer.transform(tosca_kube_objects) deployment_names = transformer.deploy(