Skip to content

Commit 473fa33

Browse files
authored
chore: drop outdated code (#6798)
The biggest change is dropping jinja2 import handling code and testing handlers. The jinja2 module has been imported directly in templater.py since 24.1. The unit test helper has some additional helpers that can be dropped as well as overridden mock imports.
1 parent 4e410a2 commit 473fa33

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+81
-223
lines changed

cloudinit/handlers/jinja_template.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import os
66
import re
77
from errno import EACCES
8-
from typing import Optional, Type
8+
from typing import Optional
9+
10+
from jinja2 import exceptions, lexer
911

1012
from cloudinit import handlers
1113
from cloudinit.atomic_helper import b64d, json_dumps
@@ -19,15 +21,6 @@
1921
)
2022
from cloudinit.util import load_json, load_text_file
2123

22-
JUndefinedError: Type[Exception]
23-
try:
24-
from jinja2.exceptions import UndefinedError as JUndefinedError
25-
from jinja2.lexer import operator_re
26-
except ImportError:
27-
# No jinja2 dependency
28-
JUndefinedError = Exception
29-
operator_re = re.compile(r"[-.]")
30-
3124
LOG = logging.getLogger(__name__)
3225

3326

@@ -147,7 +140,7 @@ def render_jinja_payload(payload, payload_fn, instance_data, debug=False):
147140
)
148141
try:
149142
rendered_payload = render_string(payload, instance_jinja_vars)
150-
except (TypeError, JUndefinedError) as e:
143+
except (TypeError, exceptions.UndefinedError) as e:
151144
LOG.warning("Ignoring jinja template for %s: %s", payload_fn, str(e))
152145
return None
153146
warnings = [
@@ -180,7 +173,7 @@ def get_jinja_variable_alias(orig_name: str) -> Optional[str]:
180173
:return: A string with any jinja operators replaced if needed. Otherwise,
181174
none if no alias required.
182175
"""
183-
alias_name = re.sub(operator_re, "_", orig_name)
176+
alias_name = re.sub(lexer.operator_re, "_", orig_name)
184177
if alias_name != orig_name:
185178
return alias_name
186179
return None

cloudinit/templater.py

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,14 @@
1616
import logging
1717
import re
1818
import sys
19-
from typing import Any
2019

21-
from jinja2 import TemplateSyntaxError
20+
from jinja2 import DebugUndefined, Template, TemplateSyntaxError
2221

2322
from cloudinit import performance
2423
from cloudinit import type_utils as tu
2524
from cloudinit import util
2625
from cloudinit.atomic_helper import write_file
2726

28-
# After bionic EOL, mypy==1.0.0 will be able to type-analyse dynamic
29-
# base types, substitute this by:
30-
# JUndefined: typing.Type
31-
JUndefined: Any
32-
try:
33-
from jinja2 import DebugUndefined as _DebugUndefined
34-
from jinja2 import Template as JTemplate
35-
36-
JINJA_AVAILABLE = True
37-
JUndefined = _DebugUndefined
38-
except (ImportError, AttributeError):
39-
JINJA_AVAILABLE = False
40-
JUndefined = object
41-
4227
LOG = logging.getLogger(__name__)
4328
MISSING_JINJA_PREFIX = "CI_MISSING_JINJA_VAR/"
4429

@@ -86,7 +71,7 @@ def format_error_message(
8671

8772
# Mypy, and the PEP 484 ecosystem in general, does not support creating
8873
# classes with dynamic base types: https://stackoverflow.com/a/59636248
89-
class UndefinedJinjaVariable(JUndefined):
74+
class UndefinedJinjaVariable(DebugUndefined):
9075
"""Class used to represent any undefined jinja template variable."""
9176

9277
def __str__(self):
@@ -150,7 +135,7 @@ def jinja_render(content, params):
150135
try:
151136
with performance.Timed("Rendering jinja2 template"):
152137
return (
153-
JTemplate(
138+
Template(
154139
content,
155140
undefined=UndefinedJinjaVariable,
156141
trim_blocks=True,
@@ -181,13 +166,7 @@ def jinja_render(content, params):
181166
"Unknown template rendering type '%s' requested"
182167
% template_type
183168
)
184-
if template_type == "jinja" and not JINJA_AVAILABLE:
185-
LOG.warning(
186-
"Jinja not available as the selected renderer for"
187-
" desired template, reverting to the basic renderer."
188-
)
189-
return ("basic", basic_render, rest)
190-
elif template_type == "jinja" and JINJA_AVAILABLE:
169+
elif template_type == "jinja":
191170
return ("jinja", jinja_render, rest)
192171
# Only thing left over is the basic renderer (it is always available).
193172
return ("basic", basic_render, rest)

tests/unittests/analyze/test_boot.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
from unittest import mock
23

34
import pytest
45

@@ -11,7 +12,6 @@
1112
dist_check_timestamp,
1213
gather_timestamps_using_systemd,
1314
)
14-
from tests.unittests.helpers import mock
1515

1616
err_code = (FAIL_CODE, -1, -1, -1)
1717

tests/unittests/analyze/test_dump.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from contextlib import suppress
55
from datetime import datetime, timezone
66
from textwrap import dedent
7+
from unittest import mock
78

89
import pytest
910

@@ -14,7 +15,6 @@
1415
parse_timestamp,
1516
)
1617
from cloudinit.util import write_file
17-
from tests.unittests.helpers import mock
1818

1919

2020
class TestParseTimestamp:

tests/unittests/cmd/devel/test_net_convert.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
# This file is part of cloud-init. See LICENSE file for license information.
22

33
import itertools
4+
from unittest import mock
45

56
import pytest
67
import yaml
78

89
from cloudinit.cmd.devel import net_convert
910
from cloudinit.distros.debian import NETWORK_FILE_HEADER
10-
from tests.unittests.helpers import mock
1111

1212
M_PATH = "cloudinit.cmd.devel.net_convert."
1313

tests/unittests/cmd/devel/test_render.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# This file is part of cloud-init. See LICENSE file for license information.
22

33
from io import StringIO
4+
from unittest import mock
45

56
import pytest
67

78
from cloudinit.cmd.devel import render
89
from cloudinit.helpers import Paths
910
from cloudinit.templater import JinjaSyntaxParsingException
1011
from cloudinit.util import ensure_dir, write_file
11-
from tests.unittests.helpers import mock, skipUnlessJinja
1212

1313
M_PATH = "cloudinit.cmd.devel.render."
1414

@@ -87,7 +87,6 @@ def test_root_uses_sensitive_instance_data(self, m_paths, tmpdir):
8787
assert render.render_template(user_data, None, False) == 0
8888
assert "rendering: jinja worked" in m_stdout.getvalue()
8989

90-
@skipUnlessJinja()
9190
def test_renders_instance_data_vars_in_template(self, caplog, tmpdir):
9291
"""If user_data file is a jinja template render instance-data vars."""
9392
user_data = tmpdir.join("user-data")
@@ -103,7 +102,6 @@ def test_renders_instance_data_vars_in_template(self, caplog, tmpdir):
103102
)
104103
assert "rendering: jinja worked" == m_stdout.getvalue()
105104

106-
@skipUnlessJinja()
107105
def test_render_warns_and_gives_up_on_invalid_jinja_operation(
108106
self, caplog, tmpdir
109107
):
@@ -119,7 +117,6 @@ def test_render_warns_and_gives_up_on_invalid_jinja_operation(
119117
' "my_var"?' % user_data
120118
) in caplog.text
121119

122-
@skipUnlessJinja()
123120
def test_jinja_load_error(self, caplog, tmpdir):
124121
user_data = tmpdir.join("user-data")
125122
write_file(user_data, "##template: jinja\nrendering: {{ my-var }}")
@@ -130,7 +127,6 @@ def test_jinja_load_error(self, caplog, tmpdir):
130127
"Cannot render from instance data due to exception" in caplog.text
131128
)
132129

133-
@skipUnlessJinja()
134130
def test_not_jinja_error(self, caplog, tmpdir):
135131
user_data = tmpdir.join("user-data")
136132
write_file(user_data, "{{ my-var }}")
@@ -141,7 +137,6 @@ def test_not_jinja_error(self, caplog, tmpdir):
141137
"Cannot render from instance data due to exception" in caplog.text
142138
)
143139

144-
@skipUnlessJinja()
145140
def test_no_user_data(self, caplog, tmpdir):
146141
user_data = tmpdir.join("user-data")
147142
write_file(user_data, "##template: jinja")
@@ -150,7 +145,6 @@ def test_no_user_data(self, caplog, tmpdir):
150145
render.render_template(user_data, instance_data, False)
151146
assert "Unable to render user-data file" in caplog.text
152147

153-
@skipUnlessJinja()
154148
def test_invalid_jinja_syntax(self, caplog, tmpdir):
155149
user_data = tmpdir.join("user-data")
156150
write_file(user_data, "##template: jinja\nrendering: {{ my_var } }")

tests/unittests/cmd/test_cloud_id.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
"""Tests for cloud-id command line utility."""
44

5+
from unittest import mock
6+
57
import pytest
68

79
from cloudinit import atomic_helper
810
from cloudinit.cmd import cloud_id, status
911
from cloudinit.helpers import Paths
10-
from tests.unittests.helpers import mock
1112

1213
M_PATH = "cloudinit.cmd.cloud_id."
1314

tests/unittests/cmd/test_query.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from io import BytesIO
99
from pathlib import Path
1010
from textwrap import dedent
11+
from unittest import mock
1112

1213
import pytest
1314

@@ -17,7 +18,6 @@
1718
from cloudinit.sources import REDACT_SENSITIVE_VALUE
1819
from cloudinit.templater import JinjaSyntaxParsingException
1920
from cloudinit.util import write_file
20-
from tests.unittests.helpers import mock
2121

2222
M_PATH = "cloudinit.cmd.query."
2323

tests/unittests/config/test_cc_apt_pipelining.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"""Tests cc_apt_pipelining handler"""
44

55
import re
6+
from unittest import mock
67

78
import pytest
89

@@ -12,7 +13,7 @@
1213
get_schema,
1314
validate_cloudconfig_schema,
1415
)
15-
from tests.unittests.helpers import mock, skipUnlessJsonSchema
16+
from tests.unittests.helpers import skipUnlessJsonSchema
1617

1718

1819
class TestAptPipelining:

tests/unittests/config/test_cc_disable_ec2_metadata.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
"""Tests cc_disable_ec2_metadata handler"""
44

55

6+
from unittest import mock
7+
68
import pytest
79

810
import cloudinit.config.cc_disable_ec2_metadata as ec2_meta
@@ -11,7 +13,7 @@
1113
get_schema,
1214
validate_cloudconfig_schema,
1315
)
14-
from tests.unittests.helpers import mock, skipUnlessJsonSchema
16+
from tests.unittests.helpers import skipUnlessJsonSchema
1517

1618
DISABLE_CFG = {"disable_ec2_metadata": "true"}
1719

0 commit comments

Comments
 (0)