def test_start_registers_driver_specific_tasks(self, mock_hw_types, mock_ifaces, mock_reg_hw_ifaces): class TestHwType(generic.GenericHardware): @property def supported_management_interfaces(self): return [] @property def supported_power_interfaces(self): return [] # This should not be collected, since we don't collect periodic # tasks from hardware types @periodics.periodic(spacing=100500) def task(self): pass class TestInterface(object): @periodics.periodic(spacing=100500) def iface(self): pass class TestInterface2(object): @periodics.periodic(spacing=100500) def iface(self): pass hw_type = TestHwType() iface1 = TestInterface() iface2 = TestInterface2() expected = [iface1.iface, iface2.iface] mock_hw_types.return_value = {'fake1': hw_type} mock_ifaces.return_value = { 'management': { 'fake1': iface1 }, 'power': { 'fake2': iface2 } } self._start_service(start_periodic_tasks=True) tasks = {c[0] for c in self.service._periodic_task_callables} for item in expected: self.assertTrue(periodics.is_periodic(item)) self.assertIn(item, tasks) # no periodic tasks from the hardware type self.assertTrue(periodics.is_periodic(hw_type.task)) self.assertNotIn(hw_type.task, tasks)
def test_is_periodic(self): @periodics.periodic(0.5, enabled=False) def no_add_me(): pass @periodics.periodic(0.5) def add_me(): pass self.assertTrue(periodics.is_periodic(add_me)) self.assertTrue(periodics.is_periodic(no_add_me)) self.assertFalse(periodics.is_periodic(self.test_is_periodic)) self.assertFalse(periodics.is_periodic(42))
def test_start_registers_driver_specific_tasks(self, mock_hw_types, mock_ifaces, mock_reg_hw_ifaces): class TestHwType(generic.GenericHardware): @property def supported_management_interfaces(self): return [] @property def supported_power_interfaces(self): return [] # This should not be collected, since we don't collect periodic # tasks from hardware types @periodics.periodic(spacing=100500) def task(self): pass class TestInterface(object): @periodics.periodic(spacing=100500) def iface(self): pass class TestInterface2(object): @periodics.periodic(spacing=100500) def iface(self): pass hw_type = TestHwType() iface1 = TestInterface() iface2 = TestInterface2() expected = [iface1.iface, iface2.iface] mock_hw_types.return_value = {'fake1': hw_type} mock_ifaces.return_value = { 'management': {'fake1': iface1}, 'power': {'fake2': iface2} } self._start_service(start_periodic_tasks=True) tasks = {c[0] for c in self.service._periodic_task_callables} for item in expected: self.assertTrue(periodics.is_periodic(item)) self.assertIn(item, tasks) # no periodic tasks from the hardware type self.assertTrue(periodics.is_periodic(hw_type.task)) self.assertNotIn(hw_type.task, tasks)
def test_start_registers_driver_specific_tasks(self, mock_drivers, mock_hw_types, mock_ifaces): class TestInterface(object): @periodics.periodic(spacing=100500) def iface(self): pass class TestInterface2(object): @periodics.periodic(spacing=100500) def iface(self): pass class Driver(object): core_interfaces = [] standard_interfaces = ['iface'] all_interfaces = core_interfaces + standard_interfaces iface = TestInterface() @periodics.periodic(spacing=42) def task(self, context): pass driver = Driver() iface1 = TestInterface() iface2 = TestInterface2() expected = [iface1.iface, iface2.iface] mock_drivers.return_value = {'fake1': driver} mock_ifaces.return_value = { 'management': { 'fake1': iface1 }, 'power': { 'fake2': iface2 } } self._start_service(start_periodic_tasks=True) tasks = {c[0] for c in self.service._periodic_task_callables} for item in expected: self.assertTrue(periodics.is_periodic(item)) self.assertIn(item, tasks) # no periodic tasks from the Driver object self.assertTrue(periodics.is_periodic(driver.task)) self.assertNotIn(driver.task, tasks)
def test_start_registers_driver_specific_tasks(self, get_mock): init_names = ['fake1'] self.config(enabled_drivers=init_names) class TestInterface(object): @periodics.periodic(spacing=100500) def iface(self): pass class Driver(object): core_interfaces = [] standard_interfaces = ['iface'] all_interfaces = core_interfaces + standard_interfaces iface = TestInterface() @periodics.periodic(spacing=42) def task(self, context): pass obj = Driver() get_mock.return_value = mock.Mock(obj=obj) with mock.patch.object( driver_factory.DriverFactory()._extension_manager, 'names') as mock_names: mock_names.return_value = init_names self._start_service(start_periodic_tasks=True) tasks = {c[0] for c in self.service._periodic_task_callables} for t in (obj.task, obj.iface.iface): self.assertTrue(periodics.is_periodic(t)) self.assertIn(t, tasks)
def add_periodics(self, obj): for name, member in inspect.getmembers(obj): if periodics.is_periodic(member): LOG.debug('Periodic task found: %(owner)s.%(member)s', { 'owner': obj.__class__.__name__, 'member': name }) self._callables.append((member, (), {}))
def _set_schema_aware_periodics(self): self._schema_aware_periodics = [] for name, member in inspect.getmembers(self): if not inspect.ismethod(member): continue schema_upt = getattr(member, '_rerun_on_schema_updates', None) if schema_upt and periodics.is_periodic(member): LOG.debug('Schema aware periodic task found: ' '%(owner)s.%(member)s', {'owner': self.__class__.__name__, 'member': name}) self._schema_aware_periodics.append(member)
def test(self): method_mock = mock.MagicMock(spec_set=[]) class TestClass(object): @driver_base.driver_periodic_task(spacing=42) def method(self, foo, bar=None): method_mock(foo, bar=bar) obj = TestClass() self.assertEqual(42, obj.method._periodic_spacing) self.assertTrue(periodics.is_periodic(obj.method)) obj.method(1, bar=2) method_mock.assert_called_once_with(1, bar=2)
def _collect_from(obj, args): """Collect tasks from the given object. :param obj: the object to collect tasks from. :param args: a tuple of arguments to pass to tasks. """ if obj and obj.__class__ not in periodic_task_classes: for name, member in inspect.getmembers(obj): if periodics.is_periodic(member): LOG.debug('Found periodic task %(owner)s.%(member)s', {'owner': obj.__class__.__name__, 'member': name}) periodic_task_callables.append((member, args, {})) periodic_task_classes.add(obj.__class__)
def _collect_periodic_tasks(self, obj, args): """Collect periodic tasks from a given object. Populates self._periodic_task_callables with tuples (callable, args, kwargs). :param obj: object containing periodic tasks as methods :param args: tuple with arguments to pass to every task """ for name, member in inspect.getmembers(obj): if periodics.is_periodic(member): LOG.debug('Found periodic task %(owner)s.%(member)s', {'owner': obj.__class__.__name__, 'member': name}) self._periodic_task_callables.append((member, args, {}))
def _collect_periodic_tasks(self, obj, args): """Collect periodic tasks from a given object. Populates self._periodic_task_callables with tuples (callable, args, kwargs). :param obj: object containing periodic tasks as methods :param args: tuple with arguments to pass to every task """ for name, member in inspect.getmembers(obj): if periodics.is_periodic(member): LOG.debug('Found periodic task %(owner)s.%(member)s', { 'owner': obj.__class__.__name__, 'member': name }) self._periodic_task_callables.append((member, args, {}))