From 5c099bba2364a2a726ba94ef0790a6e626ab5092 Mon Sep 17 00:00:00 2001
From: Simon Ehrenstein <simon.ehrenstein@gmail.com>
Date: Thu, 26 Nov 2020 19:18:44 +0100
Subject: [PATCH] Add custom random-scheduler

---
 .gitlab-ci.yml                             |  2 +-
 execution/random-scheduler/Dockerfile      | 14 ++++
 execution/random-scheduler/deployment.yaml | 76 +++-------------------
 execution/random-scheduler/rbac.yaml       | 21 ++++++
 execution/random-scheduler/schedule.sh     | 29 +++++++++
 execution/random-scheduler/test.yaml       | 20 ++++++
 6 files changed, 94 insertions(+), 68 deletions(-)
 create mode 100644 execution/random-scheduler/Dockerfile
 create mode 100644 execution/random-scheduler/rbac.yaml
 create mode 100755 execution/random-scheduler/schedule.sh
 create mode 100644 execution/random-scheduler/test.yaml

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 05ea0e7d9..ba2bba99b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -241,4 +241,4 @@ deploy-uc4-workload-generator:
       when: always
     - if: "$DOCKERHUB_ORG && $DOCKERHUB_ID && $DOCKERHUB_PW && $IMAGE_NAME && $JAVA_PROJECT_NAME"
       when: manual
-      allow_failure: true
+      allow_failure: true
\ No newline at end of file
diff --git a/execution/random-scheduler/Dockerfile b/execution/random-scheduler/Dockerfile
new file mode 100644
index 000000000..4c78f6a20
--- /dev/null
+++ b/execution/random-scheduler/Dockerfile
@@ -0,0 +1,14 @@
+FROM ubuntu:bionic
+
+RUN apt-get update
+RUN apt-get install -y curl jq
+
+RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
+
+RUN chmod +x ./kubectl
+
+RUN mv ./kubectl /usr/local/bin/kubectl
+
+ADD schedule.sh /bin/schedule
+
+CMD /bin/schedule
\ No newline at end of file
diff --git a/execution/random-scheduler/deployment.yaml b/execution/random-scheduler/deployment.yaml
index d42b57c30..1bbc60a1c 100644
--- a/execution/random-scheduler/deployment.yaml
+++ b/execution/random-scheduler/deployment.yaml
@@ -1,80 +1,22 @@
-apiVersion: v1
-kind: ServiceAccount
-metadata:
-  name: random-scheduler
-  namespace: kube-system
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
-  name: random-scheduler-as-kube-scheduler
-subjects:
-- kind: ServiceAccount
-  name: random-scheduler
-  namespace: kube-system
-roleRef:
-  kind: ClusterRole
-  name: system:kube-scheduler
-  apiGroup: rbac.authorization.k8s.io
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
-  name: random-scheduler-as-volume-scheduler
-subjects:
-- kind: ServiceAccount
-  name: random-scheduler
-  namespace: kube-system
-roleRef:
-  kind: ClusterRole
-  name: system:volume-scheduler
-  apiGroup: rbac.authorization.k8s.io
----
 apiVersion: apps/v1
 kind: Deployment
 metadata:
-  labels:
-    component: scheduler
-    tier: control-plane
   name: random-scheduler
+  labels:
+    app: random-scheduler
   namespace: kube-system
 spec:
+  replicas: 1
   selector:
     matchLabels:
-      component: scheduler
-      tier: control-plane
-  replicas: 1
+      app: random-scheduler
   template:
     metadata:
       labels:
-        component: scheduler
-        tier: control-plane
-        version: second
+        app: random-scheduler
     spec:
-      serviceAccountName: random-scheduler
+      serviceAccount: random-scheduler
       containers:
-      - command:
-        - /usr/local/bin/kube-scheduler
-        - --address=0.0.0.0
-        - --leader-elect=false
-        - --scheduler-name=random-scheduler # use correct config
-        image: gcr.io/my-gcp-project/my-kube-scheduler:1.0 # use correct image
-        livenessProbe:
-          httpGet:
-            path: /healthz
-            port: 10251
-          initialDelaySeconds: 15
-        name: kube-second-scheduler
-        readinessProbe:
-          httpGet:
-            path: /healthz
-            port: 10251
-        resources:
-          requests:
-            cpu: '0.1'
-        securityContext:
-          privileged: false
-        volumeMounts: []
-      hostNetwork: false
-      hostPID: false
-      volumes: []
\ No newline at end of file
+        - name: random-scheduler
+          image: sehrenstein/random-scheduler:latest
+          imagePullPolicy: Always
diff --git a/execution/random-scheduler/rbac.yaml b/execution/random-scheduler/rbac.yaml
new file mode 100644
index 000000000..ba463cc54
--- /dev/null
+++ b/execution/random-scheduler/rbac.yaml
@@ -0,0 +1,21 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  namespace: kube-system
+  name: random-scheduler 
+  labels:
+    app: random-scheduler 
+    component: random-scheduler
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+  name: random-scheduler
+subjects:
+- kind: ServiceAccount
+  name: random-scheduler
+  namespace: kube-system
+roleRef:
+  kind: ClusterRole
+  apiGroup: rbac.authorization.k8s.io
+  name: system:kube-scheduler
\ No newline at end of file
diff --git a/execution/random-scheduler/schedule.sh b/execution/random-scheduler/schedule.sh
new file mode 100755
index 000000000..0cec94ef6
--- /dev/null
+++ b/execution/random-scheduler/schedule.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+SERVER=($(kubectl config view -o json | jq '.clusters[0].cluster.server'))
+
+while true;
+
+do
+
+    echo "$(kubectl get pods -n default)"
+    for PODNAME in $(kubectl get pods -n default -o json | jq '.items[] | select(.spec.schedulerName == "random-scheduler") | select(.spec.nodeName == null) | .metadata.name' | tr -d '"');
+
+    do
+
+        NODES=($(kubectl get nodes -o json | jq '.items[].metadata.name' | tr -d '"'))
+
+
+        NUMNODES=${#NODES[@]}
+
+        CHOSEN=${NODES[$[$RANDOM % $NUMNODES]]}
+
+        curl --header "Content-Type:application/json" --request POST --data '{"apiVersion":"v1", "kind": "Binding", "metadata": {"name": "'$PODNAME'"}, "target": {"apiVersion": "v1", "kind": "Node", "name": "'$CHOSEN'"}}' $SERVER/api/v1/namespaces/default/pods/$PODNAME/binding/
+
+        echo "Assigned $PODNAME to $CHOSEN"
+
+    done
+
+    sleep 1
+
+done
\ No newline at end of file
diff --git a/execution/random-scheduler/test.yaml b/execution/random-scheduler/test.yaml
new file mode 100644
index 000000000..9104a0968
--- /dev/null
+++ b/execution/random-scheduler/test.yaml
@@ -0,0 +1,20 @@
+apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
+kind: Deployment
+metadata:
+  name: nginx-deployment
+spec:
+  selector:
+    matchLabels:
+      app: nginx
+  replicas: 2 # tells deployment to run 2 pods matching the template
+  template:
+    metadata:
+      labels:
+        app: nginx
+    spec:
+      schedulerName: random-scheduler
+      containers:
+      - name: nginx
+        image: nginx:1.14.2
+        ports:
+        - containerPort: 80
\ No newline at end of file
-- 
GitLab