matrix: split up appservice to separate file
This is in preparation for adding a Telegram bridge appservice. The main
jsonnet file was getting quite chonky.
This does not affect production, and is just a refactor.
Change-Id: I7cdee2bd71aedb40a9f6c3e5148f829023171dcb
diff --git a/app/matrix/appservice-irc.libsonnet b/app/matrix/appservice-irc.libsonnet
new file mode 100644
index 0000000..51e4f2c
--- /dev/null
+++ b/app/matrix/appservice-irc.libsonnet
@@ -0,0 +1,96 @@
+local kube = import "../../kube/kube.libsonnet";
+
+{
+ AppServiceIrc(name):: {
+ local bridge = self,
+ local cfg = bridge.cfg,
+ cfg:: {
+ metadata: {},
+ config: std.native("parseYaml")(importstr "appservice-irc.yaml")[0],
+ image: error "image must be set",
+ storageClassName: error "storageClassName must be set",
+ },
+
+ config: kube.ConfigMap("appservice-irc-%s" % [name]) {
+ metadata+: cfg.metadata,
+ data: {
+ "config.yaml": std.manifestJsonEx(cfg.config, ""),
+ },
+ },
+
+ dataVolume: kube.PersistentVolumeClaim("appservice-irc-%s" % [name]) {
+ metadata+: cfg.metadata,
+ spec+: {
+ storageClassName: cfg.storageClassName,
+ accessModes: [ "ReadWriteOnce" ],
+ resources: {
+ requests: {
+ storage: "10Gi",
+ },
+ },
+ },
+ },
+
+ bootstrapJob: kube.Job("appservice-irc-%s-bootstrap" % [name]) {
+ metadata+: cfg.metadata {
+ labels: {
+ "job-name": "appservice-irc-%s-bootstrap" % [name],
+ },
+ },
+ spec+: {
+ template+: {
+ spec+: {
+ volumes_: {
+ config: kube.ConfigMapVolume(bridge.config),
+ },
+ containers_: {
+ bootstrap: kube.Container("appservice-irc-%s-bootstrap" % [name]) {
+ image: cfg.image,
+ command: ["sh", "-c", "node app.js -r -u http://appservice-irc-%s:9999 -c /config/config.yaml -f /tmp/registration.yaml && cat /tmp/registration.yaml" % [name]],
+ volumeMounts_: {
+ config: { mountPath: "/config" },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+
+ deployment: kube.Deployment("appservice-irc-%s" % [name]) {
+ metadata+: cfg.metadata,
+ spec+: {
+ replicas: 1,
+ template+: {
+ spec+: {
+ volumes_: {
+ config: kube.ConfigMapVolume(bridge.config),
+ data: kube.PersistentVolumeClaimVolume(bridge.dataVolume),
+ registration: { secret: { secretName: "appservice-irc-%s-registration" % [name] } },
+ },
+ nodeSelector: cfg.nodeSelector,
+ containers_: {
+ appserviceIrc: kube.Container("appservice-irc-%s" % [name]) {
+ image: cfg.image,
+ command: ["node", "app.js", "-c", "/config/config.yaml", "-f", "/registration/registration.yaml", "-p", "9999"],
+ ports_: {
+ http: { containerPort: 9999 },
+ },
+ volumeMounts_: {
+ registration: { mountPath: "/registration", },
+ config: { mountPath: "/config", },
+ data: { mountPath: "/data" },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+
+ svc: kube.Service("appservice-irc-%s" % [name]) {
+ metadata+: cfg.metadata,
+ target_pod:: bridge.deployment.spec.template,
+ },
+ },
+}
diff --git a/app/matrix/prod.jsonnet b/app/matrix/prod.jsonnet
index 732b76c..cf68738 100644
--- a/app/matrix/prod.jsonnet
+++ b/app/matrix/prod.jsonnet
@@ -7,6 +7,8 @@
local kube = import "../../kube/kube.libsonnet";
local postgres = import "../../kube/postgres.libsonnet";
+local irc = import "appservice-irc.libsonnet";
+
{
local app = self,
local cfg = app.cfg,
@@ -222,8 +224,10 @@
},
appservices: {
- "irc-freenode": app.AppServiceIrc("freenode") {
+ "irc-freenode": irc.AppServiceIrc("freenode") {
cfg+: {
+ image: cfg.appserviceIRCImage,
+ storageClassName: cfg.storageClassName,
metadata: app.metadata("appservice-irc-freenode"),
// TODO(q3k): add labels to blessed nodes
nodeSelector: {
@@ -278,96 +282,4 @@
},
},
- AppServiceIrc(name):: {
- local bridge = self,
- local cfg = bridge.cfg,
- cfg:: {
- image: app.cfg.appserviceIRCImage,
- metadata: {},
- config: std.native("parseYaml")(importstr "appservice-irc.yaml")[0],
- storageClassName: app.cfg.storageClassName,
- },
-
- config: kube.ConfigMap("appservice-irc-%s" % [name]) {
- metadata+: cfg.metadata,
- data: {
- "config.yaml": std.manifestJsonEx(cfg.config, ""),
- },
- },
-
- dataVolume: kube.PersistentVolumeClaim("appservice-irc-%s" % [name]) {
- metadata+: cfg.metadata,
- spec+: {
- storageClassName: cfg.storageClassName,
- accessModes: [ "ReadWriteOnce" ],
- resources: {
- requests: {
- storage: "10Gi",
- },
- },
- },
- },
-
- bootstrapJob: kube.Job("appservice-irc-%s-bootstrap" % [name]) {
- metadata+: cfg.metadata {
- labels: {
- "job-name": "appservice-irc-%s-bootstrap" % [name],
- },
- },
- spec+: {
- template+: {
- spec+: {
- volumes_: {
- config: kube.ConfigMapVolume(bridge.config),
- },
- containers_: {
- bootstrap: kube.Container("appservice-irc-%s-bootstrap" % [name]) {
- image: cfg.image,
- command: ["sh", "-c", "node app.js -r -u http://appservice-irc-%s:9999 -c /config/config.yaml -f /tmp/registration.yaml && cat /tmp/registration.yaml" % [name]],
- volumeMounts_: {
- config: { mountPath: "/config" },
- },
- },
- },
- },
- },
- },
- },
-
- deployment: kube.Deployment("appservice-irc-%s" % [name]) {
- metadata+: cfg.metadata,
- spec+: {
- replicas: 1,
- template+: {
- spec+: {
- volumes_: {
- config: kube.ConfigMapVolume(bridge.config),
- data: kube.PersistentVolumeClaimVolume(bridge.dataVolume),
- registration: { secret: { secretName: "appservice-irc-%s-registration" % [name] } },
- },
- nodeSelector: cfg.nodeSelector,
- containers_: {
- appserviceIrc: kube.Container("appservice-irc-%s" % [name]) {
- image: cfg.image,
- command: ["node", "app.js", "-c", "/config/config.yaml", "-f", "/registration/registration.yaml", "-p", "9999"],
- ports_: {
- http: { containerPort: 9999 },
- },
- volumeMounts_: {
- registration: { mountPath: "/registration", },
- config: { mountPath: "/config", },
- data: { mountPath: "/data" },
- },
- },
- },
- },
- },
- },
- },
-
- svc: kube.Service("appservice-irc-%s" % [name]) {
- metadata+: cfg.metadata,
- target_pod:: bridge.deployment.spec.template,
- },
- },
}