docs: def list_nodes(call=None):
      '''
      Return a list of the VMs
  
      id (str)
      image (str)
      size (str)
      state (str)
      private_ips (list)
      public_ips (list)
  
      '''
      if call == 'action':
          raise SaltCloudSystemExit(
              'The list_nodes function must be called '
              'with -f or --function.'
          )
  
      providers = __opts__.get('providers', {})
  
      ret = {}
      providers_to_check = [_f for _f in [cfg.get('libvirt') for cfg in six.itervalues(providers)] if _f]
      for provider in providers_to_check:
          conn = __get_conn(provider['url'])
          domains = conn.listAllDomains()
          for domain in domains:
              data = {
                  'id': domain.UUIDString(),
                  'image': '',
                  'size': '',
                  'state': VIRT_STATE_NAME_MAP[domain.state()[0]],
                  'private_ips': [],
                  'public_ips': get_domain_ips(domain, libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE)}
              # TODO: Annoyingly name is not guaranteed to be unique, but the id will not work in other places
              ret[domain.name()] = data
  
      return ret