package org.ovirt.engine.core.bll.network.cluster;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.ClusterCommandBase;
import org.ovirt.engine.core.bll.InternalCommandAttribute;
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.validator.NetworkValidator;
import org.ovirt.engine.core.common.action.AttachNetworkToClusterParameter;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.dao.VmDao;
import org.ovirt.engine.core.dao.VmStaticDao;
import org.ovirt.engine.core.dao.VmTemplateDao;
import org.ovirt.engine.core.dao.gluster.GlusterBrickDao;
import org.ovirt.engine.core.dao.network.VmNetworkInterfaceDao;
@InternalCommandAttribute
@ValidateSupportsTransaction
public class DetachNetworkFromClusterInternalCommand<T extends AttachNetworkToClusterParameter>
extends ClusterCommandBase<T> {
@Inject
private NetworkClusterHelper networkClusterHelper;
@Inject
private VmStaticDao vmStaticDao;
@Inject
private VmTemplateDao vmTemplateDao;
@Inject
private VmNetworkInterfaceDao vmNetworkInterfaceDao;
@Inject
private GlusterBrickDao glusterBrickDao;
@Inject
private VmDao vmDao;
public DetachNetworkFromClusterInternalCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
}
@Override
protected void executeCommand() {
networkClusterHelper.removeNetworkAndReassignRoles(getParameters().getNetworkCluster());
setSucceeded(true);
}
@Override
protected boolean validate() {
DetachNetworkValidator validator =
new DetachNetworkValidator(vmDao, getNetwork(), getParameters().getNetworkCluster());
return validate(validator.notManagementNetwork())
&& validate(validator.clusterNetworkNotUsedByVms())
&& validate(validator.clusterNetworkNotUsedByTemplates())
&& validate(validator.clusterNetworkNotUsedByBricks());
}
@Override
protected void setActionMessageParameters() {
addValidationMessage(EngineMessage.VAR__ACTION__DETACH);
addValidationMessage(EngineMessage.VAR__TYPE__NETWORK);
}
private Network getNetwork() {
return getParameters().getNetwork();
}
private class DetachNetworkValidator extends NetworkValidator {
private final NetworkCluster networkCluster;
public DetachNetworkValidator(VmDao vmDao, Network network, NetworkCluster networkCluster) {
super(vmDao, network);
this.networkCluster = networkCluster;
}
public ValidationResult clusterNetworkNotUsedByVms() {
return new PluralMessages(EngineMessage.VAR__ENTITIES__VM, EngineMessage.VAR__ENTITIES__VMS)
.getNetworkInUse(getEntitiesNames(vmStaticDao.getAllByGroupAndNetworkName(networkCluster.getClusterId(),
network.getName())));
}
public ValidationResult clusterNetworkNotUsedByTemplates() {
List<VmTemplate> templatesUsingNetwork = new ArrayList<>();
for (VmTemplate template : vmTemplateDao.getAllForCluster(networkCluster.getClusterId())) {
for (VmNetworkInterface nic : vmNetworkInterfaceDao.getAllForTemplate(template.getId())) {
if (network.getName().equals(nic.getNetworkName())) {
templatesUsingNetwork.add(template);
}
}
}
return new PluralMessages(EngineMessage.VAR__ENTITIES__VM_TEMPLATE,
EngineMessage.VAR__ENTITIES__VM_TEMPLATES)
.getNetworkInUse(getEntitiesNames(templatesUsingNetwork));
}
public ValidationResult clusterNetworkNotUsedByBricks() {
return new PluralMessages(EngineMessage.VAR__ENTITIES__GLUSTER_BRICK,
EngineMessage.VAR__ENTITIES__GLUSTER_BRICKS)
.getNetworkInUse(getEntitiesNames(glusterBrickDao.getAllByClusterAndNetworkId(networkCluster.getClusterId(),
network.getId())));
}
}
}