2020-03-09 10:11:07 +01:00
|
|
|
# -*- coding: utf-8 -*-
|
2022-08-08 14:24:58 +02:00
|
|
|
# Copyright (c) Ansible project
|
2022-08-05 12:28:29 +02:00
|
|
|
# Simplified BSD License (see LICENSES/BSD-2-Clause.txt or https://opensource.org/licenses/BSD-2-Clause)
|
|
|
|
# SPDX-License-Identifier: BSD-2-Clause
|
2020-03-09 10:11:07 +01:00
|
|
|
|
|
|
|
from __future__ import (absolute_import, division, print_function)
|
2020-06-24 21:50:36 +02:00
|
|
|
__metaclass__ = type
|
2020-03-09 10:11:07 +01:00
|
|
|
|
|
|
|
import json
|
|
|
|
|
2021-06-26 23:59:11 +02:00
|
|
|
from ansible.module_utils.common.text.converters import to_text
|
2020-03-09 10:11:07 +01:00
|
|
|
from ansible.module_utils.basic import env_fallback
|
|
|
|
from ansible.module_utils.urls import fetch_url, basic_auth_header
|
|
|
|
|
|
|
|
|
|
|
|
class BitbucketHelper:
|
|
|
|
BITBUCKET_API_URL = 'https://api.bitbucket.org'
|
|
|
|
|
|
|
|
def __init__(self, module):
|
|
|
|
self.module = module
|
|
|
|
self.access_token = None
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def bitbucket_argument_spec():
|
|
|
|
return dict(
|
2021-10-31 19:09:25 +01:00
|
|
|
client_id=dict(type='str', fallback=(env_fallback, ['BITBUCKET_CLIENT_ID'])),
|
2020-03-09 10:11:07 +01:00
|
|
|
client_secret=dict(type='str', no_log=True, fallback=(env_fallback, ['BITBUCKET_CLIENT_SECRET'])),
|
2021-10-31 19:09:25 +01:00
|
|
|
# TODO:
|
|
|
|
# - Rename user to username once current usage of username is removed
|
|
|
|
# - Alias user to username and deprecate it
|
|
|
|
user=dict(type='str', fallback=(env_fallback, ['BITBUCKET_USERNAME'])),
|
|
|
|
password=dict(type='str', no_log=True, fallback=(env_fallback, ['BITBUCKET_PASSWORD'])),
|
2020-03-09 10:11:07 +01:00
|
|
|
)
|
|
|
|
|
2021-10-31 19:09:25 +01:00
|
|
|
@staticmethod
|
|
|
|
def bitbucket_required_one_of():
|
|
|
|
return [['client_id', 'client_secret', 'user', 'password']]
|
2020-03-09 10:11:07 +01:00
|
|
|
|
2021-10-31 19:09:25 +01:00
|
|
|
@staticmethod
|
|
|
|
def bitbucket_required_together():
|
|
|
|
return [['client_id', 'client_secret'], ['user', 'password']]
|
2020-03-09 10:11:07 +01:00
|
|
|
|
|
|
|
def fetch_access_token(self):
|
2021-10-31 19:09:25 +01:00
|
|
|
if self.module.params['client_id'] and self.module.params['client_secret']:
|
|
|
|
headers = {
|
|
|
|
'Authorization': basic_auth_header(self.module.params['client_id'], self.module.params['client_secret']),
|
|
|
|
}
|
|
|
|
|
|
|
|
info, content = self.request(
|
|
|
|
api_url='https://bitbucket.org/site/oauth2/access_token',
|
|
|
|
method='POST',
|
|
|
|
data='grant_type=client_credentials',
|
|
|
|
headers=headers,
|
|
|
|
)
|
|
|
|
|
|
|
|
if info['status'] == 200:
|
|
|
|
self.access_token = content['access_token']
|
|
|
|
else:
|
|
|
|
self.module.fail_json(msg='Failed to retrieve access token: {0}'.format(info))
|
2020-03-09 10:11:07 +01:00
|
|
|
|
|
|
|
def request(self, api_url, method, data=None, headers=None):
|
|
|
|
headers = headers or {}
|
|
|
|
|
|
|
|
if self.access_token:
|
|
|
|
headers.update({
|
|
|
|
'Authorization': 'Bearer {0}'.format(self.access_token),
|
|
|
|
})
|
2021-10-31 19:09:25 +01:00
|
|
|
elif self.module.params['user'] and self.module.params['password']:
|
|
|
|
headers.update({
|
|
|
|
'Authorization': basic_auth_header(self.module.params['user'], self.module.params['password']),
|
|
|
|
})
|
2020-03-09 10:11:07 +01:00
|
|
|
|
|
|
|
if isinstance(data, dict):
|
|
|
|
data = self.module.jsonify(data)
|
|
|
|
headers.update({
|
|
|
|
'Content-type': 'application/json',
|
|
|
|
})
|
|
|
|
|
|
|
|
response, info = fetch_url(
|
|
|
|
module=self.module,
|
|
|
|
url=api_url,
|
|
|
|
method=method,
|
|
|
|
headers=headers,
|
|
|
|
data=data,
|
|
|
|
force=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
content = {}
|
|
|
|
|
|
|
|
if response is not None:
|
|
|
|
body = to_text(response.read())
|
|
|
|
if body:
|
|
|
|
content = json.loads(body)
|
|
|
|
|
|
|
|
return info, content
|