-
Notifications
You must be signed in to change notification settings - Fork 110
Client API Reference
A binding to Blackduck's REST API that provides a robust connection backed by a session object. A base URL, timeout, retries, proxies, and TLS verification are set upon initialization and these attributes are persisted across all requests.
At the REST API level, it provides a consistent way to discover and traverse public resources, uses a generator to fetch all items using pagination, and automatically renews the bearer token.
Client encourages usage at the requests layer i.e. directly calling request(), get(), put(), post(), and delete() methods.
Ultimately it provides a solid foundation especially suited for long-running scripts.
Methods:
- __init__
- list_resources(parent)
- get_resource(name, parent, items)
- get_metadata(name, parent)
- get_json(url)
- get_items(url, page_size)
- http_error_handler
def __init__(token=None, base_url=None, session=None, auth=None, verify=True, timeout=15.0, retries=3):
Instantiates a new Client with a binding to Blackduck's REST API.
Arguments:
- token (str): Access Token obtained from the Hub UI: System -> My Access Tokens
- base_url (str): e.g. "https://your.blackduck.url"
- session (requests.Session): custom session if specified. For advanced users only. If not provided, a HubSession with recommended defaults will be generated and used. Any custom session must incorporate a base_url in every request as a plain requests.Session() will not work. See HubSession implementation for an example.
- auth (requests.auth.AuthBase): custom authorization if specified. For advanced users only. If not provided, one based on the access token is generated and used.
- verify (bool): TLS certificate verification. Defaults to True.
- timeout (float): request timeout in seconds. Defaults to 15 seconds.
- retries (int): maximum number of times to retry a request. Defaults to 3.
List named resources that can be fetched.
The names and corresponding URLs are extracted from the parent's json_data['_meta']['links'].
Arguments:
- parent (dict/json): resource object from prior get_resource invocations. Defaults to None (for root /api/ base).
Returns:
- dict(str -> str): of public resource names to urls. To obtain the url to the parent itself, use key 'href'.
for project in bd.get_resource('projects'):
resource_dict = bd.list_resources(project)
# Obtain url to the parent itself
url = resource_dict['href'] # e.g. /api/projects/de69a1e2-a703-44a9-8e9d-c3b8472972cb
# Obtain url for the project versions
url = resource_dict['versions'] # e.g. /api/projects/de69a1e2-a703-44a9-8e9d-c3b8472972cb/versions
Fetch a named resource.
Arguments:
- name (str): resource name i.e. specific key from list_resources()
- parent (dict/json): resource object from prior get_resource() call. Use None for root /api/ base.
- items (bool): enable resource generator for paginated results. Defaults to True.
- **kwargs: passed to session.request
Returns:
- list (items=True) or dict (items=False) formed from returned json
get_resource(name, parent)
is equivalent to:
resources_dict = list_resources(name, parent)
url = resources_dict[name]
return get_items(url) # if items=True
return get_json(url) # if items=False
Fetch resource metadata and other useful data such as totalCount.
Arguments:
- name (str): resource name i.e. specific key from list_resources()
- parent (dict/json): resource object from prior get_resource() call. Use None for root /api/ base.
- **kwargs: passed to session.request
Returns:
- dict/json: named resource metadata
for project in bd.get_resource('projects'):
m = get_metadata('versions', project)
print(m['totalCount'])
is a shortcut for:
for project in bd.get_resource('projects'):
m = get_resource('versions', project, items=False, params={'limit': 1})
print(m['totalCount'])
GET request to url endpoint and return json result but preserve underlying error handling.
Proper error handling done by get_json will check for HTTPErrors and JSONDecodeErrors and will log the Response object's status code and content body before re-raising the exception. This informs the user to a proper course of action much more effectively than a stack trace alone.
Arguments:
- url (str): of endpoint
- **kwargs: passed to session.request
Returns:
- json/dict: requested object
items = bd.get_json("/api/projects?offset=0&limit=100")['items']
is in essence the following (with added error handling):
r = bd.session.get("/api/projects?offset=0&limit=100")
r.raise_for_status()
items = r.json()['items']
Send necessary GET requests to url endpoint to progressive fetch all items using pagination. Automatically provide the necessary offset and limit parameters.
Arguments:
- url (str): of endpoint
- page_size (int): Number of items to get per page. Defaults to 100.
- **kwargs: passed to session.request
Yields:
- generator(dict/json): of items
Handle an unexpected HTTPError or Response by logging useful information.
Arguments:
- r (requests.HTTPError OR requests.Response): to handle