package org.ovirt.engine.core.bll.migration; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.ovirt.engine.core.common.migration.ConvergenceConfig; import org.ovirt.engine.core.common.migration.ConvergenceItem; import org.ovirt.engine.core.common.migration.ConvergenceItemWithStallingLimit; import org.ovirt.engine.core.common.migration.NoConvergenceConfig; import org.ovirt.engine.core.vdsbroker.vdsbroker.VdsProperties; public class ConvergenceSchedule { private List<ConvergenceItem> init = new ArrayList<>(); // protected only due to testing List<ConvergenceItemWithStallingLimit> stalling = new ArrayList<>(); public ConvergenceSchedule addInitStep(ConvergenceItem item) { init.add(item); return this; } public ConvergenceSchedule addStallingStep(ConvergenceItemWithStallingLimit item) { stalling.add(item); return this; } public static ConvergenceSchedule from(ConvergenceConfig config) { if (config instanceof NoConvergenceConfig) { return new NoConvergenceSchedule(); } ConvergenceSchedule schedule = new ConvergenceSchedule(); addDowntimes(config, schedule); addInit(config, schedule); return schedule; } public static void addInit(ConvergenceConfig config, ConvergenceSchedule schedule) { if (config.getInitialItems() == null) { return; } config.getInitialItems().stream().forEachOrdered(schedule::addInitStep); } public static void addDowntimes(ConvergenceConfig config, ConvergenceSchedule schedule) { if (config.getConvergenceItems() != null && !config.getConvergenceItems().isEmpty()) { // if the convergence items are set directly then use them config.getConvergenceItems().stream().forEachOrdered(schedule::addStallingStep); } // the last step will be executed when all the other steps have been executed already and the // migration is still stalling (-1 means that it is stalling for any amount this step will be executed) if (config.getLastItems() != null) { config.getLastItems().stream() .map(item -> new ConvergenceItemWithStallingLimit(-1, item)) .forEachOrdered(schedule::addStallingStep); } } public Map<String, Object> asMap() { Map<String, Object> res = new HashMap<>(); res.put(VdsProperties.MIGRATION_INIT_STEPS, init.stream().map(item -> item.asMap()).collect(Collectors.toList())); res.put(VdsProperties.MIGRATION_STALLING_STEPS, stalling.stream().map(item -> item.asMap()).collect(Collectors.toList())); return res; } }