Пример #1
0
    def test_create_configuration_category_exception(self, status_code, host):
        microservice_management_host = 'host1'
        microservice_management_port = 1
        ms_mgt_client = MicroserviceManagementClient(
            microservice_management_host, microservice_management_port)
        response_mock = MagicMock(type=HTTPResponse)
        undecoded_data_mock = MagicMock()
        test_dict = json.dumps({
            'key': 'TEST',
            'description': 'description',
            'value': {
                'ping_timeout': {
                    'type': 'integer',
                    'description':
                    'Timeout for a response from any given micro-service. (must be greater than 0)',
                    'value': '1',
                    'default': '1'
                },
                'sleep_interval': {
                    'type': 'integer',
                    'description':
                    'The time (in seconds) to sleep between health checks. (must be greater than 5)',
                    'value': '5',
                    'default': '5'
                }
            }
        })

        undecoded_data_mock.decode.return_value = test_dict
        response_mock.read.return_value = undecoded_data_mock
        response_mock.status = status_code
        response_mock.reason = 'this is the reason'
        with patch.object(HTTPConnection, 'request') as request_patch:
            with patch.object(HTTPConnection,
                              'getresponse',
                              return_value=response_mock) as response_patch:
                with patch.object(_logger, "error") as log_error:
                    with pytest.raises(Exception) as excinfo:
                        ms_mgt_client.create_configuration_category(test_dict)
                    assert excinfo.type is client_exceptions.MicroserviceManagementClientError
                assert 1 == log_error.call_count
                msg = '{} error code: %d, Reason: %s'.format(host)
                log_error.assert_called_once_with(msg, status_code,
                                                  'this is the reason')
            response_patch.assert_called_once_with()
        args, kwargs = request_patch.call_args_list[0]
        assert 'POST' == kwargs['method']
        assert '/foglamp/service/category' == kwargs['url']
        assert json.loads(test_dict) == json.loads(kwargs['body'])
Пример #2
0
    def test_create_configuration_category(self):
        microservice_management_host = 'host1'
        microservice_management_port = 1
        ms_mgt_client = MicroserviceManagementClient(
            microservice_management_host, microservice_management_port)
        response_mock = MagicMock(type=HTTPResponse)
        undecoded_data_mock = MagicMock()
        response_mock.read.return_value = undecoded_data_mock
        test_dict = json.dumps({
            'key': 'TEST',
            'description': 'description',
            'value': {
                'ping_timeout': {
                    'type': 'integer',
                    'description':
                    'Timeout for a response from any given micro-service. (must be greater than 0)',
                    'value': '1',
                    'default': '1'
                },
                'sleep_interval': {
                    'type': 'integer',
                    'description':
                    'The time (in seconds) to sleep between health checks. (must be greater than 5)',
                    'value': '5',
                    'default': '5'
                }
            }
        })

        undecoded_data_mock.decode.return_value = test_dict
        response_mock.status = 200
        with patch.object(HTTPConnection, 'request') as request_patch:
            with patch.object(HTTPConnection,
                              'getresponse',
                              return_value=response_mock) as response_patch:
                ret_value = ms_mgt_client.create_configuration_category(
                    test_dict)
                assert json.loads(test_dict) == ret_value
            response_patch.assert_called_once_with()
        args, kwargs = request_patch.call_args_list[0]
        assert 'POST' == kwargs['method']
        assert '/foglamp/service/category' == kwargs['url']
        assert json.loads(test_dict) == json.loads(kwargs['body'])
    def test_create_configuration_category_keep_original(self):
        microservice_management_host = 'host1'
        microservice_management_port = 1
        ms_mgt_client = MicroserviceManagementClient(
            microservice_management_host, microservice_management_port)
        response_mock = MagicMock(type=HTTPResponse)
        undecoded_data_mock = MagicMock()
        response_mock.read.return_value = undecoded_data_mock
        test_dict = {
            'key': 'TEST',
            'description': 'description',
            'value': {
                'ping_timeout': {
                    'type': 'integer',
                    'description':
                    'Timeout for a response from any given micro-service. (must be greater than 0)',
                    'value': '1',
                    'default': '1'
                },
                'sleep_interval': {
                    'type': 'integer',
                    'description':
                    'The time (in seconds) to sleep between health checks. (must be greater than 5)',
                    'value': '5',
                    'default': '5'
                }
            },
            'keep_original_items': True
        }

        undecoded_data_mock.decode.return_value = json.dumps(test_dict)
        response_mock.status = 200
        with patch.object(HTTPConnection, 'request') as request_patch:
            with patch.object(HTTPConnection,
                              'getresponse',
                              return_value=response_mock) as response_patch:
                ret_value = ms_mgt_client.create_configuration_category(
                    test_dict)
            response_patch.assert_called_once_with()
        request_patch.assert_called_once_with(method='POST',
                                              url='/foglamp/service/category',
                                              body=test_dict)
        assert ret_value == test_dict
    def test_create_configuration_category_exception(self, status_code):
        microservice_management_host = 'host1'
        microservice_management_port = 1
        ms_mgt_client = MicroserviceManagementClient(
            microservice_management_host, microservice_management_port)
        response_mock = MagicMock(type=HTTPResponse)
        undecoded_data_mock = MagicMock()
        test_dict = {
            'key': 'TEST',
            'description': 'description',
            'value': {
                'ping_timeout': {
                    'type': 'integer',
                    'description':
                    'Timeout for a response from any given micro-service. (must be greater than 0)',
                    'value': '1',
                    'default': '1'
                },
                'sleep_interval': {
                    'type': 'integer',
                    'description':
                    'The time (in seconds) to sleep between health checks. (must be greater than 5)',
                    'value': '5',
                    'default': '5'
                }
            },
            'keep_original_items': False
        }

        undecoded_data_mock.decode.return_value = json.dumps(test_dict)
        response_mock.read.return_value = undecoded_data_mock
        response_mock.status = status_code
        with patch.object(HTTPConnection, 'request') as request_patch:
            with patch.object(HTTPConnection,
                              'getresponse',
                              return_value=response_mock) as response_patch:
                with pytest.raises(
                        client_exceptions.MicroserviceManagementClientError
                ) as excinfo:
                    ret_value = ms_mgt_client.create_configuration_category(
                        test_dict)
