X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/95f99e05352e2a87ad627a0b4c775f7551ef9265..f46eed2ad6bc456cd57ed363e1adc8d60f802f39:/services/nodemanager/arvnodeman/config.py diff --git a/services/nodemanager/arvnodeman/config.py b/services/nodemanager/arvnodeman/config.py index 1699584b20..315df1c3f9 100644 --- a/services/nodemanager/arvnodeman/config.py +++ b/services/nodemanager/arvnodeman/config.py @@ -6,10 +6,10 @@ import ConfigParser import importlib import logging import ssl +import sys import arvados import httplib2 -import libcloud.common.types as cloud_types import pykka from apiclient import errors as apierror @@ -18,7 +18,6 @@ from apiclient import errors as apierror # it's low-level, but unlikely to catch code bugs. NETWORK_ERRORS = (IOError, ssl.SSLError) ARVADOS_ERRORS = NETWORK_ERRORS + (apierror.Error,) -CLOUD_ERRORS = NETWORK_ERRORS + (cloud_types.LibcloudError,) actor_class = pykka.ThreadingActor @@ -37,10 +36,12 @@ class NodeManagerConfig(ConfigParser.SafeConfigParser): for sec_name, settings in { 'Arvados': {'insecure': 'no', 'timeout': '15'}, - 'Daemon': {'max_nodes': '1', + 'Daemon': {'min_nodes': '0', + 'max_nodes': '1', 'poll_time': '60', 'max_poll_time': '300', 'poll_stale_after': '600', + 'boot_fail_after': str(sys.maxint), 'node_stale_after': str(60 * 60 * 2)}, 'Logging': {'file': '/dev/stderr', 'level': 'WARNING'}, @@ -67,6 +68,17 @@ class NodeManagerConfig(ConfigParser.SafeConfigParser): for key in self.options('Logging') if key not in self.LOGGING_NONLEVELS} + def dispatch_classes(self): + mod_name = 'arvnodeman.computenode.dispatch' + if self.has_option('Daemon', 'dispatcher'): + mod_name = '{}.{}'.format(mod_name, + self.get('Daemon', 'dispatcher')) + module = importlib.import_module(mod_name) + return (module.ComputeNodeSetupActor, + module.ComputeNodeShutdownActor, + module.ComputeNodeUpdateActor, + module.ComputeNodeMonitorActor) + def new_arvados_client(self): if self.has_option('Daemon', 'certs_file'): certs_file = self.get('Daemon', 'certs_file') @@ -76,15 +88,14 @@ class NodeManagerConfig(ConfigParser.SafeConfigParser): http = httplib2.Http(timeout=self.getint('Arvados', 'timeout'), ca_certs=certs_file, disable_ssl_certificate_validation=insecure) - return arvados.api('v1', - cache=False, # Don't reuse an existing client. + return arvados.api(version='v1', host=self.get('Arvados', 'host'), token=self.get('Arvados', 'token'), insecure=insecure, http=http) def new_cloud_client(self): - module = importlib.import_module('arvnodeman.computenode.' + + module = importlib.import_module('arvnodeman.computenode.driver.' + self.get('Cloud', 'provider')) auth_kwargs = self.get_section('Cloud Credentials') if 'timeout' in auth_kwargs: @@ -94,14 +105,26 @@ class NodeManagerConfig(ConfigParser.SafeConfigParser): self.get_section('Cloud Create')) def node_sizes(self, all_sizes): + """Finds all acceptable NodeSizes for our installation. + + Returns a list of (NodeSize, kwargs) pairs for each NodeSize object + returned by libcloud that matches a size listed in our config file. + """ + size_kwargs = {} for sec_name in self.sections(): sec_words = sec_name.split(None, 2) if sec_words[0] != 'Size': continue size_kwargs[sec_words[1]] = self.get_section(sec_name, int) - return [(size, size_kwargs[size.id]) for size in all_sizes - if size.id in size_kwargs] + # EC2 node sizes are identified by id. GCE sizes are identified by name. + matching_sizes = [] + for size in all_sizes: + if size.id in size_kwargs: + matching_sizes.append((size, size_kwargs[size.id])) + elif size.name in size_kwargs: + matching_sizes.append((size, size_kwargs[size.name])) + return matching_sizes def shutdown_windows(self): return [int(n)