def get_raw_request( self, url, method="GET", params=None, data=None, header=None ) -> RequestResponse: response = self.session.request( method=method, url=url, params=params, headers=header or self.header, data=data, verify=not self.insecure, ) json_output = None try: json_output = response.json() except ValueError: logger.debug(response.text) return RequestResponse( status_code=response.status_code, ok=response.ok, content=response.content, json=json_output, reason=response.reason, )
def http_request(self, *args, **kwargs): keys_internal = list(args) + [str(OrderedDict(kwargs))] if self.persistent_storage.is_write_mode: output = None try: raw_response = super().http_request(*args, **kwargs) try: json_output = raw_response.json() except ValueError: json_output = None output = RequestResponse( status_code=raw_response.status_code, ok=raw_response.ok, content=raw_response.content, json=json_output, reason=raw_response.reason, headers=raw_response.headers, links=raw_response.links, ) except (gitlab.GitlabHttpError, gitlab.GitlabAuthenticationError) as ex: output = RequestResponse( status_code=ex.response_code, ok=False, content=ex.response_body, exception={ "type": ex.__class__.__name__, "response_body": ex.response_body, "response_code": ex.response_code, "error_message": ex.error_message, }, ) raise ex finally: if output: self.persistent_storage.store( keys=keys_internal, values=output.to_json_format()) else: output_dict = self.persistent_storage.read(keys=keys_internal) output = RequestResponse(**output_dict) if output.exception: error_cls_name = output.exception.get( "type", gitlab.GitlabHttpError.__name__) error_cls = { gitlab.GitlabHttpError.__name__: gitlab.GitlabHttpError, gitlab.GitlabAuthenticationError.__name__: gitlab.GitlabAuthenticationError, }[error_cls_name] raise error_cls( response_body=output.exception["response_body"], response_code=output.exception["response_code"], error_message=output.exception["error_message"], ) return output
def get_raw_request(self, url, method="GET", params=None, data=None): keys_internal = [method, url, params, data] if self.persistent_storage.is_write_mode: output = super().get_raw_request(url, method=method, params=params, data=data) self.persistent_storage.store(keys=keys_internal, values=output.to_json_format()) else: logger.debug(f"Persistent libpagure API: {keys_internal}") output_dict = self.persistent_storage.read(keys=keys_internal) output = RequestResponse(**output_dict) return output
def get_raw_request(self, url, method="GET", params=None, data=None, header=None) -> RequestResponse: """ Call API endpoint and wrap the response in `RequestResponse` type. Args: url: URL to be called. method: Method of the HTTP request, e.g. `"GET"`, `"POST"`, etc. Defaults to `"GET"`. params: HTTP(S) query parameters in form of a dictionary. data: Data to be sent in form of a dictionary. header: Header of the HTTP request. Returns: `RequestResponse` object representing the response. Raises: ValueError, if JSON cannot be retrieved. """ response = self.session.request( method=method, url=url, params=params, headers=header or self.header, data=data, verify=not self.insecure, ) json_output = None try: json_output = response.json() except ValueError: logger.debug(response.text) return RequestResponse( status_code=response.status_code, ok=response.ok, content=response.content, json=json_output, reason=response.reason, )
def test_pr_test_command_handler_skip_build_option(pr_embedded_command_comment_event): jobs = [ { "trigger": "pull_request", "job": "tests", "metadata": {"targets": "fedora-rawhide-x86_64", "skip_build": True}, } ] packit_yaml = ( "{'specfile_path': 'the-specfile.spec', 'synced_files': [], 'jobs': " + str(jobs) + "}" ) pr = flexmock( head_commit="12345", source_project=flexmock(get_web_url=lambda: "https://github.com/foo/bar"), target_branch_head_commit="6789a", ) flexmock(GithubProject).should_receive("get_pr").and_return(pr) comment = flexmock() flexmock(pr).should_receive("get_comment").and_return(comment) flexmock(comment).should_receive("add_reaction").with_args("+1").once() flexmock( GithubProject, full_repo_name="packit-service/hello-world", get_file_content=lambda path, ref: packit_yaml, get_files=lambda ref, filter_regex: ["the-specfile.spec"], get_web_url=lambda: "https://github.com/the-namespace/the-repo", ) flexmock(Github, get_repo=lambda full_name_or_id: None) tft_api_url = "https://api.dev.testing-farm.io/v0.1/" config = ServiceConfig( command_handler_work_dir=SANDCASTLE_WORK_DIR, testing_farm_api_url=tft_api_url, testing_farm_secret="secret token", ) flexmock(ServiceConfig).should_receive("get_service_config").and_return(config) trigger = flexmock( job_config_trigger_type=JobConfigTriggerType.pull_request, id=123 ) flexmock(AddPullRequestDbTrigger).should_receive("db_trigger").and_return(trigger) flexmock(PullRequestModel).should_receive("get_by_id").with_args(123).and_return( trigger ) flexmock(LocalProject, refresh_the_arguments=lambda: None) flexmock(Allowlist, check_and_report=True) pr_model = flexmock( id=9, job_config_trigger_type=JobConfigTriggerType.pull_request, job_trigger_model_type=JobTriggerModelType.pull_request, ) flexmock(PullRequestModel).should_receive("get_or_create").with_args( pr_id=9, namespace="packit-service", repo_name="hello-world", project_url="https://github.com/packit-service/hello-world", ).and_return(pr_model) flexmock(JobTriggerModel).should_receive("get_or_create").with_args( type=JobTriggerModelType.pull_request, trigger_id=9 ).and_return(flexmock(id=2, type=JobTriggerModelType.pull_request)) pr_embedded_command_comment_event["comment"]["body"] = "/packit test" flexmock(GithubProject, get_files="foo.spec") flexmock(GithubProject).should_receive("is_private").and_return(False) flexmock(copr_build).should_receive("get_valid_build_targets").and_return( {"fedora-rawhide-x86_64"} ) flexmock(TestingFarmJobHelper).should_receive("get_latest_copr_build").never() flexmock(Pushgateway).should_receive("push").twice().and_return() flexmock(CoprBuildJobHelper).should_receive("report_status_to_tests").with_args( description=TASK_ACCEPTED, state=BaseCommitStatus.pending, url="", ).once() payload = { "api_key": "secret token", "test": { "fmf": { "url": "https://github.com/foo/bar", "ref": "12345", }, }, "environments": [ { "arch": "x86_64", "os": {"compose": "Fedora-Rawhide"}, "tmt": { "context": { "distro": "fedora-rawhide", "arch": "x86_64", "trigger": "commit", } }, "variables": { "PACKIT_FULL_REPO_NAME": "packit-service/hello-world", "PACKIT_UPSTREAM_NAME": "hello-world", "PACKIT_DOWNSTREAM_NAME": "hello-world", "PACKIT_DOWNSTREAM_URL": "https://src.fedoraproject.org/rpms/hello-world.git", "PACKIT_PACKAGE_NAME": "hello-world", "PACKIT_COMMIT_SHA": "12345", "PACKIT_TARGET_SHA": "6789a", }, } ], "notification": { "webhook": { "url": "https://stg.packit.dev/api/testing-farm/results", "token": "secret token", } }, } flexmock(TestingFarmJobHelper).should_receive("is_fmf_configured").and_return(True) flexmock(TestingFarmJobHelper).should_receive("distro2compose").and_return( "Fedora-Rawhide" ) pipeline_id = "5e8079d8-f181-41cf-af96-28e99774eb68" flexmock(TestingFarmJobHelper).should_receive( "send_testing_farm_request" ).with_args(endpoint="requests", method="POST", data=payload).and_return( RequestResponse( status_code=200, ok=True, content=json.dumps({"id": pipeline_id}).encode(), json={"id": pipeline_id}, ) ) flexmock(StatusReporter).should_receive("report").with_args( state=BaseCommitStatus.running, description="Submitting the tests ...", check_names="testing-farm:fedora-rawhide-x86_64", url="", markdown_content=None, ).once() flexmock(GithubProject).should_receive("get_web_url").and_return( "https://github.com/foo/bar" ) tft_test_run_model = flexmock(id=5) run_model = flexmock() flexmock(RunModel).should_receive("create").and_return(run_model) flexmock(TFTTestRunModel).should_receive("create").with_args( pipeline_id=pipeline_id, commit_sha="12345", status=TestingFarmResult.new, target="fedora-rawhide-x86_64", web_url=None, run_model=run_model, data={"base_project_url": "https://github.com/foo/bar"}, ).and_return(tft_test_run_model) flexmock(StatusReporter).should_receive("report").with_args( description="Tests have been submitted ...", state=BaseCommitStatus.running, url="https://dashboard.localhost/results/testing-farm/5", check_names="testing-farm:fedora-rawhide-x86_64", markdown_content=None, ).once() flexmock(Signature).should_receive("apply_async").once() processing_results = SteveJobs().process_message(pr_embedded_command_comment_event) event_dict, job, job_config, package_config = get_parameters_from_results( processing_results ) assert json.dumps(event_dict) run_testing_farm_handler( package_config=package_config, event=event_dict, job_config=job_config, )
def test_copr_build_end_failed_testing_farm_no_json(copr_build_end, copr_build): steve = SteveJobs() flexmock(SteveJobs, _is_private=False) flexmock(CoprHelper).should_receive("get_copr_client").and_return( Client( config={ "copr_url": "https://copr.fedorainfracloud.org", "username": "******", })) flexmock(CoprBuildJobHelper).should_receive("job_owner").and_return( "some-owner") flexmock(CoprBuildJobHelper).should_receive("copr_build_model").and_return( flexmock()) config = PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata={"targets": ["fedora-rawhide"]}, ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata={"targets": ["fedora-rawhide"]}, ), ]) flexmock(CoprBuildEvent).should_receive("get_package_config").and_return( config) flexmock(GithubTestingFarmHandler).should_receive( "get_package_config_from_repo").and_return(config) flexmock(CoprBuildEndHandler).should_receive( "was_last_build_successful").and_return(False) flexmock(GithubProject).should_receive("pr_comment") flexmock(LocalProject).should_receive("refresh_the_arguments").and_return( None) flexmock(CoprBuild).should_receive("get_by_build_id").and_return( copr_build) flexmock(CoprBuild).should_receive("set_status").with_args("success") flexmock(CoprBuildDB).should_receive("get_build").and_return({ "commit_sha": "XXXXX", "pr_id": 24, "repo_name": "hello-world", "repo_namespace": "packit-service", "ref": "XXXX", "https_url": "https://github.com/packit-service/hello-world", }) url = get_log_url(1) flexmock(requests).should_receive("get").and_return(requests.Response()) flexmock( requests.Response).should_receive("raise_for_status").and_return(None) # check if packit-service set correct PR status flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.success, description="RPMs were built successfully.", url=url, check_names=EXPECTED_BUILD_CHECK_NAME, ).once() flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="RPMs were built successfully.", url=url, check_names=EXPECTED_TESTING_FARM_CHECK_NAME, ).once() flexmock(TestingFarmJobHelper).should_receive( "send_testing_farm_request").and_return( RequestResponse( status_code=400, ok=False, content="some text error".encode(), reason="some text error", json=None, )) flexmock(CoprBuild).should_receive("set_status").with_args("failure") flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="Build succeeded. Submitting the tests ...", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, url="", ).once() flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.failure, description="Failed to submit tests: some text error", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, url="", ).once() steve.process_message(copr_build_end)
def test_copr_build_end_testing_farm(copr_build_end, copr_build): steve = SteveJobs() flexmock(SteveJobs, _is_private=False) flexmock(CoprHelper).should_receive("get_copr_client").and_return( Client( config={ "copr_url": "https://copr.fedorainfracloud.org", "username": "******", })) flexmock(CoprBuildJobHelper).should_receive("job_owner").and_return( "some-owner") flexmock(CoprBuildJobHelper).should_receive("copr_build_model").and_return( flexmock()) config = PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata={"targets": ["fedora-rawhide"]}, ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata={"targets": ["fedora-rawhide"]}, ), ]) flexmock(CoprBuildEvent).should_receive("get_package_config").and_return( config) flexmock(GithubTestingFarmHandler).should_receive( "get_package_config_from_repo").and_return(config) flexmock(CoprBuildEndHandler).should_receive( "was_last_build_successful").and_return(False) flexmock(GithubProject).should_receive("pr_comment") flexmock(LocalProject).should_receive("refresh_the_arguments").and_return( None) flexmock(CoprBuild).should_receive("get_by_build_id").and_return( copr_build) flexmock(CoprBuild).should_receive("set_status").with_args("success") flexmock(CoprBuildDB).should_receive("get_build").and_return({ "commit_sha": "XXXXX", "pr_id": 24, "repo_name": "hello-world", "repo_namespace": "packit-service", "ref": "XXXX", "https_url": "https://github.com/packit-service/hello-world", }) url = "https://localhost:5000/copr-build/1/logs" flexmock(requests).should_receive("get").and_return(requests.Response()) flexmock( requests.Response).should_receive("raise_for_status").and_return(None) # check if packit-service set correct PR status flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.success, description="RPMs were built successfully.", url=url, check_names=EXPECTED_BUILD_CHECK_NAME, ).once() flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="RPMs were built successfully.", url=url, check_names=EXPECTED_TESTING_FARM_CHECK_NAME, ).once() flexmock(uuid).should_receive("uuid4").and_return( uuid.UUID("5e8079d8-f181-41cf-af96-28e99774eb68")) payload: dict = { "pipeline": { "id": "5e8079d8-f181-41cf-af96-28e99774eb68" }, "api": { "token": "" }, "response-url": "https://stg.packit.dev/api/testing-farm/results", "artifact": { "repo-name": "bar", "repo-namespace": "foo", "copr-repo-name": "some-owner/foo-bar-123-stg", "copr-chroot": "fedora-rawhide-x86_64", "commit-sha": "0011223344", "git-url": "https://github.com/foo/bar.git", "git-ref": "0011223344", }, } flexmock(TestingFarmJobHelper).should_receive( "send_testing_farm_request").with_args( TESTING_FARM_TRIGGER_URL, "POST", {}, json.dumps(payload)).and_return( RequestResponse( status_code=200, ok=True, content='{"url": "some-url"}'.encode(), json={"url": "some-url"}, )) flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="Build succeeded. Submitting the tests ...", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, url="", ).once() flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="Tests are running ...", url="some-url", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, ).once() steve.process_message(copr_build_end)
def test_copr_build_end_failed_testing_farm_no_json(copr_build_end, copr_build_pr): flexmock(GithubProject).should_receive("is_private").and_return(False) flexmock(GithubProject).should_receive("get_pr").and_return( flexmock( source_project=flexmock(get_web_url=lambda: "abc"), target_branch_head_commit="deadbeef", ).should_receive("comment").mock()) config = PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig( _targets=["fedora-rawhide"], owner="some-owner", project="some-project", ), ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(_targets=["fedora-rawhide"]), ), ]) flexmock(AbstractCoprBuildEvent).should_receive( "get_package_config").and_return(config) flexmock(PackageConfigGetter).should_receive( "get_package_config_from_repo").and_return(config) flexmock(CoprBuildEndHandler).should_receive( "was_last_packit_comment_with_congratulation").and_return(False) flexmock(LocalProject).should_receive("refresh_the_arguments").and_return( None) flexmock(CoprBuildModel).should_receive("get_by_build_id").and_return( copr_build_pr) flexmock(CoprBuildModel).should_receive("get_by_id").and_return( copr_build_pr) copr_build_pr.should_call("set_status").with_args("success").once() copr_build_pr.should_receive("set_end_time").once() url = get_copr_build_info_url(1) flexmock(requests).should_receive("get").and_return(requests.Response()) flexmock( requests.Response).should_receive("raise_for_status").and_return(None) # check if packit-service set correct PR status flexmock(StatusReporter).should_receive("report").with_args( state=BaseCommitStatus.success, description="RPMs were built successfully.", url=url, check_names=EXPECTED_BUILD_CHECK_NAME, markdown_content=None, ).once() flexmock(StatusReporter).should_receive("report").with_args( state=BaseCommitStatus.pending, description="RPMs were built successfully.", url=url, check_names=EXPECTED_TESTING_FARM_CHECK_NAME, markdown_content=None, ).once() flexmock(TestingFarmJobHelper).should_receive( "is_fmf_configured").and_return(True) flexmock(TestingFarmJobHelper).should_receive( "send_testing_farm_request").and_return( RequestResponse( status_code=400, ok=False, content=b"some text error", reason="some text error", json=None, )) flexmock(CoprBuildModel).should_receive("set_status").with_args("failure") flexmock(StatusReporter).should_receive("report").with_args( state=BaseCommitStatus.running, description="Build succeeded. Submitting the tests ...", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, url="", markdown_content=None, ).once() flexmock(StatusReporter).should_receive("report").with_args( state=BaseCommitStatus.failure, description="Failed to submit tests: some text error", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, url="", markdown_content=None, ).once() flexmock(Signature).should_receive("apply_async").twice() flexmock(Pushgateway).should_receive("push").twice().and_return() # skip SRPM url since it touches multiple classes flexmock(CoprBuildEndHandler).should_receive("set_srpm_url").and_return( None) processing_results = SteveJobs().process_message(copr_build_end) event_dict, job, job_config, package_config = get_parameters_from_results( processing_results) assert json.dumps(event_dict) flexmock(CoprBuildJobHelper).should_receive( "get_built_packages").and_return([]) run_copr_build_end_handler( package_config=package_config, event=event_dict, job_config=job_config, ) flexmock(TestingFarmHandler).should_receive("db_trigger").and_return( copr_build_pr.get_trigger_object()) run_testing_farm_handler( package_config=package_config, event=event_dict, job_config=job_config, chroot="fedora-rawhide-x86_64", build_id=flexmock(), )
def test_copr_build_end_testing_farm(copr_build_end, copr_build_pr): tft_api_url = "https://api.dev.testing-farm.io/v0.1/" service_config = ServiceConfig(testing_farm_api_url=tft_api_url, testing_farm_secret="secret token") flexmock(ServiceConfig).should_receive("get_service_config").and_return( service_config) flexmock(GithubProject).should_receive("is_private").and_return(False) flexmock(GithubProject).should_receive("get_pr").and_return( flexmock( source_project=flexmock( get_web_url=lambda: "https://github.com/foo/bar"), target_branch_head_commit="deadbeef", ).should_receive("comment").mock()) urls.DASHBOARD_URL = "https://dashboard.localhost" config = PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig( _targets=["fedora-rawhide"], owner="some-owner", project="some-project", ), ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(_targets=["fedora-rawhide"]), ), ]) flexmock(AbstractCoprBuildEvent).should_receive( "get_package_config").and_return(config) flexmock(PackageConfigGetter).should_receive( "get_package_config_from_repo").and_return(config) flexmock(CoprBuildEndHandler).should_receive( "was_last_packit_comment_with_congratulation").and_return(False) flexmock(LocalProject).should_receive("refresh_the_arguments").and_return( None) flexmock(CoprBuildModel).should_receive("get_by_build_id").and_return( copr_build_pr) flexmock(CoprBuildModel).should_receive("get_by_id").and_return( copr_build_pr) copr_build_pr.should_call("set_status").with_args("success").once() copr_build_pr.should_receive("set_end_time").once() flexmock(requests).should_receive("get").and_return(requests.Response()) flexmock( requests.Response).should_receive("raise_for_status").and_return(None) # check if packit-service set correct PR status url = get_copr_build_info_url(1) flexmock(StatusReporter).should_receive("report").with_args( state=BaseCommitStatus.success, description="RPMs were built successfully.", url=url, check_names=EXPECTED_BUILD_CHECK_NAME, markdown_content=None, ).once() flexmock(StatusReporter).should_receive("report").with_args( state=BaseCommitStatus.pending, description="RPMs were built successfully.", url=url, check_names=EXPECTED_TESTING_FARM_CHECK_NAME, markdown_content=None, ).once() payload = { "api_key": "secret token", "test": { "fmf": { "url": "https://github.com/foo/bar", "ref": "0011223344", }, }, "environments": [{ "arch": "x86_64", "os": { "compose": "Fedora-Rawhide" }, "tmt": { "context": { "distro": "fedora-rawhide", "arch": "x86_64", "trigger": "commit", } }, "artifacts": [ { "id": "1:fedora-rawhide-x86_64", "type": "fedora-copr-build", "packages": ["bar-0.1-1.noarch"], }, ], "variables": { "PACKIT_FULL_REPO_NAME": "foo/bar", "PACKIT_COMMIT_SHA": "0011223344", "PACKIT_PACKAGE_NVR": "bar-0.1-1", "PACKIT_BUILD_LOG_URL": "https://log-url", "PACKIT_TARGET_SHA": "deadbeef", }, }], "notification": { "webhook": { "url": "https://stg.packit.dev/api/testing-farm/results", "token": "secret token", } }, } flexmock(TestingFarmJobHelper).should_receive( "is_fmf_configured").and_return(True) flexmock(TestingFarmJobHelper).should_receive("distro2compose").with_args( "fedora-rawhide", "x86_64").and_return("Fedora-Rawhide") pipeline_id = "5e8079d8-f181-41cf-af96-28e99774eb68" flexmock(TestingFarmJobHelper).should_receive( "send_testing_farm_request").with_args( endpoint="requests", method="POST", data=payload).and_return( RequestResponse( status_code=200, ok=True, content=json.dumps({ "id": pipeline_id }).encode(), json={"id": pipeline_id}, )) flexmock(StatusReporter).should_receive("report").with_args( state=BaseCommitStatus.running, description="Build succeeded. Submitting the tests ...", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, url="", markdown_content=None, ).once() flexmock(GithubProject).should_receive("get_web_url").and_return( "https://github.com/foo/bar") tft_test_run_model = flexmock(id=5) flexmock(TFTTestRunModel).should_receive("create").with_args( pipeline_id=pipeline_id, commit_sha="0011223344", status=TestingFarmResult.new, target="fedora-rawhide-x86_64", web_url=None, run_model=copr_build_pr.runs[0], data={ "base_project_url": "https://github.com/foo/bar" }, ).and_return(tft_test_run_model) flexmock(StatusReporter).should_receive("report").with_args( state=BaseCommitStatus.running, description="Tests have been submitted ...", url="https://dashboard.localhost/results/testing-farm/5", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, markdown_content=None, ).once() flexmock(Signature).should_receive("apply_async").twice() # skip SRPM url since it touches multiple classes flexmock(CoprBuildEndHandler).should_receive("set_srpm_url").and_return( None) flexmock(Pushgateway).should_receive("push").twice().and_return() processing_results = SteveJobs().process_message(copr_build_end) event_dict, job, job_config, package_config = get_parameters_from_results( processing_results) assert json.dumps(event_dict) flexmock(CoprBuildJobHelper).should_receive( "get_built_packages").and_return([]) run_copr_build_end_handler( package_config=package_config, event=event_dict, job_config=job_config, ) flexmock(TestingFarmHandler).should_receive("db_trigger").and_return( copr_build_pr.get_trigger_object()) flexmock(CoprBuildModel).should_receive("get_all_by").and_return( [copr_build_pr]) run_testing_farm_handler( package_config=package_config, event=event_dict, job_config=job_config, chroot="fedora-rawhide-x86_64", build_id=1, )
def test_copr_build_end_failed_testing_farm_no_json(copr_build_end, copr_build_pr): flexmock(GithubProject).should_receive("is_private").and_return(False) config = PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig( targets=["fedora-rawhide"], owner="some-owner", project="some-project", ), ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(targets=["fedora-rawhide"]), ), ]) flexmock(CoprBuildEvent).should_receive("get_package_config").and_return( config) flexmock(PackageConfigGetter).should_receive( "get_package_config_from_repo").and_return(config) flexmock(CoprBuildEndHandler).should_receive( "was_last_packit_comment_with_congratulation").and_return(False) flexmock(GithubProject).should_receive("pr_comment") flexmock(LocalProject).should_receive("refresh_the_arguments").and_return( None) flexmock(CoprBuildModel).should_receive("get_by_build_id").and_return( copr_build_pr) copr_build_pr.should_receive("set_status").with_args("success") copr_build_pr.should_receive("set_end_time").once() url = get_copr_build_info_url_from_flask(1) flexmock(requests).should_receive("get").and_return(requests.Response()) flexmock( requests.Response).should_receive("raise_for_status").and_return(None) # check if packit-service set correct PR status flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.success, description="RPMs were built successfully.", url=url, check_names=EXPECTED_BUILD_CHECK_NAME, ).once() flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="RPMs were built successfully.", url=url, check_names=EXPECTED_TESTING_FARM_CHECK_NAME, ).once() flexmock(TestingFarmJobHelper).should_receive( "send_testing_farm_request").and_return( RequestResponse( status_code=400, ok=False, content=b"some text error", reason="some text error", json=None, )) flexmock(CoprBuildModel).should_receive("set_status").with_args("failure") flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="Build succeeded. Submitting the tests ...", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, url="", ).once() flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.failure, description="Failed to submit tests: some text error", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, url="", ).once() tft_test_run_model = flexmock() tft_test_run_model.should_receive("set_status").with_args( TestingFarmResult.error).and_return().once() pipeline_id = "5e8079d8-f181-41cf-af96-28e99774eb68" flexmock(uuid).should_receive("uuid4").and_return(uuid.UUID(pipeline_id)) flexmock(TFTTestRunModel).should_receive("create").with_args( pipeline_id=pipeline_id, commit_sha="0011223344", status=TestingFarmResult.new, target="fedora-rawhide-x86_64", trigger_model=copr_build_pr.job_trigger.get_trigger_object(), web_url=None, ).and_return(tft_test_run_model) flexmock(Signature).should_receive("apply_async").twice() processing_results = SteveJobs().process_message(copr_build_end) event_dict, package_config, job = get_parameters_from_results( processing_results) run_copr_build_end_handler( package_config=package_config, event=event_dict, job_config=job, ) flexmock(GithubTestingFarmHandler).should_receive("db_trigger").and_return( copr_build_pr.job_trigger.get_trigger_object()) run_testing_farm_handler( package_config=package_config, event=event_dict, job_config=job, chroot="fedora-rawhide-x86_64", build_id=flexmock(), )
def test_copr_build_end_testing_farm(copr_build_end, copr_build_pr): flexmock(GithubProject).should_receive("is_private").and_return(False) config = PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig( targets=["fedora-rawhide"], owner="some-owner", project="some-project", ), ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(targets=["fedora-rawhide"]), ), ]) flexmock(CoprBuildEvent).should_receive("get_package_config").and_return( config) flexmock(PackageConfigGetter).should_receive( "get_package_config_from_repo").and_return(config) flexmock(CoprBuildEndHandler).should_receive( "was_last_packit_comment_with_congratulation").and_return(False) flexmock(GithubProject).should_receive("pr_comment") flexmock(LocalProject).should_receive("refresh_the_arguments").and_return( None) flexmock(CoprBuildModel).should_receive("get_by_build_id").and_return( copr_build_pr) copr_build_pr.should_receive("set_status").with_args("success") copr_build_pr.should_receive("set_end_time").once() flexmock(requests).should_receive("get").and_return(requests.Response()) flexmock( requests.Response).should_receive("raise_for_status").and_return(None) # check if packit-service set correct PR status url = get_copr_build_info_url_from_flask(1) flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.success, description="RPMs were built successfully.", url=url, check_names=EXPECTED_BUILD_CHECK_NAME, ).once() flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="RPMs were built successfully.", url=url, check_names=EXPECTED_TESTING_FARM_CHECK_NAME, ).once() pipeline_id = "5e8079d8-f181-41cf-af96-28e99774eb68" flexmock(uuid).should_receive("uuid4").and_return(uuid.UUID(pipeline_id)) payload: dict = { "pipeline": { "id": pipeline_id }, "api": { "token": "" }, "response-url": "https://stg.packit.dev/api/testing-farm/results", "artifact": { "repo-name": "bar", "repo-namespace": "foo", "copr-repo-name": "some-owner/some-project", "copr-chroot": "fedora-rawhide-x86_64", "commit-sha": "0011223344", "git-url": "https://github.com/foo/bar.git", "git-ref": "0011223344", }, } tft_test_run_model = flexmock() tft_test_run_model.should_receive("set_status").with_args( TestingFarmResult.running).and_return().once() flexmock(TFTTestRunModel).should_receive("create").with_args( pipeline_id=pipeline_id, commit_sha="0011223344", status=TestingFarmResult.new, target="fedora-rawhide-x86_64", trigger_model=copr_build_pr.job_trigger.get_trigger_object(), web_url=None, ).and_return(tft_test_run_model) flexmock(TestingFarmJobHelper).should_receive( "send_testing_farm_request").with_args( TESTING_FARM_TRIGGER_URL, "POST", {}, json.dumps(payload)).and_return( RequestResponse( status_code=200, ok=True, content=b'{"url": "some-url"}', json={"url": "some-url"}, )) flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="Build succeeded. Submitting the tests ...", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, url="", ).once() flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="Tests are running ...", url="some-url", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, ).once() flexmock(Signature).should_receive("apply_async").twice() processing_results = SteveJobs().process_message(copr_build_end) event_dict, package_config, job = get_parameters_from_results( processing_results) run_copr_build_end_handler( package_config=package_config, event=event_dict, job_config=job, ) flexmock(GithubTestingFarmHandler).should_receive("db_trigger").and_return( copr_build_pr.job_trigger.get_trigger_object()) run_testing_farm_handler( package_config=package_config, event=event_dict, job_config=job, chroot="fedora-rawhide-x86_64", build_id=flexmock(), )
def test_copr_build_end_testing_farm(copr_build_end, copr_build): steve = SteveJobs() flexmock(SteveJobs, _is_private=False) flexmock(CoprHelper).should_receive("get_copr_client").and_return( Client( config={ "copr_url": "https://copr.fedorainfracloud.org", "username": "******", })) flexmock(CoprBuildJobHelper).should_receive("copr_build_model").and_return( flexmock()) config = PackageConfig(jobs=[ JobConfig( job=JobType.copr_build, trigger=JobTriggerType.pull_request, metadata={"targets": ["fedora-rawhide"]}, ), JobConfig( job=JobType.tests, trigger=JobTriggerType.pull_request, metadata={"targets": ["fedora-rawhide"]}, ), ]) flexmock(CoprBuildEvent).should_receive("get_package_config").and_return( config) flexmock(GithubTestingFarmHandler).should_receive( "get_package_config_from_repo").and_return(config) flexmock(CoprBuildEndHandler).should_receive( "was_last_build_successful").and_return(False) flexmock(GithubProject).should_receive("pr_comment") flexmock(LocalProject).should_receive("refresh_the_arguments").and_return( None) flexmock(CoprBuild).should_receive("get_by_build_id").and_return( copr_build) flexmock(CoprBuild).should_receive("set_status").with_args("success") flexmock(CoprBuildDB).should_receive("get_build").and_return({ "commit_sha": "XXXXX", "pr_id": 24, "repo_name": "hello-world", "repo_namespace": "packit-service", "ref": "XXXX", "https_url": "https://github.com/packit-service/hello-world", }) url = "https://localhost:5000/copr-build/1/logs" flexmock(requests).should_receive("get").and_return(requests.Response()) flexmock( requests.Response).should_receive("raise_for_status").and_return(None) # check if packit-service set correct PR status flexmock(BuildStatusReporter).should_receive("report").with_args( state="success", description="RPMs were built successfully.", url=url, check_names=EXPECTED_CHECK_NAME, ).once() flexmock(BuildStatusReporter).should_receive("report").with_args( state="success", description="RPMs were built successfully.", url=url, check_names=f"{PACKIT_STG_TESTING_FARM_CHECK}-{CHROOT}", ).once() flexmock(TestingFarmJobHelper).should_receive( "send_testing_farm_request").and_return( RequestResponse( status_code=200, ok=True, content='{"url": "some-url"}'.encode(), json={"url": "some-url"}, )) flexmock(BuildStatusReporter).should_receive("report").with_args( state="pending", description="Build succeeded. Submitting the tests ...", check_names=f"{PACKIT_STG_TESTING_FARM_CHECK}-{CHROOT}", ).once() flexmock(BuildStatusReporter).should_receive("report").with_args( state="pending", description="Tests are running ...", url="some-url", check_names=f"{PACKIT_STG_TESTING_FARM_CHECK}-{CHROOT}", ).once() steve.process_message(copr_build_end)
def test_copr_build_end_failed_testing_farm(copr_build_end, copr_build_pr): steve = SteveJobs() flexmock(GithubProject).should_receive("is_private").and_return(False) flexmock(TestingFarmJobHelper).should_receive("job_owner").and_return( "some-owner") flexmock(TestingFarmJobHelper).should_receive("job_project").and_return( "foo-bar-123-stg") config = PackageConfig(jobs=[ JobConfig( type=JobType.copr_build, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(targets=["fedora-rawhide"]), ), JobConfig( type=JobType.tests, trigger=JobConfigTriggerType.pull_request, metadata=JobMetadataConfig(targets=["fedora-rawhide"]), ), ]) flexmock(CoprBuildEvent).should_receive("get_package_config").and_return( config) flexmock(PackageConfigGetter).should_receive( "get_package_config_from_repo").and_return(config) flexmock(CoprBuildEndHandler).should_receive( "was_last_packit_comment_with_congratulation").and_return(False) flexmock(GithubProject).should_receive("pr_comment") flexmock(LocalProject).should_receive("refresh_the_arguments").and_return( None) flexmock(CoprBuildModel).should_receive("get_by_build_id").and_return( copr_build_pr) copr_build_pr.should_receive("set_status").with_args("success") copr_build_pr.should_receive("set_end_time").once() flexmock(requests).should_receive("get").and_return(requests.Response()) flexmock( requests.Response).should_receive("raise_for_status").and_return(None) # check if packit-service set correct PR status url = get_copr_build_log_url_from_flask(1) flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.success, description="RPMs were built successfully.", url=url, check_names=EXPECTED_BUILD_CHECK_NAME, ).once() flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="RPMs were built successfully.", url=url, check_names=EXPECTED_TESTING_FARM_CHECK_NAME, ).once() flexmock(TestingFarmJobHelper).should_receive( "send_testing_farm_request").and_return( RequestResponse( status_code=400, ok=False, content='{"message": "some error"}'.encode(), json={"message": "some error"}, )) flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.pending, description="Build succeeded. Submitting the tests ...", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, url="", ).once() flexmock(StatusReporter).should_receive("report").with_args( state=CommitStatus.failure, description="some error", check_names=EXPECTED_TESTING_FARM_CHECK_NAME, url="", ).once() trigger = flexmock( job_config_trigger_type=JobConfigTriggerType.pull_request, job_trigger_model_type=JobTriggerModelType.pull_request, ) flexmock(CoprBuildEvent).should_receive("db_trigger").and_return(trigger) tft_test_run_model = flexmock() tft_test_run_model.should_receive("set_status").with_args( TestingFarmResult.error).and_return().once() pipeline_id = "5e8079d8-f181-41cf-af96-28e99774eb68" flexmock(uuid).should_receive("uuid4").and_return(uuid.UUID(pipeline_id)) flexmock(TFTTestRunModel).should_receive("create").with_args( pipeline_id=pipeline_id, commit_sha="0011223344", status=TestingFarmResult.new, target="fedora-rawhide-x86_64", trigger_model=trigger, web_url=None, ).and_return(tft_test_run_model) steve.process_message(copr_build_end)