Пример #5
0
class FoglampProcess(ABC):
    """ FoglampProcess for all non-core python processes.

    All processes will inherit from FoglampProcess and must implement pure virtual method run()
    """

    _core_management_host = None
    """ string containing core's micro-service management host """

    _core_management_port = None
    """ int containing core's micro-service management port """

    _name = None
    """ name of process """

    _core_microservice_management_client = None
    """ MicroserviceManagementClient instance """

    _readings_storage_async = None
    """ foglamp.common.storage_client.storage_client.ReadingsStorageClientAsync """

    _storage_async = None
    """ async foglamp.common.storage_client.storage_client.StorageClientAsync """

    _start_time = None
    """ time at which this python process started """
    def __init__(self):
        """ All processes must have these three command line arguments passed:

        --address [core microservice management host]
        --port [core microservice management port]
        --name [process name]
        """

        self._start_time = time.time()

        try:
            self._core_management_host = self.get_arg_value("--address")
            self._core_management_port = self.get_arg_value("--port")
            self._name = self.get_arg_value("--name")
        except ArgumentParserError:
            raise
        if self._core_management_host is None:
            raise ValueError("--address is not specified")
        elif self._core_management_port is None:
            raise ValueError("--port is not specified")
        elif self._name is None:
            raise ValueError("--name is not specified")

        self._core_microservice_management_client = MicroserviceManagementClient(
            self._core_management_host, self._core_management_port)

        self._readings_storage_async = ReadingsStorageClientAsync(
            self._core_management_host, self._core_management_port)
        self._storage_async = StorageClientAsync(self._core_management_host,
                                                 self._core_management_port)

    # pure virtual method run() to be implemented by child class
    @abstractmethod
    def run(self):
        pass

    def get_arg_value(self, argument_name):
        """ Parses command line arguments for a single argument of name argument_name. Returns the value of the argument specified or None if argument was not specified.

        Keyword Arguments:
        argument_name -- name of command line argument to retrieve value for
    
        Return Values:
            Argument value (as a string)
            None (if argument was not passed)
    
            Side Effects:
            None
    
            Known Exceptions:
            ArgumentParserError
        """
        parser = SilentArgParse()
        return parser.silent_arg_parse(argument_name)

    def get_services_from_core(self, name=None, _type=None):
        return self._core_microservice_management_client.get_services(
            name, _type)

    def register_service_with_core(self, service_registration_payload):
        """ Register a microservice with core

        Keyword Arguments:
            service_registration_payload -- json format dictionary

        Return Values:
            Argument value (as a string)
            None (if argument was not passed)

            Known Exceptions:
                HTTPError
        """

        return self._core_microservice_management_client.register_service(
            service_registration_payload)

    def unregister_service_with_core(self, microservice_id):
        """ Unregister a microservice with core

        Keyword Arguments:
            microservice_id (uuid as a string)
        """
        return self._core_microservice_management_client.unregister_service(
            microservice_id)

    def register_interest_with_core(self):
        # cat name
        # callback module
        # self.microservice_id
        raise NotImplementedError

    def unregister_interest_with_core(self):
        # cat name
        # self.microservice_id
        raise NotImplementedError

    def get_configuration_categories(self):
        """

        :return:
        """
        return self._core_microservice_management_client.get_configuration_category(
        )

    def get_configuration_category(self, category_name=None):
        """

        :param category_name:
        :return:
        """
        return self._core_microservice_management_client.get_configuration_category(
            category_name)

    def get_configuration_item(self, category_name, config_item):
        """

        :param category_name:
        :param config_item:
        :return:
        """
        return self._core_microservice_management_client.get_configuration_item(
            category_name, config_item)

    def create_configuration_category(self, category_data):
        """

        :param category_data:
        :return:
        """
        return self._core_microservice_management_client.create_configuration_category(
            category_data)

    def update_configuration_item(self, category_name, config_item):
        """

        :param category_name:
        :param config_item:
        :return:
        """
        return self._core_microservice_management_client.update_configuration_item(
            category_name, config_item)

    def delete_configuration_item(self, category_name, config_item):
        """

        :param category_name:
        :param config_item:
        :return:
        """
        return self._core_microservice_management_client.delete_configuration_item(
            category_name, config_item)
