From 5ea4484a2ca2b323ddb3c1561296be18ea80a16d Mon Sep 17 00:00:00 2001 From: Russell Haering Date: Wed, 22 Jan 2014 17:28:24 -0800 Subject: [PATCH 1/2] cache a global hardware manager --- teeth_agent/agent.py | 4 ++-- teeth_agent/hardware.py | 34 ++++++++++++++++++++-------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/teeth_agent/agent.py b/teeth_agent/agent.py index 718f2b436..efad3d12e 100644 --- a/teeth_agent/agent.py +++ b/teeth_agent/agent.py @@ -118,7 +118,7 @@ class TeethAgent(object): self.api = api.TeethAgentAPIServer(self) self.command_results = collections.OrderedDict() self.heartbeater = TeethAgentHeartbeater(self) - self.hardware = hardware.load_hardware_manager() + self.hardware = hardware.get_manager() self.command_lock = threading.Lock() self.log = structlog.get_logger() self.started_at = None @@ -235,7 +235,7 @@ def build_agent(api_url, if not listen_host: listen_host = advertise_host - mac_addr = hardware.load_hardware_manager().get_primary_mac_address() + mac_addr = hardware.get_manager().get_primary_mac_address() api_client = overlord_agent_api.APIClient(api_url) log.info('fetching agent configuration from API', diff --git a/teeth_agent/hardware.py b/teeth_agent/hardware.py index 5dfc56940..b747180cd 100644 --- a/teeth_agent/hardware.py +++ b/teeth_agent/hardware.py @@ -59,20 +59,26 @@ def _compare_extensions(ext1, ext2): return mgr1.evaluate_hardware_support() - mgr2.evaluate_hardware_support() -def load_hardware_manager(): - log = structlog.get_logger() - extension_manager = stevedore.ExtensionManager( - namespace='teeth_agent.hardware_managers', - invoke_on_load=True) +def get_manager(): + global _global_manager - # There will always be at least one extension available (the - # GenericHardwareManager). - preferred_extension = sorted(extension_manager, _compare_extensions)[0] - preferred_manager = preferred_extension.obj + if not _global_manager: + log = structlog.get_logger() + extension_manager = stevedore.ExtensionManager( + namespace='teeth_agent.hardware_managers', + invoke_on_load=True) - if preferred_manager.evaluate_hardware_support() <= 0: - raise RuntimeError('No suitable HardwareManager could be found') + # There will always be at least one extension available (the + # GenericHardwareManager). + preferred_extension = sorted(extension_manager, _compare_extensions)[0] + preferred_manager = preferred_extension.obj - log.info('selected hardware manager', - manager_name=preferred_extension.entry_point_target) - return preferred_manager + if preferred_manager.evaluate_hardware_support() <= 0: + raise RuntimeError('No suitable HardwareManager could be found') + + log.info('selected hardware manager', + manager_name=preferred_extension.entry_point_target) + + _global_manager = preferred_manager + + return _global_manager From ecdcb77595b00330ad7b6c92c738f55f65745dd4 Mon Sep 17 00:00:00 2001 From: Russell Haering Date: Wed, 22 Jan 2014 17:29:01 -0800 Subject: [PATCH 2/2] retrieve OS install dev from the HardwareManager --- teeth_agent/hardware.py | 7 +++++++ teeth_agent/standby.py | 3 ++- teeth_agent/tests/hardware.py | 5 ++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/teeth_agent/hardware.py b/teeth_agent/hardware.py index b747180cd..e4dd68bab 100644 --- a/teeth_agent/hardware.py +++ b/teeth_agent/hardware.py @@ -44,6 +44,10 @@ class HardwareManager(object): def get_primary_mac_address(self): pass + @abc.abstractmethod + def get_os_install_device(self): + pass + class GenericHardwareManager(HardwareManager): def evaluate_hardware_support(cls): @@ -52,6 +56,9 @@ class GenericHardwareManager(HardwareManager): def get_primary_mac_address(self): return open('/sys/class/net/eth0/address', 'r').read().strip('\n') + def get_os_install_device(self): + return '/dev/sda' + def _compare_extensions(ext1, ext2): mgr1 = ext1.obj diff --git a/teeth_agent/standby.py b/teeth_agent/standby.py index 367b79374..21462c561 100644 --- a/teeth_agent/standby.py +++ b/teeth_agent/standby.py @@ -23,6 +23,7 @@ import requests from teeth_agent import base from teeth_agent import configdrive from teeth_agent import errors +from teeth_agent import hardware def _configdrive_location(): @@ -114,7 +115,7 @@ class PrepareImageCommand(base.AsyncCommandResult): location = _configdrive_location() metadata = self.command_params['metadata'] files = self.command_params['files'] - device = '/dev/sda' + device = hardware.get_manager().get_os_install_device() _download_image(image_info) configdrive.write_configdrive(location, metadata, files) diff --git a/teeth_agent/tests/hardware.py b/teeth_agent/tests/hardware.py index 33d547813..ca2d89bfd 100644 --- a/teeth_agent/tests/hardware.py +++ b/teeth_agent/tests/hardware.py @@ -25,7 +25,7 @@ class TestGenericHardwareManager(unittest.TestCase): self.hardware = hardware.GenericHardwareManager() @mock.patch('__builtin__.open') - def test_decom_mode(self, mocked_open): + def test_get_primary_mac_address(self, mocked_open): f = mocked_open.return_value f.read.return_value = '00:0c:29:8c:11:b1\n' @@ -34,3 +34,6 @@ class TestGenericHardwareManager(unittest.TestCase): mocked_open.assert_called_once_with('/sys/class/net/eth0/address', 'r') f.read.assert_called_once_with() + + def test_get_os_install_device(self): + self.assertEqual(self.hardware.get_os_install_device(), '/dev/sda')