#!/usr/bin/env python # Copyright (C) The Arvados Authors. All rights reserved. # # SPDX-License-Identifier: AGPL-3.0 from __future__ import absolute_import, print_function import io import logging import unittest import arvnodeman.computenode.dispatch as dispatch import arvnodeman.computenode.dispatch.slurm as slurm_dispatch import arvnodeman.config as nmconfig class NodeManagerConfigTestCase(unittest.TestCase): TEST_CONFIG = u""" [Cloud] provider = dummy shutdown_windows = 52, 6, 2 [Cloud Credentials] creds = dummy_creds [Cloud List] [Cloud Create] [Size 1] cores = 1 price = 0.8 [Logging] file = /dev/null level = DEBUG testlogger = INFO """ def load_config(self, config=None, config_str=None): if config is None: config = nmconfig.NodeManagerConfig() if config_str is None: config_str = self.TEST_CONFIG with io.StringIO(config_str) as config_fp: config.readfp(config_fp) return config def test_seeded_defaults(self): config = nmconfig.NodeManagerConfig() sec_names = set(config.sections()) self.assertIn('Arvados', sec_names) self.assertIn('Daemon', sec_names) self.assertFalse(any(name.startswith('Size ') for name in sec_names)) def test_list_sizes(self): config = self.load_config() client = config.new_cloud_client() sizes = config.node_sizes(client.list_sizes()) self.assertEqual(1, len(sizes)) size, kwargs = sizes[0] self.assertEqual('Small', size.name) self.assertEqual(1, kwargs['cores']) self.assertEqual(0.8, kwargs['price']) def test_default_node_mem_scaling(self): config = self.load_config() self.assertEqual(0.95, config.getfloat('Daemon', 'node_mem_scaling')) def test_shutdown_windows(self): config = self.load_config() self.assertEqual([52, 6, 2], config.shutdown_windows()) def test_log_levels(self): config = self.load_config() self.assertEqual({'level': logging.DEBUG, 'testlogger': logging.INFO}, config.log_levels()) def check_dispatch_classes(self, config, module): setup, shutdown, update, monitor = config.dispatch_classes() self.assertIs(setup, module.ComputeNodeSetupActor) self.assertIs(shutdown, module.ComputeNodeShutdownActor) self.assertIs(update, module.ComputeNodeUpdateActor) self.assertIs(monitor, module.ComputeNodeMonitorActor) def test_default_dispatch(self): config = self.load_config() self.check_dispatch_classes(config, dispatch) def test_custom_dispatch(self): config = self.load_config( config_str=self.TEST_CONFIG + "[Daemon]\ndispatcher=slurm\n") self.check_dispatch_classes(config, slurm_dispatch)