def mock_pr_comment_functionality(): packit_yaml = ("{'specfile_path': '', 'synced_files': []," "'jobs': [{'trigger': 'pull_request', 'job': 'copr_build'," "'metadata': {'targets': 'fedora-rawhide-x86_64'}}]}") flexmock( GithubProject, get_file_content=lambda path, ref: packit_yaml, full_repo_name="packit-service/hello-world", ) flexmock(Github, get_repo=lambda full_name_or_id: None) flexmock(GithubProject).should_receive("who_can_merge_pr").and_return( {"phracek"}) flexmock(GithubProject).should_receive("get_all_pr_commits").with_args( 9).and_return(["528b803be6f93e19ca4130bf4976f2800a3004c4"]) config = ServiceConfig() config.command_handler_work_dir = SANDCASTLE_WORK_DIR flexmock(ServiceConfig).should_receive("get_service_config").and_return( config) copr_dict = { "login": "******", "username": "******", "token": "apple", "copr_url": "https://copr.fedorainfracloud.org", } flexmock(CoprClient).should_receive("create_from_config_file").and_return( CoprClient(copr_dict)) flexmock(LocalProject, refresh_the_arguments=lambda: None) flexmock(Whitelist, check_and_report=True)
def test_dist_git_push_release_handle(release_event): packit_yaml = ( "{'specfile_path': '', 'synced_files': []" ", jobs: [{trigger: release, job: propose_downstream, metadata: {targets:[]}}]}" ) flexmock(Github, get_repo=lambda full_name_or_id: None) flexmock( GithubProject, get_file_content=lambda path, ref: packit_yaml, full_repo_name="packit-service/hello-world", ) flexmock(LocalProject, refresh_the_arguments=lambda: None) flexmock(Whitelist, check_and_report=True) steve = SteveJobs() flexmock(SteveJobs, _is_private=False) config = Config() config.command_handler_work_dir = SANDCASTLE_WORK_DIR flexmock(Config).should_receive("get_service_config").and_return(config) # it would make sense to make LocalProject offline flexmock(PackitAPI).should_receive("sync_release").with_args( dist_git_branch="master", version="0.3.0", create_pr=False).once() results = steve.process_message(release_event) assert "propose_downstream" in results.get("jobs", {}) assert results.get("jobs", {}).get("propose_downstream", {}).get("success") assert results["trigger"] == str(JobTriggerType.release)
def mock_issue_comment_functionality(): packit_yaml = ( "{'specfile_path': '', 'synced_files': []," "'jobs': [{'trigger': 'release', 'job': 'propose_downstream'," "'metadata': {'dist-git-branch': 'master'}}]," "'downstream_package_name': 'packit'}") flexmock( GithubProject, get_file_content=lambda path, ref: packit_yaml, full_repo_name="packit-service/packit", ) flexmock(Github, get_repo=lambda full_name_or_id: None) flexmock(GithubProject).should_receive("who_can_merge_pr").and_return( {"phracek"}) flexmock(GithubProject).should_receive("issue_comment").and_return(None) flexmock(GithubProject).should_receive("issue_close").and_return(None) gr = GithubRelease( tag_name="0.5.1", url="packit-service/packit", created_at="", tarball_url="https://foo/bar", git_tag=flexmock(GitTag), project=flexmock(GithubProject), raw_release=flexmock(PyGithubRelease), ) flexmock(GithubProject).should_receive("get_latest_release").and_return(gr) config = ServiceConfig() config.command_handler_work_dir = SANDCASTLE_WORK_DIR flexmock(ServiceConfig).should_receive("get_service_config").and_return( config) flexmock(LocalProject, refresh_the_arguments=lambda: None) flexmock(Whitelist, check_and_report=True)
def test_process_message(event): packit_yaml = { "specfile_path": "", "synced_files": [], "jobs": [{"trigger": "release", "job": "propose_downstream"}], } flexmock(Github, get_repo=lambda full_name_or_id: None) flexmock( GithubProject, get_file_content=lambda path, ref: dumps(packit_yaml), full_repo_name="foo/bar", ) flexmock(LocalProject, refresh_the_arguments=lambda: None) config = Config() config.command_handler_work_dir = SANDCASTLE_WORK_DIR flexmock(Config).should_receive("get_service_config").and_return(config) flexmock(PackitAPI).should_receive("sync_release").with_args( dist_git_branch="master", version="1.2.3", create_pr=False ).once() flexmock(Whitelist, check_and_report=True) flexmock(SteveJobs, _is_private=False) results = SteveJobs().process_message(event) assert "propose_downstream" in results.get("jobs", {}) assert results["trigger"] == str(JobTriggerType.release)
def test_handler_cleanup(tmpdir): t = Path(tmpdir) t.joinpath("a").mkdir() t.joinpath("b").write_text("a") t.joinpath("c").symlink_to("b") t.joinpath("d").symlink_to("a", target_is_directory=True) t.joinpath("e").symlink_to("nope", target_is_directory=False) t.joinpath("f").symlink_to("nopez", target_is_directory=True) t.joinpath(".g").write_text("g") t.joinpath(".h").symlink_to(".g", target_is_directory=False) c = Config() c.command_handler_work_dir = t jc = JobConfig(JobType.copr_build, [], JobTriggerType.pull_request, {}) j = JobHandler(c, jc, Event(JobTriggerType.pull_request)) j._clean_workplace() assert len(list(t.iterdir())) == 0
def packit_base(ctx, debug, fas_user, keytab): """Integrate upstream open source projects into Fedora operating system.""" c = Config.get_service_config() c.debug = debug or c.debug c.fas_user = fas_user or c.fas_user c.keytab_path = keytab or c.keytab_path ctx.obj = c if ctx.obj.debug: set_logging(level=logging.DEBUG) logger.debug("logging set to DEBUG") else: set_logging(level=logging.INFO) logger.debug("logging set to INFO")
def test_parse_pr(self, pull_request): event_object = Parser.parse_event(pull_request) assert isinstance(event_object, PullRequestEvent) assert event_object.trigger == JobTriggerType.pull_request assert event_object.action == PullRequestAction.opened assert event_object.pr_id == 342 assert event_object.base_repo_namespace == "packit-service" assert event_object.base_repo_name == "packit" assert event_object.base_ref == "528b803be6f93e19ca4130bf4976f2800a3004c4" assert event_object.target_repo == "packit-service/packit" assert event_object.https_url == "https://github.com/packit-service/packit" assert event_object.commit_sha == "528b803be6f93e19ca4130bf4976f2800a3004c4" def _get_f_c(*args, **kwargs): raise FileNotFoundError() flexmock(GithubProject, get_file_content=_get_f_c) flexmock(Config, get_service_config=Config()) assert event_object.get_package_config() is None
def get_testing_farm_check() -> str: config = Config.get_service_config() if config.deployment == Deployment.prod: return PACKIT_PROD_TESTING_FARM_CHECK return PACKIT_STG_TESTING_FARM_CHECK
def get_build_check() -> str: config = Config.get_service_config() if config.deployment == Deployment.prod: return PACKIT_PROD_CHECK return PACKIT_STG_CHECK
def config(self): if self._config is None: self._config = Config.get_service_config() return self._config
from flask import Flask, abort, request, jsonify from packit.utils import set_logging from packit_service.celerizer import celery_app from packit_service.config import Config class PackitWebhookReceiver(Flask): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) set_logging(level=logging.DEBUG) app = PackitWebhookReceiver(__name__) config = Config.get_service_config() logger = logging.getLogger("packit_service") @app.route("/healthz", methods=["GET", "HEAD", "POST"]) def get_health(): # TODO: add some interesting stats here return jsonify({"msg": "We are healthy!"}) @app.route("/webhooks/github", methods=["POST"]) def github_webhook(): msg = request.get_json() if not msg: logger.debug("/webhooks/github: we haven't received any JSON data.")
def test_parse_missing(service_config_missing): with pytest.raises(PackitInvalidConfigException): Config.get_from_dict(service_config_missing)
def test_parse_valid(service_config_valid): config = Config.get_from_dict(service_config_valid) assert config.deployment == Deployment("prod")