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