From 525f2870ed319f4122c44aeafdbbe70aa47763d3 Mon Sep 17 00:00:00 2001 From: Priyanka Saggu Date: Thu, 13 May 2021 13:09:09 +0530 Subject: [PATCH] add "restart_deployment" method Signed-off-by: Priyanka Saggu --- examples/deployment_crud.py | 115 ++++++++++++++++++++++++++++-------- 1 file changed, 89 insertions(+), 26 deletions(-) diff --git a/examples/deployment_crud.py b/examples/deployment_crud.py index d95d4f7a15..8ad919b983 100644 --- a/examples/deployment_crud.py +++ b/examples/deployment_crud.py @@ -13,9 +13,16 @@ # limitations under the License. """ -Creates, updates, and deletes a deployment using AppsV1Api. +The example covers the following: + - Creation of a deployment using AppsV1Api + - update/patch to perform rolling restart on the deployment + - deletetion of the deployment """ +import datetime + +import pytz + from kubernetes import client, config DEPLOYMENT_NAME = "nginx-deployment" @@ -29,56 +36,110 @@ def create_deployment_object(): ports=[client.V1ContainerPort(container_port=80)], resources=client.V1ResourceRequirements( requests={"cpu": "100m", "memory": "200Mi"}, - limits={"cpu": "500m", "memory": "500Mi"} - ) + limits={"cpu": "500m", "memory": "500Mi"}, + ), ) + # Create and configurate a spec section template = client.V1PodTemplateSpec( metadata=client.V1ObjectMeta(labels={"app": "nginx"}), - spec=client.V1PodSpec(containers=[container])) + spec=client.V1PodSpec(containers=[container]), + ) + # Create the specification of deployment spec = client.V1DeploymentSpec( - replicas=3, - template=template, - selector={'matchLabels': {'app': 'nginx'}}) + replicas=3, template=template, selector={ + "matchLabels": + {"app": "nginx"}}) + # Instantiate the deployment object deployment = client.V1Deployment( api_version="apps/v1", kind="Deployment", metadata=client.V1ObjectMeta(name=DEPLOYMENT_NAME), - spec=spec) + spec=spec, + ) return deployment -def create_deployment(api_instance, deployment): +def create_deployment(api, deployment): # Create deployement - api_response = api_instance.create_namespaced_deployment( - body=deployment, - namespace="default") - print("Deployment created. status='%s'" % str(api_response.status)) + resp = api.create_namespaced_deployment( + body=deployment, namespace="default" + ) + print("\n[INFO] deployment `nginx-deployment` created.\n") + print("%s\t%s\t\t\t%s\t%s" % ("NAMESPACE", "NAME", "REVISION", "IMAGE")) + print( + "%s\t\t%s\t%s\t\t%s\n" + % ( + resp.metadata.namespace, + resp.metadata.name, + resp.metadata.generation, + resp.spec.template.spec.containers[0].image, + ) + ) -def update_deployment(api_instance, deployment): + +def update_deployment(api, deployment): # Update container image deployment.spec.template.spec.containers[0].image = "nginx:1.16.0" - # Update the deployment - api_response = api_instance.patch_namespaced_deployment( - name=DEPLOYMENT_NAME, - namespace="default", - body=deployment) - print("Deployment updated. status='%s'" % str(api_response.status)) + # patch the deployment + resp = api.patch_namespaced_deployment( + name=DEPLOYMENT_NAME, namespace="default", body=deployment + ) + + print("\n[INFO] deployment's container image updated.\n") + print("%s\t%s\t\t\t%s\t%s" % ("NAMESPACE", "NAME", "REVISION", "IMAGE")) + print( + "%s\t\t%s\t%s\t\t%s\n" + % ( + resp.metadata.namespace, + resp.metadata.name, + resp.metadata.generation, + resp.spec.template.spec.containers[0].image, + ) + ) + + +def restart_deployment(api, deployment): + # update `spec.template.metadata` section + # to add `kubectl.kubernetes.io/restartedAt` annotation + deployment.spec.template.metadata.annotations = { + "kubectl.kubernetes.io/restartedAt": datetime.datetime.utcnow() + .replace(tzinfo=pytz.UTC) + .isoformat() + } + + # patch the deployment + resp = api.patch_namespaced_deployment( + name=DEPLOYMENT_NAME, namespace="default", body=deployment + ) + + print("\n[INFO] deployment `nginx-deployment` restarted.\n") + print("%s\t\t\t%s\t%s" % ("NAME", "REVISION", "RESTARTED-AT")) + print( + "%s\t%s\t\t%s\n" + % ( + resp.metadata.name, + resp.metadata.generation, + resp.spec.template.metadata.annotations, + ) + ) -def delete_deployment(api_instance): + +def delete_deployment(api): # Delete deployment - api_response = api_instance.delete_namespaced_deployment( + resp = api.delete_namespaced_deployment( name=DEPLOYMENT_NAME, namespace="default", body=client.V1DeleteOptions( - propagation_policy='Foreground', - grace_period_seconds=5)) - print("Deployment deleted. status='%s'" % str(api_response.status)) + propagation_policy="Foreground", grace_period_seconds=5 + ), + ) + print("\n[INFO] deployment `nginx-deployment` deleted.") def main(): @@ -101,8 +162,10 @@ def main(): update_deployment(apps_v1, deployment) + restart_deployment(apps_v1, deployment) + delete_deployment(apps_v1) -if __name__ == '__main__': +if __name__ == "__main__": main()