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 hosts" 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; var 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); var path = "ansible/dba/" + $cluster.name + ".yml"; te.template("dba/cluster", path, Map.of( "cluster", $cluster, "containers", $containers, "containersByMachine", containersByMachine )); end