summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrygve Laugstøl <trygvis@inamo.no>2020-12-26 22:56:18 +0100
committerTrygve Laugstøl <trygvis@inamo.no>2020-12-26 22:56:18 +0100
commitdd3669fc54269d4ab5e729006503f612fcbb0c80 (patch)
tree998247f8ec26438147e59e19a7d73dfc6bb2ef90
downloadrules-sandbox-dd3669fc54269d4ab5e729006503f612fcbb0c80.tar.gz
rules-sandbox-dd3669fc54269d4ab5e729006503f612fcbb0c80.tar.bz2
rules-sandbox-dd3669fc54269d4ab5e729006503f612fcbb0c80.tar.xz
rules-sandbox-dd3669fc54269d4ab5e729006503f612fcbb0c80.zip
wip
-rw-r--r--main.py134
-rw-r--r--requirements.txt1
2 files changed, 135 insertions, 0 deletions
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..11c4e32
--- /dev/null
+++ b/main.py
@@ -0,0 +1,134 @@
+from durable.engine import MessageObservedException
+from durable.lang import *
+
+class VimScore:
+ @staticmethod
+ def make(env: str, tag: str):
+ return {"type": "vimscore-application", "env": env, "tag": tag}
+
+ @staticmethod
+ def declare_rules():
+ @when_all((m.type == "vimscore-application"))
+ def vsApp(c):
+ print(f"vimscoreApplication: {c.m}")
+ cluster = f"vimscore-{c.m.env}"
+ tag = f"{c.m.tag}"
+ # c.assert_fact(dba.cluster(cluster))
+ for f in [
+ dba.container(cluster, "app", "statera", "statera", tag),
+ dba.container(cluster, "app", "statera-console", "statera-console", tag),
+ dba.container(cluster, "app", "4tune-web", "4tune-web", tag),
+ dba.container(cluster, "app", "4tune-api", "4tune-api", tag),
+ dba.container(cluster, "db", "pdb", "postgresql", "13"),
+ dba.container(cluster, "db", "mdb", "mongodb", "3.2"),
+ ]:
+ c.assert_fact(f)
+
+class VsOperations:
+ @staticmethod
+ def make():
+ return {"type": "vimscore-ops"}
+
+ @staticmethod
+ def declare_rules():
+ @when_all((m.type == "vimscore-ops"))
+ def vsOps(c):
+ cluster = "vimscore-ops"
+ c.assert_fact(dba.cluster(cluster))
+ c.assert_fact(dba.container(cluster, "app", "pdb", "postgresql", "11"))
+ c.assert_fact(dba.container(cluster, "app", "n8n", "n8n", "0.84.1"))
+ # pgadmin, loki
+
+class DockerBasedApplications:
+ @staticmethod
+ def cluster(name: str):
+ return {"type": "dba-cluster", "name": name}
+
+ @staticmethod
+ def container(cluster: str, machineRole: str, name: str, image: str, tag: str):
+ return {"type": "dba-container", "cluster": cluster, "machineRole": machineRole, "name": name, "image": image, "tag": tag}
+
+dba = DockerBasedApplications
+
+with ruleset("my-rules"):
+ VimScore.declare_rules()
+ VsOperations.declare_rules()
+
+ @when_all(pri(1000), (m.type == 'dba-container'))
+ def dba_container(c):
+ print(f"dba-container: {c.m}")
+
+ @when_all(pri(900), (m.type == 'dba-container') & (m.image == "statera") & -m.ports)
+ def addPortsToStatera(c):
+ c.retract_fact(c.m)
+ c.m.ports = [8090]
+ c.assert_fact(c.m)
+
+ @when_all(pri(900), (m.type == 'dba-container') & (m.image == "statera-console") & -m.ports)
+ def addPortsToStateraConsole(c):
+ c.retract_fact(c.m)
+ c.m.ports = [80]
+ c.assert_fact(c.m)
+
+ @when_all(+s.exception)
+ def second(c):
+ print("Processing failed!")
+ print(c.s["exception"])
+ c.s.exception = None
+
+ # The none() part doesn't work as is, but it is worked around with the try/except block.
+ @when_all(
+ (c.container << m.type == "dba-container"),
+ none((m.type == "dba-cluster") & (m.name == c.container.cluster)),
+ )
+ def dbCluster(c):
+ cluster = c.container.cluster
+ try:
+ c.assert_fact(dba.cluster(cluster))
+ print(f"NEW CLUSTER: c.container={c.container}")
+ except MessageObservedException:
+ pass
+
+# @when_all(pri(40),
+# (c.container << m.type == "dba-container"),
+# (c.cluster << (m.type == "dba-cluster") & (m.name == c.container.cluster)),
+# )
+# def dbCluster(c):
+# print("dba-cluster: CATCH ALL")
+# print(f"c.container: {c.container}")
+# print(f"c.cluster: {c.cluster}")
+# pass
+
+with ruleset("set-2"):
+ @when_all((m.type == "dba-container"))
+ def container(c):
+ print("container()..")
+
+vimscoreCi = VimScore.make("ci", "development")
+vimscoreProduction = VimScore.make("production", "master")
+vsOps = VsOperations.make()
+
+x = assert_fact("my-rules", vimscoreCi); print(f"x: {x}")
+#x = assert_fact("my-rules", vimscoreProduction); print(f"x: {x}")
+#x = assert_fact("my-rules", vsOps); print(f"x: {x}")
+
+print("Facts:")
+for f in get_facts("my-rules"):
+ print(f"fact: {f}")
+
+print("dba-clusters:")
+for f in [f for f in get_facts("my-rules") if f["type"] == "dba-cluster"]:
+ cluster_name = f["name"]
+
+ del f["name"]
+ print(f" cluster:")
+ print(f" name: {cluster_name}")
+ print(f" json: {f}")
+
+ print(" dba-containers:")
+ for f in [f for f in get_facts("my-rules") if f.get("cluster") == cluster_name and f["type"] == "dba-container"]:
+ del f["cluster"]
+ del f["type"]
+ print(f" container: {f}")
+
+#post("set-2", {"foo": "bar"})
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..a366f15
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1 @@
+durable_rules==2.0.28