From 573a73aa0123dc1aca3052bd30c80ae18a95e71c Mon Sep 17 00:00:00 2001 From: Cameron Rowshanbin Date: Wed, 10 Dec 2014 11:53:40 -0600 Subject: [PATCH] With @ethome, add filtering of instances by security group id --- moto/ec2/utils.py | 13 ++++++++++++- tests/test_ec2/test_instances.py | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/moto/ec2/utils.py b/moto/ec2/utils.py index 6ff04821c..90cf607e7 100644 --- a/moto/ec2/utils.py +++ b/moto/ec2/utils.py @@ -324,16 +324,20 @@ filter_dict_attribute_mapping = { 'state-reason-code': '_state_reason.code', 'source-dest-check': 'source_dest_check', 'vpc-id': 'vpc_id', + 'group-id': 'security_groups', + 'instance.group-id': 'security_groups' } def passes_filter_dict(instance, filter_dict): for filter_name, filter_values in filter_dict.items(): + if filter_name in filter_dict_attribute_mapping: instance_attr = filter_dict_attribute_mapping[filter_name] instance_value = get_object_value(instance, instance_attr) - if instance_value not in filter_values: + if not instance_value_in_filter_values(instance_value, filter_values): return False + elif is_tag_filter(filter_name): if not tag_filter_matches(instance, filter_name, filter_values): return False @@ -343,6 +347,13 @@ def passes_filter_dict(instance, filter_dict): filter_name) return True +def instance_value_in_filter_values(instance_value, filter_values): + if isinstance(instance_value, list): + if not set(filter_values).intersection(set(instance_value)): + return False + elif instance_value not in filter_values: + return False + return True def filter_reservations(reservations, filter_dict): result = [] diff --git a/tests/test_ec2/test_instances.py b/tests/test_ec2/test_instances.py index a63f939b1..4036f1214 100644 --- a/tests/test_ec2/test_instances.py +++ b/tests/test_ec2/test_instances.py @@ -600,3 +600,18 @@ def test_describe_instance_status_with_non_running_instances(): status3 = next((s for s in all_status if s.id == instance3.id), None) status3.state_name.should.equal('running') + +@mock_ec2 +def test_get_instance_by_security_group(): + conn = boto.connect_ec2('the_key', 'the_secret') + + conn.run_instances('ami-1234abcd') + instance = conn.get_only_instances()[0] + + security_group = conn.create_security_group('test', 'test') + conn.modify_instance_attribute(instance.id, "groupSet", [security_group.id]) + + security_group_instances = security_group.instances() + + assert len(security_group_instances) == 1 + assert security_group_instances[0].id == instance.id