diff --git a/genie-client/src/test/resources/application-integration.yml b/genie-client/src/test/resources/application-integration.yml index a5b0e480447..af0fac2a1d2 100644 --- a/genie-client/src/test/resources/application-integration.yml +++ b/genie-client/src/test/resources/application-integration.yml @@ -28,6 +28,10 @@ spring: hibernate: ddl-auto: update naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy + properties: + hibernate: + show_sql: true + type: trace datasource: url: jdbc:hsqldb:mem:genie-int-db;shutdown=true username: SA diff --git a/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobEntity.java b/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobEntity.java index d9540c3d594..68b300956dd 100644 --- a/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobEntity.java +++ b/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobEntity.java @@ -25,7 +25,6 @@ import javax.annotation.Nullable; import javax.persistence.Basic; -import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; @@ -36,6 +35,8 @@ import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.MapsId; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; import javax.persistence.OneToOne; import javax.persistence.OrderColumn; import javax.persistence.Table; @@ -58,7 +59,17 @@ @Setter @Entity @Table(name = "jobs") +@NamedQueries({ + @NamedQuery( + name = JobEntity.QUERY_GET_STATUS_BY_ID, + query = "select j.status from JobEntity j where j.id = :id" + ) +}) public class JobEntity extends CommonFieldsEntity { + /** + * Query name to get job status. + */ + public static final String QUERY_GET_STATUS_BY_ID = "getStatusById"; /** * Used as default version when one not entered. */ @@ -111,14 +122,6 @@ public class JobEntity extends CommonFieldsEntity { @MapsId private JobRequestEntity request; - @OneToOne( - mappedBy = "job", - fetch = FetchType.LAZY, - cascade = CascadeType.ALL, - orphanRemoval = true - ) - private JobExecutionEntity execution; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "cluster_id") private ClusterEntity cluster; @@ -278,20 +281,10 @@ protected JobRequestEntity getRequest() { * * @param request The job request. Not null. */ - protected void setRequest(final JobRequestEntity request) { + public void setRequest(final JobRequestEntity request) { this.request = request; } - /** - * Set the job execution for this job. - * - * @param execution The execution. Not null. - */ - public void setExecution(@NotNull(message = "Execution can't be null") final JobExecutionEntity execution) { - this.execution = execution; - execution.setJob(this); - } - /** * Set the cluster this job ran on. * diff --git a/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobExecutionEntity.java b/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobExecutionEntity.java index 6c1cc8b1c14..eb0d52d2b8a 100644 --- a/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobExecutionEntity.java +++ b/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobExecutionEntity.java @@ -27,6 +27,8 @@ import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.MapsId; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Temporal; @@ -49,8 +51,25 @@ @Setter @Entity @Table(name = "job_executions") +@NamedQueries({ + @NamedQuery( + name = JobExecutionEntity.QUERY_FIND_BY_STATUS_HOST, + query = "select e.job from JobExecutionEntity e where e.job.status in :statuses and e.hostName = :hostName" + ), + @NamedQuery( + name = JobExecutionEntity.QUERY_FIND_HOSTS_BY_STATUS, + query = "select distinct e.hostName from JobExecutionEntity e where e.job.status in :statuses" + ) +}) public class JobExecutionEntity extends BaseEntity { - + /** + * Query name to find jobs by statuses and host. + */ + public static final String QUERY_FIND_BY_STATUS_HOST = "findByStatusHost"; + /** + * Query name to find hosts by statuses. + */ + public static final String QUERY_FIND_HOSTS_BY_STATUS = "findHostsByStatus"; private static final long serialVersionUID = -5073493356472801960L; private static final TimeZone UTC = TimeZone.getTimeZone("UTC"); @@ -154,7 +173,7 @@ public void setTimeout(@NotNull final Date timeout) { * * @param job The job */ - protected void setJob(final JobEntity job) { + public void setJob(final JobEntity job) { this.job = job; } diff --git a/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobRequestEntity.java b/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobRequestEntity.java index 3a5f97f10a6..876df606d32 100644 --- a/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobRequestEntity.java +++ b/genie-core/src/main/java/com/netflix/genie/core/jpa/entities/JobRequestEntity.java @@ -28,14 +28,10 @@ import org.hibernate.validator.constraints.NotEmpty; import javax.persistence.Basic; -import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.OneToOne; import javax.persistence.Table; import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.util.List; import java.util.Optional; @@ -117,22 +113,6 @@ public class JobRequestEntity extends SetupFileEntity { @Min(value = 1) private Integer timeout; - @OneToOne( - mappedBy = "request", - fetch = FetchType.LAZY, - cascade = CascadeType.ALL, - orphanRemoval = true - ) - private JobEntity job; - - @OneToOne( - mappedBy = "request", - fetch = FetchType.LAZY, - cascade = CascadeType.ALL, - orphanRemoval = true - ) - private JobMetadataEntity jobMetadata; - /** * Gets the group name of the user who submitted the job. * @@ -334,35 +314,6 @@ protected void setApplications(final String applications) { this.applications = applications; } - /** - * Get the job associated with this job request. - * - * @return The job - */ - public JobEntity getJob() { - return this.job; - } - - /** - * Set the job for this request. - * - * @param job The job - */ - public void setJob(@NotNull final JobEntity job) { - this.job = job; - job.setRequest(this); - } - - /** - * Set the additional metadata for this request. - * - * @param jobMetadata The metadata - */ - public void setJobMetadata(@NotNull final JobMetadataEntity jobMetadata) { - this.jobMetadata = jobMetadata; - this.jobMetadata.setRequest(this); - } - /** * Get a DTO representing this job request. * diff --git a/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobExecutionRepository.java b/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobExecutionRepository.java index 1408c016091..169d67bbd03 100644 --- a/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobExecutionRepository.java +++ b/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobExecutionRepository.java @@ -20,6 +20,9 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; +import javax.validation.constraints.NotNull; +import java.util.List; + /** * Job repository. * @@ -28,4 +31,10 @@ */ @Repository public interface JpaJobExecutionRepository extends JpaRepository, JpaSpecificationExecutor { + /** + * Deletes all job executions for the given ids. + * @param ids list of ids for which the job requests should be deleted + * @return no. of executions deleted + */ + Long deleteByIdIn(@NotNull final List ids); } diff --git a/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobMetadataRepository.java b/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobMetadataRepository.java index 6d1fdd7117f..1c4cafc577e 100644 --- a/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobMetadataRepository.java +++ b/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobMetadataRepository.java @@ -20,6 +20,9 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; +import javax.validation.constraints.NotNull; +import java.util.List; + /** * Job Metadata repository. * @@ -28,4 +31,10 @@ */ @Repository public interface JpaJobMetadataRepository extends JpaRepository, JpaSpecificationExecutor { + /** + * Deletes all job metadatas for the given ids. + * @param ids list of ids for which the job requests should be deleted + * @return no. of metadatas deleted + */ + Long deleteByIdIn(@NotNull final List ids); } diff --git a/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobRepository.java b/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobRepository.java index b23af1262b8..065db2a2640 100644 --- a/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobRepository.java +++ b/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobRepository.java @@ -20,6 +20,9 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Repository; +import javax.validation.constraints.NotNull; +import java.util.List; + /** * Job repository. * @@ -27,4 +30,10 @@ */ @Repository public interface JpaJobRepository extends JpaRepository, JpaSpecificationExecutor { + /** + * Deletes all jobs for the given ids. + * @param ids list of ids for which the jobs should be deleted + * @return no. of jobs deleted + */ + Long deleteByIdIn(@NotNull final List ids); } diff --git a/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobRequestRepository.java b/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobRequestRepository.java index dfb7f490dad..3e32935a87b 100644 --- a/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobRequestRepository.java +++ b/genie-core/src/main/java/com/netflix/genie/core/jpa/repositories/JpaJobRequestRepository.java @@ -22,6 +22,7 @@ import javax.validation.constraints.NotNull; import java.util.Date; +import java.util.List; /** * Job repository. @@ -33,10 +34,17 @@ public interface JpaJobRequestRepository extends JpaRepository, JpaSpecificationExecutor { /** - * Delete all job requests created before the given date. + * Returns all job requests created before the given date. * - * @param date The date before which all job requests should be deleted. - * @return The number of deleted records + * @param date The date before which all job requests were created. + * @return List of job requests */ - Long deleteByCreatedBefore(@NotNull final Date date); + List findByCreatedBefore(@NotNull final Date date); + + /** + * Deletes all job requests for the given ids. + * @param ids list of ids for which the job requests should be deleted + * @return no. of requests deleted + */ + Long deleteByIdIn(@NotNull final List ids); } diff --git a/genie-core/src/main/java/com/netflix/genie/core/jpa/services/JpaJobPersistenceServiceImpl.java b/genie-core/src/main/java/com/netflix/genie/core/jpa/services/JpaJobPersistenceServiceImpl.java index 0c6853bb2e4..a0066ffc217 100644 --- a/genie-core/src/main/java/com/netflix/genie/core/jpa/services/JpaJobPersistenceServiceImpl.java +++ b/genie-core/src/main/java/com/netflix/genie/core/jpa/services/JpaJobPersistenceServiceImpl.java @@ -28,6 +28,7 @@ import com.netflix.genie.common.exceptions.GenieNotFoundException; import com.netflix.genie.common.exceptions.GeniePreconditionException; import com.netflix.genie.core.jpa.entities.ApplicationEntity; +import com.netflix.genie.core.jpa.entities.BaseEntity; import com.netflix.genie.core.jpa.entities.ClusterEntity; import com.netflix.genie.core.jpa.entities.CommandEntity; import com.netflix.genie.core.jpa.entities.JobEntity; @@ -37,6 +38,7 @@ import com.netflix.genie.core.jpa.repositories.JpaApplicationRepository; import com.netflix.genie.core.jpa.repositories.JpaClusterRepository; import com.netflix.genie.core.jpa.repositories.JpaCommandRepository; +import com.netflix.genie.core.jpa.repositories.JpaJobExecutionRepository; import com.netflix.genie.core.jpa.repositories.JpaJobMetadataRepository; import com.netflix.genie.core.jpa.repositories.JpaJobRepository; import com.netflix.genie.core.jpa.repositories.JpaJobRequestRepository; @@ -51,6 +53,7 @@ import javax.validation.constraints.NotNull; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * JPA implementation of the job persistence service. @@ -68,6 +71,7 @@ public class JpaJobPersistenceServiceImpl implements JobPersistenceService { private final JpaJobRepository jobRepo; private final JpaJobRequestRepository jobRequestRepo; + private final JpaJobExecutionRepository jobExecutionRepo; private final JpaJobMetadataRepository jobMetadataRepository; private final JpaApplicationRepository applicationRepo; private final JpaClusterRepository clusterRepo; @@ -79,6 +83,7 @@ public class JpaJobPersistenceServiceImpl implements JobPersistenceService { * @param jobRepo The job repository to use * @param jobRequestRepo The job request repository to use * @param jobMetadataRepository The job metadata repository to use + * @param jobExecutionRepo The job execution repository to use * @param applicationRepo The application repository to use * @param clusterRepo The cluster repository to use * @param commandRepo The command repository to use @@ -87,6 +92,7 @@ public JpaJobPersistenceServiceImpl( @NotNull final JpaJobRepository jobRepo, @NotNull final JpaJobRequestRepository jobRequestRepo, @NotNull final JpaJobMetadataRepository jobMetadataRepository, + @NotNull final JpaJobExecutionRepository jobExecutionRepo, @NotNull final JpaApplicationRepository applicationRepo, @NotNull final JpaClusterRepository clusterRepo, @NotNull final JpaCommandRepository commandRepo @@ -94,6 +100,7 @@ public JpaJobPersistenceServiceImpl( this.jobRepo = jobRepo; this.jobRequestRepo = jobRequestRepo; this.jobMetadataRepository = jobMetadataRepository; + this.jobExecutionRepo = jobExecutionRepo; this.applicationRepo = applicationRepo; this.clusterRepo = clusterRepo; this.commandRepo = commandRepo; @@ -127,11 +134,14 @@ public void createJob( final JobEntity jobEntity = this.jobDtoToEntity(job); final JobExecutionEntity jobExecutionEntity = this.jobExecutionDtoToEntity(jobExecution); - jobEntity.setExecution(jobExecutionEntity); - jobRequestEntity.setJobMetadata(metadataEntity); - jobRequestEntity.setJob(jobEntity); - this.jobRequestRepo.save(jobRequestEntity); + + jobEntity.setRequest(jobRequestEntity); + this.jobRepo.save(jobEntity); + metadataEntity.setRequest(jobRequestEntity); + this.jobMetadataRepository.save(metadataEntity); + jobExecutionEntity.setJob(jobEntity); + this.jobExecutionRepo.save(jobExecutionEntity); } /** @@ -201,7 +211,11 @@ public void updateJobWithRuntimeEnvironment( job.setApplications(applications); // Save the amount of memory to allocate to the job - job.getExecution().setMemory(memory); + final JobExecutionEntity jobExecutionEntity = this.jobExecutionRepo.findOne(jobId); + if (jobExecutionEntity == null) { + throw new GenieNotFoundException("No job execution with id " + jobId + " exists."); + } + jobExecutionEntity.setMemory(memory); } /** @@ -221,7 +235,7 @@ public void setJobRunningInformation( throw new GenieNotFoundException("No job with id " + id + " exists. Unable to update"); } - final JobExecutionEntity jobExecutionEntity = jobEntity.getExecution(); + final JobExecutionEntity jobExecutionEntity = this.jobExecutionRepo.findOne(id); if (jobExecutionEntity == null) { throw new GenieNotFoundException("No job execution with id " + id + " exists. Unable to update."); } @@ -258,7 +272,10 @@ public void setJobCompletionInformation( throw new GenieNotFoundException("No job with id " + id + " exists unable to update"); } this.updateJobStatus(jobEntity, status, statusMessage); - final JobExecutionEntity jobExecutionEntity = jobEntity.getExecution(); + final JobExecutionEntity jobExecutionEntity = this.jobExecutionRepo.findOne(id); + if (jobExecutionEntity == null) { + throw new GenieNotFoundException("No job execution with id " + id + " exists. Unable to update."); + } if (!jobExecutionEntity.getExitCode().isPresent()) { jobExecutionEntity.setExitCode(exitCode); } @@ -280,7 +297,12 @@ public void setJobCompletionInformation( */ @Override public long deleteAllJobsCreatedBeforeDate(@NotNull final Date date) { - return this.jobRequestRepo.deleteByCreatedBefore(date); + final List requests = jobRequestRepo.findByCreatedBefore(date); + final List ids = requests.stream().map(BaseEntity::getId).collect(Collectors.toList()); + jobExecutionRepo.deleteByIdIn(ids); + jobMetadataRepository.deleteByIdIn(ids); + jobRepo.deleteByIdIn(ids); + return jobRequestRepo.deleteByIdIn(ids); } private void updateJobStatus(final JobEntity jobEntity, final JobStatus jobStatus, final String statusMsg) { diff --git a/genie-core/src/main/java/com/netflix/genie/core/jpa/services/JpaJobSearchServiceImpl.java b/genie-core/src/main/java/com/netflix/genie/core/jpa/services/JpaJobSearchServiceImpl.java index e9cd1de71bb..8ddf7466273 100644 --- a/genie-core/src/main/java/com/netflix/genie/core/jpa/services/JpaJobSearchServiceImpl.java +++ b/genie-core/src/main/java/com/netflix/genie/core/jpa/services/JpaJobSearchServiceImpl.java @@ -34,7 +34,6 @@ import com.netflix.genie.core.jpa.entities.JobEntity; import com.netflix.genie.core.jpa.entities.JobEntity_; import com.netflix.genie.core.jpa.entities.JobExecutionEntity; -import com.netflix.genie.core.jpa.entities.JobExecutionEntity_; import com.netflix.genie.core.jpa.entities.JobRequestEntity; import com.netflix.genie.core.jpa.repositories.JpaClusterRepository; import com.netflix.genie.core.jpa.repositories.JpaCommandRepository; @@ -54,10 +53,9 @@ import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Expression; -import javax.persistence.criteria.Join; import javax.persistence.criteria.Order; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; @@ -210,19 +208,12 @@ public Page findJobs( public Set getAllActiveJobsOnHost(@NotBlank final String hostName) { log.debug("Called with hostname {}", hostName); - final CriteriaBuilder cb = this.entityManager.getCriteriaBuilder(); - final CriteriaQuery query = cb.createQuery(JobEntity.class); - final Root root = query.from(JobEntity.class); - final Join executions = root.join(JobEntity_.execution); - - final Expression statusExpression = root.get(JobEntity_.status).in(JobStatus.getActiveStatuses()); - - final Predicate hostPredicate = cb.equal(executions.get(JobExecutionEntity_.hostName), hostName); + final TypedQuery query = entityManager + .createNamedQuery(JobExecutionEntity.QUERY_FIND_BY_STATUS_HOST, JobEntity.class); + query.setParameter("statuses", JobStatus.getActiveStatuses()); + query.setParameter("hostName", hostName); - query.where(cb.and(statusExpression, hostPredicate)); - - return this.entityManager - .createQuery(query) + return query .getResultList() .stream() .map(JobEntity::getDTO) @@ -236,17 +227,11 @@ public Set getAllActiveJobsOnHost(@NotBlank final String hostName) { public List getAllHostsWithActiveJobs() { log.debug("Called"); - final CriteriaBuilder cb = this.entityManager.getCriteriaBuilder(); - final CriteriaQuery query = cb.createQuery(String.class); - final Root root = query.from(JobEntity.class); - final Join executions = root.join(JobEntity_.execution); - - query - .select(executions.get(JobExecutionEntity_.hostName)) - .distinct(true) - .where(root.get(JobEntity_.status).in(JobStatus.getActiveStatuses())); + final TypedQuery query = entityManager + .createNamedQuery(JobExecutionEntity.QUERY_FIND_HOSTS_BY_STATUS, String.class); + query.setParameter("statuses", JobStatus.getActiveStatuses()); - return this.entityManager.createQuery(query).getResultList(); + return query.getResultList(); } /** @@ -271,13 +256,11 @@ public Job getJob( @Override public JobStatus getJobStatus(@NotBlank final String id) throws GenieException { log.debug("Called with id {}", id); - final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); - final CriteriaQuery query = cb.createQuery(JobStatus.class); - final Root root = query.from(JobEntity.class); - query.select(root.get(JobEntity_.status)); - query.where(cb.equal(root.get(JobEntity_.id), id)); + final TypedQuery query = entityManager + .createNamedQuery(JobEntity.QUERY_GET_STATUS_BY_ID, JobStatus.class); + query.setParameter("id", id); try { - return entityManager.createQuery(query).getSingleResult(); + return query.getSingleResult(); } catch (NoResultException e) { throw new GenieNotFoundException("No job with id " + id + " exists."); } diff --git a/genie-core/src/test/java/com/netflix/genie/core/configs/ServicesConfigTest.java b/genie-core/src/test/java/com/netflix/genie/core/configs/ServicesConfigTest.java index 738518bd1db..8660a80fff3 100644 --- a/genie-core/src/test/java/com/netflix/genie/core/configs/ServicesConfigTest.java +++ b/genie-core/src/test/java/com/netflix/genie/core/configs/ServicesConfigTest.java @@ -158,6 +158,7 @@ public JobSearchService jobSearchService( * @param jobRepo The job repository to use * @param jobRequestRepo The job request repository to use * @param jobMetadataRepository The job metadata repository to use + * @param jobExecutionRepo The job execution repository to use * @param applicationRepo The application repository to use * @param clusterRepo The cluster repository to use * @param commandRepo The command repository to use @@ -168,6 +169,7 @@ public JobPersistenceService jobPersistenceService( final JpaJobRepository jobRepo, final JpaJobRequestRepository jobRequestRepo, final JpaJobMetadataRepository jobMetadataRepository, + final JpaJobExecutionRepository jobExecutionRepo, final JpaApplicationRepository applicationRepo, final JpaClusterRepository clusterRepo, final JpaCommandRepository commandRepo @@ -176,6 +178,7 @@ public JobPersistenceService jobPersistenceService( jobRepo, jobRequestRepo, jobMetadataRepository, + jobExecutionRepo, applicationRepo, clusterRepo, commandRepo diff --git a/genie-core/src/test/java/com/netflix/genie/core/jpa/entities/JobEntityUnitTests.java b/genie-core/src/test/java/com/netflix/genie/core/jpa/entities/JobEntityUnitTests.java index f2db9e96ec3..56170494d2c 100644 --- a/genie-core/src/test/java/com/netflix/genie/core/jpa/entities/JobEntityUnitTests.java +++ b/genie-core/src/test/java/com/netflix/genie/core/jpa/entities/JobEntityUnitTests.java @@ -315,8 +315,8 @@ public void canSetJobRequest() { @Test public void canSetJobExecution() { final JobExecutionEntity entity = new JobExecutionEntity(); - this.jobEntity.setExecution(entity); - Assert.assertThat(this.jobEntity.getExecution(), Matchers.is(entity)); + entity.setJob(this.jobEntity); + Assert.assertThat(this.jobEntity, Matchers.is(entity.getJob())); } /** diff --git a/genie-core/src/test/java/com/netflix/genie/core/jpa/entities/JobRequestEntityUnitTests.java b/genie-core/src/test/java/com/netflix/genie/core/jpa/entities/JobRequestEntityUnitTests.java index c4da0718a72..1bf1a23b528 100644 --- a/genie-core/src/test/java/com/netflix/genie/core/jpa/entities/JobRequestEntityUnitTests.java +++ b/genie-core/src/test/java/com/netflix/genie/core/jpa/entities/JobRequestEntityUnitTests.java @@ -84,7 +84,6 @@ public void canConstruct() throws GenieException { Assert.assertThat(this.entity.getDependencies(), Matchers.is(EMPTY_JSON_ARRAY)); Assert.assertThat(this.entity.getDependenciesAsSet(), Matchers.empty()); Assert.assertFalse(this.entity.getGroup().isPresent()); - Assert.assertThat(this.entity.getJob(), Matchers.nullValue()); Assert.assertFalse(this.entity.getMemory().isPresent()); Assert.assertFalse(this.entity.getSetupFile().isPresent()); Assert.assertThat(this.entity.getTags(), Matchers.empty()); @@ -323,8 +322,8 @@ public void canSetMemory() { @Test public void canSetJob() { final JobEntity job = new JobEntity(); - this.entity.setJob(job); - Assert.assertThat(this.entity.getJob(), Matchers.is(job)); + job.setRequest(this.entity); + Assert.assertThat(this.entity, Matchers.is(job.getRequest())); } /** @@ -332,10 +331,8 @@ public void canSetJob() { */ @Test public void canSetJobMetadata() { - Assert.assertThat(this.entity.getJobMetadata(), Matchers.nullValue()); final JobMetadataEntity metadata = new JobMetadataEntity(); - this.entity.setJobMetadata(metadata); - Assert.assertThat(this.entity.getJobMetadata(), Matchers.is(metadata)); + metadata.setRequest(entity); Assert.assertThat(metadata.getRequest(), Matchers.is(this.entity)); } diff --git a/genie-core/src/test/java/com/netflix/genie/core/jpa/services/JpaJobPersistenceServiceImplUnitTests.java b/genie-core/src/test/java/com/netflix/genie/core/jpa/services/JpaJobPersistenceServiceImplUnitTests.java index c39d58652b9..9e4fae458a3 100644 --- a/genie-core/src/test/java/com/netflix/genie/core/jpa/services/JpaJobPersistenceServiceImplUnitTests.java +++ b/genie-core/src/test/java/com/netflix/genie/core/jpa/services/JpaJobPersistenceServiceImplUnitTests.java @@ -38,6 +38,7 @@ import com.netflix.genie.core.jpa.repositories.JpaApplicationRepository; import com.netflix.genie.core.jpa.repositories.JpaClusterRepository; import com.netflix.genie.core.jpa.repositories.JpaCommandRepository; +import com.netflix.genie.core.jpa.repositories.JpaJobExecutionRepository; import com.netflix.genie.core.jpa.repositories.JpaJobMetadataRepository; import com.netflix.genie.core.jpa.repositories.JpaJobRepository; import com.netflix.genie.core.jpa.repositories.JpaJobRequestRepository; @@ -75,6 +76,7 @@ public class JpaJobPersistenceServiceImplUnitTests { private JpaJobRepository jobRepo; private JpaJobRequestRepository jobRequestRepo; private JpaJobMetadataRepository jobMetadataRepository; + private JpaJobExecutionRepository jobExecutionRepo; private JpaApplicationRepository applicationRepo; private JpaClusterRepository clusterRepo; private JpaCommandRepository commandRepo; @@ -89,6 +91,7 @@ public void setup() { this.jobRepo = Mockito.mock(JpaJobRepository.class); this.jobRequestRepo = Mockito.mock(JpaJobRequestRepository.class); this.jobMetadataRepository = Mockito.mock(JpaJobMetadataRepository.class); + this.jobExecutionRepo = Mockito.mock(JpaJobExecutionRepository.class); this.applicationRepo = Mockito.mock(JpaApplicationRepository.class); this.clusterRepo = Mockito.mock(JpaClusterRepository.class); this.commandRepo = Mockito.mock(JpaCommandRepository.class); @@ -97,6 +100,7 @@ public void setup() { this.jobRepo, this.jobRequestRepo, this.jobMetadataRepository, + this.jobExecutionRepo, this.applicationRepo, this.clusterRepo, this.commandRepo @@ -180,9 +184,6 @@ public void testCreateJob() throws GenieException { = argument.getValue().getDescription().orElseThrow(IllegalArgumentException::new); Assert.assertThat(actualDescription, Matchers.is(description)); Assert.assertThat(argument.getValue().getApplicationsAsList(), Matchers.empty()); - Assert.assertThat(argument.getValue().getJob(), Matchers.notNullValue()); - Assert.assertThat(argument.getValue().getJob().getExecution(), Matchers.notNullValue()); - Assert.assertThat(argument.getValue().getJobMetadata(), Matchers.notNullValue()); } /** @@ -441,7 +442,7 @@ public void cantFindJobToUpdateRunningInformationFor() throws GenieException { final JobEntity jobEntity = Mockito.mock(JobEntity.class); Mockito.when(this.jobRepo.findOne(id)).thenReturn(jobEntity); - Mockito.when(jobEntity.getExecution()).thenReturn(null); + Mockito.when(this.jobExecutionRepo.findOne(id)).thenReturn(null); this.jobPersistenceService.setJobRunningInformation(id, 1, 1, new Date()); } @@ -458,7 +459,7 @@ public void canUpdateJobRunningInformation() throws GenieException { final Date timeout = new Date(); final JobExecutionEntity jobExecutionEntity = Mockito.mock(JobExecutionEntity.class); final JobEntity jobEntity = Mockito.mock(JobEntity.class); - Mockito.when(jobEntity.getExecution()).thenReturn(jobExecutionEntity); + Mockito.when(this.jobExecutionRepo.findOne(id)).thenReturn(jobExecutionEntity); Mockito.when(jobEntity.getStatus()).thenReturn(JobStatus.INIT); Mockito.when(this.jobRepo.findOne(id)).thenReturn(jobEntity); this.jobPersistenceService.setJobRunningInformation(id, processId, checkDelay, timeout); @@ -501,7 +502,7 @@ public void cantUpdateJobMetadataIfNotExists() throws GenieException { final JobEntity jobEntity = Mockito.mock(JobEntity.class); final JobExecutionEntity jobExecutionEntity = Mockito.mock(JobExecutionEntity.class); Mockito.when(jobEntity.getStatus()).thenReturn(JobStatus.FAILED); - Mockito.when(jobEntity.getExecution()).thenReturn(jobExecutionEntity); + Mockito.when(this.jobExecutionRepo.findOne(JOB_1_ID)).thenReturn(jobExecutionEntity); Mockito.when(this.jobRepo.findOne(JOB_1_ID)).thenReturn(jobEntity); Mockito.when(jobExecutionEntity.getExitCode()).thenReturn(Optional.of(1)); Mockito.when(this.jobMetadataRepository.findOne(JOB_1_ID)).thenReturn(null); @@ -519,7 +520,7 @@ public void wontUpdateJobMetadataIfNoSizes() throws GenieException { final JobEntity jobEntity = Mockito.mock(JobEntity.class); final JobExecutionEntity jobExecutionEntity = Mockito.mock(JobExecutionEntity.class); Mockito.when(jobEntity.getStatus()).thenReturn(JobStatus.FAILED); - Mockito.when(jobEntity.getExecution()).thenReturn(jobExecutionEntity); + Mockito.when(this.jobExecutionRepo.findOne(JOB_1_ID)).thenReturn(jobExecutionEntity); Mockito.when(this.jobRepo.findOne(JOB_1_ID)).thenReturn(jobEntity); Mockito.when(jobExecutionEntity.getExitCode()).thenReturn(Optional.of(1)); @@ -537,7 +538,7 @@ public void willUpdateJobMetadataIfOneSize() throws GenieException { final JobEntity jobEntity = Mockito.mock(JobEntity.class); final JobExecutionEntity jobExecutionEntity = Mockito.mock(JobExecutionEntity.class); Mockito.when(jobEntity.getStatus()).thenReturn(JobStatus.FAILED); - Mockito.when(jobEntity.getExecution()).thenReturn(jobExecutionEntity); + Mockito.when(this.jobExecutionRepo.findOne(JOB_1_ID)).thenReturn(jobExecutionEntity); Mockito.when(this.jobRepo.findOne(JOB_1_ID)).thenReturn(jobEntity); Mockito.when(jobExecutionEntity.getExitCode()).thenReturn(Optional.of(1)); Mockito.when(this.jobMetadataRepository.findOne(JOB_1_ID)).thenReturn(Mockito.mock(JobMetadataEntity.class)); diff --git a/genie-web/src/main/java/com/netflix/genie/web/configs/ServicesConfig.java b/genie-web/src/main/java/com/netflix/genie/web/configs/ServicesConfig.java index f054f9ba280..488ec2fcf6c 100644 --- a/genie-web/src/main/java/com/netflix/genie/web/configs/ServicesConfig.java +++ b/genie-web/src/main/java/com/netflix/genie/web/configs/ServicesConfig.java @@ -189,6 +189,7 @@ public JobSearchService jobSearchService( * @param jobRepo The job repository to use * @param jobRequestRepo The job request repository to use * @param jobMetadataRepository The job metadata repository to use + * @param jobExecutionRepo The job execution repository to use * @param applicationRepo The application repository to use * @param clusterRepo The cluster repository to use * @param commandRepo The command repository to use @@ -199,6 +200,7 @@ public JobPersistenceService jobPersistenceService( final JpaJobRepository jobRepo, final JpaJobRequestRepository jobRequestRepo, final JpaJobMetadataRepository jobMetadataRepository, + final JpaJobExecutionRepository jobExecutionRepo, final JpaApplicationRepository applicationRepo, final JpaClusterRepository clusterRepo, final JpaCommandRepository commandRepo @@ -207,6 +209,7 @@ public JobPersistenceService jobPersistenceService( jobRepo, jobRequestRepo, jobMetadataRepository, + jobExecutionRepo, applicationRepo, clusterRepo, commandRepo diff --git a/genie-web/src/test/java/com/netflix/genie/web/configs/ServicesConfigUnitTests.java b/genie-web/src/test/java/com/netflix/genie/web/configs/ServicesConfigUnitTests.java index 9d93520dbdd..545532db00e 100644 --- a/genie-web/src/test/java/com/netflix/genie/web/configs/ServicesConfigUnitTests.java +++ b/genie-web/src/test/java/com/netflix/genie/web/configs/ServicesConfigUnitTests.java @@ -191,6 +191,7 @@ public void canGetJobPersistenceServiceBean() { this.jobRepository, this.jobRequestRepository, Mockito.mock(JpaJobMetadataRepository.class), + jobExecutionRepository, this.applicationRepository, this.clusterRepository, this.commandRepository diff --git a/genie-web/src/test/java/com/netflix/genie/web/controllers/JobRestControllerIntegrationTests.java b/genie-web/src/test/java/com/netflix/genie/web/controllers/JobRestControllerIntegrationTests.java index 6d314c4dc31..ad445cb7da0 100644 --- a/genie-web/src/test/java/com/netflix/genie/web/controllers/JobRestControllerIntegrationTests.java +++ b/genie-web/src/test/java/com/netflix/genie/web/controllers/JobRestControllerIntegrationTests.java @@ -372,10 +372,10 @@ public void cleanup() throws Exception { // ) // .andReturn().getResponse().getContentAsString()); - this.jobRequestRepository.deleteAll(); this.jobRequestMetadataRepository.deleteAll(); - this.jobRepository.deleteAll(); this.jobExecutionRepository.deleteAll(); + this.jobRepository.deleteAll(); + this.jobRequestRepository.deleteAll(); this.clusterRepository.deleteAll(); this.commandRepository.deleteAll(); this.applicationRepository.deleteAll();