From ed3dce58c41d01261c705d142b53b7158a5214ef Mon Sep 17 00:00:00 2001
From: Andri Joos <andri@joos.io>
Date: Wed, 9 Aug 2023 15:15:52 +0200
Subject: [PATCH] ingress for each project

---
 .../generate_deployment_from_middle.py        | 117 ++++++++++--------
 deploy/sideloaded.json                        |   3 -
 2 files changed, 63 insertions(+), 57 deletions(-)
 delete mode 100644 deploy/sideloaded.json

diff --git a/deploy/generate_scripts/generate_deployment_from_middle.py b/deploy/generate_scripts/generate_deployment_from_middle.py
index c10a038..c3644e9 100644
--- a/deploy/generate_scripts/generate_deployment_from_middle.py
+++ b/deploy/generate_scripts/generate_deployment_from_middle.py
@@ -18,7 +18,6 @@ TESTCLUSTER_DEVICE_IP = None
 
 BUILD_DIR = 'deploy'
 EXTERNAL_PATH = f'{BUILD_DIR}/external.json'
-SIDELOADED_PATH = f'{BUILD_DIR}/sideloaded.json'
 INGRESS_DIR = 'ingress'
 INGRESS_TEMPLATE_PATH = f'{INGRESS_DIR}/nginx-ingress-v1.1.0.yaml'
 INGRESS_CONFIG_FILENAME = f'nginx.tmpl'
