Blame pagure/lib/tasks_services.py

Pierre-Yves Chibon 7937d2
# -*- coding: utf-8 -*-
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
"""
Pierre-Yves Chibon 7937d2
 (c) 2018 - Copyright Red Hat Inc
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
 Authors:
Pierre-Yves Chibon 7937d2
   Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
"""
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 67d1cc
from __future__ import unicode_literals, absolute_import
Aurélien Bompard dcf6f6
Pierre-Yves Chibon 7937d2
import datetime
Pierre-Yves Chibon 7937d2
import hashlib
Pierre-Yves Chibon 7937d2
import hmac
Pierre-Yves Chibon 7937d2
import json
Pierre-Yves Chibon 7937d2
import os
Pierre-Yves Chibon 7937d2
import os.path
Pierre-Yves Chibon 7937d2
import time
Pierre-Yves Chibon 7937d2
import uuid
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
import requests
Pierre-Yves Chibon 7937d2
import six
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
from celery import Celery
Pierre-Yves Chibon 24747e
from celery.signals import after_setup_task_logger
Pierre-Yves Chibon 24747e
from celery.utils.log import get_task_logger
Pierre-Yves Chibon 7937d2
from kitchen.text.converters import to_bytes
Pierre-Yves Chibon bd0202
from sqlalchemy.exc import SQLAlchemyError
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 930073
import pagure.lib.query
Pierre-Yves Chibon 7937d2
from pagure.config import config as pagure_config
Pierre-Yves Chibon 1aac43
from pagure.lib.tasks_utils import pagure_task
Pierre-Yves Chibon e64e62
from pagure.mail_logging import format_callstack
Clement Verna f5181b
from pagure.lib.lib_ci import trigger_jenkins_build
Pierre-Yves Chibon 24747e
from pagure.utils import split_project_fullname, set_up_logging
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
# logging.config.dictConfig(pagure_config.get('LOGGING') or {'version': 1})
Pierre-Yves Chibon 24747e
_log = get_task_logger(__name__)
Pierre-Yves Chibon 7937d2
_i = 0
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 9c2953
if os.environ.get("PAGURE_BROKER_URL"):  # pragma: no cover
Pierre-Yves Chibon 9c2953
    broker_url = os.environ["PAGURE_BROKER_URL"]
Pierre-Yves Chibon 9c2953
elif pagure_config.get("BROKER_URL"):
Pierre-Yves Chibon 9c2953
    broker_url = pagure_config["BROKER_URL"]
Pierre-Yves Chibon 7937d2
else:
Pierre-Yves Chibon 9c2953
    broker_url = "redis://%s" % pagure_config["REDIS_HOST"]
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 9c2953
conn = Celery("tasks", broker=broker_url, backend=broker_url)
Pierre-Yves Chibon 9c2953
conn.conf.update(pagure_config["CELERY_CONFIG"])
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 24747e
@after_setup_task_logger.connect
Pierre-Yves Chibon 24747e
def augment_celery_log(**kwargs):
Pierre-Yves Chibon 24747e
    set_up_logging(force=True)
Pierre-Yves Chibon 24747e
Pierre-Yves Chibon 24747e
Pierre-Yves Chibon 7937d2
def call_web_hooks(project, topic, msg, urls):
Pierre-Yves Chibon 9c2953
    """ Sends the web-hook notification. """
Pierre-Yves Chibon 9c2953
    _log.info("Processing project: %s - topic: %s", project.fullname, topic)
Pierre-Yves Chibon 9c2953
    _log.debug("msg: %s", msg)
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
    # Send web-hooks notification
Pierre-Yves Chibon 7937d2
    global _i
Pierre-Yves Chibon 7937d2
    _i += 1
Pierre-Yves Chibon 7937d2
    year = datetime.datetime.utcnow().year
Pierre-Yves Chibon 7937d2
    if isinstance(topic, six.text_type):
Pierre-Yves Chibon 9c2953
        topic = to_bytes(topic, encoding="utf8", nonstring="passthru")
