From dd3669fc54269d4ab5e729006503f612fcbb0c80 Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Sat, 26 Dec 2020 22:56:18 +0100 Subject: wip --- main.py | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 2 files changed, 135 insertions(+) create mode 100644 main.py create mode 100644 requirements.txt 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 -- cgit v1.2.3