package io.trygvis.acme; import io.trygvis.rules.machine.Machine; import io.trygvis.rules.dba.Cluster; import io.trygvis.rules.dba.Container import io.trygvis.rules.terraform.TerraformResource; import io.trygvis.rules.terraform.TerraformMain import io.trygvis.rules.terraform.TerraformProvider; dialect "mvel" declare AcmeServer name : String machine : Machine end rule "Create Acme servers" when $m : Machine(name.startsWith("acme-")) not(AcmeServer(name == $m.name)) then var s = new AcmeServer(); s.name = $m.name; s.machine = $m; insert(s); end rule "Set public domain for ACME servers" when $m : Machine(fqdn == null) $s : AcmeServer(machine == $m) then var fqdn = "%s.machine.acme.com".formatted($m.name); modify ($m) { fqdn = fqdn } end rule "Make Terraform module for machines" when not TerraformMain(module == "terraform") then var module = new TerraformMain("terraform"); var scaleway = new TerraformProvider("scaleway", "2.0.0-rc1"); module.getProviders().put("scaleway", scaleway); insert(module) end rule "Make Scaleway Terraform resources for Machine" when $m : Machine() $s : AcmeServer(machine == $m) then var ip = new TerraformResource("terraform/" + $m.name + "-ip.tf", "scaleway_instance_ip", $m.name); var instance = new TerraformResource("terraform/" + $m.name + "-instance.tf", "scaleway_server_instance", $m.name) .set("name", "acme-1") .set("type", "DEV1-S") .set("image", "b3042271-d2b1-4f87-b407-aedd3bbd1663") .setExpression("ip_id", ip.name + ".ip") .set("enable_dynamic_ip", false) .set("enable_ipv6", true); var rev = new TerraformResource("terraform/" + $m.name + "-ip.tf", "scaleway_instance_reverse_dns", $m.name) .set("reverse", $m.fqdn + ".") .setExpression("ip_id", ip.name + ".id"); var dns = new TerraformResource("terraform/" + $m.name + "-dns.tf", "google_dns_record_set", $m.name) .set("name", $m.fqdn) .setExpression("managed_zone", "var.dns_zone") .set("type", "A") .set("ttl", 300) .array("rrdatas") .addExpression(ip.name + ".id"); insert(instance) insert(ip) insert(rev) insert(dns) end