package org.ovirt.engine.core.bll;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.RemoveAllVmImagesParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.action.VmTemplateImportExportParameters;
import org.ovirt.engine.core.common.businessentities.DiskImage;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.VmTemplateStatus;
import org.ovirt.engine.core.common.businessentities.storage_domains;
import org.ovirt.engine.core.common.queries.DiskImageList;
import org.ovirt.engine.core.common.queries.GetAllFromExportDomainQueryParamenters;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.common.vdscommands.RemoveVMVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.utils.linq.LinqUtils;
import org.ovirt.engine.core.utils.linq.Predicate;
public class RemoveVmTemplateFromImportExportCommand<T extends VmTemplateImportExportParameters> extends
RemoveVmTemplateCommand<T> {
public RemoveVmTemplateFromImportExportCommand(T parameters) {
super(parameters);
setStorageDomainId(parameters.getStorageDomainId());
}
@Override
protected boolean canDoAction() {
boolean retVal = true;
if (retVal) {
GetAllFromExportDomainQueryParamenters tempVar = new GetAllFromExportDomainQueryParamenters(getParameters()
.getStoragePoolId(), getParameters().getStorageDomainId());
tempVar.setGetAll(true);
VdcQueryReturnValue qretVal = Backend.getInstance().runInternalQuery(
VdcQueryType.GetTemplatesFromExportDomain, tempVar);
retVal = qretVal.getSucceeded();
if (retVal) {
Map<VmTemplate, DiskImageList> templates = (Map) qretVal.getReturnValue();
// java.util.ArrayList<DiskImage> images = null; //LINQ
// templates.FirstOrDefault(t => t.Key.vmt_guid ==
// VmTemplateImportExportParameters.VmTemplateId).Value;
DiskImageList images = templates.get(LinqUtils.firstOrNull(templates.keySet(),
new Predicate<VmTemplate>() {
@Override
public boolean eval(VmTemplate t) {
return t.getId().equals(getParameters().getVmTemplateId());
}
}));
// setVmTemplate(null); //LINQ templates.FirstOrDefault(t =>
// t.Key.vmt_guid ==
// VmTemplateImportExportParameters.VmTemplateId).Key;
VmTemplate template = LinqUtils.firstOrNull(templates.keySet(), new Predicate<VmTemplate>() {
@Override
public boolean eval(VmTemplate t) {
return t.getId().equals(getParameters().getVmTemplateId());
}
});
setVmTemplate(template);
if (images != null) {
getParameters().setImages(images);
}
retVal = !(images == null);
}
}
if (getVmTemplate() == null) {
retVal = false;
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_TEMPLATE_DOES_NOT_EXIST);
}
if (getParameters().getImages() == null || getParameters().getImages().size() <= 0) {
addCanDoActionMessage(VdcBllMessages.TEMPLATE_IMAGE_NOT_EXIST);
retVal = false;
}
if (retVal) {
retVal = StorageDomainCommandBase.IsDomainActive(getParameters().getStorageDomainId(), getParameters()
.getStoragePoolId(), getReturnValue().getCanDoActionMessages());
}
if (retVal) {
storage_domains storage = DbFacade.getInstance().getStorageDomainDAO().getForStoragePool(
getParameters().getStorageDomainId(), getParameters().getStoragePoolId());
if (storage.getstorage_domain_type() != StorageDomainType.ImportExport) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_TYPE_ILLEGAL);
return false;
}
}
if (!retVal) {
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__REMOVE);
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM_TEMPLATE);
}
if (retVal) {
// we fectch from db and not using VmTmplate property becase
// VmTemplate is the one from export domain and not from database
VmTemplate tmpl = DbFacade.getInstance().getVmTemplateDAO().get(getVmTemplateId());
if (tmpl != null) {
retVal = (tmpl.getstatus() != VmTemplateStatus.Locked);
if (!retVal) {
getReturnValue().getCanDoActionMessages()
.add(VdcBllMessages.VM_TEMPLATE_IMAGE_IS_LOCKED.toString());
}
}
}
return retVal;
}
@Override
protected void executeCommand() {
getParameters().setEntityId(getVmTemplateId());
RemoveVMVDSCommandParameters tempVar = new RemoveVMVDSCommandParameters(getParameters().getStoragePoolId(),
getVmTemplateId());
tempVar.setStorageDomainId(getParameters().getStorageDomainId());
Backend.getInstance().getResourceManager().RunVdsCommand(VDSCommandType.RemoveVM, tempVar);
List<DiskImage> images = getParameters().getImages();
for (DiskImage image : images) {
image.setstorage_id(getParameters().getStorageDomainId());
image.setstorage_pool_id(getParameters().getStoragePoolId());
}
RemoveAllVmImagesParameters tempVar2 = new RemoveAllVmImagesParameters(getVmId(), images);
tempVar2.setParentCommand(getActionType());
tempVar2.setEntityId(getParameters().getEntityId());
tempVar2.setForceDelete(true);
tempVar2.setParentParemeters(getParameters());
VdcReturnValueBase vdcRetValue = Backend.getInstance().runInternalAction(VdcActionType.RemoveAllVmImages,
tempVar2);
getReturnValue().getTaskIdList().addAll(vdcRetValue.getInternalTaskIdList());
setSucceeded(true);
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.IMPORTEXPORT_REMOVE_TEMPLATE
: AuditLogType.IMPORTEXPORT_REMOVE_TEMPLATE_FAILED;
}
@Override
protected void EndSuccessfully() {
EndRemoveTemplate();
}
@Override
protected void EndWithFailure() {
EndRemoveTemplate();
}
protected void EndRemoveTemplate() {
setCommandShouldBeLogged(false);
setSucceeded(true);
}
}