Files
deb-python-dcos/dcos/servicemanager.py
Jesus E. Larios Murillo 62293f6bf3 experimental: add new experimental subcommand (#858)
Adds three new experimental package commands: `experimental package add`, `dcos experimental package build`, and `dcos experimental service start`
2017-01-04 18:15:07 -08:00

77 lines
2.5 KiB
Python

from six.moves import urllib
from dcos import config, cosmos
from dcos.errors import (DCOSAuthenticationException,
DCOSAuthorizationException,
DCOSException,
DCOSHTTPException)
from dcos.packagemanager import cosmos_error
class ServiceManager(object):
"""A manager for DC/OS services"""
def __init__(self, base_url=None):
self.base_url = base_url if base_url else _get_default_base_url()
self.cosmos = cosmos.Cosmos(self.base_url)
def enabled(self):
"""
Returns whether service manager is enabled.
:return: true whether this service is enabled, false otherwise
:rtype: bool
"""
return self.cosmos.enabled()
@cosmos_error
def start_service(self, package_name, package_version, options):
"""
Starts a service that has been added to the cluster via
cosmos' package/add endpoint.
:param package_name: the name of the package to start
:type package_name: str
:param package_version: the version of the package to start
:type package_version: None | str
:param options: the options for the service
:type options: None | dict
:return: the response of cosmos' service/start endpoint
:rtype: requests.Response
"""
endpoint = 'service/start'
json = {'packageName': package_name}
if package_version is not None:
json['packageVersion'] = package_version
if options is not None:
json['options'] = options
try:
return self.cosmos.call_endpoint(endpoint, json=json)
except (DCOSAuthenticationException, DCOSAuthorizationException):
raise
except DCOSHTTPException as e:
if e.status() == 404:
message = 'Your version of DC/OS ' \
'does not support this operation'
raise DCOSException(message)
else:
return e.response
def _get_default_base_url():
"""
Gets the default service manager URL
:returns: cosmos base url
:rtype: str
"""
toml_config = config.get_config()
base_url = config.get_config_val('package.cosmos_url', toml_config)
if base_url is None:
base_url = config.get_config_val('core.dcos_url', toml_config)
if base_url is None:
raise config.missing_config_exception(['core.dcos_url'])
else:
base_url = urllib.parse.urljoin(base_url, 'cosmos/')
return base_url