Statistics
| Branch: | Tag: | Revision:

root / qa / qa_config.py @ cec9845c

History | View | Annotate | Download (2.6 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 cec9845c Michael Hanselmann
55 cec9845c Michael Hanselmann
def get(name, default=None):
56 cec9845c Michael Hanselmann
  return cfg.get(name, default)
57 cec9845c Michael Hanselmann
58 cec9845c Michael Hanselmann
59 cec9845c Michael Hanselmann
def TestEnabled(test):
60 cec9845c Michael Hanselmann
  """Returns True if the given test is enabled."""
61 cec9845c Michael Hanselmann
  return cfg.get('tests', {}).get(test, False)
62 cec9845c Michael Hanselmann
63 cec9845c Michael Hanselmann
64 cec9845c Michael Hanselmann
def GetMasterNode():
65 cec9845c Michael Hanselmann
  return cfg['nodes'][0]
66 cec9845c Michael Hanselmann
67 cec9845c Michael Hanselmann
68 cec9845c Michael Hanselmann
def AcquireInstance():
69 cec9845c Michael Hanselmann
  """Returns an instance which isn't in use.
70 cec9845c Michael Hanselmann

71 cec9845c Michael Hanselmann
  """
72 cec9845c Michael Hanselmann
  # Filter out unwanted instances
73 cec9845c Michael Hanselmann
  tmp_flt = lambda inst: not inst.get('_used', False)
74 cec9845c Michael Hanselmann
  instances = filter(tmp_flt, cfg['instances'])
75 cec9845c Michael Hanselmann
  del tmp_flt
76 cec9845c Michael Hanselmann
77 cec9845c Michael Hanselmann
  if len(instances) == 0:
78 cec9845c Michael Hanselmann
    raise qa_error.OutOfInstancesError("No instances left")
79 cec9845c Michael Hanselmann
80 cec9845c Michael Hanselmann
  inst = instances[0]
81 cec9845c Michael Hanselmann
  inst['_used'] = True
82 cec9845c Michael Hanselmann
  return inst
83 cec9845c Michael Hanselmann
84 cec9845c Michael Hanselmann
85 cec9845c Michael Hanselmann
def ReleaseInstance(inst):
86 cec9845c Michael Hanselmann
  inst['_used'] = False
87 cec9845c Michael Hanselmann
88 cec9845c Michael Hanselmann
89 cec9845c Michael Hanselmann
def AcquireNode(exclude=None):
90 cec9845c Michael Hanselmann
  """Returns the least used node.
91 cec9845c Michael Hanselmann

92 cec9845c Michael Hanselmann
  """
93 cec9845c Michael Hanselmann
  master = GetMasterNode()
94 cec9845c Michael Hanselmann
95 cec9845c Michael Hanselmann
  # Filter out unwanted nodes
96 cec9845c Michael Hanselmann
  # TODO: Maybe combine filters
97 cec9845c Michael Hanselmann
  if exclude is None:
98 cec9845c Michael Hanselmann
    nodes = cfg['nodes'][:]
99 cec9845c Michael Hanselmann
  else:
100 cec9845c Michael Hanselmann
    nodes = filter(lambda node: node != exclude, cfg['nodes'])
101 cec9845c Michael Hanselmann
102 cec9845c Michael Hanselmann
  tmp_flt = lambda node: node.get('_added', False) or node == master
103 cec9845c Michael Hanselmann
  nodes = filter(tmp_flt, nodes)
104 cec9845c Michael Hanselmann
  del tmp_flt
105 cec9845c Michael Hanselmann
106 cec9845c Michael Hanselmann
  if len(nodes) == 0:
107 cec9845c Michael Hanselmann
    raise qa_error.OutOfNodesError("No nodes left")
108 cec9845c Michael Hanselmann
109 cec9845c Michael Hanselmann
  # Get node with least number of uses
110 cec9845c Michael Hanselmann
  def compare(a, b):
111 cec9845c Michael Hanselmann
    result = cmp(a.get('_count', 0), b.get('_count', 0))
112 cec9845c Michael Hanselmann
    if result == 0:
113 cec9845c Michael Hanselmann
      result = cmp(a['primary'], b['primary'])
114 cec9845c Michael Hanselmann
    return result
115 cec9845c Michael Hanselmann
116 cec9845c Michael Hanselmann
  nodes.sort(cmp=compare)
117 cec9845c Michael Hanselmann
118 cec9845c Michael Hanselmann
  node = nodes[0]
119 cec9845c Michael Hanselmann
  node['_count'] = node.get('_count', 0) + 1
120 cec9845c Michael Hanselmann
  return node
121 cec9845c Michael Hanselmann
122 cec9845c Michael Hanselmann
123 cec9845c Michael Hanselmann
def ReleaseNode(node):
124 cec9845c Michael Hanselmann
  node['_count'] = node.get('_count', 0) - 1