Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inject serverless_operator in track templates #1787

Merged
merged 3 commits into from
Oct 3, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
1 change: 1 addition & 0 deletions docs/advanced.rst
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ Assuming we pass ``--track-params="es_snapshot_restore_recovery_max_bytes_per_se
The parameter ``default_value`` controls the value to use for the setting if it is undefined. If the setting is undefined and there is no default value, nothing will be added.

* ``build_flavor``: a global variable that holds build flavor reported by Elasticsearch cluster targetted by Rally.
* ``serverless_operator``: a global variable that holds ``true`` when Rally targets serverless cluster with operator privileges, and ``false`` otherwise.

.. _adding_tracks_custom_param_sources:

Expand Down
8 changes: 8 additions & 0 deletions docs/migrate.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
Migration Guide
===============

Migrating to Rally 2.10.0
-------------------------

``serverless_operator`` becomes a global variable in track templates
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Rally now treats ``serverless_operator`` as a :ref:`global variable<advanced_extensions>` in Jinja2 templates. The variable equals ``true`` if Rally targets serverless cluster with operator privileges, and ``false`` otherwise. The ``serverless_operator`` becomes a reserved name so user-supplied track parameters must be named differently. Rename your track parameters before upgrade if needed.
gbanasiak marked this conversation as resolved.
Show resolved Hide resolved

Migrating to Rally 2.9.0
------------------------

Expand Down
30 changes: 24 additions & 6 deletions esrally/track/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -743,13 +743,14 @@ def read_glob_files(self, pattern):
return ",\n".join(source)


def default_internal_template_vars(glob_helper=lambda f: [], clock=time.Clock, build_flavor=None):
def default_internal_template_vars(glob_helper=lambda f: [], clock=time.Clock, build_flavor=None, serverless_operator=None):
"""
Dict of internal global variables used by our jinja2 renderers
"""
return {
"globals": {
"build_flavor": build_flavor,
"serverless_operator": serverless_operator,
"now": clock.now(),
"glob": glob_helper,
},
Expand Down Expand Up @@ -817,7 +818,7 @@ def register_all_params_in_track(assembled_source, complete_track_params=None):
complete_track_params.populate_track_defined_params(j2_variables)


def render_template_from_file(template_file_name, template_vars, complete_track_params=None, build_flavor=None):
def render_template_from_file(template_file_name, template_vars, complete_track_params=None, build_flavor=None, serverless_operator=None):
def relative_glob(start, f):
result = glob.glob(os.path.join(start, f))
if result:
Expand All @@ -834,7 +835,9 @@ def relative_glob(start, f):
loader=jinja2.FileSystemLoader(base_path),
template_source=template_source.assembled_source,
template_vars=template_vars,
template_internal_vars=default_internal_template_vars(glob_helper=lambda f: relative_glob(base_path, f), build_flavor=build_flavor),
template_internal_vars=default_internal_template_vars(
glob_helper=lambda f: relative_glob(base_path, f), build_flavor=build_flavor, serverless_operator=serverless_operator
),
)


Expand Down Expand Up @@ -1059,13 +1062,15 @@ def __init__(self, cfg):
with open(track_schema_file, encoding="utf-8") as f:
self.track_schema = json.loads(f.read())
self.build_flavor = cfg.opts("mechanic", "distribution.flavor", default_value="default", mandatory=False)
self.serverless_operator = cfg.opts("driver", "serverless.operator", default_value=False, mandatory=False)
self.track_params = cfg.opts("track", "params", mandatory=False)
self.complete_track_params = CompleteTrackParams(user_specified_track_params=self.track_params)
self.read_track = TrackSpecificationReader(
track_params=self.track_params,
complete_track_params=self.complete_track_params,
selected_challenge=cfg.opts("track", "challenge.name", mandatory=False),
build_flavor=self.build_flavor,
serverless_operator=self.serverless_operator,
)
self.logger = logging.getLogger(__name__)

Expand All @@ -1085,7 +1090,11 @@ def read(self, track_name, track_spec_file, mapping_dir):
with tempfile.NamedTemporaryFile(delete=False, suffix=".json") as tmp:
try:
rendered = render_template_from_file(
track_spec_file, self.track_params, complete_track_params=self.complete_track_params, build_flavor=self.build_flavor
track_spec_file,
self.track_params,
complete_track_params=self.complete_track_params,
build_flavor=self.build_flavor,
serverless_operator=self.serverless_operator,
)
with open(tmp.name, "w", encoding="utf-8") as f:
f.write(rendered)
Expand Down Expand Up @@ -1237,10 +1246,19 @@ class TrackSpecificationReader:
Creates a track instances based on its parsed JSON description.
"""

def __init__(self, track_params=None, complete_track_params=None, selected_challenge=None, source=io.FileSource, build_flavor=None):
def __init__(
self,
track_params=None,
complete_track_params=None,
selected_challenge=None,
source=io.FileSource,
build_flavor=None,
serverless_operator=None,
):
self.name = None
self.base_path = None
self.build_flavor = build_flavor
self.serverless_operator = serverless_operator
self.track_params = track_params if track_params else {}
self.complete_track_params = complete_track_params
self.selected_challenge = selected_challenge
Expand Down Expand Up @@ -1371,7 +1389,7 @@ def _load_template(self, contents, description):
rendered = render_template(
template_source=contents,
template_vars=self.track_params,
template_internal_vars={"globals": {"build_flavor": self.build_flavor}},
template_internal_vars={"globals": {"build_flavor": self.build_flavor, "serverless_operator": self.serverless_operator}},
)
return json.loads(rendered)
except Exception as e:
Expand Down
12 changes: 9 additions & 3 deletions tests/track/loader_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -956,14 +956,17 @@ def assert_equal_ignore_whitespace(expected, actual):


class TestTemplateRender:
unittest_template_internal_vars = loader.default_internal_template_vars(clock=StaticClock, build_flavor="test")
unittest_template_internal_vars = loader.default_internal_template_vars(
clock=StaticClock, build_flavor="test", serverless_operator=False
)

def test_render_simple_template(self):
template = """
{
"key": {{'01-01-2000' | days_ago(now)}},
"key2": "static value",
"key3": "{{build_flavor}}"
"key3": "{{build_flavor}}",
"key4": {{serverless_operator}}
}
"""

Expand All @@ -973,7 +976,8 @@ def test_render_simple_template(self):
{
"key": 5864,
"key2": "static value",
"key3": "test"
"key3": "test",
"key4": False
}
"""
assert rendered == expected
Expand Down Expand Up @@ -1071,6 +1075,8 @@ def test_render_template_with_conditions(self):
{
{%- if build_flavor != "test" %}
"key1": "build_flavor"
{%- elif serverless_operator %}
"key1": "serverless_operator"
{%- elif lifecycle == "ilm" %}
"key1": "ilm"
{%- else %}
Expand Down