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