package org.ovirt.engine.core.builder; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.inject.Inject; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.MigrationSupport; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.VmDao; import org.ovirt.engine.core.dao.VmDynamicDao; import org.ovirt.engine.core.dao.VmStaticDao; import org.ovirt.engine.core.dao.VmStatisticsDao; import org.ovirt.engine.core.dao.VmTemplateDao; import org.ovirt.engine.core.utils.RandomUtils; import org.springframework.stereotype.Repository; @Repository public class VmBuilder extends AbstractBuilder<VM, VmBuilder> { @Inject private VmStaticDao vmStaticDao; @Inject private VmDynamicDao vmDynamicDao; @Inject private VmStatisticsDao vmStatisticsDao; @Inject private VmTemplateDao vmTemplateDao; @Inject private VmDao vmDao; public VmBuilder id(final Guid vmId) { object.setId(vmId); return this; } public VmBuilder cluster(final Cluster cluster) { object.setClusterId(cluster.getId()); return this; } public VmBuilder status(final VMStatus status) { object.setStatus(status); return this; } public VmBuilder name(final String name) { object.setName(name); return this; } public VmBuilder up() { object.setStatus(VMStatus.Up); return this; } public VmBuilder down() { object.setStatus(VMStatus.Down); return this; } public VmBuilder host(final VDS host) { object.setRunOnVds(host.getId()); object.setClusterId(host.getClusterId()); return this; } public VmBuilder pinToHosts(VDS... hosts) { final List<Guid> hostIds = Stream.of(hosts).map(VDS::getId).collect(Collectors.toList()); object.setDedicatedVmForVdsList(hostIds); object.setMigrationSupport(MigrationSupport.PINNED_TO_HOST); return this; } public VmBuilder pinToHost(VDS host) { return pinToHosts(host); } public VmBuilder preferHosts(VDS... hosts) { pinToHosts(hosts); object.setMigrationSupport(MigrationSupport.MIGRATABLE); return this; } public VmBuilder preferHost(VDS host) { return preferHosts(host); } @Override protected void prePersist() { if (Guid.isNullOrEmpty(object.getId())) { object.setId(Guid.newGuid()); } if (StringUtils.isEmpty(object.getName())) { object.setName(RandomUtils.instance().nextString(10)); } if (object.getClusterId() == null) { throw new NullPointerException("No cluster, or not persistent cluster specified"); } } @Override public VmBuilder reset() { object = new VM(); return this; } @Override public VmBuilder reset(VM object) { this.object = object; return this; } @Override protected VM doPersist() { vmStaticDao.save(object.getStaticData()); vmDynamicDao.save(object.getDynamicData()); vmStatisticsDao.save(object.getStatisticsData()); return vmDao.get(object.getId()); } }