'List images on a provider.
@inherits :class:`NodeDriver.list_images`
:keyword ex_image_ids: a list of image ids to filter the images to
be returned.
:type ex_image_ids: ``list`` of ``str``
:keyword ex_filters: image attribute and value pairs to filter
images. Only the image which matchs all
the pairs will be returned.
If the filter attribute need a json array value,
use ``list`` object, the driver will convert it.
:type ex_filters: ``dict``'

def list_images(self, location=None, ex_image_ids=None, ex_filters=None):

    if (location and isinstance(location, NodeLocation)):
        region = location.id
    else:
        region = self.region
    params = {'Action': 'DescribeImages', 'RegionId': region}
    if ex_image_ids:
        if isinstance(ex_image_ids, list):
            params['ImageId'] = ','.join(ex_image_ids)
        else:
            raise AttributeError('ex_image_ids    should    be    a    list    of    image    ids')
    if (ex_filters and isinstance(ex_filters, dict)):
        for key in ex_filters.keys():
            params[key] = ex_filters[key]
    def _parse_response(resp_body):
        image_elements = findall(resp_body, 'Images/Image', namespace=self.namespace)
        images = [self._to_image(each) for each in image_elements]
        return images
    return self._request_multiple_pages(self.path, params, _parse_response)
