def read_snippet(self, file): """ Locate the appropriate snippet for the current system and profile and read it's contents. This file could be located in a remote location. This will first check for a per-system snippet, a per-profile snippet, a distro snippet, and a general snippet. If no snippet is located, it returns None. :param file: The file to read- :return: None (if the snippet file was not found) or the string with the read snippet. :rtype: str """ for snipclass in ('system', 'profile', 'distro'): if self.varExists('%s_name' % snipclass): fullpath = '%s/per_%s/%s/%s' % ( self.getVar('autoinstall_snippets_dir'), snipclass, file, self.getVar('%s_name' % snipclass)) try: contents = utils.read_file_contents(fullpath, fetch_if_remote=True) return contents except FileNotFoundException: pass try: return "#errorCatcher ListErrors\n" + utils.read_file_contents( '%s/%s' % (self.getVar('autoinstall_snippets_dir'), file), fetch_if_remote=True) except FileNotFoundException: return None
def read_snippet(self, file: str) -> Optional[str]: """ Locate the appropriate snippet for the current system and profile and read it's contents. This file could be located in a remote location. This will first check for a per-system snippet, a per-profile snippet, a distro snippet, and a general snippet. :param file: The name of the file to read. Depending on the context this gets expanded automatically. :return: None (if the snippet file was not found) or the string with the read snippet. :raises AttributeError or FileNotFoundError """ if not self.varExists('autoinstall_snippets_dir'): raise AttributeError( "\"autoinstall_snippets_dir\" is required to find Snippets") for snippet_class in ('system', 'profile', 'distro'): if self.varExists('%s_name' % snippet_class): full_path = '%s/per_%s/%s/%s' % ( self.getVar('autoinstall_snippets_dir'), snippet_class, file, self.getVar('%s_name' % snippet_class)) try: contents = utils.read_file_contents(full_path, fetch_if_remote=True) return contents except FileNotFoundError: pass try: full_path = '%s/%s' % (self.getVar('autoinstall_snippets_dir'), file) return "#errorCatcher ListErrors\n" + utils.read_file_contents( full_path, fetch_if_remote=True) except FileNotFoundError: return None
def generate_autoinstall(self, profile=None, system=None) -> str: """ This is an internal method for generating an autoinstall config/script. Please use the ``generate_autoinstall_for_*`` methods. If you insist on using this mehtod please only supply a profile or a system, not both. :param profile: The profile to use for generating the autoinstall config/script. :param system: The system to use for generating the autoinstall config/script. If both arguments are given, this wins. :return: The autoinstall script or configuration file as a string. """ obj = system obj_type = "system" if system is None: obj = profile obj_type = "profile" meta = utils.blender(self.api, False, obj) autoinstall_rel_path = meta["autoinstall"] if not autoinstall_rel_path: return "# automatic installation file value missing or invalid at %s %s" % (obj_type, obj.name) # get parent distro distro = profile.get_conceptual_parent() if system is not None: distro = system.get_conceptual_parent().get_conceptual_parent() # make autoinstall_meta metavariable available at top level autoinstall_meta = meta["autoinstall_meta"] del meta["autoinstall_meta"] meta.update(autoinstall_meta) # add package repositories metadata to autoinstall metavariables if distro.breed == "redhat": meta["yum_repo_stanza"] = self.generate_repo_stanza(obj, (system is None)) meta["yum_config_stanza"] = self.generate_config_stanza(obj, (system is None)) # FIXME: implement something similar to zypper (SUSE based distros) and apt (Debian based distros) meta["kernel_options"] = utils.dict_to_string(meta["kernel_options"]) if "kernel_options_post" in meta: meta["kernel_options_post"] = utils.dict_to_string(meta["kernel_options_post"]) # add install_source_directory metavariable to autoinstall metavariables if distro is based on Debian if distro.breed in ["debian", "ubuntu"] and "tree" in meta: urlparts = urllib.parse.urlsplit(meta["tree"]) meta["install_source_directory"] = urlparts[2] try: autoinstall_path = "%s/%s" % (self.settings.autoinstall_templates_dir, autoinstall_rel_path) raw_data = utils.read_file_contents(autoinstall_path) data = self.templar.render(raw_data, meta, None) return data except FileNotFoundError: error_msg = "automatic installation file %s not found at %s" \ % (meta["autoinstall"], self.settings.autoinstall_templates_dir) self.api.logger.warning(error_msg) return "# %s" % error_msg
def generate_autoinstall(self, profile=None, system=None): obj = system obj_type = "system" if system is None: obj = profile obj_type = "profile" meta = utils.blender(self.api, False, obj) autoinstall_rel_path = meta["autoinstall"] if not autoinstall_rel_path: return "# automatic installation file value missing or invalid at %s %s" % ( obj_type, obj.name) # get parent distro distro = profile.get_conceptual_parent() if system is not None: distro = system.get_conceptual_parent().get_conceptual_parent() # make autoinstall_meta metavariable available at top level autoinstall_meta = meta["autoinstall_meta"] del meta["autoinstall_meta"] meta.update(autoinstall_meta) # add package repositories metadata to autoinstall metavariables if distro.breed == "redhat": meta["yum_repo_stanza"] = self.generate_repo_stanza( obj, (system is None)) meta["yum_config_stanza"] = self.generate_config_stanza( obj, (system is None)) # FIXME: implement something similar to zypper (SUSE based distros) and apt # (Debian based distros) meta["kernel_options"] = utils.dict_to_string(meta["kernel_options"]) if "kernel_options_post" in meta: meta["kernel_options_post"] = utils.dict_to_string( meta["kernel_options_post"]) # add install_source_directory metavariable to autoinstall metavariables # if distro is based on Debian if distro.breed in ["debian", "ubuntu"] and "tree" in meta: urlparts = urllib.parse.urlsplit(meta["tree"]) meta["install_source_directory"] = urlparts[2] try: autoinstall_path = "%s/%s" % ( self.settings.autoinstall_templates_dir, autoinstall_rel_path) raw_data = utils.read_file_contents(autoinstall_path, self.api.logger) data = self.templar.render(raw_data, meta, None, obj) return data except FileNotFoundException: error_msg = "automatic installation file %s not found at %s" % ( meta["autoinstall"], self.settings.autoinstall_templates_dir) self.api.logger.warning(error_msg) return "# %s" % error_msg
def generate_autoinstall(self, profile=None, system=None): obj = system obj_type = "system" if system is None: obj = profile obj_type = "profile" meta = utils.blender(self.api, False, obj) autoinstall_rel_path = meta["autoinstall"] if not autoinstall_rel_path: return "# automatic installation file value missing or invalid at %s %s" % (obj_type, obj.name) # get parent distro distro = profile.get_conceptual_parent() if system is not None: distro = system.get_conceptual_parent().get_conceptual_parent() # make autoinstall_meta metavariable available at top level autoinstall_meta = meta["autoinstall_meta"] del meta["autoinstall_meta"] meta.update(autoinstall_meta) # add package repositories metadata to autoinstall metavariables if distro.breed == "redhat": meta["yum_repo_stanza"] = self.generate_repo_stanza(obj, (system is None)) meta["yum_config_stanza"] = self.generate_config_stanza(obj, (system is None)) # FIXME: implement something similar to zypper (SUSE based distros) and apt # (Debian based distros) meta["kernel_options"] = utils.dict_to_string(meta["kernel_options"]) if "kernel_options_post" in meta: meta["kernel_options_post"] = utils.dict_to_string(meta["kernel_options_post"]) # add install_source_directory metavariable to autoinstall metavariables # if distro is based on Debian if distro.breed in ["debian", "ubuntu"] and "tree" in meta: urlparts = urlparse.urlsplit(meta["tree"]) meta["install_source_directory"] = urlparts[2] try: autoinstall_path = "%s/%s" % (self.settings.autoinstall_templates_dir, autoinstall_rel_path) raw_data = utils.read_file_contents(autoinstall_path, self.api.logger) data = self.templar.render(raw_data, meta, None, obj) if distro.breed == "suse": # AutoYaST profile data = self.generate_autoyast(profile, system, data) return data except FileNotFoundException: error_msg = "automatic installation file %s not found at %s" % (meta["autoinstall"], self.settings.autoinstall_templates_dir) self.api.logger.warning(error_msg) return "# %s" % error_msg
def generate_kickstart(self, profile=None, system=None): obj = system if system is None: obj = profile meta = utils.blender(self.api, False, obj) kickstart_path = meta["kickstart"] if not kickstart_path: return "# kickstart is missing or invalid: %s" % meta["kickstart"] ksmeta = meta["ks_meta"] del meta["ks_meta"] meta.update(ksmeta) # make available at top level meta["yum_repo_stanza"] = self.generate_repo_stanza( obj, (system is None)) meta["yum_config_stanza"] = self.generate_config_stanza( obj, (system is None)) meta["kernel_options"] = utils.dict_to_string(meta["kernel_options"]) # add extra variables for other distro types if "tree" in meta: urlparts = urlparse.urlsplit(meta["tree"]) meta["install_source_directory"] = urlparts[2] try: raw_data = utils.read_file_contents(kickstart_path, self.api.logger) if raw_data is None: return "# kickstart is sourced externally: %s" % meta[ "kickstart"] distro = profile.get_conceptual_parent() if system is not None: distro = system.get_conceptual_parent().get_conceptual_parent() data = self.templar.render(raw_data, meta, None, obj) if distro.breed == "suse": # AutoYaST profile data = self.generate_autoyast(profile, system, data) return data except FileNotFoundException: self.api.logger.warning("kickstart not found: %s" % meta["kickstart"]) return "# kickstart not found: %s" % meta["kickstart"]
def test_read_file_contents(): # Arrange # TODO: Do this remotely & also a failed test fake_file = "/dev/shm/fakeloremipsum" content = "Lorem Ipsum Bla" with open(fake_file, "w") as f: f.write(content) # Act result = utils.read_file_contents(fake_file) # Cleanup os.remove(fake_file) # Assert assert content == result
def generate_autoinstall(self, profile=None, system=None): obj = system obj_type = "system" if system is None: obj = profile obj_type = "profile" meta = utils.blender(self.api, False, obj) autoinstall_rel_path = meta["autoinstall"] if not autoinstall_rel_path: return "# automatic installation file value missing or invalid at %s %s" % (obj_type, obj.name) autoinstall_meta = meta["autoinstall_meta"] del meta["autoinstall_meta"] meta.update(autoinstall_meta) # make available at top level meta["yum_repo_stanza"] = self.generate_repo_stanza(obj, (system is None)) meta["yum_config_stanza"] = self.generate_config_stanza(obj, (system is None)) meta["kernel_options"] = utils.dict_to_string(meta["kernel_options"]) # add extra variables for other distro types if "tree" in meta: urlparts = urlparse.urlsplit(meta["tree"]) meta["install_source_directory"] = urlparts[2] try: autoinstall_path = "%s/%s" % (self.settings.autoinstall_templates_dir, autoinstall_rel_path) raw_data = utils.read_file_contents(autoinstall_path, self.api.logger) distro = profile.get_conceptual_parent() if system is not None: distro = system.get_conceptual_parent().get_conceptual_parent() data = self.templar.render(raw_data, meta, None, obj) if distro.breed == "suse": # AutoYaST profile data = self.generate_autoyast(profile, system, data) return data except FileNotFoundException: error_msg = "automatic installation file %s not found at %s" % (meta["autoinstall"], self.settings.autoinstall_templates_dir) self.api.logger.warning(error_msg) return "# %s" % error_msg
def generate_kickstart(self, profile=None, system=None): obj = system if system is None: obj = profile meta = utils.blender(self.api, False, obj) kickstart_path = meta["kickstart"] if not kickstart_path: return "# kickstart is missing or invalid: %s" % meta["kickstart"] ksmeta = meta["ks_meta"] del meta["ks_meta"] meta.update(ksmeta) # make available at top level meta["yum_repo_stanza"] = self.generate_repo_stanza(obj, (system is None)) meta["yum_config_stanza"] = self.generate_config_stanza(obj, (system is None)) meta["kernel_options"] = utils.dict_to_string(meta["kernel_options"]) # add extra variables for other distro types if "tree" in meta: urlparts = urlparse.urlsplit(meta["tree"]) meta["install_source_directory"] = urlparts[2] try: raw_data = utils.read_file_contents(kickstart_path, self.api.logger) if raw_data is None: return "# kickstart is sourced externally: %s" % meta["kickstart"] distro = profile.get_conceptual_parent() if system is not None: distro = system.get_conceptual_parent().get_conceptual_parent() data = self.templar.render(raw_data, meta, None, obj) if distro.breed == "suse": # AutoYaST profile data = self.generate_autoyast(profile, system, data) return data except FileNotFoundException: self.api.logger.warning("kickstart not found: %s" % meta["kickstart"]) return "# kickstart not found: %s" % meta["kickstart"]