summaryrefslogtreecommitdiff
path: root/modules/ri-base/src/main/resources
diff options
context:
space:
mode:
Diffstat (limited to 'modules/ri-base/src/main/resources')
-rw-r--r--modules/ri-base/src/main/resources/META-INF/kmodule.xml12
-rw-r--r--modules/ri-base/src/main/resources/io/trygvis/rules/dba/dba.drl69
-rw-r--r--modules/ri-base/src/main/resources/io/trygvis/rules/engine/init.drl17
-rw-r--r--modules/ri-base/src/main/resources/io/trygvis/rules/machine/machine.drl1
-rw-r--r--modules/ri-base/src/main/resources/io/trygvis/rules/scaleway/terraform.drl81
-rw-r--r--modules/ri-base/src/main/resources/io/trygvis/rules/terraform/terraform-resources.drl28
-rw-r--r--modules/ri-base/src/main/resources/templates/dba/cluster.j219
-rw-r--r--modules/ri-base/src/main/resources/templates/platform-ansible.j26
-rw-r--r--modules/ri-base/src/main/resources/templates/terraform/machine-outputs.j27
-rw-r--r--modules/ri-base/src/main/resources/templates/terraform/machine.j219
-rw-r--r--modules/ri-base/src/main/resources/templates/terraform/main-scaleway-machine.j219
-rw-r--r--modules/ri-base/src/main/resources/templates/terraform/main.j210
-rw-r--r--modules/ri-base/src/main/resources/templates/terraform/record-set.j28
-rw-r--r--modules/ri-base/src/main/resources/templates/terraform/resource.j21
-rw-r--r--modules/ri-base/src/main/resources/templates/terraform/variables.j210
15 files changed, 307 insertions, 0 deletions
diff --git a/modules/ri-base/src/main/resources/META-INF/kmodule.xml b/modules/ri-base/src/main/resources/META-INF/kmodule.xml
new file mode 100644
index 0000000..4650977
--- /dev/null
+++ b/modules/ri-base/src/main/resources/META-INF/kmodule.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://www.drools.org/xsd/kmodule"
+ xsi:schemaLocation="http://www.drools.org/xsd/kmodule https://www.drools.org/xsd/kmodule_7_1.xsd">
+
+ <kbase name="all" packages="io.trygvis.rules.*"/>
+ <kbase name="engine" packages="io.trygvis.rules.engine"/>
+ <kbase name="dba" packages="io.trygvis.rules.dba"/>
+ <kbase name="machine" packages="io.trygvis.rules.machine"/>
+ <kbase name="terraform" packages="io.trygvis.rules.terraform"/>
+ <kbase name="scaleway" packages="io.trygvis.rules.scaleway"/>
+</kmodule>
diff --git a/modules/ri-base/src/main/resources/io/trygvis/rules/dba/dba.drl b/modules/ri-base/src/main/resources/io/trygvis/rules/dba/dba.drl
new file mode 100644
index 0000000..c31bc57
--- /dev/null
+++ b/modules/ri-base/src/main/resources/io/trygvis/rules/dba/dba.drl
@@ -0,0 +1,69 @@
+package io.trygvis.rules.dba
+
+import io.trygvis.rules.core.Problem
+import io.trygvis.rules.machine.Machine
+import java.util.ArrayList
+import java.util.Map
+import java.util.HashMap
+import java.util.List
+import java.util.stream.Collectors
+import java.util.Collections
+
+global io.trygvis.rules.engine.TemplateEngine te;
+
+dialect "mvel"
+
+declare DbaMachineRole
+ machine : String
+ roles : String[]
+end
+
+rule "Assign containers to machine"
+when
+ $machine : Machine()
+ $machineRole : DbaMachineRole(machine == $machine.name)
+ $container : Container(machine == null, $machineRole.roles contains machineRole)
+then
+ System.out.println("Assigning container to machine: " + $machine.name);
+ modify ($container) {
+ machine = $machine
+ }
+end
+
+rule "Containers without hosts"
+ agenda-group "generate"
+when
+ $container : Container(machine == null)
+then
+ insert(new Problem("No machine for container", $container))
+end
+
+rule "Generate docker-compose.yaml"
+ agenda-group "generate"
+when
+ $cluster : Cluster()
+ $containers : ArrayList(size > 0) from collect(Container(cluster == $cluster))
+then
+ System.out.println("Docker compose for cluster: " + $cluster.name + " with " + $containers.size() + " containers");
+
+ Map containersByMachine = new HashMap();
+ for (Object o : $containers) {
+ Container c = (Container) o;
+
+ List list = (List) containersByMachine.get(c.getMachine());
+ if (list == null) {
+ list = new ArrayList();
+ containersByMachine.put(c.getMachine(), list);
+ }
+ list.add(c);
+ }
+
+ System.out.println("containersByMachine = " + containersByMachine);
+
+ String path = "ansible/dba/" + $cluster.name + ".yml";
+ te.template("dba/cluster", path, Map.of(
+ "cluster", $cluster,
+ "containers", $containers,
+ "containersByMachine", containersByMachine
+ ));
+end
diff --git a/modules/ri-base/src/main/resources/io/trygvis/rules/engine/init.drl b/modules/ri-base/src/main/resources/io/trygvis/rules/engine/init.drl
new file mode 100644
index 0000000..267cc4a
--- /dev/null
+++ b/modules/ri-base/src/main/resources/io/trygvis/rules/engine/init.drl
@@ -0,0 +1,17 @@
+package io.trygvis.rules.engine;
+
+import java.util.Map
+import org.apache.commons.io.FileSystem
+import org.apache.commons.io.FileUtils
+import java.io.File
+
+global io.trygvis.rules.engine.TemplateEngine te;
+
+rule "Clean directories"
+ agenda-group "init"
+when
+ not(KeyValue(key == "rm-gen"));
+then
+ te.clean();
+ insert(new KeyValue("rm-gen", null));
+end
diff --git a/modules/ri-base/src/main/resources/io/trygvis/rules/machine/machine.drl b/modules/ri-base/src/main/resources/io/trygvis/rules/machine/machine.drl
new file mode 100644
index 0000000..0250cc6
--- /dev/null
+++ b/modules/ri-base/src/main/resources/io/trygvis/rules/machine/machine.drl
@@ -0,0 +1 @@
+package io.trygvis.rules.machine;
diff --git a/modules/ri-base/src/main/resources/io/trygvis/rules/scaleway/terraform.drl b/modules/ri-base/src/main/resources/io/trygvis/rules/scaleway/terraform.drl
new file mode 100644
index 0000000..7e0ff03
--- /dev/null
+++ b/modules/ri-base/src/main/resources/io/trygvis/rules/scaleway/terraform.drl
@@ -0,0 +1,81 @@
+package io.trygvis.rules.scaleway
+
+import io.trygvis.rules.dba.Cluster
+import io.trygvis.rules.dba.Container
+import io.trygvis.rules.machine.Machine
+import io.trygvis.rules.dns.DnsEntry
+import io.trygvis.rules.dns.DnsEntryTerraformExpression
+import java.util.ArrayList;
+import java.util.Map;
+
+global io.trygvis.rules.engine.TemplateEngine te;
+
+dialect "mvel"
+
+declare ScalewayMachine
+ machine : Machine
+ key : String
+end
+
+declare GoogleManagedZoneTerraformExpression
+ name : String
+end
+
+rule "Terraform for Machine"
+when
+ $machine: Machine()
+then
+ ScalewayMachine scw = new ScalewayMachine();
+ scw.setKey($machine.name);
+ scw.setMachine($machine);
+
+ insert(scw);
+end
+
+rule "Create DNS entry for Terraform Machine"
+when
+ $machine : Machine(fqdn != null)
+ not(DnsEntry(fqdn == $machine.fqdn))
+then
+ DnsEntry a = DnsEntry.a($machine.fqdn);
+ insert(a);
+
+ String ipv4 = "scaleway_instance_ip.%s.address".formatted($machine.name);
+ insert(new DnsEntryTerraformExpression(a, $machine.name, ipv4));
+end
+
+rule "main-scaleway-machine.tf"
+ agenda-group "generate"
+when
+ $managedZones : ArrayList() from collect(GoogleManagedZoneTerraformExpression())
+then
+ String path = "terraform/main-scaleway-machine.tf";
+ te.template("terraform/main-scaleway-machine", path, Map.of(
+ "managedZones", $managedZones
+ ));
+end
+
+rule "TF for TerraformMachine"
+ agenda-group "generate"
+when
+ $m: Machine()
+ $scw: ScalewayMachine(machine == $m)
+then
+ String path = "terraform/scaleway-machine-%s.tf".formatted($scw.getKey());
+ te.template("terraform/machine", path, Map.of("m", $m, "scw", $scw));
+end
+
+rule "Terraform for DNS"
+ agenda-group "generate"
+when
+ $entry: DnsEntry()
+ $tf : DnsEntryTerraformExpression(entry == $entry)
+ $managedZone : GoogleManagedZoneTerraformExpression()
+then
+ String path = "terraform/dns-%s.tf".formatted($tf.key);
+ te.template("terraform/record-set", path, Map.of(
+ "entry", $entry,
+ "managedZone", $managedZone,
+ "tf", $tf)
+ );
+end
diff --git a/modules/ri-base/src/main/resources/io/trygvis/rules/terraform/terraform-resources.drl b/modules/ri-base/src/main/resources/io/trygvis/rules/terraform/terraform-resources.drl
new file mode 100644
index 0000000..40a81f0
--- /dev/null
+++ b/modules/ri-base/src/main/resources/io/trygvis/rules/terraform/terraform-resources.drl
@@ -0,0 +1,28 @@
+package io.trygvis.rules.terraform;
+
+import java.util.ArrayList
+import java.util.HashSet
+import java.util.Map
+import java.util.Set
+
+global io.trygvis.rules.engine.TemplateEngine te;
+
+dialect "mvel"
+
+rule "terraform-resources"
+ agenda-group "generate"
+when
+ $r : TerraformResource()
+then
+ te.template("terraform/resource", $r.output, Map.of("resource", $r));
+end
+
+rule "main.tf"
+ agenda-group "generate"
+when
+ $main : TerraformMain()
+ $variables : ArrayList() from collect(TerraformInputVariable(module == $main.module))
+then
+ te.template("terraform/main", $main.module + "/main.tf", Map.of("main", $main));
+ te.template("terraform/variables", $main.module + "/vars.tf", Map.of("variables", $variables));
+end
diff --git a/modules/ri-base/src/main/resources/templates/dba/cluster.j2 b/modules/ri-base/src/main/resources/templates/dba/cluster.j2
new file mode 100644
index 0000000..045fbcd
--- /dev/null
+++ b/modules/ri-base/src/main/resources/templates/dba/cluster.j2
@@ -0,0 +1,19 @@
+# Generated
+
+# cluster: {{ cluster.name }}
+{%- for m, containers in containersByMachine.entrySet() %}
+---
+- host:
+ - {{ m.name }}
+ tasks:
+ import_role:
+ name: docker-service
+ vars:
+ template: |
+ version: "3"
+ services:
+{%- for c in containers %}
+ {{ c.name }}:
+ image: {{ c.image }}:{{ c.tag }}
+{%- endfor %}
+{% endfor %}
diff --git a/modules/ri-base/src/main/resources/templates/platform-ansible.j2 b/modules/ri-base/src/main/resources/templates/platform-ansible.j2
new file mode 100644
index 0000000..72e3247
--- /dev/null
+++ b/modules/ri-base/src/main/resources/templates/platform-ansible.j2
@@ -0,0 +1,6 @@
+# Ansible
+- hosts:
+ - {{ m.key }}
+ tasks:
+ - import_role:
+ name: acme-platform
diff --git a/modules/ri-base/src/main/resources/templates/terraform/machine-outputs.j2 b/modules/ri-base/src/main/resources/templates/terraform/machine-outputs.j2
new file mode 100644
index 0000000..438fac6
--- /dev/null
+++ b/modules/ri-base/src/main/resources/templates/terraform/machine-outputs.j2
@@ -0,0 +1,7 @@
+output "addresses" {
+ value = {
+{%- for m in machines %}
+ {{ m.key }}: scaleway_instance_ip.{{ m.key }}.address,
+{%- endfor %}
+ }
+}
diff --git a/modules/ri-base/src/main/resources/templates/terraform/machine.j2 b/modules/ri-base/src/main/resources/templates/terraform/machine.j2
new file mode 100644
index 0000000..0ac8b90
--- /dev/null
+++ b/modules/ri-base/src/main/resources/templates/terraform/machine.j2
@@ -0,0 +1,19 @@
+resource "scaleway_instance_server" "{{ scw.key }}" {
+ name = "acme-1"
+ type = "DEV1-S"
+ image = "b3042271-d2b1-4f87-b407-aedd3bbd1663"
+ ip_id = scaleway_instance_ip.{{ scw.key }}.id
+ enable_dynamic_ip = false
+ enable_ipv6 = true
+}
+
+resource "scaleway_instance_ip" "{{ scw.key }}" {}
+
+resource "scaleway_instance_ip_reverse_dns" "{{ scw.key }}" {
+ ip_id = scaleway_instance_ip.{{ scw.key }}.id
+ reverse = "{{ m.fqdn }}."
+}
+
+output "{{scw.key}}_public_ip" {
+ value = scaleway_instance_server.{{ scw.key }}.public_ip
+}
diff --git a/modules/ri-base/src/main/resources/templates/terraform/main-scaleway-machine.j2 b/modules/ri-base/src/main/resources/templates/terraform/main-scaleway-machine.j2
new file mode 100644
index 0000000..eab9fac
--- /dev/null
+++ b/modules/ri-base/src/main/resources/templates/terraform/main-scaleway-machine.j2
@@ -0,0 +1,19 @@
+# Generated
+
+terraform {
+ required_providers {
+ scaleway = {
+ source = "scaleway/scaleway"
+ version = "1.17.2"
+ }
+ }
+}
+
+provider "scaleway" {
+}
+
+{% -for z in managedZones %}
+variable "{{z.name}}" {
+ type = string
+}
+{% endfor -%}
diff --git a/modules/ri-base/src/main/resources/templates/terraform/main.j2 b/modules/ri-base/src/main/resources/templates/terraform/main.j2
new file mode 100644
index 0000000..009f4ed
--- /dev/null
+++ b/modules/ri-base/src/main/resources/templates/terraform/main.j2
@@ -0,0 +1,10 @@
+terraform {
+ required_providers {
+{% for alias, provider in main.providers.entrySet() %}
+ {{ alias }} = {
+ version = "{{ provider.version }}"
+ source = "{{ provider.source }}"
+ }
+{%- endfor %}
+ }
+}
diff --git a/modules/ri-base/src/main/resources/templates/terraform/record-set.j2 b/modules/ri-base/src/main/resources/templates/terraform/record-set.j2
new file mode 100644
index 0000000..b89ee00
--- /dev/null
+++ b/modules/ri-base/src/main/resources/templates/terraform/record-set.j2
@@ -0,0 +1,8 @@
+resource "google_dns_record_set" "{{ tf.key }}" {
+ name = "{{ entry.fqdn }}"
+ managed_zone = var.{{ managedZone.name }}
+ type = "{{ entry.type }}"
+ ttl = 300
+
+ rrdatas = [{{ tf.expression }}]
+}
diff --git a/modules/ri-base/src/main/resources/templates/terraform/resource.j2 b/modules/ri-base/src/main/resources/templates/terraform/resource.j2
new file mode 100644
index 0000000..91af481
--- /dev/null
+++ b/modules/ri-base/src/main/resources/templates/terraform/resource.j2
@@ -0,0 +1 @@
+{{ resource.asString() -}}
diff --git a/modules/ri-base/src/main/resources/templates/terraform/variables.j2 b/modules/ri-base/src/main/resources/templates/terraform/variables.j2
new file mode 100644
index 0000000..6c37d99
--- /dev/null
+++ b/modules/ri-base/src/main/resources/templates/terraform/variables.j2
@@ -0,0 +1,10 @@
+{%- for var in variables %}
+variable "{{ var.name }}" {
+{%- if var.type %}
+ type = {{ var.type }}
+{% endif %}
+{%- if var.default %}
+ default = {{ var.default }}
+{% endif %}
+}
+{% endfor %}