4 # Copyright 2016 RIFT.IO Inc
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
10 # http://www.apache.org/licenses/LICENSE-2.0
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.
20 class OpenstackGuestEPAUtils(object):
22 Utility class for Host EPA to Openstack flavor extra_specs conversion routines
25 self
._mano
_to
_espec
_cpu
_pinning
_policy
= {
26 'DEDICATED' : 'dedicated',
31 self
._espec
_to
_mano
_cpu
_pinning
_policy
= {
32 'dedicated' : 'DEDICATED',
37 self
._mano
_to
_espec
_mempage
_size
= {
42 'PREFER_LARGE' : 'large',
45 self
._espec
_to
_mano
_mempage
_size
= {
50 'large' : 'PREFER_LARGE',
53 self
._mano
_to
_espec
_cpu
_thread
_pinning
_policy
= {
55 'SEPARATE' : 'separate',
56 'ISOLATE' : 'isolate',
60 self
._espec
_to
_mano
_cpu
_thread
_pinning
_policy
= {
62 'separate' : 'SEPARATE',
63 'isolate' : 'ISOLATE',
67 self
._espec
_to
_mano
_numa
_memory
_policy
= {
69 'preferred': 'PREFERRED'
72 self
._mano
_to
_espec
_numa
_memory
_policy
= {
74 'PREFERRED': 'preferred'
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
]
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
]
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
]
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
]
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
]
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
]
113 def mano_to_extra_spec_trusted_execution(self
, trusted_execution
):
114 if trusted_execution
:
119 def extra_spec_to_mano_trusted_execution(self
, trusted_execution
):
120 if trusted_execution
== 'trusted':
122 elif trusted_execution
== 'untrusted':
127 def mano_to_extra_spec_numa_node_count(self
, numa_node_count
):
128 return numa_node_count
130 def extra_specs_to_mano_numa_node_count(self
, numa_node_count
):
131 return int(numa_node_count
)
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
]
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
]
148 class OpenstackHostEPAUtils(object):
150 Utility class for Host EPA to Openstack flavor extra_specs conversion routines
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",
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",
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",
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",
210 self
._mano
_to
_espec
_cpuvendor
= {
211 "PREFER_INTEL" : "Intel",
212 "REQUIRE_INTEL" : "Intel",
213 "PREFER_AMD" : "AMD",
214 "REQUIRE_AMD" : "AMD",
217 self
._espec
_to
_mano
_cpuvendor
= {
218 "Intel" : "REQUIRE_INTEL",
219 "AMD" : "REQUIRE_AMD",
222 self
._mano
_to
_espec
_cpufeatures
= {
223 "PREFER_AES" : "aes",
224 "REQUIRE_AES" : "aes",
225 "REQUIRE_VME" : "vme",
226 "PREFER_VME" : "vme",
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",
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",
365 self
._espec
_to
_mano
_cpufeatures
= {
366 "aes" : "REQUIRE_AES",
367 "vme" : "REQUIRE_VME",
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",
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",
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
]
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
]
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
]
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
]
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
]
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
]
474 def mano_to_extra_spec_cpu_socket_count(self
, cpu_sockets
):
477 def extra_spec_to_mano_cpu_socket_count(self
, cpu_sockets
):
478 return int(cpu_sockets
)
480 def mano_to_extra_spec_cpu_core_count(self
, cpu_core_count
):
481 return cpu_core_count
483 def extra_spec_to_mano_cpu_core_count(self
, cpu_core_count
):
484 return int(cpu_core_count
)
486 def mano_to_extra_spec_cpu_core_thread_count(self
, core_thread_count
):
487 return core_thread_count
489 def extra_spec_to_mano_cpu_core_thread_count(self
, core_thread_count
):
490 return int(core_thread_count
)
492 def mano_to_extra_spec_cpu_features(self
, features
):
494 epa_feature_str
= None
496 if f
in self
._mano
_to
_espec
_cpufeatures
:
497 cpu_features
.append(self
._mano
_to
_espec
_cpufeatures
[f
])
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
)
504 return epa_feature_str
506 def extra_spec_to_mano_cpu_features(self
, features
):
507 oper_symbols
= ['=', '<in>', '<all-in>', '==', '!=', '>=', '<=', 's==', 's!=', 's<', 's<=', 's>', 's>=']
510 for oper
in oper_symbols
:
511 regex
= '^'+oper
+' (.*?)$'
512 result
= re
.search(regex
, features
)
513 if result
is not None:
516 if result
is not None:
517 feature_list
= result
.group(1)
519 feature_list
= features
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
])
528 class OpenstackExtraSpecUtils(object):
530 General utility class for flavor Extra Specs processing
533 self
.host
= OpenstackHostEPAUtils()
534 self
.guest
= OpenstackGuestEPAUtils()
535 self
.extra_specs_keywords
= [ 'hw:cpu_policy',
536 'hw:cpu_threads_policy',
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',
552 self
.extra_specs_regex
= re
.compile("^"+"|^".join(self
.extra_specs_keywords
))