Пример #6
0
class FoglampProcess(ABC):
    """ FoglampProcess for all non-core python processes.

    All processes will inherit from FoglampProcess and must implement pure virtual method run()
    """

    _core_management_host = None
    """ string containing core's micro-service management host """

    _core_management_port = None
    """ int containing core's micro-service management port """

    _name = None
    """ name of process """

    _core_microservice_management_client = None
    """ MicroserviceManagementClient instance """

    _readings_storage_async = None
    """ foglamp.common.storage_client.storage_client.ReadingsStorageClientAsync """

    _storage_async = None
    """ async foglamp.common.storage_client.storage_client.StorageClientAsync """

    _start_time = None
    """ time at which this python process started """

    def __init__(self):
        """ All processes must have these three command line arguments passed:

        --address [core microservice management host]
        --port [core microservice management port]
        --name [process name]
        """

        self._start_time = time.time()

        try:
            parser = SilentArgParse()
            parser.add_argument("--name", required=True)
            parser.add_argument("--address", required=True)
            parser.add_argument("--port", required=True, type=int)
            namespace, args = parser.parse_known_args()
            self._name = getattr(namespace, 'name')
            self._core_management_host = getattr(namespace, 'address')
            self._core_management_port = getattr(namespace, 'port')
            r = range(1, 65536)
            if self._core_management_port not in r:
                raise ArgumentParserError("Invalid Port: {}".format(self._core_management_port))
            for item in args:
                if item.startswith('--'):
                    kv = item.split('=')
                    if len(kv) == 2:
                        if len(kv[1].strip()) == 0:
                            raise ArgumentParserError("Invalid value {} for optional arg {}".format(kv[1], kv[0]))

        except ArgumentParserError as ex:
            _logger.error("Arg parser error: %s", str(ex))
            raise

        self._core_microservice_management_client = MicroserviceManagementClient(self._core_management_host,
                                                                                 self._core_management_port)

        self._readings_storage_async = ReadingsStorageClientAsync(self._core_management_host,
                                                                  self._core_management_port)
        self._storage_async = StorageClientAsync(self._core_management_host, self._core_management_port)

    # pure virtual method run() to be implemented by child class
    @abstractmethod
    def run(self):
        pass

    def get_services_from_core(self, name=None, _type=None):
        return self._core_microservice_management_client.get_services(name, _type)

    def register_service_with_core(self, service_registration_payload):
        """ Register a microservice with core

        Keyword Arguments:
            service_registration_payload -- json format dictionary

        Return Values:
            Argument value (as a string)
            None (if argument was not passed)

            Known Exceptions:
                HTTPError
        """

        return self._core_microservice_management_client.register_service(service_registration_payload)

    def unregister_service_with_core(self, microservice_id):
        """ Unregister a microservice with core

        Keyword Arguments:
            microservice_id (uuid as a string)
        """
        return self._core_microservice_management_client.unregister_service(microservice_id)

    def register_interest_with_core(self):
        # cat name
        # callback module
        # self.microservice_id
        raise NotImplementedError

    def unregister_interest_with_core(self):
        # cat name
        # self.microservice_id
        raise NotImplementedError

    def get_configuration_categories(self):
        """

        :return:
        """
        return self._core_microservice_management_client.get_configuration_category()

    def get_configuration_category(self, category_name=None):
        """

        :param category_name:
        :return:
        """
        return self._core_microservice_management_client.get_configuration_category(category_name)

    def get_configuration_item(self, category_name, config_item):
        """

        :param category_name:
        :param config_item:
        :return:
        """
        return self._core_microservice_management_client.get_configuration_item(category_name, config_item)

    def create_configuration_category(self, category_data):
        """

        :param category_data:
        :return:
        """
        return self._core_microservice_management_client.create_configuration_category(category_data)

    def update_configuration_item(self, category_name, config_item):
        """

        :param category_name:
        :param config_item:
        :return:
        """
        return self._core_microservice_management_client.update_configuration_item(category_name, config_item)

    def delete_configuration_item(self, category_name, config_item):
        """

        :param category_name:
        :param config_item:
        :return:
        """
        return self._core_microservice_management_client.delete_configuration_item(category_name, config_item)