blob: d21a4413bccf2483273dfee9d39eddb79352614e [file] [log] [blame]
David Kranzb9d97502013-05-01 15:55:04 -04001#!/usr/bin/env python
2
David Kranzb9d97502013-05-01 15:55:04 -04003# Copyright 2013 Quanta Research Cambridge, Inc.
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17import argparse
Marc Kodererb0604412013-09-02 09:43:40 +020018import inspect
David Kranzb9d97502013-05-01 15:55:04 -040019import json
Marc Koderer888ddc42013-07-23 16:13:07 +020020import sys
Will16a778a2014-01-12 21:49:14 -050021try:
22 from unittest import loader
23except ImportError:
24 # unittest in python 2.6 does not contain loader, so uses unittest2
25 from unittest2 import loader
Marc Koderer32221b8e2013-08-23 13:57:50 +020026
Matthew Treinish96e9e882014-06-09 18:37:19 -040027from testtools import testsuite
28
Marc Koderer16648e92013-10-05 10:49:13 +020029from tempest.openstack.common import log as logging
Marc Koderer211ca962013-12-05 12:20:21 +010030from tempest.stress import driver
Marc Koderer16648e92013-10-05 10:49:13 +020031
32LOG = logging.getLogger(__name__)
33
Marc Koderer32221b8e2013-08-23 13:57:50 +020034
Marc Kodererb0604412013-09-02 09:43:40 +020035def discover_stress_tests(path="./", filter_attr=None, call_inherited=False):
Marc Koderer32221b8e2013-08-23 13:57:50 +020036 """Discovers all tempest tests and create action out of them
37 """
Marc Koderer16648e92013-10-05 10:49:13 +020038 LOG.info("Start test discovery")
Marc Koderer32221b8e2013-08-23 13:57:50 +020039 tests = []
40 testloader = loader.TestLoader()
41 list = testloader.discover(path)
Masayuki Igawa7e9eb542014-02-17 15:03:44 +090042 for func in (testsuite.iterate_tests(list)):
Marc Koderer16648e92013-10-05 10:49:13 +020043 attrs = []
Marc Koderer32221b8e2013-08-23 13:57:50 +020044 try:
45 method_name = getattr(func, '_testMethodName')
46 full_name = "%s.%s.%s" % (func.__module__,
47 func.__class__.__name__,
48 method_name)
49 test_func = getattr(func, method_name)
50 # NOTE(mkoderer): this contains a list of all type attributes
51 attrs = getattr(test_func, "__testtools_attrs")
52 except Exception:
53 next
54 if 'stress' in attrs:
Matthew Treinishc795b9e2014-06-09 17:01:10 -040055 if filter_attr is not None and filter_attr not in attrs:
Marc Koderer32221b8e2013-08-23 13:57:50 +020056 continue
57 class_setup_per = getattr(test_func, "st_class_setup_per")
58
59 action = {'action':
60 "tempest.stress.actions.unit_test.UnitTest",
61 'kwargs': {"test_method": full_name,
62 "class_setup_per": class_setup_per
63 }
64 }
Marc Kodererb0604412013-09-02 09:43:40 +020065 if (not call_inherited and
66 getattr(test_func, "st_allow_inheritance") is not True):
67 class_structure = inspect.getmro(test_func.im_class)
68 if test_func.__name__ not in class_structure[0].__dict__:
69 continue
Marc Koderer32221b8e2013-08-23 13:57:50 +020070 tests.append(action)
71 return tests
David Kranzb9d97502013-05-01 15:55:04 -040072
David Kranzb9d97502013-05-01 15:55:04 -040073
Matthew Treinish55e29b42014-05-07 01:04:17 -040074parser = argparse.ArgumentParser(description='Run stress tests')
75parser.add_argument('-d', '--duration', default=300, type=int,
76 help="Duration of test in secs")
77parser.add_argument('-s', '--serial', action='store_true',
78 help="Trigger running tests serially")
79parser.add_argument('-S', '--stop', action='store_true',
80 default=False, help="Stop on first error")
81parser.add_argument('-n', '--number', type=int,
82 help="How often an action is executed for each process")
83group = parser.add_mutually_exclusive_group(required=True)
84group.add_argument('-a', '--all', action='store_true',
85 help="Execute all stress tests")
86parser.add_argument('-T', '--type',
87 help="Filters tests of a certain type (e.g. gate)")
88parser.add_argument('-i', '--call-inherited', action='store_true',
89 default=False,
90 help="Call also inherited function with stress attribute")
91group.add_argument('-t', "--tests", nargs='?',
92 help="Name of the file with test description")
93
94
95def main():
96 ns = parser.parse_args()
Marc Koderer888ddc42013-07-23 16:13:07 +020097 result = 0
Marc Koderer32221b8e2013-08-23 13:57:50 +020098 if not ns.all:
99 tests = json.load(open(ns.tests, 'r'))
100 else:
Marc Kodererb0604412013-09-02 09:43:40 +0200101 tests = discover_stress_tests(filter_attr=ns.type,
102 call_inherited=ns.call_inherited)
Marc Koderer32221b8e2013-08-23 13:57:50 +0200103
Matthew Treinish8e663fc2013-07-16 10:55:22 -0400104 if ns.serial:
David Kranz71fee472014-10-13 15:13:02 -0400105 # Duration is total time
106 duration = ns.duration / len(tests)
Matthew Treinish8e663fc2013-07-16 10:55:22 -0400107 for test in tests:
Marc Koderer888ddc42013-07-23 16:13:07 +0200108 step_result = driver.stress_openstack([test],
David Kranz71fee472014-10-13 15:13:02 -0400109 duration,
Marc Koderer3414d732013-07-31 08:36:36 +0200110 ns.number,
111 ns.stop)
112 # NOTE(mkoderer): we just save the last result code
Marc Koderer888ddc42013-07-23 16:13:07 +0200113 if (step_result != 0):
114 result = step_result
Attila Fazekasf2a8bbd2014-02-23 17:19:12 +0100115 if ns.stop:
116 return result
Matthew Treinish8e663fc2013-07-16 10:55:22 -0400117 else:
Attila Fazekasf2a8bbd2014-02-23 17:19:12 +0100118 result = driver.stress_openstack(tests,
119 ns.duration,
120 ns.number,
121 ns.stop)
Marc Koderer888ddc42013-07-23 16:13:07 +0200122 return result
David Kranzb9d97502013-05-01 15:55:04 -0400123
124
Marc Koderer888ddc42013-07-23 16:13:07 +0200125if __name__ == "__main__":
Marc Koderer16648e92013-10-05 10:49:13 +0200126 try:
Matthew Treinish55e29b42014-05-07 01:04:17 -0400127 sys.exit(main())
Marc Koderer16648e92013-10-05 10:49:13 +0200128 except Exception:
129 LOG.exception("Failure in the stress test framework")
130 sys.exit(1)