Sahina Bose has uploaded a new change for review. Change subject: engine: Introduced InternalJob and InternalStep command ......................................................................
engine: Introduced InternalJob and InternalStep command Introduced AddInternalJob and AddInternalStep commands which will be used to add a job and step to monitor operations started outside of engine, but that can be managed by engine. Refactored AddExternalJob and AddExternalStep commands by inheriting from an AddJob and AddStep command. Change-Id: I17074d4317c037fa9fcc680f4b0a7a9b3a6b087a Signed-off-by: Sahina Bose <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddExternalJobCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddExternalStepCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddInternalJobCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddInternalStepCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddJobCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddStepCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddExternalJobParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddExternalStepParameters.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddInternalJobParameters.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddJobParameters.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddStepParameters.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java 12 files changed, 330 insertions(+), 161 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/82/19182/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddExternalJobCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddExternalJobCommand.java index 3f7f09e..38d67bf 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddExternalJobCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddExternalJobCommand.java @@ -3,27 +3,15 @@ import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; -import org.ovirt.engine.core.bll.job.ExecutionHandler; -import org.ovirt.engine.core.bll.job.JobRepositoryFactory; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddExternalJobParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.ActionGroup; -import org.ovirt.engine.core.common.errors.VdcBllMessages; -import org.ovirt.engine.core.common.job.Job; -import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.core.dal.dbbroker.DbFacade; -import org.ovirt.engine.core.dao.JobDao; -public class AddExternalJobCommand<T extends AddExternalJobParameters> extends CommandBase<T> { - /** - * - */ - private static final long serialVersionUID = 1L; +public class AddExternalJobCommand<T extends AddExternalJobParameters> extends AddJobCommand<T> { public AddExternalJobCommand(T parameters) { super(parameters); @@ -31,31 +19,8 @@ @Override - protected boolean canDoAction() { - boolean retValue = true; - if (StringUtils.isBlank(getParameters().getDescription())) { - addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_EMPTY_DESCRIPTION); - retValue = false; - } - return retValue; - } - - - @Override protected void executeCommand() { - Job job = ExecutionHandler.createJob(VdcActionType.AddExternalJob, this); - job.setDescription(getParameters().getDescription()); - job.setAutoCleared(getParameters().isAutoCleared()); - Guid id = job.getId(); - job.setExternal(true); - JobRepositoryFactory.getJobRepository().saveJob(job); - if (getJobDao().get(id) != null) { - setActionReturnValue(id); - setSucceeded(true); - } - else { - setSucceeded(false); - } + createJob(VdcActionType.AddExternalJob, true); } @Override @@ -70,9 +35,5 @@ VdcObjectType.System, ActionGroup.INJECT_EXTERNAL_TASKS)); return permissionList; - } - - public JobDao getJobDao() { - return DbFacade.getInstance().getJobDao(); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddExternalStepCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddExternalStepCommand.java index 2dc8395..39184c5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddExternalStepCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddExternalStepCommand.java @@ -3,30 +3,14 @@ import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; -import org.ovirt.engine.core.bll.job.ExecutionContext; -import org.ovirt.engine.core.bll.job.ExecutionContext.ExecutionMethod; -import org.ovirt.engine.core.bll.job.ExecutionHandler; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddExternalStepParameters; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.errors.VdcBllMessages; -import org.ovirt.engine.core.common.job.Job; -import org.ovirt.engine.core.common.job.Step; -import org.ovirt.engine.core.dal.dbbroker.DbFacade; -import org.ovirt.engine.core.dao.JobDao; -import org.ovirt.engine.core.dao.StepDao; -public class AddExternalStepCommand <T extends AddExternalStepParameters> extends CommandBase<T>{ +public class AddExternalStepCommand <T extends AddExternalStepParameters> extends AddStepCommand<T>{ - /** - * - */ - private static final long serialVersionUID = 1L; - - private Job job; - private Step parentStep; public AddExternalStepCommand(T parameters) { super(parameters); @@ -34,50 +18,20 @@ @Override protected boolean canDoAction() { - boolean retValue=true; - job = getJobDao().get(getParameters().getParentId()); + boolean retValue=super.canDoAction(); + if (job != null) { if (!job.isExternal()) { retValue = false; addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_NOT_EXTERNAL); } } - else { - parentStep = getStepDao().get(getParameters().getParentId()); - } - if (job == null && parentStep == null) { - retValue=false; - addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_NO_PARENT); - } - if (StringUtils.isBlank(getParameters().getDescription())) { - retValue=false; - addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_EMPTY_DESCRIPTION); - } + if (!retValue) { addCanDoActionMessage(VdcBllMessages.VAR__ACTION__ADD); addCanDoActionMessage(VdcBllMessages.VAR__TYPE__EXTERNAL_JOB); } return retValue; - } - - @Override - protected void executeCommand() { - ExecutionContext context = new ExecutionContext(); - context.setMonitored(true); - if (parentStep == null) { // A step that is directly under a job - context.setJob(job); - context.setExecutionMethod(ExecutionMethod.AsJob); - Step step = ExecutionHandler.addStep(context, getParameters().getStepType(), getParameters().getDescription(), true); - setActionReturnValue(step.getId()); - setSucceeded(true); - } - else {// this is a sub-step - context.setStep(parentStep); - context.setExecutionMethod(ExecutionMethod.AsStep); - Step step = ExecutionHandler.addSubStep(context, parentStep, getParameters().getStepType(), getParameters().getDescription(), true); - setActionReturnValue(step.getId()); - setSucceeded(true); - } } @Override @@ -87,14 +41,6 @@ VdcObjectType.System, ActionGroup.INJECT_EXTERNAL_TASKS)); return permissionList; - } - - public JobDao getJobDao() { - return DbFacade.getInstance().getJobDao(); - } - - public StepDao getStepDao() { - return DbFacade.getInstance().getStepDao(); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddInternalJobCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddInternalJobCommand.java new file mode 100644 index 0000000..e42305d --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddInternalJobCommand.java @@ -0,0 +1,56 @@ +package org.ovirt.engine.core.bll; + +import java.util.ArrayList; +import java.util.List; + +import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.common.AuditLogType; +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.AddInternalJobParameters; +import org.ovirt.engine.core.common.businessentities.ActionGroup; +import org.ovirt.engine.core.common.errors.VdcBllMessages; + +/** + * + * BLL command to create a Job for a task that's already running. This is used so that tasks + * that are started externally can be monitored from engine. + */ +public class AddInternalJobCommand<T extends AddInternalJobParameters> extends AddJobCommand<T> { + + public AddInternalJobCommand(T parameters) { + super(parameters); + } + + @Override + protected boolean canDoAction() { + + boolean retValue = super.canDoAction(); + if (getParameters().getActionType() == null) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_EMPTY_DESCRIPTION); + retValue = false; + } + return retValue; + } + + + @Override + protected void executeCommand() { + createJob(getParameters().getActionType(), false); + } + + + + @Override + public AuditLogType getAuditLogTypeValue() { + return getSucceeded() ? AuditLogType.USER_ADD_EXTERNAL_JOB : AuditLogType.USER_ADD_EXTERNAL_JOB_FAILED; + } + + @Override + public List<PermissionSubject> getPermissionCheckSubjects() { + List<PermissionSubject> permissionList = new ArrayList<PermissionSubject>(); + permissionList.add(new PermissionSubject(MultiLevelAdministrationHandler.SYSTEM_OBJECT_ID, + VdcObjectType.System, + ActionGroup.INJECT_EXTERNAL_TASKS)); + return permissionList; + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddInternalStepCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddInternalStepCommand.java new file mode 100644 index 0000000..eeca884 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddInternalStepCommand.java @@ -0,0 +1,27 @@ +package org.ovirt.engine.core.bll; + +import java.util.List; + +import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.common.action.AddStepParameters; + +/** + * BLL command to create a Step for Jobs that are internal + */ +public class AddInternalStepCommand <T extends AddStepParameters> extends AddStepCommand<T>{ + + public AddInternalStepCommand(T parameters) { + super(parameters); + } + + @Override + protected boolean canDoAction() { + return super.canDoAction(); + } + + @Override + public List<PermissionSubject> getPermissionCheckSubjects() { + return null; + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddJobCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddJobCommand.java new file mode 100644 index 0000000..590dfb3 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddJobCommand.java @@ -0,0 +1,51 @@ +package org.ovirt.engine.core.bll; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.bll.job.ExecutionHandler; +import org.ovirt.engine.core.bll.job.JobRepositoryFactory; +import org.ovirt.engine.core.common.action.AddJobParameters; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.job.Job; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.JobDao; + +public abstract class AddJobCommand<T extends AddJobParameters> extends CommandBase<T> { + + public AddJobCommand(T parameters) { + super(parameters); + } + + + @Override + protected boolean canDoAction() { + boolean retValue = true; + if (StringUtils.isBlank(getParameters().getDescription())) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_EMPTY_DESCRIPTION); + retValue = false; + } + return retValue; + } + + public JobDao getJobDao() { + return DbFacade.getInstance().getJobDao(); + } + + protected void createJob(VdcActionType actionType, boolean isExternal) { + Job job = ExecutionHandler.createJob(actionType, this); + job.setDescription(getParameters().getDescription()); + job.setAutoCleared(getParameters().isAutoCleared()); + Guid id = job.getId(); + job.setExternal(isExternal); + JobRepositoryFactory.getJobRepository().saveJob(job); + if (getJobDao().get(id) != null) { + setActionReturnValue(id); + setSucceeded(true); + } + else { + setSucceeded(false); + } + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddStepCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddStepCommand.java new file mode 100644 index 0000000..f09829e --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddStepCommand.java @@ -0,0 +1,75 @@ +package org.ovirt.engine.core.bll; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.bll.job.ExecutionContext; +import org.ovirt.engine.core.bll.job.ExecutionContext.ExecutionMethod; +import org.ovirt.engine.core.bll.job.ExecutionHandler; +import org.ovirt.engine.core.common.action.AddStepParameters; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.common.job.Job; +import org.ovirt.engine.core.common.job.Step; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.dao.JobDao; +import org.ovirt.engine.core.dao.StepDao; + +public abstract class AddStepCommand<T extends AddStepParameters> extends CommandBase<T> { + + protected Job job; + protected Step parentStep; + + public AddStepCommand() { + super(); + } + + public AddStepCommand(T parameters) { + super(parameters); + } + + @Override + protected boolean canDoAction() { + boolean retValue=true; + job = getJobDao().get(getParameters().getParentId()); + if (job == null) { + parentStep = getStepDao().get(getParameters().getParentId()); + } + if (job == null && parentStep == null) { + retValue=false; + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_NO_PARENT); + } + if (StringUtils.isBlank(getParameters().getDescription())) { + retValue=false; + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_EMPTY_DESCRIPTION); + } + + return retValue; + } + + @Override + protected void executeCommand() { + ExecutionContext context = new ExecutionContext(); + context.setMonitored(true); + if (parentStep == null) { // A step that is directly under a job + context.setJob(job); + context.setExecutionMethod(ExecutionMethod.AsJob); + Step step = ExecutionHandler.addStep(context, getParameters().getStepType(), getParameters().getDescription(), true); + setActionReturnValue(step.getId()); + setSucceeded(true); + } + else {// this is a sub-step + context.setStep(parentStep); + context.setExecutionMethod(ExecutionMethod.AsStep); + Step step = ExecutionHandler.addSubStep(context, parentStep, getParameters().getStepType(), getParameters().getDescription(), true); + setActionReturnValue(step.getId()); + setSucceeded(true); + } + } + + public JobDao getJobDao() { + return DbFacade.getInstance().getJobDao(); + } + + public StepDao getStepDao() { + return DbFacade.getInstance().getStepDao(); + } + +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddExternalJobParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddExternalJobParameters.java index 80ace4e..7a25bfd 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddExternalJobParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddExternalJobParameters.java @@ -1,40 +1,18 @@ package org.ovirt.engine.core.common.action; -public class AddExternalJobParameters extends VdcActionParametersBase { +public class AddExternalJobParameters extends AddJobParameters { /** * */ private static final long serialVersionUID = 1L; - private String description; - private boolean isAutoCleared; - public AddExternalJobParameters(String description, boolean isAutoCleared) { - super(); - this.description = description; - this.isAutoCleared = isAutoCleared; + super(description,isAutoCleared); } public AddExternalJobParameters(String description) { - super(); - this.description = description; - isAutoCleared = true; + super(description,true); } - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public boolean isAutoCleared() { - return isAutoCleared; - } - - public void setAutoCleared(boolean isAutoCleared) { - this.isAutoCleared = isAutoCleared; - } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddExternalStepParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddExternalStepParameters.java index dd1a60e..3c6313b 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddExternalStepParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddExternalStepParameters.java @@ -3,46 +3,11 @@ import org.ovirt.engine.core.common.job.StepEnum; import org.ovirt.engine.core.compat.Guid; -public class AddExternalStepParameters extends VdcActionParametersBase{ +public class AddExternalStepParameters extends AddStepParameters{ - /** - * - */ private static final long serialVersionUID = 1L; - private Guid parentId; - private String description; - private StepEnum stepType; - - public Guid getParentId() { - return parentId; - } - - public void setParentId(Guid id) { - this.parentId = id; - } - - public StepEnum getStepType() { - return stepType; - } - - public void setStepType(StepEnum stepType) { - this.stepType = stepType; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - public AddExternalStepParameters(Guid id, String description, StepEnum stepType) { - super(); - this.parentId = id; - this.description = description; - this.stepType = stepType; - this.setParentId(id); + super(id, description, stepType); } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddInternalJobParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddInternalJobParameters.java new file mode 100644 index 0000000..71c0c43 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddInternalJobParameters.java @@ -0,0 +1,22 @@ +package org.ovirt.engine.core.common.action; + +public class AddInternalJobParameters extends AddJobParameters { + + private static final long serialVersionUID = -7824725232199970355L; + private VdcActionType actionType; + + public AddInternalJobParameters(VdcActionType actionType, boolean isAutoCleared) { + super(); + this.actionType = actionType; + this.isAutoCleared = isAutoCleared; + } + + public VdcActionType getActionType() { + return actionType; + } + + public void setActionType(VdcActionType actionType) { + this.actionType = actionType; + } + +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddJobParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddJobParameters.java new file mode 100644 index 0000000..5d1ebb6 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddJobParameters.java @@ -0,0 +1,35 @@ +package org.ovirt.engine.core.common.action; + +public class AddJobParameters extends VdcActionParametersBase { + + private static final long serialVersionUID = -7319747815339126821L; + protected String description; + protected boolean isAutoCleared; + + public AddJobParameters() { + super(); + } + + public AddJobParameters(String description, boolean isAutoCleared) { + super(); + this.description = description; + this.isAutoCleared = isAutoCleared; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public boolean isAutoCleared() { + return isAutoCleared; + } + + public void setAutoCleared(boolean isAutoCleared) { + this.isAutoCleared = isAutoCleared; + } + +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddStepParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddStepParameters.java new file mode 100644 index 0000000..a1f4bb3 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddStepParameters.java @@ -0,0 +1,49 @@ +package org.ovirt.engine.core.common.action; + +import org.ovirt.engine.core.common.job.StepEnum; +import org.ovirt.engine.core.compat.Guid; + +public class AddStepParameters extends VdcActionParametersBase { + + private static final long serialVersionUID = 2098671430609247442L; + + protected Guid parentId; + protected String description; + protected StepEnum stepType; + + public AddStepParameters() { + super(); + } + + public AddStepParameters(Guid parentId, String description, StepEnum stepType) { + super(); + this.parentId = parentId; + this.description = description; + this.stepType = stepType; + } + + public Guid getParentId() { + return parentId; + } + + public void setParentId(Guid id) { + this.parentId = id; + } + + public StepEnum getStepType() { + return stepType; + } + + public void setStepType(StepEnum stepType) { + this.stepType = stepType; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} 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 1fea633..4a2e49e 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 @@ -293,6 +293,10 @@ AddExternalStep(1803, ActionGroup.INJECT_EXTERNAL_TASKS, false, QuotaDependency.NONE), EndExternalStep(1804, ActionGroup.INJECT_EXTERNAL_TASKS, false, QuotaDependency.NONE), + //Internal Tasks + AddInternalJob(1850, false, QuotaDependency.NONE), + AddInternalStep(1851, false, QuotaDependency.NONE), + UpdateMomPolicy(1900, ActionGroup.MANIPUTLATE_HOST, false, QuotaDependency.NONE); private int intValue; -- To view, visit http://gerrit.ovirt.org/19182 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I17074d4317c037fa9fcc680f4b0a7a9b3a6b087a Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Sahina Bose <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
