mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-01-19 12:24:32 +00:00
88 lines
4.3 KiB
Python
88 lines
4.3 KiB
Python
# Copyright 2014-2015 ARM Limited
|
|
#
|
|
# 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.
|
|
#
|
|
|
|
|
|
import os
|
|
import sys
|
|
import shutil
|
|
|
|
import wlauto
|
|
from wlauto import Command, settings
|
|
from wlauto.core.agenda import Agenda
|
|
from wlauto.core.execution import Executor
|
|
from wlauto.utils.log import add_log_file
|
|
|
|
|
|
class RunCommand(Command):
|
|
|
|
name = 'run'
|
|
description = 'Execute automated workloads on a remote device and process the resulting output.'
|
|
|
|
def initialize(self):
|
|
self.parser.add_argument('agenda', metavar='AGENDA',
|
|
help='Agenda for this workload automation run. This defines which workloads will ' +
|
|
'be executed, how many times, with which tunables, etc. ' +
|
|
'See example agendas in {} '.format(os.path.dirname(wlauto.__file__)) +
|
|
'for an example of how this file should be structured.')
|
|
self.parser.add_argument('-d', '--output-directory', metavar='DIR', default=None,
|
|
help='Specify a directory where the output will be generated. If the directory' +
|
|
'already exists, the script will abort unless -f option (see below) is used,' +
|
|
'in which case the contents of the directory will be overwritten. If this option' +
|
|
'is not specified, then {} will be used instead.'.format(settings.output_directory))
|
|
self.parser.add_argument('-f', '--force', action='store_true',
|
|
help='Overwrite output directory if it exists. By default, the script will abort in this' +
|
|
'situation to prevent accidental data loss.')
|
|
self.parser.add_argument('-i', '--id', action='append', dest='only_run_ids', metavar='ID',
|
|
help='Specify a workload spec ID from an agenda to run. If this is specified, only that particular ' +
|
|
'spec will be run, and other workloads in the agenda will be ignored. This option may be used to ' +
|
|
'specify multiple IDs.')
|
|
|
|
def execute(self, args): # NOQA
|
|
self.set_up_output_directory(args)
|
|
add_log_file(settings.log_file)
|
|
|
|
if os.path.isfile(args.agenda):
|
|
agenda = Agenda(args.agenda)
|
|
settings.agenda = args.agenda
|
|
shutil.copy(args.agenda, settings.meta_directory)
|
|
else:
|
|
self.logger.debug('{} is not a file; assuming workload name.'.format(args.agenda))
|
|
agenda = Agenda()
|
|
agenda.add_workload_entry(args.agenda)
|
|
|
|
file_name = 'config_{}.py'
|
|
for file_number, path in enumerate(settings.get_config_paths(), 1):
|
|
shutil.copy(path, os.path.join(settings.meta_directory, file_name.format(file_number)))
|
|
|
|
executor = Executor()
|
|
executor.execute(agenda, selectors={'ids': args.only_run_ids})
|
|
|
|
def set_up_output_directory(self, args):
|
|
if args.output_directory:
|
|
settings.output_directory = args.output_directory
|
|
self.logger.debug('Using output directory: {}'.format(settings.output_directory))
|
|
if os.path.exists(settings.output_directory):
|
|
if args.force:
|
|
self.logger.info('Removing existing output directory.')
|
|
shutil.rmtree(settings.output_directory)
|
|
else:
|
|
self.logger.error('Output directory {} exists.'.format(settings.output_directory))
|
|
self.logger.error('Please specify another location, or use -f option to overwrite.\n')
|
|
sys.exit(1)
|
|
|
|
self.logger.info('Creating output directory.')
|
|
os.makedirs(settings.output_directory)
|
|
os.makedirs(settings.meta_directory)
|