diff options
author | Brett Holman <bholman.devel@gmail.com> | 2022-01-14 11:09:30 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-14 12:09:30 -0600 |
commit | 73b1bb1f7665216053494717de27d7daf445d751 (patch) | |
tree | 8f230d980bc7fe3b173da0a4a6f0e38cda57537e | |
parent | 0de7acb194dc15650eee1d5332efed82ef162f84 (diff) | |
download | vyos-cloud-init-73b1bb1f7665216053494717de27d7daf445d751.tar.gz vyos-cloud-init-73b1bb1f7665216053494717de27d7daf445d751.zip |
Test Optimization Proposal (SC-736) (#1188)
Reduce template rendering test runtime
-rw-r--r-- | cloudinit/templater.py | 15 | ||||
-rw-r--r-- | tests/unittests/test_render_cloudcfg.py | 26 | ||||
-rwxr-xr-x | tools/render-cloudcfg | 76 |
3 files changed, 84 insertions, 33 deletions
diff --git a/cloudinit/templater.py b/cloudinit/templater.py index c215bbbb..1e147d4a 100644 --- a/cloudinit/templater.py +++ b/cloudinit/templater.py @@ -12,6 +12,7 @@ import collections import re +import sys try: from Cheetah.Template import Template as CTemplate @@ -32,6 +33,7 @@ except (ImportError, AttributeError): 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) @@ -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 diff --git a/tests/unittests/test_render_cloudcfg.py b/tests/unittests/test_render_cloudcfg.py index 81110e61..01a728da 100644 --- a/tests/unittests/test_render_cloudcfg.py +++ b/tests/unittests/test_render_cloudcfg.py @@ -4,7 +4,7 @@ import sys 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) @@ -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": @@ -44,8 +56,11 @@ class TestRenderCloudCfg: @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()) @@ -69,8 +84,11 @@ class TestRenderCloudCfg: 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()) diff --git a/tools/render-cloudcfg b/tools/render-cloudcfg index 6642bd58..c14097b5 100755 --- a/tools/render-cloudcfg +++ b/tools/render-cloudcfg @@ -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() |