Source code for dcos_test_utils.package

"""Utilities for integration testing package management (https://github.com/dcos/cosmos)
"""

import logging

from dcos_test_utils import helpers

log = logging.getLogger(__name__)


[docs]class Cosmos(helpers.RetryCommonHttpErrorsMixin, helpers.ApiClientSession): """ Specialized client for interacting with Cosmos (universe gateway) functionality :param default_url: URL of the jobs service to bind to :type default_url: helpers.Url :param session: option session to bootstrap this session with :type session: requests.Session """ def __init__(self, default_url: helpers.Url, session=None): super().__init__(default_url) if session is not None: self.session = session def _update_headers(self, endpoint, request_version='1', response_version='1'): """Set the Content-type and Accept headers Args: request_version: str Version number of the cosmos API response_version: str Version number of the cosmos API endpoint: str cosmos API endpoint Returns: None """ media_type = "application/vnd.dcos.package." + endpoint + \ "-{action}+json;charset=utf-8;" + \ "version=v{version}" self.session.headers.update({ 'Content-type': media_type.format(action="request", version=request_version), 'Accept': media_type.format(action="response", version=response_version) }) def _post(self, endpoint, data): response = self.post(endpoint, json=data) log.info('Response from cosmos: {0}'.format(repr(response.text))) response.raise_for_status() return response
[docs] def install_package(self, package_name, package_version=None, options=None, app_id=None): """Install a package using the cosmos packaging API Args: package_name: str package_version: str options: JSON dict appId: str Returns: requests.response object Notes: Use Marathon.poll_marathon_for_app_deployment to check if the installed app deployed successfully (Need the appId from the response) """ self._update_headers('install', response_version='2') package = { 'packageName': package_name } if package_version is not None: package.update({'packageVersion': package_version}) if options is not None: package.update({'options': options}) if app_id is not None: package.update({'appId': app_id}) return self._post('/install', package)
[docs] def uninstall_package(self, package_name, app_id=None): """Uninstall a package using the cosmos packaging API Args: package_name: str app_id: str, should have leading slash Returns: requests.response object """ self._update_headers('uninstall') package = { 'packageName': package_name } if app_id is not None: package.update({'appId': app_id}) return self._post('/uninstall', package)
[docs] def list_packages(self): """List all packages using the cosmos packaging API Returns: requests.response object """ self._update_headers('list') return self._post('/list', {})