Add support for filtering spot instance requests
This commit is contained in:
		
							parent
							
								
									f029fe672d
								
							
						
					
					
						commit
						8ac549569e
					
				| @ -1247,6 +1247,16 @@ class SpotInstanceRequest(BotoSpotRequest, TaggedEC2Instance): | ||||
|             default_group = ec2_backend.get_security_group_from_name("default") | ||||
|             ls.groups.append(default_group) | ||||
| 
 | ||||
|     def get_filter_value(self, filter_name): | ||||
|         if filter_name == 'state': | ||||
|             return self.state | ||||
|         elif filter_name.startswith('tag:'): | ||||
|             tag_name = filter_name.replace('tag:', '', 1) | ||||
|             tags = dict((tag['key'], tag['value']) for tag in self.get_tags()) | ||||
|             return tags.get(tag_name) | ||||
|         else: | ||||
|             ec2_backend.raise_not_implemented_error("The filter '{0}' for DescribeSpotInstanceRequests".format(filter_name)) | ||||
| 
 | ||||
| 
 | ||||
| @six.add_metaclass(Model) | ||||
| class SpotRequestBackend(object): | ||||
| @ -1273,8 +1283,14 @@ class SpotRequestBackend(object): | ||||
|         return requests | ||||
| 
 | ||||
|     @Model.prop('SpotInstanceRequest') | ||||
|     def describe_spot_instance_requests(self): | ||||
|         return self.spot_instance_requests.values() | ||||
|     def describe_spot_instance_requests(self, filters=None): | ||||
|         requests = self.spot_instance_requests.values() | ||||
| 
 | ||||
|         if filters: | ||||
|             for (_filter, _filter_value) in filters.items(): | ||||
|                 requests = [ request for request in requests if request.get_filter_value(_filter) in _filter_value ] | ||||
| 
 | ||||
|         return requests | ||||
| 
 | ||||
|     def cancel_spot_instance_requests(self, request_ids): | ||||
|         requests = [] | ||||
|  | ||||
| @ -3,6 +3,7 @@ from jinja2 import Template | ||||
| 
 | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.ec2.models import ec2_backend | ||||
| from moto.ec2.utils import filters_from_querystring | ||||
| 
 | ||||
| 
 | ||||
| class SpotInstances(BaseResponse): | ||||
| @ -30,7 +31,8 @@ class SpotInstances(BaseResponse): | ||||
|         raise NotImplementedError('SpotInstances.describe_spot_datafeed_subscription is not yet implemented') | ||||
| 
 | ||||
|     def describe_spot_instance_requests(self): | ||||
|         requests = ec2_backend.describe_spot_instance_requests() | ||||
|         filters = filters_from_querystring(self.querystring) | ||||
|         requests = ec2_backend.describe_spot_instance_requests(filters=filters) | ||||
|         template = Template(DESCRIBE_SPOT_INSTANCES_TEMPLATE) | ||||
|         return template.render(requests=requests) | ||||
| 
 | ||||
|  | ||||
| @ -146,3 +146,37 @@ def test_tag_spot_instance_request(): | ||||
| 
 | ||||
|     tag_dict = dict(request.tags) | ||||
|     tag_dict.should.equal({'tag1' : 'value1', 'tag2' : 'value2'}) | ||||
| 
 | ||||
| 
 | ||||
| @mock_ec2 | ||||
| def test_get_all_spot_instance_requests_filtering(): | ||||
|     """ | ||||
|     Test that moto correctly filters spot instance requests | ||||
|     """ | ||||
|     conn = boto.connect_ec2() | ||||
| 
 | ||||
|     request1 = conn.request_spot_instances( | ||||
|         price=0.5, image_id='ami-abcd1234', | ||||
|     ) | ||||
|     request2 = conn.request_spot_instances( | ||||
|         price=0.5, image_id='ami-abcd1234', | ||||
|     ) | ||||
|     request3 = conn.request_spot_instances( | ||||
|         price=0.5, image_id='ami-abcd1234', | ||||
|     ) | ||||
|     request1[0].add_tag('tag1', 'value1') | ||||
|     request1[0].add_tag('tag2', 'value2') | ||||
|     request2[0].add_tag('tag1', 'value1') | ||||
|     request2[0].add_tag('tag2', 'wrong') | ||||
| 
 | ||||
|     requests = conn.get_all_spot_instance_requests(filters={'state' : 'active'}) | ||||
|     requests.should.have.length_of(0) | ||||
| 
 | ||||
|     requests = conn.get_all_spot_instance_requests(filters={'state' : 'open'}) | ||||
|     requests.should.have.length_of(3) | ||||
| 
 | ||||
|     requests = conn.get_all_spot_instance_requests(filters={'tag:tag1' : 'value1'}) | ||||
|     requests.should.have.length_of(2) | ||||
| 
 | ||||
|     requests = conn.get_all_spot_instance_requests(filters={'tag:tag1' : 'value1', 'tag:tag2' : 'value2'}) | ||||
|     requests.should.have.length_of(1) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user