@@ -126,21 +125,27 @@ def make_deployment_scripts(middle_deployment_scripts: list, middle_deployments:
   nginx_bridges = []
   if middle_deployment_scripts is not None:
     for middle_deployment_script in middle_deployment_scripts:
-      project_name, deployment_file_content, persistent_volumes_file_content, service_account_file_content, current_nginx_bridges = make_deployment_script_from_script(middle_deployment_script)
-      nginx_bridges.extend(current_nginx_bridges)
+      project_name, namespace, deployment_file_content, persistent_volumes_file_content, service_account_file_content, current_nginx_bridges = make_deployment_script_from_script(middle_deployment_script)
+      if current_nginx_bridges:
+        nginx_bridges.append((project_name, namespace, current_nginx_bridges))
 
       dump_files(project_name, deployment_file_content, persistent_volumes_file_content, service_account_file_content)
 
   for middle_deployment in middle_deployments:
-    project_name, deployment_file_content, persistent_volumes_file_content, service_account_file_content, current_nginx_bridges = make_deployment_script_from_object(middle_deployment)
-    nginx_bridges.extend(current_nginx_bridges)
+    project_name, namespace, deployment_file_content, persistent_volumes_file_content, service_account_file_content, current_nginx_bridges = make_deployment_script_from_object(middle_deployment)
+    if current_nginx_bridges:
+      nginx_bridges.append((project_name, namespace, current_nginx_bridges))
 
     dump_files(project_name, deployment_file_content, persistent_volumes_file_content, service_account_file_content)
 
-  prod_ingress, test_ingress, distribution_ingress, ingress_deployment_template, endpoints, prod_issuer, staging_issuer = make_ingresses(nginx_bridges)
+  prod_ingresses, test_ingresses, distribution_ingress, ingress_deployment_template, endpoints, prod_issuer, staging_issuer = make_ingresses(nginx_bridges)
+
+  for project_name, prod_ingress in prod_ingresses:
+    dump_file([prod_ingress], project_name + "_ingress")
+
+  for project_name, test_ingress in test_ingresses:
+    dump_file([test_ingress], project_name + "_testingress")
 
-  dump_file([prod_ingress], PROD_INGRESS_DEPLOY_FILENAME)
-  dump_file([test_ingress], TEST_INGRESS_DEPLOY_FILENAME)
   dump_file([distribution_ingress], DISTRIBUTION_INGRESS_DEPLOY_FILENAME)
   dump_file(endpoints, ENDPOINTS_FILENAME)
   dump_file([prod_issuer], PROD_ISSUER_FILENAME)
@@ -177,18 +182,18 @@ def make_deployment_script(middle_deployment: dict):
   service_account_file_content.append(ns)
 
   for deployment in deployments:
-    deployment_name, bridge_service, http_service, env_config_map, cluster_ip_service, lb_services, node_port_service, kubernetes_volumes, config_map_volumes, service_account, role, role_binding, uris, max_upload_size = make_deployment_components(ns_name, deployment)
+    deployment_name, _, http_service, env_config_map, cluster_ip_service, lb_services, node_port_service, kubernetes_volumes, config_map_volumes, service_account, role, role_binding, uris, max_upload_size = make_deployment_components(ns_name, deployment)
     kubernetes_deployment = make_deployment(deployment_name, ns_name, deployment, kubernetes_volumes, config_map_volumes, service_account, env_config_map)
 
     persistent_volumes = [pv for pv, pvc, volume_name in kubernetes_volumes]
     persistent_volume_claims = [pvc for pv, pvc, volume_name in kubernetes_volumes]
     config_map_volumes = [volume for volume, volume_name in config_map_volumes]
 
-    deployment_file_content.extend(make_deployment_file_content(bridge_service, http_service, env_config_map, cluster_ip_service, lb_services, node_port_service, config_map_volumes, kubernetes_deployment))
+    deployment_file_content.extend(make_deployment_file_content(http_service, env_config_map, cluster_ip_service, lb_services, node_port_service, config_map_volumes, kubernetes_deployment))
     persistent_volumes_file_content.extend(make_persistent_volumes_file_content(persistent_volumes, persistent_volume_claims))
     service_account_file_content.extend(make_service_account_file_content(service_account, role, role_binding))
-    if bridge_service or http_service or uris != []:
-      nginx_bridges.append((bridge_service, http_service, uris, max_upload_size))
+    if http_service or uris != []:
+      nginx_bridges.append((http_service, uris, max_upload_size))
 
     # image_pull_secrets ugly workaround
     image_pull_secret_names = deployment.get(IMAGE_PULL_SECRETS_FIELD, None)
@@ -209,7 +214,7 @@ def make_deployment_script(middle_deployment: dict):
 
     deployment_file_content.extend(image_pull_secrets)
 
-  return project_name, deployment_file_content, persistent_volumes_file_content, service_account_file_content, nginx_bridges
+  return project_name, ns, deployment_file_content, persistent_volumes_file_content, service_account_file_content, nginx_bridges
 
 def make_deployment_components(ns_name, deployment: dict):
   deployment_name = deployment[NAME_FIELD]
@@ -890,10 +895,10 @@ def make_node_port_service(deployment_name: str, ns_name: str, ports):
 def make_env_config_map(specs: dict, deployment_name: str, ns_name: str):
   return make_config_map('env', specs, ns_name, deployment_name)
 
-def make_deployment_file_content(bridge_service: dict, http_service: dict, env: dict, cluster_ip_service: dict, 
+def make_deployment_file_content(http_service: dict, env: dict, cluster_ip_service: dict, 
                                   lb_services: list, node_port_service: list, config_map_volumes: list, deployment: dict):
 
-  return make_file_content(bridge_service, http_service, env, cluster_ip_service, lb_services, node_port_service, config_map_volumes, deployment)
+  return make_file_content(http_service, env, cluster_ip_service, lb_services, node_port_service, config_map_volumes, deployment)
 
 
 def make_persistent_volumes_file_content(pvs: list, pvcs: list):
@@ -1124,7 +1129,7 @@ def make_ingress_rule(uri: str, service_name: str, service_port: int):
   return rule
 
 
-def make_ingress(name: str, hosts: list, rules: list, certificate_name: str, secretName: str = SECRETNAME_DEFAULT, redirect_https: bool=False):
+def make_ingress(name: str, hosts: list, rules: list, certificate_name: str, secretName: str = SECRETNAME_DEFAULT, redirect_https: bool=False, namespace=KUBERNETES_NAMESPACE_DEFAULT):
   annotations = {
     "cert-manager.io/cluster-issuer": certificate_name,
     "kubernetes.io/ingress.class": "nginx",
@@ -1147,7 +1152,7 @@ def make_ingress(name: str, hosts: list, rules: list, certificate_name: str, sec
     KUBERNETES_API_VERSION_KEY: KUBERNETES_API_VERSION_INGRESS_CONFIG_DEFAULT_VALUE,
     KUBERNETES_KIND_KEY: KUBERNETES_KIND_VALUE_INGRESS,
     KUBERNETES_METADATA_KEY: {
-      KUBERNETES_NAMESPACE_KEY: KUBERNETES_NAMESPACE_DEFAULT,
+      KUBERNETES_NAMESPACE_KEY: namespace,
       KUBERNETES_NAME_KEY: name,
       KUBERNETES_ANNOTATIONS_KEY: annotations,
     },
@@ -1187,41 +1192,34 @@ def make_ingress_entry_rules(uri: str, endpoint_name: str, service_port: int, cr
   return (prod_rule, uri), (test_rule, test_uri)
 
 
-def make_prod_test_ingress(ingress_bridges: list, sideloaded: dict):
-  prod_hosts = []
-  prod_rules = []
-  test_hosts = []
-  test_rules = []
+def make_prod_test_ingress(ingress_bridges: list):
+  prod_configs = []
+  test_configs = []
   upload_size_configs = []
-  for bridge_service, http_service, uris, max_upload_size in ingress_bridges:
-    bridge_name = bridge_service[KUBERNETES_METADATA_KEY][KUBERNETES_NAME_KEY]
-    service_port = http_service[KUBERNETES_SPEC_KEY][KUBERNETES_PORTS_KEY][0][KUBERNETES_PORT_KEY]
-
-    for uri in uris:
-      (prod_rule, prod_uri), (test_rule, test_uri) = make_ingress_entry_rules(uri, bridge_name, service_port)
-
-      prod_hosts.append(prod_uri)
-      prod_rules.append(prod_rule)
-
-      test_hosts.append(test_uri)
-      test_rules.append(test_rule)
+  for project_name, namespace, ingress_config in ingress_bridges:
+    ns_name = namespace[KUBERNETES_METADATA_KEY][KUBERNETES_NAME_KEY]
+    prod_rules = []
+    prod_hosts = []
+    test_hosts = []
+    test_rules = []
+    for http_service, uris, max_upload_size in ingress_config:
+      service_name = http_service[KUBERNETES_METADATA_KEY][KUBERNETES_NAME_KEY]
+      service_port = http_service[KUBERNETES_SPEC_KEY][KUBERNETES_PORTS_KEY][0][KUBERNETES_PORT_KEY]    
 
-    upload_size_configs.append((bridge_name, max_upload_size))
+      for uri in uris:
+        (prod_rule, prod_uri), (test_rule, test_uri) = make_ingress_entry_rules(uri, service_name, service_port)
+        prod_hosts.append(prod_uri)
+        prod_rules.append(prod_rule)
 
-  for uri, sideload_config in sideloaded.items():
-    bridge_name = sideload_config[EXTERNALS_ENDPOINT_FIELD]
-    max_upload_size = sideload_config[MAX_UPLOAD_SIZE_FIELD]
-    (prod_rule, uri), (test_rule, test_uri) = make_ingress_entry_rules(uri, bridge_name, service_port)
+        test_hosts.append(test_uri)
+        test_rules.append(test_rule)
 
-    upload_size_configs.append((bridge_name, max_upload_size))
+    prod_configs.append((project_name, ns_name, prod_hosts, prod_rules))
+    test_configs.append((project_name, ns_name, test_hosts, test_rules))
 
-    prod_hosts.append(uri)
-    prod_rules.append(prod_rule)
+    upload_size_configs.append((service_name, max_upload_size))
 
-    test_hosts.append(test_uri)
-    test_rules.append(test_rule)
-
-  return (prod_hosts, prod_rules), (test_hosts, test_rules), upload_size_configs
+  return prod_configs, test_configs, upload_size_configs
 
 def make_distribution_ingress(externals: dict, external_endpoints: dict, test_hosts: list, test_rules: list, test_service: dict, test_max_upload_size: str):
   external_hosts = []
@@ -1266,10 +1264,8 @@ def make_distribution_ingress(externals: dict, external_endpoints: dict, test_ho
 
 
 def make_ingresses(ingress_bridges: list):
-  sideloaded = {}
-  with open(SIDELOADED_PATH, 'r', encoding='utf-8') as f:
-    sideloaded = json.load(f)
-
+  prod_ingresses = []
+  test_ingresses = []
   externals = {}
   with open(EXTERNAL_PATH, 'r', encoding='utf-8') as f:
     externals = json.load(f)
@@ -1285,14 +1281,27 @@ def make_ingresses(ingress_bridges: list):
     external_endpoint, external_service, external_max_upload_size = external_endpoint_config
     endpoints.extend([external_endpoint, external_service])
 
-  (prod_hosts, prod_rules), (test_hosts, test_rules), prod_test_upload_size_configs = make_prod_test_ingress(ingress_bridges, sideloaded)
+  prod_configs, test_configs, prod_test_upload_size_configs = make_prod_test_ingress(ingress_bridges)
+  test_hosts = []
+  test_rules = []
+  for _, _, hosts, rules in test_configs:
+    test_hosts.extend(hosts)
+    test_rules.extend(rules)
+  
   distribution_hosts, distribution_rules, distribution_upload_size_configs = make_distribution_ingress(externals[EXTERNALS_REDIRECTS_FIELD], externals[EXTERNALS_ENDPOINTS_FIELD],  test_hosts, test_rules, test_service, test_max_upload_size)
   
   upload_size_configs = prod_test_upload_size_configs
   upload_size_configs.extend(distribution_upload_size_configs)
 
-  prod_ingress = make_ingress(DEFAULT_INGRESS_NAME, prod_hosts, prod_rules, INGRESS_CERTIFICATE_PROD, INGRESS_SECRETNAME_PROD, redirect_https=False)
-  test_ingress = make_ingress(TEST_INGRESS_NAME, test_hosts, test_rules, INGRESS_CERTIFICATE_STAGING, INGRESS_SECRETNAME_TEST, redirect_https=False) # when here prod, https should work / test, distribution ingress separate
+  for project_name, project_namespace, prod_hosts, prod_rules in prod_configs:
+    prod_ingress = make_ingress(project_name, prod_hosts, prod_rules, INGRESS_CERTIFICATE_PROD, INGRESS_SECRETNAME_PROD, redirect_https=False, namespace=project_namespace)
+    prod_ingresses.append((project_name, prod_ingress))
+
+  for project_name, project_namespace, test_hosts, test_rules in test_configs:
+    test_ingress = make_ingress(project_name, test_hosts, test_rules, INGRESS_CERTIFICATE_STAGING, INGRESS_SECRETNAME_TEST, redirect_https=False, namespace=project_namespace)
+    test_ingresses.append((project_name, test_ingress))
+
+  # test_ingress = make_ingress(TEST_INGRESS_NAME, test_hosts, test_rules, INGRESS_CERTIFICATE_STAGING, INGRESS_SECRETNAME_TEST, redirect_https=False) # when here prod, https should work / test, distribution ingress separate
   distribution_ingress = make_ingress(DISTRIBUTION_INGRESS_NAME, distribution_hosts, distribution_rules, INGRESS_CERTIFICATE_PROD, INGRESS_SECRETNAME_DISTRIBUTION, redirect_https=True)
 
   upload_size_config = make_upload_size_config(upload_size_configs)
@@ -1336,7 +1345,7 @@ def make_ingresses(ingress_bridges: list):
 
   ingress_deployment_content.append(nginx_config_config_map)
 
-  return prod_ingress, test_ingress, distribution_ingress, ingress_deployment_content, endpoints, prod_issuer, staging_issuer
+  return prod_ingresses, test_ingresses, distribution_ingress, ingress_deployment_content, endpoints, prod_issuer, staging_issuer
 
 
 def make_testenv_uri(original_uri: str):
diff --git a/deploy/sideloaded.json b/deploy/sideloaded.json
deleted file mode 100644
index 544b7b4..0000000
--- a/deploy/sideloaded.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    
-}
\ No newline at end of file
-- 
GitLab