예제 #1
0
    def _get_old_and_new_mconfig_fixtures():
        """
        Returns (old_mconfig, new_mconfig) where new_mconfig updates metricsd
        config and magmad config. new_mconfig also adds a config for an
        unrecognized service keyed by 'mock'
        """
        old_magmad_any = Any()
        old_magmad_config = MagmaD(checkin_interval=123)
        old_magmad_any.Pack(old_magmad_config)

        new_magmad_any = Any()
        new_magmad_config = MagmaD(
            checkin_interval=42,
            feature_flags={'kafka_config_streamer': True},
        )
        new_magmad_any.Pack(new_magmad_config)

        old_metricsd_any = Any()
        old_metricsd_config = MetricsD(log_level=common_pb2.ERROR)
        old_metricsd_any.Pack(old_metricsd_config)

        new_metricsd_any = Any()
        new_metricsd_config = MetricsD(log_level=common_pb2.INFO)
        new_metricsd_any.Pack(new_metricsd_config)

        # Unrecognized service, good type
        mock_service_any = Any()
        mock_service_config = MetricsD(log_level=common_pb2.FATAL)
        mock_service_any.Pack(mock_service_config)

        old_mconfig = OffsetGatewayConfigs(
            offset=42,
            configs=GatewayConfigs(configs_by_key={
                'magmad': old_magmad_any,
                'metricsd': old_metricsd_any,
            }, ),
        )
        new_mconfig = OffsetGatewayConfigs(
            offset=43,
            configs=GatewayConfigs(configs_by_key={
                'magmad': new_magmad_any,
                'metricsd': new_metricsd_any,
                'mock': mock_service_any,
            }, ),
        )

        return old_mconfig, new_mconfig
예제 #2
0
    def test_happy_path_feature_unspecified(self, new_manager_mock):
        manager_instance = Mock()
        manager_instance.load_service_mconfig.return_value = MagmaD()
        new_manager_mock.return_value = manager_instance

        actual = get_mconfig_manager()
        self.assertIsInstance(actual, MconfigManagerImpl)
        manager_instance.load_service_mconfig.assert_called_once_with('magmad')
예제 #3
0
    def test_happy_path_feature_off(self, new_manager_mock):
        """
        Test happy path with feature flag turned off explicitly
        """
        manager_instance = Mock()
        manager_instance.load_service_mconfig.return_value = MagmaD(
            feature_flags={'kafka_config_streamer': False}, )
        new_manager_mock.return_value = manager_instance

        actual = get_mconfig_manager()
        self.assertIsInstance(actual, MconfigManagerImpl)
        manager_instance.load_service_mconfig.assert_called_once_with('magmad')
예제 #4
0
    def test_happy_path_feature_on(self, new_manager_mock):
        """
        Test happy path with feature flag turned on
        """
        manager_instance = Mock()
        manager_instance.load_service_mconfig.return_value = MagmaD(
            feature_flags={'kafka_config_streamer': True}, )
        new_manager_mock.return_value = manager_instance

        actual = get_mconfig_manager()
        # We should have instantiated a StreamedMconfigManager, which in the
        # context of this test method will return the mock instance.
        self.assertIs(actual, manager_instance)
        manager_instance.load_service_mconfig.assert_called_once_with('magmad')
예제 #5
0
def _load_magmad_mconfig_value() -> MagmaD:
    # Try to load magmad mconfig value from new mconfigs, then fall back on
    # old mconfigs
    try:
        new_mconfig_manager = StreamedMconfigManager()
        return new_mconfig_manager.load_service_mconfig('magmad')
    except LoadConfigError:
        logging.debug('Could not load offset mconfig, falling back to '
                      'default mconfig manager')

    try:
        old_mconfig_manager = MconfigManagerImpl()
        return old_mconfig_manager.load_service_mconfig('magmad')
    except LoadConfigError as e:
        logging.error('Could not load magmad mconfig value '
                      'to check feature flags: {}'.format(e))
        return MagmaD()
