diff --git a/tools/run_tests/performance/scenario_config_exporter.py b/tools/run_tests/performance/scenario_config_exporter.py new file mode 100755 index 00000000000..33e7b17d681 --- /dev/null +++ b/tools/run_tests/performance/scenario_config_exporter.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Helper script to extract JSON scenario definitions from scenario_config.py + +import json +import re +import scenario_config +import sys + + +def get_json_scenarios(language_name, scenario_name_regex='.*', category='all'): + """Returns list of scenarios that match given constraints.""" + result = [] + scenarios = scenario_config.LANGUAGES[language_name].scenarios() + for scenario_json in scenarios: + if re.search(scenario_name_regex, scenario_json['name']): + # if the 'CATEGORIES' key is missing, treat scenario as part of 'scalable' and 'smoketest' + # this matches the behavior of run_performance_tests.py + scenario_categories = scenario_json.get('CATEGORIES', + ['scalable', 'smoketest']) + # TODO(jtattermusch): consider adding filtering for 'CLIENT_LANGUAGE' and 'SERVER_LANGUAGE' + # fields, before the get stripped away. + if category in scenario_categories or category == 'all': + scenario_json_stripped = scenario_config.remove_nonproto_fields( + scenario_json) + result.append(scenario_json_stripped) + return result + + +def dump_to_json_files(json_scenarios, filename_prefix='scenario_dump_'): + """Dump a list of json scenarios to json files""" + for scenario in json_scenarios: + filename = "%s%s.json" % (filename_prefix, scenario['name']) + print('Writing file %s' % filename, file=sys.stderr) + with open(filename, 'w') as outfile: + json.dump(scenario, outfile, indent=2) + + +if __name__ == "__main__": + # example usage: extract C# scenarios and dump them as .json files + scenarios = get_json_scenarios('csharp', + scenario_name_regex='.*', + category='scalable') + dump_to_json_files(scenarios, 'scenario_dump_')