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
# 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
'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'},
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')
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,
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)