Fetch all instances in a GCE project.

        You can find the endpoint documentation `here <https://cloud.
        google.com/compute/docs/reference/latest/instances/
        aggregatedList>`__.

        Args:
            project (str): unique, user-provided project ID.
            page_size (int): hint for the client to only retrieve up to
                this number of results per API call.
            instance_filter (str): endpoint-specific filter string used
                to retrieve a subset of instances. This is passed
                directly to the endpoint's "filter" URL query parameter.
        Returns:
            list(dicts): data of all instances in the given
                :obj:`project`

async def list_instances(self,
                             project,
                             page_size=100,
                             instance_filter=None):
        """Fetch all instances in a GCE project.

        You can find the endpoint documentation `here <https://cloud.
        google.com/compute/docs/reference/latest/instances/
        aggregatedList>`__.

        Args:
            project (str): unique, user-provided project ID.
            page_size (int): hint for the client to only retrieve up to
                this number of results per API call.
            instance_filter (str): endpoint-specific filter string used
                to retrieve a subset of instances. This is passed
                directly to the endpoint's "filter" URL query parameter.
        Returns:
            list(dicts): data of all instances in the given
                :obj:`project`
        """
        url = (f'{self.BASE_URL}{self.api_version}/projects/{project}'
               '/aggregated/instances')
        params = {'maxResults': page_size}
        if instance_filter:
            params['filter'] = instance_filter

        responses = await self.list_all(url, params)
        instances = self._parse_rsps_for_instances(responses)
        return instances