From 584f1f01b68367333a40134bfd093dcd2d5c9ad5 Mon Sep 17 00:00:00 2001 From: Steve Pulec Date: Tue, 5 Mar 2013 22:33:41 -0500 Subject: [PATCH] add vpc commands --- moto/ec2/models.py | 29 +++++++++++++++++- moto/ec2/responses/vpcs.py | 59 ++++++++++++++++++++++++++++++++++--- moto/ec2/utils.py | 4 +++ tests/test_ec2/test_vpcs.py | 16 +++++++++- 4 files changed, 102 insertions(+), 6 deletions(-) diff --git a/moto/ec2/models.py b/moto/ec2/models.py index ca75cf770..a921fc571 100644 --- a/moto/ec2/models.py +++ b/moto/ec2/models.py @@ -10,6 +10,7 @@ from .utils import ( random_security_group_id, random_snapshot_id, random_volume_id, + random_vpc_id, ) @@ -390,7 +391,33 @@ class EBSBackend(object): return False -class EC2Backend(BaseBackend, InstanceBackend, TagBackend, AmiBackend, RegionsAndZonesBackend, SecurityGroupBackend, EBSBackend): +class VPC(object): + def __init__(self, vpc_id, cidr_block): + self.id = vpc_id + self.cidr_block = cidr_block + + +class VPCBackend(object): + def __init__(self): + self.vpcs = {} + super(VPCBackend, self).__init__() + + def create_vpc(self, cidr_block): + vpc_id = random_vpc_id() + vpc = VPC(vpc_id, cidr_block) + self.vpcs[vpc_id] = vpc + return vpc + + def get_all_vpcs(self): + return self.vpcs.values() + + def delete_vpc(self, vpc_id): + return self.vpcs.pop(vpc_id, None) + + +class EC2Backend(BaseBackend, InstanceBackend, TagBackend, AmiBackend, + RegionsAndZonesBackend, SecurityGroupBackend, EBSBackend, + VPCBackend): pass diff --git a/moto/ec2/responses/vpcs.py b/moto/ec2/responses/vpcs.py index c2c954f11..857b9b2bb 100644 --- a/moto/ec2/responses/vpcs.py +++ b/moto/ec2/responses/vpcs.py @@ -1,15 +1,66 @@ from jinja2 import Template from moto.ec2.models import ec2_backend -from moto.ec2.utils import resource_ids_from_querystring class VPCs(object): + def __init__(self, querystring): + self.querystring = querystring + def create_vpc(self): - raise NotImplementedError('VPCs(AmazonVPC).create_vpc is not yet implemented') + cidr_block = self.querystring.get('CidrBlock')[0] + vpc = ec2_backend.create_vpc(cidr_block) + template = Template(CREATE_VPC_RESPONSE) + return template.render(vpc=vpc) def delete_vpc(self): - raise NotImplementedError('VPCs(AmazonVPC).delete_vpc is not yet implemented') + vpc_id = self.querystring.get('VpcId')[0] + vpc = ec2_backend.delete_vpc(vpc_id) + if vpc: + template = Template(DELETE_VPC_RESPONSE) + return template.render(vpc=vpc) + else: + return "", dict(status=404) def describe_vpcs(self): - raise NotImplementedError('VPCs(AmazonVPC).describe_vpcs is not yet implemented') + vpcs = ec2_backend.get_all_vpcs() + template = Template(DESCRIBE_VPCS_RESPONSE) + return template.render(vpcs=vpcs) + + +CREATE_VPC_RESPONSE = """ + + 7a62c49f-347e-4fc4-9331-6e8eEXAMPLE + + {{ vpc.id }} + pending + {{ vpc.cidr_block }} + dopt-1a2b3c4d2 + default + + +""" + +DESCRIBE_VPCS_RESPONSE = """ + + 7a62c49f-347e-4fc4-9331-6e8eEXAMPLE + + {% for vpc in vpcs %} + + {{ vpc.id }} + available + {{ vpc.cidr_block }} + dopt-7a8b9c2d + default + + + {% endfor %} + +""" + +DELETE_VPC_RESPONSE = """ + + 7a62c49f-347e-4fc4-9331-6e8eEXAMPLE + true + +""" diff --git a/moto/ec2/utils.py b/moto/ec2/utils.py index 6a7667c95..a12ac153b 100644 --- a/moto/ec2/utils.py +++ b/moto/ec2/utils.py @@ -29,6 +29,10 @@ def random_volume_id(): return random_id(prefix='vol') +def random_vpc_id(): + return random_id(prefix='vpc') + + def random_snapshot_id(): return random_id(prefix='snap') diff --git a/tests/test_ec2/test_vpcs.py b/tests/test_ec2/test_vpcs.py index 703612a0f..cdf28ee55 100644 --- a/tests/test_ec2/test_vpcs.py +++ b/tests/test_ec2/test_vpcs.py @@ -1,4 +1,5 @@ import boto +from boto.exception import EC2ResponseError import sure # flake8: noqa from moto import mock_ec2 @@ -6,4 +7,17 @@ from moto import mock_ec2 @mock_ec2 def test_vpcs(): - pass + conn = boto.connect_vpc('the_key', 'the_secret') + vpc = conn.create_vpc("10.0.0.0/16") + vpc.cidr_block.should.equal('10.0.0.0/16') + + all_vpcs = conn.get_all_vpcs() + all_vpcs.should.have.length_of(1) + + vpc.delete() + + all_vpcs = conn.get_all_vpcs() + all_vpcs.should.have.length_of(0) + + conn.delete_vpc.when.called_with( + "vpc-1234abcd").should.throw(EC2ResponseError)