def many_from_config(config: ConfigParams) -> List['ConnectionParams']:
        """
        Retrieves all ConnectionParams from configuration parameters
        from "connections" section. If "connection" section is present instead,
        than it returns a list with only one ConnectionParams.

        :param config: a configuration parameters to retrieve connections

        :return: a list of retrieved ConnectionParams
        """
        result = []

        # Try to get multiple connections first
        connections = config.get_section("connections")
        if len(connections) > 0:
            sections_names = connections.get_section_names()
            for section in sections_names:
                connection = connections.get_section(section)
                result.append(ConnectionParams(connection))
        # Then try to get a single connection
        else:
            connection = config.get_section("connection")
            result.append(ConnectionParams(connection))

        return result
    def concat(options1: ConfigParams, options2: ConfigParams,
               *keys: str) -> ConfigParams:
        """
        Concatinates two options by combining duplicated properties into comma-separated list

        :param options1:    first options to merge
        :param options2:    second options to merge
        :param keys:        when define it limits only to specific keys
        """

        options = ConfigParams.from_value(options1)
        for key in options2.get_keys():
            value1 = options1.get_as_string(key) or ''
            value2 = options2.get_as_string(key) or ''

            if value1 != '' and value2 != '':
                if keys is None or len(keys) == 0 or key in keys:
                    options.set_as_object(key, value1 + ',' + value2)

            elif value1 != '':
                options.set_as_object(key, value1)
            elif value2 != '':
                options.set_as_object(key, value2)

        return options
    def __init__(self, base_route, config: ConfigParams,
                 commands: List[ICommand]):
        self.__content: str = ''

        self.commands: List[ICommand] = commands or []

        config = config or ConfigParams()

        self.version: str = '3.0.2'
        self.base_route: str = base_route

        self.info_title: str = config.get_as_string_with_default(
            "name", "CommandableHttpService")
        self.info_description: str = config.get_as_string_with_default(
            "description", "Commandable microservice")
        self.info_version: str = '1'
        self.info_terms_of_service: Optional[str] = None

        self.info_contact_name: Optional[str] = None
        self.info_contact_url: Optional[str] = None
        self.info_contact_email: Optional[str] = None

        self.info_license_name: Optional[str] = None
        self.info_license_url: Optional[str] = None

        self._object_type: Dict[str, Any] = {'type': 'object'}
    def test_config_sections(self):
        config = ConfigParams.from_tuples("Section1.Key1", "Value1",
                                          "Section1.Key2", "Value2",
                                          "Section1.Key3", "Value3")
        assert 3 == len(config)
        assert "Value1" == config.get("Section1.Key1")
        assert "Value2" == config.get("Section1.Key2")
        assert "Value3" == config.get("Section1.Key3")
        assert None == config.get("Section1.Key4")

        section2 = ConfigParams.from_tuples("Key1", "ValueA", "Key2", "ValueB")
        config.add_section("Section2", section2)
        assert 5 == len(config)
        assert "ValueA" == config.get("Section2.Key1")
        assert "ValueB" == config.get("Section2.Key2")

        sections = config.get_section_names()
        assert 2 == len(sections)
        assert "Section1" in sections
        assert "Section2" in sections

        section1 = config.get_section("Section1")
        assert 3 == len(section1)
        assert "Value1" == section1.get("Key1")
        assert "Value2" == section1.get("Key2")
        assert "Value3" == section1.get("Key3")
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        self._interval = config.get_as_float_with_default("interval", self._interval)
        self._max_cache_size = config.get_as_integer_with_default("options.max_cache_size", self._max_cache_size)
    def test_read_config(self):
        config = ConfigParams.from_tuples("id", "ABC")
        name = NameResolver.resolve(config)
        assert "ABC" == name

        config = ConfigParams.from_tuples("name", "ABC")
        name = NameResolver.resolve(config)
        assert "ABC" == name
示例#7
0
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        config = config.set_defaults(self.__default_config)
        self._connection_resolver.configure(config)
        self._options = self._options.override(config.get_section('options'))
    def configure(self, config: ConfigParams):
        config = config.set_defaults(SessionsOperationsV1.__default_config)
        self._dependency_resolver.configure(config)

        self.__cookie_enabled = config.get_as_boolean_with_default(
            'options.cookie_enabled', self.__cookie_enabled)
        self.__cookie = config.get_as_string_with_default(
            'options.cookie', self.__cookie)
        self.__max_cookie_age = config.get_as_long_with_default(
            'options.max_cookie_age', self.__max_cookie_age)
