Move filter logic from responses.InstanceResponse to models.InstanceBackend

This commit is contained in:
Hugo Lopes Tavares 2014-11-05 14:20:49 -05:00
parent 88684f10f2
commit aa3cf9c806
2 changed files with 14 additions and 10 deletions

View File

@ -85,6 +85,7 @@ from .utils import (
simple_aws_filter_to_re, simple_aws_filter_to_re,
is_valid_cidr, is_valid_cidr,
filter_internet_gateways, filter_internet_gateways,
filter_reservations,
) )
@ -588,7 +589,7 @@ class InstanceBackend(object):
if instance.id == instance_id: if instance.id == instance_id:
return instance return instance
def get_reservations_by_instance_ids(self, instance_ids): def get_reservations_by_instance_ids(self, instance_ids, filters=None):
""" Go through all of the reservations and filter to only return those """ Go through all of the reservations and filter to only return those
associated with the given instance_ids. associated with the given instance_ids.
""" """
@ -605,15 +606,20 @@ class InstanceBackend(object):
if len(found_instance_ids) != len(instance_ids): if len(found_instance_ids) != len(instance_ids):
invalid_id = list(set(instance_ids).difference(set(found_instance_ids)))[0] invalid_id = list(set(instance_ids).difference(set(found_instance_ids)))[0]
raise InvalidInstanceIdError(invalid_id) raise InvalidInstanceIdError(invalid_id)
if filters is not None:
reservations = filter_reservations(reservations, filters)
return reservations return reservations
def all_reservations(self, make_copy=False): def all_reservations(self, make_copy=False, filters=None):
if make_copy: if make_copy:
# Return copies so that other functions can modify them with changing # Return copies so that other functions can modify them with changing
# the originals # the originals
return [copy.deepcopy(reservation) for reservation in self.reservations.values()] reservations = [copy.deepcopy(reservation) for reservation in self.reservations.values()]
else: else:
return [reservation for reservation in self.reservations.values()] reservations = [reservation for reservation in self.reservations.values()]
if filters is not None:
reservations = filter_reservations(reservations, filters)
return reservations
class KeyPairBackend(object): class KeyPairBackend(object):

View File

@ -3,20 +3,18 @@ from jinja2 import Template
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from moto.core.utils import camelcase_to_underscores from moto.core.utils import camelcase_to_underscores
from moto.ec2.utils import instance_ids_from_querystring, filters_from_querystring, filter_reservations, \ from moto.ec2.utils import instance_ids_from_querystring, filters_from_querystring, \
dict_from_querystring, optional_from_querystring dict_from_querystring, optional_from_querystring
class InstanceResponse(BaseResponse): class InstanceResponse(BaseResponse):
def describe_instances(self): def describe_instances(self):
filter_dict = filters_from_querystring(self.querystring)
instance_ids = instance_ids_from_querystring(self.querystring) instance_ids = instance_ids_from_querystring(self.querystring)
if instance_ids: if instance_ids:
reservations = self.ec2_backend.get_reservations_by_instance_ids(instance_ids) reservations = self.ec2_backend.get_reservations_by_instance_ids(instance_ids, filters=filter_dict)
else: else:
reservations = self.ec2_backend.all_reservations(make_copy=True) reservations = self.ec2_backend.all_reservations(make_copy=True, filters=filter_dict)
filter_dict = filters_from_querystring(self.querystring)
reservations = filter_reservations(reservations, filter_dict)
template = Template(EC2_DESCRIBE_INSTANCES) template = Template(EC2_DESCRIBE_INSTANCES)
return template.render(reservations=reservations) return template.render(reservations=reservations)