package org.ovirt.engine.core.bll.job; import java.util.Collection; import java.util.List; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.job.Job; import org.ovirt.engine.core.common.job.JobExecutionStatus; import org.ovirt.engine.core.common.job.Step; import org.ovirt.engine.core.common.job.StepSubjectEntity; import org.ovirt.engine.core.compat.Guid; /** * Represents basic CRUD operations for Job and Step objects. * Each modification operation is being executed in a new transaction. */ public interface JobRepository { /** * Persists a new instance of {@link Step} the entity and update the {@link Job} modification date. * * @param step * The {@link Step} entity to persist (can't be <code>null</code>). */ void saveStep(Step step); /** * Persists a new instance of {@link Step} entity with the provided {@link StepSubjectEntity} list and updates the * {@link Job} modification date. * * @param step * The {@link Step} entity to persist (can't be <code>null</code>). * @param stepSubjectEntities * The {@link StepSubjectEntity} list to persist (can't be <code>null</code>). */ void saveStep(Step step, Collection<StepSubjectEntity> stepSubjectEntities); /** * Updates an existing {@link Step} entity with data from the given instance. * * @param step * The {@link Step} instance, containing data to update (can't be <code>null</code>). */ void updateStep(Step step); /** * Persists a new instance of {@link Job} the entity. * * @param job * The {@link Job} entity to persist (can't be <code>null</code>). */ void saveJob(Job job); /** * Retrieves the {@link Job} entity with the given id. * * @param id * The id to look by (can't be <code>null</code>). * @return The entity instance, or <code>null</code> if not found. */ Job getJob(Guid jobId); /** * Retrieves the {@link Step} entity with the given id. * * @param id * The id to look by (can't be <code>null</code>). * @param loadSubjectEntities * boolean indicating whether to load the step's {@link StepSubjectEntity} list * @return The entity instance, or <code>null</code> if not found. */ Step getStep(Guid stepId, boolean loadSubjectEntities); /** * Retrieves a list of {@link Job} entities with the given characteristics. * * @param entityId * The id of the entity which is associated with the Job via {@link JobSujectEntity} * @param actionType * The action type which is associated with the job. * @return a list of {@link Job} if found a match or an empty list. */ List<Job> getJobsByEntityAndAction(Guid entityId, VdcActionType actionType); /** * Retrieves the {@link Job} entity with the given id, populated with its Steps. * * @param jobId * The id to look by (can't be <code>null</code>). * @return The entity instance, or <code>null</code> if not found. */ Job getJobWithSteps(Guid jobId); /** * Update the {@link Job} entity with its Steps. * * @param job * The job to update with its steps(can't be <code>null</code>). */ void loadJobSteps(Job job); /** * Update the {@link Step} entity with its Steps. * * @param step * The job to update with its steps(can't be <code>null</code>). */ void loadParentStepSteps(Step step); /** * Handles the status of uncompleted jobs and their steps: * <li>Job without Steps that have tasks will be marked as {@code ExecutionStatus.UNKNOWN} * <li>Job with Steps that have tasks will be remained as is to be process by the {@code AsyncTaskManager}. */ void finalizeJobs(); /** * Updates existing step and saving the step after in the same transaction. Should be used when two steps followed * each other, e.g. EXECUTING step is completed and right after creating the FINALIZING step. * * @param existingStep * The step which should be updated. * @param newStep * The step which should be created. */ void updateExistingStepAndSaveNewStep(Step existingStep, Step newStep); /** * Updates the {@code Job} entity and its steps as completed with the given status. * * @param job * The job to end. */ void updateCompletedJobAndSteps(Job job); void closeCompletedJobSteps(Guid jobId, JobExecutionStatus status); }