Skip to content

Commit

Permalink
Restructure the handler/helper classes code for build/test
Browse files Browse the repository at this point in the history
Signed-off-by: Frantisek Lachman <flachman@redhat.com>
  • Loading branch information
lachmanfrantisek committed Jan 15, 2020
1 parent 6839294 commit 40c71a5
Show file tree
Hide file tree
Showing 7 changed files with 277 additions and 199 deletions.
80 changes: 45 additions & 35 deletions packit_service/worker/copr_build.py
Expand Up @@ -64,7 +64,7 @@
)


class CoprBuildHandler(object):
class JobHelper:
def __init__(
self,
config: ServiceConfig,
Expand Down Expand Up @@ -163,39 +163,6 @@ def tests_chroots(self) -> List[str]:
configured_targets = self.job_tests.metadata.get("targets", ["fedora-stable"])
return list(get_build_targets(*configured_targets))

@property
def copr_build_model(self) -> CoprBuild:
if self._copr_build_model is None:
self._copr_build_model = CoprBuild.create(
project=self.job_project,
owner=self.job_owner,
chroots=self.build_chroots,
)
return self._copr_build_model

@property
def job_project(self) -> Optional[str]:
"""
The job definition from the config file.
"""
if self.job_copr_build:
return self.job_copr_build.metadata.get(
"project", self.default_project_name
)
return self.default_project_name

@property
def job_owner(self) -> Optional[str]:
"""
Owner used for the copr build -- search the config or use the copr's config.
"""
if self.job_copr_build:
owner = self.job_copr_build.metadata.get("owner")
if owner:
return owner

return self.api.copr_helper.copr_client.config.get("username")

@property
def default_project_name(self):
"""
Expand Down Expand Up @@ -232,7 +199,7 @@ def job_tests(self) -> Optional[JobConfig]:
def status_reporter(self):
if not self._status_reporter:
self._status_reporter = BuildStatusReporter(
self.project, self.event.commit_sha, self.copr_build_model
self.project, self.event.commit_sha, copr_build_model=None
)
return self._status_reporter

Expand All @@ -253,6 +220,49 @@ def build_check_names(self) -> List[str]:
]
return self._build_check_names

@property
def job_project(self) -> Optional[str]:
"""
The job definition from the config file.
"""
if self.job_copr_build:
return self.job_copr_build.metadata.get(
"project", self.default_project_name
)
return self.default_project_name


class CoprBuildJobHelper(JobHelper):
@property
def status_reporter(self):
if not self._status_reporter:
self._status_reporter = BuildStatusReporter(
self.project, self.event.commit_sha, self.copr_build_model
)
return self._status_reporter

@property
def copr_build_model(self) -> CoprBuild:
if self._copr_build_model is None:
self._copr_build_model = CoprBuild.create(
project=self.job_project,
owner=self.job_owner,
chroots=self.build_chroots,
)
return self._copr_build_model

@property
def job_owner(self) -> Optional[str]:
"""
Owner used for the copr build -- search the config or use the copr's config.
"""
if self.job_copr_build:
owner = self.job_copr_build.metadata.get("owner")
if owner:
return owner

return self.api.copr_helper.copr_client.config.get("username")

def run_copr_build(self) -> HandlerResults:

if not (self.job_copr_build or self.job_tests):
Expand Down
147 changes: 8 additions & 139 deletions packit_service/worker/github_handlers.py
Expand Up @@ -23,14 +23,10 @@
"""
This file defines classes for job handlers specific for Github hooks
"""
import json
import logging
import uuid
from typing import Union, Any, Optional, List, Callable

import requests
from ogr.abstract import GitProject
from ogr.utils import RequestResponse
from packit.api import PackitAPI
from packit.config import (
JobConfig,
Expand All @@ -43,8 +39,7 @@
from packit.exceptions import PackitException
from packit.local_project import LocalProject

from packit_service.config import Deployment, ServiceConfig
from packit_service.constants import TESTING_FARM_TRIGGER_URL
from packit_service.config import ServiceConfig
from packit_service.service.events import (
PullRequestEvent,
InstallationEvent,
Expand All @@ -61,7 +56,7 @@
CommentActionHandler,
add_to_comment_action_mapping_with_name,
)
from packit_service.worker.copr_build import CoprBuildHandler
from packit_service.worker.copr_build import CoprBuildJobHelper
from packit_service.worker.handler import (
JobHandler,
HandlerResults,
Expand All @@ -70,6 +65,7 @@
PRCheckName,
add_to_mapping_for_job,
)
from packit_service.worker.testing_farm import TestingFarmJobHelper
from packit_service.worker.whitelist import Whitelist

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -288,7 +284,7 @@ def handle_pull_request(self):
]
r.report("failure", msg, check_names=check_names)
return HandlerResults(success=False, details={"msg": msg})
cbh = CoprBuildHandler(
cbh = CoprBuildJobHelper(
self.config, self.package_config, self.project, self.event
)
handler_results = cbh.run_copr_build()
Expand Down Expand Up @@ -350,145 +346,18 @@ def __init__(
raise ValueError(f"No config file found in {self.project.full_repo_name}")
self.package_config.upstream_project_url = event.project_url

self.session = requests.session()
adapter = requests.adapters.HTTPAdapter(max_retries=5)
self.insecure = False
self.session.mount("https://", adapter)
self.header: dict = {"Content-Type": "application/json"}

def send_testing_farm_request(
self, url: str, method: str = None, params: dict = None, data=None
):
method = method or "GET"
try:
response = self.get_raw_request(
method=method, url=url, params=params, data=data
)
except requests.exceptions.ConnectionError as er:
logger.error(er)
raise Exception(f"Cannot connect to url: `{url}`.", er)
return response

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 run(self) -> HandlerResults:
self.local_project = LocalProject(
git_project=self.project, working_dir=self.config.command_handler_work_dir
)

logger.info("Running testing farm")

r = BuildStatusReporter(self.project, self.event.commit_sha)

copr_build_handler = CoprBuildHandler(
testing_farm_helper = TestingFarmJobHelper(
self.config, self.package_config, self.project, self.event
)
tests_chroots = copr_build_handler.tests_chroots
tests_chroots = testing_farm_helper.tests_chroots
logger.debug(f"Testing farm chroots: {tests_chroots}")
for chroot in tests_chroots:
pipeline_id = str(uuid.uuid4())
logger.debug(f"Pipeline id: {pipeline_id}")
payload: dict = {
"pipeline": {"id": pipeline_id},
"api": {"token": self.config.testing_farm_secret},
}

logger.debug(f"Payload: {payload}")

stg = "-stg" if self.config.deployment == Deployment.stg else ""
copr_repo_name = (
f"packit/{self.project.namespace}-{self.project.repo}-"
f"{self.event.pr_id}{stg}"
)

payload["artifact"] = {
"repo-name": self.event.base_repo_name,
"repo-namespace": self.event.base_repo_namespace,
"copr-repo-name": copr_repo_name,
"copr-chroot": chroot,
"commit-sha": self.event.commit_sha,
"git-url": self.event.project_url,
"git-ref": self.base_ref,
}

logger.debug("Sending testing farm request...")
logger.debug(payload)

req = self.send_testing_farm_request(
TESTING_FARM_TRIGGER_URL, "POST", {}, json.dumps(payload)
)
logger.debug(f"Request sent: {req}")
if not req:
msg = "Failed to post request to testing farm API."
logger.debug("Failed to post request to testing farm API.")
r.report(
"failure",
msg,
None,
"",
check_names=PRCheckName.get_testing_farm_check(chroot),
)
return HandlerResults(success=False, details={"msg": msg})
else:
logger.debug(
f"Submitted to testing farm with return code: {req.status_code}"
)

"""
Response:
{
"id": "9fa3cbd1-83f2-4326-a118-aad59f5",
"success": true,
"url": "https://console-testing-farm.apps.ci.centos.org/pipeline/<id>"
}
"""

# success set check on pending
if req.status_code != 200:
# something went wrong
msg = req.json()["message"]
r.report(
"failure",
msg,
None,
check_names=PRCheckName.get_testing_farm_check(chroot),
)
return HandlerResults(success=False, details={"msg": msg})

r.report(
"pending",
"Tests are running ...",
None,
req.json()["url"],
check_names=PRCheckName.get_testing_farm_check(chroot),
)

return HandlerResults(success=True, details={})
return testing_farm_helper.run_testing_farm()


@add_to_comment_action_mapping
Expand Down Expand Up @@ -531,7 +400,7 @@ def run(self) -> HandlerResults:
self.project.pr_comment(self.event.pr_id, msg)
return HandlerResults(success=True, details={"msg": msg})

cbh = CoprBuildHandler(
cbh = CoprBuildJobHelper(
self.config, self.package_config, self.project, self.event
)
handler_results = cbh.run_copr_build()
Expand Down

0 comments on commit 40c71a5

Please sign in to comment.