Merge lp:~franciscosouza/txaws/txaws-bundled-vpc into lp:txaws

Proposed by Francisco Souza
Status: Merged
Merged at revision: 153
Proposed branch: lp:~franciscosouza/txaws/txaws-bundled-vpc
Merge into: lp:txaws
Diff against target: 945 lines (+354/-95)
9 files modified
txaws/client/base.py (+24/-9)
txaws/client/discover/tests/test_command.py (+8/-8)
txaws/ec2/client.py (+55/-19)
txaws/ec2/model.py (+2/-1)
txaws/ec2/tests/test_client.py (+217/-35)
txaws/ec2/tests/test_model.py (+6/-4)
txaws/server/tests/test_call.py (+1/-1)
txaws/testing/payload.py (+40/-17)
txaws/version.py (+1/-1)
To merge this branch: bzr merge lp:~franciscosouza/txaws/txaws-bundled-vpc
Reviewer Review Type Date Requested Status
txAWS Committers Pending
Review via email: mp+135397@code.launchpad.net

Description of the change

client, ec2: bundling changes needed for VPC

I use this CL for patching only, original CL's are:

https://codereview.appspot.com/6852064/
https://codereview.appspot.com/6826065/
https://codereview.appspot.com/6814123/
https://codereview.appspot.com/6822097/

This one also includes a change in parsing of instance sets.

https://codereview.appspot.com/6851093/

To post a comment you must log in.
Revision history for this message
Chico (franciscossouza) wrote :

Reviewers: mp+135397_code.launchpad.net,

Message:
Please take a look.

Description:
client, ec2: bundling changes needed for VPC

I use this CL for patching only, original CL's are:

https://codereview.appspot.com/6852064/
https://codereview.appspot.com/6826065/
https://codereview.appspot.com/6814123/
https://codereview.appspot.com/6822097/

This one also includes a change in parsing of instance sets.

https://code.launchpad.net/~franciscosouza/txaws/txaws-bundled-vpc/+merge/135397

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/6851093/