예제 #6
0
    def test_new_mconfig_load_error(self, new_manager_mock, old_manager_mock):
        """
        Test feature flag on, but new mconfig manager errors out on load
        """
        new_manager_instance = Mock()
        new_manager_instance.load_service_mconfig = Mock(
            side_effect=LoadConfigError('mock'), )
        new_manager_mock.return_value = new_manager_instance

        old_manager_instance = Mock()
        old_manager_instance.load_service_mconfig.return_value = MagmaD(
            feature_flags={'kafka_config_streamer': True}, )
        old_manager_mock.return_value = old_manager_instance

        actual = get_mconfig_manager()
        self.assertIs(actual, new_manager_instance)
        new_manager_instance.load_service_mconfig\
            .assert_called_once_with('magmad')
        old_manager_instance.load_service_mconfig\
            .assert_called_once_with('magmad')
예제 #7
0
    def test_update(self, config_mock):
        """
        Test that mconfig updates are handled correctly
        """
        # Set up fixture data
        # Update will simulate gateway moving from
        # test_mconfig -> updated_mconfig
        TestUpdate = namedtuple('TestUpdate', ['value', 'key'])
        test_mconfig = GatewayConfigs()
        updated_mconfig = GatewayConfigs()

        some_any = Any()
        magmad = MagmaD(log_level=1)
        some_any.Pack(magmad)
        test_mconfig.configs_by_key['magmad'].CopyFrom(some_any)
        updated_mconfig.configs_by_key['magmad'].CopyFrom(some_any)

        metricsd = MetricsD(log_level=2)
        some_any.Pack(metricsd)
        test_mconfig.configs_by_key['metricsd'].CopyFrom(some_any)
        metricsd = MetricsD(log_level=3)
        some_any.Pack(metricsd)
        updated_mconfig.configs_by_key['metricsd'].CopyFrom(some_any)

        # Set up mock dependencies
        config_mock.return_value = {
            'magma_services': ['magmad', 'metricsd'],
        }

        @asyncio.coroutine
        def _mock_restart_services(): return "blah"

        service_manager_mock = MagicMock()
        magmad_service_mock = MagicMock()
        mconfig_manager_mock = MconfigManagerImpl()

        load_mock = patch.object(
            mconfig_manager_mock,
            'load_mconfig', MagicMock(return_value=test_mconfig),
        )
        update_mock = patch.object(
            mconfig_manager_mock,
            'update_stored_mconfig', Mock(),
        )
        restart_service_mock = patch.object(
            service_manager_mock,
            'restart_services', MagicMock(wraps=_mock_restart_services),
        )

        with load_mock as loader, update_mock as updater, \
                restart_service_mock as restarter:
            loop = asyncio.new_event_loop()
            config_manager = ConfigManager(
                ['magmad', 'metricsd'], service_manager_mock,
                magmad_service_mock, mconfig_manager_mock,
                allow_unknown_fields=False,
                loop=loop,
            )

            # Verify that config update restarts all services
            update_str = MessageToJson(updated_mconfig)
            updates = [
                TestUpdate(value='', key='some key'),
                TestUpdate(
                    value=update_str.encode('utf-8'),
                    key='last key',
                ),
            ]
            config_manager.process_update(CONFIG_STREAM_NAME, updates, False)

            # Only metricsd config was updated, hence should be restarted
            loader.assert_called_once_with()
            restarter.assert_called_once_with(['metricsd'])
            updater.assert_called_once_with(update_str)
