initial commit of common Ansible and role template
Change-Id: I73b59340d2481c1c6b7e7c5806d4f5bc5a60ab26
diff --git a/cookiecutters/role/hooks/post_gen_project.py b/cookiecutters/role/hooks/post_gen_project.py
new file mode 100644
index 0000000..49667ae
--- /dev/null
+++ b/cookiecutters/role/hooks/post_gen_project.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python3
+#
+# SPDX-FileCopyrightText: © 2020 Open Networking Foundation <support@opennetworking.org>
+# SPDX-License-Identifier: Apache-2.0
+
+# role/hooks/post_gen_project.py
+# Generates platform-specific files for ansible roles
+
+from __future__ import absolute_import
+import os
+import jinja2
+
+from cookiecutter import generate as ccg
+from cookiecutter.environment import StrictEnvironment
+import cookiecutter.utils as utils
+
+# Docs for hooks
+# https://cookiecutter.readthedocs.io/en/latest/advanced/hooks.html
+
+# Tickets related to what thei above
+# https://github.com/cookiecutter/cookiecutter/issues/474
+# https://github.com/cookiecutter/cookiecutter/issues/851
+
+# other implementations
+# https://github.com/ckan/ckan/blob/master/contrib/cookiecutter/ckan_extension/hooks/post_gen_project.py
+
+# CWD is output dir
+PROJECT_DIR = os.path.realpath(os.path.join("..", os.path.curdir))
+
+# Hack, but 'cookiecutter._template' is a relative path
+TEMPLATE_DIR = os.path.realpath(
+ os.path.join(os.path.curdir, "../{{ cookiecutter._template }}")
+)
+
+# script is rendered as a template, so this will be filled in with the
+# cookiecutter dict, which is why noqa is needed.
+CONTEXT = {{cookiecutter | jsonify}} # noqa: F821, E227
+
+
+def delete_file(filepath):
+ """ delete generated file from output directory """
+ os.remove(os.path.join(PROJECT_DIR, filepath))
+
+
+def generate_platforms():
+ """ Generate files specific to each platform in platforms dict """
+
+ # list all platform tmplated files here
+ # {% raw %}
+ platform_files = [
+ "{{cookiecutter.role_name}}/tasks/{{cookiecutter.platform}}.yml",
+ "{{cookiecutter.role_name}}/vars/{{cookiecutter.platform}}.yml",
+ ]
+ # {% endraw %}
+
+ # delete the unneded file generated by platform_files earlier
+ env = StrictEnvironment(context={"cookiecutter": CONTEXT})
+ for infile in platform_files:
+ outfile_tmpl = env.from_string(infile)
+ delete_file(outfile_tmpl.render({"cookiecutter": CONTEXT}))
+
+ platforms = list(CONTEXT["platforms"].keys())
+
+ # Combine Ubuntu and Debian as they're the same ansible_os_family
+ if "Ubuntu" in platforms and "Debian" not in platforms:
+ platforms.remove("Ubuntu")
+ platforms.append("Debian")
+
+ # Iterate over platforms creating files
+ for platform in platforms:
+
+ # assign platform name to cookiecutter.platform
+ CONTEXT.update({"platform": platform})
+
+ # build jinja2 environment
+ env = StrictEnvironment(
+ context={"cookiecutter": CONTEXT}, keep_trailing_newline=True,
+ )
+
+ # must be in template dir for generate_file to work
+ with utils.work_in(TEMPLATE_DIR):
+ env.loader = jinja2.FileSystemLoader(".")
+
+ for infile in platform_files:
+ ccg.generate_file(
+ project_dir=PROJECT_DIR,
+ infile=infile,
+ context={"cookiecutter": CONTEXT},
+ env=env,
+ )
+
+
+def delete_inactive_licenses():
+
+ # get list of licenses written to output
+ license_dir = os.path.join(os.path.curdir, "LICENSES")
+ license_files = os.listdir(license_dir)
+
+ # delete any files that don't start with the license identifier
+ for licfile in license_files:
+ if not licfile.startswith(CONTEXT["license"]):
+ os.remove(os.path.join(os.path.curdir, "LICENSES", licfile))
+
+
+if __name__ == "__main__":
+
+ generate_platforms()
+ delete_inactive_licenses()