# Copyright 2021 The Chromium OS Authors. All rights reserved.
# 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 = 'varunth, chromeos-fleet-software'
NAME = 'storage_qual_v2_setup_satlab'
ATTRIBUTES = 'suite:storage_qual_v2_xs_satlab'
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

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+') 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.dump(test_args, stream=temp_file, default_flow_style=False)

        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)