예제 #8
0
    def test_update(self, config_mock):
        """
        Test that mconfig updates are handled correctly
        """
        # Set up fixture data
        # Update will simulate gateway moving from
        # test_mconfig -> updated_mconfig
        test_mconfig = GatewayConfigs()
        updated_mconfig = GatewayConfigs()

        some_any = Any()
        magmad = MagmaD(log_level=1)
        some_any.Pack(magmad)
        test_mconfig.configs_by_key['magmad'].CopyFrom(some_any)
        updated_mconfig.configs_by_key['magmad'].CopyFrom(some_any)

        metricsd = MetricsD(log_level=2)
        some_any.Pack(metricsd)
        test_mconfig.configs_by_key['metricsd'].CopyFrom(some_any)
        metricsd = MetricsD(log_level=3)
        some_any.Pack(metricsd)
        updated_mconfig.configs_by_key['metricsd'].CopyFrom(some_any)

        # Set up mock dependencies
        config_mock.return_value = {
            'magma_services': ['magmad', 'metricsd'],
        }

        @asyncio.coroutine
        def _mock_restart_services():
            return "blah"

        @asyncio.coroutine
        def _mock_update_dynamic_services():
            return "mockResponse"

        service_manager_mock = MagicMock()
        magmad_service_mock = MagicMock()
        mconfig_manager_mock = MconfigManagerImpl()

        load_mock = patch.object(
            mconfig_manager_mock,
            'load_mconfig', MagicMock(return_value=test_mconfig),
        )
        update_mock = patch.object(
            mconfig_manager_mock,
            'update_stored_mconfig', Mock(),
        )
        restart_service_mock = patch.object(
            service_manager_mock,
            'restart_services', MagicMock(wraps=_mock_restart_services),
        )
        update_dynamic_services_mock = patch.object(
            service_manager_mock,
            'update_dynamic_services', MagicMock(wraps=_mock_update_dynamic_services),
        )
        processed_updates_mock = patch('magma.magmad.events.processed_updates')

        class ServiceMconfigMock:
            def __init__(self, service, mconfig_struct):
                pass
            dynamic_services = []
        mock_mcfg = patch('magma.magmad.config_manager.load_service_mconfig', MagicMock(wraps=ServiceMconfigMock))

        with load_mock as loader,\
                update_mock as updater, \
                restart_service_mock as restarter,\
                update_dynamic_services_mock as dynamic_services,\
                mock_mcfg as mock_c,\
                processed_updates_mock as processed_updates:
            loop = asyncio.new_event_loop()
            config_manager = ConfigManager(
                ['magmad', 'metricsd'], service_manager_mock,
                magmad_service_mock, mconfig_manager_mock,
                allow_unknown_fields=False,
                loop=loop,
            )

            # Process an empty set of updates
            updates = []
            config_manager.process_update(CONFIG_STREAM_NAME, updates, False)

            # No services should be updated or restarted due to empty updates
            restarter.assert_not_called()
            updater.assert_not_called()

            # Verify that config update restarts all services
            update_str = MessageToJson(updated_mconfig)
            updates = [
                DataUpdate(value=''.encode('utf-8'), key='some key'),
                DataUpdate(
                    value=update_str.encode('utf-8'),
                    key='last key',
                ),
            ]
            config_manager.process_update(CONFIG_STREAM_NAME, updates, False)

            # Only metricsd config was updated, hence should be restarted
            self.assertEqual(loader.call_count, 1)
            restarter.assert_called_once_with(['metricsd'])
            updater.assert_called_once_with(update_str)

            configs_by_service = {
                'magmad': updated_mconfig.configs_by_key['magmad'],
                'metricsd': updated_mconfig.configs_by_key['metricsd'],
            }
            processed_updates.assert_called_once_with(configs_by_service)

            restarter.reset_mock()
            updater.reset_mock()
            processed_updates.reset_mock()

            updated_mconfig.configs_by_key['shared_mconfig'].CopyFrom(some_any)
            update_str = MessageToJson(updated_mconfig)
            updates = [
                DataUpdate(
                    value=update_str.encode('utf-8'),
                    key='last key',
                ),
            ]
            config_manager.process_update(CONFIG_STREAM_NAME, updates, False)

            # shared config update should restart all services
            restarter.assert_called_once_with(['magmad', 'metricsd'])
            updater.assert_called_once_with(update_str)
            dynamic_services.assert_called_once_with([])
            processed_updates.assert_called_once_with(configs_by_service)
            self.assertEqual(mock_c.call_count, 1)

            restarter.reset_mock()
            updater.reset_mock()
            processed_updates.reset_mock()
            dynamic_services.reset_mock()