Merge lp:~oubiwann/txaws/422066-fix-optional-params into lp:~txawsteam/txaws/trunk

Proposed by Duncan McGreggor
Status: Merged
Merged at revision: not available
Proposed branch: lp:~oubiwann/txaws/422066-fix-optional-params
Merge into: lp:~txawsteam/txaws/trunk
Diff against target: None lines
To merge this branch: bzr merge lp:~oubiwann/txaws/422066-fix-optional-params
Reviewer Review Type Date Requested Status
Robert Collins (community) Approve
Review via email: mp+10941@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Duncan McGreggor (oubiwann) wrote :

Ready for review!

Revision history for this message
Robert Collins (lifeless) wrote :

 review +1

I think we should have kept the XML namespace support - its not correct
without it.

-Rob

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'txaws/ec2/client.py'
2--- txaws/ec2/client.py 2009-08-31 07:52:14 +0000
3+++ txaws/ec2/client.py 2009-08-31 19:25:50 +0000
4@@ -1,4 +1,7 @@
5+# -*- coding: utf-8 -*-
6 # Copyright (C) 2009 Robert Collins <robertc@robertcollins.net>
7+# Copyright (C) 2009 Duncan McGreggor <duncan@canonical.com>
8+# Copyright (C) 2009 Thomas Hervé <thomas@canonical.com>
9 # Licenced under the txaws licence available at /LICENSE in the txaws source.
10
11 """EC2 client support."""
12@@ -8,6 +11,7 @@
13
14 from twisted.web.client import getPage
15
16+from txaws import version
17 from txaws.credentials import AWSCredentials
18 from txaws.service import AWSServiceEndpoint
19 from txaws.util import iso8601time, XML
20@@ -140,6 +144,14 @@
21 return the object that most developers and their code will be
22 interested in: the instances. In instances reservation is available on
23 the instance object.
24+
25+ The following instance attributes are optional:
26+ * ami_launch_index
27+ * key_name
28+ * kernel_id
29+ * product_codes
30+ * ramdisk_id
31+ * reason
32 """
33 root = XML(xml_bytes)
34 results = []
35@@ -171,9 +183,10 @@
36 placement = instance_data.find("placement").findtext(
37 "availabilityZone")
38 products = []
39- for product_data in instance_data.find("productCodesSet"):
40- product_code = product_data.findtext("productCode")
41- products.append(product_code)
42+ product_codes = instance_data.find("productCodes")
43+ if product_codes:
44+ for product_data in instance_data.find("productCodes"):
45+ products.append(product_data.text)
46 kernel_id = instance_data.findtext("kernelId")
47 ramdisk_id = instance_data.findtext("ramdiskId")
48 instance = Instance(
49@@ -362,15 +375,15 @@
50 """A query that may be submitted to EC2."""
51
52 def __init__(self, action, creds, endpoint, other_params=None,
53- time_tuple=None):
54+ time_tuple=None, api_version=None):
55 """Create a Query to submit to EC2."""
56 self.creds = creds
57 self.endpoint = endpoint
58- # Require params (2008-12-01 API):
59- # Version, SignatureVersion, SignatureMethod, Action, AWSAccessKeyId,
60- # Timestamp || Expires, Signature,
61+ # Currently, txAWS only supports version 2008-12-01
62+ if api_version is None:
63+ api_version = version.aws_api
64 self.params = {
65- 'Version': '2008-12-01',
66+ 'Version': api_version,
67 'SignatureVersion': '2',
68 'SignatureMethod': 'HmacSHA1',
69 'Action': action,
70
71=== modified file 'txaws/ec2/tests/test_client.py'
72--- txaws/ec2/tests/test_client.py 2009-08-31 07:52:14 +0000
73+++ txaws/ec2/tests/test_client.py 2009-08-31 20:07:58 +0000
74@@ -1,4 +1,7 @@
75+# -*- coding: utf-8 -*-
76 # Copyright (C) 2009 Robert Collins <robertc@robertcollins.net>
77+# Copyright (C) 2009 Duncan McGreggor <duncan@canonical.com>
78+# Copyright (C) 2009 Thomas Hervé <thomas@canonical.com>
79 # Licenced under the txaws licence available at /LICENSE in the txaws source.
80
81 from datetime import datetime
82@@ -9,173 +12,10 @@
83 from txaws.credentials import AWSCredentials
84 from txaws.ec2 import client
85 from txaws.service import AWSServiceEndpoint, EC2_ENDPOINT_US
86+from txaws.testing import payload
87 from txaws.testing.base import TXAWSTestCase
88
89
90-sample_describe_instances_result = """<?xml version="1.0"?>
91-<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2008-12-01/">
92- <requestId>52b4c730-f29f-498d-94c1-91efb75994cc</requestId>
93- <reservationSet>
94- <item>
95- <reservationId>r-cf24b1a6</reservationId>
96- <ownerId>123456789012</ownerId>
97- <groupSet>
98- <item>
99- <groupId>default</groupId>
100- </item>
101- </groupSet>
102- <instancesSet>
103- <item>
104- <instanceId>i-abcdef01</instanceId>
105- <imageId>ami-12345678</imageId>
106- <instanceState>
107- <code>16</code>
108- <name>running</name>
109- </instanceState>
110- <privateDnsName>domU-12-31-39-03-15-11.compute-1.internal</privateDnsName>
111- <dnsName>ec2-75-101-245-65.compute-1.amazonaws.com</dnsName>
112- <reason/>
113- <keyName>keyname</keyName>
114- <amiLaunchIndex>0</amiLaunchIndex>
115- <productCodesSet>
116- <item>
117- <productCode>774F4FF8</productCode>
118- </item>
119- </productCodesSet>
120-
121- <instanceType>c1.xlarge</instanceType>
122- <launchTime>2009-04-27T02:23:18.000Z</launchTime>
123- <placement>
124- <availabilityZone>us-east-1c</availabilityZone>
125- </placement>
126- <kernelId>aki-b51cf9dc</kernelId>
127- <ramdiskId>ari-b31cf9da</ramdiskId>
128- </item>
129- </instancesSet>
130- </item>
131- </reservationSet>
132-</DescribeInstancesResponse>
133-"""
134-
135-
136-sample_terminate_instances_result = """<?xml version="1.0"?>
137-<TerminateInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2008-12-01/">
138- <instancesSet>
139- <item>
140- <instanceId>i-1234</instanceId>
141- <shutdownState>
142- <code>32</code>
143- <name>shutting-down</name>
144- </shutdownState>
145- <previousState>
146- <code>16</code>
147- <name>running</name>
148- </previousState>
149- </item>
150- <item>
151- <instanceId>i-5678</instanceId>
152- <shutdownState>
153- <code>32</code>
154- <name>shutting-down</name>
155- </shutdownState>
156- <previousState>
157- <code>32</code>
158- <name>shutting-down</name>
159- </previousState>
160- </item>
161- </instancesSet>
162-</TerminateInstancesResponse>
163-"""
164-
165-
166-sample_describe_volumes_result = """<?xml version="1.0"?>
167-<DescribeVolumesResponse xmlns="http://ec2.amazonaws.com/doc/2008-12-01/">
168- <volumeSet>
169- <item>
170- <volumeId>vol-4282672b</volumeId>
171- <size>800</size>
172- <status>in-use</status>
173- <createTime>2008-05-07T11:51:50.000Z</createTime>
174- <attachmentSet>
175- <item>
176- <volumeId>vol-4282672b</volumeId>
177- <instanceId>i-6058a509</instanceId>
178- <size>800</size>
179- <snapshotId>snap-12345678</snapshotId>
180- <availabilityZone>us-east-1a</availabilityZone>
181- <status>attached</status>
182- <attachTime>2008-05-07T12:51:50.000Z</attachTime>
183- </item>
184- </attachmentSet>
185- </item>
186- </volumeSet>
187-</DescribeVolumesResponse>
188-"""
189-
190-
191-sample_describe_snapshots_result = """<?xml version="1.0"?>
192-<DescribeSnapshotsResponse xmlns="http://ec2.amazonaws.com/doc/2008-12-01">
193- <snapshotSet>
194- <item>
195- <snapshotId>snap-78a54011</snapshotId>
196- <volumeId>vol-4d826724</volumeId>
197- <status>pending</status>
198- <startTime>2008-05-07T12:51:50.000Z</startTime>
199- <progress>80%</progress>
200- </item>
201- </snapshotSet>
202-</DescribeSnapshotsResponse>
203-"""
204-
205-
206-sample_create_volume_result = """<?xml version="1.0"?>
207-<CreateVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2008-12-01">
208- <volumeId>vol-4d826724</volumeId>
209- <size>800</size>
210- <status>creating</status>
211- <createTime>2008-05-07T11:51:50.000Z</createTime>
212- <availabilityZone>us-east-1a</availabilityZone>
213- <snapshotId></snapshotId>
214-</CreateVolumeResponse>
215-"""
216-
217-
218-sample_delete_volume_result = """<?xml version="1.0"?>
219-<DeleteVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2008-12-01">
220- <return>true</return>
221-</DeleteVolumeResponse>
222-"""
223-
224-
225-sample_create_snapshot_result = """<?xml version="1.0"?>
226-<CreateSnapshotResponse xmlns="http://ec2.amazonaws.com/doc/2008-12-01">
227- <snapshotId>snap-78a54011</snapshotId>
228- <volumeId>vol-4d826724</volumeId>
229- <status>pending</status>
230- <startTime>2008-05-07T12:51:50.000Z</startTime>
231- <progress></progress>
232-</CreateSnapshotResponse>
233-"""
234-
235-
236-sample_delete_snapshot_result = """<?xml version="1.0"?>
237-<DeleteSnapshotResponse xmlns="http://ec2.amazonaws.com/doc/2008-12-01">
238- <return>true</return>
239-</DeleteSnapshotResponse>
240-"""
241-
242-
243-sample_attach_volume_result = """<?xml version="1.0"?>
244-<AttachVolumeResponse xmlns="http://ec2.amazonaws.com/doc/2008-12-01">
245- <volumeId>vol-4d826724</volumeId>
246- <instanceId>i-6058a509</instanceId>
247- <device>/dev/sdh</device>
248- <status>attaching</status>
249- <attachTime>2008-05-07T11:51:50.000Z</attachTime>
250-</AttachVolumeResponse>
251-"""
252-
253-
254 class ReservationTestCase(TXAWSTestCase):
255
256 def test_reservation_creation(self):
257@@ -251,10 +91,39 @@
258 self.assertEquals(instance.kernel_id, "aki-b51cf9dc")
259 self.assertEquals(instance.ramdisk_id, "ari-b31cf9da")
260
261+ def check_parsed_instances_required(self, results):
262+ instance = results[0]
263+ # check reservations
264+ reservation = instance.reservation
265+ self.assertEquals(reservation.reservation_id, "r-cf24b1a6")
266+ self.assertEquals(reservation.owner_id, "123456789012")
267+ # check groups
268+ group = reservation.groups[0]
269+ self.assertEquals(group, "default")
270+ # check instance
271+ self.assertEquals(instance.instance_id, "i-abcdef01")
272+ self.assertEquals(instance.instance_state, "running")
273+ self.assertEquals(instance.instance_type, "c1.xlarge")
274+ self.assertEquals(instance.image_id, "ami-12345678")
275+ self.assertEquals(
276+ instance.private_dns_name,
277+ "domU-12-31-39-03-15-11.compute-1.internal")
278+ self.assertEquals(
279+ instance.dns_name,
280+ "ec2-75-101-245-65.compute-1.amazonaws.com")
281+ self.assertEquals(instance.key_name, None)
282+ self.assertEquals(instance.ami_launch_index, None)
283+ self.assertEquals(instance.launch_time, "2009-04-27T02:23:18.000Z")
284+ self.assertEquals(instance.placement, "us-east-1c")
285+ self.assertEquals(instance.product_codes, [])
286+ self.assertEquals(instance.kernel_id, None)
287+ self.assertEquals(instance.ramdisk_id, None)
288+
289 def test_parse_reservation(self):
290 creds = AWSCredentials("foo", "bar")
291 ec2 = client.EC2Client(creds=creds)
292- results = ec2._parse_instances(sample_describe_instances_result)
293+ results = ec2._parse_instances(
294+ payload.sample_describe_instances_result)
295 self.check_parsed_instances(results)
296
297 def test_describe_instances(self):
298@@ -264,13 +133,28 @@
299 self.assertEqual(creds.access_key, "foo")
300 self.assertEqual(creds.secret_key, "bar")
301 def submit(self):
302- return succeed(sample_describe_instances_result)
303+ return succeed(payload.sample_describe_instances_result)
304 creds = AWSCredentials("foo", "bar")
305 ec2 = client.EC2Client(creds, query_factory=StubQuery)
306 d = ec2.describe_instances()
307 d.addCallback(self.check_parsed_instances)
308 return d
309
310+ def test_describe_instances_required(self):
311+ class StubQuery(object):
312+ def __init__(stub, action, creds, endpoint):
313+ self.assertEqual(action, 'DescribeInstances')
314+ self.assertEqual(creds.access_key, "foo")
315+ self.assertEqual(creds.secret_key, "bar")
316+ def submit(self):
317+ return succeed(
318+ payload.sample_required_describe_instances_result)
319+ creds = AWSCredentials("foo", "bar")
320+ ec2 = client.EC2Client(creds, query_factory=StubQuery)
321+ d = ec2.describe_instances()
322+ d.addCallback(self.check_parsed_instances_required)
323+ return d
324+
325 def test_terminate_instances(self):
326 class StubQuery(object):
327 def __init__(stub, action, creds, endpoint, other_params):
328@@ -281,7 +165,7 @@
329 {'InstanceId.1': 'i-1234', 'InstanceId.2': 'i-5678'},
330 other_params)
331 def submit(self):
332- return succeed(sample_terminate_instances_result)
333+ return succeed(payload.sample_terminate_instances_result)
334 creds = AWSCredentials("foo", "bar")
335 endpoint = AWSServiceEndpoint(uri=EC2_ENDPOINT_US)
336 ec2 = client.EC2Client(creds=creds, endpoint=endpoint,
337@@ -414,7 +298,7 @@
338 self.assertEquals(params, {})
339
340 def submit(self):
341- return succeed(sample_describe_volumes_result)
342+ return succeed(payload.sample_describe_volumes_result)
343
344 ec2 = client.EC2Client(creds="foo", query_factory=StubQuery)
345 d = ec2.describe_volumes()
346@@ -432,7 +316,7 @@
347 {"VolumeId.1": "vol-4282672b"})
348
349 def submit(self):
350- return succeed(sample_describe_volumes_result)
351+ return succeed(payload.sample_describe_volumes_result)
352
353 ec2 = client.EC2Client(creds="foo", query_factory=StubQuery)
354 d = ec2.describe_volumes("vol-4282672b")
355@@ -458,7 +342,7 @@
356 self.assertEquals(params, {})
357
358 def submit(self):
359- return succeed(sample_describe_snapshots_result)
360+ return succeed(payload.sample_describe_snapshots_result)
361
362 ec2 = client.EC2Client(creds="foo", query_factory=StubQuery)
363 d = ec2.describe_snapshots()
364@@ -476,7 +360,7 @@
365 {"SnapshotId.1": "snap-78a54011"})
366
367 def submit(self):
368- return succeed(sample_describe_snapshots_result)
369+ return succeed(payload.sample_describe_snapshots_result)
370
371 ec2 = client.EC2Client(creds="foo", query_factory=StubQuery)
372 d = ec2.describe_snapshots("snap-78a54011")
373@@ -494,7 +378,7 @@
374 params)
375
376 def submit(self):
377- return succeed(sample_create_volume_result)
378+ return succeed(payload.sample_create_volume_result)
379
380 def check_parsed_volume(volume):
381 self.assertEquals(volume.id, "vol-4d826724")
382@@ -519,7 +403,7 @@
383 params)
384
385 def submit(self):
386- return succeed(sample_create_volume_result)
387+ return succeed(payload.sample_create_volume_result)
388
389 def check_parsed_volume(volume):
390 self.assertEquals(volume.id, "vol-4d826724")
391@@ -558,7 +442,7 @@
392 params)
393
394 def submit(self):
395- return succeed(sample_delete_volume_result)
396+ return succeed(payload.sample_delete_volume_result)
397
398 ec2 = client.EC2Client(creds="foo", query_factory=StubQuery)
399 d = ec2.delete_volume("vol-4282672b")
400@@ -576,7 +460,7 @@
401 params)
402
403 def submit(self):
404- return succeed(sample_create_snapshot_result)
405+ return succeed(payload.sample_create_snapshot_result)
406
407 def check_parsed_snapshot(snapshot):
408 self.assertEquals(snapshot.id, "snap-78a54011")
409@@ -602,7 +486,7 @@
410 params)
411
412 def submit(self):
413- return succeed(sample_delete_snapshot_result)
414+ return succeed(payload.sample_delete_snapshot_result)
415
416 ec2 = client.EC2Client(creds="foo", query_factory=StubQuery)
417 d = ec2.delete_snapshot("snap-78a54011")
418@@ -621,7 +505,7 @@
419 params)
420
421 def submit(self):
422- return succeed(sample_attach_volume_result)
423+ return succeed(payload.sample_attach_volume_result)
424
425 def check_parsed_response(response):
426 self.assertEquals(
427
428=== added file 'txaws/testing/payload.py'
429--- txaws/testing/payload.py 1970-01-01 00:00:00 +0000
430+++ txaws/testing/payload.py 2009-08-31 20:07:58 +0000
431@@ -0,0 +1,198 @@
432+from txaws.version import aws_api
433+
434+
435+sample_required_describe_instances_result = """<?xml version="1.0"?>
436+<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/""" + aws_api + """/">
437+ <requestId>52b4c730-f29f-498d-94c1-91efb75994cc</requestId>
438+ <reservationSet>
439+ <item>
440+ <reservationId>r-cf24b1a6</reservationId>
441+ <ownerId>123456789012</ownerId>
442+ <groupSet>
443+ <item>
444+ <groupId>default</groupId>
445+ </item>
446+ </groupSet>
447+ <instancesSet>
448+ <item>
449+ <instanceId>i-abcdef01</instanceId>
450+ <imageId>ami-12345678</imageId>
451+ <instanceState>
452+ <code>16</code>
453+ <name>running</name>
454+ </instanceState>
455+ <privateDnsName>domU-12-31-39-03-15-11.compute-1.internal</privateDnsName>
456+ <dnsName>ec2-75-101-245-65.compute-1.amazonaws.com</dnsName>
457+ <instanceType>c1.xlarge</instanceType>
458+ <launchTime>2009-04-27T02:23:18.000Z</launchTime>
459+ <placement>
460+ <availabilityZone>us-east-1c</availabilityZone>
461+ </placement>
462+ </item>
463+ </instancesSet>
464+ </item>
465+ </reservationSet>
466+</DescribeInstancesResponse>
467+"""
468+
469+
470+sample_describe_instances_result = """<?xml version="1.0"?>
471+<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/""" + aws_api + """/">
472+ <requestId>52b4c730-f29f-498d-94c1-91efb75994cc</requestId>
473+ <reservationSet>
474+ <item>
475+ <reservationId>r-cf24b1a6</reservationId>
476+ <ownerId>123456789012</ownerId>
477+ <groupSet>
478+ <item>
479+ <groupId>default</groupId>
480+ </item>
481+ </groupSet>
482+ <instancesSet>
483+ <item>
484+ <instanceId>i-abcdef01</instanceId>
485+ <imageId>ami-12345678</imageId>
486+ <instanceState>
487+ <code>16</code>
488+ <name>running</name>
489+ </instanceState>
490+ <privateDnsName>domU-12-31-39-03-15-11.compute-1.internal</privateDnsName>
491+ <dnsName>ec2-75-101-245-65.compute-1.amazonaws.com</dnsName>
492+ <reason/>
493+ <keyName>keyname</keyName>
494+ <amiLaunchIndex>0</amiLaunchIndex>
495+ <productCodes>
496+ <productCode>774F4FF8</productCode>
497+ </productCodes>
498+
499+ <instanceType>c1.xlarge</instanceType>
500+ <launchTime>2009-04-27T02:23:18.000Z</launchTime>
501+ <placement>
502+ <availabilityZone>us-east-1c</availabilityZone>
503+ </placement>
504+ <kernelId>aki-b51cf9dc</kernelId>
505+ <ramdiskId>ari-b31cf9da</ramdiskId>
506+ </item>
507+ </instancesSet>
508+ </item>
509+ </reservationSet>
510+</DescribeInstancesResponse>
511+"""
512+
513+
514+sample_terminate_instances_result = """<?xml version="1.0"?>
515+<TerminateInstancesResponse xmlns="http://ec2.amazonaws.com/doc/""" + aws_api + """/">
516+ <instancesSet>
517+ <item>
518+ <instanceId>i-1234</instanceId>
519+ <shutdownState>
520+ <code>32</code>
521+ <name>shutting-down</name>
522+ </shutdownState>
523+ <previousState>
524+ <code>16</code>
525+ <name>running</name>
526+ </previousState>
527+ </item>
528+ <item>
529+ <instanceId>i-5678</instanceId>
530+ <shutdownState>
531+ <code>32</code>
532+ <name>shutting-down</name>
533+ </shutdownState>
534+ <previousState>
535+ <code>32</code>
536+ <name>shutting-down</name>
537+ </previousState>
538+ </item>
539+ </instancesSet>
540+</TerminateInstancesResponse>
541+"""
542+
543+
544+sample_describe_volumes_result = """<?xml version="1.0"?>
545+<DescribeVolumesResponse xmlns="http://ec2.amazonaws.com/doc/""" + aws_api + """/">
546+ <volumeSet>
547+ <item>
548+ <volumeId>vol-4282672b</volumeId>
549+ <size>800</size>
550+ <status>in-use</status>
551+ <createTime>2008-05-07T11:51:50.000Z</createTime>
552+ <attachmentSet>
553+ <item>
554+ <volumeId>vol-4282672b</volumeId>
555+ <instanceId>i-6058a509</instanceId>
556+ <size>800</size>
557+ <snapshotId>snap-12345678</snapshotId>
558+ <availabilityZone>us-east-1a</availabilityZone>
559+ <status>attached</status>
560+ <attachTime>2008-05-07T12:51:50.000Z</attachTime>
561+ </item>
562+ </attachmentSet>
563+ </item>
564+ </volumeSet>
565+</DescribeVolumesResponse>
566+"""
567+
568+
569+sample_describe_snapshots_result = """<?xml version="1.0"?>
570+<DescribeSnapshotsResponse xmlns="http://ec2.amazonaws.com/doc/""" + aws_api + """/">
571+ <snapshotSet>
572+ <item>
573+ <snapshotId>snap-78a54011</snapshotId>
574+ <volumeId>vol-4d826724</volumeId>
575+ <status>pending</status>
576+ <startTime>2008-05-07T12:51:50.000Z</startTime>
577+ <progress>80%</progress>
578+ </item>
579+ </snapshotSet>
580+</DescribeSnapshotsResponse>
581+"""
582+
583+
584+sample_create_volume_result = """<?xml version="1.0"?>
585+<CreateVolumeResponse xmlns="http://ec2.amazonaws.com/doc/""" + aws_api + """/">
586+ <volumeId>vol-4d826724</volumeId>
587+ <size>800</size>
588+ <status>creating</status>
589+ <createTime>2008-05-07T11:51:50.000Z</createTime>
590+ <availabilityZone>us-east-1a</availabilityZone>
591+ <snapshotId></snapshotId>
592+</CreateVolumeResponse>
593+"""
594+
595+
596+sample_delete_volume_result = """<?xml version="1.0"?>
597+<DeleteVolumeResponse xmlns="http://ec2.amazonaws.com/doc/""" + aws_api + """/">
598+ <return>true</return>
599+</DeleteVolumeResponse>
600+"""
601+
602+
603+sample_create_snapshot_result = """<?xml version="1.0"?>
604+<CreateSnapshotResponse xmlns="http://ec2.amazonaws.com/doc/""" + aws_api + """/">
605+ <snapshotId>snap-78a54011</snapshotId>
606+ <volumeId>vol-4d826724</volumeId>
607+ <status>pending</status>
608+ <startTime>2008-05-07T12:51:50.000Z</startTime>
609+ <progress></progress>
610+</CreateSnapshotResponse>
611+"""
612+
613+
614+sample_delete_snapshot_result = """<?xml version="1.0"?>
615+<DeleteSnapshotResponse xmlns="http://ec2.amazonaws.com/doc/""" + aws_api + """/">
616+ <return>true</return>
617+</DeleteSnapshotResponse>
618+"""
619+
620+
621+sample_attach_volume_result = """<?xml version="1.0"?>
622+<AttachVolumeResponse xmlns="http://ec2.amazonaws.com/doc/""" + aws_api + """/">
623+ <volumeId>vol-4d826724</volumeId>
624+ <instanceId>i-6058a509</instanceId>
625+ <device>/dev/sdh</device>
626+ <status>attaching</status>
627+ <attachTime>2008-05-07T11:51:50.000Z</attachTime>
628+</AttachVolumeResponse>
629+"""
630
631=== added file 'txaws/version.py'
632--- txaws/version.py 1970-01-01 00:00:00 +0000
633+++ txaws/version.py 2009-08-31 20:07:58 +0000
634@@ -0,0 +1,2 @@
635+txaws = "0.0.1"
636+aws_api = "2008-12-01"

Subscribers

People subscribed via source and target branches