diff --git a/wa/commands/create.py b/wa/commands/create.py new file mode 100644 index 00000000..cd25587b --- /dev/null +++ b/wa/commands/create.py @@ -0,0 +1,82 @@ +import sys +from collections import OrderedDict + +from wa import ComplexCommand, SubCommand, pluginloader +from wa.framework.target.descriptor import get_target_descriptions + +from wa.utils.serializer import yaml + + +class CreateAgendaSubcommand(SubCommand): + + name = 'agenda' + description = """ + Create an agenda with the specified extensions enabled. And parameters set + to their default values. + """ + + def initialize(self, context): + self.parser.add_argument('plugins', nargs='+', + help='Plugins to be added to the agendas') + self.parser.add_argument('-i', '--iterations', type=int, default=1, + help='Sets the number of iterations for all workloads') + self.parser.add_argument('-o', '--output', metavar='FILE', + help='Output file. If not specfied, STDOUT will be used instead.') + + def execute(self, state, args): + agenda = OrderedDict() + agenda['config'] = OrderedDict(instrumentation=[], result_processors=[]) + agenda['global'] = OrderedDict(iterations=args.iterations) + agenda['workloads'] = [] + target_desc = None + + targets = {td.name: td for td in get_target_descriptions()} + + for name in args.plugins: + if name in targets: + if target_desc is not None: + raise ConfigError('Specifying multiple devices: {} and {}'.format(target_desc.name, name)) + target_desc = targets[name] + agenda['config']['device'] = name + agenda['config']['device_config'] = target_desc.get_default_config() + continue + + extcls = pluginloader.get_plugin_class(name) + config = pluginloader.get_default_config(name) + + if extcls.kind == 'workload': + entry = OrderedDict() + entry['name'] = extcls.name + if name != extcls.name: + entry['label'] = name + entry['params'] = config + agenda['workloads'].append(entry) + else: + if extcls.kind == 'instrument': + agenda['config']['instrumentation'].append(name) + if extcls.kind == 'result_processor': + agenda['config']['result_processors'].append(name) + agenda['config'][name] = config + + if args.output: + wfh = open(args.output, 'w') + else: + wfh = sys.stdout + yaml.dump(agenda, wfh, indent=4, default_flow_style=False) + if args.output: + wfh.close() + + +class CreateCommand(ComplexCommand): + + name = 'create' + description = ''' + Used to create various WA-related objects (see positional arguments list + for what objects may be created).\n\nUse "wa create -h" for + object-specific arguments. + ''' + subcmd_classes = [ + #CreateWorkloadSubcommand, + #CreatePackageSubcommand, + CreateAgendaSubcommand, + ]