Warning

This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.

Source code for galaxy.tools.error_reports.plugins.base_git

"""This module defines the common functions for error reporting for Galaxy jobs towards Git applications (e.g. Github/GitLab).
"""


import logging
from abc import (
    ABCMeta,
    abstractmethod,
)
from typing import Dict

import requests

from galaxy.tools.errors import EmailErrorReporter
from galaxy.util import (
    DEFAULT_SOCKET_TIMEOUT,
    unicodify,
)
from . import ErrorPlugin

log = logging.getLogger(__name__)


[docs]class BaseGitPlugin(ErrorPlugin, metaclass=ABCMeta): """Base definition to send error reports to a Git repository provider""" issue_cache: Dict[str, Dict] = {} ts_urls: Dict[str, str] = {} ts_repo_cache: Dict[str, Dict] = {} git_project_cache: Dict[str, Dict] = {} label_cache: Dict[str, Dict] = {} git_username_id_cache: Dict[str, str] = {} # Git variables git_default_repo_owner = False git_default_repo_name = False git_default_repo_only = True def _determine_ts_url(self, tool): if not tool.tool_shed or self.git_default_repo_only: return None try: if tool.tool_shed not in self.ts_urls: ts_url_request = requests.get(f"http://{tool.tool_shed}", timeout=DEFAULT_SOCKET_TIMEOUT) self.ts_urls[tool.tool_shed] = ts_url_request.url return self.ts_urls[tool.tool_shed] except Exception: return None def _get_gitrepo_from_ts(self, job, ts_url): if not ts_url or self.git_default_repo_only: return None try: if job.tool_id not in self.ts_repo_cache: ts_repo_request_data = requests.get( f"{ts_url}/api/repositories?tool_ids={str(job.tool_id)}", timeout=DEFAULT_SOCKET_TIMEOUT ).json() for repoinfo in ts_repo_request_data.values(): if isinstance(repoinfo, dict): self.ts_repo_cache[job.tool_id] = repoinfo.get("repository", {}).get( "remote_repository_url", None ) return self.ts_repo_cache[job.tool_id] except Exception: return None def _get_issue_cache_key(self, job, ts_repourl): return job.tool_id if ts_repourl else "default" def _generate_error_message(self, dataset, job, kwargs): # We'll re-use the email error reporter's template since most Git providers supports HTML error_reporter = EmailErrorReporter(dataset.id, self.app) error_reporter.create_report( job.get_user(), email=kwargs.get("email", None), message=kwargs.get("message", None), redact_user_details_in_bugreport=self.redact_user_details_in_bugreport, ) # Return the HTML report return error_reporter.html_report def _generate_error_title(self, job): tool_kw = {"tool_id": unicodify(job.tool_id), "tool_version": unicodify(job.tool_version)} return """Galaxy Job Error: {tool_id} v{tool_version}""".format(**tool_kw) @abstractmethod def _create_issue(self, issue_cache_key, error_title, error_mesage, project, **kwargs): raise NotImplementedError("Method _create_issue is required") @abstractmethod def _append_issue(self, issue_cache_key, error_title, error_message, **kwargs): raise NotImplementedError("Method _append_issue is required") @abstractmethod def _fill_issue_cache(self, git_project, issue_cache_key): raise NotImplementedError("Method _fill_issue_cache is required")