Pierre-Yves Chibon 9c2953
    msg["pagure_instance"] = pagure_config["APP_URL"]
Pierre-Yves Chibon 9c2953
    msg["project_fullname"] = project.fullname
Pierre-Yves Chibon 7937d2
    msg = dict(
Pierre-Yves Chibon 9c2953
        topic=topic.decode("utf-8"),
Pierre-Yves Chibon 7937d2
        msg=msg,
Pierre-Yves Chibon 7937d2
        timestamp=int(time.time()),
Aurélien Bompard 619e2a
        msg_id="%s-%s" % (year, uuid.uuid4()),
Pierre-Yves Chibon 7937d2
        i=_i,
Pierre-Yves Chibon 7937d2
    )
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 941093
    content = json.dumps(msg, sort_keys=True)
Pierre-Yves Chibon 7937d2
    hashhex = hmac.new(
Pierre-Yves Chibon 9c2953
        project.hook_token.encode("utf-8"),
Pierre-Yves Chibon 9c2953
        content.encode("utf-8"),
Pierre-Yves Chibon 9c2953
        hashlib.sha1,
Pierre-Yves Chibon 9c2953
    ).hexdigest()
Pierre-Yves Chibon 7937d2
    hashhex256 = hmac.new(
Pierre-Yves Chibon 9c2953
        project.hook_token.encode("utf-8"),
Pierre-Yves Chibon 9c2953
        content.encode("utf-8"),
Pierre-Yves Chibon 9c2953
        hashlib.sha256,
Pierre-Yves Chibon 9c2953
    ).hexdigest()
Pierre-Yves Chibon 7937d2
    headers = {
Pierre-Yves Chibon 9c2953
        "X-Pagure": pagure_config["APP_URL"],
Pierre-Yves Chibon 9c2953
        "X-Pagure-project": project.fullname,
Pierre-Yves Chibon 9c2953
        "X-Pagure-Signature": hashhex,
Pierre-Yves Chibon 9c2953
        "X-Pagure-Signature-256": hashhex256,
Pierre-Yves Chibon 9c2953
        "X-Pagure-Topic": topic,
Pierre-Yves Chibon 9c2953
        "Content-Type": "application/json",
Pierre-Yves Chibon 7937d2
    }
Pierre-Yves Chibon 941093
    for url in sorted(urls):
Pierre-Yves Chibon 7937d2
        url = url.strip()
Pierre-Yves Chibon 9c2953
        _log.info("Calling url %s" % url)
Pierre-Yves Chibon 7937d2
        try:
Patrick Uiterwijk 3f97f6
            req = requests.post(url, headers=headers, data=content, timeout=60)
Pierre-Yves Chibon 7937d2
            if not req:
Pierre-Yves Chibon 7937d2
                _log.info(
Pierre-Yves Chibon 9c2953
                    "An error occured while querying: %s - "
Pierre-Yves Chibon 9c2953
                    "Error code: %s" % (url, req.status_code)
Pierre-Yves Chibon 9c2953
                )
Pierre-Yves Chibon 7937d2
        except (requests.exceptions.RequestException, Exception) as err:
Pierre-Yves Chibon 7937d2
            _log.info(
Pierre-Yves Chibon 9c2953
                "An error occured while querying: %s - Error: %s" % (url, err)
Pierre-Yves Chibon 9c2953
            )
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 9c2953
@conn.task(queue=pagure_config.get("WEBHOOK_CELERY_QUEUE", None), bind=True)
Slavek Kabrda efeaa6
@pagure_task
Pierre-Yves Chibon 7937d2
def webhook_notification(
Pierre-Yves Chibon 9c2953
    self, session, topic, msg, namespace=None, name=None, user=None
Pierre-Yves Chibon 9c2953
):
Pierre-Yves Chibon 7937d2
    """ Send webhook notifications about an event on that project.
Pierre-Yves Chibon 7937d2
Slavek Kabrda efeaa6
    :arg session: SQLAlchemy session object
Slavek Kabrda efeaa6
    :type session: sqlalchemy.orm.session.Session
Pierre-Yves Chibon 7937d2
    :arg topic: the topic for the notification
Pierre-Yves Chibon 7937d2
    :type topic: str
Pierre-Yves Chibon 7937d2
    :arg msg: the message to send via web-hook
Pierre-Yves Chibon 7937d2
    :type msg: str
Pierre-Yves Chibon 7937d2
    :kwarg namespace: the namespace of the project
Pierre-Yves Chibon 7937d2
    :type namespace: None or str
Pierre-Yves Chibon 7937d2
    :kwarg name: the name of the project
Pierre-Yves Chibon 7937d2
    :type name: None or str
Pierre-Yves Chibon 7937d2
    :kwarg user: the user of the project, only set if the project is a fork
Pierre-Yves Chibon 7937d2
    :type user: None or str
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
    """
