docs: def list_nodes_full(call=None):
      '''
      Return a list of the VMs that are on the provider
      '''
      if call == 'action':
          raise SaltCloudSystemExit(
              'The list_nodes_full function must be called with -f '
              'or --function.'
          )
  
      ret = {}
      location = get_location()
      params = {
          'Action': 'DescribeInstanceStatus',
          'RegionId': location,
          'PageSize': '50'
      }
      result = query(params=params)
  
      log.debug(
          'Total %s instance found in Region %s',
          result['TotalCount'], location
      )
      if 'Code' in result or result['TotalCount'] == 0:
          return ret
  
      # aliyun max 100 top instance in api
      result_instancestatus = result['InstanceStatuses']['InstanceStatus']
      if result['TotalCount'] > 50:
          params['PageNumber'] = '2'
          result = query(params=params)
          result_instancestatus.update(result['InstanceStatuses']['InstanceStatus'])
  
      for node in result_instancestatus:
  
          instanceId = node.get('InstanceId', '')
  
          params = {
              'Action': 'DescribeInstanceAttribute',
              'InstanceId': instanceId
          }
          items = query(params=params)
          if 'Code' in items:
              log.warning('Query instance:%s attribute failed', instanceId)
              continue
  
          name = items['InstanceName']
          ret[name] = {
              'id': items['InstanceId'],
              'name': name,
              'image': items['ImageId'],
              'size': 'TODO',
              'state': items['Status']
          }
          for item in items:
              value = items[item]
              if value is not None:
                  value = six.text_type(value)
              if item == "PublicIpAddress":
                  ret[name]['public_ips'] = items[item]['IpAddress']
              if item == "InnerIpAddress" and 'private_ips' not in ret[name]:
                  ret[name]['private_ips'] = items[item]['IpAddress']
              if item == 'VpcAttributes':
                  vpc_ips = items[item]['PrivateIpAddress']['IpAddress']
                  if vpc_ips:
                      ret[name]['private_ips'] = vpc_ips
              ret[name][item] = value
  
      provider = __active_provider_name__ or 'aliyun'
      if ':' in provider:
          comps = provider.split(':')
          provider = comps[0]
  
      __opts__['update_cachedir'] = True
      __utils__['cloud.cache_node_list'](ret, provider, __opts__)
  
      return ret