diff options
-rw-r--r-- | cloudinit/sources/DataSourceGCE.py | 65 |
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): |