package org.ovirt.engine.core.bll.network.vm;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.network.cluster.NetworkHelper;
import org.ovirt.engine.core.bll.utils.PermissionSubject;
import org.ovirt.engine.core.bll.validator.VnicProfileValidator;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.AddVnicProfileParameters;
import org.ovirt.engine.core.common.businessentities.network.NetworkFilter;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.validation.group.CreateEntity;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.network.NetworkFilterDao;
import org.ovirt.engine.core.dao.network.VnicProfileDao;
public class AddVnicProfileCommand<T extends AddVnicProfileParameters> extends VnicProfileCommandBase<T> {
@Inject
private VnicProfileDao vnicProfileDao;
public AddVnicProfileCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
}
@Inject
private NetworkFilterDao networkFilterDao;
@Override
protected boolean validate() {
VnicProfileValidator validator = createVnicProfileValidator();
boolean useDefaultNetworkFilterId = getParameters().isUseDefaultNetworkFilterId();
return validate(validator.vnicProfileIsSet())
&& validate(validator.networkExists())
&& validate(validator.networkQosExistsOrNull())
&& validate(validator.vnicProfileForVmNetworkOnly())
&& validate(validator.vnicProfileNameNotUsed())
&& validate(validator.portMirroringNotSetIfExternalNetwork())
&& validator.validateCustomProperties(getReturnValue().getValidationMessages())
&& validate(validator.passthroughProfileContainsSupportedProperties())
&& validate(validator.validUseDefaultNetworkFilterFlag(useDefaultNetworkFilterId))
&& validate(validator.validNetworkFilterId());
}
@Override
protected void executeCommand() {
getVnicProfile().setId(Guid.newGuid());
updateDefaultNetworkFilterIfRequired();
vnicProfileDao.save(getVnicProfile());
NetworkHelper.addPermissionsOnVnicProfile(getCurrentUser().getId(),
getVnicProfile().getId(),
getParameters().isPublicUse());
getReturnValue().setActionReturnValue(getVnicProfile().getId());
setSucceeded(true);
}
private void updateDefaultNetworkFilterIfRequired() {
if (getParameters().isUseDefaultNetworkFilterId() && !getVnicProfile().isPassthrough()) {
final NetworkFilter networkFilter = NetworkHelper.resolveVnicProfileDefaultNetworkFilter(networkFilterDao);
if (networkFilter != null) {
final Guid networkFilterId = networkFilter.getId();
setNetworkFilterId(networkFilterId);
}
}
}
@Override
protected List<Class<?>> getValidationGroups() {
addValidationGroup(CreateEntity.class);
return super.getValidationGroups();
}
@Override
protected void setActionMessageParameters() {
super.setActionMessageParameters();
addValidationMessage(EngineMessage.VAR__ACTION__ADD);
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.ADD_VNIC_PROFILE
: AuditLogType.ADD_VNIC_PROFILE_FAILED;
}
@Override
public List<PermissionSubject> getPermissionCheckSubjects() {
Guid networkId = getVnicProfile() == null ? null : getVnicProfile().getNetworkId();
return Collections.singletonList(new PermissionSubject(networkId,
VdcObjectType.Network,
getActionType().getActionGroup()));
}
}