示例#9
0
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        self._level = LogLevelConverter.to_log_level(
            config.get_as_object("level"))
        self._source = config.get_as_string_with_default(
            "source", self._source)
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        self.__timeout = config.get_as_long_with_default(
            "options.timeout", self.__default_timeout)
        self.__max_size = config.get_as_long_with_default(
            "options.max_size", self.__default_max_size)
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        self.__mode = config.get_as_string_with_default('mode', self.__mode)
        self.__min_timeout = config.get_as_integer_with_default(
            'min_timeout', self.__min_timeout)
        self.__max_timeout = config.get_as_integer_with_default(
            'max_timeout', self.__max_timeout)
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        super().configure(config)

        self.__listen_interval = config.get_as_integer_with_default(
            'listen_interval', self.__listen_interval)
        self.__listen_interval = config.get_as_integer_with_default(
            'options.listen_interval', self.__listen_interval)
    def __init__(self):
        """
        Creates a new instance of the connection component.
        """
        self.__default_config = ConfigParams.from_tuples(
            'options.max_pool_size', 2, 'options.keep_alive', 1,
            'options.connect_timeout', 5000, 'options.auto_reconnect', True,
            'options.max_page_size', 100, 'options.debug', True)

        self._logger = CompositeLogger()
        self._connection_resolver = MongoDbConnectionResolver()
        self._options = ConfigParams()
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        self.__connection_resolver.configure(config)
        self.__credential_resolver.configure(config)

        self.__timeout = config.get_as_integer_with_default(
            'options.timeout', self.__timeout)
        self.__retries = config.get_as_integer_with_default(
            'options.retries', self.__retries)
示例#15
0
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        self.__name = config.get_as_string_with_default("name", self.__name)
        self.__name = config.get_as_string_with_default("info.name", self.__name)

        self.__description = config.get_as_string_with_default("description", self.__description)
        self.__description = config.get_as_string_with_default("info.description", self.__description)

        self.__properties = config.get_section("properties")
 def __init__(self):
     """
     Creates a new instance of the client.
     """
     self._connection_resolver = HttpConnectionResolver()
     self._default_config = ConfigParams.from_tuples(
         "connection.protocol", "http", "connection.host", "0.0.0.0",
         "connection.port", 3000, "options.timeout", 10000,
         "options.request_max_size", 1024 * 1024, "options.connect_timeout",
         10000, "options.retries", 3, "options.debug", True)
     self._logger = CompositeLogger()
     self._counters = CompositeCounters()
     self._options = ConfigParams()
     self._headers = {}
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        super().configure(config)

        self.__connection_resolver.configure(config)

        self.__index = config.get_as_string_with_default('index', self.__index)
        self._date_format = config.get_as_string_with_default(
            'date_format', self._date_format)
        self.__daily_index = config.get_as_boolean_with_default(
            'daily', self.__daily_index)
        self.__reconnect = config.get_as_integer_with_default(
            'options.reconnect', self.__reconnect)
        self.__timeout = config.get_as_integer_with_default(
            'options.timeout', self.__timeout)
        self.__max_retries = config.get_as_integer_with_default(
            'options.max_retries', self.__max_retries)
        self.__index_message = config.get_as_boolean_with_default(
            'options.index_message', self.__index_message)
        self.__include_type_name = config.get_as_boolean_with_default(
            'options.include_type_name', self.__include_type_name)
    def test_concat_options(self):
        options1 = ConfigParams.from_tuples("host", "server1", "port", "8080",
                                            "param1", "ABC")

        options2 = ConfigParams.from_tuples("host", "server2", "port", "8080",
                                            "param2", "XYZ")

        options = ConnectionUtils.concat(options1, options2)

        assert len(options) == 4
        assert "server1,server2" == options.get_as_nullable_string("host")
        assert "8080,8080" == options.get_as_nullable_string("port")
        assert "ABC" == options.get_as_nullable_string("param1")
        assert "XYZ" == options.get_as_nullable_string("param2")
