Add ability to launch instances with security groups.
This commit is contained in:
parent
fc8fd79cd8
commit
140f1c2000
@ -106,7 +106,8 @@ class FakeAutoScalingGroup(object):
|
|||||||
reservation = ec2_backend.add_instances(
|
reservation = ec2_backend.add_instances(
|
||||||
self.launch_config.image_id,
|
self.launch_config.image_id,
|
||||||
count_needed,
|
count_needed,
|
||||||
self.launch_config.user_data
|
self.launch_config.user_data,
|
||||||
|
self.launch_config.security_groups,
|
||||||
)
|
)
|
||||||
for instance in reservation.instances:
|
for instance in reservation.instances:
|
||||||
instance.autoscaling_group = self
|
instance.autoscaling_group = self
|
||||||
|
@ -30,12 +30,13 @@ class InstanceState(object):
|
|||||||
|
|
||||||
|
|
||||||
class Instance(BotoInstance):
|
class Instance(BotoInstance):
|
||||||
def __init__(self, image_id, user_data):
|
def __init__(self, image_id, user_data, security_groups):
|
||||||
super(Instance, self).__init__()
|
super(Instance, self).__init__()
|
||||||
self.id = random_instance_id()
|
self.id = random_instance_id()
|
||||||
self.image_id = image_id
|
self.image_id = image_id
|
||||||
self._state = InstanceState("running", 16)
|
self._state = InstanceState("running", 16)
|
||||||
self.user_data = user_data
|
self.user_data = user_data
|
||||||
|
self.security_groups = security_groups
|
||||||
|
|
||||||
def start(self, *args, **kwargs):
|
def start(self, *args, **kwargs):
|
||||||
self._state.name = "running"
|
self._state.name = "running"
|
||||||
@ -69,13 +70,16 @@ class InstanceBackend(object):
|
|||||||
if instance.id == instance_id:
|
if instance.id == instance_id:
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
def add_instances(self, image_id, count, user_data):
|
def add_instances(self, image_id, count, user_data, security_group_names):
|
||||||
new_reservation = Reservation()
|
new_reservation = Reservation()
|
||||||
new_reservation.id = random_reservation_id()
|
new_reservation.id = random_reservation_id()
|
||||||
|
|
||||||
|
security_groups = [self.get_security_group_from_name(name) for name in security_group_names]
|
||||||
for index in range(count):
|
for index in range(count):
|
||||||
new_instance = Instance(
|
new_instance = Instance(
|
||||||
image_id,
|
image_id,
|
||||||
user_data,
|
user_data,
|
||||||
|
security_groups,
|
||||||
)
|
)
|
||||||
new_reservation.instances.append(new_instance)
|
new_reservation.instances.append(new_instance)
|
||||||
self.reservations[new_reservation.id] = new_reservation
|
self.reservations[new_reservation.id] = new_reservation
|
||||||
@ -369,7 +373,7 @@ class SecurityGroupBackend(object):
|
|||||||
return vpc.pop(group_id)
|
return vpc.pop(group_id)
|
||||||
elif name:
|
elif name:
|
||||||
# Group Name. Has to be in standard EC2, VPC needs to be identified by group_id
|
# Group Name. Has to be in standard EC2, VPC needs to be identified by group_id
|
||||||
group = self.get_security_group_from_name(name, None)
|
group = self.get_security_group_from_name(name)
|
||||||
if group:
|
if group:
|
||||||
return self.groups[None].pop(group.id)
|
return self.groups[None].pop(group.id)
|
||||||
|
|
||||||
@ -381,9 +385,7 @@ class SecurityGroupBackend(object):
|
|||||||
if group.id == group_id:
|
if group.id == group_id:
|
||||||
return group
|
return group
|
||||||
|
|
||||||
|
def get_security_group_from_name(self, name, vpc_id=None):
|
||||||
|
|
||||||
def get_security_group_from_name(self, name, vpc_id):
|
|
||||||
for group_id, group in self.groups[vpc_id].iteritems():
|
for group_id, group in self.groups[vpc_id].iteritems():
|
||||||
if group.name == name:
|
if group.name == name:
|
||||||
return group
|
return group
|
||||||
@ -441,7 +443,6 @@ class SecurityGroupBackend(object):
|
|||||||
elif group_id:
|
elif group_id:
|
||||||
group = self.get_security_group_from_id(group_id)
|
group = self.get_security_group_from_id(group_id)
|
||||||
|
|
||||||
|
|
||||||
source_groups = []
|
source_groups = []
|
||||||
for source_group_name in source_group_names:
|
for source_group_name in source_group_names:
|
||||||
source_group = self.get_security_group_from_name(source_group_name, vpc_id)
|
source_group = self.get_security_group_from_name(source_group_name, vpc_id)
|
||||||
@ -627,12 +628,12 @@ class SpotInstanceRequest(object):
|
|||||||
self.security_groups = []
|
self.security_groups = []
|
||||||
if security_groups:
|
if security_groups:
|
||||||
for group_name in security_groups:
|
for group_name in security_groups:
|
||||||
group = ec2_backend.get_security_group_from_name(group_name, None)
|
group = ec2_backend.get_security_group_from_name(group_name)
|
||||||
if group:
|
if group:
|
||||||
self.security_groups.append(group)
|
self.security_groups.append(group)
|
||||||
else:
|
else:
|
||||||
# If not security groups, add the default
|
# If not security groups, add the default
|
||||||
default_group = ec2_backend.get_security_group_from_name("default", None)
|
default_group = ec2_backend.get_security_group_from_name("default")
|
||||||
self.security_groups.append(default_group)
|
self.security_groups.append(default_group)
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,6 +8,9 @@ from moto.ec2.exceptions import InvalidIdError
|
|||||||
|
|
||||||
|
|
||||||
class InstanceResponse(BaseResponse):
|
class InstanceResponse(BaseResponse):
|
||||||
|
def _get_multi_param(self, param_prefix):
|
||||||
|
return [value[0] for key, value in self.querystring.items() if key.startswith(param_prefix)]
|
||||||
|
|
||||||
def describe_instances(self):
|
def describe_instances(self):
|
||||||
instance_ids = instance_ids_from_querystring(self.querystring)
|
instance_ids = instance_ids_from_querystring(self.querystring)
|
||||||
if instance_ids:
|
if instance_ids:
|
||||||
@ -29,7 +32,8 @@ class InstanceResponse(BaseResponse):
|
|||||||
min_count = int(self.querystring.get('MinCount', ['1'])[0])
|
min_count = int(self.querystring.get('MinCount', ['1'])[0])
|
||||||
image_id = self.querystring.get('ImageId')[0]
|
image_id = self.querystring.get('ImageId')[0]
|
||||||
user_data = self.querystring.get('UserData')
|
user_data = self.querystring.get('UserData')
|
||||||
new_reservation = ec2_backend.add_instances(image_id, min_count, user_data)
|
security_group_names = self._get_multi_param('SecurityGroup')
|
||||||
|
new_reservation = ec2_backend.add_instances(image_id, min_count, user_data, security_group_names)
|
||||||
template = Template(EC2_RUN_INSTANCES)
|
template = Template(EC2_RUN_INSTANCES)
|
||||||
return template.render(reservation=new_reservation)
|
return template.render(reservation=new_reservation)
|
||||||
|
|
||||||
@ -119,10 +123,12 @@ EC2_RUN_INSTANCES = """<RunInstancesResponse xmlns="http://ec2.amazonaws.com/doc
|
|||||||
</monitoring>
|
</monitoring>
|
||||||
<sourceDestCheck>true</sourceDestCheck>
|
<sourceDestCheck>true</sourceDestCheck>
|
||||||
<groupSet>
|
<groupSet>
|
||||||
|
{% for group in instance.security_groups %}
|
||||||
<item>
|
<item>
|
||||||
<groupId>sg-245f6a01</groupId>
|
<groupId>{{ group.id }}</groupId>
|
||||||
<groupName>default</groupName>
|
<groupName>{{ group.name }}</groupName>
|
||||||
</item>
|
</item>
|
||||||
|
{% endfor %}
|
||||||
</groupSet>
|
</groupSet>
|
||||||
<virtualizationType>paravirtual</virtualizationType>
|
<virtualizationType>paravirtual</virtualizationType>
|
||||||
<clientToken/>
|
<clientToken/>
|
||||||
@ -140,12 +146,7 @@ EC2_DESCRIBE_INSTANCES = """<DescribeInstancesResponse xmlns='http://ec2.amazona
|
|||||||
<item>
|
<item>
|
||||||
<reservationId>{{ reservation.id }}</reservationId>
|
<reservationId>{{ reservation.id }}</reservationId>
|
||||||
<ownerId>111122223333</ownerId>
|
<ownerId>111122223333</ownerId>
|
||||||
<groupSet>
|
<groupSet></groupSet>
|
||||||
<item>
|
|
||||||
<groupId>sg-1a2b3c4d</groupId>
|
|
||||||
<groupName>my-security-group</groupName>
|
|
||||||
</item>
|
|
||||||
</groupSet>
|
|
||||||
<instancesSet>
|
<instancesSet>
|
||||||
{% for instance in reservation.instances %}
|
{% for instance in reservation.instances %}
|
||||||
<item>
|
<item>
|
||||||
@ -178,10 +179,12 @@ EC2_DESCRIBE_INSTANCES = """<DescribeInstancesResponse xmlns='http://ec2.amazona
|
|||||||
<ipAddress>46.51.219.63</ipAddress>
|
<ipAddress>46.51.219.63</ipAddress>
|
||||||
<sourceDestCheck>true</sourceDestCheck>
|
<sourceDestCheck>true</sourceDestCheck>
|
||||||
<groupSet>
|
<groupSet>
|
||||||
|
{% for group in instance.security_groups %}
|
||||||
<item>
|
<item>
|
||||||
<groupId>sg-1a2b3c4d</groupId>
|
<groupId>{{ group.id }}</groupId>
|
||||||
<groupName>my-security-group</groupName>
|
<groupName>{{ group.name }}</groupName>
|
||||||
</item>
|
</item>
|
||||||
|
{% endfor %}
|
||||||
</groupSet>
|
</groupSet>
|
||||||
<architecture>x86_64</architecture>
|
<architecture>x86_64</architecture>
|
||||||
<rootDeviceType>ebs</rootDeviceType>
|
<rootDeviceType>ebs</rootDeviceType>
|
||||||
|
@ -170,3 +170,15 @@ def test_user_data_with_run_instance():
|
|||||||
instance_attribute.should.be.a(InstanceAttribute)
|
instance_attribute.should.be.a(InstanceAttribute)
|
||||||
decoded_user_data = base64.decodestring(instance_attribute.get("userData"))
|
decoded_user_data = base64.decodestring(instance_attribute.get("userData"))
|
||||||
decoded_user_data.should.equal("some user data")
|
decoded_user_data.should.equal("some user data")
|
||||||
|
|
||||||
|
|
||||||
|
@mock_ec2
|
||||||
|
def test_run_instance_with_security_group():
|
||||||
|
conn = boto.connect_ec2('the_key', 'the_secret')
|
||||||
|
group = conn.create_security_group('group1', "some description")
|
||||||
|
|
||||||
|
reservation = conn.run_instances('ami-1234abcd', security_groups=['group1'])
|
||||||
|
instance = reservation.instances[0]
|
||||||
|
|
||||||
|
instance.groups[0].id.should.equal(group.id)
|
||||||
|
instance.groups[0].name.should.equal("group1")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user