示例#1
0
    def __init__(self, host="localhost", port=9090, timeout=1000, type='ng', reuse=True, debug=False):
        """ Init the event server stuff (nodes and co).

        Args:
            host (Optional[str or list]): hostname or IP address, string or a list of hostname.
            port (Optional[int]): port number on which to connect.
            timeout (Optional[int]): Controls how long the socket will wait for a response.
            type (Optional[str]): The flume agent generation.
            reuse (bool): using a single TCP connection, otherwhise open/close connection for each operation.
            debug (bool): True show debug messages, otherwhise is quiet.
        """
        self.host = host
        if isinstance(self.host, basestring):
            self.host = [self.host]
        self.port = port
        self.timeout = timeout
        self.type = type
        self.reuse = reuse
        self.debug = debug

        # NOTE: parse the host URI.
        for entity in self.host:
            self.default_nodes = split_hosts(entity, self.port)
            log_debug("nodes available {}".format(self.default_nodes), debug=self.debug)

        if not self.default_nodes:
            raise ConfigurationError("need to specify at least one host")

        # NOTE: init stuff to manage the pool.
        self.active_nodes = [node for node in self.default_nodes]
        self.cycle_nodes = cycle(self.active_nodes)
        self.open_connections = {}
示例#2
0
    def __enter__(self):
        """ Connect to an active node.
        """
        try:
            if not self.active_nodes:
                raise StopIteration

            for node in self.cycle_nodes:
                try:
                    if not self.active_nodes:
                        raise StopIteration

                    # NOTE: try to re-use a connection.
                    self.current_node = node
                    if self.reuse and self._is_connected(
                            node=self.current_node):
                        log_debug('re-using connection to {0}'.format(
                            self.current_node),
                                  debug=self.debug)
                        return self.open_connections[
                            self.current_node]['client']

                    # NOTE: new connection.
                    self.client, self.transport = self._connect(
                        *self.current_node)
                    self._add_node(node=self.current_node,
                                   client=self.client,
                                   transport=self.transport)
                    log_debug('opened new connection to {0}'.format(
                        self.current_node),
                              debug=self.debug)
                except ConnectionFailure as e:
                    self._remove_node(node=self.current_node)
        except StopIteration:
            raise ServerSelectionError("no server available")
示例#3
0
    def __enter__(self):
        """ Connect to an active node.
        """
        try:
            if not self.active_nodes:
                raise StopIteration

            for node in self.cycle_nodes:
                try:
                    if not self.active_nodes:
                        raise StopIteration

                    # NOTE: try to re-use a connection.
                    self.current_node = node
                    if self.reuse and self._is_connected(node=self.current_node):
                        log_debug('re-using connection to {}'.format(self.current_node), debug=self.debug)
                        return self.open_connections[self.current_node]['client']

                    # NOTE: new connection.
                    self.client, self.transport = self._connect(*self.current_node)
                    self._add_node(node=self.current_node, client=self.client, transport=self.transport)
                    log_debug('opened new connection to {}'.format(self.current_node), debug=self.debug)
                except ConnectionFailure as e:
                    self._remove_node(node=self.current_node)
        except StopIteration:
            raise ServerSelectionError("no server available")
示例#4
0
    def _remove_node(self, node):
        """ Remove a node from the active nodes pool.

        Args:
            host (str): Hostname/port combo.
        """
        log_debug("remove {0} from the active nodes".format(node), debug=self.debug)
        self.open_connections.pop(node, None)
        if node in self.active_nodes:
            self.active_nodes.remove(node)
示例#5
0
    def _add_node(self, node, client, transport):
        """ Add a node to the active nodes pool.

        Args:
            host (str): Hostname/port combo.
        """
        log_debug("add {0} to the active nodes".format(node), debug=self.debug)
        self.open_connections[node] = {'client': client, 'transport': transport}
        if node not in self.active_nodes:
            self.active_nodes.append(node)
示例#6
0
 def reconnect(self):
     """ Helper will attempt to reconnect on nodes.
     """
     for node in self.default_nodes:
         try:
             if node not in self.active_nodes:
                 log_debug('reconnecting to {}'.format(node), debug=self.debug)
                 client, transport = self._connect(*node)
                 self._add_node(node=node, client=client, transport=transport)
         except ConnectionFailure as e:
             log_debug('failed to reconnect to {}'.format(node), debug=self.debug)
示例#7
0
    def _remove_node(self, node):
        """ Remove a node from the active nodes pool.

        Args:
            host (str): Hostname/port combo.
        """
        log_debug("remove {0} from the active nodes".format(node),
                  debug=self.debug)
        self.open_connections.pop(node, None)
        if node in self.active_nodes:
            self.active_nodes.remove(node)
示例#8
0
    def _add_node(self, node, client, transport):
        """ Add a node to the active nodes pool.

        Args:
            host (str): Hostname/port combo.
        """
        self.first_cycle = False
        log_debug("add {} to the active nodes".format(node), debug=self.debug)
        self.open_connections[node] = {'client': client, 'transport': transport}
        self.active_nodes.append(node)
        self.cycle_nodes = cycle(self.active_nodes)
示例#9
0
    def _add_node(self, node, client, transport):
        """ Add a node to the active nodes pool.

        Args:
            host (str): Hostname/port combo.
        """
        log_debug("add {0} to the active nodes".format(node), debug=self.debug)
        self.open_connections[node] = {
            'client': client,
            'transport': transport
        }
        if node not in self.active_nodes:
            self.active_nodes.append(node)
示例#10
0
 def reconnect(self):
     """ Helper will attempt to reconnect on nodes.
     """
     for node in self.default_nodes:
         try:
             if node not in self.active_nodes:
                 log_debug('reconnecting to {0}'.format(node),
                           debug=self.debug)
                 client, transport = self._connect(*node)
                 self._add_node(node=node,
                                client=client,
                                transport=transport)
         except ConnectionFailure as e:
             log_debug('failed to reconnect to {0}'.format(node),
                       debug=self.debug)
示例#11
0
    def __init__(self,
                 host="localhost",
                 port=9090,
                 timeout=1000,
                 type='ng',
                 reuse=True,
                 debug=False):
        """ Init the event server stuff (nodes and co).

        Args:
            host (Optional[str or list]): hostname or IP address, string or a list of hostname.
            port (Optional[int]): port number on which to connect.
            timeout (Optional[int]): Controls how long the socket will wait for a response.
            type (Optional[str]): The flume agent generation.
            reuse (bool): using a single TCP connection, otherwhise open/close connection for each operation.
            debug (bool): True show debug messages, otherwhise is quiet.
        """
        self.host = host
        if isinstance(self.host, basestring):
            self.host = [self.host]
        self.port = port
        self.timeout = timeout
        self.type = type
        self.reuse = reuse
        self.debug = debug

        # NOTE: parse the host URI.
        for entity in self.host:
            self.default_nodes = split_hosts(entity, self.port)
            log_debug("nodes available {0}".format(self.default_nodes),
                      debug=self.debug)

        if not self.default_nodes:
            raise ConfigurationError("need to specify at least one host")

        # NOTE: init stuff to manage the pool.
        self.active_nodes = [node for node in self.default_nodes]
        self.cycle_nodes = cycle(self.active_nodes)
        self.open_connections = {}