Affected files:
   A [revision details]
   M txaws/client/base.py
   M txaws/client/discover/tests/test_command.py
   M txaws/ec2/client.py
   M txaws/ec2/model.py
   M txaws/ec2/tests/test_client.py
   M txaws/ec2/tests/test_model.py
   M txaws/server/tests/test_call.py
   M txaws/testing/payload.py
   M txaws/version.py

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'txaws/client/base.py'
--- txaws/client/base.py 2012-05-16 02:35:26 +0000
+++ txaws/client/base.py 2012-11-21 12:35:25 +0000
@@ -1,3 +1,6 @@
1import os
2import urlparse
3
1try:4try:
2 from xml.etree.ElementTree import ParseError5 from xml.etree.ElementTree import ParseError
3except ImportError:6except ImportError:
@@ -6,16 +9,16 @@
6import warnings9import warnings
7from StringIO import StringIO10from StringIO import StringIO
811
12from twisted.internet.endpoints import TCP4ClientEndpoint
9from twisted.internet.ssl import ClientContextFactory13from twisted.internet.ssl import ClientContextFactory
10from twisted.internet.protocol import Protocol14from twisted.internet.protocol import Protocol
11from twisted.internet.defer import Deferred, succeed, fail15from twisted.internet.defer import Deferred, succeed, fail
12from twisted.python import failure16from twisted.python import failure
13from twisted.web import http17from twisted.web import http
14from twisted.web.iweb import UNKNOWN_LENGTH18from twisted.web.iweb import UNKNOWN_LENGTH
15from twisted.web.client import HTTPClientFactory19from twisted.web.client import Agent, ProxyAgent
16from twisted.web.client import Agent
17from twisted.web.client import ResponseDone20from twisted.web.client import ResponseDone
18from twisted.web.http import NO_CONTENT21from twisted.web.http import NO_CONTENT, PotentialDataLoss
19from twisted.web.http_headers import Headers22from twisted.web.http_headers import Headers
20from twisted.web.error import Error as TwistedWebError23from twisted.web.error import Error as TwistedWebError
21try:24try:
@@ -130,7 +133,7 @@
130 self._received += len(bytes)133 self._received += len(bytes)
131134
132 def connectionLost(self, reason):135 def connectionLost(self, reason):
133 reason.trap(ResponseDone)136 reason.trap(ResponseDone, PotentialDataLoss)
134 d = self.finished137 d = self.finished
135 self.finished = None138 self.finished = None
136 streaming = self.content_length is UNKNOWN_LENGTH139 streaming = self.content_length is UNKNOWN_LENGTH
@@ -220,16 +223,28 @@
220 if (self.body_producer is None) and (data is not None):223 if (self.body_producer is None) and (data is not None):
221 self.body_producer = FileBodyProducer(StringIO(data))224 self.body_producer = FileBodyProducer(StringIO(data))
222 if scheme == "https":225 if scheme == "https":
223 if self.endpoint.ssl_hostname_verification:226 proxy_endpoint = os.environ.get("https_proxy")
224 contextFactory = WebVerifyingContextFactory(host)227 if proxy_endpoint:
228 proxy_url = urlparse.urlparse(proxy_endpoint)
229 endpoint = TCP4ClientEndpoint(self.reactor, proxy_url.hostname, proxy_url.port)
230 agent = ProxyAgent(endpoint)
225 else:231 else:
226 contextFactory = WebClientContextFactory()232 if self.endpoint.ssl_hostname_verification:
227 agent = Agent(self.reactor, contextFactory)233 contextFactory = WebVerifyingContextFactory(host)
234 else:
235 contextFactory = WebClientContextFactory()
236 agent = Agent(self.reactor, contextFactory)
228 self.client.url = url237 self.client.url = url
229 d = agent.request(method, url, self.request_headers,238 d = agent.request(method, url, self.request_headers,
230 self.body_producer)239 self.body_producer)
231 else:240 else:
232 agent = Agent(self.reactor)241 proxy_endpoint = os.environ.get("http_proxy")
242 if proxy_endpoint:
243 proxy_url = urlparse.urlparse(proxy_endpoint)
244 endpoint = TCP4ClientEndpoint(self.reactor, proxy_url.hostname, proxy_url.port)
245 agent = ProxyAgent(endpoint)
246 else:
247 agent = Agent(self.reactor)
233 d = agent.request(method, url, self.request_headers,248 d = agent.request(method, url, self.request_headers,
234 self.body_producer)249 self.body_producer)
235 d.addCallback(self._handle_response)250 d.addCallback(self._handle_response)
236251
=== modified file 'txaws/client/discover/tests/test_command.py'
--- txaws/client/discover/tests/test_command.py 2012-01-27 02:10:24 +0000
+++ txaws/client/discover/tests/test_command.py 2012-11-21 12:35:25 +0000
@@ -74,9 +74,9 @@
74 url = (74 url = (
75 "http://endpoint?AWSAccessKeyId=key&"75 "http://endpoint?AWSAccessKeyId=key&"
76 "Action=DescribeRegions&"76 "Action=DescribeRegions&"
77 "Signature=3%2BHSkQQosF1Sr9AL3kdY31tEfTWQ2whjJOUSc3kvc2c%3D&"77 "Signature=7fyxNidMkL%2B85udGOxqm%2BgM2o1gLyeLG2a0UOmfBOXQ%3D&"
78 "SignatureMethod=HmacSHA256&SignatureVersion=2&"78 "SignatureMethod=HmacSHA256&SignatureVersion=2&"
79 "Timestamp=2010-06-04T23%3A40%3A00Z&Version=2009-11-30")79 "Timestamp=2010-06-04T23%3A40%3A00Z&Version=2012-08-15")
80 self.assertEqual("GET", self.method)80 self.assertEqual("GET", self.method)
81 self.assertEqual(url, self.url)81 self.assertEqual(url, self.url)
82 self.assertEqual("URL: %s\n"82 self.assertEqual("URL: %s\n"
@@ -99,9 +99,9 @@
99 url = (99 url = (
100 "http://endpoint?AWSAccessKeyId=key&"100 "http://endpoint?AWSAccessKeyId=key&"
101 "Action=DescribeRegions&RegionName.0=us-west-1&"101 "Action=DescribeRegions&RegionName.0=us-west-1&"
102 "Signature=6D8aCgSPQOYixowRHy26aRFzK2Vwgixl9uwegYX9nLA%3D&"102 "Signature=FL4JjDKbWdg531q1KKUPild%2BvyqspA5wxSmOeWXWsJI%3D&"
103 "SignatureMethod=HmacSHA256&SignatureVersion=2&"103 "SignatureMethod=HmacSHA256&SignatureVersion=2&"
104 "Timestamp=2010-06-04T23%3A40%3A00Z&Version=2009-11-30")104 "Timestamp=2010-06-04T23%3A40%3A00Z&Version=2012-08-15")
105 self.assertEqual("GET", self.method)105 self.assertEqual("GET", self.method)
106 self.assertEqual(url, self.url)106 self.assertEqual(url, self.url)
107 self.assertEqual("URL: %s\n"107 self.assertEqual("URL: %s\n"
@@ -128,9 +128,9 @@
128 url = (128 url = (
129 "http://endpoint?AWSAccessKeyId=key&"129 "http://endpoint?AWSAccessKeyId=key&"
130 "Action=DescribeRegions&RegionName.0=us-west-1&"130 "Action=DescribeRegions&RegionName.0=us-west-1&"
131 "Signature=6D8aCgSPQOYixowRHy26aRFzK2Vwgixl9uwegYX9nLA%3D&"131 "Signature=FL4JjDKbWdg531q1KKUPild%2BvyqspA5wxSmOeWXWsJI%3D&"
132 "SignatureMethod=HmacSHA256&SignatureVersion=2&"132 "SignatureMethod=HmacSHA256&SignatureVersion=2&"
133 "Timestamp=2010-06-04T23%3A40%3A00Z&Version=2009-11-30")133 "Timestamp=2010-06-04T23%3A40%3A00Z&Version=2012-08-15")
134 self.assertEqual("GET", self.method)134 self.assertEqual("GET", self.method)
135 self.assertEqual(url, self.url)135 self.assertEqual(url, self.url)
136 self.assertEqual("URL: %s\n"136 self.assertEqual("URL: %s\n"
@@ -185,9 +185,9 @@
185 url = (185 url = (
186 "http://endpoint?AWSAccessKeyId=key&"186 "http://endpoint?AWSAccessKeyId=key&"
187 "Action=DescribeRegions&RegionName.0=us-west-1&"187 "Action=DescribeRegions&RegionName.0=us-west-1&"
188 "Signature=6D8aCgSPQOYixowRHy26aRFzK2Vwgixl9uwegYX9nLA%3D&"188 "Signature=FL4JjDKbWdg531q1KKUPild%2BvyqspA5wxSmOeWXWsJI%3D&"
189 "SignatureMethod=HmacSHA256&SignatureVersion=2&"189 "SignatureMethod=HmacSHA256&SignatureVersion=2&"
190 "Timestamp=2010-06-04T23%3A40%3A00Z&Version=2009-11-30")190 "Timestamp=2010-06-04T23%3A40%3A00Z&Version=2012-08-15")
191 self.assertEqual("GET", self.method)191 self.assertEqual("GET", self.method)
192 self.assertEqual(url, self.url)192 self.assertEqual(url, self.url)
193 self.assertEqual("URL: %s\n"193 self.assertEqual("URL: %s\n"
194194
=== modified file 'txaws/ec2/client.py'
--- txaws/ec2/client.py 2012-05-05 00:17:02 +0000
+++ txaws/ec2/client.py 2012-11-21 12:35:25 +0000
@@ -48,7 +48,7 @@
48 def run_instances(self, image_id, min_count, max_count,48 def run_instances(self, image_id, min_count, max_count,
49 security_groups=None, key_name=None, instance_type=None,49 security_groups=None, key_name=None, instance_type=None,
50 user_data=None, availability_zone=None, kernel_id=None,50 user_data=None, availability_zone=None, kernel_id=None,
51 ramdisk_id=None):51 ramdisk_id=None, subnet_id=None, security_group_ids=None):
52 """Run new instances.52 """Run new instances.
5353
54 TODO: blockDeviceMapping, monitoring, subnetId54 TODO: blockDeviceMapping, monitoring, subnetId
@@ -57,9 +57,21 @@
57 "MaxCount": str(max_count)}57 "MaxCount": str(max_count)}
58 if key_name is not None:58 if key_name is not None:
59 params["KeyName"] = key_name59 params["KeyName"] = key_name
60 if security_groups is not None:60 if subnet_id is not None:
61 params["SubnetId"] = subnet_id
62 if security_group_ids is not None:
63 for i, id in enumerate(security_group_ids):
64 params["SecurityGroupId.%d" % (i + 1)] = id
65 else:
66 msg = "You must specify the security_group_ids with the subnet_id"
67 raise ValueError(msg)
68 elif security_groups is not None:
61 for i, name in enumerate(security_groups):69 for i, name in enumerate(security_groups):
62 params["SecurityGroup.%d" % (i + 1)] = name70 params["SecurityGroup.%d" % (i + 1)] = name
71 else:
72 msg = ("You must specify either the subnet_id and "
73 "security_group_ids or security_groups")
74 raise ValueError(msg)
63 if user_data is not None:75 if user_data is not None:
64 params["UserData"] = b64encode(user_data)76 params["UserData"] = b64encode(user_data)
65 if instance_type is not None:77 if instance_type is not None:
@@ -110,28 +122,37 @@
110 d = query.submit()122 d = query.submit()
111 return d.addCallback(self.parser.describe_security_groups)123 return d.addCallback(self.parser.describe_security_groups)
112124
113 def create_security_group(self, name, description):125 def create_security_group(self, name, description, vpc_id=None):
114 """Create security group.126 """Create security group.
115127
116 @param name: Name of the new security group.128 @param name: Name of the new security group.
117 @param description: Description of the new security group.129 @param description: Description of the new security group.
130 @param vpc_id: ID of the VPC to which the security group will belong.
118 @return: A C{Deferred} that will fire with a truth value for the131 @return: A C{Deferred} that will fire with a truth value for the
119 success of the operation.132 success of the operation.
120 """133 """
121 parameters = {"GroupName": name, "GroupDescription": description}134 parameters = {"GroupName": name, "GroupDescription": description}
135 if vpc_id:
136 parameters["VpcId"] = vpc_id
122 query = self.query_factory(137 query = self.query_factory(
123 action="CreateSecurityGroup", creds=self.creds,138 action="CreateSecurityGroup", creds=self.creds,
124 endpoint=self.endpoint, other_params=parameters)139 endpoint=self.endpoint, other_params=parameters)
125 d = query.submit()140 d = query.submit()
126 return d.addCallback(self.parser.truth_return)141 return d.addCallback(self.parser.create_security_group)
127142
128 def delete_security_group(self, name):143 def delete_security_group(self, name=None, id=None):
129 """144 """
130 @param name: Name of the new security group.145 @param name: Name of the security group.
146 @param id: Id of the security group.
131 @return: A C{Deferred} that will fire with a truth value for the147 @return: A C{Deferred} that will fire with a truth value for the
132 success of the operation.148 success of the operation.
133 """149 """
134 parameter = {"GroupName": name}150 if name:
151 parameter = {"GroupName": name}
152 elif id:
153 parameter = {"GroupId": id}
154 else:
155 raise ValueError("You must provide either the security group name or id")
135 query = self.query_factory(156 query = self.query_factory(
136 action="DeleteSecurityGroup", creds=self.creds,157 action="DeleteSecurityGroup", creds=self.creds,
137 endpoint=self.endpoint, other_params=parameter)158 endpoint=self.endpoint, other_params=parameter)
@@ -139,7 +160,7 @@
139 return d.addCallback(self.parser.truth_return)160 return d.addCallback(self.parser.truth_return)
140161
141 def authorize_security_group(162 def authorize_security_group(
142 self, group_name, source_group_name="", source_group_owner_id="",163 self, group_name=None, group_id=None, source_group_name="", source_group_owner_id="",
143 ip_protocol="", from_port="", to_port="", cidr_ip=""):164 ip_protocol="", from_port="", to_port="", cidr_ip=""):
144 """165 """
145 There are two ways to use C{authorize_security_group}:166 There are two ways to use C{authorize_security_group}:
@@ -150,6 +171,8 @@
150171
151 @param group_name: The group you will be modifying with a new172 @param group_name: The group you will be modifying with a new
152 authorization.173 authorization.
174 @param group_id: The id of the group you will be modifying with
175 a new authorization.
153176
154 Optionally, the following parameters:177 Optionally, the following parameters:
155 @param source_group_name: Name of security group to authorize access to178 @param source_group_name: Name of security group to authorize access to
@@ -188,7 +211,12 @@
188 msg = ("You must specify either both group parameters or "211 msg = ("You must specify either both group parameters or "
189 "all the ip parameters.")212 "all the ip parameters.")
190 raise ValueError(msg)213 raise ValueError(msg)
191 parameters["GroupName"] = group_name214 if group_id:
215 parameters["GroupId"] = group_id
216 elif group_name:
217 parameters["GroupName"] = group_name
218 else:
219 raise ValueError("You must specify either the group name of the group id.")
192 query = self.query_factory(220 query = self.query_factory(
193 action="AuthorizeSecurityGroupIngress", creds=self.creds,221 action="AuthorizeSecurityGroupIngress", creds=self.creds,
194 endpoint=self.endpoint, other_params=parameters)222 endpoint=self.endpoint, other_params=parameters)
@@ -224,7 +252,7 @@
224 return d252 return d
225253
226 def revoke_security_group(254 def revoke_security_group(
227 self, group_name, source_group_name="", source_group_owner_id="",255 self, group_name=None, group_id=None, source_group_name="", source_group_owner_id="",
228 ip_protocol="", from_port="", to_port="", cidr_ip=""):256 ip_protocol="", from_port="", to_port="", cidr_ip=""):
229 """257 """
230 There are two ways to use C{revoke_security_group}:258 There are two ways to use C{revoke_security_group}:
@@ -273,7 +301,12 @@
273 msg = ("You must specify either both group parameters or "301 msg = ("You must specify either both group parameters or "
274 "all the ip parameters.")302 "all the ip parameters.")
275 raise ValueError(msg)303 raise ValueError(msg)
276 parameters["GroupName"] = group_name304 if group_id:
305 parameters["GroupId"] = group_id
306 elif group_name:
307 parameters["GroupName"] = group_name
308 else:
309 raise ValueError("You must specify either the group name of the group id.")
277 query = self.query_factory(310 query = self.query_factory(
278 action="RevokeSecurityGroupIngress", creds=self.creds,311 action="RevokeSecurityGroupIngress", creds=self.creds,
279 endpoint=self.endpoint, other_params=parameters)312 endpoint=self.endpoint, other_params=parameters)
@@ -547,6 +580,10 @@
547 ipAddress, stateReason, architecture, rootDeviceName,580 ipAddress, stateReason, architecture, rootDeviceName,
548 blockDeviceMapping, instanceLifecycle, spotInstanceRequestId.581 blockDeviceMapping, instanceLifecycle, spotInstanceRequestId.
549 """582 """
583 for group_data in instance_data.find("groupSet"):
584 group_id = group_data.findtext("groupId")
585 group_name = group_data.findtext("groupName")
586 reservation.groups.append((group_id, group_name))
550 instance_id = instance_data.findtext("instanceId")587 instance_id = instance_data.findtext("instanceId")
551 instance_state = instance_data.find(588 instance_state = instance_data.find(
552 "instanceState").findtext("name")589 "instanceState").findtext("name")
@@ -599,16 +636,10 @@
599 results = []636 results = []
600 # May be a more elegant way to do this:637 # May be a more elegant way to do this:
601 for reservation_data in root.find("reservationSet"):638 for reservation_data in root.find("reservationSet"):
602 # Get the security group information.
603 groups = []
604 for group_data in reservation_data.find("groupSet"):
605 group_id = group_data.findtext("groupId")
606 groups.append(group_id)
607 # Create a reservation object with the parsed data.639 # Create a reservation object with the parsed data.
608 reservation = model.Reservation(640 reservation = model.Reservation(
609 reservation_id=reservation_data.findtext("reservationId"),641 reservation_id=reservation_data.findtext("reservationId"),
610 owner_id=reservation_data.findtext("ownerId"),642 owner_id=reservation_data.findtext("ownerId"))
611 groups=groups)
612 # Get the list of instances.643 # Get the list of instances.
613 instances = self.instances_set(644 instances = self.instances_set(
614 reservation_data, reservation)645 reservation_data, reservation)
@@ -670,6 +701,7 @@
670 root = XML(xml_bytes)701 root = XML(xml_bytes)
671 result = []702 result = []
672 for group_info in root.findall("securityGroupInfo/item"):703 for group_info in root.findall("securityGroupInfo/item"):
704 id = group_info.findtext("groupId")
673 name = group_info.findtext("groupName")705 name = group_info.findtext("groupName")
674 description = group_info.findtext("groupDescription")706 description = group_info.findtext("groupDescription")
675 owner_id = group_info.findtext("ownerId")707 owner_id = group_info.findtext("ownerId")
@@ -709,11 +741,15 @@
709 for user_id, group_name in allowed_groups]741 for user_id, group_name in allowed_groups]
710742
711 security_group = model.SecurityGroup(743 security_group = model.SecurityGroup(
712 name, description, owner_id=owner_id,744 id, name, description, owner_id=owner_id,
713 groups=allowed_groups, ips=allowed_ips)745 groups=allowed_groups, ips=allowed_ips)
714 result.append(security_group)746 result.append(security_group)
715 return result747 return result
716748
749 def create_security_group(self, xml_bytes):
750 root = XML(xml_bytes)
751 return root.findtext("groupId")
752
717 def truth_return(self, xml_bytes):753 def truth_return(self, xml_bytes):
718 """Parse the XML for a truth value.754 """Parse the XML for a truth value.
719755
720756
=== modified file 'txaws/ec2/model.py'
--- txaws/ec2/model.py 2012-03-02 22:00:10 +0000
+++ txaws/ec2/model.py 2012-11-21 12:35:25 +0000
@@ -80,7 +80,8 @@
80 @ivar allowed_ips: The sequence of L{IPPermission} instances for this80 @ivar allowed_ips: The sequence of L{IPPermission} instances for this
81 security group.81 security group.
82 """82 """
83 def __init__(self, name, description, owner_id="", groups=None, ips=None):83 def __init__(self, id, name, description, owner_id="", groups=None, ips=None):
84 self.id = id
84 self.name = name85 self.name = name
85 self.description = description86 self.description = description
86 self.owner_id = owner_id87 self.owner_id = owner_id
8788
=== modified file 'txaws/ec2/tests/test_client.py'
--- txaws/ec2/tests/test_client.py 2012-03-02 22:00:10 +0000
+++ txaws/ec2/tests/test_client.py 2012-11-21 12:35:25 +0000
@@ -171,7 +171,8 @@
171 self.assertEquals(reservation.owner_id, "123456789012")171 self.assertEquals(reservation.owner_id, "123456789012")
172 # check groups172 # check groups
173 group = reservation.groups[0]173 group = reservation.groups[0]
174 self.assertEquals(group, "default")174 self.assertEquals(group[0], "sg-64f9eb08")
175 self.assertEquals(group[1], "default")
175 # check instance176 # check instance
176 self.assertEquals(instance.instance_id, "i-abcdef01")177 self.assertEquals(instance.instance_id, "i-abcdef01")
177 self.assertEquals(instance.instance_state, "running")178 self.assertEquals(instance.instance_state, "running")
@@ -201,7 +202,8 @@
201 self.assertEquals(reservation.owner_id, "123456789012")202 self.assertEquals(reservation.owner_id, "123456789012")
202 # check groups203 # check groups
203 group = reservation.groups[0]204 group = reservation.groups[0]
204 self.assertEquals(group, "default")205 self.assertEquals(group[0], "sg-64f9eb08")
206 self.assertEquals(group[1], "default")
205 # check instance207 # check instance
206 self.assertEquals(instance.instance_id, "i-abcdef01")208 self.assertEquals(instance.instance_id, "i-abcdef01")
207 self.assertEquals(instance.instance_state, "running")209 self.assertEquals(instance.instance_state, "running")
@@ -331,7 +333,8 @@
331 self.assertEquals(reservation.owner_id, "495219933132")333 self.assertEquals(reservation.owner_id, "495219933132")
332 # check groups334 # check groups
333 group = reservation.groups[0]335 group = reservation.groups[0]
334 self.assertEquals(group, "default")336 self.assertEquals(group[0], "sg-64f9eb08")
337 self.assertEquals(group[1], "default")
335 # check instance338 # check instance
336 self.assertEquals(instance.instance_id, "i-2ba64342")339 self.assertEquals(instance.instance_id, "i-2ba64342")
337 self.assertEquals(instance.instance_state, "pending")340 self.assertEquals(instance.instance_state, "pending")
@@ -377,6 +380,59 @@
377 ramdisk_id=u"r-1234")380 ramdisk_id=u"r-1234")
378 d.addCallback(self.check_parsed_run_instances)381 d.addCallback(self.check_parsed_run_instances)
379382
383 def test_run_instances_with_subnet(self):
384 class StubQuery(object):
385 def __init__(stub, action="", creds=None, endpoint=None,
386 other_params={}):
387 self.assertEqual(action, "RunInstances")
388 self.assertEqual(creds.access_key, "foo")
389 self.assertEqual(creds.secret_key, "bar")
390 self.assertEquals(
391 other_params,
392 {"ImageId": "ami-1234", "MaxCount": "2", "MinCount": "1",
393 "SecurityGroupId.1": u"sg-a72d9f92e", "KeyName": u"default",
394 "UserData": "Zm9v", "InstanceType": u"m1.small",
395 "Placement.AvailabilityZone": u"us-east-1b",
396 "KernelId": u"k-1234", "RamdiskId": u"r-1234",
397 "SubnetId": "subnet-a72d829f"})
398
399 def submit(self):
400 return succeed(
401 payload.sample_run_instances_result)
402
403 creds = AWSCredentials("foo", "bar")
404 ec2 = client.EC2Client(creds, query_factory=StubQuery)
405 d = ec2.run_instances("ami-1234", 1, 2, security_group_ids=[u"sg-a72d9f92e"],
406 key_name=u"default", user_data=u"foo", instance_type=u"m1.small",
407 availability_zone=u"us-east-1b", kernel_id=u"k-1234",
408 ramdisk_id=u"r-1234", subnet_id="subnet-a72d829f")
409 d.addCallback(self.check_parsed_run_instances)
410
411 def test_run_instances_with_subnet_but_without_secgroup_id(self):
412 creds = AWSCredentials("foo", "bar")
413 ec2 = client.EC2Client(creds)
414 error = self.assertRaises(ValueError, ec2.run_instances, "ami-1234", 1, 2,
415 key_name=u"default", user_data=u"foo", instance_type=u"m1.small",
416 availability_zone=u"us-east-1b", kernel_id=u"k-1234",
417 ramdisk_id=u"r-1234", subnet_id="subnet-a72d829f")
418 self.assertEqual(
419 str(error),
420 "You must specify the security_group_ids with the subnet_id"
421 )
422
423 def test_run_instances_without_subnet_and_secgroups(self):
424 creds = AWSCredentials("foo", "bar")
425 ec2 = client.EC2Client(creds)
426 error = self.assertRaises(ValueError, ec2.run_instances, "ami-1234", 1, 2,
427 key_name=u"default", user_data=u"foo", instance_type=u"m1.small",
428 availability_zone=u"us-east-1b", kernel_id=u"k-1234",
429 ramdisk_id=u"r-1234")
430 self.assertEqual(
431 str(error),
432 ("You must specify either the subnet_id and "
433 "security_group_ids or security_groups")
434 )
435
380436
381class EC2ClientSecurityGroupsTestCase(TXAWSTestCase):437class EC2ClientSecurityGroupsTestCase(TXAWSTestCase):
382438
@@ -400,6 +456,7 @@
400456
401 def check_results(security_groups):457 def check_results(security_groups):
402 [security_group] = security_groups458 [security_group] = security_groups
459 self.assertEquals(security_group.id, "sg-a1a1a1")
403 self.assertEquals(security_group.owner_id,460 self.assertEquals(security_group.owner_id,
404 "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM")461 "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM")
405 self.assertEquals(security_group.name, "WebServers")462 self.assertEquals(security_group.name, "WebServers")
@@ -440,6 +497,7 @@
440 security_group = security_groups[0]497 security_group = security_groups[0]
441 self.assertEquals(security_group.owner_id,498 self.assertEquals(security_group.owner_id,
442 "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM")499 "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM")
500 self.assertEquals(security_group.id, "sg-a1a1a1")
443 self.assertEquals(security_group.name, "MessageServers")501 self.assertEquals(security_group.name, "MessageServers")
444 self.assertEquals(security_group.description, "Message Servers")502 self.assertEquals(security_group.description, "Message Servers")
445 self.assertEquals(security_group.allowed_groups, [])503 self.assertEquals(security_group.allowed_groups, [])
@@ -451,6 +509,7 @@
451 security_group = security_groups[1]509 security_group = security_groups[1]
452 self.assertEquals(security_group.owner_id,510 self.assertEquals(security_group.owner_id,
453 "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM")511 "UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM")
512 self.assertEquals(security_group.id, "sg-c3c3c3")
454 self.assertEquals(security_group.name, "WebServers")513 self.assertEquals(security_group.name, "WebServers")
455 self.assertEquals(security_group.description, "Web Servers")514 self.assertEquals(security_group.description, "Web Servers")
456 self.assertEquals([(pair.user_id, pair.group_name)515 self.assertEquals([(pair.user_id, pair.group_name)
@@ -583,14 +642,45 @@
583 def submit(self):642 def submit(self):
584 return succeed(payload.sample_create_security_group)643 return succeed(payload.sample_create_security_group)
585644
645 def check_result(id):
646 self.assertEquals(id, "sg-1a2b3c4d")
647
586 creds = AWSCredentials("foo", "bar")648 creds = AWSCredentials("foo", "bar")
587 ec2 = client.EC2Client(creds, query_factory=StubQuery)649 ec2 = client.EC2Client(creds, query_factory=StubQuery)
588 d = ec2.create_security_group(650 d = ec2.create_security_group(
589 "WebServers",651 "WebServers",
590 "The group for the web server farm.")652 "The group for the web server farm.")
591 return self.assertTrue(d)653 return d.addCallback(check_result)
592654
593 def test_delete_security_group(self):655 def test_create_security_group_with_VPC(self):
656 class StubQuery(object):
657
658 def __init__(stub, action="", creds=None, endpoint=None,
659 other_params={}):
660 self.assertEqual(action, "CreateSecurityGroup")
661 self.assertEqual(creds.access_key, "foo")
662 self.assertEqual(creds.secret_key, "bar")
663 self.assertEqual(other_params, {
664 "GroupName": "WebServers",
665 "GroupDescription": "The group for the web server farm.",
666 "VpcId": "vpc-a4f2",
667 })
668
669 def submit(self):
670 return succeed(payload.sample_create_security_group)
671
672 def check_result(id):
673 self.assertEquals(id, "sg-1a2b3c4d")
674
675 creds = AWSCredentials("foo", "bar")
676 ec2 = client.EC2Client(creds, query_factory=StubQuery)
677 d = ec2.create_security_group(
678 "WebServers",
679 "The group for the web server farm.",
680 "vpc-a4f2")
681 return d.addCallback(check_result)
682
683 def test_delete_security_group_using_name(self):
594 """684 """
595 L{EC2Client.delete_security_group} returns a C{Deferred} that685 L{EC2Client.delete_security_group} returns a C{Deferred} that
596 eventually fires with a true value, indicating the success of the686 eventually fires with a true value, indicating the success of the
@@ -615,6 +705,40 @@
615 d = ec2.delete_security_group("WebServers")705 d = ec2.delete_security_group("WebServers")
616 return self.assertTrue(d)706 return self.assertTrue(d)
617707
708 def test_delete_security_group_using_id(self):
709 """
710 L{EC2Client.delete_security_group} returns a C{Deferred} that
711 eventually fires with a true value, indicating the success of the
712 operation.
713 """
714 class StubQuery(object):
715
716 def __init__(stub, action="", creds=None, endpoint=None,
717 other_params={}):
718 self.assertEqual(action, "DeleteSecurityGroup")
719 self.assertEqual(creds.access_key, "foo")
720 self.assertEqual(creds.secret_key, "bar")
721 self.assertEqual(other_params, {
722 "GroupId": "sg-a1a1a1",
723 })
724
725 def submit(self):
726 return succeed(payload.sample_delete_security_group)
727
728 creds = AWSCredentials("foo", "bar")
729 ec2 = client.EC2Client(creds, query_factory=StubQuery)
730 d = ec2.delete_security_group(id="sg-a1a1a1")
731 return self.assertTrue(d)
732
733 def test_delete_security_group_without_id_and_name(self):
734 creds = AWSCredentials("foo", "bar")
735 ec2 = client.EC2Client(creds)
736 error = self.assertRaises(ValueError, ec2.delete_security_group)
737 self.assertEquals(
738 str(error),
739 "You must provide either the security group name or id",
740 )
741
618 def test_delete_security_group_failure(self):742 def test_delete_security_group_failure(self):
619 """743 """
620 L{EC2Client.delete_security_group} returns a C{Deferred} that744 L{EC2Client.delete_security_group} returns a C{Deferred} that
@@ -676,9 +800,42 @@
676 creds = AWSCredentials("foo", "bar")800 creds = AWSCredentials("foo", "bar")
677 ec2 = client.EC2Client(creds, query_factory=StubQuery)801 ec2 = client.EC2Client(creds, query_factory=StubQuery)
678 d = ec2.authorize_security_group(802 d = ec2.authorize_security_group(
679 "WebServers", source_group_name="AppServers",803 group_name="WebServers", source_group_name="AppServers",
680 source_group_owner_id="123456789123")804 source_group_owner_id="123456789123")
681 return self.assertTrue(d)805 return self.assertTrue(d)
806
807 def test_authorize_security_group_using_group_id(self):
808 class StubQuery(object):
809
810 def __init__(stub, action="", creds=None, endpoint=None,
811 other_params={}):
812 self.assertEqual(action, "AuthorizeSecurityGroupIngress")
813 self.assertEqual(creds.access_key, "foo")
814 self.assertEqual(creds.secret_key, "bar")
815 self.assertEqual(other_params, {
816 "GroupId": "sg-a1b2c3d4e5f6",
817 "SourceSecurityGroupName": "AppServers",
818 "SourceSecurityGroupOwnerId": "123456789123",
819 })
820
821 def submit(self):
822 return succeed(payload.sample_authorize_security_group)
823
824 creds = AWSCredentials("foo", "bar")
825 ec2 = client.EC2Client(creds, query_factory=StubQuery)
826 d = ec2.authorize_security_group(
827 group_id="sg-a1b2c3d4e5f6", source_group_name="AppServers",
828 source_group_owner_id="123456789123")
829 return self.assertTrue(d)
830
831 def test_authorize_security_group_without_group_id_and_group_name(self):
832 creds = AWSCredentials("foo", "bar")
833 ec2 = client.EC2Client(creds)
834 error = self.assertRaises(ValueError, ec2.authorize_security_group,
835 source_group_name="AppServers", source_group_owner_id="123456789123")
836 self.assertEquals(
837 str(error),
838 "You must specify either the group name of the group id.")
682839
683 def test_authorize_security_group_with_ip_permissions(self):840 def test_authorize_security_group_with_ip_permissions(self):
684 """841 """
@@ -707,7 +864,7 @@
707 creds = AWSCredentials("foo", "bar")864 creds = AWSCredentials("foo", "bar")
708 ec2 = client.EC2Client(creds, query_factory=StubQuery)865 ec2 = client.EC2Client(creds, query_factory=StubQuery)
709 d = ec2.authorize_security_group(866 d = ec2.authorize_security_group(
710 "WebServers", ip_protocol="tcp", from_port="22", to_port="80",867 group_name="WebServers", ip_protocol="tcp", from_port="22", to_port="80",
711 cidr_ip="0.0.0.0/0")868 cidr_ip="0.0.0.0/0")
712 return self.assertTrue(d)869 return self.assertTrue(d)
713870
@@ -722,16 +879,12 @@
722 """879 """
723 creds = AWSCredentials("foo", "bar")880 creds = AWSCredentials("foo", "bar")
724 ec2 = client.EC2Client(creds)881 ec2 = client.EC2Client(creds)
725 self.assertRaises(ValueError, ec2.authorize_security_group,882 error = self.assertRaises(ValueError, ec2.authorize_security_group,
726 "WebServers", ip_protocol="tcp", from_port="22")883 group_name="WebServers", ip_protocol="tcp", from_port="22")
727 try:884 self.assertEquals(
728 ec2.authorize_security_group(885 str(error),
729 "WebServers", ip_protocol="tcp", from_port="22")886 ("You must specify either both group parameters or all the "
730 except Exception, error:887 "ip parameters."))
731 self.assertEquals(
732 str(error),
733 ("You must specify either both group parameters or all the "
734 "ip parameters."))
735888
736 def test_authorize_group_permission(self):889 def test_authorize_group_permission(self):
737 """890 """
@@ -822,6 +975,30 @@
822 source_group_owner_id="123456789123")975 source_group_owner_id="123456789123")
823 return self.assertTrue(d)976 return self.assertTrue(d)
824977
978 def test_revoke_security_group_using_group_id(self):
979 class StubQuery(object):
980
981 def __init__(stub, action="", creds=None, endpoint=None,
982 other_params={}):
983 self.assertEqual(action, "RevokeSecurityGroupIngress")
984 self.assertEqual(creds.access_key, "foo")
985 self.assertEqual(creds.secret_key, "bar")
986 self.assertEqual(other_params, {
987 "GroupId": "sg-a1a1a1",
988 "SourceSecurityGroupName": "AppServers",
989 "SourceSecurityGroupOwnerId": "123456789123",
990 })
991
992 def submit(self):
993 return succeed(payload.sample_revoke_security_group)
994
995 creds = AWSCredentials("foo", "bar")
996 ec2 = client.EC2Client(creds, query_factory=StubQuery)
997 d = ec2.revoke_security_group(
998 group_id="sg-a1a1a1", source_group_name="AppServers",
999 source_group_owner_id="123456789123")
1000 return self.assertTrue(d)
1001
825 def test_revoke_security_group_with_ip_permissions(self):1002 def test_revoke_security_group_with_ip_permissions(self):
826 """1003 """
827 L{EC2Client.revoke_security_group} returns a C{Deferred} that1004 L{EC2Client.revoke_security_group} returns a C{Deferred} that
@@ -853,6 +1030,15 @@
853 cidr_ip="0.0.0.0/0")1030 cidr_ip="0.0.0.0/0")
854 return self.assertTrue(d)1031 return self.assertTrue(d)
8551032
1033 def test_revoke_security_group_without_group_id_and_group_name(self):
1034 creds = AWSCredentials("foo", "bar")
1035 ec2 = client.EC2Client(creds)
1036 error = self.assertRaises(ValueError, ec2.revoke_security_group,
1037 source_group_name="AppServers", source_group_owner_id="123456789123")
1038 self.assertEquals(
1039 str(error),
1040 "You must specify either the group name of the group id.")
1041
856 def test_revoke_security_group_with_missing_parameters(self):1042 def test_revoke_security_group_with_missing_parameters(self):
857 """1043 """
858 L{EC2Client.revoke_security_group} returns a C{Deferred} that1044 L{EC2Client.revoke_security_group} returns a C{Deferred} that
@@ -864,16 +1050,12 @@
864 """1050 """
865 creds = AWSCredentials("foo", "bar")1051 creds = AWSCredentials("foo", "bar")
866 ec2 = client.EC2Client(creds)1052 ec2 = client.EC2Client(creds)
867 self.assertRaises(ValueError, ec2.authorize_security_group,1053 error = self.assertRaises(ValueError, ec2.revoke_security_group,
868 "WebServers", ip_protocol="tcp", from_port="22")1054 group_name="WebServers", ip_protocol="tcp", from_port="22")
869 try:1055 self.assertEquals(
870 ec2.authorize_security_group(1056 str(error),
871 "WebServers", ip_protocol="tcp", from_port="22")1057 ("You must specify either both group parameters or all the "
872 except Exception, error:1058 "ip parameters."))
873 self.assertEquals(
874 str(error),
875 ("You must specify either both group parameters or all the "
876 "ip parameters."))
8771059
878 def test_revoke_group_permission(self):1060 def test_revoke_group_permission(self):
879 """1061 """
@@ -1561,7 +1743,7 @@
1561 {"AWSAccessKeyId": "foo",1743 {"AWSAccessKeyId": "foo",
1562 "Action": "DescribeInstances",1744 "Action": "DescribeInstances",
1563 "SignatureVersion": "2",1745 "SignatureVersion": "2",
1564 "Version": "2009-11-30"})1746 "Version": "2012-08-15"})
15651747
1566 def test_init_other_args_are_params(self):1748 def test_init_other_args_are_params(self):
1567 query = client.Query(1749 query = client.Query(
@@ -1575,7 +1757,7 @@
1575 "InstanceId.0": "12345",1757 "InstanceId.0": "12345",
1576 "SignatureVersion": "2",1758 "SignatureVersion": "2",
1577 "Timestamp": "2007-11-12T13:14:15Z",1759 "Timestamp": "2007-11-12T13:14:15Z",
1578 "Version": "2009-11-30"})1760 "Version": "2012-08-15"})
15791761
1580 def test_no_timestamp_if_expires_in_other_params(self):1762 def test_no_timestamp_if_expires_in_other_params(self):
1581 """1763 """
@@ -1593,7 +1775,7 @@
1593 "Action": "DescribeInstances",1775 "Action": "DescribeInstances",
1594 "SignatureVersion": "2",1776 "SignatureVersion": "2",
1595 "Expires": "2007-11-12T13:14:15Z",1777 "Expires": "2007-11-12T13:14:15Z",
1596 "Version": "2009-11-30"})1778 "Version": "2012-08-15"})
15971779
1598 def test_sign(self):1780 def test_sign(self):
1599 query = client.Query(1781 query = client.Query(
@@ -1601,7 +1783,7 @@
1601 endpoint=self.endpoint,1783 endpoint=self.endpoint,
1602 time_tuple=(2007, 11, 12, 13, 14, 15, 0, 0, 0))1784 time_tuple=(2007, 11, 12, 13, 14, 15, 0, 0, 0))
1603 query.sign()1785 query.sign()
1604 self.assertEqual("G4c2NtQaFNhWWT8EWPVIIOpHVr0mGUYwJVYss9krsMU=",1786 self.assertEqual("c0gbkemrGEJdqxWOl2UZYaygYiBLVjrpWBs7bTN7Ndo=",
1605 query.params["Signature"])1787 query.params["Signature"])
16061788
1607 def test_old_sign(self):1789 def test_old_sign(self):
@@ -1612,7 +1794,7 @@
1612 other_params={"SignatureVersion": "1"})1794 other_params={"SignatureVersion": "1"})
1613 query.sign()1795 query.sign()
1614 self.assertEqual(1796 self.assertEqual(
1615 "9xP+PIs/3QXW+4mWX6WGR4nGqfE=", query.params["Signature"])1797 "7tWrIC5VYvXOjVE+roVoyDUt2Yw=", query.params["Signature"])
16161798
1617 def test_unsupported_sign(self):1799 def test_unsupported_sign(self):
1618 query = client.Query(1800 query = client.Query(
16191801
=== modified file 'txaws/ec2/tests/test_model.py'
--- txaws/ec2/tests/test_model.py 2012-01-23 01:04:25 +0000
+++ txaws/ec2/tests/test_model.py 2012-11-21 12:35:25 +0000
@@ -8,7 +8,8 @@
8class SecurityGroupTestCase(TXAWSTestCase):8class SecurityGroupTestCase(TXAWSTestCase):
99
10 def test_creation_defaults(self):10 def test_creation_defaults(self):
11 group = model.SecurityGroup("name", "desc")11 group = model.SecurityGroup("sg-a3f2", "name", "desc")
12 self.assertEquals(group.id, "sg-a3f2")
12 self.assertEquals(group.name, "name")13 self.assertEquals(group.name, "name")
13 self.assertEquals(group.description, "desc")14 self.assertEquals(group.description, "desc")
14 self.assertEquals(group.owner_id, "")15 self.assertEquals(group.owner_id, "")
@@ -18,14 +19,15 @@
18 def test_creation_all_parameters(self):19 def test_creation_all_parameters(self):
19 user = "somegal24"20 user = "somegal24"
20 other_groups = [21 other_groups = [
21 model.SecurityGroup("other1", "another group 1"),22 model.SecurityGroup("sg-other1", "other1", "another group 1"),
22 model.SecurityGroup("other2", "another group 2")]23 model.SecurityGroup("sg-other2", "other2", "another group 2")]
23 user_group_pairs = [24 user_group_pairs = [
24 model.UserIDGroupPair(user, other_groups[0].name),25 model.UserIDGroupPair(user, other_groups[0].name),
25 model.UserIDGroupPair(user, other_groups[1].name)]26 model.UserIDGroupPair(user, other_groups[1].name)]
26 ips = [model.IPPermission("tcp", "80", "80", "10.0.1.0/24")]27 ips = [model.IPPermission("tcp", "80", "80", "10.0.1.0/24")]
27 group = model.SecurityGroup(28 group = model.SecurityGroup(
28 "name", "desc", owner_id="me", groups=user_group_pairs, ips=ips)29 "id", "name", "desc", owner_id="me", groups=user_group_pairs, ips=ips)
30 self.assertEquals(group.id, "id")
29 self.assertEquals(group.name, "name")31 self.assertEquals(group.name, "name")
30 self.assertEquals(group.description, "desc")32 self.assertEquals(group.description, "desc")
31 self.assertEquals(group.owner_id, "me")33 self.assertEquals(group.owner_id, "me")
3234
=== modified file 'txaws/server/tests/test_call.py'
--- txaws/server/tests/test_call.py 2012-01-27 02:10:24 +0000
+++ txaws/server/tests/test_call.py 2012-11-21 12:35:25 +0000
@@ -11,4 +11,4 @@
11 2009-11-30, which is the earliest version we support.11 2009-11-30, which is the earliest version we support.
12 """12 """
13 call = Call()13 call = Call()
14 self.assertEqual(call.version, "2009-11-30")14 self.assertEqual(call.version, "2012-08-15")
1515
=== modified file 'txaws/testing/payload.py'
--- txaws/testing/payload.py 2012-05-16 02:47:12 +0000
+++ txaws/testing/payload.py 2012-11-21 12:35:25 +0000
@@ -9,11 +9,7 @@
9 <item>9 <item>
10 <reservationId>r-cf24b1a6</reservationId>10 <reservationId>r-cf24b1a6</reservationId>
11 <ownerId>123456789012</ownerId>11 <ownerId>123456789012</ownerId>
12 <groupSet>12 <groupSet/>
13 <item>
14 <groupId>default</groupId>
15 </item>
16 </groupSet>
17 <instancesSet>13 <instancesSet>
18 <item>14 <item>
19 <instanceId>i-abcdef01</instanceId>15 <instanceId>i-abcdef01</instanceId>
@@ -22,6 +18,12 @@
22 <code>16</code>18 <code>16</code>
23 <name>running</name>19 <name>running</name>
24 </instanceState>20 </instanceState>
21 <groupSet>
22 <item>
23 <groupId>sg-64f9eb08</groupId>
24 <groupName>default</groupName>
25 </item>
26 </groupSet>
25 <privateDnsName>domU-12-31-39-03-15-11.compute-1.internal\27 <privateDnsName>domU-12-31-39-03-15-11.compute-1.internal\
26</privateDnsName>28</privateDnsName>
27 <dnsName>ec2-75-101-245-65.compute-1.amazonaws.com</dnsName>29 <dnsName>ec2-75-101-245-65.compute-1.amazonaws.com</dnsName>
@@ -48,11 +50,7 @@
48 <item>50 <item>
49 <reservationId>r-cf24b1a6</reservationId>51 <reservationId>r-cf24b1a6</reservationId>
50 <ownerId>123456789012</ownerId>52 <ownerId>123456789012</ownerId>
51 <groupSet>53 <groupSet/>
52 <item>
53 <groupId>default</groupId>
54 </item>
55 </groupSet>
56 <instancesSet>54 <instancesSet>
57 <item>55 <item>
58 <instanceId>i-abcdef01</instanceId>56 <instanceId>i-abcdef01</instanceId>
@@ -67,6 +65,12 @@
67 <privateIpAddress>10.0.0.1</privateIpAddress>65 <privateIpAddress>10.0.0.1</privateIpAddress>
68 <ipAddress>75.101.245.65</ipAddress>66 <ipAddress>75.101.245.65</ipAddress>
69 <reason/>67 <reason/>
68 <groupSet>
69 <item>
70 <groupId>sg-64f9eb08</groupId>
71 <groupName>default</groupName>
72 </item>
73 </groupSet>
70 <keyName>keyname</keyName>74 <keyName>keyname</keyName>
71 <amiLaunchIndex>0</amiLaunchIndex>75 <amiLaunchIndex>0</amiLaunchIndex>
72 <productCodes>76 <productCodes>
@@ -92,18 +96,14 @@
92<RunInstancesResponse xmlns="http://ec2.amazonaws.com/doc/%s/">96<RunInstancesResponse xmlns="http://ec2.amazonaws.com/doc/%s/">
93 <reservationId>r-47a5402e</reservationId>97 <reservationId>r-47a5402e</reservationId>
94 <ownerId>495219933132</ownerId>98 <ownerId>495219933132</ownerId>
95 <groupSet>99 <groupSet/>
96 <item>
97 <groupId>default</groupId>
98 </item>
99 </groupSet>
100 <instancesSet>100 <instancesSet>
101 <item>101 <item>
102 <instanceId>i-2ba64342</instanceId>102 <instanceId>i-2ba64342</instanceId>
103 <imageId>ami-60a54009</imageId>103 <imageId>ami-60a54009</imageId>
104 <instanceState>104 <instanceState>
105 <code>0</code>105 <code>0</code>
106 <name>pending</name>106 <name>pending</name>
107 </instanceState>107 </instanceState>
108 <privateDnsName></privateDnsName>108 <privateDnsName></privateDnsName>
109 <dnsName></dnsName>109 <dnsName></dnsName>
@@ -111,6 +111,12 @@
111 <amiLaunchIndex>0</amiLaunchIndex>111 <amiLaunchIndex>0</amiLaunchIndex>
112 <instanceType>m1.small</instanceType>112 <instanceType>m1.small</instanceType>
113 <launchTime>2007-08-07T11:51:50.000Z</launchTime>113 <launchTime>2007-08-07T11:51:50.000Z</launchTime>
114 <groupSet>
115 <item>
116 <groupId>sg-64f9eb08</groupId>
117 <groupName>default</groupName>
118 </item>
119 </groupSet>
114 <placement>120 <placement>
115 <availabilityZone>us-east-1b</availabilityZone>121 <availabilityZone>us-east-1b</availabilityZone>
116 </placement>122 </placement>
@@ -120,7 +126,7 @@
120 <imageId>ami-60a54009</imageId>126 <imageId>ami-60a54009</imageId>
121 <instanceState>127 <instanceState>
122 <code>0</code>128 <code>0</code>
123 <name>pending</name>129 <name>pending</name>
124 </instanceState>130 </instanceState>
125 <privateDnsName></privateDnsName>131 <privateDnsName></privateDnsName>
126 <dnsName></dnsName>132 <dnsName></dnsName>
@@ -128,6 +134,12 @@
128 <amiLaunchIndex>1</amiLaunchIndex>134 <amiLaunchIndex>1</amiLaunchIndex>
129 <instanceType>m1.small</instanceType>135 <instanceType>m1.small</instanceType>
130 <launchTime>2007-08-07T11:51:50.000Z</launchTime>136 <launchTime>2007-08-07T11:51:50.000Z</launchTime>
137 <groupSet>
138 <item>
139 <groupId>sg-64f9eb08</groupId>
140 <groupName>default</groupName>
141 </item>
142 </groupSet>
131 <placement>143 <placement>
132 <availabilityZone>us-east-1b</availabilityZone>144 <availabilityZone>us-east-1b</availabilityZone>
133 </placement>145 </placement>
@@ -145,6 +157,12 @@
145 <amiLaunchIndex>2</amiLaunchIndex>157 <amiLaunchIndex>2</amiLaunchIndex>
146 <instanceType>m1.small</instanceType>158 <instanceType>m1.small</instanceType>
147 <launchTime>2007-08-07T11:51:50.000Z</launchTime>159 <launchTime>2007-08-07T11:51:50.000Z</launchTime>
160 <groupSet>
161 <item>
162 <groupId>sg-64f9eb08</groupId>
163 <groupName>default</groupName>
164 </item>
165 </groupSet>
148 <placement>166 <placement>
149 <availabilityZone>us-east-1b</availabilityZone>167 <availabilityZone>us-east-1b</availabilityZone>
150 </placement>168 </placement>
@@ -213,6 +231,7 @@
213 <fromPort/>231 <fromPort/>
214 </item>232 </item>
215 </ipPermissions>233 </ipPermissions>
234 <groupId>sg-a1a1a1</groupId>
216 <groupName>WebServers</groupName>235 <groupName>WebServers</groupName>
217 <groupDescription>Web servers</groupDescription>236 <groupDescription>Web servers</groupDescription>
218 <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>237 <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>
@@ -228,6 +247,7 @@
228 <securityGroupInfo>247 <securityGroupInfo>
229 <item>248 <item>
230 <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>249 <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>
250 <groupId>sg-a1a1a1</groupId>
231 <groupName>WebServers</groupName>251 <groupName>WebServers</groupName>
232 <groupDescription>Web Servers</groupDescription>252 <groupDescription>Web Servers</groupDescription>
233 <ipPermissions>253 <ipPermissions>
@@ -256,6 +276,7 @@
256 <securityGroupInfo>276 <securityGroupInfo>
257 <item>277 <item>
258 <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>278 <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>
279 <groupId>sg-a1a1a1</groupId>
259 <groupName>MessageServers</groupName>280 <groupName>MessageServers</groupName>
260 <groupDescription>Message Servers</groupDescription>281 <groupDescription>Message Servers</groupDescription>
261 <ipPermissions>282 <ipPermissions>
@@ -274,6 +295,7 @@
274 </item>295 </item>
275 <item>296 <item>
276 <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>297 <ownerId>UYY3TLBUXIEON5NQVUUX6OMPWBZIQNFM</ownerId>
298 <groupId>sg-c3c3c3</groupId>
277 <groupName>WebServers</groupName>299 <groupName>WebServers</groupName>
278 <groupDescription>Web Servers</groupDescription>300 <groupDescription>Web Servers</groupDescription>
279 <ipPermissions>301 <ipPermissions>
@@ -457,6 +479,7 @@
457sample_create_security_group = """\479sample_create_security_group = """\
458<CreateSecurityGroupResponse xmlns="http://ec2.amazonaws.com/doc/%s/">480<CreateSecurityGroupResponse xmlns="http://ec2.amazonaws.com/doc/%s/">
459 <return>true</return>481 <return>true</return>
482 <groupId>sg-1a2b3c4d</groupId>
460</CreateSecurityGroupResponse>483</CreateSecurityGroupResponse>
461""" % (version.ec2_api,)484""" % (version.ec2_api,)
462485
463486
=== modified file 'txaws/version.py'
--- txaws/version.py 2012-01-24 23:18:36 +0000
+++ txaws/version.py 2012-11-21 12:35:25 +0000
@@ -1,3 +1,3 @@
1txaws = "0.2.3"1txaws = "0.2.3"
2ec2_api = "2009-11-30"2ec2_api = "2012-08-15"
3s3_api = "2006-03-01"3s3_api = "2006-03-01"

Subscribers

People subscribed via source and target branches