package org.ovirt.engine.core.bll.network.cluster; import java.util.Collections; import java.util.List; import javax.inject.Inject; import org.ovirt.engine.core.bll.InternalCommandAttribute; import org.ovirt.engine.core.bll.ValidateSupportsTransaction; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.network.cluster.helper.DisplayNetworkClusterHelper; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AttachNetworkToClusterParameter; import org.ovirt.engine.core.common.businessentities.VDS; 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.NetworkStatus; 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.NetworkAttachmentDao; import org.ovirt.engine.core.dao.network.NetworkClusterDao; import org.ovirt.engine.core.dao.network.NetworkDao; import org.ovirt.engine.core.vdsbroker.vdsbroker.HostNetworkAttachmentsPersister; @InternalCommandAttribute @ValidateSupportsTransaction public class AttachNetworkToClusterInternalCommand<T extends AttachNetworkToClusterParameter> extends NetworkClusterCommandBase<T> { @Inject private NetworkAttachmentDao networkAttachmentDao; @Inject private NetworkClusterHelper networkClusterHelper; @Inject private InterfaceDao interfaceDao; @Inject private NetworkDao networkDao; @Inject private VdsDao vdsDao; @Inject private NetworkClusterDao networkClusterDao; @Inject private VmDao vmDao; @Inject private ClusterDao clusterDao; public AttachNetworkToClusterInternalCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } private Network getNetwork() { return getParameters().getNetwork(); } @Override protected void executeCommand() { attachNetwork(getClusterId(), getNetworkCluster(), getNetwork()); setSucceeded(true); } @Override protected boolean validate() { return networkNotAttachedToCluster() && clusterExists() && logicalNetworkExists() && validateAttachment(); } private boolean validateAttachment() { final AttachNetworkClusterValidator attachNetworkClusterValidator = createNetworkClusterValidator(); return validate(attachNetworkClusterValidator.networkBelongsToClusterDataCenter(getCluster(), getPersistedNetwork())) && validateAttachment(attachNetworkClusterValidator); } private AttachNetworkClusterValidator createNetworkClusterValidator() { return new AttachNetworkClusterValidator(interfaceDao, networkDao, vdsDao, getNetworkCluster()); } private boolean logicalNetworkExists() { if (getPersistedNetwork() != null) { return true; } addValidationMessage(EngineMessage.NETWORK_NOT_EXISTS); return false; } private boolean networkNotAttachedToCluster() { if (networkExists()) { return failValidation(EngineMessage.NETWORK_ALREADY_ATTACHED_TO_CLUSTER); } return true; } private boolean networkExists() { return networkClusterDao.get(getNetworkCluster().getId()) != null; } private boolean clusterExists() { if (!clusterInDb()) { addValidationMessage(EngineMessage.VDS_CLUSTER_IS_NOT_VALID); return false; } return true; } private boolean clusterInDb() { return getCluster() != null; } private void attachNetwork(Guid clusterId, NetworkCluster networkClusterFromUserRequest, Network network) { networkClusterDao.save(new NetworkCluster(clusterId, network.getId(), NetworkStatus.OPERATIONAL, false, networkClusterFromUserRequest.isRequired(), false, false, false, false)); List<VDS> hosts = vdsDao.getAllForCluster(clusterId); List<Network> networksOfCluster = networkDao.getAllForCluster(clusterId); for (VDS host : hosts) { HostNetworkAttachmentsPersister persister = new HostNetworkAttachmentsPersister(this.networkAttachmentDao, host.getId(), interfaceDao.getAllInterfacesForVds(host.getId()), Collections.emptyList(), networksOfCluster); persister.persistNetworkAttachments(); } if (network.getCluster().isDisplay()) { final DisplayNetworkClusterHelper displayNetworkClusterHelper = new DisplayNetworkClusterHelper( networkClusterDao, vmDao, clusterDao, networkClusterFromUserRequest, network.getName(), auditLogDirector); if (displayNetworkClusterHelper.isDisplayToBeUpdated()) { displayNetworkClusterHelper.warnOnActiveVm(); } networkClusterDao.setNetworkExclusivelyAsDisplay(clusterId, network.getId()); } if (network.getCluster().isMigration()) { networkClusterDao.setNetworkExclusivelyAsMigration(clusterId, network.getId()); } if (network.getCluster().isGluster()) { networkClusterDao.setNetworkExclusivelyAsGluster(clusterId, network.getId()); } if (network.getCluster().isDefaultRoute()) { networkClusterDao.setNetworkExclusivelyAsDefaultRoute(clusterId, network.getId()); } networkClusterHelper.setStatus(clusterId, network); } @Override protected String getDescription() { String networkName = getNetworkName() == null ? "" : getNetworkName(); String clusterName = getCluster() == null ? "" : getCluster().getName(); return networkName + " - " + clusterName; } @Override protected void setActionMessageParameters() { addValidationMessage(EngineMessage.VAR__TYPE__NETWORK); addValidationMessage(EngineMessage.VAR__ACTION__ATTACH); } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.NETWORK_ATTACH_NETWORK_TO_CLUSTER : AuditLogType.NETWORK_ATTACH_NETWORK_TO_CLUSTER_FAILED; } }