From 8ea1c2aa72bfad70090938b16a4e3ee629e91e47 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Vonheiden?= <bjoern.vonheiden@hotmail.de>
Date: Mon, 20 Jul 2020 09:36:05 +0200
Subject: [PATCH] Use kubernetes api to apply the workload generatorin 
 kubernetes

Use the kubernetes api in python to run the kubernetes creation
operations instead of the default platform commands.
---
 execution/run_uc.py                           | 59 ++++++++-----------
 .../base/kustomization.yaml                   |  2 +-
 ...deployment.yaml => workloadGenerator.yaml} |  4 +-
 3 files changed, 29 insertions(+), 36 deletions(-)
 rename execution/uc-workload-generator/base/{deployment.yaml => workloadGenerator.yaml} (100%)

diff --git a/execution/run_uc.py b/execution/run_uc.py
index bcab45aad..6f83c0e73 100644
--- a/execution/run_uc.py
+++ b/execution/run_uc.py
@@ -110,35 +110,26 @@ def start_workload_generator():
     # TODO: How is this calculation done?
     wl_instances = int(((num_sensors + (wl_max_records - 1)) / wl_max_records))
 
-    parameters_path = 'uc-workload-generator/overlay/uc' + args.uc_id\
-        + '-workload-generator'
-    f = open(parameters_path + '/set_paramters.yaml', 'w')
-    f.write('\
-apiVersion: apps/v1\n\
-kind: StatefulSet\n\
-metadata:\n\
-  name: titan-ccp-load-generator\n\
-spec:\n\
-  replicas: ' + str(wl_instances) + '\n\
-  template:\n\
-    spec:\n\
-      containers:\n\
-      - name: workload-generator\n\
-        env:\n\
-        - name: NUM_SENSORS\n\
-          value: "' + str(num_sensors) + '"\n\
-        - name: INSTANCES\n\
-          value: "' + str(wl_instances) + '"\n')
-    f.close()
 
-    exec_command = [
-        'kubectl',
-        'apply',
-        '-k',
-        parameters_path
-    ]
-    output = subprocess.run(exec_command, capture_output=True, text=True)
-    print(output)
+    # Create statefull set
+    with open(path.join(path.dirname(__file__), "uc-workload-generator/base/workloadGenerator.yaml")) as f:
+        dep = yaml.safe_load(f)
+        dep['spec']['replicas'] = wl_instances
+        # TODO: acces over name of container
+        wg_containter = dep['spec']['template']['spec']['containers'][0]
+        wg_containter['image'] = 'soerenhenning/uc' + args.uc_id + '-wg:latest'
+        # TODO: acces over name of attribute
+        wg_containter['env'][1]['value'] = str(num_sensors)
+        wg_containter['env'][2]['value'] = str(wl_instances)
+        print(dep)
+        try:
+            resp = appsApi.create_namespaced_stateful_set(
+                namespace="default",
+                body=dep
+            )
+            print("StatefulSet '%s' created." % resp.metadata.name)
+        except client.rest.ApiException as e:
+            print("StatefulSet creation error: %s" % e.reason)
     return
 
 
@@ -184,11 +175,13 @@ def start_application():
     with open(path.join(path.dirname(__file__), "uc-application/base/aggregation-deployment.yaml")) as f:
         dep = yaml.safe_load(f)
         dep['spec']['replicas'] = args.instances
-        uc_container = dep['spec']['template']['spec']['containers'][0]
-        uc_container['image'] = 'soerenhenning/uc1-app:latest'
-        uc_container['env'][1]['value'] = str(args.commit_interval_ms)
-        uc_container['resources']['limits']['memory'] = str(args.memory_limit)
-        uc_container['resources']['limits']['cpu'] = str(args.cpu_limit) # cpu limit is already str
+        # TODO: acces over name of container
+        app_container = dep['spec']['template']['spec']['containers'][0]
+        app_container['image'] = 'soerenhenning/uc' + args.uc_id + '-app:latest'
+        # TODO: acces over name of attribute
+        app_container['env'][1]['value'] = str(args.commit_interval_ms)
+        app_container['resources']['limits']['memory'] = str(args.memory_limit)
+        app_container['resources']['limits']['cpu'] = str(args.cpu_limit) # cpu limit is already str
         try:
             resp = appsApi.create_namespaced_deployment(
                 namespace="default",
diff --git a/execution/uc-workload-generator/base/kustomization.yaml b/execution/uc-workload-generator/base/kustomization.yaml
index 88a04b541..2a2c3de74 100644
--- a/execution/uc-workload-generator/base/kustomization.yaml
+++ b/execution/uc-workload-generator/base/kustomization.yaml
@@ -2,4 +2,4 @@ apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
 
 resources:
-  - deployment.yaml
+  - workloadGenerator.yaml
diff --git a/execution/uc-workload-generator/base/deployment.yaml b/execution/uc-workload-generator/base/workloadGenerator.yaml
similarity index 100%
rename from execution/uc-workload-generator/base/deployment.yaml
rename to execution/uc-workload-generator/base/workloadGenerator.yaml
index 109e7c139..71d349de6 100644
--- a/execution/uc-workload-generator/base/deployment.yaml
+++ b/execution/uc-workload-generator/base/workloadGenerator.yaml
@@ -22,9 +22,9 @@ spec:
           value: "my-confluent-cp-kafka:9092"
         - name: NUM_SENSORS
           value: "25000"
+        - name: INSTANCES
+          value: "1"
         - name: POD_NAME
           valueFrom:
             fieldRef:
               fieldPath: metadata.name
-        - name: INSTANCES
-          value: "1"
-- 
GitLab