Best server

Change-Id: I3da422644b3eb49d23d94f4ea719e2d0c2b0fb3d
Reviewed-on: https://gerrit.hackerspace.pl/c/hscloud/+/1151
diff --git a/personal/noisersup/openrct2.jsonnet b/personal/noisersup/openrct2.jsonnet
new file mode 100644
index 0000000..cd9eec0
--- /dev/null
+++ b/personal/noisersup/openrct2.jsonnet
@@ -0,0 +1,157 @@
+local kube = import "../../kube/kube.libsonnet";
+
+{
+    local top = self,
+
+    Server(name):: {
+        local server = self,
+        local cfg = server.cfg,
+
+        cfg:: {
+            namespace: error "namespace must be set",
+            storageClassName: "waw-hdd-redundant-3",
+
+            image: "openrct2/openrct2-cli:0.2.4",
+            save: error "save must be set",
+
+            password: "", # disabled if empty.
+
+            admins: {
+                q3k: "a6a3727038eb53b35ad28ba88dc80810f94c6c3d",
+            },
+        },
+
+        metadata:: {
+            namespace: cfg.namespace,
+        },
+
+        volumeClaim: kube.PersistentVolumeClaim(name) {
+            metadata+: server.metadata,
+            spec+: {
+                storageClassName: cfg.storageClassName,
+                accessModes: [ "ReadWriteOnce" ],
+                resources: {
+                    requests: {
+                        storage: "5Gi",
+                    },
+                },
+            },
+        },
+
+        config: kube.ConfigMap(name + "-config") {
+            metadata+: server.metadata,
+            
+            // admins with local server as co-admin
+            local admins = cfg.admins + {
+                openrct2: "",
+            },
+            data: {
+                "users.json": std.manifestJson([
+                    { hash: admins[name], name: name, groupId: 0 }
+                    for name in std.objectFields(admins)
+                ]),
+                "run.sh": |||
+                    set -ex
+                    set -o pipefail
+
+                    SAVES=/home/openrct2/.config/OpenRCT2/save/autosave
+                    if [ -d "$SAVES" ]; then
+                        echo "Save directory exists, checking for autosaves..."
+                        latest="$SAVES/$(ls -Art "$SAVES" | tail -n 1)"
+                        if [ -f "$latest" ]; then
+                            echo "Found new autosave: $latest"
+                            export OPENRCT2_SAVE="$latest"
+                        fi
+                    fi
+
+                    echo "Running save $OPENRCT2_SAVE..."
+                    if [ ! -z "$OPENRCT2_PASSWORD" ]; then
+                        echo "Running with password..."
+                        openrct2-cli host "$OPENRCT2_SAVE" --password "$OPENRCT2_PASSWORD"
+                    else
+                        echo "Running without password..."
+                        openrct2-cli host "$OPENRCT2_SAVE"
+                    fi
+                |||
+            },
+        },
+
+        deployment: kube.Deployment(name) {
+            metadata+: server.metadata,
+            spec+: {
+                template+: {
+                    spec+: {
+                        volumes_: {
+                            data: kube.PersistentVolumeClaimVolume(server.volumeClaim),
+                            config: kube.ConfigMapVolume(server.config),
+                        },
+
+                        initContainers: [
+                            kube.Container("configure-users") {
+                                image: cfg.image,
+                                command: [
+                                    "/bin/bash", "-c",
+                                    "cp /config/users.json /home/openrct2/.config/OpenRCT2/users.json",
+                                ],
+                                volumeMounts_: {
+                                    data: { mountPath: "/home/openrct2/.config/OpenRCT2" },
+                                    config: { mountPath: "/config" },
+                                },
+                            },
+                        ],
+                        containers_: {
+                            server: kube.Container("server") {
+                                image: cfg.image,
+                                env_: {
+                                    OPENRCT2_SAVE: cfg.save,
+                                    OPENRCT2_PASSWORD: cfg.password,
+                                },
+                                command: [
+                                    "/bin/bash", "/config/run.sh",
+                                ],
+                                ports_: {
+                                    client: { containerPort: 11753 },
+                                },
+                                volumeMounts_: {
+                                    data: { mountPath: "/home/openrct2/.config/OpenRCT2" },
+                                    config: { mountPath: "/config" },
+                                },
+                                resources: {
+                                    requests: {
+                                        cpu: "500m",
+                                        memory: "100Mi",
+                                    },
+                                    limits: {
+                                        cpu: "1",
+                                        memory: "1Gi",
+                                    },
+                                },
+                            },
+                        },
+                    },
+                },
+            },
+        },
+
+        svc: kube.Service(name) {
+            metadata+: server.metadata,
+            target_pod:: server.deployment.spec.template,
+            spec+: {
+                ports: [
+                    { name: "client", port: 11753, targetPort: 11753, protocol: "TCP" },
+                ],
+                type: "LoadBalancer",
+                externalTrafficPolicy: "Local",
+            },
+        },
+    },
+
+    servers: {
+        alcatraz: top.Server("openrct2-q3k-alcatraz") {
+            cfg+: {
+                namespace: "personal-noisersup",
+                save: "https://q3k.org/u/480883b2d44658523dcf6561d71d7e3eb91be13253e2bc96378f86a62b380a97.sv6",
+            },
+        },
+    },
+}