From b8dfde6f405e23a61e3fe64ce4d0682d71a3d622 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Toma=C5=BE=20Muraus?= <kami@k5-storitve.net>
Date: Fri, 7 Jan 2011 20:53:33 +0100
Subject: [PATCH] Make create_node backward compatible and don't throw an exception if a
 NodeLocation object passed to the create_node method doesn't have
 availability_zone attribute.

---
 libcloud/drivers/ec2.py |   12 +++++++-----
 test/test_ec2.py        |   15 ++++++++++++++-
 2 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/libcloud/drivers/ec2.py b/libcloud/drivers/ec2.py
index cb7b1d8..b8bf7df 100644
--- a/libcloud/drivers/ec2.py
+++ b/libcloud/drivers/ec2.py
@@ -615,11 +615,13 @@ class EC2NodeDriver(NodeDriver):
                 params['SecurityGroup.%d' % (sig+1,)]  = kwargs['ex_securitygroup'][sig]
 
         if 'location' in kwargs:
-            availability_zone = kwargs['location'].availability_zone
-            if availability_zone.region_name != self.region_name:
-                raise AttributeError('Invalid availability zone: %s'
-                                     % (availability_zone.name))
-            params['Placement.AvailabilityZone'] = availability_zone.name
+            availability_zone = getattr(kwargs['location'], 'availability_zone',
+                                        None)
+            if availability_zone:
+                if availability_zone.region_name != self.region_name:
+                    raise AttributeError('Invalid availability zone: %s'
+                                         % (availability_zone.name))
+                params['Placement.AvailabilityZone'] = availability_zone.name
 
         if 'ex_keyname' in kwargs:
             params['KeyName'] = kwargs['ex_keyname']
diff --git a/test/test_ec2.py b/test/test_ec2.py
index 09700ff..69d510e 100644
--- a/test/test_ec2.py
+++ b/test/test_ec2.py
@@ -16,7 +16,7 @@ import sys
 import unittest
 
 from libcloud.drivers.ec2 import EC2NodeDriver, EC2APSENodeDriver, IdempotentParamError
-from libcloud.base import Node, NodeImage, NodeSize
+from libcloud.base import Node, NodeImage, NodeSize, NodeLocation
 
 from test import MockHttp, TestCaseMixin
 from test.file_fixtures import FileFixtures
@@ -72,6 +72,19 @@ class EC2Tests(unittest.TestCase, TestCaseMixin):
             idem_error = e
         self.assertTrue(idem_error is not None)
 
+    def test_create_node_no_availability_zone(self):
+        image = NodeImage(id='ami-be3adfd7',
+                          name='ec2-public-images/fedora-8-i386-base-v1.04.manifest.xml',
+                          driver=self.driver)
+        size = NodeSize('m1.small', 'Small Instance', None, None, None, None,
+                        driver=self.driver)
+        node = self.driver.create_node(name='foo', image=image, size=size)
+        location = NodeLocation(0, 'Amazon US N. Virginia', 'US', self.driver)
+        self.assertEqual(node.id, 'i-2ba64342')
+        node = self.driver.create_node(name='foo', image=image, size=size,
+                                       location=location)
+        self.assertEqual(node.id, 'i-2ba64342')
+
     def test_list_nodes(self):
         node = self.driver.list_nodes()[0]
         self.assertEqual(node.id, 'i-4382922a')
-- 
1.7.3.4

