1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
# vim: set fileencoding=utf-8 :
import yaml
class WorkerSlotModel:
def __init__ (self, slots, worker, env):
self._slots = slots
self._worker = worker
self._env = env
# generated properties, public, read-only
self.slotNames = set (slots.keys ())
assert len (self.slotNames) == len (slots.keys ()), "slot names must be unique"
self.workerNames = set (worker.keys ())
assert len (self.workerNames) == len (worker.keys ()), "worker names must be unique"
self.minTotalSlots = self._env.get ('minSlots', 0)
self.maxTotalSlots = self._env.get ('maxSlots', len (self.slotNames))
@classmethod
def fromYaml (obj, fd):
"""
Import from YAML file. Structured like this:
"""
data = yaml.load (fd)
o = obj (data['slots'], data['worker'], data.get ('env', {}))
return o
def available (self, worker, slot):
"""
Is worker available for slot?
"""
return self.priority (worker, slot) is not None
def priority (self, worker, slot):
"""
Get worker’s preferences/priority for slot, priority is higher for
smaller numbers and must be >= 1
"""
return self._worker[worker]['prio'].get (slot, None)
def maxSlots (self, worker):
return self._worker[worker]['slots']['max']
def minSlots (self, worker):
return self._worker[worker]['slots']['min']
def maxWorker (self, slot):
return self._slots[slot]['max']
def minWorker (self, slot):
return self._slots[slot]['min']
def dump (self, fd):
yaml.dump ({'worker': self._worker, 'slots': self._slots, 'env': self._env}, fd)
|