2 Base classes needed for resource models support.
6 LOG
= logging
.getLogger("resourcemodel")
7 LOG
.setLevel(logging
.DEBUG
)
10 class ResourceModelRegistrar(object):
12 Global registry to keep track of all existing resource models.
15 def __init__(self
, dc_emulation_max_cpu
, dc_emulation_max_mem
):
16 self
.e_cpu
= dc_emulation_max_cpu
17 self
.e_mem
= dc_emulation_max_mem
18 # pointer to all resource models assigned to DCs
19 self
._resource
_models
= dict()
20 LOG
.info("Resource model registrar created with dc_emulation_max_cpu=%r and dc_emulation_max_mem=%r"
21 % (dc_emulation_max_cpu
, dc_emulation_max_mem
))
23 def register(self
, dc
, rm
):
25 Register a new resource model.
26 :param dc: Data center to which it is assigned.
27 :param rm: The resource model object.
30 if dc
in self
._resource
_models
:
31 raise Exception("There is already an resource model assigned to this DC.")
32 self
._resource
_models
[dc
] = rm
35 LOG
.info("Registrar: Added resource model: %r" % rm
)
38 def resource_models(self
):
40 List of registered resource models
43 return list(self
._resource
_models
.itervalues())
46 def num_dcs_with_rms(self
):
48 Total number of data centers that are connected to a resource model
51 return sum([len(rm
.dcs
) for rm
in list(self
._resource
_models
.itervalues())])
54 class ResourceFlavor(object):
56 Simple class that represents resource flavors (c.f. OpenStack).
57 Can contain arbitrary metrics.
59 def __init__(self
, name
, metrics
):
61 self
._metrics
= metrics
62 LOG
.debug("Create flavor %r with metrics: %r" % (name
, metrics
))
64 def get(self
, metric_key
):
65 return self
._metrics
.get(metric_key
)
68 class BaseResourceModel(object):
70 Base class for a resource limitation model.
71 Has to be extended by a real resource model implementtion.
75 self
._flavors
= dict()
76 self
._initDefaultFlavors
()
77 self
.registrar
= None # pointer to registrar
79 self
._allocated
_compute
_instances
= dict()
80 LOG
.info("Resource model %r initialized" % self
)
83 return self
.__class
__.__name
__
85 def _initDefaultFlavors(self
):
87 initialize some default flavours (naming/sizes inspired by OpenStack)
89 self
.addFlavour(ResourceFlavor(
90 "tiny", {"compute": 0.5, "memory": 32, "disk": 1}))
91 self
.addFlavour(ResourceFlavor(
92 "small", {"compute": 1.0, "memory": 128, "disk": 20}))
93 self
.addFlavour(ResourceFlavor(
94 "medium", {"compute": 4.0, "memory": 256, "disk": 40}))
95 self
.addFlavour(ResourceFlavor(
96 "large", {"compute": 8.0, "memory": 512, "disk": 80}))
97 self
.addFlavour(ResourceFlavor(
98 "xlarge", {"compute": 16.0, "memory": 1024, "disk": 160}))
100 def addFlavour(self
, fl
):
102 Add a new flavor to the resource model.
103 :param fl: flavor object
106 if fl
.name
in self
._flavors
:
107 raise Exception("Flavor with name %r already exists!" % fl
.name
)
108 self
._flavors
[fl
.name
] = fl
110 def allocate(self
, d
):
112 This method has to be overwritten by a real resource model.
113 :param d: Container object
115 LOG
.warning("Allocating in BaseResourceModel: %r with flavor: %r" % (d
.name
, d
.flavor_name
))
116 self
._allocated
_compute
_instances
[d
.name
] = d
.flavor_name
120 This method has to be overwritten by a real resource model.
121 :param d: Container object
123 LOG
.warning("Free in BaseResourceModel: %r" % d
.name
)
124 del self
._allocated
_compute
_instances
[d
.name
]
126 def get_state_dict(self
):
128 Return the state of the resource model as simple dict.
129 Helper method for logging functionality.
134 def write_allocation_log(self
, d
, path
):
136 Helper to log RM info for experiments.
138 :param path: log path
141 self
._write
_log
(d
, path
, "allocate")
143 def write_free_log(self
, d
, path
):
145 Helper to log RM info for experiments.
147 :param path: log path
150 self
._write
_log
(d
, path
, "free")
152 def _write_log(self
, d
, path
, action
):
154 Helper to log RM info for experiments.
156 :param path: log path
157 :param action: allocate or free