Exemple #1
0
    def __init__(self, url, token, user_field):
        self.ytClient = YTClient(url=url, token=token)
        self.user_field = user_field

        self.request_type = 'Task'
        self.bug_type = 'Bug'

        self.request_tag = 'Feature Request'
Exemple #2
0
class YouTrackUtils:
    def __init__(self):
        self.test_touchstone = "touchstone-task-runner-test"
        yt_token = os.environ["YOUTRACK_TOKEN"]
        self.yt = YTClient('https://mrc-ide.myjetbrains.com/youtrack/',
                           token=yt_token)

    def cleanup(self):
        issues = self.yt.get_issues("tag: {}".format(self.test_touchstone))
        if len(issues) > 0:
            self.yt.run_command(Command(issues, "delete"))

    def get_issues(self, query=None, fields=None):
        if query is None:
            query = "summary: {}".format(self.test_touchstone)
        if fields is None:
            fields = ["id"]
        return self.yt.get_issues(query, fields)
Exemple #3
0
class YouTrackTracker:
    SET_FIELDS_CMD = '{field} {value}'
    ADD_TAG_CMD = 'tag {tag}'

    def __init__(self, url, token, user_field):
        self.ytClient = YTClient(url=url, token=token)
        self.user_field = user_field

        self.request_type = 'Task'
        self.bug_type = 'Bug'

        self.request_tag = 'Feature Request'

    def create_issue(self, project_id, user, summary, description, issue_type):
        user_command = self.SET_FIELDS_CMD.format(field=self.user_field,
                                                  value='"{user}"')
        user_command = user_command.format(user=user)

        if not isinstance(project_id, Project):
            project = Project(id=project_id)
        else:
            project = project_id

        if issue_type == 'Request':
            type_command = self.SET_FIELDS_CMD.format(field='Type',
                                                      value=self.request_type)
            if self.request_tag and self.request_tag.strip() != '':
                type_command = '{} {}'.format(
                    type_command,
                    self.ADD_TAG_CMD.format(tag=self.request_tag))

        else:
            type_command = self.SET_FIELDS_CMD.format(field='Type',
                                                      value=self.bug_type)

        cmd = '{} {}'.format(user_command, type_command)

        issue_id = self.ytClient.create_issue(
            project, summary, description, return_fields=['id', 'idReadable'])
        self.ytClient.run_command(Command(issues=[issue_id], query=cmd))

        return issue_id
Exemple #4
0
def test_tags_not_created_if_exists():
    report = ReportConfig("TEST", {}, ["*****@*****.**"], "Hi", 100,
                          "a.ssignee")
    mock_config: Config = MockConfig()
    mock_client = Mock(spec=YTClient("", ""))
    mock_client.create_issue = Mock(return_value="ISSUE")
    mock_client.get_issues = Mock(return_value=[])
    mock_client.get_tags = Mock(return_value=fake_tags)
    create_ticket("g1", "d1", "t1", "s1", report, "1234", None, mock_client,
                  mock_config)
    mock_client.create_tag.assert_has_calls([])
def run_diagnostic_reports(group,
                           disease,
                           touchstone,
                           utc_time,  # ISO string e.g 2020-11-03T10:15:30
                           scenario,
                           *additional_recipients):
    config = Config()
    reports = config.diagnostic_reports(group, disease)
    if len(reports) > 0:
        wrapper = OrderlyWebClientWrapper(config)
        emailer = Emailer(config.smtp_host, config.smtp_port,
                          config.smtp_user, config.smtp_password)
        yt_token = config.youtrack_token
        if yt_token is None or yt_token == "None":
            # allow yt token passed as env var when running locally
            # or during CI tests
            yt_token = os.environ["YOUTRACK_TOKEN"]
        yt = YTClient('https://mrc-ide.myjetbrains.com/youtrack/',
                      token=yt_token)

        def success_callback(report, version):
            send_diagnostic_report_email(emailer,
                                         report,
                                         version,
                                         group,
                                         disease,
                                         touchstone,
                                         utc_time,
                                         scenario,
                                         config,
                                         *additional_recipients)
            create_ticket(group, disease, touchstone, scenario,
                          report, version, None, yt, config)

        def error_callback(report, error):
            create_ticket(group, disease, touchstone, scenario,
                          report, None, error, yt, config)

        running_reports_repo = RunningReportsRepository(host=config.host)

        return run_reports(wrapper,
                           group,
                           disease,
                           touchstone,
                           config,
                           reports,
                           success_callback,
                           error_callback,
                           running_reports_repo)
    else:
        msg = "No configured diagnostic reports for group {}, disease {}"
        logging.warning(msg.format(group, disease))
        return {}
Exemple #6
0
def test_create_ticket_logs_errors(logging):
    report = ReportConfig("TEST", {}, ["*****@*****.**"], "Hi", 100,
                          "a.ssignee")
    mock_config: Config = MockConfig()
    mock_client = Mock(spec=YTClient("", ""))
    mock_client.get_issues = Mock(return_value=[])
    mock_client.get_tags = Mock(return_value=fake_tags)
    test_ex = Exception("TEST EX")
    mock_client.create_issue = Mock(side_effect=test_ex)
    create_ticket("g1", "d1", "t1", "s1", report, "1234", None, mock_client,
                  mock_config)
    logging.exception.assert_has_calls([call(test_ex)])
Exemple #7
0
def test_update_ticket():
    report = ReportConfig("TEST", {}, ["*****@*****.**"], "Hi", 100,
                          "a.ssignee")
    mock_config: Config = MockConfig()
    mock_client = Mock(spec=YTClient("", ""))
    mock_client.get_issues = Mock(return_value=["ISSUE"])
    mock_client.get_tags = Mock(return_value=fake_tags)
    create_ticket("g1", "d1", "t1", "s1", report, "1234", None, mock_client,
                  mock_config)
    expected_command = call(
        "ISSUE", "Check & share diag report with g1 (d1) t1",
        "Report run triggered by upload to scenario: s1. "
        "http://orderly-web/report/TEST/1234/")
    mock_client.update_issue.assert_has_calls([expected_command])
Exemple #8
0
def test_create_ticket_with_version():
    report = ReportConfig("TEST", {}, ["*****@*****.**"], "Hi", 100,
                          "a.ssignee")
    mock_config: Config = MockConfig()
    mock_client = Mock(spec=YTClient("", ""))
    mock_client.create_issue = Mock(return_value="ISSUE")
    mock_client.get_issues = Mock(return_value=[])
    mock_client.get_tags = Mock(return_value=fake_tags)
    create_ticket("g1", "d1", "t1", "s1", report, "1234", None, mock_client,
                  mock_config)
    expected_create = call(
        Project(id="78-0"), "Check & share diag report with g1 (d1) t1",
        "Report run triggered by upload to scenario: s1. "
        "http://orderly-web/report/TEST/1234/")
    mock_client.create_issue.assert_has_calls([expected_create])
    expected_command_query = \
        "for a.ssignee implementer a.ssignee tag g1 tag d1 tag t1 tag TEST"
    expected_command = call(
        Command(issues=["ISSUE"], query=expected_command_query))
    mock_client.run_command.assert_has_calls([expected_command])
def create_ticket(group, disease, touchstone, scenario,
                  report: ReportConfig, version,
                  error,
                  yt: YTClient,
                  config: Config):
    try:
        report_success = version is not None
        summary = "Check & share diag report with {} ({}) {}" if \
            report_success else \
            "Run, check & share diag report with {} ({}) {}"
        result = get_version_url(report, version, config) if \
            report_success else \
            "Auto-run failed with error: {}".format(error)
        description = "Report run triggered by upload to scenario: {}. {}"\
            .format(scenario, result)
        create_tags(yt, group, disease, touchstone, report)
        query = "tag: {} AND tag: {} AND tag: {} AND tag: {} " \
                "AND state: Incoming"
        existing_issues = yt.get_issues(
            query.format(disease, touchstone, group, report.name),
            ["id", "summary", "description", "tags(name)"])
        summary = summary.format(group, disease, touchstone)
        if len(existing_issues) > 0:
            existing_issue = existing_issues[0]
            yt.update_issue(existing_issue, summary, description)
        else:
            issue = yt.create_issue(Project(vimc_project_id),
                                    summary,
                                    description)
            comm = "for {} implementer {} tag {} tag {} tag {} tag {}".format(
                report.assignee,
                report.assignee,
                group, disease,
                touchstone,
                report.name)
            yt.run_command(
                Command([issue], comm))
    except Exception as ex:
        logging.exception(ex)
Exemple #10
0
 def __init__(self):
     self.test_touchstone = "touchstone-task-runner-test"
     yt_token = os.environ["YOUTRACK_TOKEN"]
     self.yt = YTClient('https://mrc-ide.myjetbrains.com/youtrack/',
                        token=yt_token)