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
):
16 self
.e_cpu
= dc_emulation_max_cpu
17 # pointer to all resource models assigned to DCs
18 self
._resource
_models
= dict()
19 LOG
.info("Resource model registrar created with dc_emulation_max_cpu=%r" % dc_emulation_max_cpu
)
21 def register(self
, dc
, rm
):
23 Register a new resource model.
24 :param dc: Data center to which it is assigned.
25 :param rm: The resource model object.
28 if dc
in self
._resource
_models
:
29 raise Exception("There is already an resource model assigned to this DC.")
30 self
._resource
_models
[dc
] = rm
32 LOG
.info("Registrar: Added resource model: %r" % rm
)
35 def resource_models(self
):
36 return list(self
._resource
_models
.itervalues())
39 class ResourceFlavor(object):
41 Simple class that represents resource flavors (c.f. OpenStack).
42 Can contain arbitrary metrics.
44 def __init__(self
, name
, metrics
):
46 self
._metrics
= metrics
47 LOG
.debug("Create flavor %r with metrics: %r" % (name
, metrics
))
49 def get(self
, metric_key
):
50 return self
._metrics
.get(metric_key
)
53 class BaseResourceModel(object):
55 Base class for a resource limitation model.
56 Has to be extended by a real resource model implementtion.
60 self
._flavors
= dict()
61 self
._initDefaultFlavors
()
62 self
.registrar
= None # pointer to registrar
63 self
.allocated_compute_instances
= dict()
64 LOG
.info("Resource model %r initialized" % self
)
67 return self
.__class
__.__name
__
69 def _initDefaultFlavors(self
):
71 initialize some default flavours (naming/sizes inspired by OpenStack)
73 self
.addFlavour(ResourceFlavor(
74 "tiny", {"compute": 1, "memory": 32, "disk": 1}))
75 self
.addFlavour(ResourceFlavor(
76 "small", {"compute": 4, "memory": 128, "disk": 20}))
77 self
.addFlavour(ResourceFlavor(
78 "medium", {"compute": 8, "memory": 256, "disk": 40}))
79 self
.addFlavour(ResourceFlavor(
80 "large", {"compute": 16, "memory": 512, "disk": 80}))
81 self
.addFlavour(ResourceFlavor(
82 "xlarge", {"compute": 32, "memory": 1024, "disk": 160}))
84 def addFlavour(self
, fl
):
86 Add a new flavor to the resource model.
87 :param fl: flavor object
90 if fl
.name
in self
._flavors
:
91 raise Exception("Flavor with name %r already exists!" % fl
.name
)
92 self
._flavors
[fl
.name
] = fl
94 def allocate(self
, name
, flavor_name
):
96 This method has to be overwritten by a real resource model.
97 :param name: Name of the started compute instance.
98 :param flavor_name: Name of the flavor to be allocated.
99 :return: 3-tuple: (CPU-fraction, Mem-limit, Disk-limit)
101 LOG
.warning("Allocating in BaseResourceModel: %r with flavor: %r" % (name
, flavor_name
))
102 self
.allocated_compute_instances
[name
] = flavor_name
103 return -1.0, -1.0, -1.0 # return invalid values to indicate that this RM is a dummy
105 def free(self
, name
):
107 This method has to be overwritten by a real resource model.
108 :param name: Name of the compute instance that is stopped.
111 LOG
.warning("Free in BaseResourceModel: %r" % name
)
112 del self
.allocated_compute_instances
[name
]