'Lists all nodes.
Ex_node_ids parameter is used to filter the list of
nodes that should be returned. Only the nodes
with the corresponding node IDs will be returned.
:param      ex_node_ids: List of ``node.id``
:type       ex_node_ids: ``list`` of ``str``
:param      ex_filters: The filters so that the list includes
information for certain nodes only.
:type       ex_filters: ``dict``
:rtype: ``list`` of :class:`Node`'

def list_nodes(self, ex_node_ids=None, ex_filters=None):

    params = {'Action': 'DescribeInstances'}
    if ex_node_ids:
        params.update(self._pathlist('InstanceId', ex_node_ids))
    if ex_filters:
        params.update(self._build_filters(ex_filters))
    elem = self.connection.request(self.path, params=params).object
    nodes = []
    for rs in findall(element=elem, xpath='reservationSet/item', namespace=NAMESPACE):
        nodes += self._to_nodes(rs, 'instancesSet/item')
    nodes_elastic_ips_mappings = self.ex_describe_addresses(nodes)
    for node in nodes:
        ips = nodes_elastic_ips_mappings[node.id]
        node.public_ips.extend(ips)
    return nodes
