From 410236a7da7a6e903f996157b4b8ffdec67a2473 Mon Sep 17 00:00:00 2001
From: Maarten de Waard <maarten@greenhost.nl>
Date: Thu, 16 Dec 2021 15:20:47 +0100
Subject: [PATCH] bugfix and improve generate_secrets script

---
 install/generate_secrets.py | 47 ++++++++++++++++++++++++++++---------
 1 file changed, 36 insertions(+), 11 deletions(-)

diff --git a/install/generate_secrets.py b/install/generate_secrets.py
index 6ff53ac01..56666eaf2 100644
--- a/install/generate_secrets.py
+++ b/install/generate_secrets.py
@@ -59,16 +59,27 @@ def create_variables_secret(app_name, env):
             new_secret_dict = yaml.safe_load(env.from_string(lines).render())
             current_secret_data = get_kubernetes_secret_data(secret_name,
                     secret_namespace)
-            if current_secret_data is not None:
+            if current_secret_data is None:
+                # Create new secret
+                update_secret = False
+            elif current_secret_data.keys() != new_secret_dict['data'].keys():
+                # Update current secret with new keys
+                update_secret = True
                 print(f"Secret {secret_name} in namespace {secret_namespace}"
                       " already exists. Merging...")
                 # Merge dicts. Values from current_secret_data take precedence
                 new_secret_dict['data'] |= current_secret_data
+            else:
+                # Do Nothing
+                print(f"Secret {secret_name} in namespace {secret_namespace}"
+                      " is already in a good state, doing nothing.")
+                return
             print(f"Storing secret {secret_name} in namespace"
                   f" {secret_namespace} in cluster.")
-            store_kubernetes_secret(new_secret_dict, secret_namespace)
+            store_kubernetes_secret(new_secret_dict, secret_namespace,
+                                    update=update_secret)
     else:
-        print(f'File {variables_filename} does not exist.')
+        print(f'File {variables_filename} does not exist, no action needed')
 
 
 def create_basic_auth_secret(app_name, env):
@@ -100,7 +111,7 @@ def create_basic_auth_secret(app_name, env):
                 print(f"Secret {secret_name} in namespace {secret_namespace}"
                       " already exists. Not generating new secrets.")
     else:
-        print(f'File {basic_auth_filename} does not exist.')
+        print(f'File {basic_auth_filename} does not exist, no action needed')
 
 def get_secret_metadata(yaml_string):
     """Returns secret name and namespace from metadata field in a yaml string"""
@@ -126,14 +137,28 @@ def get_kubernetes_secret_data(secret_name, namespace):
         return None
     return secret
 
-def store_kubernetes_secret(secret_dict, namespace):
-    """Converts secret_string into a yaml object and adds it to the cluster"""
+def store_kubernetes_secret(secret_dict, namespace, update=False):
+    """Stores either a new secret in the cluster, or updates an existing one"""
+    api_client = client.api_client.ApiClient()
+    if update:
+        verb = "updated"
+        api_response = patch_kubernetes_secret(secret_dict, namespace)
+    else:
+        verb = "created"
+        api_response = create_from_yaml(
+                api_client,
+                yaml_objects=[secret_dict],
+                namespace=namespace)
+    print(f"Secret {verb} with api response: {api_response}")
+
+def patch_kubernetes_secret(secret_dict, namespace):
+    """Patches secret in the cluster with new data"""
     api_client = client.api_client.ApiClient()
-    api_response = create_from_yaml(
-            api_client,
-            yaml_objects=[secret_dict],
-            namespace=namespace)
-    print(f"Secret created with api response: {api_response}")
+    api_instance = client.CoreV1Api(api_client)
+    name = secret_dict['metadata']['name']
+    body = {}
+    body['data'] = secret_dict['data']
+    return api_instance.patch_namespaced_secret(name, namespace, body)
 
 def generate_password(length):
     """Generates a password of "length" characters"""
-- 
GitLab