diff --git a/workflows/jira/versions/0.0.1/images/jira-manager/Dockerfile b/workflows/jira/versions/0.0.1/images/jira-manager/Dockerfile index 00950d15..55c3cfdd 100644 --- a/workflows/jira/versions/0.0.1/images/jira-manager/Dockerfile +++ b/workflows/jira/versions/0.0.1/images/jira-manager/Dockerfile @@ -10,7 +10,8 @@ RUN apk add --no-cache libffi libffi-dev RUN /usr/local/bin/python -m pip install --upgrade pip RUN pip3 install --no-cache-dir jira +WORKDIR /jira COPY lib/. /jira/ -ENTRYPOINT ["python", "/jira_issue_manager.py"] +ENTRYPOINT ["python", "jira_issue_manager.py"] CMD [""] diff --git a/workflows/jira/versions/0.0.1/images/jira-manager/lib/jira_auth.py b/workflows/jira/versions/0.0.1/images/jira-manager/lib/jira_auth.py new file mode 100644 index 00000000..1e15b240 --- /dev/null +++ b/workflows/jira/versions/0.0.1/images/jira-manager/lib/jira_auth.py @@ -0,0 +1,50 @@ +from jira import JIRA +from step_utility import StepUtility +import sys + +class JiraAuth: + def __init__(self, environment: 'Environment'): + self.environment = environment + self.auth_methods = { + "basic_auth": self.basic_auth_func, + "token_auth": self.token_auth_func, + "oauth": self.oauth_func, + "jwt": self.jwt_auth_func + } + + def do_auth(self) -> JIRA: + if self.environment.auth_method not in self.auth_methods: + StepUtility.printFail("Exiting Step - Invalid AUTH method - Options: basic_auth/token_auth/oauth/jwt") + sys.exit(1) + + res = self.auth_methods.get(self.environment.auth_method)() + return JIRA(self.environment.jira_base_url, **res) + + def basic_auth_func(self) -> dict: + if not self.environment.jira_username or not self.environment.jira_api_key: + StepUtility.printFail("Exiting Step - basic auth needs username and API key") + sys.exit(1) + return { + 'basic_auth': (self.environment.jira_username, self.environment.jira_api_key) + } + + def token_auth_func(self) -> dict: + if not self.environment.jira_pat_token: + StepUtility.printFail("Exiting Step - token auth needs PAT token") + sys.exit(1) + return { + 'token_auth': self.environment.jira_pat_token + } + + def oauth_func(self): + StepUtility.printFail("Exiting Step - OAuth not implemented") + sys.exit(1) + + def jwt_auth_func(self): + StepUtility.printFail("Exiting Step - JWT Auth not implemented") + sys.exit(1) + + + + + diff --git a/workflows/jira/versions/0.0.1/images/jira-manager/lib/jira_issue_manager.py b/workflows/jira/versions/0.0.1/images/jira-manager/lib/jira_issue_manager.py index 8eca4405..0f041798 100644 --- a/workflows/jira/versions/0.0.1/images/jira-manager/lib/jira_issue_manager.py +++ b/workflows/jira/versions/0.0.1/images/jira-manager/lib/jira_issue_manager.py @@ -8,15 +8,18 @@ from jira import JIRA from step_utility import StepUtility from requests.auth import HTTPBasicAuth +from jira_auth import JiraAuth class Environment: - def __init__(self, jira_base_url, jira_username, jira_api_key, action, + def __init__(self, jira_base_url, auth_method, jira_username, jira_api_key, jira_pat_token, action, issue, issue_project, issue_summary, issue_description, issue_type, issue_components, issue_customfields, existing_comment_id, comment_body, status, jql_query, jql_query_max_results, verbose): self.jira_base_url = jira_base_url + self.auth_method = auth_method self.jira_username = jira_username self.jira_api_key = jira_api_key + self.jira_pat_token = jira_pat_token self.action = action self.issue = issue self.issue_project = issue_project @@ -43,8 +46,10 @@ def environment_setup(): # Grab all of the environment variables env = os.environ jira_base_url = StepUtility.getEnvironmentVariable('JIRA_BASE_URL', env) + jira_auth_method = StepUtility.getEnvironmentVariable('JIRA_AUTH_METHOD', env) jira_username = StepUtility.getEnvironmentVariable('JIRA_USERNAME', env) jira_api_key = StepUtility.getEnvironmentVariable('JIRA_API_KEY', env) + jira_pat_token = StepUtility.getEnvironmentVariable('JIRA_PAT_TOKEN', env) action = StepUtility.getEnvironmentVariable('ACTION', env) # Logic here to use the regex to grab the jira issue key and assign it to issue @@ -98,8 +103,10 @@ def environment_setup(): current_environment = Environment( jira_base_url, + jira_auth_method, jira_username, jira_api_key, + jira_pat_token, action, issue, issue_project, @@ -116,14 +123,10 @@ def environment_setup(): verbose) return current_environment +def authentication(current_environment) -> JIRA: + auth = JiraAuth(current_environment) + return auth.do_auth() -def authentication(current_environment): - # Basic authentication with an API Token - jira = JIRA( - current_environment.jira_base_url, - basic_auth=(current_environment.jira_username, current_environment.jira_api_key) - ) - return jira def step_action(action, authenticated_jira, current_environment): diff --git a/workflows/jira/versions/0.0.1/workflowTemplate.yaml b/workflows/jira/versions/0.0.1/workflowTemplate.yaml index 318fcce3..322f9467 100644 --- a/workflows/jira/versions/0.0.1/workflowTemplate.yaml +++ b/workflows/jira/versions/0.0.1/workflowTemplate.yaml @@ -31,10 +31,16 @@ spec: inputs: parameters: # required - - name: JIRA_API_KEY - name: JIRA_BASE_URL - - name: JIRA_USERNAME # optional + - name: JIRA_AUTH_METHOD + default: 'basic_auth' + - name: JIRA_USERNAME + default: 'jira-creds' + - name: JIRA_API_KEY + default: 'jira-creds' + - name: JIRA_PAT_TOKEN + default: 'jira-creds' - name: COMMENT_BODY default: '' - name: JIRA_API_KEY_SECRET_KEY @@ -43,6 +49,8 @@ spec: default: '' - name: JIRA_USERNAME_SECRET_KEY default: 'username' + - name: JIRA_PAT_TOKEN_SECRET_KEY + default: 'pat-token' outputs: parameters: - name: JIRA_COMMENT_ID @@ -58,6 +66,8 @@ spec: env: - name: JIRA_BASE_URL value: '{{ inputs.parameters.JIRA_BASE_URL }}' + - name: JIRA_AUTH_METHOD + value: '{{ inputs.parameters.JIRA_AUTH_METHOD }}' - name: JIRA_USERNAME valueFrom: secretKeyRef: @@ -68,6 +78,11 @@ spec: secretKeyRef: name: '{{ inputs.parameters.JIRA_API_KEY }}' key: '{{ inputs.parameters.JIRA_API_KEY_SECRET_KEY }}' + - name: JIRA_PAT_TOKEN + valueFrom: + secretKeyRef: + name: '{{ inputs.parameters.JIRA_PAT_TOKEN }}' + key: '{{ inputs.parameters.JIRA_PAT_TOKEN_SECRET_KEY }}' - name: ACTION value: 'comment_create' - name: COMMENT_BODY @@ -90,11 +105,19 @@ spec: inputs: parameters: # required - - name: JIRA_API_KEY - name: JIRA_BASE_URL - - name: JIRA_USERNAME - name: JIRA_COMMENT_ID # optional + - name: JIRA_AUTH_METHOD + default: 'basic_auth' + - name: JIRA_USERNAME + default: 'jira-creds' + - name: JIRA_API_KEY + default: 'jira-creds' + - name: JIRA_PAT_TOKEN + default: 'jira-creds' + - name: JIRA_PAT_TOKEN_SECRET_KEY + default: 'pat-token' - name: COMMENT_BODY default: '' - name: JIRA_API_KEY_SECRET_KEY @@ -113,6 +136,8 @@ spec: env: - name: JIRA_BASE_URL value: '{{ inputs.parameters.JIRA_BASE_URL }}' + - name: JIRA_AUTH_METHOD + value: '{{ inputs.parameters.JIRA_AUTH_METHOD }}' - name: JIRA_USERNAME valueFrom: secretKeyRef: @@ -123,6 +148,11 @@ spec: secretKeyRef: name: '{{ inputs.parameters.JIRA_API_KEY }}' key: '{{ inputs.parameters.JIRA_API_KEY_SECRET_KEY }}' + - name: JIRA_PAT_TOKEN + valueFrom: + secretKeyRef: + name: '{{ inputs.parameters.JIRA_PAT_TOKEN }}' + key: '{{ inputs.parameters.JIRA_PAT_TOKEN_SECRET_KEY }}' - name: ACTION value: 'comment_update' - name: COMMENT_BODY @@ -147,10 +177,18 @@ spec: inputs: parameters: # required - - name: JIRA_API_KEY - name: JIRA_BASE_URL - - name: JIRA_USERNAME # optional + - name: JIRA_AUTH_METHOD + default: 'basic_auth' + - name: JIRA_USERNAME + default: 'jira-creds' + - name: JIRA_API_KEY + default: 'jira-creds' + - name: JIRA_PAT_TOKEN + default: 'jira-creds' + - name: JIRA_PAT_TOKEN_SECRET_KEY + default: 'pat-token' - name: JIRA_API_KEY_SECRET_KEY default: 'api-key' - name: JIRA_USERNAME_SECRET_KEY @@ -182,6 +220,8 @@ spec: env: - name: JIRA_BASE_URL value: '{{ inputs.parameters.JIRA_BASE_URL }}' + - name: JIRA_AUTH_METHOD + value: '{{ inputs.parameters.JIRA_AUTH_METHOD }}' - name: JIRA_USERNAME valueFrom: secretKeyRef: @@ -192,6 +232,11 @@ spec: secretKeyRef: name: '{{ inputs.parameters.JIRA_API_KEY }}' key: '{{ inputs.parameters.JIRA_API_KEY_SECRET_KEY }}' + - name: JIRA_PAT_TOKEN + valueFrom: + secretKeyRef: + name: '{{ inputs.parameters.JIRA_PAT_TOKEN }}' + key: '{{ inputs.parameters.JIRA_PAT_TOKEN_SECRET_KEY }}' - name: ACTION value: 'issue_create' - name: ISSUE_PROJECT @@ -222,10 +267,18 @@ spec: inputs: parameters: # required - - name: JIRA_API_KEY - name: JIRA_BASE_URL - - name: JIRA_USERNAME # optional + - name: JIRA_AUTH_METHOD + default: 'basic_auth' + - name: JIRA_USERNAME + default: 'jira-creds' + - name: JIRA_API_KEY + default: 'jira-creds' + - name: JIRA_PAT_TOKEN + default: 'jira-creds' + - name: JIRA_PAT_TOKEN_SECRET_KEY + default: 'pat-token' - name: JIRA_API_KEY_SECRET_KEY default: 'api-key' - name: JIRA_ISSUE_SOURCE_FIELD @@ -250,6 +303,8 @@ spec: env: - name: JIRA_BASE_URL value: '{{ inputs.parameters.JIRA_BASE_URL }}' + - name: JIRA_AUTH_METHOD + value: '{{ inputs.parameters.JIRA_AUTH_METHOD }}' - name: JIRA_USERNAME valueFrom: secretKeyRef: @@ -260,6 +315,11 @@ spec: secretKeyRef: name: '{{ inputs.parameters.JIRA_API_KEY }}' key: '{{ inputs.parameters.JIRA_API_KEY_SECRET_KEY }}' + - name: JIRA_PAT_TOKEN + valueFrom: + secretKeyRef: + name: '{{ inputs.parameters.JIRA_PAT_TOKEN }}' + key: '{{ inputs.parameters.JIRA_PAT_TOKEN_SECRET_KEY }}' - name: ACTION value: 'issue_update' - name: JIRA_ISSUE_SOURCE_FIELD @@ -288,10 +348,18 @@ spec: inputs: parameters: # required - - name: JIRA_API_KEY - name: JIRA_BASE_URL - - name: JIRA_USERNAME # optional + - name: JIRA_AUTH_METHOD + default: 'basic_auth' + - name: JIRA_USERNAME + default: 'jira-creds' + - name: JIRA_API_KEY + default: 'jira-creds' + - name: JIRA_PAT_TOKEN + default: 'jira-creds' + - name: JIRA_PAT_TOKEN_SECRET_KEY + default: 'pat-token' - name: JIRA_API_KEY_SECRET_KEY default: 'api-key' - name: JIRA_USERNAME_SECRET_KEY @@ -316,6 +384,8 @@ spec: env: - name: JIRA_BASE_URL value: '{{ inputs.parameters.JIRA_BASE_URL }}' + - name: JIRA_AUTH_METHOD + value: '{{ inputs.parameters.JIRA_AUTH_METHOD }}' - name: JIRA_USERNAME valueFrom: secretKeyRef: @@ -326,6 +396,11 @@ spec: secretKeyRef: name: '{{ inputs.parameters.JIRA_API_KEY }}' key: '{{ inputs.parameters.JIRA_API_KEY_SECRET_KEY }}' + - name: JIRA_PAT_TOKEN + valueFrom: + secretKeyRef: + name: '{{ inputs.parameters.JIRA_PAT_TOKEN }}' + key: '{{ inputs.parameters.JIRA_PAT_TOKEN_SECRET_KEY }}' - name: ACTION value: 'update_all_from_jql_query' - name: ISSUE_DESCRIPTION @@ -354,10 +429,18 @@ spec: inputs: parameters: # required - - name: JIRA_API_KEY - name: JIRA_BASE_URL - - name: JIRA_USERNAME # optional + - name: JIRA_AUTH_METHOD + default: 'basic_auth' + - name: JIRA_USERNAME + default: 'jira-creds' + - name: JIRA_API_KEY + default: 'jira-creds' + - name: JIRA_PAT_TOKEN + default: 'jira-creds' + - name: JIRA_PAT_TOKEN_SECRET_KEY + default: 'pat-token' - name: JIRA_API_KEY_SECRET_KEY default: 'api-key' - name: JIRA_USERNAME_SECRET_KEY @@ -376,6 +459,8 @@ spec: env: - name: JIRA_BASE_URL value: '{{ inputs.parameters.JIRA_BASE_URL }}' + - name: JIRA_AUTH_METHOD + value: '{{ inputs.parameters.JIRA_AUTH_METHOD }}' - name: JIRA_USERNAME valueFrom: secretKeyRef: @@ -386,6 +471,11 @@ spec: secretKeyRef: name: '{{ inputs.parameters.JIRA_API_KEY }}' key: '{{ inputs.parameters.JIRA_API_KEY_SECRET_KEY }}' + - name: JIRA_PAT_TOKEN + valueFrom: + secretKeyRef: + name: '{{ inputs.parameters.JIRA_PAT_TOKEN }}' + key: '{{ inputs.parameters.JIRA_PAT_TOKEN_SECRET_KEY }}' - name: ACTION value: 'verify_status' - name: JIRA_ISSUE_SOURCE_FIELD @@ -408,10 +498,18 @@ spec: inputs: parameters: # required - - name: JIRA_API_KEY - name: JIRA_BASE_URL - - name: JIRA_USERNAME # optional + - name: JIRA_AUTH_METHOD + default: 'basic_auth' + - name: JIRA_USERNAME + default: 'jira-creds' + - name: JIRA_API_KEY + default: 'jira-creds' + - name: JIRA_PAT_TOKEN + default: 'jira-creds' + - name: JIRA_PAT_TOKEN_SECRET_KEY + default: 'pat-token' - name: JIRA_API_KEY_SECRET_KEY default: 'api-key' - name: JIRA_USERNAME_SECRET_KEY @@ -430,6 +528,8 @@ spec: env: - name: JIRA_BASE_URL value: '{{ inputs.parameters.JIRA_BASE_URL }}' + - name: JIRA_AUTH_METHOD + value: '{{ inputs.parameters.JIRA_AUTH_METHOD }}' - name: JIRA_USERNAME valueFrom: secretKeyRef: @@ -440,6 +540,11 @@ spec: secretKeyRef: name: '{{ inputs.parameters.JIRA_API_KEY }}' key: '{{ inputs.parameters.JIRA_API_KEY_SECRET_KEY }}' + - name: JIRA_PAT_TOKEN + valueFrom: + secretKeyRef: + name: '{{ inputs.parameters.JIRA_PAT_TOKEN }}' + key: '{{ inputs.parameters.JIRA_PAT_TOKEN_SECRET_KEY }}' - name: ACTION value: 'verify_status' - name: DESIRED_ISSUE_STATUS @@ -462,10 +567,18 @@ spec: inputs: parameters: # required - - name: JIRA_API_KEY - name: JIRA_BASE_URL - - name: JIRA_USERNAME # optional + - name: JIRA_AUTH_METHOD + default: 'basic_auth' + - name: JIRA_USERNAME + default: 'jira-creds' + - name: JIRA_API_KEY + default: 'jira-creds' + - name: JIRA_PAT_TOKEN + default: 'jira-creds' + - name: JIRA_PAT_TOKEN_SECRET_KEY + default: 'pat-token' - name: JIRA_API_KEY_SECRET_KEY default: 'api-key' - name: JIRA_USERNAME_SECRET_KEY @@ -486,6 +599,8 @@ spec: env: - name: JIRA_BASE_URL value: '{{ inputs.parameters.JIRA_BASE_URL }}' + - name: JIRA_AUTH_METHOD + value: '{{ inputs.parameters.JIRA_AUTH_METHOD }}' - name: JIRA_USERNAME valueFrom: secretKeyRef: @@ -496,6 +611,11 @@ spec: secretKeyRef: name: '{{ inputs.parameters.JIRA_API_KEY }}' key: '{{ inputs.parameters.JIRA_API_KEY_SECRET_KEY }}' + - name: JIRA_PAT_TOKEN + valueFrom: + secretKeyRef: + name: '{{ inputs.parameters.JIRA_PAT_TOKEN }}' + key: '{{ inputs.parameters.JIRA_PAT_TOKEN_SECRET_KEY }}' - name: ACTION value: 'issue_transition' - name: JIRA_ISSUE_SOURCE_FIELD @@ -520,10 +640,18 @@ spec: inputs: parameters: # required - - name: JIRA_API_KEY - name: JIRA_BASE_URL - - name: JIRA_USERNAME # optional + - name: JIRA_AUTH_METHOD + default: 'basic_auth' + - name: JIRA_USERNAME + default: 'jira-creds' + - name: JIRA_API_KEY + default: 'jira-creds' + - name: JIRA_PAT_TOKEN + default: 'jira-creds' + - name: JIRA_PAT_TOKEN_SECRET_KEY + default: 'pat-token' - name: JIRA_API_KEY_SECRET_KEY default: 'api-key' - name: JIRA_USERNAME_SECRET_KEY @@ -546,6 +674,8 @@ spec: env: - name: JIRA_BASE_URL value: '{{ inputs.parameters.JIRA_BASE_URL }}' + - name: JIRA_AUTH_METHOD + value: '{{ inputs.parameters.JIRA_AUTH_METHOD }}' - name: JIRA_USERNAME valueFrom: secretKeyRef: @@ -556,6 +686,11 @@ spec: secretKeyRef: name: '{{ inputs.parameters.JIRA_API_KEY }}' key: '{{ inputs.parameters.JIRA_API_KEY_SECRET_KEY }}' + - name: JIRA_PAT_TOKEN + valueFrom: + secretKeyRef: + name: '{{ inputs.parameters.JIRA_PAT_TOKEN }}' + key: '{{ inputs.parameters.JIRA_PAT_TOKEN_SECRET_KEY }}' - name: ACTION value: 'issue_transition_and_update' - name: JIRA_ISSUE_SOURCE_FIELD