package org.ovirt.engine.core.bll;
import java.util.List;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.UpdateVmTemplateParameters;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.validation.group.UpdateEntity;
import org.ovirt.engine.core.compat.StringHelper;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
public class UpdateVmTemplateCommand<T extends UpdateVmTemplateParameters> extends VmTemplateCommand<T> {
private VmTemplate mOldTemplate;
public UpdateVmTemplateCommand(T parameters) {
super(parameters);
setVmTemplate(parameters.getVmTemplateData());
setVmTemplateId(getVmTemplate().getId());
setVdsGroupId(getVmTemplate().getvds_group_id());
}
@Override
protected boolean canDoAction() {
boolean returnValue = false;
mOldTemplate = DbFacade.getInstance().getVmTemplateDAO().get(getVmTemplate().getId());
VmTemplateHandler.UpdateDisksFromDb(mOldTemplate);
if (mOldTemplate != null) {
if (VmTemplateHandler.BlankVmTemplateId.equals(mOldTemplate.getId())) {
addCanDoActionMessage(VdcBllMessages.VMT_CANNOT_EDIT_BLANK_TEMPLATE.toString());
} else if (!StringHelper.EqOp(mOldTemplate.getname(), getVmTemplate().getname())
&& isVmTemlateWithSameNameExist(getVmTemplateName())) {
addCanDoActionMessage(VdcBllMessages.VMT_CANNOT_CREATE_DUPLICATE_NAME);
} else {
if (getVdsGroup() == null) {
addCanDoActionMessage(VdcBllMessages.VMT_CLUSTER_IS_NOT_VALID);
} else if (VmHandler.isMemorySizeLegal(mOldTemplate.getos(),
mOldTemplate.getmem_size_mb(),
getReturnValue()
.getCanDoActionMessages(),
getVdsGroup().getcompatibility_version().toString())) {
if (IsVmPriorityValueLegal(getParameters().getVmTemplateData().getpriority(), getReturnValue()
.getCanDoActionMessages())
&& IsDomainLegal(getParameters().getVmTemplateData().getdomain(), getReturnValue()
.getCanDoActionMessages())) {
returnValue = VmTemplateHandler.mUpdateVmTemplate.IsUpdateValid(mOldTemplate, getVmTemplate());
if (!returnValue) {
addCanDoActionMessage(VdcBllMessages.VMT_CANNOT_UPDATE_ILLEGAL_FIELD);
}
}
}
}
}
if (returnValue) {
returnValue = AddVmCommand.CheckCpuSockets(getParameters().getVmTemplateData().getnum_of_sockets(),
getParameters().getVmTemplateData().getcpu_per_socket(), getVdsGroup().getcompatibility_version()
.toString(), getReturnValue().getCanDoActionMessages());
}
return returnValue;
}
@Override
protected void executeCommand() {
if (getVmTemplate() != null) {
UpdateVmTemplate();
if (getVmTemplate().getstorage_pool_id() != null
&& !VmTemplateHandler.BlankVmTemplateId.equals(getVmTemplate().getId())) {
UpdateTemplateInSpm(
getVmTemplate().getstorage_pool_id().getValue(),
new java.util.ArrayList<VmTemplate>(java.util.Arrays
.asList(new VmTemplate[] { getVmTemplate() })));
}
setSucceeded(true);
}
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.USER_UPDATE_VM_TEMPLATE : AuditLogType.USER_FAILED_UPDATE_VM_TEMPLATE;
}
private void UpdateVmTemplate() {
DbFacade.getInstance().getVmTemplateDAO().update(getVmTemplate());
}
@Override
protected List<Class<?>> getValidationGroups() {
addValidationGroup(UpdateEntity.class);
return super.getValidationGroups();
}
@Override
protected void setActionMessageParameters() {
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__UPDATE);
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM_TEMPLATE);
}
}