Pierre-Yves Chibon 930073
    project = pagure.lib.query._get_project(
Pierre-Yves Chibon 9c2953
        session, namespace=namespace, name=name, user=user
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 7937d2
    if not project:
Pierre-Yves Chibon 7937d2
        session.close()
Pierre-Yves Chibon 7937d2
        raise RuntimeError(
Pierre-Yves Chibon 9c2953
            "Project: %s/%s from user: %s not found in the DB"
Pierre-Yves Chibon 9c2953
            % (namespace, name, user)
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 9c2953
    urls = project.settings.get("Web-hooks")
Pierre-Yves Chibon 7937d2
    if not urls:
Pierre-Yves Chibon 9c2953
        _log.info("No URLs set: %s" % urls)
Pierre-Yves Chibon 7937d2
        return
Pierre-Yves Chibon 7937d2
Pierre-Yves Chibon 9c2953
    urls = urls.split("\n")
Pierre-Yves Chibon 9c2953
    _log.info("Got the project and urls, going to the webhooks")
Pierre-Yves Chibon 7937d2
    call_web_hooks(project, topic, msg, urls)
Pierre-Yves Chibon bd0202
Pierre-Yves Chibon bd0202
Pierre-Yves Chibon 9c2953
@conn.task(queue=pagure_config.get("LOGCOM_CELERY_QUEUE", None), bind=True)
Slavek Kabrda efeaa6
@pagure_task
Pierre-Yves Chibon bd0202
def log_commit_send_notifications(
Pierre-Yves Chibon 9c2953
    self,
Pierre-Yves Chibon 9c2953
    session,
Pierre-Yves Chibon 9c2953
    name,
Pierre-Yves Chibon 9c2953
    commits,
Pierre-Yves Chibon 9c2953
    abspath,
Pierre-Yves Chibon 9c2953
    branch,
Pierre-Yves Chibon 9c2953
    default_branch,
Pierre-Yves Chibon 9c2953
    namespace=None,
Pierre-Yves Chibon 9c2953
    username=None,
Pierre-Yves Chibon 9c2953
):
Pierre-Yves Chibon bd0202
    """ Send webhook notifications about an event on that project.
Pierre-Yves Chibon bd0202
Slavek Kabrda efeaa6
    :arg session: SQLAlchemy session object
Slavek Kabrda efeaa6
    :type session: sqlalchemy.orm.session.Session
Pierre-Yves Chibon bd0202
    :arg topic: the topic for the notification
Pierre-Yves Chibon bd0202
    :type topic: str
Pierre-Yves Chibon bd0202
    :arg msg: the message to send via web-hook
Pierre-Yves Chibon bd0202
    :type msg: str
Pierre-Yves Chibon bd0202
    :kwarg namespace: the namespace of the project
Pierre-Yves Chibon bd0202
    :type namespace: None or str
Pierre-Yves Chibon bd0202
    :kwarg name: the name of the project
Pierre-Yves Chibon bd0202
    :type name: None or str
Pierre-Yves Chibon bd0202
    :kwarg user: the user of the project, only set if the project is a fork
Pierre-Yves Chibon bd0202
    :type user: None or str
Pierre-Yves Chibon bd0202
Pierre-Yves Chibon bd0202
    """
Pierre-Yves Chibon bd0202
    _log.info(
Pierre-Yves Chibon 9c2953
        "Looking for project: %s%s of %s",
Pierre-Yves Chibon 9c2953
        "%s/" % namespace if namespace else "",
Pierre-Yves Chibon bd0202
        name,
Pierre-Yves Chibon 9c2953
        username,
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 930073
    project = pagure.lib.query._get_project(
Pierre-Yves Chibon 9c2953
        session, name, user=username, namespace=namespace
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon bd0202
Pierre-Yves Chibon bd0202
    if not project:
Pierre-Yves Chibon 9c2953
        _log.info("No project found")
Pierre-Yves Chibon bd0202
        return
Pierre-Yves Chibon bd0202
Pierre-Yves Chibon 9c2953
    _log.info("Found project: %s", project.fullname)
Pierre-Yves Chibon bd0202
Pierre-Yves Chibon 9c2953
    _log.info("Processing %s commits in %s", len(commits), abspath)
Pierre-Yves Chibon bd0202
Pierre-Yves Chibon bd0202
    # Only log commits when the branch is the default branch
Pierre-Yves Chibon fccbed
    log_all = pagure_config.get("LOG_ALL_COMMITS", False)
Pierre-Yves Chibon fccbed
    if log_all or branch == default_branch:
Pierre-Yves Chibon 9c2953
        pagure.lib.git.log_commits_to_db(session, project, commits, abspath)
Pierre-Yves Chibon 0ac4b3
    else:
Pierre-Yves Chibon 0ac4b3
        _log.info(
Pierre-Yves Chibon 0ac4b3
            "Not logging commits not made on the default branch: %s",
Lenka Segura 643d50
            default_branch,
Pierre-Yves Chibon 0ac4b3
        )
Pierre-Yves Chibon bd0202
Pierre-Yves Chibon bd0202
    # Notify subscribed users that there are new commits
Pierre-Yves Chibon 0ac4b3
    email_watchcommits = pagure_config.get("EMAIL_ON_WATCHCOMMITS", True)
Pierre-Yves Chibon 0ac4b3
    _log.info("Sending notification about the commit: %s", email_watchcommits)
Pierre-Yves Chibon 0ac4b3
    if email_watchcommits:
Pierre-Yves Chibon 9c2953
        pagure.lib.notify.notify_new_commits(abspath, project, branch, commits)
Pierre-Yves Chibon bd0202
Pierre-Yves Chibon bd0202
    try:
Pierre-Yves Chibon bd0202
        session.commit()
Pierre-Yves Chibon bd0202
    except SQLAlchemyError as err:  # pragma: no cover
Pierre-Yves Chibon bd0202
        _log.exception(err)
Pierre-Yves Chibon bd0202
        session.rollback()
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 50d6b6
def get_files_to_load(title, new_commits_list, abspath):
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 9c2953
    _log.info("%s: Retrieve the list of files changed" % title)
Pierre-Yves Chibon 50d6b6
    file_list = []
Pierre-Yves Chibon 50d6b6
    new_commits_list.reverse()
Pierre-Yves Chibon 50d6b6
    n = len(new_commits_list)
Pierre-Yves Chibon 50d6b6
    for idx, commit in enumerate(new_commits_list):
Pierre-Yves Chibon 50d6b6
        if (idx % 100) == 0:
Pierre-Yves Chibon 50d6b6
            _log.info(
Pierre-Yves Chibon 9c2953
                "Loading files change in commits for %s: %s/%s", title, idx, n
Pierre-Yves Chibon 9c2953
            )
Pierre-Yves Chibon 50d6b6
        if commit == new_commits_list[0]:
Pierre-Yves Chibon 50d6b6
            filenames = pagure.lib.git.read_git_lines(
Pierre-Yves Chibon 9c2953
                [
Pierre-Yves Chibon 9c2953
                    "diff-tree",
Pierre-Yves Chibon 9c2953
                    "--no-commit-id",
Pierre-Yves Chibon 9c2953
                    "--name-only",
Pierre-Yves Chibon 9c2953
                    "-r",
Pierre-Yves Chibon 9c2953
                    "--root",
Pierre-Yves Chibon 9c2953
                    commit,
Pierre-Yves Chibon 9c2953
                ],
Pierre-Yves Chibon 9c2953
                abspath,
Pierre-Yves Chibon 9c2953
            )
Pierre-Yves Chibon 50d6b6
        else:
Pierre-Yves Chibon 50d6b6
            filenames = pagure.lib.git.read_git_lines(
Pierre-Yves Chibon 9c2953
                ["diff-tree", "--no-commit-id", "--name-only", "-r", commit],
Pierre-Yves Chibon 9c2953
                abspath,
Pierre-Yves Chibon 9c2953
            )
Pierre-Yves Chibon 50d6b6
        for line in filenames:
Pierre-Yves Chibon 50d6b6
            if line.strip():
Pierre-Yves Chibon 50d6b6
                file_list.append(line.strip())
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 50d6b6
    return file_list
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 9c2953
@conn.task(queue=pagure_config.get("LOADJSON_CELERY_QUEUE", None), bind=True)
Slavek Kabrda efeaa6
@pagure_task
Pierre-Yves Chibon 50d6b6
def load_json_commits_to_db(
Pierre-Yves Chibon 9c2953
    self,
Pierre-Yves Chibon 9c2953
    session,
Pierre-Yves Chibon 9c2953
    name,
Pierre-Yves Chibon 9c2953
    commits,
Pierre-Yves Chibon 9c2953
    abspath,
Pierre-Yves Chibon 9c2953
    data_type,
Pierre-Yves Chibon 9c2953
    agent,
Pierre-Yves Chibon 9c2953
    namespace=None,
Pierre-Yves Chibon 9c2953
    username=None,
Pierre-Yves Chibon 9c2953
):
Pierre-Yves Chibon 9c2953
    """ Loads into the database the specified commits that have been pushed
Pierre-Yves Chibon 50d6b6
    to either the tickets or the pull-request repository.
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 9c2953
    """
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 9c2953
    if data_type not in ["ticket", "pull-request"]:
Pierre-Yves Chibon 9c2953
        _log.info("LOADJSON: Invalid data_type retrieved: %s", data_type)
Pierre-Yves Chibon 50d6b6
        return
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 50d6b6
    _log.info(
Pierre-Yves Chibon 9c2953
        "LOADJSON: Looking for project: %s%s of user: %s",
Pierre-Yves Chibon 9c2953
        "%s/" % namespace if namespace else "",
Pierre-Yves Chibon 9c2953
        name,
Pierre-Yves Chibon 9c2953
        username,
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 930073
    project = pagure.lib.query._get_project(
Pierre-Yves Chibon 9c2953
        session, name, user=username, namespace=namespace
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 50d6b6
    if not project:
Pierre-Yves Chibon 9c2953
        _log.info("LOADJSON: No project found")
Pierre-Yves Chibon 50d6b6
        return
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 9c2953
    _log.info("LOADJSON: Found project: %s", project.fullname)
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 50d6b6
    _log.info(
Pierre-Yves Chibon 9c2953
        "LOADJSON: %s: Processing %s commits in %s",
Pierre-Yves Chibon 9c2953
        project.fullname,
Pierre-Yves Chibon 9c2953
        len(commits),
Pierre-Yves Chibon 9c2953
        abspath,
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 50d6b6
    file_list = set(get_files_to_load(project.fullname, commits, abspath))
Pierre-Yves Chibon 50d6b6
    n = len(file_list)
Pierre-Yves Chibon 9c2953
    _log.info("LOADJSON: %s files to process" % n)
Pierre-Yves Chibon 6b7c8d
    mail_body = [
Pierre-Yves Chibon 6b7c8d
        "Good Morning",
Pierre-Yves Chibon 6b7c8d
        "",
Pierre-Yves Chibon 6b7c8d
        "This is the log of loading all the files pushed in the git repo into",
Pierre-Yves Chibon 6b7c8d
        "the database. It should ignore files that are not JSON files, this",
Pierre-Yves Chibon 6b7c8d
        "is fine.",
Pierre-Yves Chibon 6b7c8d
        "",
Pierre-Yves Chibon 6b7c8d
    ]
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 941093
    for idx, filename in enumerate(sorted(file_list)):
Pierre-Yves Chibon 50d6b6
        _log.info(
Pierre-Yves Chibon 9c2953
            "LOADJSON: Loading: %s: %s -- %s/%s",
Pierre-Yves Chibon 9c2953
            project.fullname,
Pierre-Yves Chibon 9c2953
            filename,
Pierre-Yves Chibon 9c2953
            idx + 1,
Pierre-Yves Chibon 9c2953
            n,
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon 9c2953
        tmp = "Loading: %s -- %s/%s" % (filename, idx + 1, n)
Pierre-Yves Chibon 7cf3c9
        try:
Pierre-Yves Chibon 7cf3c9
            json_data = None
Pierre-Yves Chibon 7cf3c9
            data = "".join(
Pierre-Yves Chibon 7cf3c9
                pagure.lib.git.read_git_lines(
Pierre-Yves Chibon 7cf3c9
                    ["show", "HEAD:%s" % filename], abspath
Pierre-Yves Chibon 7cf3c9
                )
Pierre-Yves Chibon 9c2953
            )
Pierre-Yves Chibon 7cf3c9
            if data and not filename.startswith("files/"):
Pierre-Yves Chibon 7cf3c9
                try:
Pierre-Yves Chibon 7cf3c9
                    json_data = json.loads(data)
Pierre-Yves Chibon 7cf3c9
                except ValueError:
Pierre-Yves Chibon 7cf3c9
                    pass
Pierre-Yves Chibon 7cf3c9
            if json_data:
Pierre-Yves Chibon 9c2953
                if data_type == "ticket":
Pierre-Yves Chibon 50d6b6
                    pagure.lib.git.update_ticket_from_git(
Pierre-Yves Chibon 50d6b6
                        session,
Pierre-Yves Chibon 50d6b6
                        reponame=name,
Pierre-Yves Chibon 50d6b6
                        namespace=namespace,
Pierre-Yves Chibon 50d6b6
                        username=username,
Pierre-Yves Chibon 50d6b6
                        issue_uid=filename,
Pierre-Yves Chibon 50d6b6
                        json_data=json_data,
Pierre-Yves Chibon 50d6b6
                        agent=agent,
Pierre-Yves Chibon 50d6b6
                    )
Pierre-Yves Chibon 9c2953
                elif data_type == "pull-request":
Pierre-Yves Chibon 50d6b6
                    pagure.lib.git.update_request_from_git(
Pierre-Yves Chibon 50d6b6
                        session,
Pierre-Yves Chibon 50d6b6
                        reponame=name,
Pierre-Yves Chibon 50d6b6
                        namespace=namespace,
Pierre-Yves Chibon 50d6b6
                        username=username,
Pierre-Yves Chibon 50d6b6
                        request_uid=filename,
Pierre-Yves Chibon 50d6b6
                        json_data=json_data,
Pierre-Yves Chibon 50d6b6
                    )
Pierre-Yves Chibon 9c2953
                tmp += " ... ... Done"
Pierre-Yves Chibon 7cf3c9
            else:
Pierre-Yves Chibon 7cf3c9
                tmp += " ... ... SKIPPED - No JSON data"
Pierre-Yves Chibon 50d6b6
                mail_body.append(tmp)
Pierre-Yves Chibon 7cf3c9
        except Exception as err:
Pierre-Yves Chibon 7cf3c9
            _log.info("data: %s", json_data)
Pierre-Yves Chibon 7cf3c9
            session.rollback()
Pierre-Yves Chibon 7cf3c9
            _log.exception(err)
Pierre-Yves Chibon 7cf3c9
            tmp += " ... ... FAILED\n"
Pierre-Yves Chibon 7cf3c9
            tmp += format_callstack()
Pierre-Yves Chibon 7cf3c9
            break
Pierre-Yves Chibon 7cf3c9
        finally:
Pierre-Yves Chibon 50d6b6
            mail_body.append(tmp)
Pierre-Yves Chibon 50d6b6
Pierre-Yves Chibon 50d6b6
    try:
Pierre-Yves Chibon 50d6b6
        session.commit()
Pierre-Yves Chibon 50d6b6
        _log.info(
Pierre-Yves Chibon 9c2953
            "LOADJSON: Emailing results for %s to %s", project.fullname, agent
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon 50d6b6
        try:
Pierre-Yves Chibon 50d6b6
            if not agent:
Pierre-Yves Chibon 50d6b6
                raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
                    "No agent found: %s" % agent
Pierre-Yves Chibon 9c2953
                )
Pierre-Yves Chibon 02b393
            if agent != "pagure":
Pierre-Yves Chibon 930073
                user_obj = pagure.lib.query.get_user(session, agent)
Pierre-Yves Chibon 02b393
                pagure.lib.notify.send_email(
Pierre-Yves Chibon 02b393
                    "\n".join(mail_body),
Pierre-Yves Chibon 02b393
                    "Issue import report",
Pierre-Yves Chibon 02b393
                    user_obj.default_email,
Pierre-Yves Chibon 02b393
                )
Karsten Hopp 3b333e
        except pagure.exceptions.PagureException:
Pierre-Yves Chibon 9c2953
            _log.exception("LOADJSON: Could not find user %s" % agent)
Karsten Hopp 3b333e
    except SQLAlchemyError:  # pragma: no cover
Pierre-Yves Chibon 50d6b6
        session.rollback()
Pierre-Yves Chibon 9c2953
    _log.info("LOADJSON: Ready for another")
Pierre-Yves Chibon abb591
Pierre-Yves Chibon abb591
Pierre-Yves Chibon 9c2953
@conn.task(queue=pagure_config.get("CI_CELERY_QUEUE", None), bind=True)
Slavek Kabrda efeaa6
@pagure_task
Pierre-Yves Chibon 3117a1
def trigger_ci_build(
Pierre-Yves Chibon fd1956
    self,
Pierre-Yves Chibon fd1956
    session,
Pierre-Yves Chibon fd1956
    cause,
Pierre-Yves Chibon fd1956
    branch,
Pierre-Yves Chibon fd1956
    branch_to,
Pierre-Yves Chibon fd1956
    ci_type,
Pierre-Yves Chibon fd1956
    project_name=None,
Pierre-Yves Chibon fd1956
    pr_uid=None,
Pierre-Yves Chibon 998b35
):
Clement Verna ba73e0
Pierre-Yves Chibon 9c2953
    """ Triggers a new run of the CI system on the specified pull-request.
Pierre-Yves Chibon abb591
Pierre-Yves Chibon 9c2953
    """
Pierre-Yves Chibon 9c2953
    pagure.lib.plugins.get_plugin("Pagure CI")
Pierre-Yves Chibon abb591
Pierre-Yves Chibon 3117a1
    if not pr_uid and not project_name:
Pierre-Yves Chibon 3117a1
        _log.debug("No PR UID nor project name specified, can't trigger CI")
Pierre-Yves Chibon 3117a1
        session.close()
Pierre-Yves Chibon 3117a1
        return
Pierre-Yves Chibon 3117a1
Pierre-Yves Chibon 3117a1
    if pr_uid:
Pierre-Yves Chibon 930073
        pr = pagure.lib.query.get_request_by_uid(session, pr_uid)
Pierre-Yves Chibon 3117a1
        if pr.remote:
Pierre-Yves Chibon b8f078
            project_name = pr.project.fullname
Pierre-Yves Chibon 3117a1
        else:
Pierre-Yves Chibon 3117a1
            project_name = pr.project_from.fullname
Pierre-Yves Chibon 3117a1
Clement Verna ba73e0
    user, namespace, project_name = split_project_fullname(project_name)
Pierre-Yves Chibon abb591
Pierre-Yves Chibon 9c2953
    _log.info("Pagure-CI: Looking for project: %s", project_name)
Pierre-Yves Chibon 930073
    project = pagure.lib.query.get_authorized_project(
Pierre-Yves Chibon 9c2953
        session=session,
Pierre-Yves Chibon 9c2953
        project_name=project_name,
Pierre-Yves Chibon 9c2953
        user=user,
Pierre-Yves Chibon 9c2953
        namespace=namespace,
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon abb591
Clement Verna ba73e0
    if project is None:
Pierre-Yves Chibon 9c2953
        _log.warning(
Pierre-Yves Chibon 9c2953
            "Pagure-CI: No project could be found for the name %s",
Pierre-Yves Chibon 9c2953
            project_name,
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon abb591
        session.close()
Pierre-Yves Chibon abb591
        return
Pierre-Yves Chibon abb591
Pierre-Yves Chibon 299281
    if project.is_fork:
Pierre-Yves Chibon 9c2953
        if (
Pierre-Yves Chibon 9c2953
            project.parent.ci_hook is None
Pierre-Yves Chibon 9c2953
            or project.parent.ci_hook.ci_url is None
Pierre-Yves Chibon 9c2953
        ):
Pierre-Yves Chibon 299281
            raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
                "Project %s not configured or incorectly configured for ci",
Pierre-Yves Chibon 9c2953
                project.parent.fullname,
Pierre-Yves Chibon 9c2953
            )
Pierre-Yves Chibon 299281
    elif project.ci_hook is None or project.ci_hook.ci_url is None:
Pierre-Yves Chibon 299281
        raise pagure.exceptions.PagureException(
Pierre-Yves Chibon 9c2953
            "Project %s not configured or incorectly configured for ci",
Pierre-Yves Chibon 9c2953
            project.fullname,
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon 299281
Pierre-Yves Chibon 9c2953
    _log.info("Pagure-CI: project retrieved: %s", project.fullname)
Clement Verna ba73e0
Pierre-Yves Chibon abb591
    _log.info(
Clement Verna 44c44e
        "Pagure-CI: Trigger from %s cause (PR# or commit) %s branch: %s",
Pierre-Yves Chibon 9c2953
        project.fullname,
Pierre-Yves Chibon 9c2953
        cause,
Pierre-Yves Chibon 9c2953
        branch,
Pierre-Yves Chibon 9c2953
    )
Pierre-Yves Chibon abb591
Pierre-Yves Chibon 9c2953
    if ci_type == "jenkins":
Clement Verna ba73e0
Pierre-Yves Chibon 9c6dee
        jenk_project = project
Clement Verna ba73e0
        if project.is_fork:
Pierre-Yves Chibon 9c6dee
            jenk_project = project.parent
Clement Verna ba73e0
Pierre-Yves Chibon 9c2953
        trigger_jenkins_build(
Pierre-Yves Chibon 9c2953
            project_path=project.path,
Pierre-Yves Chibon 9c6dee
            url=jenk_project.ci_hook.ci_url,
Pierre-Yves Chibon 9c6dee
            job=jenk_project.ci_hook.ci_job,
Pierre-Yves Chibon 9c6dee
            token=jenk_project.ci_hook.pagure_ci_token,
Pierre-Yves Chibon 9c2953
            branch=branch,
Pierre-Yves Chibon fd1956
            branch_to=branch_to,
Pierre-Yves Chibon 9c2953
            cause=cause,
Pierre-Yves Chibon 9c6dee
            ci_username=jenk_project.ci_hook.ci_username,
Pierre-Yves Chibon 9c6dee
            ci_password=jenk_project.ci_hook.ci_password,
Pierre-Yves Chibon 9c2953
        )
Pierre-Yves Chibon abb591
Pierre-Yves Chibon abb591
    else:
Pierre-Yves Chibon 9c2953
        _log.warning("Pagure-CI:Un-supported CI type")
Pierre-Yves Chibon abb591
Pierre-Yves Chibon 9c2953
    _log.info("Pagure-CI: Ready for another")