# Copyright 2020 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from autotest_lib.client.common_lib import utils

AUTHOR = 'abergman, chromeos-engprod-platform-syd'
NAME = 'storage_qual_v2_setup'
METADATA = {
    'contacts': ['chromeos-storage@google.com'],
    'bug_component': 'b:974567',
    'criteria': 'Part of storage AVL qualification suite',
    'hw_agnostic': False
}
ATTRIBUTES = 'suite:storage_qual_v2_xl, suite:storage_qual_v2_l, suite:storage_qual_v2_m, suite:storage_qual_v2_s, suite:storage_qual_v2_xs'
TIME = 'lengthy'
TEST_CATEGORY = 'Stress'
TEST_CLASS = 'Hardware'
TEST_TYPE = 'Server'
PY_VERSION = 3
PRIORITY = 200
MAX_RESULT_SIZE_KB = 1024 * 1024
JOB_RETRIES = 0
REQUIRE_SSP = True
FAST = False
DEPENDENCIES = 'dut:2'

DOC = '''
Run the Tast-based storage qualification quick test.

Tast is an integration-testing framework analogous to the test-running portion
of Autotest. See https://chromium.googlesource.com/chromiumos/platform/tast/ for
more information.

See http://go/tast-failures for information about investigating failures.
'''
import tempfile
import yaml

keyval = dict()
keyval['storage_qual_version'] = 2
keyval['bug_id'] = bug_id
keyval['part_id'] = part_id
utils.write_keyval(job.resultdir, keyval)

def run(machine):
    args_dict = globals().get('args_dict', dict())

    with tempfile.NamedTemporaryFile(suffix='.yaml', mode='w+', encoding='utf-8') as temp_file:
        # Writing test arguments to yaml file except for wrapper-related arguments.
        test_args = dict()
        for key in args_dict:
            if key.startswith('tast_'):
                test_args[key] = args_dict[key]
        yaml.safe_dump(test_args,
                      stream=temp_file,
                      default_flow_style=False,
                      allow_unicode=True)

        job.run_test('tast',
                    host=hosts.create_host(machine),
                    test_exprs=['storage.FullQualificationStress.setup_benchmarks'],
                    ignore_test_failures=False,
                    max_run_sec=3600,
                    command_args=args,
                    varsfiles=[temp_file.name])

parallel_simple(run, machines)
