1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

jira - changing the logic for transition (#1978) (#2195)

* attempt at fixing the issue

* Update plugins/modules/web_infrastructure/jira.py

* Fixed setting of "fields" element in the payload

* added changelog fragment

* added accountId parameter + minor fixes in docs

* added integration test for jira

* adjustments per PR

* Update plugins/modules/web_infrastructure/jira.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/web_infrastructure/jira.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/web_infrastructure/jira.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/web_infrastructure/jira.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* Update plugins/modules/web_infrastructure/jira.py

Co-authored-by: Felix Fontein <felix@fontein.de>

* adjustments per PR

Co-authored-by: Felix Fontein <felix@fontein.de>
(cherry picked from commit beb3b85a4f)

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
This commit is contained in:
patchback[bot] 2021-04-07 08:39:06 +02:00 committed by GitHub
parent d2cdca416c
commit bec6f732ad
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 112 additions and 11 deletions

View file

@ -0,0 +1,4 @@
bugfixes:
- jira - fixed fields' update in ticket transitions (https://github.com/ansible-collections/community.general/issues/818).
minor_changes:
- jira - added parameter ``account_id`` for compatibility with recent versions of JIRA (https://github.com/ansible-collections/community.general/issues/818, https://github.com/ansible-collections/community.general/pull/1978).

View file

@ -56,12 +56,14 @@ options:
required: false required: false
description: description:
- The issue summary, where appropriate. - The issue summary, where appropriate.
- Note that JIRA may not allow changing field values on specific transitions or states.
description: description:
type: str type: str
required: false required: false
description: description:
- The issue description, where appropriate. - The issue description, where appropriate.
- Note that JIRA may not allow changing field values on specific transitions or states.
issuetype: issuetype:
type: str type: str
@ -81,18 +83,28 @@ options:
required: false required: false
description: description:
- The comment text to add. - The comment text to add.
- Note that JIRA may not allow changing field values on specific transitions or states.
status: status:
type: str type: str
required: false required: false
description: description:
- The desired status; only relevant for the transition operation. - Only used when I(operation) is C(transition), and a bit of a misnomer, it actually refers to the transition name.
assignee: assignee:
type: str type: str
required: false required: false
description: description:
- Sets the assignee on create or transition operations. Note not all transitions will allow this. - Sets the the assignee when I(operation) is C(create), C(transition) or C(edit).
- Recent versions of JIRA no longer accept a user name as a user identifier. In that case, use I(account_id) instead.
- Note that JIRA may not allow changing field values on specific transitions or states.
account_id:
type: str
description:
- Sets the account identifier for the assignee when I(operation) is C(create), C(transition) or C(edit).
- Note that JIRA may not allow changing field values on specific transitions or states.
version_added: 2.5.0
linktype: linktype:
type: str type: str
@ -119,6 +131,7 @@ options:
- This is a free-form data structure that can contain arbitrary data. This is passed directly to the JIRA REST API - This is a free-form data structure that can contain arbitrary data. This is passed directly to the JIRA REST API
(possibly after merging with other required data, as when passed to create). See examples for more information, (possibly after merging with other required data, as when passed to create). See examples for more information,
and the JIRA REST API for the structure required for various fields. and the JIRA REST API for the structure required for various fields.
- Note that JIRA may not allow changing field values on specific transitions or states.
jql: jql:
required: false required: false
@ -151,6 +164,7 @@ options:
notes: notes:
- "Currently this only works with basic-auth." - "Currently this only works with basic-auth."
- "To use with JIRA Cloud, pass the login e-mail as the I(username) and the API token as I(password)."
author: author:
- "Steve Smith (@tarka)" - "Steve Smith (@tarka)"
@ -172,7 +186,7 @@ EXAMPLES = r"""
args: args:
fields: fields:
customfield_13225: "test" customfield_13225: "test"
customfield_12931: '{"value": "Test"}' customfield_12931: {"value": "Test"}
register: issue register: issue
- name: Comment on issue - name: Comment on issue
@ -282,20 +296,20 @@ EXAMPLES = r"""
inwardissue: HSP-1 inwardissue: HSP-1
outwardissue: MKY-1 outwardissue: MKY-1
# Transition an issue by target status # Transition an issue
- name: Close the issue - name: Resolve the issue
community.general.jira: community.general.jira:
uri: '{{ server }}' uri: '{{ server }}'
username: '{{ user }}' username: '{{ user }}'
password: '{{ pass }}' password: '{{ pass }}'
issue: '{{ issue.meta.key }}' issue: '{{ issue.meta.key }}'
operation: transition operation: transition
status: Done status: Resolve Issue
args: account_id: 112233445566778899aabbcc
fields: fields:
customfield_14321: [ {'set': {'value': 'Value of Select' }} ] resolution:
comment: [ { 'add': { 'body' : 'Test' } }] name: Done
description: I am done! This is the last description I will ever give you.
""" """
import base64 import base64
@ -440,10 +454,22 @@ def transition(restbase, user, passwd, params):
if not tid: if not tid:
raise ValueError("Failed find valid transition for '%s'" % target) raise ValueError("Failed find valid transition for '%s'" % target)
fields = dict(params['fields'])
if params['summary'] is not None:
fields.update({'summary': params['summary']})
if params['description'] is not None:
fields.update({'description': params['description']})
# Perform it # Perform it
url = restbase + '/issue/' + params['issue'] + "/transitions" url = restbase + '/issue/' + params['issue'] + "/transitions"
data = {'transition': {"id": tid}, data = {'transition': {"id": tid},
'update': params['fields']} 'fields': fields}
if params['comment'] is not None:
data.update({"update": {
"comment": [{
"add": {"body": params['comment']}
}],
}})
return True, post(url, user, passwd, params['timeout'], data) return True, post(url, user, passwd, params['timeout'], data)
@ -486,6 +512,7 @@ def main():
maxresults=dict(type='int'), maxresults=dict(type='int'),
timeout=dict(type='float', default=10), timeout=dict(type='float', default=10),
validate_certs=dict(default=True, type='bool'), validate_certs=dict(default=True, type='bool'),
account_id=dict(type='str'),
), ),
required_if=( required_if=(
('operation', 'create', ['project', 'issuetype', 'summary']), ('operation', 'create', ['project', 'issuetype', 'summary']),
@ -495,6 +522,7 @@ def main():
('operation', 'link', ['linktype', 'inwardissue', 'outwardissue']), ('operation', 'link', ['linktype', 'inwardissue', 'outwardissue']),
('operation', 'search', ['jql']), ('operation', 'search', ['jql']),
), ),
mutually_exclusive=[('assignee', 'account_id')],
supports_check_mode=False supports_check_mode=False
) )
@ -506,6 +534,8 @@ def main():
passwd = module.params['password'] passwd = module.params['password']
if module.params['assignee']: if module.params['assignee']:
module.params['fields']['assignee'] = {'name': module.params['assignee']} module.params['fields']['assignee'] = {'name': module.params['assignee']}
if module.params['account_id']:
module.params['fields']['assignee'] = {'accountId': module.params['account_id']}
if not uri.endswith('/'): if not uri.endswith('/'):
uri = uri + '/' uri = uri + '/'

