def create_skeleton(self): """ Create the role's directory and file structure. """ utils.string_to_file(os.path.join(self.output_path, "VERSION"), "master\n") for folder in c.ANSIBLE_FOLDERS: create_folder_path = os.path.join(self.output_path, folder) utils.mkdir_p(create_folder_path) mainyml_template = default_mainyml_template.replace( "%role_name", self.role_name) mainyml_template = mainyml_template.replace( "%values", folder) out_path = os.path.join(create_folder_path, "main.yml") if folder not in ("templates", "meta", "tests", "files"): utils.string_to_file(out_path, mainyml_template) if folder == "meta": utils.create_meta_main(out_path, self.config, self.role_name, self.options.galaxy_categories)
def create_test_case(self): """ Create a test case. """ testyml_template = default_testyml_template.replace( "%role", self.normalized_role) testyml_template = testyml_template.replace("%year", str(date.today().year)) testyml_template = testyml_template.replace("%author", self.config["author_name"]) testyml_template = testyml_template.replace( "%email", self.config["author_email"]) utils.mkdir_p( os.path.join(self.output_path, "tests", "inventory", "group_vars")) utils.mkdir_p( os.path.join(self.output_path, "tests", "inventory", "host_vars")) hosts = "placeholder_fqdn\n" utils.string_to_file( os.path.join(self.output_path, "tests", "inventory", "hosts"), hosts) test_file = os.path.join(self.output_path, "tests", "test") utils.string_to_file(test_file, testyml_template) os.chmod(test_file, 0755)
def create_test_case(self): """ Create a test case. """ testyml_template = default_testyml_template.replace( "%role", self.normalized_role) testyml_template = testyml_template.replace( "%year", str(date.today().year)) testyml_template = testyml_template.replace( "%author", self.config["author_name"]) testyml_template = testyml_template.replace( "%email", self.config["author_email"]) utils.mkdir_p(os.path.join(self.output_path, "tests", "inventory", "group_vars")) utils.mkdir_p(os.path.join(self.output_path, "tests", "inventory", "host_vars")) hosts = "placeholder_fqdn\n" utils.string_to_file(os.path.join(self.output_path, "tests", "inventory", "hosts"), hosts) test_file = os.path.join(self.output_path, "tests", "test") utils.string_to_file(test_file, testyml_template) os.chmod(test_file, 0755)
def dump(self): """ Dump the output to json. """ report_as_json_string = utils.dict_to_json(self.report) if self.out_file: utils.string_to_file(self.out_file, report_as_json_string) else: print report_as_json_string
def reqs_yml(self): """ Export a requirements file in yml format. """ default_yml_item = """ - src: '%src' name: '%name' scm: '%scm' version: '%version' """ role_lines = "---\n" for role in sorted(self.report["roles"]): name = utils.normalize_role(role, self.config) galaxy_name = "{0}.{1}".format(self.config["scm_user"], name) yml_item = default_yml_item if self.config["scm_host"]: yml_item = yml_item.replace("%name", "{0}".format(galaxy_name)) if self.config["scm_repo_prefix"]: role = self.config["scm_repo_prefix"] + name src = os.path.join(self.config["scm_host"], self.config["scm_user"], role) else: src = galaxy_name yml_item = yml_item.replace(" name: '%name'\n", "") yml_item = yml_item.replace(" scm: '%scm'\n", "") yml_item = yml_item.replace("%src", src) if self.config["scm_type"]: yml_item = yml_item.replace("%scm", self.config["scm_type"]) else: yml_item = yml_item.replace(" scm: '%scm'\n", "") version_path = os.path.join(self.roles_path, role, "VERSION") version = utils.get_version(version_path) yml_item = yml_item.replace("%version", version) role_lines += "{0}".format(yml_item) if self.out_file: utils.string_to_file(self.out_file, role_lines) else: print role_lines
def dump(self): """ Dump the output to json. """ if self.options.role is not None: role = "roles/" + self.options.role if role not in self.report["roles"]: print("Role does not exist: %s" % self.options.role) sys.exit(2) data = self.report["roles"][role] else: data = self.report report_as_json_string = utils.dict_to_json(data, pretty_print=True) if self.out_file: utils.string_to_file(self.out_file, report_as_json_string) else: print report_as_json_string
def reqs_txt(self): """ Export a requirements file in txt format. """ role_lines = "" for role in sorted(self.report["roles"]): name = utils.normalize_role(role, self.config) galaxy_name = "{0}.{1}".format(self.config["scm_user"], name) version_path = os.path.join(self.roles_path, role, "VERSION") version = utils.get_version(version_path) role_lines += "{0},{1}\n".format(galaxy_name, version) if self.out_file: utils.string_to_file(self.out_file, role_lines) else: print role_lines
def make_or_augment_meta(self, role): """ Create or augment a meta file. """ if not os.path.exists(self.paths["meta"]): utils.create_meta_main(self.paths["meta"], self.config, role, "") self.report["state"]["ok_role"] += 1 self.report["roles"][role]["state"] = "ok" if not os.path.exists(self.paths["ansigenome"]): ag_meta_file = c.DEFAULT_AG_FILE ag_meta_file = meta_file.replace("%role_name", role) utils.string_to_file(self.paths['ansigenome'], ag_meta_file) # swap values in place to use the config values swaps = [ ("author", self.config["author_name"]), ("company", self.config["author_company"]), ("license", self.config["license_type"]), ] (new_meta, _) = utils.swap_yaml_string(self.paths["meta"], swaps) # normalize the --- at the top of the file by removing it first new_meta = new_meta.replace("---", "") new_meta = new_meta.lstrip() # augment missing main keys augments = [ ("ansigenome_info", "{}"), ("galaxy_info", "{}"), ("dependencies", "[]"), ] new_meta = self.augment_main_keys(augments, new_meta) # re-attach the --- new_meta = "---\n\n" + new_meta travis_path = os.path.join(self.paths["role"], ".travis.yml") if os.path.exists(travis_path): new_meta = new_meta.replace("travis: False", "travis: True") utils.string_to_file(self.paths["meta"], new_meta)
def update_gen_report(self, role, file, original): """ Update the role state and adjust the gen totals. """ state = self.report["state"] if not os.path.exists(self.paths[file]): state["ok_role"] += 1 self.report["roles"][role]["state"] = "ok" elif (self.report["roles"][role][file] != original and self.report["roles"][role]["state"] != "ok"): state["changed_role"] += 1 self.report["roles"][role]["state"] = "changed" elif self.report["roles"][role][file] == original: state["skipped_role"] += 1 self.report["roles"][role]["state"] = "skipped" return utils.string_to_file(self.paths[file], original)
def create_travis_config(self): """ Create a travis test setup. """ test_runner = self.config["options_test_runner"] role_url = "{0}".format( os.path.join(self.config["scm_host"], self.config["scm_user"], self.config["scm_repo_prefix"] + self.normalized_role)) travisyml_template = default_travisyml_template.replace( "%test_runner", test_runner) travisyml_template = travisyml_template.replace( "%basename", test_runner.split("/")[-1]) travisyml_template = travisyml_template.replace("%role_url", role_url) utils.string_to_file(os.path.join(self.output_path, ".travis.yml"), travisyml_template)
def create_travis_config(self): """ Create a travis test setup. """ test_runner = self.config["options_test_runner"] role_url = "{0}".format(os.path.join(self.config["scm_host"], self.config["scm_user"], self.config["scm_repo_prefix"] + self.normalized_role)) travisyml_template = default_travisyml_template.replace( "%test_runner", test_runner) travisyml_template = travisyml_template.replace( "%basename", test_runner.split("/")[-1]) travisyml_template = travisyml_template.replace( "%role_url", role_url) utils.string_to_file(os.path.join(self.output_path, ".travis.yml"), travisyml_template)
def create_skeleton(self): """ Create the role's directory and file structure. """ utils.string_to_file(os.path.join(self.output_path, "VERSION"), "master\n") for folder in c.ANSIBLE_FOLDERS: create_folder_path = os.path.join(self.output_path, folder) utils.mkdir_p(create_folder_path) mainyml_template = default_mainyml_template.replace( "%role_name", self.role_name) mainyml_template = mainyml_template.replace("%values", folder) out_path = os.path.join(create_folder_path, "main.yml") if folder not in ("templates", "meta", "tests", "files"): utils.string_to_file(out_path, mainyml_template) if folder == "meta": utils.create_meta_main(out_path, self.config, self.role_name, self.options.galaxy_categories) ag_path = os.path.join(create_folder_path, "ansigenome.yml") if not os.path.exists(ag_path): ag_meta_file = c.DEFAULT_AG_FILE ag_meta_file = meta_file.replace("%role_name", self.role_name) utils.string_to_file(self.paths['ansigenome'], ag_meta_file)
def make_or_augment_meta(self, role): """ Create or augment a meta file. """ if not os.path.exists(self.paths["meta"]): utils.create_meta_main(self.paths["meta"], self.config, role, "") self.report["state"]["ok_role"] += 1 self.report["roles"][role]["state"] = "ok" # swap values in place to use the config values swaps = [ ("author", self.config["author_name"]), ("company", self.config["author_company"]), ("license", self.config["license_type"]), ] (new_meta, _) = utils.swap_yaml_string(self.paths["meta"], swaps) # normalize the --- at the top of the file by removing it first new_meta = new_meta.replace("---", "") new_meta = new_meta.lstrip() # augment missing main keys augments = [ ("ansigenome_info", "{}"), ("galaxy_info", "{}"), ("dependencies", "[]"), ] new_meta = self.augment_main_keys(augments, new_meta) # re-attach the --- new_meta = "---\n\n" + new_meta travis_path = os.path.join(self.paths["role"], ".travis.yml") if os.path.exists(travis_path): new_meta = new_meta.replace("travis: False", "travis: True") utils.string_to_file(self.paths["meta"], new_meta)
def graph_dot(self): """ Export a graph of the data in dot format. """ default_graphviz_template = """ digraph role_dependencies { size="%size" dpi=%dpi ratio="fill" landscape=false rankdir="BT"; node [shape = "box", style = "rounded,filled", fillcolor = "lightgrey", fontsize = 20]; edge [style = "dashed", dir = "forward", penwidth = 1.5]; %roles_list %dependencies } """ roles_list = "" edges = "" # remove the darkest and brightest colors, still have 100+ colors adjusted_colors = c.X11_COLORS[125:-325] random.shuffle(adjusted_colors) backup_colors = adjusted_colors[:] for role, fields in sorted(self.report["roles"].iteritems()): name = utils.normalize_role(role, self.config) color_length = len(adjusted_colors) - 1 # reset the colors if we run out if color_length == 0: adjusted_colors = backup_colors[:] color_length = len(adjusted_colors) - 1 random_index = random.randint(1, color_length) roles_list += " role_{0} [label = \"{0}\"]\n" \ .format(re.sub(r'[.-]', '_', name)) edge = '\n edge [color = "{0}"];\n' \ .format(adjusted_colors[random_index]) del adjusted_colors[random_index] if fields["dependencies"]: dependencies = "" for dependency in sorted(fields["dependencies"]): dependency_name = utils.role_name(dependency) dependencies += " role_{0} -> role_{1}\n".format( re.sub(r'[.-]', '_', name), utils.normalize_role(dependency_name, self.config)) edges += "{0}{1}\n".format(edge, dependencies) graphviz_template = default_graphviz_template.replace( "%roles_list", roles_list) graphviz_template = graphviz_template.replace("%dependencies", edges) graphviz_template = graphviz_template.replace("%size", self.size) graphviz_template = graphviz_template.replace("%dpi", str(self.dpi)) if self.out_file: utils.string_to_file(self.out_file, graphviz_template) else: print graphviz_template
def graph_dot(self): """ Export a graph of the data in dot format. """ default_graphviz_template = """ digraph role_dependencies { size="%size" dpi=%dpi ratio="fill" landscape=false rankdir="BT"; node [shape = "box", style = "rounded,filled", fillcolor = "lightgrey", fontsize = 20]; edge [style = "dashed", dir = "forward", penwidth = 1.5]; %roles_list %dependencies } """ roles_list = "" edges = "" # remove the darkest and brightest colors, still have 100+ colors adjusted_colors = c.X11_COLORS[125:-325] random.shuffle(adjusted_colors) backup_colors = adjusted_colors[:] for role, fields in sorted(self.report["roles"].iteritems()): name = utils.normalize_role(role, self.config) color_length = len(adjusted_colors) - 1 # reset the colors if we run out if color_length == 0: adjusted_colors = backup_colors[:] color_length = len(adjusted_colors) - 1 random_index = random.randint(1, color_length) roles_list += ' "{0}" [label = "{1}"]\n'.format(name, name) edge = '\n edge [color = "{0}"];\n' \ .format(adjusted_colors[random_index]) del adjusted_colors[random_index] if fields["dependencies"]: dependencies = "" for dependency in sorted(fields["dependencies"]): dependency_name = utils.role_name(dependency) dependencies += ' "{0}" -> "{1}"\n'.format(name, dependency_name) edges += "{0}{1}\n".format(edge, dependencies) graphviz_template = default_graphviz_template.replace("%roles_list", roles_list) graphviz_template = graphviz_template.replace("%dependencies", edges) graphviz_template = graphviz_template.replace("%size", self.size) graphviz_template = graphviz_template.replace("%dpi", str(self.dpi)) if self.out_file: utils.string_to_file(self.out_file, graphviz_template) else: print graphviz_template