Mike Kolesnik has uploaded a new change for review. Change subject: engine: Log mass network operations ......................................................................
engine: Log mass network operations Added logging of mass operations of networking commands so that each network change that causes update of the network on multiple hosts would output a log similar to: (7/11): Applying chages for network red on host vds1. Both start and end (successful or failed) are logged. Change-Id: Ie86bd5368052b4ed3bd18cff567c39daef911b31 Signed-off-by: Mike Kolesnik <mkole...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ChangeVDSClusterCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/AddNetworkParametersBuilder.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/NetworkParametersBuilder.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworkParametersBuilder.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/DetachNetworkToVdsGroupCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/LabelNicCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/PersistentSetupNetworksCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/UnlabelNicCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/PersistentSetupNetworksParameters.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java M backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties 14 files changed, 118 insertions(+), 16 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/49/23249/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ChangeVDSClusterCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ChangeVDSClusterCommand.java index 3ff94c0..1d4d3b0 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ChangeVDSClusterCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ChangeVDSClusterCommand.java @@ -231,6 +231,7 @@ @Override public void run() { + params.setShouldBeLogged(false); getBackend().runInternalAction(VdcActionType.PersistentSetupNetworks, params); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/AddNetworkParametersBuilder.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/AddNetworkParametersBuilder.java index 9cf8a46..9e0f342 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/AddNetworkParametersBuilder.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/AddNetworkParametersBuilder.java @@ -6,7 +6,7 @@ import java.util.Set; import org.ovirt.engine.core.common.AuditLogType; -import org.ovirt.engine.core.common.action.SetupNetworksParameters; +import org.ovirt.engine.core.common.action.PersistentSetupNetworksParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; @@ -30,7 +30,8 @@ boolean vlanNetwork = NetworkUtils.isVlan(network); for (VdsNetworkInterface nic : nics) { - SetupNetworksParameters setupNetworkParams = createSetupNetworksParameters(nic.getVdsId()); + PersistentSetupNetworksParameters setupNetworkParams = createSetupNetworksParameters(nic.getVdsId()); + setupNetworkParams.setNetworkName(network.getName()); VdsNetworkInterface nicToConfigure = getNicToConfigure(setupNetworkParams.getInterfaces(), nic.getId()); if (nicToConfigure == null) { throw new VdcBLLException(VdcBllErrors.LABELED_NETWORK_INTERFACE_NOT_FOUND); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/NetworkParametersBuilder.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/NetworkParametersBuilder.java index 020e2a1..684be02 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/NetworkParametersBuilder.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/NetworkParametersBuilder.java @@ -6,7 +6,8 @@ import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.common.AuditLogType; -import org.ovirt.engine.core.common.action.SetupNetworksParameters; +import org.ovirt.engine.core.common.action.PersistentSetupNetworksParameters; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; 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.NetworkBootProtocol; @@ -25,12 +26,16 @@ public NetworkParametersBuilder() { } - protected SetupNetworksParameters createSetupNetworksParameters(Guid hostId) { + protected PersistentSetupNetworksParameters createSetupNetworksParameters(Guid hostId) { VDS host = new VDS(); host.setId(hostId); NetworkConfigurator configurator = new NetworkConfigurator(host); List<VdsNetworkInterface> nics = configurator.filterBondsWithoutSlaves(getHostInterfaces(hostId)); - return configurator.createSetupNetworkParams(nics); + PersistentSetupNetworksParameters parameters = new PersistentSetupNetworksParameters(); + parameters.setVdsId(host.getId()); + parameters.setInterfaces(nics); + parameters.setCheckConnectivity(true); + return parameters; } private List<VdsNetworkInterface> getHostInterfaces(Guid hostId) { @@ -121,4 +126,13 @@ private DbFacade getDbFacade() { return DbFacade.getInstance(); } + + public static void updateParametersSequencing(List<VdcActionParametersBase> parameters) { + for (int i = 0; i < parameters.size(); i++) { + PersistentSetupNetworksParameters setupNetworkParameters = + (PersistentSetupNetworksParameters) parameters.get(i); + setupNetworkParameters.setSequence(i + 1); + setupNetworkParameters.setTotal(parameters.size()); + } + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworkParametersBuilder.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworkParametersBuilder.java index c1b24dc..15b5674 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworkParametersBuilder.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworkParametersBuilder.java @@ -6,7 +6,7 @@ import java.util.Set; import org.ovirt.engine.core.common.AuditLogType; -import org.ovirt.engine.core.common.action.SetupNetworksParameters; +import org.ovirt.engine.core.common.action.PersistentSetupNetworksParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; @@ -35,7 +35,8 @@ boolean vlanNetwork = NetworkUtils.isVlan(network); for (VdsNetworkInterface nic : nics) { - SetupNetworksParameters setupNetworkParams = createSetupNetworksParameters(nic.getVdsId()); + PersistentSetupNetworksParameters setupNetworkParams = createSetupNetworksParameters(nic.getVdsId()); + setupNetworkParams.setNetworkName(network.getName()); VdsNetworkInterface nicToConfigure = getNicToConfigure(setupNetworkParams.getInterfaces(), nic.getId()); if (nicToConfigure == null) { throw new VdcBLLException(VdcBllErrors.LABELED_NETWORK_INTERFACE_NOT_FOUND); 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 eaee236..6ef32a1 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 @@ -6,6 +6,7 @@ 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.utils.PermissionSubject; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.FeatureSupported; @@ -102,6 +103,7 @@ ArrayList<VdcActionParametersBase> parameters = builder.buildParameters(nics); if (!parameters.isEmpty()) { + NetworkParametersBuilder.updateParametersSequencing(parameters); getBackend().runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, parameters); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkToVdsGroupCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkToVdsGroupCommand.java index 897ee826..96b0600 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkToVdsGroupCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkToVdsGroupCommand.java @@ -7,6 +7,7 @@ import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.VdsGroupCommandBase; +import org.ovirt.engine.core.bll.network.NetworkParametersBuilder; import org.ovirt.engine.core.bll.network.RemoveNetworkParametersBuilder; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.validator.NetworkValidator; @@ -107,6 +108,7 @@ ArrayList<VdcActionParametersBase> parameters = builder.buildParameters(nics); if (!parameters.isEmpty()) { + NetworkParametersBuilder.updateParametersSequencing(parameters); getBackend().runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, parameters); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java index ae7b25b..964b48a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java @@ -24,7 +24,7 @@ import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddNetworkStoragePoolParameters; -import org.ovirt.engine.core.common.action.SetupNetworksParameters; +import org.ovirt.engine.core.common.action.PersistentSetupNetworksParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.VM; @@ -84,6 +84,7 @@ ArrayList<VdcActionParametersBase> parameters = builder.buildParameters(getNetwork(), getOldNetwork()); if (!parameters.isEmpty()) { + NetworkParametersBuilder.updateParametersSequencing(parameters); getBackend().runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, parameters); } } @@ -419,7 +420,8 @@ } for (Guid hostId : hostIdsToSync) { - SetupNetworksParameters setupNetworkParams = createSetupNetworksParameters(hostId); + PersistentSetupNetworksParameters setupNetworkParams = createSetupNetworksParameters(hostId); + setupNetworkParams.setNetworkName(getNetworkName()); setupNetworkParams.setNetworksToSync(Collections.singletonList(getNetworkName())); parameters.add(setupNetworkParams); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/LabelNicCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/LabelNicCommand.java index 35fb57c..f716195 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/LabelNicCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/LabelNicCommand.java @@ -40,11 +40,14 @@ @Override protected void executeCommand() { + SetupNetworksParameters parameters = new AddNetworksByLabelParametersBuilder().buildParameters(getNic(), + getLabel(), + getClusterNetworksByLabel()); + parameters.setShouldBeLogged(false); + VdcReturnValueBase result = getBackend().runInternalAction(VdcActionType.PersistentSetupNetworks, - new AddNetworksByLabelParametersBuilder().buildParameters(getNic(), - getLabel(), - getClusterNetworksByLabel())); + parameters); if (result.getSucceeded()) { getReturnValue().setActionReturnValue(getLabel()); } else { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/PersistentSetupNetworksCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/PersistentSetupNetworksCommand.java index 8bce18c..222cfea 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/PersistentSetupNetworksCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/PersistentSetupNetworksCommand.java @@ -2,18 +2,32 @@ import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.VdsCommand; -import org.ovirt.engine.core.common.action.SetupNetworksParameters; +import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.action.PersistentSetupNetworksParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.action.VdsActionParameters; import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; @NonTransactiveCommandAttribute -public class PersistentSetupNetworksCommand<T extends SetupNetworksParameters> extends VdsCommand<T> { +public class PersistentSetupNetworksCommand<T extends PersistentSetupNetworksParameters> extends VdsCommand<T> { public PersistentSetupNetworksCommand(T parameters) { super(parameters); setVdsId(parameters.getVdsId()); + } + + public int getSequence() { + return getParameters().getSequence(); + } + + public int getTotal() { + return getParameters().getTotal(); + } + + public String getNetworkName() { + return getParameters().getNetworkName(); } @Override @@ -24,11 +38,15 @@ @Override protected void executeCommand() { + AuditLogDirector.log(this, AuditLogType.PERSIST_NETWORK_ON_HOST); VdcReturnValueBase returnValue = getBackend().runInternalAction(VdcActionType.SetupNetworks, getParameters()); if (returnValue.getSucceeded()) { + VdsActionParameters parameters = new VdsActionParameters(getParameters().getVdsId()); + parameters.setShouldBeLogged(false); + parameters.setCorrelationId(getCorrelationId()); returnValue = getBackend().runInternalAction(VdcActionType.CommitNetworkChanges, - new VdsActionParameters(getParameters().getVdsId())); + parameters); } if (!returnValue.getSucceeded()) { @@ -37,4 +55,10 @@ setSucceeded(returnValue.getSucceeded()); } + + @Override + public AuditLogType getAuditLogTypeValue() { + return getSucceeded() ? AuditLogType.PERSIST_NETWORK_ON_HOST_FINISHED + : AuditLogType.PERSIST_NETWORK_ON_HOST_FAILED; + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/UnlabelNicCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/UnlabelNicCommand.java index 9e149b4..414254c 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/UnlabelNicCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/host/UnlabelNicCommand.java @@ -36,9 +36,13 @@ @Override protected void executeCommand() { + SetupNetworksParameters parameters = + new RemoveNetworksByLabelParametersBuilder().buildParameters(getNic(), getLabel()); + parameters.setShouldBeLogged(false); + VdcReturnValueBase result = getBackend().runInternalAction(VdcActionType.PersistentSetupNetworks, - new RemoveNetworksByLabelParametersBuilder().buildParameters(getNic(), getLabel())); + parameters); if (!result.getSucceeded()) { propagateFailure(result); diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java index aa0ab0f..e9eea04 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java @@ -618,6 +618,9 @@ SUBNET_ADDED(1142), SUBNET_ADDITION_FAILED(1143), CONFIGURE_NETWORK_BY_LABELS_WHEN_CHANGING_CLUSTER_FAILED(1144), + PERSIST_NETWORK_ON_HOST(1145), + PERSIST_NETWORK_ON_HOST_FINISHED(1146), + PERSIST_NETWORK_ON_HOST_FAILED(1147), // Import/Export IMPORTEXPORT_STARTING_EXPORT_VM(1162), diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/PersistentSetupNetworksParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/PersistentSetupNetworksParameters.java new file mode 100644 index 0000000..cdf955a --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/PersistentSetupNetworksParameters.java @@ -0,0 +1,39 @@ +package org.ovirt.engine.core.common.action; + +public class PersistentSetupNetworksParameters extends SetupNetworksParameters { + + private static final long serialVersionUID = 2120379740832172688L; + + private int sequence; + + private int total; + + private String networkName; + + public PersistentSetupNetworksParameters() { + } + + public int getSequence() { + return sequence; + } + + public void setSequence(int sequence) { + this.sequence = sequence; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public String getNetworkName() { + return networkName; + } + + public void setNetworkName(String networkName) { + this.networkName = networkName; + } +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java index d9d0a66..5cbe54a 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java @@ -839,6 +839,9 @@ severities.put(AuditLogType.SUBNET_ADDED, AuditLogSeverity.NORMAL); severities.put(AuditLogType.SUBNET_ADDITION_FAILED, AuditLogSeverity.ERROR); severities.put(AuditLogType.CONFIGURE_NETWORK_BY_LABELS_WHEN_CHANGING_CLUSTER_FAILED, AuditLogSeverity.ERROR); + severities.put(AuditLogType.PERSIST_NETWORK_ON_HOST, AuditLogSeverity.NORMAL); + severities.put(AuditLogType.PERSIST_NETWORK_ON_HOST_FINISHED, AuditLogSeverity.NORMAL); + severities.put(AuditLogType.PERSIST_NETWORK_ON_HOST_FAILED, AuditLogSeverity.ERROR); } private static void initExtrnalEvents() { diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties index 9baad45..91a75b4 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties @@ -465,6 +465,9 @@ SUBNET_ADDITION_FAILED=Failed to add subnet ${SubnetName} on provider ${ProviderName}. (User: ${UserName}) SUBNET_REMOVED=Subnet ${SubnetName} was removed from provider ${ProviderName}. (User: ${UserName}) SUBNET_REMOVAL_FAILED=Failed to remove subnet ${SubnetName} from provider ${ProviderName}. (User: ${UserName}) +PERSIST_NETWORK_ON_HOST=(${Sequence}/${Total}): Applying changes for network ${NetworkName} on host ${VdsName}. (User: ${UserName}) +PERSIST_NETWORK_ON_HOST_FINISHED=(${Sequence}/${Total}): Successfully applied changes for network ${NetworkName} on host ${VdsName}. (User: ${UserName}) +PERSIST_NETWORK_ON_HOST_FAILED=(${Sequence}/${Total}): Failed to apply changes for network ${NetworkName} on host ${VdsName}. (User: ${UserName}) NETWORK_ADD_NETWORK=Network ${NetworkName} was added to Data Center: ${StoragePoolName} NETWORK_ADD_NETWORK_FAILED=Failed to add Network ${NetworkName} to Data Center: ${StoragePoolName} NETWORK_ADD_TEMPLATE_INTERFACE=Interface ${InterfaceName} (${InterfaceType}) was added to Template ${VmTemplateName}. (User: ${UserName}) -- To view, visit http://gerrit.ovirt.org/23249 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie86bd5368052b4ed3bd18cff567c39daef911b31 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Mike Kolesnik <mkole...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches