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'
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)
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
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 {}
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)])
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])
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)
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)