示例#19
0
    def from_config(config: ConfigParams) -> 'ComponentConfig':
        """
        Creates a new instance of ComponentConfig based on section from container configuration.

        :param config: component parameters from container configuration

        :return: a newly created ComponentConfig
        """
        descriptor = Descriptor.from_string(config.get_as_nullable_string("descriptor"))
        type = TypeDescriptor.from_string(config.get_as_nullable_string("type"))

        if descriptor is None and type is None:
            raise ConfigException(None, "BAD_CONFIG", "Component configuration must have descriptor or type")

        return ComponentConfig(descriptor, type, config)
示例#20
0
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        config = config.set_defaults(MySqlPersistence._default_config)
        self.__config = config

        self._dependency_resolver.configure(config)

        self._table_name = config.get_as_string_with_default('collection', self._table_name)
        self._table_name = config.get_as_string_with_default('table', self._table_name)
        self._schema_name = config.get_as_string_with_default('schema', self._schema_name)
        self._max_page_size = config.get_as_integer_with_default('options.max_page_size', self._max_page_size)
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        super().configure(config)

        self.__connection_resolver.configure(config)
        self.__source = config.get_as_float_with_default(
            'source', self.__source)
        self.__instance = config.get_as_float_with_default(
            'instance', self.__instance)
        self.__push_enabled = config.get_as_float_with_default(
            'push_enabled', True)
    def _get_parameters(self):
        # Process command line parameters
        args = sys.argv
        line = ''
        index = 0
        while index < len(args):
            arg = args[index]
            next_arg = args[index + 1] if index < len(args) - 1 else None
            next_arg = None if next_arg != None and next_arg.startswith(
                '-') else next_arg
            if next_arg != None:
                if arg == "--param" or arg == "--params" or arg == "-p":
                    if len(line) > 0:
                        line = line + ';'
                    line = line + next_arg
                    index += 1
            index += 1

        parameters = ConfigParams.from_string(line)

        # Process environmental variables
        for (k, v) in os.environ.items():
            parameters[k] = v

        return parameters
示例#23
0
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        config = config.set_defaults(self._default_config)
        self._config = config
        self._dependency_resolver.configure(config)
        self._base_route = config.get_as_string_with_default(
            "base_route", self._base_route)

        self._swagger_enabled = self._config.get_as_boolean_with_default(
            "swagger.enable", self._swagger_enabled)
        self._swagger_route = self._config.get_as_string_with_default(
            "swagger.route", self._swagger_route)
    def test_lookup_and_store(self):
        config = ConfigParams.from_tuples('key1.user', 'user1', 'key1.pass',
                                          'pass1', 'key2.user', 'user2',
                                          'key2.pass', 'pass2')

        credential_store = MemoryCredentialStore()
        credential_store.read_credentials(config)

        cred1 = credential_store.lookup('123', 'key1')
        cred2 = credential_store.lookup('123', 'key2')

        assert cred1.get_username() == 'user1'
        assert cred1.get_password() == 'pass1'
        assert cred2.get_username() == 'user2'
        assert cred2.get_password() == 'pass2'

        cred_config = CredentialParams.from_tuples('user', 'user3', 'pass',
                                                   'pass3', 'access_id', '123')

        credential_store.store(None, 'key3', cred_config)

        cred3 = credential_store.lookup('123', 'key3')

        assert cred3.get_username() == 'user3'
        assert cred3.get_password() == 'pass3'
        assert cred3.get_access_id() == '123'
    def test_get_open_api_override(self):
        open_api_content = "swagger yaml content"

        # recreate service with new configuration
        self.service.close(None)

        config = rest_config.set_defaults(
            ConfigParams.from_tuples("swagger.auto", False))

        ctrl = DummyController()

        self.service = DummyCommandableHttpService()
        self.service.configure(config)

        references = References.from_tuples(
            Descriptor('pip-services-dummies', 'controller', 'default',
                       'default', '1.0'), ctrl,
            Descriptor('pip-services-dummies', 'service', 'http', 'default',
                       '1.0'), self.service)
        self.service.set_references(references)

        try:
            self.service.open(None)

            response = requests.request('GET',
                                        'http://localhost:3005/dummy/swagger')
            assert response.text == open_api_content
        finally:
            self.service.close(None)
