Пример #1
0
    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)
Пример #2
0
    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))
Пример #3
0
    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))
Пример #4
0
    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)
Пример #5
0
    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)
Пример #6
0
    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)
Пример #7
0
    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)
Пример #8
0
 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, (), {}))
Пример #9
0
    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)
Пример #10
0
    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)
Пример #11
0
        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__)
Пример #12
0
    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)
Пример #13
0
        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__)
Пример #14
0
    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, {}))
Пример #15
0
    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, {}))