Start all daemons on cluster initialization
[ganeti-local] / lib / ht.py
1 #
2 #
3
4 # Copyright (C) 2010 Google Inc.
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 # 02110-1301, USA.
20
21
22 """Module implementing the parameter types code."""
23
24 from ganeti import compat
25
26 # Modifiable default values; need to define these here before the
27 # actual LUs
28
29 def EmptyList():
30   """Returns an empty list.
31
32   """
33   return []
34
35
36 def EmptyDict():
37   """Returns an empty dict.
38
39   """
40   return {}
41
42
43 #: The without-default default value
44 NoDefault = object()
45
46
47 #: The no-type (value to complex to check it in the type system)
48 NoType = object()
49
50
51 # Some basic types
52 def TNotNone(val):
53   """Checks if the given value is not None.
54
55   """
56   return val is not None
57
58
59 def TNone(val):
60   """Checks if the given value is None.
61
62   """
63   return val is None
64
65
66 def TBool(val):
67   """Checks if the given value is a boolean.
68
69   """
70   return isinstance(val, bool)
71
72
73 def TInt(val):
74   """Checks if the given value is an integer.
75
76   """
77   return isinstance(val, int)
78
79
80 def TFloat(val):
81   """Checks if the given value is a float.
82
83   """
84   return isinstance(val, float)
85
86
87 def TString(val):
88   """Checks if the given value is a string.
89
90   """
91   return isinstance(val, basestring)
92
93
94 def TTrue(val):
95   """Checks if a given value evaluates to a boolean True value.
96
97   """
98   return bool(val)
99
100
101 def TElemOf(target_list):
102   """Builds a function that checks if a given value is a member of a list.
103
104   """
105   return lambda val: val in target_list
106
107
108 # Container types
109 def TList(val):
110   """Checks if the given value is a list.
111
112   """
113   return isinstance(val, list)
114
115
116 def TDict(val):
117   """Checks if the given value is a dictionary.
118
119   """
120   return isinstance(val, dict)
121
122
123 def TIsLength(size):
124   """Check is the given container is of the given size.
125
126   """
127   return lambda container: len(container) == size
128
129
130 # Combinator types
131 def TAnd(*args):
132   """Combine multiple functions using an AND operation.
133
134   """
135   def fn(val):
136     return compat.all(t(val) for t in args)
137   return fn
138
139
140 def TOr(*args):
141   """Combine multiple functions using an AND operation.
142
143   """
144   def fn(val):
145     return compat.any(t(val) for t in args)
146   return fn
147
148
149 def TMap(fn, test):
150   """Checks that a modified version of the argument passes the given test.
151
152   """
153   return lambda val: test(fn(val))
154
155
156 # Type aliases
157
158 #: a non-empty string
159 TNonEmptyString = TAnd(TString, TTrue)
160
161
162 #: a maybe non-empty string
163 TMaybeString = TOr(TNonEmptyString, TNone)
164
165
166 #: a maybe boolean (bool or none)
167 TMaybeBool = TOr(TBool, TNone)
168
169
170 #: a positive integer
171 TPositiveInt = TAnd(TInt, lambda v: v >= 0)
172
173 #: a strictly positive integer
174 TStrictPositiveInt = TAnd(TInt, lambda v: v > 0)
175
176
177 def TListOf(my_type):
178   """Checks if a given value is a list with all elements of the same type.
179
180   """
181   return TAnd(TList,
182                lambda lst: compat.all(my_type(v) for v in lst))
183
184
185 def TDictOf(key_type, val_type):
186   """Checks a dict type for the type of its key/values.
187
188   """
189   return TAnd(TDict,
190               lambda my_dict: (compat.all(key_type(v) for v in my_dict.keys())
191                                and compat.all(val_type(v)
192                                               for v in my_dict.values())))