package org.ovirt.engine.core.bll;
import java.util.List;
import org.ovirt.engine.core.bll.context.CompensationContext;
import org.ovirt.engine.core.common.businessentities.DiskImage;
import org.ovirt.engine.core.common.businessentities.DiskImageTemplate;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.VmTemplateStatus;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.utils.ObjectIdentityChecker;
import org.ovirt.engine.core.utils.transaction.TransactionMethod;
import org.ovirt.engine.core.utils.transaction.TransactionSupport;
public class VmTemplateHandler {
public static Guid BlankVmTemplateId = new Guid();
public static ObjectIdentityChecker mUpdateVmTemplate;
/**
* Initialize static list containers, for identity and permission check. The initialization should be executed
* before calling ObjectIdentityChecker.
*
* @see Backend#InitHandlers
*/
public static void Init()
{
mUpdateVmTemplate = new ObjectIdentityChecker(VmTemplateHandler.class);
BlankVmTemplateId = new Guid("00000000-0000-0000-0000-000000000000");
mUpdateVmTemplate.AddPermittedFields(new String[] { "name", "description", "domain", "os", "osType",
"is_auto_suspend", "interfaces", "mem_size_mb", "num_of_sockets", "cpu_per_socket", "num_of_cpus",
"vds_group_id", "num_of_monitors", "usb_policy", "time_zone", "diskMap", "default_boot_sequence",
"iso_path", "diskImageMap", "default_display_type", "priority", "auto_startup", "is_stateless",
"initrd_url", "kernel_url", "kernel_params" });
}
public static void UpdateDisksFromDb(VmTemplate vmt) {
vmt.getDiskMap().clear();
vmt.getDiskImageMap().clear();
vmt.getDiskList().clear();
List<DiskImageTemplate> diskList =
DbFacade.getInstance().getDiskImageTemplateDAO().getAllByVmTemplate(vmt.getId());
for (DiskImageTemplate dit : diskList) {
vmt.getDiskMap().put(dit.getinternal_drive_mapping(), dit);
// Translation from number of sectors to GB.
vmt.setSizeGB(Double.valueOf(dit.getsize()) / Double.valueOf((1024 * 1024 * 1024)));
DiskImage image = DbFacade.getInstance().getDiskImageDAO().getSnapshotById(dit.getId());
if (image != null) {
vmt.getDiskImageMap().put(dit.getinternal_drive_mapping(), image);
vmt.getDiskList().add(image);
}
}
}
/**
* Check if template state did not changed from last canDoAction check (still not locked and exist in the DB).
*
* @return True if template is at valid state, false otherwise.
*/
public static boolean isTemplateStatusIsNotLocked(Guid id) {
boolean returnValue = false;
VmTemplate template = DbFacade.getInstance().getVmTemplateDAO().get(id);
if ((template != null) && (template.getstatus() != VmTemplateStatus.Locked)) {
returnValue = true;
}
return returnValue;
}
public static java.util.ArrayList<DiskImage> GetDiskImageListByDiskImageTemplateList(VmTemplate vmTemplate,
java.util.ArrayList<DiskImageTemplate> templateImages) {
java.util.ArrayList<DiskImage> vmTemplateDiskImages = new java.util.ArrayList<DiskImage>();
if (!VmTemplateHandler.BlankVmTemplateId.equals(vmTemplate.getId())) {
for (DiskImageTemplate image : templateImages) {
DiskImage diskImage = DbFacade.getInstance().getDiskImageDAO().getSnapshotById(image.getId());
vmTemplateDiskImages.add(diskImage);
}
}
return vmTemplateDiskImages;
}
/**
* Lock the VM template with the given id in a new transaction, handling the compensation data using the given
* {@link CompensationContext}.
*
* @param vmTemplateGuid
* The id of the template to lock.
* @param compensationContext
* The compensation context for saving the old status (can't be <code>null</code>).
*/
public static void lockVmTemplateInTransaction(final Guid vmTemplateGuid,
final CompensationContext compensationContext) {
TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() {
@Override
public Void runInTransaction() {
SetVmTemplateStatus(vmTemplateGuid, VmTemplateStatus.Locked, compensationContext);
compensationContext.stateChanged();
return null;
}
});
}
public static void UnLockVmTemplate(Guid vmTemplateGuid) {
SetVmTemplateStatus(vmTemplateGuid, VmTemplateStatus.OK, null);
}
public static void MarkVmTemplateAsIllegal(Guid vmTemplateGuid) {
SetVmTemplateStatus(vmTemplateGuid, VmTemplateStatus.Illegal, null);
}
/**
* Set the status of the VM template with the given id to the desired status, saving the old status if necessary.
*
* @param vmTemplateGuid
* The id of the template to set the status for.
* @param status
* The status to set.
* @param compensationContext
* The compensation context for saving the old status (can be <code>null</code> if the old status is not
* required to be saved).
*/
private static void SetVmTemplateStatus(
Guid vmTemplateGuid, VmTemplateStatus status, CompensationContext compensationContext) {
VmTemplate vmTemplate = DbFacade.getInstance().getVmTemplateDAO().get(vmTemplateGuid);
if (vmTemplate != null) {
if (compensationContext != null) {
compensationContext.snapshotEntityStatus(vmTemplate, vmTemplate.getstatus());
}
vmTemplate.setstatus(status);
DbFacade.getInstance().getVmTemplateDAO().update(vmTemplate);
} else {
log.warnFormat(
"VmTemplateHandler::SetVmTemplateStatus: vmTemplate is null, not setting status '{0}' to vmTemplate",
status);
}
}
private static LogCompat log = LogFactoryCompat.getLog(VmTemplateHandler.class);
}