Yevgeny Zaspitsky has uploaded a new change for review. Change subject: engine: Refactor AttachNetworksToClusterCommand ......................................................................
engine: Refactor AttachNetworksToClusterCommand Make network management network attacments be processed first. Refactor AttachNetworkToVdsGroupCommand: split the command into 2 internal commands: * AttachNetworkToClusterCommand * PropagateLabeledNetworksToClusterHostsCommand Now AttachNetworkToVdsGroupCommand and AttachNetworksToClusterCommand are implemented as a compositions of the 2 internal ones. Change-Id: I6a0b86d8bb018a6172891cb357a4402cfef135d1 Signed-off-by: Yevgeny Zaspitsky <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworksToClusterCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/PropagateLabeledNetworksToClusterHostsCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparator.java R backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommandTest.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparatorTest.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java 9 files changed, 600 insertions(+), 360 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/84/33684/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommand.java new file mode 100644 index 0000000..f537641 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommand.java @@ -0,0 +1,233 @@ +package org.ovirt.engine.core.bll.network.cluster; + +import java.util.ArrayList; +import java.util.List; + +import org.ovirt.engine.core.bll.InternalCommandAttribute; +import org.ovirt.engine.core.bll.VdsGroupCommandBase; +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.FeatureSupported; +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter; +import org.ovirt.engine.core.common.businessentities.ActionGroup; +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.VdcBllMessages; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirectorDelegator; +import org.ovirt.engine.core.dao.VmDAO; +import org.ovirt.engine.core.dao.network.NetworkClusterDao; + +@InternalCommandAttribute +public class AttachNetworkToClusterCommand<T extends AttachNetworkToVdsGroupParameter> extends VdsGroupCommandBase<T> { + + private Network persistedNetwork; + + public AttachNetworkToClusterCommand(T parameters) { + super(parameters); + setVdsGroupId(parameters.getVdsGroupId()); + } + + @Override + protected void executeCommand() { + + attachNetwork(getVdsGroupId(), getNetworkCluster(), getNetwork()); + + setSucceeded(true); + } + + @Override + protected boolean canDoAction() { + return networkNotAttachedToCluster() + && vdsGroupExists() + && changesAreClusterCompatible() + && logicalNetworkExists() + && validateAttachment(); + } + + private boolean validateAttachment() { + NetworkClusterValidator validator = + new NetworkClusterValidator(getNetworkCluster(), getVdsGroup().getcompatibility_version()); + return (validate(validator.managementNetworkAttachment(getNetwork()))) + && validate(validator.managementNetworkChange(null)) + && validate(validator.migrationPropertySupported()) + && (!getPersistedNetwork().isExternal() || validateExternalNetwork(validator)); + } + + private boolean validateExternalNetwork(NetworkClusterValidator validator) { + return validate(validator.externalNetworkSupported()) + && validate(validator.externalNetworkNotDisplay(getNetworkName())) + && validate(validator.externalNetworkNotRequired(getNetworkName())); + } + + private boolean logicalNetworkExists() { + if (getPersistedNetwork() != null) { + return true; + } + + addCanDoActionMessage(VdcBllMessages.NETWORK_NOT_EXISTS); + return false; + } + + private boolean changesAreClusterCompatible() { + if (getParameters().getNetwork().isVmNetwork() == false) { + if (!FeatureSupported.nonVmNetwork(getVdsGroup().getcompatibility_version())) { + addCanDoActionMessage(VdcBllMessages.NON_VM_NETWORK_NOT_SUPPORTED_FOR_POOL_LEVEL); + return false; + } + } + return true; + } + + private boolean networkNotAttachedToCluster() { + if (networkExists()) { + return failCanDoAction(VdcBllMessages.NETWORK_ALREADY_ATTACHED_TO_CLUSTER); + } + + return true; + } + + private boolean networkExists() { + return getNetworkClusterDAO().get(getNetworkCluster().getId()) != null; + } + + private boolean vdsGroupExists() { + if (!vdsGroupInDb()) { + addCanDoActionMessage(VdcBllMessages.VDS_CLUSTER_IS_NOT_VALID); + return false; + } + return true; + } + + private boolean vdsGroupInDb() { + return getVdsGroup() != null; + } + + private void attachNetwork(Guid clusterId, NetworkCluster networkCluster, Network network) { + getNetworkClusterDao().save(new NetworkCluster(clusterId, network.getId(), + NetworkStatus.OPERATIONAL, + false, + networkCluster.isRequired(), + false, + false)); + + if (network.getCluster().isDisplay()) { + final DisplayNetworkClusterHelper displayNetworkClusterHelper = new DisplayNetworkClusterHelper( + getNetworkClusterDao(), + getVmDao(), + networkCluster, + network.getName(), + AuditLogDirectorDelegator.getInstance()); + if (displayNetworkClusterHelper.isDisplayToBeUpdated()) { + displayNetworkClusterHelper.warnOnActiveVm(); + } + + getNetworkClusterDao().setNetworkExclusivelyAsDisplay(clusterId, network.getId()); + } + + if (network.getCluster().isMigration()) { + getNetworkClusterDao().setNetworkExclusivelyAsMigration(clusterId, network.getId()); + } + + NetworkClusterHelper.setStatus(clusterId, network); + } + + private Network getNetwork() { + return getParameters().getNetwork(); + } + + private String getNetworkName() { + return getPersistedNetwork() == null ? null : getPersistedNetwork().getName(); + } + + @Override + protected String getDescription() { + String networkName = getNetworkName() == null ? "" : getNetworkName(); + String clusterName = getVdsGroup() == null ? "" : getVdsGroup().getName(); + return networkName + " - " + clusterName; + } + + @Override + protected void setActionMessageParameters() { + addCanDoActionMessage(VdcBllMessages.VAR__TYPE__NETWORK); + addCanDoActionMessage(VdcBllMessages.VAR__ACTION__ATTACH); + } + + private Network getPersistedNetwork() { + if (persistedNetwork == null) { + persistedNetwork = getNetworkDAO().get(getNetworkCluster().getNetworkId()); + } + return persistedNetwork; + } + + private NetworkCluster getNetworkCluster() { + return getParameters().getNetworkCluster(); + } + + @Override + public AuditLogType getAuditLogTypeValue() { + return getSucceeded() ? AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP + : AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP_FAILED; + } + + @Override + public List<PermissionSubject> getPermissionCheckSubjects() { + List<PermissionSubject> permissions = new ArrayList<PermissionSubject>(); + + Guid networkId = getNetworkCluster() == null ? null : getNetworkCluster().getNetworkId(); + // require permissions on network + permissions.add(new PermissionSubject(networkId, + VdcObjectType.Network, + getActionType().getActionGroup())); + + // require permissions on cluster the network is attached to + if (networkExists(getVdsGroupId(), getNetworkCluster())) { + permissions.add(new PermissionSubject(getParameters().getVdsGroupId(), + VdcObjectType.VdsGroups, + ActionGroup.CONFIGURE_CLUSTER_NETWORK)); + } + return permissions; + } + + /** + * Checks the user has permissions either on Network or on Cluster for this action. + */ + @Override + protected boolean checkPermissions(final List<PermissionSubject> permSubjects) { + List<String> messages = new ArrayList<String>(); + + for (PermissionSubject permSubject : permSubjects) { + messages.clear(); + if (checkSinglePermission(permSubject, messages)) { + return true; + } + } + + getReturnValue().getCanDoActionMessages().addAll(messages); + return false; + } + + private boolean networkExists(Guid clusterId, NetworkCluster networkCluster) { + List<NetworkCluster> networks = getNetworkClusterDao().getAllForCluster(clusterId); + for (NetworkCluster nc : networks) { + if (nc.getNetworkId().equals(networkCluster.getNetworkId())) { + return true; + } + } + + return false; + } + + private NetworkClusterDao getNetworkClusterDao() { + return DbFacade.getInstance().getNetworkClusterDao(); + } + + private VmDAO getVmDao() { + return DbFacade.getInstance().getVmDao(); + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommand.java index 75e8ce6..a0eac16 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommand.java @@ -1,267 +1,59 @@ package org.ovirt.engine.core.bll.network.cluster; import java.util.ArrayList; -import java.util.List; -import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.VdsGroupCommandBase; -import org.ovirt.engine.core.bll.network.AddNetworkParametersBuilder; -import org.ovirt.engine.core.bll.network.NetworkParametersBuilder; -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.FeatureSupported; -import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; -import org.ovirt.engine.core.common.businessentities.ActionGroup; -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.businessentities.network.VdsNetworkInterface; -import org.ovirt.engine.core.common.errors.VdcBllMessages; -import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.core.dal.dbbroker.DbFacade; -import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirectorDelegator; -import org.ovirt.engine.core.dao.VmDAO; -import org.ovirt.engine.core.dao.network.NetworkClusterDao; -import org.ovirt.engine.core.utils.NetworkUtils; -import org.ovirt.engine.core.utils.transaction.TransactionMethod; -import org.ovirt.engine.core.utils.transaction.TransactionSupport; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; +import org.ovirt.engine.core.compat.TransactionScopeOption; -@NonTransactiveCommandAttribute -public class AttachNetworkToVdsGroupCommand<T extends AttachNetworkToVdsGroupParameter> extends - VdsGroupCommandBase<T> { +public class AttachNetworkToVdsGroupCommand<T extends AttachNetworkToVdsGroupParameter> extends VdsGroupCommandBase<T> { - private Network persistedNetwork; + public AttachNetworkToVdsGroupCommand(T parameters, CommandContext cmdContext) { + super(parameters, cmdContext); + } - public AttachNetworkToVdsGroupCommand(T parameters) { + protected AttachNetworkToVdsGroupCommand(T parameters) { super(parameters); - setVdsGroupId(parameters.getVdsGroupId()); - } - - private Network getNetwork() { - return getParameters().getNetwork(); - } - - public String getNetworkName() { - return getPersistedNetwork() == null ? null : getPersistedNetwork().getName(); - } - - @Override - protected String getDescription() { - String networkName = getNetworkName() == null ? "" : getNetworkName(); - String clusterName = getVdsGroup() == null ? "" : getVdsGroup().getName(); - return networkName + " - " + clusterName; - } - - @Override - protected void setActionMessageParameters() { - addCanDoActionMessage(VdcBllMessages.VAR__TYPE__NETWORK); - addCanDoActionMessage(VdcBllMessages.VAR__ACTION__ATTACH); } @Override protected void executeCommand() { - TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { + final T parameters = getParameters(); - @Override - public Void runInTransaction() { - attachNetwork(getVdsGroupId(), getNetworkCluster(), getNetwork()); - return null; - } - }); + parameters.setTransactionScopeOption(TransactionScopeOption.Required); + parameters.setCompensationEnabled(false); - if (!getPersistedNetwork().isExternal() && NetworkUtils.isLabeled(getPersistedNetwork()) - && NetworkHelper.setupNetworkSupported(getVdsGroup().getcompatibility_version())) { - addNetworkToHosts(); - } + final VdcReturnValueBase returnValue = + getBackend().runInternalAction(VdcActionType.AttachNetworkToVdsGroup, parameters); - setSucceeded(true); - } + final boolean attachSucceed = returnValue.getSucceeded(); + setSucceeded(attachSucceed); - private void addNetworkToHosts() { - List<VdsNetworkInterface> nics = - getDbFacade().getInterfaceDao().getAllInterfacesByLabelForCluster(getParameters().getVdsGroupId(), - getPersistedNetwork().getLabel()); - AddNetworkParametersBuilder builder = new AddNetworkParametersBuilder(getPersistedNetwork(), getContext()); - ArrayList<VdcActionParametersBase> parameters = builder.buildParameters(nics); - - if (!parameters.isEmpty()) { - NetworkParametersBuilder.updateParametersSequencing(parameters); - runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, parameters); + if (attachSucceed) { + attachLabeledNetworks(); } } - @Override - protected boolean canDoAction() { - return networkNotAttachedToCluster() - && vdsGroupExists() - && changesAreClusterCompatible() - && logicalNetworkExists() - && validateAttachment(); + private void attachLabeledNetworks() { + final T parameters = getParameters(); + + parameters.setTransactionScopeOption(TransactionScopeOption.Suppress); + parameters.setCompensationEnabled(false); + + // AttachLabeledNetworks should be run asynchronously + runInternalMultipleActions(VdcActionType.PropagateLabeledNetworksToClusterHosts, + createParametersArrayList(parameters)); } - private boolean validateAttachment() { - NetworkClusterValidator validator = - new NetworkClusterValidator(getNetworkCluster(), getVdsGroup().getcompatibility_version()); - return (validate(validator.managementNetworkAttachment(getNetwork()))) - && validate(validator.managementNetworkChange(null)) - && validate(validator.migrationPropertySupported()) - && (!getPersistedNetwork().isExternal() || validateExternalNetwork(validator)); - } + private ArrayList<VdcActionParametersBase> createParametersArrayList(final T parameters) { + final ArrayList<VdcActionParametersBase> resultList = new ArrayList<>(); + resultList.add(parameters); - private boolean validateExternalNetwork(NetworkClusterValidator validator) { - return validate(validator.externalNetworkSupported()) - && validate(validator.externalNetworkNotDisplay(getNetworkName())) - && validate(validator.externalNetworkNotRequired(getNetworkName())); - } - - private boolean logicalNetworkExists() { - if (getPersistedNetwork() != null) { - return true; - } - - addCanDoActionMessage(VdcBllMessages.NETWORK_NOT_EXISTS); - return false; - } - - private Network getPersistedNetwork() { - if (persistedNetwork == null) { - persistedNetwork = getNetworkDAO().get(getNetworkCluster().getNetworkId()); - } - return persistedNetwork; - } - - private boolean changesAreClusterCompatible() { - if (getParameters().getNetwork().isVmNetwork() == false) { - if (!FeatureSupported.nonVmNetwork(getVdsGroup().getcompatibility_version())) { - addCanDoActionMessage(VdcBllMessages.NON_VM_NETWORK_NOT_SUPPORTED_FOR_POOL_LEVEL); - return false; - } - } - return true; - } - - private boolean networkNotAttachedToCluster() { - if (networkExists()) { - return failCanDoAction(VdcBllMessages.NETWORK_ALREADY_ATTACHED_TO_CLUSTER); - } - - return true; - } - - private boolean networkExists() { - return getNetworkClusterDAO().get(getNetworkCluster().getId()) != null; - } - - - private boolean vdsGroupExists() { - if (!vdsGroupInDb()) { - addCanDoActionMessage(VdcBllMessages.VDS_CLUSTER_IS_NOT_VALID); - return false; - } - return true; - } - - private boolean vdsGroupInDb() { - return getVdsGroup() != null; - } - - private NetworkCluster getNetworkCluster() { - return getParameters().getNetworkCluster(); - } - - @Override - public AuditLogType getAuditLogTypeValue() { - return getSucceeded() ? AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP - : AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP_FAILED; - } - - @Override - public List<PermissionSubject> getPermissionCheckSubjects() { - List<PermissionSubject> permissions = new ArrayList<PermissionSubject>(); - - Guid networkId = getNetworkCluster() == null ? null : getNetworkCluster().getNetworkId(); - // require permissions on network - permissions.add(new PermissionSubject(networkId, - VdcObjectType.Network, - getActionType().getActionGroup())); - - // require permissions on cluster the network is attached to - if (networkExists(getVdsGroupId(), getNetworkCluster())) { - permissions.add(new PermissionSubject(getParameters().getVdsGroupId(), - VdcObjectType.VdsGroups, - ActionGroup.CONFIGURE_CLUSTER_NETWORK)); - } - return permissions; - } - - /** - * Checks the user has permissions either on Network or on Cluster for this action. - */ - @Override - protected boolean checkPermissions(final List<PermissionSubject> permSubjects) { - List<String> messages = new ArrayList<String>(); - - for (PermissionSubject permSubject : permSubjects) { - messages.clear(); - if (checkSinglePermission(permSubject, messages)) { - return true; - } - } - - getReturnValue().getCanDoActionMessages().addAll(messages); - return false; - } - - public static void attachNetwork(Guid clusterId, NetworkCluster networkCluster, Network network) { - getNetworkClusterDao().save(new NetworkCluster(clusterId, network.getId(), - NetworkStatus.OPERATIONAL, - false, - networkCluster.isRequired(), - false, - false)); - - if (network.getCluster().isDisplay()) { - final DisplayNetworkClusterHelper displayNetworkClusterHelper = new DisplayNetworkClusterHelper( - getNetworkClusterDao(), - getVmDao(), - networkCluster, - network.getName(), - AuditLogDirectorDelegator.getInstance()); - if (displayNetworkClusterHelper.isDisplayToBeUpdated()) { - displayNetworkClusterHelper.warnOnActiveVm(); - } - - getNetworkClusterDao().setNetworkExclusivelyAsDisplay(clusterId, network.getId()); - } - - if (network.getCluster().isMigration()) { - getNetworkClusterDao().setNetworkExclusivelyAsMigration(clusterId, network.getId()); - } - - NetworkClusterHelper.setStatus(clusterId, network); - } - - private static boolean networkExists(Guid clusterId, NetworkCluster networkCluster) { - List<NetworkCluster> networks = getNetworkClusterDao().getAllForCluster(clusterId); - for (NetworkCluster nc : networks) { - if (nc.getNetworkId().equals(networkCluster.getNetworkId())) { - return true; - } - } - - return false; - } - - private static NetworkClusterDao getNetworkClusterDao() { - return DbFacade.getInstance().getNetworkClusterDao(); - } - - private static VmDAO getVmDao() { - return DbFacade.getInstance().getVmDao(); + return resultList; } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworksToClusterCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworksToClusterCommand.java index b644041..b625a79 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworksToClusterCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworksToClusterCommand.java @@ -2,35 +2,29 @@ import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; +import java.util.Comparator; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; import org.ovirt.engine.core.bll.InternalCommandAttribute; import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.VdsGroupCommandBase; import org.ovirt.engine.core.bll.context.CommandContext; -import org.ovirt.engine.core.bll.network.AddNetworksByLabelParametersBuilder; -import org.ovirt.engine.core.bll.network.NetworkParametersBuilder; -import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter; import org.ovirt.engine.core.common.action.ClusterNetworksParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; -import org.ovirt.engine.core.common.businessentities.network.Network; -import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; -import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.utils.transaction.TransactionMethod; import org.ovirt.engine.core.utils.transaction.TransactionSupport; @InternalCommandAttribute @NonTransactiveCommandAttribute -public class AttachNetworksToClusterCommand<T extends ClusterNetworksParameters> extends VdsGroupCommandBase<T> { +public final class AttachNetworksToClusterCommand<T extends ClusterNetworksParameters> extends VdsGroupCommandBase<T> { - public AttachNetworksToClusterCommand(T parameters) { + private static final Comparator<AttachNetworkToVdsGroupParameter> setManagementNetworkFirstParameterComparator = + new SetManagementNetworkFirstParameterComparator<>(); + + protected AttachNetworksToClusterCommand(T parameters) { super(parameters); } @@ -40,69 +34,63 @@ @Override protected void executeCommand() { - TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { + + final boolean attachNetworksToClusterResult = attachNetworksToCluster(); + + setSucceeded(attachNetworksToClusterResult); + + // PropagateLabeledNetworksToClusterHosts should be run asynchronously + runInternalMultipleActions(VdcActionType.PropagateLabeledNetworksToClusterHosts, + wrapParametersWithList(getParameters())); + } + + private ArrayList<VdcActionParametersBase> wrapParametersWithList(T parameters) { + final ArrayList<VdcActionParametersBase> resultList = new ArrayList<>(1); + resultList.add(parameters); + return resultList; + } + + /** + * Updates the engine DB with the new network attachments. + * + * @return <code>true</code> on success otherwise <code>false</code>. + */ + private boolean attachNetworksToCluster() { + final List<AttachNetworkToVdsGroupParameter> clusterNetworksParameters = + getParameters().getClusterNetworksParameters(); + + Collections.sort(clusterNetworksParameters, setManagementNetworkFirstParameterComparator); + + return runInternalActionsSequentiallyAndTransactionally( + VdcActionType.AttachNetworkToCluster, + clusterNetworksParameters); + } + + /** + * Sequentially runs an internal action defined by actionType multiple times in a single new transaction. Upon + * success of all actions commits the changes, otherwise marks the transaction to be rolled back. + * + * @param actionType + * the action type to be run + * @param parameters + * parameters list. The size of the {@link List} defines the number of iteration on the action. + * @return <code>TRUE</code> on success otherwise <code>FALSE</code>. + */ + private <P extends VdcActionParametersBase> boolean runInternalActionsSequentiallyAndTransactionally(final VdcActionType actionType, + final List<P> parameters) { + return TransactionSupport.executeInNewTransaction(new TransactionMethod<Boolean>() { @Override - public Void runInTransaction() { - for (AttachNetworkToVdsGroupParameter param : getParameters().getClusterNetworksParameters()) { - AttachNetworkToVdsGroupCommand.attachNetwork(param.getVdsGroupId(), - param.getNetworkCluster(), - param.getNetwork()); + public Boolean runInTransaction() { + for (P param : parameters) { + final VdcReturnValueBase executionResult = runInternalAction(actionType, param); + if (!executionResult.getSucceeded()) { + TransactionSupport.setRollbackOnly(); + return Boolean.FALSE; + } } - - return null; + return Boolean.TRUE; } }); - - if (NetworkHelper.setupNetworkSupported(getVdsGroup().getcompatibility_version())) { - Set<Network> networks = new HashSet<>(); - Map<Guid, List<Network>> networksByHost = new HashMap<>(); - Map<Guid, Map<String, VdsNetworkInterface>> labelsToNicsByHost = new HashMap<>(); - - for (AttachNetworkToVdsGroupParameter param : getParameters().getClusterNetworksParameters()) { - networks.add(getNetworkDAO().get(param.getNetworkCluster().getNetworkId())); - } - - for (Network network : networks) { - List<VdsNetworkInterface> nics = - getDbFacade().getInterfaceDao().getAllInterfacesByLabelForCluster(getVdsGroupId(), - network.getLabel()); - - for (VdsNetworkInterface nic : nics) { - if (!networksByHost.containsKey(nic.getVdsId())) { - networksByHost.put(nic.getVdsId(), new ArrayList<Network>()); - labelsToNicsByHost.put(nic.getVdsId(), new HashMap<String, VdsNetworkInterface>()); - } - - labelsToNicsByHost.get(nic.getVdsId()).put(network.getLabel(), nic); - networksByHost.get(nic.getVdsId()).add(network); - } - } - - if (!networksByHost.isEmpty()) { - configureNetworksOnHosts(networksByHost, labelsToNicsByHost); - } - } - - setSucceeded(true); - } - - private void configureNetworksOnHosts(Map<Guid, List<Network>> networksByHost, - Map<Guid, Map<String, VdsNetworkInterface>> labelsToNicsByHost) { - ArrayList<VdcActionParametersBase> parameters = new ArrayList<>(); - for (Entry<Guid, List<Network>> entry : networksByHost.entrySet()) { - AddNetworksByLabelParametersBuilder builder = new AddNetworksByLabelParametersBuilder(getContext()); - parameters.add(builder.buildParameters(entry.getKey(), - entry.getValue(), - labelsToNicsByHost.get(entry.getKey()))); - } - - NetworkParametersBuilder.updateParametersSequencing(parameters); - runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, parameters); - } - - @Override - public List<PermissionSubject> getPermissionCheckSubjects() { - return Collections.emptyList(); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/PropagateLabeledNetworksToClusterHostsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/PropagateLabeledNetworksToClusterHostsCommand.java new file mode 100644 index 0000000..fe4a619 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/PropagateLabeledNetworksToClusterHostsCommand.java @@ -0,0 +1,99 @@ +package org.ovirt.engine.core.bll.network.cluster; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.ovirt.engine.core.bll.InternalCommandAttribute; +import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; +import org.ovirt.engine.core.bll.VdsGroupCommandBase; +import org.ovirt.engine.core.bll.context.CommandContext; +import org.ovirt.engine.core.bll.network.AddNetworksByLabelParametersBuilder; +import org.ovirt.engine.core.bll.network.NetworkParametersBuilder; +import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter; +import org.ovirt.engine.core.common.action.ClusterNetworksParameters; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.network.Network; +import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; +import org.ovirt.engine.core.compat.Guid; + +@InternalCommandAttribute +@NonTransactiveCommandAttribute +public class PropagateLabeledNetworksToClusterHostsCommand<T extends ClusterNetworksParameters> extends + VdsGroupCommandBase<T> { + + public PropagateLabeledNetworksToClusterHostsCommand(T parameters) { + super(parameters); + } + + public PropagateLabeledNetworksToClusterHostsCommand(T parameters, CommandContext cmdContext) { + super(parameters, cmdContext); + } + + @Override + protected void executeCommand() { + + if (NetworkHelper.setupNetworkSupported(getVdsGroup().getcompatibility_version())) { + final Map<Guid, List<Network>> networksByHost = new HashMap<>(); + final Map<Guid, Map<String, VdsNetworkInterface>> labelsToNicsByHost = new HashMap<>(); + + for (Network network : getNetworks()) { + List<VdsNetworkInterface> nics = getInterfaceDao().getAllInterfacesByLabelForCluster( + getVdsGroupId(), + network.getLabel()); + + for (VdsNetworkInterface nic : nics) { + if (!networksByHost.containsKey(nic.getVdsId())) { + networksByHost.put(nic.getVdsId(), new ArrayList<Network>()); + labelsToNicsByHost.put(nic.getVdsId(), new HashMap<String, VdsNetworkInterface>()); + } + + labelsToNicsByHost.get(nic.getVdsId()).put(network.getLabel(), nic); + networksByHost.get(nic.getVdsId()).add(network); + } + } + + if (!networksByHost.isEmpty()) { + configureNetworksOnHosts(networksByHost, labelsToNicsByHost); + } + } + + setSucceeded(true); + } + + private Set<Network> getNetworks() { + final Set<Network> networks = new HashSet<>(); + for (AttachNetworkToVdsGroupParameter param : getParameters().getClusterNetworksParameters()) { + networks.add(getNetworkDAO().get(param.getNetworkCluster().getNetworkId())); + } + + return networks; + } + + private void configureNetworksOnHosts(Map<Guid, List<Network>> networksByHost, + Map<Guid, Map<String, VdsNetworkInterface>> labelsToNicsByHost) { + ArrayList<VdcActionParametersBase> parameters = new ArrayList<>(); + for (Entry<Guid, List<Network>> entry : networksByHost.entrySet()) { + AddNetworksByLabelParametersBuilder builder = new AddNetworksByLabelParametersBuilder(getContext()); + final Guid hostId = entry.getKey(); + final List<Network> networks = entry.getValue(); + final Map<String, VdsNetworkInterface> nicsByLabel = labelsToNicsByHost.get(hostId); + parameters.add(builder.buildParameters(hostId, networks, nicsByLabel)); + } + + NetworkParametersBuilder.updateParametersSequencing(parameters); + runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, parameters); + } + + @Override + public List<PermissionSubject> getPermissionCheckSubjects() { + return Collections.emptyList(); + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparator.java new file mode 100644 index 0000000..5f14300 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparator.java @@ -0,0 +1,37 @@ +package org.ovirt.engine.core.bll.network.cluster; + +import static org.apache.commons.lang.BooleanUtils.toInteger; + +import java.util.Comparator; + +import javax.inject.Singleton; + +import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter; +import org.ovirt.engine.core.common.businessentities.network.Network; +import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; + +@Singleton +final class SetManagementNetworkFirstParameterComparator<T extends AttachNetworkToVdsGroupParameter> implements + Comparator<T> { + @Override + public int compare(T param1, T param2) { + final boolean management1 = isManagementNetworkAppointmentCommand(param1); + final boolean management2 = isManagementNetworkAppointmentCommand(param2); + + return toInteger(management2) - toInteger(management1); + } + + private boolean isManagementNetworkAppointmentCommand(T param) { + final Network network = param.getNetwork(); + if (network == null) { + return false; + } + + final NetworkCluster networkCluster = network.getCluster(); + if (networkCluster == null) { + return false; + } + + return networkCluster.isManagement(); + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommandTest.java similarity index 69% rename from backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommandTest.java rename to backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommandTest.java index ef38b76..573039a 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommandTest.java @@ -23,6 +23,8 @@ import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dal.dbbroker.DbFacadeLocator; import org.ovirt.engine.core.dao.VdsGroupDAO; import org.ovirt.engine.core.dao.network.NetworkClusterDao; import org.ovirt.engine.core.dao.network.NetworkDao; @@ -30,37 +32,51 @@ import org.springframework.dao.DataIntegrityViolationException; @RunWith(MockitoJUnitRunner.class) -public class AttachNetworkToVdsGroupCommandTest { +public class AttachNetworkToClusterCommandTest { - private VDSGroup existingGroup = new VDSGroup(); - private Network network = createNetwork(); - private AttachNetworkToVdsGroupParameter param; - private AttachNetworkToVdsGroupCommand<AttachNetworkToVdsGroupParameter> command; + @Mock + private DbFacade mockDbFacade; + + @Mock + private NetworkClusterDao mockNetworkClusterDao; + + @Mock + private VdsGroupDAO mockVdsGroupDAO; + + @Mock + private NetworkDao mockNetworkDao; + + private AttachNetworkToClusterCommand<AttachNetworkToVdsGroupParameter> underTest; @Rule public MockConfigRule mcr = new MockConfigRule( MockConfigRule.mockConfig(ConfigValues.DefaultManagementNetwork, "mgmt")); - @Mock - NetworkClusterDao networkClusterDAO; - - @Mock - VdsGroupDAO vdsGroupDAO; - - @Mock - NetworkDao networkDao; + private VDSGroup existingGroup = new VDSGroup(); + private Network network = createNetwork(); + private AttachNetworkToVdsGroupParameter param; @Before public void setup() { + initializeDbFacadeMocks(); existingGroup.setcompatibility_version(Version.v3_1); - createCommand(); + param = new AttachNetworkToVdsGroupParameter(getExistingVdsGroupId(), getNetwork()); + + underTest = new AttachNetworkToClusterCommand<AttachNetworkToVdsGroupParameter>(param); + } + + private void initializeDbFacadeMocks() { + DbFacadeLocator.setDbFacade(mockDbFacade); + when(mockDbFacade.getNetworkDao()).thenReturn(mockNetworkDao); + when(mockDbFacade.getNetworkClusterDao()).thenReturn(mockNetworkClusterDao); + when(mockDbFacade.getVdsGroupDao()).thenReturn(mockVdsGroupDAO); } @Test public void networkExists() { simulateVdsGroupExists(); - when(networkDao.get(any(Guid.class))).thenReturn(getNetwork()); - when(networkClusterDAO.get(param.getNetworkCluster().getId())).thenReturn(param.getNetworkCluster()); + when(mockNetworkDao.get(any(Guid.class))).thenReturn(getNetwork()); + when(mockNetworkClusterDao.get(param.getNetworkCluster().getId())).thenReturn(param.getNetworkCluster()); assertCanDoActionFailure(VdcBllMessages.NETWORK_ALREADY_ATTACHED_TO_CLUSTER.toString()); } @@ -89,32 +105,6 @@ return network; } - @SuppressWarnings("serial") - public void createCommand() { - param = new AttachNetworkToVdsGroupParameter(getExistingVdsGroupId(), getNetwork()); - - command = new AttachNetworkToVdsGroupCommand<AttachNetworkToVdsGroupParameter>(param) { - // Since the command isn't in the same package as AuditLogableBase which defines the DAO accessors they - // cannot be spied from here. - // Instead, will override them manually. - - @Override - public VdsGroupDAO getVdsGroupDAO() { - return vdsGroupDAO; - } - - @Override - protected NetworkClusterDao getNetworkClusterDAO() { - return networkClusterDAO; - } - - @Override - protected NetworkDao getNetworkDAO() { - return networkDao; - } - }; - } - private void simulateVdsGroupExists() { dbFacadeReturnVdsGroup(); } @@ -128,15 +118,15 @@ } private void dbFacadeReturnNoVdsGroup() { - when(vdsGroupDAO.get(any(Guid.class))).thenReturn(null); + when(mockVdsGroupDAO.get(any(Guid.class))).thenReturn(null); } private void dbFacadeReturnVdsGroup() { - when(vdsGroupDAO.get(any(Guid.class))).thenReturn(existingGroup); + when(mockVdsGroupDAO.get(any(Guid.class))).thenReturn(existingGroup); } private void dbFacadeThrowOnNetworkClusterSave() { - doThrow(new DataIntegrityViolationException("test violations")).when(networkClusterDAO) + doThrow(new DataIntegrityViolationException("test violations")).when(mockNetworkClusterDao) .save(Matchers.<NetworkCluster> any(NetworkCluster.class)); } @@ -149,18 +139,18 @@ } private void assertCanDoActionFailure(final String messageToVerify) { - assertFalse(command.canDoAction()); - assertTrue(command.getReturnValue().getCanDoActionMessages().contains(messageToVerify)); + assertFalse(underTest.canDoAction()); + assertTrue(underTest.getReturnValue().getCanDoActionMessages().contains(messageToVerify)); } private void assertExecuteActionFailure() { try { - command.executeCommand(); + underTest.executeCommand(); } catch (Exception expected) { // An exception is expected here } - assertFalse(command.getReturnValue().getSucceeded()); - assertEquals(AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP_FAILED, command.getAuditLogTypeValue()); + assertFalse(underTest.getReturnValue().getSucceeded()); + assertEquals(AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP_FAILED, underTest.getAuditLogTypeValue()); } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparatorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparatorTest.java new file mode 100644 index 0000000..9c71285 --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparatorTest.java @@ -0,0 +1,95 @@ +package org.ovirt.engine.core.bll.network.cluster; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.when; + +import java.util.Comparator; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter; +import org.ovirt.engine.core.common.businessentities.network.Network; +import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; + +@RunWith(MockitoJUnitRunner.class) +public class SetManagementNetworkFirstParameterComparatorTest { + + @Mock + private AttachNetworkToVdsGroupParameter mockAttachNetworkToVdsGroupParameter1; + @Mock + private AttachNetworkToVdsGroupParameter mockAttachNetworkToVdsGroupParameter2; + + @Mock + private Network mockNetwork1; + @Mock + private Network mockNetwork2; + + @Mock + private NetworkCluster mockNetworkCluster1; + @Mock + private NetworkCluster mockNetworkCluster2; + private Comparator<AttachNetworkToVdsGroupParameter> underTest; + + @Before + public void setup() { + underTest = new SetManagementNetworkFirstParameterComparator<>(); + } + + @Test + public void compareGt() { + testCompareNoNulls(false, true, 1); + } + + @Test + public void compareLt() { + testCompareNoNulls(true, false, -1); + } + + @Test + public void compareEq1() { + testCompareNoNulls(true, true, 0); + } + + @Test + public void compareEq2() { + testCompareNoNulls(false, false, 0); + } + + @Test + public void compareWithNulls1() { + assertEquals(0, underTest.compare(mockAttachNetworkToVdsGroupParameter1, mockAttachNetworkToVdsGroupParameter2)); + when(mockAttachNetworkToVdsGroupParameter1.getNetwork()).thenReturn(mockNetwork1); + assertEquals(0, underTest.compare(mockAttachNetworkToVdsGroupParameter1, mockAttachNetworkToVdsGroupParameter2)); + when(mockNetwork1.getCluster()).thenReturn(mockNetworkCluster1); + assertEquals(0, underTest.compare(mockAttachNetworkToVdsGroupParameter1, mockAttachNetworkToVdsGroupParameter2)); + when(mockNetworkCluster1.isManagement()).thenReturn(true); + assertEquals(-1, + underTest.compare(mockAttachNetworkToVdsGroupParameter1, mockAttachNetworkToVdsGroupParameter2)); + } + + @Test + public void compareWithNulls2() { + assertEquals(0, underTest.compare(mockAttachNetworkToVdsGroupParameter1, mockAttachNetworkToVdsGroupParameter2)); + when(mockAttachNetworkToVdsGroupParameter2.getNetwork()).thenReturn(mockNetwork2); + assertEquals(0, underTest.compare(mockAttachNetworkToVdsGroupParameter1, mockAttachNetworkToVdsGroupParameter2)); + when(mockNetwork2.getCluster()).thenReturn(mockNetworkCluster2); + assertEquals(0, underTest.compare(mockAttachNetworkToVdsGroupParameter1, mockAttachNetworkToVdsGroupParameter2)); + when(mockNetworkCluster2.isManagement()).thenReturn(true); + assertEquals(1, underTest.compare(mockAttachNetworkToVdsGroupParameter1, mockAttachNetworkToVdsGroupParameter2)); + } + + private void testCompareNoNulls(boolean management1, boolean management2, int expected) { + when(mockAttachNetworkToVdsGroupParameter1.getNetwork()).thenReturn(mockNetwork1); + when(mockAttachNetworkToVdsGroupParameter2.getNetwork()).thenReturn(mockNetwork2); + when(mockNetwork1.getCluster()).thenReturn(mockNetworkCluster1); + when(mockNetwork2.getCluster()).thenReturn(mockNetworkCluster2); + when(mockNetworkCluster1.isManagement()).thenReturn(management1); + when(mockNetworkCluster2.isManagement()).thenReturn(management2); + + assertEquals(expected, + underTest.compare(mockAttachNetworkToVdsGroupParameter1, mockAttachNetworkToVdsGroupParameter2)); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java index 0031b1a..a40fd23 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java @@ -110,6 +110,7 @@ UnlabelNetwork(164, ActionGroup.CONFIGURE_STORAGE_POOL_NETWORK, false, QuotaDependency.NONE), LabelNic(165, ActionGroup.CONFIGURE_HOST_NETWORK, false, QuotaDependency.NONE), UnlabelNic(166, ActionGroup.CONFIGURE_HOST_NETWORK, false, QuotaDependency.NONE), + PropagateLabeledNetworksToClusterHosts(167, false, QuotaDependency.NONE), // NUMA AddVmNumaNodes(170, ActionGroup.EDIT_VM_PROPERTIES, false, QuotaDependency.NONE), @@ -203,6 +204,7 @@ AddVdsGroup(704, ActionGroup.CREATE_CLUSTER, false, QuotaDependency.NONE), UpdateVdsGroup(705, ActionGroup.EDIT_CLUSTER_CONFIGURATION, false, QuotaDependency.NONE), RemoveVdsGroup(706, ActionGroup.DELETE_CLUSTER, false, QuotaDependency.NONE), + AttachNetworkToCluster(707, false, QuotaDependency.NONE), AttachNetworkToVdsGroup(708, ActionGroup.ASSIGN_CLUSTER_NETWORK, false, QuotaDependency.NONE), DetachNetworkToVdsGroup(709, ActionGroup.ASSIGN_CLUSTER_NETWORK, false, QuotaDependency.NONE), UpdateNetworkOnCluster(711, ActionGroup.CONFIGURE_CLUSTER_NETWORK, false, QuotaDependency.NONE), diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java index 3a7451e..467d174 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java @@ -45,6 +45,7 @@ import org.ovirt.engine.core.dao.VmTemplateDAO; import org.ovirt.engine.core.dao.gluster.GlusterHooksDao; import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; +import org.ovirt.engine.core.dao.network.InterfaceDao; import org.ovirt.engine.core.dao.network.NetworkClusterDao; import org.ovirt.engine.core.dao.network.NetworkDao; import org.ovirt.engine.core.dao.network.VmNetworkInterfaceDao; @@ -682,6 +683,9 @@ return getDbFacade().getNetworkDao(); } + protected InterfaceDao getInterfaceDao() { + return getDbFacade().getInterfaceDao(); + } public AsyncTaskDAO getAsyncTaskDao() { return getDbFacade().getAsyncTaskDao(); } -- To view, visit http://gerrit.ovirt.org/33684 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6a0b86d8bb018a6172891cb357a4402cfef135d1 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Yevgeny Zaspitsky <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
