Skip to content

Client API Reference

Sumio Kiyooka edited this page Apr 23, 2021 · 17 revisions

class Client

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:

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'.

Example

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

behind the scenes

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

Example

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:

Returns:

  • json/dict: requested object

Example

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