示例#26
0
    def configure(self, config: ConfigParams):
        """
        Configures component by passing configuration parameters.

        :param config: configuration parameters to be set.
        """
        self.__path = config.get_as_string_with_default('path', self.__path)
示例#27
0
    def __compose_connection(
            self,
            connections: List[ConnectionParams],
            credential: CredentialParams = None) -> ConfigParams:
        connection = ConfigParams.merge_configs(*connections)

        uri = connection.get_as_string('uri')

        if uri is None or uri == "":

            protocol = connection.get_as_string_with_default('protocol', "uri")
            host = connection.get_as_string('host')
            port = connection.get_as_integer('port')

            uri = protocol + "://" + host if host else None
            if port != 0:
                uri = uri + ":" + str(port)
            connection.set_as_object('uri', uri)

        else:
            address = urlparse(uri)

            connection.set_as_object('protocol', address.scheme)
            connection.set_as_object('host', address.hostname)
            connection.set_as_object('port', address.port)

        if connection.get_as_string('protocol') == 'https':
            if credential.get_as_nullable_string('internal_network') is None:
                connection = connection.override(credential)

        return connection
    def resolve(self,
                correlation_id: Optional[str]) -> Optional[ConnectionParams]:
        """
        Resolves a single component connection. If connections are configured to be retrieved
        from Discovery service it finds a :class:`IDiscovery <pip_services3_components.connect.IDiscovery.IDiscovery>` and resolves the connection there.

        :param correlation_id: (optional) transaction id to trace execution through call chain.

        :return: resolved connection parameters or null if nothing was found.
        """
        if len(self.__connections) == 0: return None

        # Return connection that doesn't require discovery
        for connection in self.__connections:
            if not connection.use_discovery():
                return connection

        # Return connection that require discovery
        for connection in self.__connections:
            if connection.use_discovery():
                resolved_connection = self.__resolve_in_discovery(
                    correlation_id, connection)
                if not (resolved_connection is None):
                    # Merge configured and new parameters
                    resolved_connection = ConnectionParams(
                        ConfigParams.merge_configs(connection,
                                                   resolved_connection))
                    return resolved_connection

        return None
 def test_lookup(self):
     credential_resolver = CredentialResolver()
     credential = credential_resolver.lookup("correlation_id")
     assert None == credential
     
     RestConfigWithoutStoreKey = ConfigParams.from_tuples(
         "credential.username", "Negrienko",
         "credential.password", "qwerty",
         "credential.access_key", "key"
     )
     credential_resolver = CredentialResolver(RestConfigWithoutStoreKey)
     credential = credential_resolver.lookup("correlation_id")
     assert "Negrienko"  == credential.get("username")
     assert "qwerty" == credential.get("password")
     assert "key" == credential.get("access_key")
     assert None == credential.get("store_key")
     
     credential_resolver = CredentialResolver(RestConfig)
     credential = credential_resolver.lookup("correlation_id")
     assert None == credential
     
     credential_resolver.set_references(References())
     try:
         credential = credential_resolver.lookup("correlation_id")
     except Exception as ex:
         assert "Cannot locate reference: Credential store wasn't found to make lookup" == ex.message
    def resolve_all(self,
                    correlation_id: Optional[str]) -> List[ConnectionParams]:
        """
        Resolves all component connection. If connections are configured to be retrieved
        from Discovery service it finds a :class:`IDiscovery <pip_services3_components.connect.IDiscovery.IDiscovery>` and resolves the connection there.

        :param correlation_id: (optional) transaction id to trace execution through call chain.

        :return: a list of resolved connections.
        """
        resolved = []
        to_resolve = []

        # Sort connections
        for connection in self.__connections:
            if connection.use_discovery():
                to_resolve.append(connection)
            else:
                resolved.append(connection)

        # Resolve addresses that require that
        if len(to_resolve) > 0:
            for connection in to_resolve:
                resolved_connections = self.__resolve_all_in_discovery(
                    correlation_id, connection)
                for resolved_connection in resolved_connections:
                    # Merge configured and new parameters
                    resolved_connection = ConnectionParams(
                        ConfigParams.merge_configs(connection,
                                                   resolved_connection))
                    resolved.append(resolved_connection)

        return resolved