def test_precheck(github_pr_event): flexmock(PullRequestModel).should_receive("get_or_create").with_args( pr_id=342, namespace="packit-service", repo_name="packit", project_url="https://github.com/packit-service/packit", ).and_return( flexmock(id=342, job_config_trigger_type=JobConfigTriggerType.pull_request)) copr_build_handler = CoprBuildHandler( package_config=PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, ), ]), job_config=JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, ), event=github_pr_event.get_dict(), ) assert copr_build_handler.pre_check()
def test_precheck_skip_tests_when_build_defined(pull_request_event): flexmock(AbstractGithubCoprBuildHandler).should_receive( "get_package_config_from_repo").and_return( PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata={}, ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata={}, ), ])) copr_build_handler = AbstractGithubCoprBuildHandler( config=flexmock(), job_config=JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata={}, ), event=pull_request_event, ) assert not copr_build_handler.pre_check()
def test_job_config_blah(): with pytest.raises(PackitInvalidConfigException) as ex: JobConfig.get_from_dict({ "job": "asdqwe", "trigger": "salt", "notify": [] }) assert "'asdqwe' is not one of " in str(ex.value)
def get_default_job_config(**kwargs): """ pass kwargs to JobConfig constructor """ return [ JobConfig(type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(targets=["fedora-stable"]), **kwargs), JobConfig(type=JobType.propose_downstream, trigger=JobConfigTriggerType.release, metadata=JobMetadataConfig(dist_git_branches=["fedora-all"]), **kwargs), ]
def test_package_config_equal(): assert PackageConfig( specfile_path="fedora/package.spec", synced_files=["a", "b"], jobs=[JobConfig(trigger=TriggerType.release, release_to=["f28"], metadata={})], metadata={"c": "d"}, ) == PackageConfig( specfile_path="fedora/package.spec", synced_files=["a", "b"], jobs=[JobConfig(trigger=TriggerType.release, release_to=["f28"], metadata={})], metadata={"c": "d"}, )
def get_default_job_config(): return [ JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata={"targets": ["fedora-stable"]}, ), JobConfig( type=JobType.propose_downstream, trigger=JobConfigTriggerType.release, metadata={"dist-git-branch": ["fedora-all"]}, ), ]
def build_handler(metadata=None, trigger=None): if not metadata: metadata = { "owner": "nobody", "targets": [ "fedora-29-x86_64", "fedora-30-x86_64", "fedora-31-x86_64", "fedora-rawhide-x86_64", ], } jobs = [ JobConfig( job=JobType.copr_build, trigger=trigger or JobTriggerType.pull_request, metadata=metadata, ) ] pkg_conf = PackageConfig(jobs=jobs, downstream_package_name="dummy") event = Parser.parse_pr_event(pull_request()) handler = CoprBuildHandler( config=ServiceConfig(), package_config=pkg_conf, project=GitProject("", GitService(), ""), event=event, ) handler._api = PackitAPI(ServiceConfig, pkg_conf) return handler
def build_helper( event: Union[PullRequestEvent, PullRequestCommentEvent, CoprBuildEvent, PushGitHubEvent, ReleaseEvent, ], metadata=None, trigger=None, jobs=None, ): if not metadata: metadata = { "owner": "nobody", "targets": [ "fedora-29-x86_64", "fedora-30-x86_64", "fedora-31-x86_64", "fedora-rawhide-x86_64", ], } jobs = jobs or [] jobs.append( JobConfig( type=JobType.copr_build, trigger=trigger or JobConfigTriggerType.pull_request, metadata=metadata, )) pkg_conf = PackageConfig(jobs=jobs, downstream_package_name="dummy") handler = CoprBuildJobHelper( config=ServiceConfig(), package_config=pkg_conf, project=GitProject("", GitService(), ""), event=event, ) handler._api = PackitAPI(ServiceConfig(), pkg_conf) return handler
def test_create_source_script_with_job_config(): test_job_config = JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.release, metadata=JobMetadataConfig(project="example1"), ) expected_command = ( 'packit -d prepare-sources --result-dir "$resultdir" ' f"--job-config {JobConfigSchema().dumps(test_job_config)!r}" f" https://github.com/packit/ogr" ) assert ( create_source_script( job_config=test_job_config, url="https://github.com/packit/ogr" ) == f""" #!/bin/sh git config --global user.email "*****@*****.**" git config --global user.name "Packit" resultdir=$PWD {expected_command} """ )
def test_distro2compose_for_aarch64(distro, arch, compose, use_internal_tf): job_helper = TFJobHelper( service_config=flexmock( testing_farm_api_url="xyz", ), package_config=flexmock(jobs=[]), project=flexmock(), metadata=flexmock(), db_trigger=flexmock(), job_config=JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(use_internal_tf=use_internal_tf), ), ) job_helper = flexmock(job_helper) response = flexmock( status_code=200, json=lambda: {"composes": [{"name": "Fedora-33"}]} ) job_helper.should_receive("send_testing_farm_request").and_return(response).times( 0 if use_internal_tf else 1 ) assert job_helper.distro2compose(distro, arch=arch) == compose
def get_job_config_full(): return JobConfig( job=JobType.propose_downstream, trigger=JobTriggerType.pull_request, notify=[JobNotifyType.pull_request_status], metadata={"a": "b"}, )
def get_job_config_build_for_branch(**kwargs): """ pass kwargs to JobConfig constructor """ return JobConfig(type=JobType.copr_build, trigger=JobConfigTriggerType.commit, metadata=JobMetadataConfig(branch="build-branch", scratch=True), **kwargs)
def test_copr_build_for_release(release_event): # status is set for each build-target (4x): # - Building SRPM ... # - Building RPM ... branch_build_job = JobConfig( type=JobType.build, trigger=JobConfigTriggerType.release, metadata={ "branch": "build-branch", "owner": "nobody", "targets": [ "fedora-29-x86_64", "fedora-30-x86_64", "fedora-31-x86_64", "fedora-rawhide-x86_64", ], }, ) helper = build_helper(jobs=[branch_build_job], event=release_event) flexmock(GitProject).should_receive("set_commit_status").and_return().times(8) flexmock(RedisCoprBuild).should_receive("create").and_return(FakeCoprBuildModel()) flexmock(SRPMBuild).should_receive("create").and_return(SRPMBuild()) flexmock(CoprBuild).should_receive("get_or_create").and_return(CoprBuild(id=1)) flexmock(PackitAPI).should_receive("run_copr_build").and_return(1, None).once() assert helper.run_copr_build()["success"]
def test_copr_build_for_release(release_event): # status is set for each build-target (4x): # - Building SRPM ... # - Building RPM ... branch_build_job = JobConfig( type=JobType.build, trigger=JobConfigTriggerType.release, metadata=JobMetadataConfig( targets=[ "fedora-29-x86_64", "fedora-30-x86_64", "fedora-31-x86_64", "fedora-rawhide-x86_64", ], owner="nobody", dist_git_branches=["build-branch"], ), ) flexmock(AddReleaseDbTrigger).should_receive("db_trigger").and_return( flexmock(job_config_trigger_type=JobConfigTriggerType.release) ) helper = build_helper(jobs=[branch_build_job], event=release_event) flexmock(ReleaseEvent).should_receive("get_project").and_return(helper.project) flexmock(GitProject).should_receive("set_commit_status").and_return().times(8) flexmock(GitProject).should_receive("get_sha_from_tag").and_return("123456").once() flexmock(SRPMBuildModel).should_receive("create").and_return(SRPMBuildModel()) flexmock(CoprBuildModel).should_receive("get_or_create").and_return( CoprBuildModel(id=1) ) flexmock(PackitAPI).should_receive("run_copr_build").and_return(1, None).once() flexmock(Celery).should_receive("send_task").once() assert helper.run_copr_build()["success"]
def test_handler_cleanup(tmp_path, trick_p_s_with_k8s): tmp_path.joinpath("a").mkdir() tmp_path.joinpath("b").write_text("a") tmp_path.joinpath("c").symlink_to("b") tmp_path.joinpath("d").symlink_to("a", target_is_directory=True) tmp_path.joinpath("e").symlink_to("nope", target_is_directory=False) tmp_path.joinpath("f").symlink_to("nopez", target_is_directory=True) tmp_path.joinpath(".g").write_text("g") tmp_path.joinpath(".h").symlink_to(".g", target_is_directory=False) c = ServiceConfig() pc = flexmock(PackageConfig) c.command_handler_work_dir = tmp_path jc = JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(), ) j = JobHandler( package_config=pc, job_config=jc, event={}, ) flexmock(j).should_receive("service_config").and_return(c) j._clean_workplace() assert len(list(tmp_path.iterdir())) == 0
def pc_tests(): return PackageConfig(jobs=[ JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata={"targets": ["fedora-all"]}, ) ])
def pc_build_push(): return PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.commit, metadata=JobMetadataConfig(_targets=["fedora-all"]), ) ])
def pc_build_release(): return PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.release, metadata={"targets": ["fedora-all"]}, ) ])
def get_job_config_full(**kwargs): """ pass kwargs to JobConfig constructor """ return JobConfig( type=JobType.propose_downstream, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(dist_git_branches=["master"]), **kwargs )
def pc_build(): return PackageConfig(jobs=[ JobConfig( job=JobType.copr_build, trigger=JobTriggerType.pull_request, metadata={"targets": ["fedora-all"]}, ) ])
def pc_koji_build_pr(): return PackageConfig(jobs=[ JobConfig( type=JobType.production_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(_targets=["fedora-all"]), ) ])
def pc_build_pr(): pc = PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(targets=["fedora-all"]), ) ]) return pc
def test_copr_build_for_release(release_event): # status is set for each build-target (4x): # - Building SRPM ... # - Starting RPM build... branch_build_job = JobConfig( type=JobType.build, trigger=JobConfigTriggerType.release, metadata=JobMetadataConfig( targets=[ "fedora-29-x86_64", "fedora-30-x86_64", "fedora-31-x86_64", "fedora-rawhide-x86_64", ], owner="nobody", dist_git_branches=["build-branch"], ), ) trigger = flexmock(job_config_trigger_type=JobConfigTriggerType.release, id=123) flexmock(AddReleaseDbTrigger).should_receive("db_trigger").and_return(trigger) flexmock(release_event.project).should_receive("get_sha_from_tag").and_return( "123456" ) helper = build_helper( jobs=[branch_build_job], event=release_event, db_trigger=trigger, ) flexmock(ReleaseEvent).should_receive("get_project").and_return(helper.project) flexmock(GitProject).should_receive("set_commit_status").and_return().times(8) flexmock(SRPMBuildModel).should_receive("create").and_return( SRPMBuildModel(success=True) ) flexmock(CoprBuildModel).should_receive("get_or_create").and_return( CoprBuildModel(id=1) ) flexmock(PackitAPI).should_receive("create_srpm").and_return("my.srpm") # copr build flexmock(CoprHelper).should_receive("create_copr_project_if_not_exists").and_return( None ) flexmock(CoprHelper).should_receive("get_copr_client").and_return( flexmock( config={"copr_url": "https://copr.fedorainfracloud.org/"}, build_proxy=flexmock() .should_receive("create_from_file") .and_return( flexmock(id=2, projectname="the-project-name", ownername="the-owner") ) .mock(), ) ) flexmock(Celery).should_receive("send_task").once() assert helper.run_copr_build()["success"]
def test_testing_farm_response( tests_result, tests_message, tests_tests, status_status, status_message ): flexmock(TFResultsHandler).should_receive( "get_package_config_from_repo" ).and_return( flexmock( jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata={}, ) ], ) ) test_farm_handler = TFResultsHandler( config=flexmock(command_handler_work_dir=flexmock()), job_config=flexmock(), event=TFResultsEvent( pipeline_id="id", result=tests_result, environment=flexmock(), message=tests_message, log_url="some url", copr_repo_name=flexmock(), copr_chroot="fedora-rawhide-x86_64", tests=tests_tests, repo_namespace=flexmock(), repo_name=flexmock(), git_ref=flexmock(), https_url=flexmock(), commit_sha=flexmock(), ), ) flexmock(StatusReporter).should_receive("report").with_args( state=status_status, description=status_message, url="some url", check_names="packit-stg/testing-farm-fedora-rawhide-x86_64", ) tft_test_run_model = flexmock() tft_test_run_model.should_receive("set_status").with_args( tests_result ).and_return().once() tft_test_run_model.should_receive("set_web_url").with_args( "some url" ).and_return().once() flexmock(TFTTestRunModel).should_receive("get_by_pipeline_id").and_return( tft_test_run_model ) flexmock(LocalProject).should_receive("refresh_the_arguments").and_return(None) test_farm_handler.run()
def test_precheck_skip_tests_when_build_defined(github_pr_event): copr_build_handler = AbstractCoprBuildHandler( package_config=PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, ), ]), job_config=JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, ), data=EventData.from_event_dict(github_pr_event.get_dict()), ) assert not copr_build_handler.pre_check()
def test_precheck_koji_build_non_scratch(github_pr_event): flexmock(PullRequestModel).should_receive("get_or_create").with_args( pr_id=342, namespace="packit-service", repo_name="packit", project_url="https://github.com/packit-service/packit", ).and_return( flexmock( id=342, job_config_trigger_type=JobConfigTriggerType.pull_request, job_trigger_model_type=JobTriggerModelType.pull_request, )) flexmock(JobTriggerModel).should_receive("get_or_create").with_args( type=JobTriggerModelType.pull_request, trigger_id=342).and_return( flexmock(id=2, type=JobTriggerModelType.pull_request)) flexmock(StatusReporterGithubChecks).should_receive( "set_status").with_args( state=BaseCommitStatus.neutral, description="Non-scratch builds not possible from upstream.", check_name="production-build:bright-future", url=KOJI_PRODUCTION_BUILDS_ISSUE, links_to_external_services=None, markdown_content=None, ).and_return().once() flexmock(GithubProject).should_receive("can_merge_pr").and_return(True) koji_build_handler = KojiBuildHandler( package_config=PackageConfig(jobs=[ JobConfig( type=JobType.production_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(_targets=["bright-future"], scratch=False), ), ]), job_config=JobConfig( type=JobType.production_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(_targets=["bright-future"], scratch=False), ), event=github_pr_event.get_dict(), ) assert not koji_build_handler.pre_check()
def test_precheck_push_to_a_different_branch(github_push_event): flexmock(GitBranchModel).should_receive("get_or_create").and_return( flexmock(id=1, job_config_trigger_type=JobConfigTriggerType.commit)) copr_build_handler = CoprBuildHandler( package_config=PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.commit, metadata=JobMetadataConfig(branch="bad-branch"), ), ]), job_config=JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.commit, metadata=JobMetadataConfig(branch="bad-branch"), ), event=github_push_event.get_dict(), ) assert not copr_build_handler.pre_check()
def test_repository_cache_invocation(): copr_build_helper = CoprBuildJobHelper( service_config=flexmock( repository_cache="/tmp/repository-cache", add_repositories_to_repository_cache=False, command_handler_work_dir="/tmp/some-dir", ), package_config=PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(_targets=STABLE_VERSIONS), ) ], ), job_config=JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(_targets=STABLE_VERSIONS), ), project=flexmock( service=flexmock(), get_git_urls=lambda: {"git": "https://github.com/some-namespace/some-repo.git"}, repo=flexmock(), namespace=flexmock(), ), metadata=flexmock(pr_id=None, git_ref=flexmock()), db_trigger=flexmock( job_config_trigger_type=JobConfigTriggerType.pull_request), ) flexmock(RepositoryCache).should_call("__init__").once() flexmock(RepositoryCache).should_receive("get_repo").with_args( "https://github.com/some-namespace/some-repo.git", directory=Path("/tmp/some-dir"), ).and_return( flexmock( git=flexmock().should_receive("checkout").and_return().mock(), commit=lambda: "commit", )).once() assert copr_build_helper.local_project
def test_copr_build_for_branch(branch_push_event): # status is set for each build-target (4x): # - Building SRPM ... # - Starting RPM build... branch_build_job = JobConfig( type=JobType.build, trigger=JobConfigTriggerType.commit, metadata=JobMetadataConfig( targets=DEFAULT_TARGETS, owner="nobody", dist_git_branches=["build-branch"], ), ) trigger = flexmock(job_config_trigger_type=JobConfigTriggerType.commit, id=123) flexmock(AddBranchPushDbTrigger).should_receive("db_trigger").and_return( trigger) helper = build_helper( jobs=[branch_build_job], event=branch_push_event, db_trigger=trigger, ) flexmock(GitProject).should_receive( "set_commit_status").and_return().times(8) flexmock(SRPMBuildModel).should_receive("create").and_return( SRPMBuildModel(success=True)) flexmock(CoprBuildModel).should_receive("get_or_create").and_return( CoprBuildModel(id=1)) flexmock(PushGitHubEvent).should_receive("db_trigger").and_return( flexmock()) flexmock(PackitAPI).should_receive("create_srpm").and_return("my.srpm") # copr build flexmock(CoprHelper).should_receive( "create_copr_project_if_not_exists").and_return(None) flexmock(CoprHelper).should_receive("get_copr_client").and_return( flexmock( config={"copr_url": "https://copr.fedorainfracloud.org/"}, build_proxy=flexmock().should_receive( "create_from_file").and_return( flexmock(id=2, projectname="the-project-name", ownername="the-owner")).mock(), mock_chroot_proxy=flexmock().should_receive("get_list").and_return( {target: "" for target in DEFAULT_TARGETS}).mock(), )) flexmock(Pushgateway).should_receive("push_copr_build_created") flexmock(Celery).should_receive("send_task").once() assert helper.run_copr_build()["success"]
def test_check_copr_build_updated(): flexmock(CoprBuildModel).should_receive("get_by_build_id").and_return() flexmock(CoprBuildModel).should_receive("get_all_by_build_id").with_args( 1).and_return([ flexmock( status="pending", target="the-target", owner="the-owner", project_name="the-project-name", commit_sha="123456", job_trigger=flexmock(type=JobTriggerModelType.pull_request). should_receive("get_trigger_object").and_return( flexmock( project=flexmock( repo_name="repo_name", namespace="the-namespace", project_url= "https://github.com/the-namespace/repo_name", ), pr_id=5, job_config_trigger_type=JobConfigTriggerType. pull_request, id=123, )).mock(), srpm_build=flexmock(url=None).should_receive( "set_url").with_args("https://some.host/my.srpm").mock(), ) ]) flexmock(Client).should_receive("create_from_config_file").and_return( flexmock( build_proxy=flexmock().should_receive("get").with_args( 1).and_return( flexmock( ended_on=True, state="completed", source_package={ "name": "source_package_name", "url": "https://some.host/my.srpm", }, )).mock(), build_chroot_proxy=flexmock().should_receive("get").with_args( 1, "the-target").and_return( flexmock(ended_on="timestamp", state="completed")).mock(), )) flexmock(AbstractCoprBuildEvent).should_receive( "get_package_config").and_return( PackageConfig(jobs=[ JobConfig(type=JobType.build, trigger=JobConfigTriggerType.pull_request) ])) flexmock(CoprBuildEndHandler).should_receive("run").and_return().once() assert check_copr_build(build_id=1)