package org.ovirt.engine.core.bll.network.cluster;
import java.util.List;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.ValidateSupportsTransaction;
import org.ovirt.engine.core.bll.ValidationResult;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.network.cluster.helper.DisplayNetworkClusterHelper;
import org.ovirt.engine.core.bll.utils.PermissionSubject;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.NetworkClusterParameters;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.ClusterDao;
import org.ovirt.engine.core.dao.VdsDao;
import org.ovirt.engine.core.dao.VmDao;
import org.ovirt.engine.core.dao.network.InterfaceDao;
import org.ovirt.engine.core.dao.network.NetworkClusterDao;
import org.ovirt.engine.core.dao.network.NetworkDao;
@ValidateSupportsTransaction
public class UpdateNetworkOnClusterCommand<T extends NetworkClusterParameters> extends NetworkClusterCommandBase<T> {
@Inject
private ManagementNetworkUtil managementNetworkUtil;
@Inject
private UpdateNetworkClusterPermissionsChecker permissionsChecker;
@Inject
private NetworkClusterHelper networkClusterHelper;
@Inject
private NetworkClusterDao networkClusterDao;
@Inject
private InterfaceDao interfaceDao;
@Inject
private NetworkDao networkDao;
@Inject
private VdsDao vdsDao;
@Inject
private VmDao vmDao;
@Inject
private ClusterDao clusterDao;
private NetworkCluster oldNetworkCluster;
public UpdateNetworkOnClusterCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
}
private NetworkCluster getOldNetworkCluster() {
if (oldNetworkCluster == null) {
oldNetworkCluster = networkClusterDao.get(getNetworkCluster().getId());
}
return oldNetworkCluster;
}
@Override
protected void setActionMessageParameters() {
addValidationMessage(EngineMessage.VAR__TYPE__NETWORK);
addValidationMessage(EngineMessage.VAR__ACTION__UPDATE);
}
@Override
protected void executeCommand() {
final DisplayNetworkClusterHelper displayNetworkClusterHelper = new DisplayNetworkClusterHelper(
networkClusterDao,
vmDao,
clusterDao,
getNetworkCluster(),
getNetworkName(),
auditLogDirector);
if (displayNetworkClusterHelper.isDisplayToBeUpdated()) {
displayNetworkClusterHelper.warnOnActiveVm();
}
preserveStatus();
networkClusterDao.update(getNetworkCluster());
final Network managementNetwork;
if (getNetworkCluster().isManagement() && !getOldNetworkCluster().isManagement()) {
networkClusterDao.setNetworkExclusivelyAsManagement(getClusterId(), getPersistedNetwork().getId());
managementNetwork = getPersistedNetwork();
} else {
managementNetwork = managementNetworkUtil.getManagementNetwork(getClusterId());
}
if (getNetworkCluster().isDisplay() != getOldNetworkCluster().isDisplay()) {
networkClusterDao.setNetworkExclusivelyAsDisplay(getClusterId(),
getNetworkCluster().isDisplay() ? getPersistedNetwork().getId() : managementNetwork.getId());
}
if (getNetworkCluster().isMigration() != getOldNetworkCluster().isMigration()) {
networkClusterDao.setNetworkExclusivelyAsMigration(getClusterId(),
getNetworkCluster().isMigration() ? getPersistedNetwork().getId() : managementNetwork.getId());
}
if (getNetworkCluster().isGluster() != getOldNetworkCluster().isGluster()) {
networkClusterDao.setNetworkExclusivelyAsGluster(getClusterId(),
getNetworkCluster().isGluster() ? getPersistedNetwork().getId() : null);
}
if (getNetworkCluster().isDefaultRoute() != getOldNetworkCluster().isDefaultRoute()) {
networkClusterDao.setNetworkExclusivelyAsDefaultRoute(getClusterId(),
getNetworkCluster().isDefaultRoute() ? getPersistedNetwork().getId() : managementNetwork.getId());
}
networkClusterHelper.setStatus(getClusterId(), getPersistedNetwork());
setSucceeded(true);
}
/**
* Status is a calculated value, thus the value from the command input should be ignored.
*/
private void preserveStatus() {
getNetworkCluster().setStatus(getOldNetworkCluster().getStatus());
}
@Override
protected boolean validate() {
return validate(networkClusterAttachmentExists())
&& validateAttachment();
}
private boolean validateAttachment() {
final UpdateNetworkClusterValidator networkClusterValidator = createNetworkClusterValidator();
return validate(networkClusterValidator.managementNetworkUnset()) &&
validate(networkClusterValidator.glusterNetworkInUseAndUnset(getCluster())) &&
validateAttachment(networkClusterValidator);
}
private ValidationResult networkClusterAttachmentExists() {
return getOldNetworkCluster() == null ?
new ValidationResult(EngineMessage.NETWORK_NOT_EXISTS_IN_CURRENT_CLUSTER) : ValidationResult.VALID;
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.NETWORK_UPDTAE_NETWORK_ON_CLUSTER
: AuditLogType.NETWORK_UPDTAE_NETWORK_ON_CLUSTER_FAILED;
}
@Override
public List<PermissionSubject> getPermissionCheckSubjects() {
return permissionsChecker.findPermissionCheckSubjects(getNetworkId(), getClusterId(), getActionType());
}
private Guid getNetworkId() {
return getNetworkCluster() == null ? null : getNetworkCluster().getNetworkId();
}
/**
* Checks the user has permissions either on Network or on Cluster for this action.<br>
*/
@Override
protected boolean checkPermissions(final List<PermissionSubject> permSubjects) {
return permissionsChecker.checkPermissions(this, permSubjects);
}
private UpdateNetworkClusterValidator createNetworkClusterValidator() {
return new UpdateNetworkClusterValidator(
interfaceDao,
networkDao,
vdsDao,
getNetworkCluster(),
getOldNetworkCluster());
}
}