summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloudinit/sources/DataSourceGCE.py65
1 files changed, 44 insertions, 21 deletions
diff --git a/cloudinit/sources/DataSourceGCE.py b/cloudinit/sources/DataSourceGCE.py
index e2be15b0..c993293f 100644
--- a/cloudinit/sources/DataSourceGCE.py
+++ b/cloudinit/sources/DataSourceGCE.py
@@ -51,37 +51,60 @@ class DataSourceGCE(sources.DataSource):
# GCE metadata server requires a custom header since v1
headers = {'X-Google-Metadata-Request': True}
- url_map = {
- 'instance-id': self.metadata_address + 'instance/id',
- 'availability-zone': self.metadata_address + 'instance/zone',
- 'public-keys': self.metadata_address + 'project/attributes/sshKeys',
- 'local-hostname': self.metadata_address + 'instance/hostname',
- 'user-data': self.metadata_address + 'instance/attributes/user-data',
- }
+ # url_map: (our-key, path, required)
+ url_map = [
+ ('instance-id', 'instance/id', True),
+ ('availability-zone', 'instance/zone', True),
+ ('local-hostname', 'instance/hostname', True),
+ ('public-keys', 'project/attributes/sshKeys', False),
+ ('user-data', 'instance/attributes/user-data', False),
+ ]
# if we cannot resolve the metadata server, then no point in trying
if not util.is_resolvable(self.metadata_address):
- LOG.debug('{0} is not resolvable'.format(self.metadata_address))
+ LOG.debug("%s is not resolvable", self.metadata_address)
return False
# iterate over url_map keys to get metadata items
- for mkey in url_map.iterkeys():
+ found = False
+ for (mkey, path, required) in url_map:
try:
- resp = url_helper.readurl(
- url=url_map[mkey], headers=headers)
+ resp = url_helper.readurl(url=self.metadata_address + path,
+ headers=headers)
if resp.code == 200:
- if mkey == 'public-keys':
- pub_keys = [self._trim_key(k) for k in resp.contents.splitlines()]
- self.metadata[mkey] = pub_keys
- else:
- self.metadata[mkey] = resp.contents
+ found = True
+ self.metadata[mkey] = resp.contents
else:
- self.metadata[mkey] = None
+ if required:
+ msg = "required url %s returned code %s. not GCE"
+ if not found:
+ LOG.debug(msg, path, resp.code)
+ else:
+ LOG.warn(msg, path, resp.code)
+ return False
+ else:
+ self.metadata[mkey] = None
except url_helper.UrlError as e:
+ if required:
+ msg = "required url %s raised exception %s. not GCE"
+ if not found:
+ LOG.debug(msg, path, e)
+ else:
+ LOG.warn(msg, path, e)
+ return False
+ msg = "Failed to get %s metadata item: %s."
+ if found:
+ LOG.warn(msg, path, e)
+ else:
+ LOG.debug(msg, path, e)
+
self.metadata[mkey] = None
- LOG.warn('Failed to get {0} metadata item. Reason {1}.'.format(
- mkey, e))
- return True
+
+ if self.metadata['public-keys']:
+ lines = self.metadata['public-keys'].splitlines()
+ self.metadata['public-keys'] = [self._trim_key(k) for k in lines]
+
+ return found
@property
def launch_index(self):
@@ -94,7 +117,7 @@ class DataSourceGCE(sources.DataSource):
def get_public_ssh_keys(self):
return self.metadata['public-keys']
- def get_hostname(self, fqdn=False):
+ def get_hostname(self, fqdn=False, _resolve_ip=False):
return self.metadata['local-hostname']
def get_userdata_raw(self):