package org.ovirt.engine.core.bll;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.AddVmTemplateInterfaceParameters;
import org.ovirt.engine.core.common.businessentities.network;
import org.ovirt.engine.core.common.businessentities.DiskImageBase;
import org.ovirt.engine.core.common.businessentities.VmInterfaceType;
import org.ovirt.engine.core.common.businessentities.VmNetworkInterface;
import org.ovirt.engine.core.common.validation.group.CreateEntity;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.CustomLogField;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.CustomLogFields;
import org.ovirt.engine.core.utils.linq.LinqUtils;
import org.ovirt.engine.core.utils.linq.Predicate;
@CustomLogFields({ @CustomLogField("InterfaceName") })
public class AddVmTemplateInterfaceCommand<T extends AddVmTemplateInterfaceParameters> extends VmTemplateCommand<T> {
public AddVmTemplateInterfaceCommand(T parameters) {
super(parameters);
}
public String getInterfaceName() {
return getParameters().getInterface().getName();
}
@Override
protected void executeCommand() {
AddCustomValue("InterfaceType", (VmInterfaceType.forValue(getParameters().getInterface().getType()).getInterfaceTranslation()).toString());
getParameters().getInterface().setVmTemplateId(getParameters().getVmTemplateId());
getParameters().getInterface().setId(Guid.NewGuid());
getParameters().getInterface().setSpeed(
VmInterfaceType.forValue(
getParameters().getInterface().getType()).getSpeed());
DbFacade.getInstance()
.getVmNetworkInterfaceDAO()
.save(getParameters().getInterface());
// \\DbFacade.Instance.addInterfaceStatistics(AddVmTemplateInterfaceParameters.Interface.InterfaceStatistics);
setSucceeded(true);
}
@Override
protected boolean canDoAction() {
List<VmNetworkInterface> interfaces = DbFacade.getInstance().getVmNetworkInterfaceDAO()
.getAllForTemplate(getParameters().getVmTemplateId());
// LINQ 29456
if (!VmHandler.IsNotDuplicateInterfaceName(interfaces,
getParameters().getInterface().getName(),
getReturnValue().getCanDoActionMessages())) {
return false;
}
if (getVmTemplate() == null) {
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_TEMPLATE_DOES_NOT_EXIST);
return false;
}
if (getParameters().getInterface().getVmId() != null) {
addCanDoActionMessage(VdcBllMessages.NETWORK_INTERFACE_VM_CANNOT_BE_SET);
return false;
}
VmTemplateHandler.UpdateDisksFromDb(getVmTemplate());
java.util.ArrayList<VmNetworkInterface> allInterfaces = new java.util.ArrayList<VmNetworkInterface>(interfaces);
allInterfaces.add(getParameters().getInterface());
if (!VmCommand.CheckPCIAndIDELimit(getVmTemplate().getnum_of_monitors(), allInterfaces,
new ArrayList<DiskImageBase>(getVmTemplate().getDiskList()), getReturnValue().getCanDoActionMessages())) {
return false;
}
// check that the network exists in current cluster
List<network> networks = DbFacade.getInstance().getNetworkDAO().getAllForCluster(getVmTemplate().getvds_group_id());
if (null == LinqUtils.firstOrNull(networks, new Predicate<network>() {
@Override
public boolean eval(network network) {
return network.getname().equals(getParameters().getInterface().getNetworkName());
}
})) {
addCanDoActionMessage(VdcBllMessages.NETWORK_NOT_EXISTS_IN_CURRENT_CLUSTER);
return false;
}
return true;
}
@Override
protected List<Class<?>> getValidationGroups() {
addValidationGroup(CreateEntity.class);
return super.getValidationGroups();
}
/**
* Set the parameters for bll messages, such as type and action,
*/
@Override
protected void setActionMessageParameters()
{
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__ADD);
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__INTERFACE);
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.NETWORK_ADD_TEMPLATE_INTERFACE
: AuditLogType.NETWORK_ADD_TEMPLATE_INTERFACE_FAILED;
}
}