Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions cloudinit/templater.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import collections
import re
import sys

try:
from Cheetah.Template import Template as CTemplate
Expand All @@ -32,6 +33,7 @@
from cloudinit import log as logging
from cloudinit import type_utils as tu
from cloudinit import util
from cloudinit.atomic_helper import write_file

LOG = logging.getLogger(__name__)
TYPE_MATCHER = re.compile(r"##\s*template:(.*)", re.I)
Expand Down Expand Up @@ -180,4 +182,17 @@ def render_string(content, params):
return renderer(content, params)


def render_cloudcfg(variant, template, output):

with open(template, "r") as fh:
contents = fh.read()
tpl_params = {"variant": variant}
contents = (render_string(contents, tpl_params)).rstrip() + "\n"
util.load_yaml(contents)
if output == "-":
sys.stdout.write(contents)
else:
write_file(output, contents, omode="w")


# vi: ts=4 expandtab
26 changes: 22 additions & 4 deletions tests/unittests/test_render_cloudcfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import pytest

from cloudinit import subp, util
from cloudinit import subp, templater, util
from tests.unittests.helpers import cloud_init_project_dir

# TODO(Look to align with tools.render-cloudcfg or cloudinit.distos.OSFAMILIES)
Expand Down Expand Up @@ -32,10 +32,22 @@ class TestRenderCloudCfg:
cmd = [sys.executable, cloud_init_project_dir("tools/render-cloudcfg")]
tmpl_path = cloud_init_project_dir("config/cloud.cfg.tmpl")

def test_variant_sets_distro_in_cloud_cfg_subp(self, tmpdir):
outfile = tmpdir.join("outcfg").strpath

subp.subp(self.cmd + ["--variant", "ubuntu", self.tmpl_path, outfile])
with open(outfile) as stream:
system_cfg = util.load_yaml(stream.read())
assert system_cfg["system_info"]["distro"] == "ubuntu"

@pytest.mark.parametrize("variant", (DISTRO_VARIANTS))
def test_variant_sets_distro_in_cloud_cfg(self, variant, tmpdir):
"""Testing parametrized inputs with imported function saves ~0.5s per
call versus calling as subp
"""
outfile = tmpdir.join("outcfg").strpath
subp.subp(self.cmd + ["--variant", variant, self.tmpl_path, outfile])

templater.render_cloudcfg(variant, self.tmpl_path, outfile)
with open(outfile) as stream:
system_cfg = util.load_yaml(stream.read())
if variant == "unknown":
Expand All @@ -44,8 +56,11 @@ def test_variant_sets_distro_in_cloud_cfg(self, variant, tmpdir):

@pytest.mark.parametrize("variant", (DISTRO_VARIANTS))
def test_variant_sets_default_user_in_cloud_cfg(self, variant, tmpdir):
"""Testing parametrized inputs with imported function saves ~0.5s per
call versus calling as subp
"""
outfile = tmpdir.join("outcfg").strpath
subp.subp(self.cmd + ["--variant", variant, self.tmpl_path, outfile])
templater.render_cloudcfg(variant, self.tmpl_path, outfile)
with open(outfile) as stream:
system_cfg = util.load_yaml(stream.read())

Expand All @@ -69,8 +84,11 @@ def test_variant_sets_default_user_in_cloud_cfg(self, variant, tmpdir):
def test_variant_sets_network_renderer_priority_in_cloud_cfg(
self, variant, renderers, tmpdir
):
"""Testing parametrized inputs with imported function saves ~0.5s per
call versus calling as subp
"""
outfile = tmpdir.join("outcfg").strpath
subp.subp(self.cmd + ["--variant", variant, self.tmpl_path, outfile])
templater.render_cloudcfg(variant, self.tmpl_path, outfile)
with open(outfile) as stream:
system_cfg = util.load_yaml(stream.read())

Expand Down
76 changes: 47 additions & 29 deletions tools/render-cloudcfg
Original file line number Diff line number Diff line change
@@ -1,47 +1,65 @@
#!/usr/bin/env python3

import argparse
import os
import sys

VARIANTS = ["almalinux", "alpine", "amazon", "arch", "centos", "cloudlinux", "debian",
"eurolinux", "fedora", "freebsd", "miraclelinux", "netbsd", "openbsd", "openEuler", "photon",
"rhel", "suse","rocky", "ubuntu", "unknown", "virtuozzo"]
import argparse


if "avoid-pep8-E402-import-not-top-of-file":
def main():
_tdir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.insert(0, _tdir)
from cloudinit import templater
from cloudinit import util
from cloudinit.atomic_helper import write_file

from cloudinit import templater, util # pylint: disable=E0401

def main():
VARIANTS = [
"almalinux",
"alpine",
"amazon",
"arch",
"centos",
"cloudlinux",
"debian",
"eurolinux",
"fedora",
"freebsd",
"miraclelinux",
"netbsd",
"openbsd",
"openEuler",
"photon",
"rhel",
"suse",
"rocky",
"ubuntu",
"unknown",
"virtuozzo",
]
parser = argparse.ArgumentParser()
platform = util.system_info()
parser.add_argument(
"--variant", default=platform['variant'], action="store",
help="define the variant.", choices=VARIANTS)
"--variant",
default=platform["variant"],
action="store",
help="define the variant.",
choices=VARIANTS,
)
parser.add_argument(
"template", nargs="?", action="store",
default='./config/cloud.cfg.tmpl',
help="Path to the cloud.cfg template")
"template",
nargs="?",
action="store",
default="./config/cloud.cfg.tmpl",
help="Path to the cloud.cfg template",
)
parser.add_argument(
"output", nargs="?", action="store", default="-",
help="Output file. Use '-' to write to stdout")
"output",
nargs="?",
action="store",
default="-",
help="Output file. Use '-' to write to stdout",
)

args = parser.parse_args()
args = parser.parse_args(sys.argv[1:])
templater.render_cloudcfg(args.variant, args.template, args.output)

with open(args.template, 'r') as fh:
contents = fh.read()
tpl_params = {'variant': args.variant}
contents = (templater.render_string(contents, tpl_params)).rstrip() + "\n"
util.load_yaml(contents)
if args.output == "-":
sys.stdout.write(contents)
else:
write_file(args.output, contents, omode="w")

if __name__ == '__main__':
if __name__ == "__main__":
main()