def test_create_build_with_same_config_and_force_create_new_build_job(self): assert BuildJobStatus.objects.count() == 0 assert BuildJob.objects.count() == 0 build_job, rebuild = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image:test'}, code_reference=self.code_reference) self.assertEqual(rebuild, True) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1 assert BuildJob.objects.count() == 1 # Building with same config and force creates a new build job new_build_job, rebuild = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image:test'}, code_reference=self.code_reference, nocache=True) self.assertEqual(rebuild, True) assert BuildJobStatus.objects.count() == 2 assert BuildJob.objects.count() == 2 assert new_build_job != build_job # Building with same config does not create a new build job new_build_job_v2, rebuild = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image:test'}, code_reference=self.code_reference) self.assertEqual(rebuild, False) assert BuildJobStatus.objects.count() == 2 assert BuildJob.objects.count() == 2 assert new_build_job == new_build_job_v2
def test_create_build_without_tag_and_rebuild_latest_always_results_in_new_job(self): conf.set(key=BUILD_JOBS_ALWAYS_PULL_LATEST, value=True) assert BuildJobStatus.objects.count() == 0 assert BuildJob.objects.count() == 0 build_job, rebuild = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image'}, code_reference=self.code_reference) self.assertEqual(rebuild, True) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1 assert BuildJob.objects.count() == 1 # Building with same config does not create a new build job new_build_job, rebuild = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image'}, code_reference=self.code_reference) self.assertEqual(rebuild, True) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 2 assert BuildJob.objects.count() == 2 assert new_build_job != build_job
def test_create_build_with_latest_tag_and_always_pull_latest_creates_new_job( self): assert BuildJobStatus.objects.count() == 0 assert BuildJob.objects.count() == 0 build_job, rebuild = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image:latest'}, code_reference=self.code_reference) self.assertEqual(rebuild, True) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1 assert BuildJob.objects.count() == 1 # Building with same config does not create a new build job new_build_job, rebuild = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image:latest'}, code_reference=self.code_reference) self.assertEqual(rebuild, True) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 2 assert BuildJob.objects.count() == 2 assert new_build_job != build_job
def test_create_build_with_same_config_and_force_create_new_build_job(self): assert BuildJobStatus.objects.count() == 0 assert BuildJob.objects.count() == 0 build_job = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image:test'}, code_reference=self.code_reference) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1 assert BuildJob.objects.count() == 1 # Building with same config and force creates a new build job new_build_job = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image:test'}, code_reference=self.code_reference, nocache=True) assert BuildJobStatus.objects.count() == 2 assert BuildJob.objects.count() == 2 assert new_build_job != build_job # Building with same config does not create a new build job new_build_job_v2 = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image:test'}, code_reference=self.code_reference) assert BuildJobStatus.objects.count() == 2 assert BuildJob.objects.count() == 2 assert new_build_job == new_build_job_v2
def create_build_job(user, project, config, code_reference, configmap_refs=None, secret_refs=None): """Get or Create a build job based on the params. If a build job already exists, then we check if the build has already an image created. If the image does not exists, and the job is already done we force create a new job. Returns: tuple: (build_job, image_exists[bool], build_status[bool]) """ build_job, rebuild = BuildJob.create(user=user, project=project, config=config, code_reference=code_reference, configmap_refs=configmap_refs, secret_refs=secret_refs) if build_job.succeeded and not rebuild: # Check if image was built in less than an 6 hours return build_job, True, False if check_image(build_job=build_job): # Check if image exists already return build_job, True, False if build_job.is_done: build_job, _ = BuildJob.create(user=user, project=project, config=config, code_reference=code_reference, configmap_refs=configmap_refs, secret_refs=secret_refs, nocache=True) if not build_job.is_running: # We need to build the image first auditor.record(event_type=BUILD_JOB_STARTED_TRIGGERED, instance=build_job, actor_id=user.id, actor_name=user.username) build_status = start_dockerizer(build_job=build_job) else: build_status = True return build_job, False, build_status
def test_archive(self): assert BuildJobStatus.objects.count() == 0 experiment = ExperimentFactory(project=self.project) build_job, rebuild = BuildJob.create( user=experiment.user, project=experiment.project, config=experiment.specification.build, configmap_refs=experiment.specification.configmap_refs, secret_refs=experiment.specification.secret_refs, code_reference=self.code_reference) self.assertEqual(rebuild, True) assert build_job.deleted is False assert BuildJob.objects.count() == 1 assert BuildJob.all.count() == 1 build_job.archive() assert build_job.deleted is True assert BuildJob.objects.count() == 0 assert BuildJob.all.count() == 1 build_job.restore() assert build_job.deleted is False assert BuildJob.objects.count() == 1 assert BuildJob.all.count() == 1
def test_create_build_from_notebook(self): assert BuildJobStatus.objects.count() == 0 notebook = NotebookJobFactory(project=self.project) build_job = BuildJob.create(user=notebook.user, project=notebook.project, config=notebook.specification.build, code_reference=self.code_reference) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1
def test_create_build_from_notebook(self): assert BuildJobStatus.objects.count() == 0 notebook = NotebookJobFactory(project=self.project) build_job = BuildJob.create( user=notebook.user, project=notebook.project, config=notebook.specification.build, code_reference=self.code_reference) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1
def test_create_build_with_same_config(self): assert BuildJobStatus.objects.count() == 0 assert BuildJob.objects.count() == 0 build_job = BuildJob.create(user=self.project.user, project=self.project, config={'image': 'my_image:test'}, code_reference=self.code_reference) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1 assert BuildJob.objects.count() == 1 # Building with same config does not create a new build job new_build_job = BuildJob.create(user=self.project.user, project=self.project, config={'image': 'my_image:test'}, code_reference=self.code_reference) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1 assert BuildJob.objects.count() == 1 assert new_build_job == build_job
def test_create_build_job_from_experiment(self): assert BuildJobStatus.objects.count() == 0 experiment = ExperimentFactory(project=self.project) build_job = BuildJob.create(user=experiment.user, project=experiment.project, config=experiment.specification.build, code_reference=self.code_reference) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1
def test_create_build_job_from_experiment(self): assert BuildJobStatus.objects.count() == 0 experiment = ExperimentFactory(project=self.project) build_job = BuildJob.create( user=experiment.user, project=experiment.project, config=experiment.specification.build, code_reference=self.code_reference) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1
def create_build_job(user, project, config, code_reference): """Get or Create a build job based on the params. If a build job already exists, then we check if the build has already an image created. If the image does not exists, and the job is already done we force create a new job. Returns: tuple: (build_job, image_exists[bool], build_status[bool]) """ build_job = BuildJob.create(user=user, project=project, config=config, code_reference=code_reference) if check_image(build_job=build_job): # Check if image exists already return build_job, True, False if build_job.succeeded and (now() - build_job.finished_at).seconds < 3600: # Check if image was built in less than an hour return build_job, True, False if build_job.is_done: build_job = BuildJob.create(user=user, project=project, config=config, code_reference=code_reference, force=True) if not build_job.is_running: # We need to build the image first auditor.record(event_type=BUILD_JOB_STARTED_TRIGGERED, instance=build_job, target='project', actor_id=user.id) build_status = start_dockerizer(build_job=build_job) else: build_status = True return build_job, False, build_status
def test_create_build_without_tag_always_results_in_new_job(self): assert BuildJobStatus.objects.count() == 0 assert BuildJob.objects.count() == 0 build_job = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image'}, code_reference=self.code_reference) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1 assert BuildJob.objects.count() == 1 # Building with same config does not create a new build job new_build_job = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image'}, code_reference=self.code_reference) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 2 assert BuildJob.objects.count() == 2 assert new_build_job != build_job
def test_create_build_with_same_config_and_invalid_create_new_build_job( self): assert BuildJobStatus.objects.count() == 0 assert BuildJob.objects.count() == 0 build_job, rebuild = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image:test'}, code_reference=self.code_reference) self.assertEqual(rebuild, True) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1 assert BuildJob.objects.count() == 1 # Building with same config does not create a new build job new_build_job, rebuild = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image:test'}, code_reference=self.code_reference) self.assertEqual(rebuild, False) assert BuildJobStatus.objects.count() == 1 assert BuildJob.objects.count() == 1 assert build_job == new_build_job # Invalidating the build results in creating a new build build_job.valid = False build_job.save() new_build_job, rebuild = BuildJob.create( user=self.project.user, project=self.project, config={'image': 'my_image:test'}, code_reference=self.code_reference) self.assertEqual(rebuild, True) assert BuildJobStatus.objects.count() == 2 assert BuildJob.objects.count() == 2 assert build_job != new_build_job
def test_build_job_statuses(self): assert BuildJobStatus.objects.count() == 0 experiment = ExperimentFactory(project=self.project) build_job = BuildJob.create(user=experiment.user, project=experiment.project, config=experiment.specification.run_exec, code_reference=self.code_reference) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1 build_job.set_status(JobLifeCycle.FAILED) assert BuildJobStatus.objects.count() == 2 build_job.set_status(JobLifeCycle.SUCCEEDED) assert BuildJobStatus.objects.count() == 2
def test_build_job_statuses(self): assert BuildJobStatus.objects.count() == 0 experiment = ExperimentFactory(project=self.project) build_job, rebuild = BuildJob.create( user=experiment.user, project=experiment.project, config=experiment.specification.build, configmap_refs=experiment.specification.configmap_refs, secret_refs=experiment.specification.secret_refs, code_reference=self.code_reference) self.assertEqual(rebuild, True) assert build_job.last_status == JobLifeCycle.CREATED assert BuildJobStatus.objects.count() == 1 build_job.set_status(JobLifeCycle.FAILED) assert BuildJobStatus.objects.count() == 2 build_job.set_status(JobLifeCycle.SUCCEEDED) assert BuildJobStatus.objects.count() == 2