summaryrefslogtreecommitdiff
path: root/grpc/tools/run_tests/performance/scenario_config_exporter.py
blob: 23aad5c4569bd9fb766bab724513d888f80fa4a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/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
# Useful to construct "ScenariosJSON" configuration accepted by the OSS benchmarks framework
# See https://github.com/grpc/test-infra/blob/master/config/samples/cxx_example_loadtest.yaml

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:
            # the dump file should have {"scenarios" : []} as the top level element
            json.dump({'scenarios': [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_')