root / qa / qa_config.py @ 25c5878d
History | View | Annotate | Download (3 kB)
1 | cec9845c | Michael Hanselmann | # Copyright (C) 2007 Google Inc.
|
---|---|---|---|
2 | cec9845c | Michael Hanselmann | #
|
3 | cec9845c | Michael Hanselmann | # This program is free software; you can redistribute it and/or modify
|
4 | cec9845c | Michael Hanselmann | # it under the terms of the GNU General Public License as published by
|
5 | cec9845c | Michael Hanselmann | # the Free Software Foundation; either version 2 of the License, or
|
6 | cec9845c | Michael Hanselmann | # (at your option) any later version.
|
7 | cec9845c | Michael Hanselmann | #
|
8 | cec9845c | Michael Hanselmann | # This program is distributed in the hope that it will be useful, but
|
9 | cec9845c | Michael Hanselmann | # WITHOUT ANY WARRANTY; without even the implied warranty of
|
10 | cec9845c | Michael Hanselmann | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11 | cec9845c | Michael Hanselmann | # General Public License for more details.
|
12 | cec9845c | Michael Hanselmann | #
|
13 | cec9845c | Michael Hanselmann | # You should have received a copy of the GNU General Public License
|
14 | cec9845c | Michael Hanselmann | # along with this program; if not, write to the Free Software
|
15 | cec9845c | Michael Hanselmann | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
16 | cec9845c | Michael Hanselmann | # 02110-1301, USA.
|
17 | cec9845c | Michael Hanselmann | |
18 | cec9845c | Michael Hanselmann | |
19 | cec9845c | Michael Hanselmann | """QA configuration.
|
20 | cec9845c | Michael Hanselmann |
|
21 | cec9845c | Michael Hanselmann | """
|
22 | cec9845c | Michael Hanselmann | |
23 | cec9845c | Michael Hanselmann | |
24 | cec9845c | Michael Hanselmann | import yaml |
25 | cec9845c | Michael Hanselmann | |
26 | cec9845c | Michael Hanselmann | import qa_error |
27 | cec9845c | Michael Hanselmann | |
28 | cec9845c | Michael Hanselmann | |
29 | cec9845c | Michael Hanselmann | cfg = None
|
30 | cec9845c | Michael Hanselmann | options = None
|
31 | cec9845c | Michael Hanselmann | |
32 | cec9845c | Michael Hanselmann | |
33 | cec9845c | Michael Hanselmann | def Load(path): |
34 | cec9845c | Michael Hanselmann | """Loads the passed configuration file.
|
35 | cec9845c | Michael Hanselmann |
|
36 | cec9845c | Michael Hanselmann | """
|
37 | cec9845c | Michael Hanselmann | global cfg
|
38 | cec9845c | Michael Hanselmann | |
39 | cec9845c | Michael Hanselmann | f = open(path, 'r') |
40 | cec9845c | Michael Hanselmann | try:
|
41 | cec9845c | Michael Hanselmann | cfg = yaml.load(f.read()) |
42 | cec9845c | Michael Hanselmann | finally:
|
43 | cec9845c | Michael Hanselmann | f.close() |
44 | cec9845c | Michael Hanselmann | |
45 | cec9845c | Michael Hanselmann | Validate() |
46 | cec9845c | Michael Hanselmann | |
47 | cec9845c | Michael Hanselmann | |
48 | cec9845c | Michael Hanselmann | def Validate(): |
49 | cec9845c | Michael Hanselmann | if len(cfg['nodes']) < 1: |
50 | cec9845c | Michael Hanselmann | raise qa_error.Error("Need at least one node") |
51 | cec9845c | Michael Hanselmann | if len(cfg['instances']) < 1: |
52 | cec9845c | Michael Hanselmann | raise qa_error.Error("Need at least one instance") |
53 | cec9845c | Michael Hanselmann | |
54 | 2ff95e62 | Michael Hanselmann | if (TestEnabled('instance-add-remote-raid-disk') and |
55 | 2ff95e62 | Michael Hanselmann | TestEnabled('instance-add-drbd-disk')):
|
56 | 2ff95e62 | Michael Hanselmann | raise qa_error.Error('Tests for disk templates remote_raid1 and drbd' |
57 | 2ff95e62 | Michael Hanselmann | ' cannot be enabled at the same time.')
|
58 | 2ff95e62 | Michael Hanselmann | |
59 | cec9845c | Michael Hanselmann | |
60 | cec9845c | Michael Hanselmann | def get(name, default=None): |
61 | cec9845c | Michael Hanselmann | return cfg.get(name, default)
|
62 | cec9845c | Michael Hanselmann | |
63 | cec9845c | Michael Hanselmann | |
64 | cec9845c | Michael Hanselmann | def TestEnabled(test): |
65 | cec9845c | Michael Hanselmann | """Returns True if the given test is enabled."""
|
66 | cec9845c | Michael Hanselmann | return cfg.get('tests', {}).get(test, False) |
67 | cec9845c | Michael Hanselmann | |
68 | cec9845c | Michael Hanselmann | |
69 | cec9845c | Michael Hanselmann | def GetMasterNode(): |
70 | cec9845c | Michael Hanselmann | return cfg['nodes'][0] |
71 | cec9845c | Michael Hanselmann | |
72 | cec9845c | Michael Hanselmann | |
73 | cec9845c | Michael Hanselmann | def AcquireInstance(): |
74 | cec9845c | Michael Hanselmann | """Returns an instance which isn't in use.
|
75 | cec9845c | Michael Hanselmann |
|
76 | cec9845c | Michael Hanselmann | """
|
77 | cec9845c | Michael Hanselmann | # Filter out unwanted instances
|
78 | cec9845c | Michael Hanselmann | tmp_flt = lambda inst: not inst.get('_used', False) |
79 | cec9845c | Michael Hanselmann | instances = filter(tmp_flt, cfg['instances']) |
80 | cec9845c | Michael Hanselmann | del tmp_flt
|
81 | cec9845c | Michael Hanselmann | |
82 | cec9845c | Michael Hanselmann | if len(instances) == 0: |
83 | cec9845c | Michael Hanselmann | raise qa_error.OutOfInstancesError("No instances left") |
84 | cec9845c | Michael Hanselmann | |
85 | cec9845c | Michael Hanselmann | inst = instances[0]
|
86 | cec9845c | Michael Hanselmann | inst['_used'] = True |
87 | cec9845c | Michael Hanselmann | return inst
|
88 | cec9845c | Michael Hanselmann | |
89 | cec9845c | Michael Hanselmann | |
90 | cec9845c | Michael Hanselmann | def ReleaseInstance(inst): |
91 | cec9845c | Michael Hanselmann | inst['_used'] = False |
92 | cec9845c | Michael Hanselmann | |
93 | cec9845c | Michael Hanselmann | |
94 | cec9845c | Michael Hanselmann | def AcquireNode(exclude=None): |
95 | cec9845c | Michael Hanselmann | """Returns the least used node.
|
96 | cec9845c | Michael Hanselmann |
|
97 | cec9845c | Michael Hanselmann | """
|
98 | cec9845c | Michael Hanselmann | master = GetMasterNode() |
99 | cec9845c | Michael Hanselmann | |
100 | cec9845c | Michael Hanselmann | # Filter out unwanted nodes
|
101 | cec9845c | Michael Hanselmann | # TODO: Maybe combine filters
|
102 | cec9845c | Michael Hanselmann | if exclude is None: |
103 | cec9845c | Michael Hanselmann | nodes = cfg['nodes'][:]
|
104 | 4b62db14 | Michael Hanselmann | elif isinstance(exclude, (list, tuple)): |
105 | 4b62db14 | Michael Hanselmann | nodes = filter(lambda node: node not in exclude, cfg['nodes']) |
106 | cec9845c | Michael Hanselmann | else:
|
107 | cec9845c | Michael Hanselmann | nodes = filter(lambda node: node != exclude, cfg['nodes']) |
108 | cec9845c | Michael Hanselmann | |
109 | cec9845c | Michael Hanselmann | tmp_flt = lambda node: node.get('_added', False) or node == master |
110 | cec9845c | Michael Hanselmann | nodes = filter(tmp_flt, nodes)
|
111 | cec9845c | Michael Hanselmann | del tmp_flt
|
112 | cec9845c | Michael Hanselmann | |
113 | cec9845c | Michael Hanselmann | if len(nodes) == 0: |
114 | cec9845c | Michael Hanselmann | raise qa_error.OutOfNodesError("No nodes left") |
115 | cec9845c | Michael Hanselmann | |
116 | cec9845c | Michael Hanselmann | # Get node with least number of uses
|
117 | cec9845c | Michael Hanselmann | def compare(a, b): |
118 | cec9845c | Michael Hanselmann | result = cmp(a.get('_count', 0), b.get('_count', 0)) |
119 | cec9845c | Michael Hanselmann | if result == 0: |
120 | cec9845c | Michael Hanselmann | result = cmp(a['primary'], b['primary']) |
121 | cec9845c | Michael Hanselmann | return result
|
122 | cec9845c | Michael Hanselmann | |
123 | cec9845c | Michael Hanselmann | nodes.sort(cmp=compare) |
124 | cec9845c | Michael Hanselmann | |
125 | cec9845c | Michael Hanselmann | node = nodes[0]
|
126 | cec9845c | Michael Hanselmann | node['_count'] = node.get('_count', 0) + 1 |
127 | cec9845c | Michael Hanselmann | return node
|
128 | cec9845c | Michael Hanselmann | |
129 | cec9845c | Michael Hanselmann | |
130 | cec9845c | Michael Hanselmann | def ReleaseNode(node): |
131 | cec9845c | Michael Hanselmann | node['_count'] = node.get('_count', 0) - 1 |