diff --git a/docs/advanced.rst b/docs/advanced.rst index c74a401cb..22a634e27 100644 --- a/docs/advanced.rst +++ b/docs/advanced.rst @@ -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: diff --git a/docs/migrate.rst b/docs/migrate.rst index f3a03bf72..e0db5e362 100644 --- a/docs/migrate.rst +++ b/docs/migrate.rst @@ -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` 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 upgrading if needed. + Migrating to Rally 2.9.0 ------------------------ @@ -8,7 +16,7 @@ Migrating to Rally 2.9.0 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Rally now treats ``build_flavor`` as a :ref:`global variable` in Jinja2 templates. The value of the variable depends on the build flavor reported by Elasticsearch cluster targetted by Rally. -The ``build_flavor`` becomes a reserved name so user-supplied track parameters must be named differently. Rename your track parameters before upgrade if needed. +The ``build_flavor`` becomes a reserved name so user-supplied track parameters must be named differently. Rename your track parameters before upgrading if needed. Example error when running with ``--track-params="build_flavor:test"``:: diff --git a/esrally/track/loader.py b/esrally/track/loader.py index ab9ff9b0a..22cf45a83 100644 --- a/esrally/track/loader.py +++ b/esrally/track/loader.py @@ -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, }, @@ -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: @@ -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 + ), ) @@ -1059,6 +1062,7 @@ 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( @@ -1066,6 +1070,7 @@ def __init__(self, cfg): 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__) @@ -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) @@ -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 @@ -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: diff --git a/tests/track/loader_test.py b/tests/track/loader_test.py index 23965df70..2f1414a54 100644 --- a/tests/track/loader_test.py +++ b/tests/track/loader_test.py @@ -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}} } """ @@ -973,7 +976,8 @@ def test_render_simple_template(self): { "key": 5864, "key2": "static value", - "key3": "test" + "key3": "test", + "key4": False } """ assert rendered == expected @@ -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 %}