app/factorio -> personal/q3k/factorio
Change-Id: I92be6a726aef306f6f4de4e5a91defa86cda81fc
diff --git a/personal/q3k/factorio/BUILD b/personal/q3k/factorio/BUILD
new file mode 100644
index 0000000..44be4dd
--- /dev/null
+++ b/personal/q3k/factorio/BUILD
@@ -0,0 +1,52 @@
+load("@io_bazel_rules_docker//container:container.bzl", "container_image")
+
+container_image(
+ name="0.16.51-1",
+ base="@prodimage-bionic//image",
+ tars = ["@factorio-headless-0.16.51//file"],
+ files = [":entrypoint.sh"],
+ directory = "/",
+ entrypoint = ["/entrypoint.sh"],
+)
+
+container_image(
+ name="0.17.41-1",
+ base="@prodimage-bionic//image",
+ tars = ["@factorio-headless-0.17.41//file"],
+ files = [":entrypoint.sh"],
+ directory = "/",
+ entrypoint = ["/entrypoint.sh"],
+)
+
+container_image(
+ name="0.17.52-1",
+ base="@prodimage-bionic//image",
+ tars = ["@factorio-headless-0.17.52//file"],
+ files = [":entrypoint.sh"],
+ directory = "/",
+ entrypoint = ["/entrypoint.sh"],
+)
+
+# Totally broken right now because google/containerregistry doesn't handle
+# /usr/bin/env python == python3.
+#container_push(
+# name = "push_latest",
+# image = ":latest",
+# format = "Docker",
+# registry = "registry.k0.hswaw.net",
+# repository = "app/factorio",
+# tag = "latest",
+#)
+# So this is a replacement hack.
+genrule(
+ name = "push_latest",
+ srcs = [":0.17.52-1"],
+ outs = ["version.sh"],
+ executable = True,
+ cmd = """
+ tag=0.17.52-1
+ docker tag bazel/personal/q3k/factorio:$$tag registry.k0.hswaw.net/personal/q3k/factorio:$$tag
+ docker push registry.k0.hswaw.net/personal/q3k/factorio:$$tag
+ echo -ne "#!/bin/sh\necho Pushed $$tag.\n" > $(OUTS)
+ """,
+)
diff --git a/personal/q3k/factorio/entrypoint.sh b/personal/q3k/factorio/entrypoint.sh
new file mode 100644
index 0000000..8077a1c
--- /dev/null
+++ b/personal/q3k/factorio/entrypoint.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+echo "entrypoint.sh starting..."
+
+if [ ! -d /data ]; then
+ echo "/data is not mounted, exiting."
+ exit 1
+fi
+
+cd /data
+
+if [ ! -f /data/game.zip ]; then
+ echo "No save game, creating new..."
+ /factorio/bin/x64/factorio --create game
+fi
+
+echo "Running with args: $@"
+exec /factorio/bin/x64/factorio --start-server game "$@"
diff --git a/personal/q3k/factorio/kube/factorio.libsonnet b/personal/q3k/factorio/kube/factorio.libsonnet
new file mode 100644
index 0000000..497c62a
--- /dev/null
+++ b/personal/q3k/factorio/kube/factorio.libsonnet
@@ -0,0 +1,97 @@
+# Factorio on Kubernetes.
+
+local kube = import "../../../../kube/kube.libsonnet";
+
+{
+ local factorio = self,
+ local cfg = factorio.cfg,
+
+ cfg:: {
+ namespace: error "namespace must be set",
+ appName: "factorio",
+ storageClassName: "waw-hdd-redundant-1",
+ prefix: "", # if set, should be 'foo-'
+
+ rconPort: 2137,
+ rconPassword: "farts",
+
+ tag: "latest",
+ image: "registry.k0.hswaw.net/app/factorio:" + cfg.tag,
+ resources: {
+ requests: {
+ cpu: "500m",
+ memory: "500Mi",
+ },
+ limits: {
+ cpu: "1",
+ memory: "1Gi",
+ },
+ },
+ },
+
+
+ makeName(suffix):: cfg.prefix + suffix,
+
+ metadata:: {
+ namespace: cfg.namespace,
+ labels: {
+ "app.kubernetes.io/name": cfg.appName,
+ "app.kubernetes.io/managed-by": "kubecfg",
+ "app.kubernetes.io/component": "factorio",
+ },
+ },
+
+ volumeClaim: kube.PersistentVolumeClaim(factorio.makeName("factorio")) {
+ metadata+: factorio.metadata,
+ spec+: {
+ storageClassName: cfg.storageClassName,
+ accessModes: [ "ReadWriteOnce" ],
+ resources: {
+ requests: {
+ storage: "5Gi",
+ },
+ },
+ },
+ },
+ deployment: kube.Deployment(factorio.makeName("factorio")) {
+ metadata+: factorio.metadata,
+ spec+: {
+ replicas: 1,
+ template+: {
+ spec+: {
+ volumes_: {
+ data: kube.PersistentVolumeClaimVolume(factorio.volumeClaim),
+ },
+ containers_: {
+ factorio: kube.Container(factorio.makeName("factorio")) {
+ image: cfg.image,
+ args: [
+ "/entrypoint.sh",
+ "--rcon-port", std.toString(cfg.rconPort),
+ "--rcon-password", cfg.rconPassword,
+ ],
+ ports_: {
+ client: { containerPort: 34197 },
+ rcon: { containerPort: cfg.rconPort },
+ },
+ volumeMounts_: {
+ data: { mountPath: "/data" },
+ },
+ resources: cfg.resources,
+ },
+ },
+ },
+ },
+ },
+ },
+ svc: kube.Service(factorio.makeName("factorio")) {
+ metadata+: factorio.metadata,
+ target_pod:: factorio.deployment.spec.template,
+ spec+: {
+ ports: [
+ { name: "client", port: 34197, targetPort: 34197, protocol: "UDP" },
+ ],
+ type: "LoadBalancer",
+ },
+ },
+}
diff --git a/personal/q3k/factorio/kube/prod.jsonnet b/personal/q3k/factorio/kube/prod.jsonnet
new file mode 100644
index 0000000..c3cc074
--- /dev/null
+++ b/personal/q3k/factorio/kube/prod.jsonnet
@@ -0,0 +1,23 @@
+local factorio = import "factorio.libsonnet";
+local kube = import "../../../../kube/kube.libsonnet";
+
+
+// Available versions:
+// - 0.16.51-1
+// - 0.17.41-1
+// - 0.17.52-1
+
+{
+ local prod = self,
+
+ namespace: kube.Namespace("factorio"),
+ instance(name, tag):: factorio {
+ cfg+: {
+ namespace: "factorio",
+ prefix: name + "-",
+ tag: tag,
+ }
+ },
+
+ q3k: prod.instance("q3k", "0.17.52-1"),
+}