'List all nodes across all vDCs. Using \'vdcs\' you can specify which vDCs
should be queried.
:param vdcs: None, vDC or a list of vDCs to query. If None all vDCs
will be queried.
:type vdcs: :class:`Vdc`
:rtype: ``list`` of :class:`Node`'

def ex_list_nodes(self, vdcs=None):

    if (not vdcs):
        vdcs = self.vdcs
    if (not isinstance(vdcs, (list, tuple))):
        vdcs = [vdcs]
    nodes = []
    for vdc in vdcs:
        res = self.connection.request(get_url_path(vdc.id))
        elms = res.object.findall(fixxpath(res.object, 'ResourceEntities/ResourceEntity'))
        vapps = [(i.get('name'), i.get('href')) for i in elms if ((i.get('type') == 'application/vnd.vmware.vcloud.vApp+xml') and i.get('name'))]
        for (vapp_name, vapp_href) in vapps:
            try:
                res = self.connection.request(get_url_path(vapp_href), headers={'Content-Type': 'application/vnd.vmware.vcloud.vApp+xml'})
                nodes.append(self._to_node(res.object))
            except Exception:
                e = sys.exc_info()[1]
                if (not (e.args[0].tag.endswith('Error') and (e.args[0].get('minorErrorCode') == 'ACCESS_TO_RESOURCE_IS_FORBIDDEN'))):
                    raise
    return nodes
