2 Base classes needed for resource models support.
6 LOG
= logging
.getLogger("resourcemodel")
7 LOG
.setLevel(logging
.DEBUG
)
10 class ResourceModelRegistrar(object):
12 def __init__(self
, dc_emulation_max_cpu
):
13 self
.e_cpu
= dc_emulation_max_cpu
14 # pointer to all resource models assigned to DCs
15 self
._resource
_models
= dict()
16 LOG
.info("Resource model registrar created with dc_emulation_max_cpu=%r" % dc_emulation_max_cpu
)
18 def register(self
, dc
, rm
):
19 if dc
in self
._resource
_models
:
20 raise Exception("There is already an resource model assigned to this DC.")
21 self
._resource
_models
[dc
] = rm
23 LOG
.info("Registrar: Added resource model: %r" % rm
)
27 return len(self
._resource
_models
)
30 def resource_models(self
):
31 return list(self
._resource
_models
.itervalues())
34 class ResourceFlavor(object):
36 Simple class that represents resource flavors (c.f. OpenStack).
37 Can contain arbitrary metrics.
39 def __init__(self
, name
, metrics
):
41 self
._metrics
= metrics
42 LOG
.debug("Create flavor %r with metrics: %r" % (name
, metrics
))
44 def get(self
, metric_key
):
45 return self
._metrics
.get(metric_key
)
48 class BaseResourceModel(object):
50 Base class for a resource limitation model.
51 Has to be extended by a real resource model implementtion.
56 self
._initDefaultFlavors
()
57 self
.registrar
= None # pointer to registrar
58 LOG
.info("Resource model %r initialized" % self
)
61 return self
.__class
__.__name
__
63 def _initDefaultFlavors(self
):
64 # initialize some default flavours (inspired by OpenStack)
65 self
.addFlavour(ResourceFlavor(
66 "tiny", {"compute": 1, "memory": 32, "disk": 1}))
67 self
.addFlavour(ResourceFlavor(
68 "small", {"compute": 4, "memory": 128, "disk": 20}))
69 self
.addFlavour(ResourceFlavor(
70 "medium", {"compute": 8, "memory": 256, "disk": 40}))
71 self
.addFlavour(ResourceFlavor(
72 "large", {"compute": 16, "memory": 512, "disk": 80}))
73 self
.addFlavour(ResourceFlavor(
74 "xlarge", {"compute": 32, "memory": 1024, "disk": 160}))
76 def addFlavour(self
, fl
):
78 Add a new flavor to the resource model.
79 :param fl: flavor object
82 if fl
.name
in self
._flavors
:
83 raise Exception("Flavor with name %r already exists!" % fl
.name
)
84 self
._flavors
[fl
.name
] = fl
86 def allocate(self
, name
, flavor_name
):
88 This method has to be overwritten by a real resource model.
89 :param name: Name of the started compute instance.
90 :param flavor_name: Name of the flavor to be allocated.
91 :return: 3-tuple: (CPU-fraction, Mem-limit, Disk-limit)
93 LOG
.warning("Allocating in BaseResourceModel: %r with flavor: %r" % (name
, flavor_name
))
94 return -1.0, -1.0, -1.0 # return invalid values to indicate that this RM is a dummy
98 This method has to be overwritten by a real resource model.
99 :param name: Name of the compute instance that is stopped.
102 LOG
.warning("Free in BaseResourceModel: %r" % name
)