View file

@ -0,0 +1,2 @@
unsupported
shippable/posix/group3

View file

@ -0,0 +1,58 @@
---
- community.general.jira:
uri: "{{ uri }}"
username: "{{ user }}"
password: "{{ pasw }}"
project: "{{ proj }}"
operation: create
summary: test ticket
description: bla bla bla
issuetype: Task
register: issue
- debug:
msg: Issue={{ issue }}
- name: Add comment bleep bleep
community.general.jira:
uri: "{{ uri }}"
username: "{{ user }}"
password: "{{ pasw }}"
issue: "{{ issue.meta.key }}"
operation: comment
comment: bleep bleep!
- name: Transition -> In Progress with comment
community.general.jira:
uri: "{{ uri }}"
username: "{{ user }}"
password: "{{ pasw }}"
issue: "{{ issue.meta.key }}"
operation: transition
status: Start Progress
comment: -> in progress
- name: Change assignee
community.general.jira:
uri: "{{ uri }}"
username: "{{ user }}"
password: "{{ pasw }}"
issue: "{{ issue.meta.key }}"
operation: edit
accountId: "{{ user2 }}"
- name: Transition -> Resolved with comment
community.general.jira:
uri: "{{ uri }}"
username: "{{ user }}"
password: "{{ pasw }}"
issue: "{{ issue.meta.key }}"
operation: transition
status: Resolve Issue
comment: -> resolved
accountId: "{{ user1 }}"
fields:
resolution:
name: Done
description: wakawakawakawaka
- debug:
msg:
- Issue = {{ issue.meta.key }}
- URL = {{ issue.meta.self }}

View file

@ -0,0 +1,7 @@
---
uri: https://xxxx.atlassian.net/
user: xxx@xxxx.xxx
pasw: supersecret
proj: ABC
user1: 6574474636373822y7338
user2: 6574474636373822y73959696