Unverified Commit 083b9b57 authored by Tamika Tannis's avatar Tamika Tannis Committed by GitHub

feat: Configure JIRA Issue Labels (#464)

* Allow configuration of jira issue labels

* Fix UI when there are multiple issues

* Type fix
parent 60175848
import os import os
from typing import Callable, Dict, Optional, Set # noqa: F401 from typing import Callable, Dict, List, Optional, Set # noqa: F401
from amundsen_application.models.user import User from amundsen_application.models.user import User
from flask import Flask # noqa: F401 from flask import Flask # noqa: F401
...@@ -49,6 +49,7 @@ class Config: ...@@ -49,6 +49,7 @@ class Config:
INIT_CUSTOM_ROUTES = None # type: Callable[[Flask], None] INIT_CUSTOM_ROUTES = None # type: Callable[[Flask], None]
# Settings for Issue tracker integration # Settings for Issue tracker integration
ISSUE_LABELS = [] # type: List[str]
ISSUE_TRACKER_URL = None # type: str ISSUE_TRACKER_URL = None # type: str
ISSUE_TRACKER_USER = None # type: str ISSUE_TRACKER_USER = None # type: str
ISSUE_TRACKER_PASSWORD = None # type: str ISSUE_TRACKER_PASSWORD = None # type: str
......
...@@ -29,10 +29,12 @@ def get_issue_tracker_client() -> BaseIssueTrackerClient: ...@@ -29,10 +29,12 @@ def get_issue_tracker_client() -> BaseIssueTrackerClient:
password = app.config['ISSUE_TRACKER_PASSWORD'] password = app.config['ISSUE_TRACKER_PASSWORD']
project_id = app.config['ISSUE_TRACKER_PROJECT_ID'] project_id = app.config['ISSUE_TRACKER_PROJECT_ID']
max_results = app.config['ISSUE_TRACKER_MAX_RESULTS'] max_results = app.config['ISSUE_TRACKER_MAX_RESULTS']
issue_labels = app.config['ISSUE_LABELS']
if app.config['ISSUE_TRACKER_CLIENT']: if app.config['ISSUE_TRACKER_CLIENT']:
client = import_string(app.config['ISSUE_TRACKER_CLIENT']) client = import_string(app.config['ISSUE_TRACKER_CLIENT'])
_issue_tracker_client = client(issue_tracker_url=url, _issue_tracker_client = client(issue_labels=issue_labels,
issue_tracker_url=url,
issue_tracker_user=user, issue_tracker_user=user,
issue_tracker_password=password, issue_tracker_password=password,
issue_tracker_project_id=project_id, issue_tracker_project_id=project_id,
......
...@@ -19,11 +19,13 @@ ISSUE_TYPE_NAME = 'Bug' ...@@ -19,11 +19,13 @@ ISSUE_TYPE_NAME = 'Bug'
class JiraClient(BaseIssueTrackerClient): class JiraClient(BaseIssueTrackerClient):
def __init__(self, issue_tracker_url: str, def __init__(self, issue_labels: List[str],
issue_tracker_url: str,
issue_tracker_user: str, issue_tracker_user: str,
issue_tracker_password: str, issue_tracker_password: str,
issue_tracker_project_id: int, issue_tracker_project_id: int,
issue_tracker_max_results: int) -> None: issue_tracker_max_results: int) -> None:
self.issue_labels = issue_labels
self.jira_url = issue_tracker_url self.jira_url = issue_tracker_url
self.jira_user = issue_tracker_user self.jira_user = issue_tracker_user
self.jira_password = issue_tracker_password self.jira_password = issue_tracker_password
...@@ -83,7 +85,8 @@ class JiraClient(BaseIssueTrackerClient): ...@@ -83,7 +85,8 @@ class JiraClient(BaseIssueTrackerClient):
}, issuetype={ }, issuetype={
'id': ISSUE_TYPE_ID, 'id': ISSUE_TYPE_ID,
'name': ISSUE_TYPE_NAME, 'name': ISSUE_TYPE_NAME,
}, summary=title, }, labels=self.issue_labels,
summary=title,
description=(f'{description} ' description=(f'{description} '
f'\n Reported By: {user_email} ' f'\n Reported By: {user_email} '
f'\n Table Key: {table_uri} [PLEASE DO NOT REMOVE]'), f'\n Table Key: {table_uri} [PLEASE DO NOT REMOVE]'),
......
@import 'variables'; @import 'variables';
.table-issues { .table-issues {
margin-bottom: $spacer-1;
.issue-banner { .issue-banner {
height: 40px; height: 40px;
margin: 8px 0; padding: $spacer-1;
padding: 8px;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
border-top: 1px solid $stroke-light; border-top: 1px solid $stroke-light;
border-bottom: 1px solid $stroke-light;
color: $text-secondary; color: $text-secondary;
&:last-child {
border-bottom: 1px solid $stroke-light;
}
> :not(.table-issue-priority) {
line-height: 24px;
}
} }
.table-issue-link { .table-issue-link {
margin-right: $spacer-1; margin-right: $spacer-1;
......
...@@ -45,7 +45,8 @@ class JiraClientTest(unittest.TestCase): ...@@ -45,7 +45,8 @@ class JiraClientTest(unittest.TestCase):
with app.test_request_context(): with app.test_request_context():
try: try:
JiraClient(issue_tracker_url='', JiraClient(issue_labels=[],
issue_tracker_url='',
issue_tracker_user='', issue_tracker_user='',
issue_tracker_password='', issue_tracker_password='',
issue_tracker_project_id=-1, issue_tracker_project_id=-1,
...@@ -64,7 +65,8 @@ class JiraClientTest(unittest.TestCase): ...@@ -64,7 +65,8 @@ class JiraClientTest(unittest.TestCase):
mock_remaining_issues.return_value = 0 mock_remaining_issues.return_value = 0
with app.test_request_context(): with app.test_request_context():
try: try:
jira_client = JiraClient(issue_tracker_url=app.config['ISSUE_TRACKER_URL'], jira_client = JiraClient(issue_labels=[],
issue_tracker_url=app.config['ISSUE_TRACKER_URL'],
issue_tracker_user=app.config['ISSUE_TRACKER_USER'], issue_tracker_user=app.config['ISSUE_TRACKER_USER'],
issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'], issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'],
issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'], issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'],
...@@ -91,7 +93,8 @@ class JiraClientTest(unittest.TestCase): ...@@ -91,7 +93,8 @@ class JiraClientTest(unittest.TestCase):
mock_get_url.return_value = 'url' mock_get_url.return_value = 'url'
mock_sort_issues.return_value = [self.mock_issue] mock_sort_issues.return_value = [self.mock_issue]
with app.test_request_context(): with app.test_request_context():
jira_client = JiraClient(issue_tracker_url=app.config['ISSUE_TRACKER_URL'], jira_client = JiraClient(issue_labels=[],
issue_tracker_url=app.config['ISSUE_TRACKER_URL'],
issue_tracker_user=app.config['ISSUE_TRACKER_USER'], issue_tracker_user=app.config['ISSUE_TRACKER_USER'],
issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'], issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'],
issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'], issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'],
...@@ -109,7 +112,8 @@ class JiraClientTest(unittest.TestCase): ...@@ -109,7 +112,8 @@ class JiraClientTest(unittest.TestCase):
def test__generate_all_issues_url(self, mock_url_lib: Mock, mock_JIRA_client: Mock) -> None: def test__generate_all_issues_url(self, mock_url_lib: Mock, mock_JIRA_client: Mock) -> None:
mock_url_lib.return_value = 'test' mock_url_lib.return_value = 'test'
with app.test_request_context(): with app.test_request_context():
jira_client = JiraClient(issue_tracker_url=app.config['ISSUE_TRACKER_URL'], jira_client = JiraClient(issue_labels=[],
issue_tracker_url=app.config['ISSUE_TRACKER_URL'],
issue_tracker_user=app.config['ISSUE_TRACKER_USER'], issue_tracker_user=app.config['ISSUE_TRACKER_USER'],
issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'], issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'],
issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'], issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'],
...@@ -121,7 +125,8 @@ class JiraClientTest(unittest.TestCase): ...@@ -121,7 +125,8 @@ class JiraClientTest(unittest.TestCase):
@unittest.mock.patch('amundsen_application.proxy.issue_tracker_clients.jira_client.JIRA') @unittest.mock.patch('amundsen_application.proxy.issue_tracker_clients.jira_client.JIRA')
def test__generate_all_issues_url_no_issues(self, mock_JIRA_client: Mock) -> None: def test__generate_all_issues_url_no_issues(self, mock_JIRA_client: Mock) -> None:
with app.test_request_context(): with app.test_request_context():
jira_client = JiraClient(issue_tracker_url=app.config['ISSUE_TRACKER_URL'], jira_client = JiraClient(issue_labels=[],
issue_tracker_url=app.config['ISSUE_TRACKER_URL'],
issue_tracker_user=app.config['ISSUE_TRACKER_USER'], issue_tracker_user=app.config['ISSUE_TRACKER_USER'],
issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'], issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'],
issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'], issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'],
...@@ -136,7 +141,8 @@ class JiraClientTest(unittest.TestCase): ...@@ -136,7 +141,8 @@ class JiraClientTest(unittest.TestCase):
mock_JIRA_client.return_value.create_issue.side_effect = JIRAError('Some exception') mock_JIRA_client.return_value.create_issue.side_effect = JIRAError('Some exception')
with app.test_request_context(): with app.test_request_context():
try: try:
jira_client = JiraClient(issue_tracker_url=app.config['ISSUE_TRACKER_URL'], jira_client = JiraClient(issue_labels=[],
issue_tracker_url=app.config['ISSUE_TRACKER_URL'],
issue_tracker_user=app.config['ISSUE_TRACKER_USER'], issue_tracker_user=app.config['ISSUE_TRACKER_USER'],
issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'], issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'],
issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'], issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'],
...@@ -152,8 +158,10 @@ class JiraClientTest(unittest.TestCase): ...@@ -152,8 +158,10 @@ class JiraClientTest(unittest.TestCase):
def test_create_issue(self, mock_get_issue_properties: Mock, mock_JIRA_client: Mock) -> None: def test_create_issue(self, mock_get_issue_properties: Mock, mock_JIRA_client: Mock) -> None:
mock_JIRA_client.return_value.create_issue.return_value = self.mock_issue mock_JIRA_client.return_value.create_issue.return_value = self.mock_issue
mock_get_issue_properties.return_value = self.mock_issue_instance mock_get_issue_properties.return_value = self.mock_issue_instance
mock_labels = ['mock-label']
with app.test_request_context(): with app.test_request_context():
jira_client = JiraClient(issue_tracker_url=app.config['ISSUE_TRACKER_URL'], jira_client = JiraClient(issue_labels=mock_labels,
issue_tracker_url=app.config['ISSUE_TRACKER_URL'],
issue_tracker_user=app.config['ISSUE_TRACKER_USER'], issue_tracker_user=app.config['ISSUE_TRACKER_USER'],
issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'], issue_tracker_password=app.config['ISSUE_TRACKER_PASSWORD'],
issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'], issue_tracker_project_id=app.config['ISSUE_TRACKER_PROJECT_ID'],
...@@ -166,7 +174,8 @@ class JiraClientTest(unittest.TestCase): ...@@ -166,7 +174,8 @@ class JiraClientTest(unittest.TestCase):
}, issuetype={ }, issuetype={
'id': 1, 'id': 1,
'name': 'Bug', 'name': 'Bug',
}, summary='title', }, labels=mock_labels,
summary='title',
description='desc' + ' \n Reported By: test@email.com' + description='desc' + ' \n Reported By: test@email.com' +
' \n Table Key: ' + 'key [PLEASE DO NOT REMOVE]', ' \n Table Key: ' + 'key [PLEASE DO NOT REMOVE]',
reporter={'name': 'test'})) reporter={'name': 'test'}))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment