← Back to team overview

cloud-init-dev team mailing list archive

[Merge] lp:~daniel-thewatkins/cloud-init/fix-gce-az into lp:cloud-init

 

Dan Watkins has proposed merging lp:~daniel-thewatkins/cloud-init/fix-gce-az into lp:cloud-init.

Requested reviews:
  cloud init development team (cloud-init-dev)

For more details, see:
https://code.launchpad.net/~daniel-thewatkins/cloud-init/fix-gce-az/+merge/263907

GCE returns a string like "projects/123456789/zones/us-central1-a" as availability zone, which isn't very useful for us.  This normalises that to a sensible value.
-- 
Your team cloud init development team is requested to review the proposed merge of lp:~daniel-thewatkins/cloud-init/fix-gce-az into lp:cloud-init.
=== modified file 'cloudinit/sources/DataSourceGCE.py'
--- cloudinit/sources/DataSourceGCE.py	2015-04-20 14:24:22 +0000
+++ cloudinit/sources/DataSourceGCE.py	2015-07-06 14:37:59 +0000
@@ -116,6 +116,10 @@
             lines = self.metadata['public-keys'].splitlines()
             self.metadata['public-keys'] = [self._trim_key(k) for k in lines]
 
+        if self.metadata['availability-zone']:
+            self.metadata['availability-zone'] = self.metadata[
+                'availability-zone'].split('/')[-1]
+
         encoding = self.metadata.get('user-data-encoding')
         if encoding:
             if encoding == 'base64':

=== modified file 'tests/unittests/test_datasource/test_gce.py'
--- tests/unittests/test_datasource/test_gce.py	2015-04-20 14:24:22 +0000
+++ tests/unittests/test_datasource/test_gce.py	2015-07-06 14:37:59 +0000
@@ -55,8 +55,8 @@
     r'http://metadata.google.internal./computeMetadata/v1/.*')
 
 
-def _new_request_callback(gce_meta=None):
-    if not gce_meta:
+def _set_mock_metadata(gce_meta=None):
+    if gce_meta is None:
         gce_meta = GCE_META
 
     def _request_callback(method, uri, headers):
@@ -70,9 +70,10 @@
         else:
             return (404, headers, '')
 
-    return _request_callback
-
-
+    httpretty.register_uri(httpretty.GET, MD_URL_RE, body=_request_callback)
+
+
+@httpretty.activate
 class TestDataSourceGCE(test_helpers.HttprettyTestCase):
 
     def setUp(self):
@@ -81,23 +82,16 @@
             helpers.Paths({}))
         super(TestDataSourceGCE, self).setUp()
 
-    @httpretty.activate
     def test_connection(self):
-        httpretty.register_uri(
-            httpretty.GET, MD_URL_RE,
-            body=_new_request_callback())
-
+        _set_mock_metadata()
         success = self.ds.get_data()
         self.assertTrue(success)
 
         req_header = httpretty.last_request().headers
         self.assertDictContainsSubset(HEADERS, req_header)
 
-    @httpretty.activate
     def test_metadata(self):
-        httpretty.register_uri(
-            httpretty.GET, MD_URL_RE,
-            body=_new_request_callback())
+        _set_mock_metadata()
         self.ds.get_data()
 
         shostname = GCE_META.get('instance/hostname').split('.')[0]
@@ -107,18 +101,12 @@
         self.assertEqual(GCE_META.get('instance/id'),
                          self.ds.get_instance_id())
 
-        self.assertEqual(GCE_META.get('instance/zone'),
-                         self.ds.availability_zone)
-
         self.assertEqual(GCE_META.get('instance/attributes/user-data'),
                          self.ds.get_userdata_raw())
 
     # test partial metadata (missing user-data in particular)
-    @httpretty.activate
     def test_metadata_partial(self):
-        httpretty.register_uri(
-            httpretty.GET, MD_URL_RE,
-            body=_new_request_callback(GCE_META_PARTIAL))
+        _set_mock_metadata(GCE_META_PARTIAL)
         self.ds.get_data()
 
         self.assertEqual(GCE_META_PARTIAL.get('instance/id'),
@@ -127,58 +115,52 @@
         shostname = GCE_META_PARTIAL.get('instance/hostname').split('.')[0]
         self.assertEqual(shostname, self.ds.get_hostname())
 
-    @httpretty.activate
     def test_metadata_encoding(self):
-        httpretty.register_uri(
-            httpretty.GET, MD_URL_RE,
-            body=_new_request_callback(GCE_META_ENCODING))
+        _set_mock_metadata(GCE_META_ENCODING)
         self.ds.get_data()
 
         decoded = b64decode(
             GCE_META_ENCODING.get('instance/attributes/user-data'))
         self.assertEqual(decoded, self.ds.get_userdata_raw())
 
-    @httpretty.activate
     def test_missing_required_keys_return_false(self):
         for required_key in ['instance/id', 'instance/zone',
                              'instance/hostname']:
             meta = GCE_META_PARTIAL.copy()
             del meta[required_key]
-            httpretty.register_uri(httpretty.GET, MD_URL_RE,
-                                   body=_new_request_callback(meta))
+            _set_mock_metadata(meta)
             self.assertEqual(False, self.ds.get_data())
             httpretty.reset()
 
-    @httpretty.activate
     def test_project_level_ssh_keys_are_used(self):
-        httpretty.register_uri(httpretty.GET, MD_URL_RE,
-                               body=_new_request_callback())
+        _set_mock_metadata()
         self.ds.get_data()
 
         # we expect a list of public ssh keys with user names stripped
         self.assertEqual(['ssh-rsa AA2..+aRD0fyVw== root@server'],
                          self.ds.get_public_ssh_keys())
 
-    @httpretty.activate
     def test_instance_level_ssh_keys_are_used(self):
         key_content = 'ssh-rsa JustAUser root@server'
         meta = GCE_META.copy()
         meta['instance/attributes/sshKeys'] = 'user:{0}'.format(key_content)
 
-        httpretty.register_uri(httpretty.GET, MD_URL_RE,
-                               body=_new_request_callback(meta))
+        _set_mock_metadata(meta)
         self.ds.get_data()
 
         self.assertIn(key_content, self.ds.get_public_ssh_keys())
 
-    @httpretty.activate
     def test_instance_level_keys_replace_project_level_keys(self):
         key_content = 'ssh-rsa JustAUser root@server'
         meta = GCE_META.copy()
         meta['instance/attributes/sshKeys'] = 'user:{0}'.format(key_content)
 
-        httpretty.register_uri(httpretty.GET, MD_URL_RE,
-                               body=_new_request_callback(meta))
+        _set_mock_metadata(meta)
         self.ds.get_data()
 
         self.assertEqual([key_content], self.ds.get_public_ssh_keys())
+
+    def test_only_last_part_of_zone_used_for_availability_zone(self):
+        _set_mock_metadata()
+        self.ds.get_data()
+        self.assertEqual('bar', self.ds.availability_zone)


Follow ups