eda3ccb3d9378355620360b26817b6c44456fa04
[osm/SO.git] / rwcal / plugins / vala / rwcal_openstack / rift / rwcal / openstack / openstack_utils.py
1 #!/usr/bin/env python3
2
3 #
4 # Copyright 2016 RIFT.IO Inc
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 # http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 #
18 import re
19
20 class OpenstackGuestEPAUtils(object):
21 """
22 Utility class for Host EPA to Openstack flavor extra_specs conversion routines
23 """
24 def __init__(self):
25 self._mano_to_espec_cpu_pinning_policy = {
26 'DEDICATED' : 'dedicated',
27 'SHARED' : 'shared',
28 'ANY' : 'any',
29 }
30
31 self._espec_to_mano_cpu_pinning_policy = {
32 'dedicated' : 'DEDICATED',
33 'shared' : 'SHARED',
34 'any' : 'ANY',
35 }
36
37 self._mano_to_espec_mempage_size = {
38 'LARGE' : 'large',
39 'SMALL' : 'small',
40 'SIZE_2MB' : 2048,
41 'SIZE_1GB' : 1048576,
42 'PREFER_LARGE' : 'large',
43 }
44
45 self._espec_to_mano_mempage_size = {
46 'large' : 'LARGE',
47 'small' : 'SMALL',
48 2048 : 'SIZE_2MB',
49 1048576 : 'SIZE_1GB',
50 'large' : 'PREFER_LARGE',
51 }
52
53 self._mano_to_espec_cpu_thread_pinning_policy = {
54 'AVOID' : 'avoid',
55 'SEPARATE' : 'separate',
56 'ISOLATE' : 'isolate',
57 'PREFER' : 'prefer',
58 }
59
60 self._espec_to_mano_cpu_thread_pinning_policy = {
61 'avoid' : 'AVOID',
62 'separate' : 'SEPARATE',
63 'isolate' : 'ISOLATE',
64 'prefer' : 'PREFER',
65 }
66
67 self._espec_to_mano_numa_memory_policy = {
68 'strict' : 'STRICT',
69 'preferred': 'PREFERRED'
70 }
71
72 self._mano_to_espec_numa_memory_policy = {
73 'STRICT' : 'strict',
74 'PREFERRED': 'preferred'
75 }
76
77 def mano_to_extra_spec_cpu_pinning_policy(self, cpu_pinning_policy):
78 if cpu_pinning_policy in self._mano_to_espec_cpu_pinning_policy:
79 return self._mano_to_espec_cpu_pinning_policy[cpu_pinning_policy]
80 else:
81 return None
82
83 def extra_spec_to_mano_cpu_pinning_policy(self, cpu_pinning_policy):
84 if cpu_pinning_policy in self._espec_to_mano_cpu_pinning_policy:
85 return self._espec_to_mano_cpu_pinning_policy[cpu_pinning_policy]
86 else:
87 return None
88
89 def mano_to_extra_spec_mempage_size(self, mempage_size):
90 if mempage_size in self._mano_to_espec_mempage_size:
91 return self._mano_to_espec_mempage_size[mempage_size]
92 else:
93 return None
94
95 def extra_spec_to_mano_mempage_size(self, mempage_size):
96 if mempage_size in self._espec_to_mano_mempage_size:
97 return self._espec_to_mano_mempage_size[mempage_size]
98 else:
99 return None
100
101 def mano_to_extra_spec_cpu_thread_pinning_policy(self, cpu_thread_pinning_policy):
102 if cpu_thread_pinning_policy in self._mano_to_espec_cpu_thread_pinning_policy:
103 return self._mano_to_espec_cpu_thread_pinning_policy[cpu_thread_pinning_policy]
104 else:
105 return None
106
107 def extra_spec_to_mano_cpu_thread_pinning_policy(self, cpu_thread_pinning_policy):
108 if cpu_thread_pinning_policy in self._espec_to_mano_cpu_thread_pinning_policy:
109 return self._espec_to_mano_cpu_thread_pinning_policy[cpu_thread_pinning_policy]
110 else:
111 return None
112
113 def mano_to_extra_spec_trusted_execution(self, trusted_execution):
114 if trusted_execution:
115 return 'trusted'
116 else:
117 return 'untrusted'
118
119 def extra_spec_to_mano_trusted_execution(self, trusted_execution):
120 if trusted_execution == 'trusted':
121 return True
122 elif trusted_execution == 'untrusted':
123 return False
124 else:
125 return None
126
127 def mano_to_extra_spec_numa_node_count(self, numa_node_count):
128 return numa_node_count
129
130 def extra_specs_to_mano_numa_node_count(self, numa_node_count):
131 return int(numa_node_count)
132
133 def mano_to_extra_spec_numa_memory_policy(self, numa_memory_policy):
134 if numa_memory_policy in self._mano_to_espec_numa_memory_policy:
135 return self._mano_to_espec_numa_memory_policy[numa_memory_policy]
136 else:
137 return None
138
139 def extra_to_mano_spec_numa_memory_policy(self, numa_memory_policy):
140 if numa_memory_policy in self._espec_to_mano_numa_memory_policy:
141 return self._espec_to_mano_numa_memory_policy[numa_memory_policy]
142 else:
143 return None
144
145
146
147
148 class OpenstackHostEPAUtils(object):
149 """
150 Utility class for Host EPA to Openstack flavor extra_specs conversion routines
151 """
152 def __init__(self):
153 self._mano_to_espec_cpumodel = {
154 "PREFER_WESTMERE" : "Westmere",
155 "REQUIRE_WESTMERE" : "Westmere",
156 "PREFER_SANDYBRIDGE" : "SandyBridge",
157 "REQUIRE_SANDYBRIDGE" : "SandyBridge",
158 "PREFER_IVYBRIDGE" : "IvyBridge",
159 "REQUIRE_IVYBRIDGE" : "IvyBridge",
160 "PREFER_HASWELL" : "Haswell",
161 "REQUIRE_HASWELL" : "Haswell",
162 "PREFER_BROADWELL" : "Broadwell",
163 "REQUIRE_BROADWELL" : "Broadwell",
164 "PREFER_NEHALEM" : "Nehalem",
165 "REQUIRE_NEHALEM" : "Nehalem",
166 "PREFER_PENRYN" : "Penryn",
167 "REQUIRE_PENRYN" : "Penryn",
168 "PREFER_CONROE" : "Conroe",
169 "REQUIRE_CONROE" : "Conroe",
170 "PREFER_CORE2DUO" : "Core2Duo",
171 "REQUIRE_CORE2DUO" : "Core2Duo",
172 }
173
174 self._espec_to_mano_cpumodel = {
175 "Westmere" : "REQUIRE_WESTMERE",
176 "SandyBridge" : "REQUIRE_SANDYBRIDGE",
177 "IvyBridge" : "REQUIRE_IVYBRIDGE",
178 "Haswell" : "REQUIRE_HASWELL",
179 "Broadwell" : "REQUIRE_BROADWELL",
180 "Nehalem" : "REQUIRE_NEHALEM",
181 "Penryn" : "REQUIRE_PENRYN",
182 "Conroe" : "REQUIRE_CONROE",
183 "Core2Duo" : "REQUIRE_CORE2DUO",
184 }
185
186 self._mano_to_espec_cpuarch = {
187 "PREFER_X86" : "x86",
188 "REQUIRE_X86" : "x86",
189 "PREFER_X86_64" : "x86_64",
190 "REQUIRE_X86_64" : "x86_64",
191 "PREFER_I686" : "i686",
192 "REQUIRE_I686" : "i686",
193 "PREFER_IA64" : "ia64",
194 "REQUIRE_IA64" : "ia64",
195 "PREFER_ARMV7" : "ARMv7",
196 "REQUIRE_ARMV7" : "ARMv7",
197 "PREFER_ARMV8" : "ARMv8-A",
198 "REQUIRE_ARMV8" : "ARMv8-A",
199 }
200
201 self._espec_to_mano_cpuarch = {
202 "x86" : "REQUIRE_X86",
203 "x86_64" : "REQUIRE_X86_64",
204 "i686" : "REQUIRE_I686",
205 "ia64" : "REQUIRE_IA64",
206 "ARMv7-A" : "REQUIRE_ARMV7",
207 "ARMv8-A" : "REQUIRE_ARMV8",
208 }
209
210 self._mano_to_espec_cpuvendor = {
211 "PREFER_INTEL" : "Intel",
212 "REQUIRE_INTEL" : "Intel",
213 "PREFER_AMD" : "AMD",
214 "REQUIRE_AMD" : "AMD",
215 }
216
217 self._espec_to_mano_cpuvendor = {
218 "Intel" : "REQUIRE_INTEL",
219 "AMD" : "REQUIRE_AMD",
220 }
221
222 self._mano_to_espec_cpufeatures = {
223 "PREFER_AES" : "aes",
224 "REQUIRE_AES" : "aes",
225 "REQUIRE_VME" : "vme",
226 "PREFER_VME" : "vme",
227 "REQUIRE_DE" : "de",
228 "PREFER_DE" : "de",
229 "REQUIRE_PSE" : "pse",
230 "PREFER_PSE" : "pse",
231 "REQUIRE_TSC" : "tsc",
232 "PREFER_TSC" : "tsc",
233 "REQUIRE_MSR" : "msr",
234 "PREFER_MSR" : "msr",
235 "REQUIRE_PAE" : "pae",
236 "PREFER_PAE" : "pae",
237 "REQUIRE_MCE" : "mce",
238 "PREFER_MCE" : "mce",
239 "REQUIRE_CX8" : "cx8",
240 "PREFER_CX8" : "cx8",
241 "REQUIRE_APIC" : "apic",
242 "PREFER_APIC" : "apic",
243 "REQUIRE_SEP" : "sep",
244 "PREFER_SEP" : "sep",
245 "REQUIRE_MTRR" : "mtrr",
246 "PREFER_MTRR" : "mtrr",
247 "REQUIRE_PGE" : "pge",
248 "PREFER_PGE" : "pge",
249 "REQUIRE_MCA" : "mca",
250 "PREFER_MCA" : "mca",
251 "REQUIRE_CMOV" : "cmov",
252 "PREFER_CMOV" : "cmov",
253 "REQUIRE_PAT" : "pat",
254 "PREFER_PAT" : "pat",
255 "REQUIRE_PSE36" : "pse36",
256 "PREFER_PSE36" : "pse36",
257 "REQUIRE_CLFLUSH" : "clflush",
258 "PREFER_CLFLUSH" : "clflush",
259 "REQUIRE_DTS" : "dts",
260 "PREFER_DTS" : "dts",
261 "REQUIRE_ACPI" : "acpi",
262 "PREFER_ACPI" : "acpi",
263 "REQUIRE_MMX" : "mmx",
264 "PREFER_MMX" : "mmx",
265 "REQUIRE_FXSR" : "fxsr",
266 "PREFER_FXSR" : "fxsr",
267 "REQUIRE_SSE" : "sse",
268 "PREFER_SSE" : "sse",
269 "REQUIRE_SSE2" : "sse2",
270 "PREFER_SSE2" : "sse2",
271 "REQUIRE_SS" : "ss",
272 "PREFER_SS" : "ss",
273 "REQUIRE_HT" : "ht",
274 "PREFER_HT" : "ht",
275 "REQUIRE_TM" : "tm",
276 "PREFER_TM" : "tm",
277 "REQUIRE_IA64" : "ia64",
278 "PREFER_IA64" : "ia64",
279 "REQUIRE_PBE" : "pbe",
280 "PREFER_PBE" : "pbe",
281 "REQUIRE_RDTSCP" : "rdtscp",
282 "PREFER_RDTSCP" : "rdtscp",
283 "REQUIRE_PNI" : "pni",
284 "PREFER_PNI" : "pni",
285 "REQUIRE_PCLMULQDQ": "pclmulqdq",
286 "PREFER_PCLMULQDQ" : "pclmulqdq",
287 "REQUIRE_DTES64" : "dtes64",
288 "PREFER_DTES64" : "dtes64",
289 "REQUIRE_MONITOR" : "monitor",
290 "PREFER_MONITOR" : "monitor",
291 "REQUIRE_DS_CPL" : "ds_cpl",
292 "PREFER_DS_CPL" : "ds_cpl",
293 "REQUIRE_VMX" : "vmx",
294 "PREFER_VMX" : "vmx",
295 "REQUIRE_SMX" : "smx",
296 "PREFER_SMX" : "smx",
297 "REQUIRE_EST" : "est",
298 "PREFER_EST" : "est",
299 "REQUIRE_TM2" : "tm2",
300 "PREFER_TM2" : "tm2",
301 "REQUIRE_SSSE3" : "ssse3",
302 "PREFER_SSSE3" : "ssse3",
303 "REQUIRE_CID" : "cid",
304 "PREFER_CID" : "cid",
305 "REQUIRE_FMA" : "fma",
306 "PREFER_FMA" : "fma",
307 "REQUIRE_CX16" : "cx16",
308 "PREFER_CX16" : "cx16",
309 "REQUIRE_XTPR" : "xtpr",
310 "PREFER_XTPR" : "xtpr",
311 "REQUIRE_PDCM" : "pdcm",
312 "PREFER_PDCM" : "pdcm",
313 "REQUIRE_PCID" : "pcid",
314 "PREFER_PCID" : "pcid",
315 "REQUIRE_DCA" : "dca",
316 "PREFER_DCA" : "dca",
317 "REQUIRE_SSE4_1" : "sse4_1",
318 "PREFER_SSE4_1" : "sse4_1",
319 "REQUIRE_SSE4_2" : "sse4_2",
320 "PREFER_SSE4_2" : "sse4_2",
321 "REQUIRE_X2APIC" : "x2apic",
322 "PREFER_X2APIC" : "x2apic",
323 "REQUIRE_MOVBE" : "movbe",
324 "PREFER_MOVBE" : "movbe",
325 "REQUIRE_POPCNT" : "popcnt",
326 "PREFER_POPCNT" : "popcnt",
327 "REQUIRE_TSC_DEADLINE_TIMER" : "tsc_deadline_timer",
328 "PREFER_TSC_DEADLINE_TIMER" : "tsc_deadline_timer",
329 "REQUIRE_XSAVE" : "xsave",
330 "PREFER_XSAVE" : "xsave",
331 "REQUIRE_AVX" : "avx",
332 "PREFER_AVX" : "avx",
333 "REQUIRE_F16C" : "f16c",
334 "PREFER_F16C" : "f16c",
335 "REQUIRE_RDRAND" : "rdrand",
336 "PREFER_RDRAND" : "rdrand",
337 "REQUIRE_FSGSBASE" : "fsgsbase",
338 "PREFER_FSGSBASE" : "fsgsbase",
339 "REQUIRE_BMI1" : "bmi1",
340 "PREFER_BMI1" : "bmi1",
341 "REQUIRE_HLE" : "hle",
342 "PREFER_HLE" : "hle",
343 "REQUIRE_AVX2" : "avx2",
344 "PREFER_AVX2" : "avx2",
345 "REQUIRE_SMEP" : "smep",
346 "PREFER_SMEP" : "smep",
347 "REQUIRE_BMI2" : "bmi2",
348 "PREFER_BMI2" : "bmi2",
349 "REQUIRE_ERMS" : "erms",
350 "PREFER_ERMS" : "erms",
351 "REQUIRE_INVPCID" : "invpcid",
352 "PREFER_INVPCID" : "invpcid",
353 "REQUIRE_RTM" : "rtm",
354 "PREFER_RTM" : "rtm",
355 "REQUIRE_MPX" : "mpx",
356 "PREFER_MPX" : "mpx",
357 "REQUIRE_RDSEED" : "rdseed",
358 "PREFER_RDSEED" : "rdseed",
359 "REQUIRE_ADX" : "adx",
360 "PREFER_ADX" : "adx",
361 "REQUIRE_SMAP" : "smap",
362 "PREFER_SMAP" : "smap",
363 }
364
365 self._espec_to_mano_cpufeatures = {
366 "aes" : "REQUIRE_AES",
367 "vme" : "REQUIRE_VME",
368 "de" : "REQUIRE_DE",
369 "pse" : "REQUIRE_PSE",
370 "tsc" : "REQUIRE_TSC",
371 "msr" : "REQUIRE_MSR",
372 "pae" : "REQUIRE_PAE",
373 "mce" : "REQUIRE_MCE",
374 "cx8" : "REQUIRE_CX8",
375 "apic" : "REQUIRE_APIC",
376 "sep" : "REQUIRE_SEP",
377 "mtrr" : "REQUIRE_MTRR",
378 "pge" : "REQUIRE_PGE",
379 "mca" : "REQUIRE_MCA",
380 "cmov" : "REQUIRE_CMOV",
381 "pat" : "REQUIRE_PAT",
382 "pse36" : "REQUIRE_PSE36",
383 "clflush" : "REQUIRE_CLFLUSH",
384 "dts" : "REQUIRE_DTS",
385 "acpi" : "REQUIRE_ACPI",
386 "mmx" : "REQUIRE_MMX",
387 "fxsr" : "REQUIRE_FXSR",
388 "sse" : "REQUIRE_SSE",
389 "sse2" : "REQUIRE_SSE2",
390 "ss" : "REQUIRE_SS",
391 "ht" : "REQUIRE_HT",
392 "tm" : "REQUIRE_TM",
393 "ia64" : "REQUIRE_IA64",
394 "pbe" : "REQUIRE_PBE",
395 "rdtscp" : "REQUIRE_RDTSCP",
396 "pni" : "REQUIRE_PNI",
397 "pclmulqdq": "REQUIRE_PCLMULQDQ",
398 "dtes64" : "REQUIRE_DTES64",
399 "monitor" : "REQUIRE_MONITOR",
400 "ds_cpl" : "REQUIRE_DS_CPL",
401 "vmx" : "REQUIRE_VMX",
402 "smx" : "REQUIRE_SMX",
403 "est" : "REQUIRE_EST",
404 "tm2" : "REQUIRE_TM2",
405 "ssse3" : "REQUIRE_SSSE3",
406 "cid" : "REQUIRE_CID",
407 "fma" : "REQUIRE_FMA",
408 "cx16" : "REQUIRE_CX16",
409 "xtpr" : "REQUIRE_XTPR",
410 "pdcm" : "REQUIRE_PDCM",
411 "pcid" : "REQUIRE_PCID",
412 "dca" : "REQUIRE_DCA",
413 "sse4_1" : "REQUIRE_SSE4_1",
414 "sse4_2" : "REQUIRE_SSE4_2",
415 "x2apic" : "REQUIRE_X2APIC",
416 "movbe" : "REQUIRE_MOVBE",
417 "popcnt" : "REQUIRE_POPCNT",
418 "tsc_deadline_timer" : "REQUIRE_TSC_DEADLINE_TIMER",
419 "xsave" : "REQUIRE_XSAVE",
420 "avx" : "REQUIRE_AVX",
421 "f16c" : "REQUIRE_F16C",
422 "rdrand" : "REQUIRE_RDRAND",
423 "fsgsbase" : "REQUIRE_FSGSBASE",
424 "bmi1" : "REQUIRE_BMI1",
425 "hle" : "REQUIRE_HLE",
426 "avx2" : "REQUIRE_AVX2",
427 "smep" : "REQUIRE_SMEP",
428 "bmi2" : "REQUIRE_BMI2",
429 "erms" : "REQUIRE_ERMS",
430 "invpcid" : "REQUIRE_INVPCID",
431 "rtm" : "REQUIRE_RTM",
432 "mpx" : "REQUIRE_MPX",
433 "rdseed" : "REQUIRE_RDSEED",
434 "adx" : "REQUIRE_ADX",
435 "smap" : "REQUIRE_SMAP",
436 }
437
438 def mano_to_extra_spec_cpu_model(self, cpu_model):
439 if cpu_model in self._mano_to_espec_cpumodel:
440 return self._mano_to_espec_cpumodel[cpu_model]
441 else:
442 return None
443
444 def extra_specs_to_mano_cpu_model(self, cpu_model):
445 if cpu_model in self._espec_to_mano_cpumodel:
446 return self._espec_to_mano_cpumodel[cpu_model]
447 else:
448 return None
449
450 def mano_to_extra_spec_cpu_arch(self, cpu_arch):
451 if cpu_arch in self._mano_to_espec_cpuarch:
452 return self._mano_to_espec_cpuarch[cpu_arch]
453 else:
454 return None
455
456 def extra_specs_to_mano_cpu_arch(self, cpu_arch):
457 if cpu_arch in self._espec_to_mano_cpuarch:
458 return self._espec_to_mano_cpuarch[cpu_arch]
459 else:
460 return None
461
462 def mano_to_extra_spec_cpu_vendor(self, cpu_vendor):
463 if cpu_vendor in self._mano_to_espec_cpuvendor:
464 return self._mano_to_espec_cpuvendor[cpu_vendor]
465 else:
466 return None
467
468 def extra_spec_to_mano_cpu_vendor(self, cpu_vendor):
469 if cpu_vendor in self._espec_to_mano_cpuvendor:
470 return self._espec_to_mano_cpuvendor[cpu_vendor]
471 else:
472 return None
473
474 def mano_to_extra_spec_cpu_socket_count(self, cpu_sockets):
475 return cpu_sockets
476
477 def extra_spec_to_mano_cpu_socket_count(self, cpu_sockets):
478 return int(cpu_sockets)
479
480 def mano_to_extra_spec_cpu_core_count(self, cpu_core_count):
481 return cpu_core_count
482
483 def extra_spec_to_mano_cpu_core_count(self, cpu_core_count):
484 return int(cpu_core_count)
485
486 def mano_to_extra_spec_cpu_core_thread_count(self, core_thread_count):
487 return core_thread_count
488
489 def extra_spec_to_mano_cpu_core_thread_count(self, core_thread_count):
490 return int(core_thread_count)
491
492 def mano_to_extra_spec_cpu_features(self, features):
493 cpu_features = []
494 epa_feature_str = None
495 for f in features:
496 if f in self._mano_to_espec_cpufeatures:
497 cpu_features.append(self._mano_to_espec_cpufeatures[f])
498
499 if len(cpu_features) > 1:
500 epa_feature_str = '<all-in> '+ " ".join(cpu_features)
501 elif len(cpu_features) == 1:
502 epa_feature_str = " ".join(cpu_features)
503
504 return epa_feature_str
505
506 def extra_spec_to_mano_cpu_features(self, features):
507 oper_symbols = ['=', '<in>', '<all-in>', '==', '!=', '>=', '<=', 's==', 's!=', 's<', 's<=', 's>', 's>=']
508 cpu_features = []
509 result = None
510 for oper in oper_symbols:
511 regex = '^'+oper+' (.*?)$'
512 result = re.search(regex, features)
513 if result is not None:
514 break
515
516 if result is not None:
517 feature_list = result.group(1)
518 else:
519 feature_list = features
520
521 for f in feature_list.split():
522 if f in self._espec_to_mano_cpufeatures:
523 cpu_features.append(self._espec_to_mano_cpufeatures[f])
524
525 return cpu_features
526
527
528 class OpenstackExtraSpecUtils(object):
529 """
530 General utility class for flavor Extra Specs processing
531 """
532 def __init__(self):
533 self.host = OpenstackHostEPAUtils()
534 self.guest = OpenstackGuestEPAUtils()
535 self.extra_specs_keywords = [ 'hw:cpu_policy',
536 'hw:cpu_threads_policy',
537 'hw:mem_page_size',
538 'hw:numa_nodes',
539 'hw:numa_mempolicy',
540 'hw:numa_cpus',
541 'hw:numa_mem',
542 'trust:trusted_host',
543 'pci_passthrough:alias',
544 'capabilities:cpu_info:model',
545 'capabilities:cpu_info:arch',
546 'capabilities:cpu_info:vendor',
547 'capabilities:cpu_info:topology:sockets',
548 'capabilities:cpu_info:topology:cores',
549 'capabilities:cpu_info:topology:threads',
550 'capabilities:cpu_info:features',
551 ]
552 self.extra_specs_regex = re.compile("^"+"|^".join(self.extra_specs_keywords))