def wait_for_metadata_service(self, url): mcfg = self.ds_cfg max_wait = 120 try: max_wait = int(mcfg.get("max_wait", max_wait)) except Exception: util.logexc(log) log.warn("Failed to get max wait. using %s" % max_wait) if max_wait == 0: return False timeout = 50 try: timeout = int(mcfg.get("timeout", timeout)) except Exception: util.logexc(log) log.warn("Failed to get timeout, using %s" % timeout) starttime = time.time() check_url = "%s/%s/meta-data/instance-id" % (url, MD_VERSION) url = util.wait_for_url(urls=[check_url], max_wait=max_wait, timeout=timeout, status_cb=log.warn, headers_cb=self.md_headers) if url: log.debug("Using metadata source: '%s'" % url) else: log.critical("giving up on md after %i seconds\n" % int(time.time() - starttime)) return (bool(url))
def get_data(self): mcfg = self.ds_cfg try: (userdata, metadata) = read_maas_seed_dir(self.seeddir) self.userdata_raw = userdata self.metadata = metadata self.baseurl = self.seeddir return True except MAASSeedDirNone: pass except MAASSeedDirMalformed as exc: log.warn("%s was malformed: %s\n" % (self.seeddir, exc)) raise try: # if there is no metadata_url, then we're not configured url = mcfg.get('metadata_url', None) if url == None: return False if not self.wait_for_metadata_service(url): return False self.baseurl = url (userdata, metadata) = read_maas_seed_url(self.baseurl, self.md_headers) self.userdata_raw = userdata self.metadata = metadata return True except Exception: util.logexc(log) return False
def get_data(self): found = None md = {} ud = "" defaults = {"instance-id": DEFAULT_IID, "dsmode": "pass"} if os.path.isdir(self.seeddir): try: (md, ud) = read_config_drive_dir(self.seeddir) found = self.seeddir except nonConfigDriveDir: pass if not found: dev = cfg_drive_device() if dev: try: (md, ud) = util.mount_callback_umount(dev, read_config_drive_dir) found = dev except (nonConfigDriveDir, util.mountFailedError): pass if not found: return False if 'dsconfig' in md: self.cfg = md['dscfg'] md = util.mergedict(md, defaults) # update interfaces and ifup only on the local datasource # this way the DataSourceConfigDriveNet doesn't do it also. if 'network-interfaces' in md and self.dsmode == "local": if md['dsmode'] == "pass": log.info("updating network interfaces from configdrive") else: log.debug("updating network interfaces from configdrive") util.write_file("/etc/network/interfaces", md['network-interfaces']) try: (out, err) = util.subp(['ifup', '--all']) if len(out) or len(err): log.warn("ifup --all had stderr: %s" % err) except subprocess.CalledProcessError as exc: log.warn("ifup --all failed: %s" % (exc.output[1])) self.seed = found self.metadata = md self.userdata_raw = ud if md['dsmode'] == self.dsmode: return True log.debug("%s: not claiming datasource, dsmode=%s" % (self, md['dsmode'])) return False
def wait_for_metadata_service(self): mcfg = self.ds_cfg if not hasattr(mcfg, "get"): mcfg = {} max_wait = 120 try: max_wait = int(mcfg.get("max_wait", max_wait)) except Exception: util.logexc(log) log.warn("Failed to get max wait. using %s" % max_wait) if max_wait == 0: return False timeout = 50 try: timeout = int(mcfg.get("timeout", timeout)) except Exception: util.logexc(log) log.warn("Failed to get timeout, using %s" % timeout) def_mdurls = ["http://169.254.169.254", "http://instance-data.:8773"] mdurls = mcfg.get("metadata_urls", def_mdurls) # Remove addresses from the list that wont resolve. filtered = [x for x in mdurls if util.is_resolvable_url(x)] if set(filtered) != set(mdurls): log.debug("removed the following from metadata urls: %s" % list( (set(mdurls) - set(filtered)))) if len(filtered): mdurls = filtered else: log.warn("Empty metadata url list! using default list") mdurls = def_mdurls urls = [] url2base = {False: False} for url in mdurls: cur = "%s/%s/meta-data/instance-id" % (url, self.api_ver) urls.append(cur) url2base[cur] = url starttime = time.time() url = util.wait_for_url(urls=urls, max_wait=max_wait, timeout=timeout, status_cb=log.warn) if url: log.debug("Using metadata source: '%s'" % url2base[url]) else: log.critical("giving up on md after %i seconds\n" % int(time.time() - starttime)) self.metadata_address = url2base[url] return (bool(url))
def wait_for_metadata_service(self): mcfg = self.ds_cfg if not hasattr(mcfg, "get"): mcfg = {} max_wait = 120 try: max_wait = int(mcfg.get("max_wait", max_wait)) except Exception: util.logexc(log) log.warn("Failed to get max wait. using %s" % max_wait) if max_wait == 0: return False timeout = 50 try: timeout = int(mcfg.get("timeout", timeout)) except Exception: util.logexc(log) log.warn("Failed to get timeout, using %s" % timeout) def_mdurls = ["http://169.254.169.254", "http://instance-data.:8773"] mdurls = mcfg.get("metadata_urls", def_mdurls) # Remove addresses from the list that wont resolve. filtered = [x for x in mdurls if util.is_resolvable_url(x)] if set(filtered) != set(mdurls): log.debug("removed the following from metadata urls: %s" % list((set(mdurls) - set(filtered)))) if len(filtered): mdurls = filtered else: log.warn("Empty metadata url list! using default list") mdurls = def_mdurls urls = [] url2base = {False: False} for url in mdurls: cur = "%s/%s/meta-data/instance-id" % (url, self.api_ver) urls.append(cur) url2base[cur] = url starttime = time.time() url = util.wait_for_url(urls=urls, max_wait=max_wait, timeout=timeout, status_cb=log.warn) if url: log.debug("Using metadata source: '%s'" % url2base[url]) else: log.critical("giving up on md after %i seconds\n" % int(time.time() - starttime)) self.metadata_address = url2base[url] return (bool(url))
def get_data(self): defaults = { "instance-id": "nocloud", "dsmode": self.dsmode } found = [] md = {} ud = "" try: # parse the kernel command line, getting data passed in if parse_cmdline_data(self.cmdline_id, md): found.append("cmdline") except: util.logexc(log) return False # check to see if the seeddir has data. seedret = {} if util.read_optional_seed(seedret, base=self.seeddir + "/"): md = util.mergedict(md, seedret['meta-data']) ud = seedret['user-data'] found.append(self.seeddir) log.debug("using seeded cache data in %s" % self.seeddir) # if the datasource config had a 'seedfrom' entry, then that takes # precedence over a 'seedfrom' that was found in a filesystem # but not over external medi if 'seedfrom' in self.ds_cfg and self.ds_cfg['seedfrom']: found.append("ds_config") md["seedfrom"] = self.ds_cfg['seedfrom'] fslist = util.find_devs_with("TYPE=vfat") fslist.extend(util.find_devs_with("TYPE=iso9660")) label_list = util.find_devs_with("LABEL=cidata") devlist = list(set(fslist) & set(label_list)) devlist.sort(reverse=True) for dev in devlist: try: (newmd, newud) = util.mount_callback_umount(dev, util.read_seeded) md = util.mergedict(newmd, md) ud = newud # for seed from a device, the default mode is 'net'. # that is more likely to be what is desired. # If they want dsmode of local, then they must # specify that. if 'dsmode' not in md: md['dsmode'] = "net" log.debug("using data from %s" % dev) found.append(dev) break except OSError, e: if e.errno != errno.ENOENT: raise except util.mountFailedError: log.warn("Failed to mount %s when looking for seed" % dev)
md = util.mergedict(md, defaults) # update the network-interfaces if metadata had 'network-interfaces' # entry and this is the local datasource, or 'seedfrom' was used # and the source of the seed was self.dsmode # ('local' for NoCloud, 'net' for NoCloudNet') if ('network-interfaces' in md and (self.dsmode in ("local", seeded_interfaces))): log.info("updating network interfaces from nocloud") util.write_file("/etc/network/interfaces", md['network-interfaces']) try: (out, err) = util.subp(['ifup', '--all']) if len(out) or len(err): log.warn("ifup --all had stderr: %s" % err) except subprocess.CalledProcessError as exc: log.warn("ifup --all failed: %s" % (exc.output[1])) self.seed = ",".join(found) self.metadata = md self.userdata_raw = ud if md['dsmode'] == self.dsmode: return True log.debug("%s: not claiming datasource, dsmode=%s" % (self, md['dsmode'])) return False