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 : Machine roles : String[] end rule "Assign containers to machine" when $machineRole : DbaMachineRole(machine != null) $container : Container(machine == null, $machineRole.roles contains machineRole) then System.out.println("Assigning container " + $container.cluster.name + "/" + $container.name + " to machine: " + $machineRole.machine.name); modify ($container) { machine = $machineRole.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