Skip to content

Commit b0fce5a

Browse files
Initial commit
0 parents  commit b0fce5a

File tree

6 files changed

+101
-0
lines changed

6 files changed

+101
-0
lines changed

.github/workflows/main.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
name: docker-build
2+
3+
on:
4+
workflow_dispatch:
5+
6+
jobs:
7+
runs-on: ubuntu-latest
8+
steps:
9+
- uses: actions/checkout@v4
10+
- name: Set up Docker Buildx
11+
uses: docker/setup-buildx-action@v3
12+
- name: Build Papyrus utilites docker image
13+
uses: docker/[email protected]
14+
with:
15+
push: true
16+
context: .
17+
cache-from: type=gha,scope=buildkit-ci
18+
cache-to: type=gha,mode=max,scope=buildkit-ci

Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
FROM python:3.13
2+
3+
COPY . /app
4+
5+
RUN python -m pip install -r /app/src/requirements.txt
6+
7+
CMD python /app/src/main.py

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# simple-python-scheduler
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: simple-python-scheduler
5+
spec:
6+
replicas: 1
7+
selector:
8+
matchLabels:
9+
app: simple-python-scheduler
10+
template:
11+
metadata:
12+
labels:
13+
app: simple-python-scheduler
14+
spec:
15+
containers:
16+
- name: simple-python-scheduler
17+
image: simple-python-scheduler:latest

src/main.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env python
2+
3+
import time
4+
import random
5+
import json
6+
7+
from kubernetes import client, config, watch
8+
9+
config.load_kube_config()
10+
v1 = client.CoreV1Api()
11+
12+
scheduler_name = "foobar"
13+
14+
15+
def nodes_available():
16+
ready_nodes = []
17+
for n in v1.list_node().items:
18+
for status in n.status.conditions:
19+
if status.status == "True" and status.type == "Ready":
20+
ready_nodes.append(n.metadata.name)
21+
return ready_nodes
22+
23+
24+
def scheduler(name, node, namespace="default"):
25+
body = client.V1Binding()
26+
27+
target = client.V1ObjectReference()
28+
target.kind = "Node"
29+
target.apiVersion = "v1"
30+
target.name = node
31+
32+
meta = client.V1ObjectMeta()
33+
meta.name = name
34+
35+
body.target = target
36+
body.metadata = meta
37+
38+
return v1.create_namespaced_binding_binding(name, namespace, body)
39+
40+
41+
def main():
42+
w = watch.Watch()
43+
for event in w.stream(v1.list_namespaced_pod, "default"):
44+
if (
45+
event["object"].status.phase == "Pending"
46+
and event["object"].spec.scheduler_name == scheduler_name
47+
):
48+
try:
49+
res = scheduler(
50+
event["object"].metadata.name, random.choice(nodes_available())
51+
)
52+
except client.rest.ApiException as e:
53+
print(json.loads(e.body)["message"])
54+
55+
56+
if __name__ == "__main__":
57+
main()

src/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
kubernetes

0 commit comments

Comments
 (0)