예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
    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
예제 #4
0
    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
예제 #5
0
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
예제 #6
0
    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
예제 #7
0
 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
예제 #8
0
 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
예제 #9
0
    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
예제 #10
0
    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
예제 #11
0
    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
예제 #12
0
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
예제 #13
0
    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
예제 #14
0
    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
예제 #15
0
    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
예제 #16
0
    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