RIFT OSM R1 Initial Submission
[osm/SO.git] / rwcal / plugins / vala / rwcal_openstack / rift / rwcal / openstack / openstack_utils.py
diff --git a/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/openstack_utils.py b/rwcal/plugins/vala/rwcal_openstack/rift/rwcal/openstack/openstack_utils.py
new file mode 100644 (file)
index 0000000..eda3ccb
--- /dev/null
@@ -0,0 +1,552 @@
+#!/usr/bin/env python3
+
+# 
+#   Copyright 2016 RIFT.IO Inc
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+#
+import re
+
+class OpenstackGuestEPAUtils(object):
+    """
+    Utility class for Host EPA to Openstack flavor extra_specs conversion routines
+    """
+    def __init__(self):
+        self._mano_to_espec_cpu_pinning_policy = {
+            'DEDICATED' : 'dedicated',
+            'SHARED'    : 'shared',
+            'ANY'       : 'any',
+        }
+
+        self._espec_to_mano_cpu_pinning_policy = {
+            'dedicated' : 'DEDICATED',
+            'shared'    : 'SHARED',
+            'any'       : 'ANY',
+        }
+        
+        self._mano_to_espec_mempage_size = {
+            'LARGE'        : 'large', 
+            'SMALL'        : 'small',
+            'SIZE_2MB'     :  2048,
+            'SIZE_1GB'     :  1048576,
+            'PREFER_LARGE' : 'large',
+        }
+
+        self._espec_to_mano_mempage_size = {
+            'large'        : 'LARGE', 
+            'small'        : 'SMALL',
+             2048          : 'SIZE_2MB',
+             1048576       : 'SIZE_1GB',
+            'large'        : 'PREFER_LARGE',
+        }
+
+        self._mano_to_espec_cpu_thread_pinning_policy = {
+            'AVOID'    : 'avoid',
+            'SEPARATE' : 'separate',
+            'ISOLATE'  : 'isolate',
+            'PREFER'   : 'prefer',
+        }
+
+        self._espec_to_mano_cpu_thread_pinning_policy = {
+            'avoid'    : 'AVOID',
+            'separate' : 'SEPARATE',
+            'isolate'  : 'ISOLATE',
+            'prefer'   : 'PREFER',
+        }
+
+        self._espec_to_mano_numa_memory_policy = {
+            'strict'   : 'STRICT',
+            'preferred': 'PREFERRED'
+        }
+
+        self._mano_to_espec_numa_memory_policy = {
+            'STRICT'   : 'strict',
+            'PREFERRED': 'preferred'
+        }
+
+    def mano_to_extra_spec_cpu_pinning_policy(self, cpu_pinning_policy):
+        if cpu_pinning_policy in self._mano_to_espec_cpu_pinning_policy:
+            return self._mano_to_espec_cpu_pinning_policy[cpu_pinning_policy]
+        else:
+            return None
+
+    def extra_spec_to_mano_cpu_pinning_policy(self, cpu_pinning_policy):
+        if cpu_pinning_policy in self._espec_to_mano_cpu_pinning_policy:
+            return self._espec_to_mano_cpu_pinning_policy[cpu_pinning_policy]
+        else:
+            return None
+
+    def mano_to_extra_spec_mempage_size(self, mempage_size):
+        if mempage_size in self._mano_to_espec_mempage_size:
+            return self._mano_to_espec_mempage_size[mempage_size]
+        else:
+            return None
+        
+    def extra_spec_to_mano_mempage_size(self, mempage_size):
+        if mempage_size in self._espec_to_mano_mempage_size:
+            return self._espec_to_mano_mempage_size[mempage_size]
+        else:
+            return None
+
+    def mano_to_extra_spec_cpu_thread_pinning_policy(self, cpu_thread_pinning_policy):
+        if cpu_thread_pinning_policy in self._mano_to_espec_cpu_thread_pinning_policy:
+            return self._mano_to_espec_cpu_thread_pinning_policy[cpu_thread_pinning_policy]
+        else:
+            return None
+
+    def extra_spec_to_mano_cpu_thread_pinning_policy(self, cpu_thread_pinning_policy):
+        if cpu_thread_pinning_policy in self._espec_to_mano_cpu_thread_pinning_policy:
+            return self._espec_to_mano_cpu_thread_pinning_policy[cpu_thread_pinning_policy]
+        else:
+            return None
+
+    def mano_to_extra_spec_trusted_execution(self, trusted_execution):
+        if trusted_execution:
+            return 'trusted'
+        else:
+            return 'untrusted'
+
+    def extra_spec_to_mano_trusted_execution(self, trusted_execution):
+        if trusted_execution == 'trusted':
+            return True
+        elif trusted_execution == 'untrusted':
+            return False
+        else:
+            return None
+        
+    def mano_to_extra_spec_numa_node_count(self, numa_node_count):
+        return numa_node_count
+
+    def extra_specs_to_mano_numa_node_count(self, numa_node_count):
+        return int(numa_node_count)
+    
+    def mano_to_extra_spec_numa_memory_policy(self, numa_memory_policy):
+        if numa_memory_policy in self._mano_to_espec_numa_memory_policy:
+            return self._mano_to_espec_numa_memory_policy[numa_memory_policy]
+        else:
+            return None
+
+    def extra_to_mano_spec_numa_memory_policy(self, numa_memory_policy):
+        if numa_memory_policy in self._espec_to_mano_numa_memory_policy:
+            return self._espec_to_mano_numa_memory_policy[numa_memory_policy]
+        else:
+            return None
+        
+                                                          
+    
+    
+class OpenstackHostEPAUtils(object):
+    """
+    Utility class for Host EPA to Openstack flavor extra_specs conversion routines
+    """
+    def __init__(self):
+        self._mano_to_espec_cpumodel = {
+            "PREFER_WESTMERE"     : "Westmere",
+            "REQUIRE_WESTMERE"    : "Westmere",
+            "PREFER_SANDYBRIDGE"  : "SandyBridge",
+            "REQUIRE_SANDYBRIDGE" : "SandyBridge",
+            "PREFER_IVYBRIDGE"    : "IvyBridge",
+            "REQUIRE_IVYBRIDGE"   : "IvyBridge",
+            "PREFER_HASWELL"      : "Haswell",
+            "REQUIRE_HASWELL"     : "Haswell",
+            "PREFER_BROADWELL"    : "Broadwell",
+            "REQUIRE_BROADWELL"   : "Broadwell",
+            "PREFER_NEHALEM"      : "Nehalem",
+            "REQUIRE_NEHALEM"     : "Nehalem",
+            "PREFER_PENRYN"       : "Penryn",
+            "REQUIRE_PENRYN"      : "Penryn",
+            "PREFER_CONROE"       : "Conroe",
+            "REQUIRE_CONROE"      : "Conroe",
+            "PREFER_CORE2DUO"     : "Core2Duo",
+            "REQUIRE_CORE2DUO"    : "Core2Duo",
+        }
+
+        self._espec_to_mano_cpumodel = {
+            "Westmere"     : "REQUIRE_WESTMERE",
+            "SandyBridge"  : "REQUIRE_SANDYBRIDGE",
+            "IvyBridge"    : "REQUIRE_IVYBRIDGE",
+            "Haswell"      : "REQUIRE_HASWELL",
+            "Broadwell"    : "REQUIRE_BROADWELL",
+            "Nehalem"      : "REQUIRE_NEHALEM",
+            "Penryn"       : "REQUIRE_PENRYN",
+            "Conroe"       : "REQUIRE_CONROE",
+            "Core2Duo"     : "REQUIRE_CORE2DUO",
+        }
+
+        self._mano_to_espec_cpuarch = {
+            "PREFER_X86"     : "x86",
+            "REQUIRE_X86"    : "x86",
+            "PREFER_X86_64"  : "x86_64",
+            "REQUIRE_X86_64" : "x86_64",
+            "PREFER_I686"    : "i686",
+            "REQUIRE_I686"   : "i686",
+            "PREFER_IA64"    : "ia64",
+            "REQUIRE_IA64"   : "ia64",
+            "PREFER_ARMV7"   : "ARMv7",
+            "REQUIRE_ARMV7"  : "ARMv7",
+            "PREFER_ARMV8"   : "ARMv8-A",
+            "REQUIRE_ARMV8"  : "ARMv8-A",
+        }
+
+        self._espec_to_mano_cpuarch = {
+            "x86"     : "REQUIRE_X86",
+            "x86_64"  : "REQUIRE_X86_64",
+            "i686"    : "REQUIRE_I686",
+            "ia64"    : "REQUIRE_IA64",
+            "ARMv7-A" : "REQUIRE_ARMV7",
+            "ARMv8-A" : "REQUIRE_ARMV8",
+        }
+
+        self._mano_to_espec_cpuvendor = {
+            "PREFER_INTEL"  : "Intel",
+            "REQUIRE_INTEL" : "Intel",
+            "PREFER_AMD"    : "AMD",
+            "REQUIRE_AMD"   : "AMD",
+        }
+
+        self._espec_to_mano_cpuvendor = {
+            "Intel" : "REQUIRE_INTEL",
+            "AMD"   : "REQUIRE_AMD",
+        }
+
+        self._mano_to_espec_cpufeatures = {
+            "PREFER_AES"       : "aes",
+            "REQUIRE_AES"      : "aes",
+            "REQUIRE_VME"      : "vme",
+            "PREFER_VME"       : "vme",
+            "REQUIRE_DE"       : "de",
+            "PREFER_DE"        : "de",
+            "REQUIRE_PSE"      : "pse",
+            "PREFER_PSE"       : "pse",
+            "REQUIRE_TSC"      : "tsc",
+            "PREFER_TSC"       : "tsc",
+            "REQUIRE_MSR"      : "msr",
+            "PREFER_MSR"       : "msr",
+            "REQUIRE_PAE"      : "pae",
+            "PREFER_PAE"       : "pae",
+            "REQUIRE_MCE"      : "mce",
+            "PREFER_MCE"       : "mce",
+            "REQUIRE_CX8"      : "cx8",
+            "PREFER_CX8"       : "cx8",
+            "REQUIRE_APIC"     : "apic",
+            "PREFER_APIC"      : "apic",
+            "REQUIRE_SEP"      : "sep",
+            "PREFER_SEP"       : "sep",
+            "REQUIRE_MTRR"     : "mtrr",
+            "PREFER_MTRR"      : "mtrr",
+            "REQUIRE_PGE"      : "pge",
+            "PREFER_PGE"       : "pge",
+            "REQUIRE_MCA"      : "mca",
+            "PREFER_MCA"       : "mca",
+            "REQUIRE_CMOV"     : "cmov",
+            "PREFER_CMOV"      : "cmov",
+            "REQUIRE_PAT"      : "pat",
+            "PREFER_PAT"       : "pat",
+            "REQUIRE_PSE36"    : "pse36",
+            "PREFER_PSE36"     : "pse36",
+            "REQUIRE_CLFLUSH"  : "clflush",
+            "PREFER_CLFLUSH"   : "clflush",
+            "REQUIRE_DTS"      : "dts",
+            "PREFER_DTS"       : "dts",
+            "REQUIRE_ACPI"     : "acpi",
+            "PREFER_ACPI"      : "acpi",
+            "REQUIRE_MMX"      : "mmx",
+            "PREFER_MMX"       : "mmx",
+            "REQUIRE_FXSR"     : "fxsr",
+            "PREFER_FXSR"      : "fxsr",
+            "REQUIRE_SSE"      : "sse",
+            "PREFER_SSE"       : "sse",
+            "REQUIRE_SSE2"     : "sse2",
+            "PREFER_SSE2"      : "sse2",
+            "REQUIRE_SS"       : "ss",
+            "PREFER_SS"        : "ss",
+            "REQUIRE_HT"       : "ht",
+            "PREFER_HT"        : "ht",
+            "REQUIRE_TM"       : "tm",
+            "PREFER_TM"        : "tm",
+            "REQUIRE_IA64"     : "ia64",
+            "PREFER_IA64"      : "ia64",
+            "REQUIRE_PBE"      : "pbe",
+            "PREFER_PBE"       : "pbe",
+            "REQUIRE_RDTSCP"   : "rdtscp",
+            "PREFER_RDTSCP"    : "rdtscp",
+            "REQUIRE_PNI"      : "pni",
+            "PREFER_PNI"       : "pni",
+            "REQUIRE_PCLMULQDQ": "pclmulqdq",
+            "PREFER_PCLMULQDQ" : "pclmulqdq",
+            "REQUIRE_DTES64"   : "dtes64",
+            "PREFER_DTES64"    : "dtes64",
+            "REQUIRE_MONITOR"  : "monitor",
+            "PREFER_MONITOR"   : "monitor",
+            "REQUIRE_DS_CPL"   : "ds_cpl",
+            "PREFER_DS_CPL"    : "ds_cpl",
+            "REQUIRE_VMX"      : "vmx",
+            "PREFER_VMX"       : "vmx",
+            "REQUIRE_SMX"      : "smx",
+            "PREFER_SMX"       : "smx",
+            "REQUIRE_EST"      : "est",
+            "PREFER_EST"       : "est",
+            "REQUIRE_TM2"      : "tm2",
+            "PREFER_TM2"       : "tm2",
+            "REQUIRE_SSSE3"    : "ssse3",
+            "PREFER_SSSE3"     : "ssse3",
+            "REQUIRE_CID"      : "cid",
+            "PREFER_CID"       : "cid",
+            "REQUIRE_FMA"      : "fma",
+            "PREFER_FMA"       : "fma",
+            "REQUIRE_CX16"     : "cx16",
+            "PREFER_CX16"      : "cx16",
+            "REQUIRE_XTPR"     : "xtpr",
+            "PREFER_XTPR"      : "xtpr",
+            "REQUIRE_PDCM"     : "pdcm",
+            "PREFER_PDCM"      : "pdcm",
+            "REQUIRE_PCID"     : "pcid",
+            "PREFER_PCID"      : "pcid",
+            "REQUIRE_DCA"      : "dca",
+            "PREFER_DCA"       : "dca",
+            "REQUIRE_SSE4_1"   : "sse4_1",
+            "PREFER_SSE4_1"    : "sse4_1",
+            "REQUIRE_SSE4_2"   : "sse4_2",
+            "PREFER_SSE4_2"    : "sse4_2",
+            "REQUIRE_X2APIC"   : "x2apic",
+            "PREFER_X2APIC"    : "x2apic",
+            "REQUIRE_MOVBE"    : "movbe",
+            "PREFER_MOVBE"     : "movbe",
+            "REQUIRE_POPCNT"   : "popcnt",
+            "PREFER_POPCNT"    : "popcnt",
+            "REQUIRE_TSC_DEADLINE_TIMER"   : "tsc_deadline_timer",
+            "PREFER_TSC_DEADLINE_TIMER"    : "tsc_deadline_timer",
+            "REQUIRE_XSAVE"    : "xsave",
+            "PREFER_XSAVE"     : "xsave",
+            "REQUIRE_AVX"      : "avx",
+            "PREFER_AVX"       : "avx",
+            "REQUIRE_F16C"     : "f16c",
+            "PREFER_F16C"      : "f16c",
+            "REQUIRE_RDRAND"   : "rdrand",
+            "PREFER_RDRAND"    : "rdrand",
+            "REQUIRE_FSGSBASE" : "fsgsbase",
+            "PREFER_FSGSBASE"  : "fsgsbase",
+            "REQUIRE_BMI1"     : "bmi1",
+            "PREFER_BMI1"      : "bmi1",
+            "REQUIRE_HLE"      : "hle",
+            "PREFER_HLE"       : "hle",
+            "REQUIRE_AVX2"     : "avx2",
+            "PREFER_AVX2"      : "avx2",
+            "REQUIRE_SMEP"     : "smep",
+            "PREFER_SMEP"      : "smep",
+            "REQUIRE_BMI2"     : "bmi2",
+            "PREFER_BMI2"      : "bmi2",
+            "REQUIRE_ERMS"     : "erms",
+            "PREFER_ERMS"      : "erms",
+            "REQUIRE_INVPCID"  : "invpcid",
+            "PREFER_INVPCID"   : "invpcid",
+            "REQUIRE_RTM"      : "rtm",
+            "PREFER_RTM"       : "rtm",
+            "REQUIRE_MPX"      : "mpx",
+            "PREFER_MPX"       : "mpx",
+            "REQUIRE_RDSEED"   : "rdseed",
+            "PREFER_RDSEED"    : "rdseed",
+            "REQUIRE_ADX"      : "adx",
+            "PREFER_ADX"       : "adx",
+            "REQUIRE_SMAP"     : "smap",
+            "PREFER_SMAP"      : "smap",
+        }
+
+        self._espec_to_mano_cpufeatures = {
+            "aes"      : "REQUIRE_AES",
+            "vme"      : "REQUIRE_VME",
+            "de"       : "REQUIRE_DE",
+            "pse"      : "REQUIRE_PSE",
+            "tsc"      : "REQUIRE_TSC",
+            "msr"      : "REQUIRE_MSR",
+            "pae"      : "REQUIRE_PAE",
+            "mce"      : "REQUIRE_MCE",
+            "cx8"      : "REQUIRE_CX8",
+            "apic"     : "REQUIRE_APIC",
+            "sep"      : "REQUIRE_SEP",
+            "mtrr"     : "REQUIRE_MTRR",
+            "pge"      : "REQUIRE_PGE",
+            "mca"      : "REQUIRE_MCA",
+            "cmov"     : "REQUIRE_CMOV",
+            "pat"      : "REQUIRE_PAT",
+            "pse36"    : "REQUIRE_PSE36",
+            "clflush"  : "REQUIRE_CLFLUSH",
+            "dts"      : "REQUIRE_DTS",
+            "acpi"     : "REQUIRE_ACPI",
+            "mmx"      : "REQUIRE_MMX",
+            "fxsr"     : "REQUIRE_FXSR",
+            "sse"      : "REQUIRE_SSE",
+            "sse2"     : "REQUIRE_SSE2",
+            "ss"       : "REQUIRE_SS",
+            "ht"       : "REQUIRE_HT",
+            "tm"       : "REQUIRE_TM",
+            "ia64"     : "REQUIRE_IA64",
+            "pbe"      : "REQUIRE_PBE",
+            "rdtscp"   : "REQUIRE_RDTSCP",
+            "pni"      : "REQUIRE_PNI",
+            "pclmulqdq": "REQUIRE_PCLMULQDQ",
+            "dtes64"   : "REQUIRE_DTES64",
+            "monitor"  : "REQUIRE_MONITOR",
+            "ds_cpl"   : "REQUIRE_DS_CPL",
+            "vmx"      : "REQUIRE_VMX",
+            "smx"      : "REQUIRE_SMX",
+            "est"      : "REQUIRE_EST",
+            "tm2"      : "REQUIRE_TM2",
+            "ssse3"    : "REQUIRE_SSSE3",
+            "cid"      : "REQUIRE_CID",
+            "fma"      : "REQUIRE_FMA",
+            "cx16"     : "REQUIRE_CX16",
+            "xtpr"     : "REQUIRE_XTPR",
+            "pdcm"     : "REQUIRE_PDCM",
+            "pcid"     : "REQUIRE_PCID",
+            "dca"      : "REQUIRE_DCA",
+            "sse4_1"   : "REQUIRE_SSE4_1",
+            "sse4_2"   : "REQUIRE_SSE4_2",
+            "x2apic"   : "REQUIRE_X2APIC",
+            "movbe"    : "REQUIRE_MOVBE",
+            "popcnt"   : "REQUIRE_POPCNT",
+            "tsc_deadline_timer"   : "REQUIRE_TSC_DEADLINE_TIMER",
+            "xsave"    : "REQUIRE_XSAVE",
+            "avx"      : "REQUIRE_AVX",
+            "f16c"     : "REQUIRE_F16C",
+            "rdrand"   : "REQUIRE_RDRAND",
+            "fsgsbase" : "REQUIRE_FSGSBASE",
+            "bmi1"     : "REQUIRE_BMI1",
+            "hle"      : "REQUIRE_HLE",
+            "avx2"     : "REQUIRE_AVX2",
+            "smep"     : "REQUIRE_SMEP",
+            "bmi2"     : "REQUIRE_BMI2",
+            "erms"     : "REQUIRE_ERMS",
+            "invpcid"  : "REQUIRE_INVPCID",
+            "rtm"      : "REQUIRE_RTM",
+            "mpx"      : "REQUIRE_MPX",
+            "rdseed"   : "REQUIRE_RDSEED",
+            "adx"      : "REQUIRE_ADX",
+            "smap"     : "REQUIRE_SMAP",
+        }
+
+    def mano_to_extra_spec_cpu_model(self, cpu_model):
+        if cpu_model in self._mano_to_espec_cpumodel:
+            return self._mano_to_espec_cpumodel[cpu_model]
+        else:
+            return None
+            
+    def extra_specs_to_mano_cpu_model(self, cpu_model):
+        if cpu_model in self._espec_to_mano_cpumodel:
+            return self._espec_to_mano_cpumodel[cpu_model]
+        else:
+            return None
+        
+    def mano_to_extra_spec_cpu_arch(self, cpu_arch):
+        if cpu_arch in self._mano_to_espec_cpuarch:
+            return self._mano_to_espec_cpuarch[cpu_arch]
+        else:
+            return None
+        
+    def extra_specs_to_mano_cpu_arch(self, cpu_arch):
+        if cpu_arch in self._espec_to_mano_cpuarch:
+            return self._espec_to_mano_cpuarch[cpu_arch]
+        else:
+            return None
+    
+    def mano_to_extra_spec_cpu_vendor(self, cpu_vendor):
+        if cpu_vendor in self._mano_to_espec_cpuvendor:
+            return self._mano_to_espec_cpuvendor[cpu_vendor]
+        else:
+            return None
+
+    def extra_spec_to_mano_cpu_vendor(self, cpu_vendor):
+        if cpu_vendor in self._espec_to_mano_cpuvendor:
+            return self._espec_to_mano_cpuvendor[cpu_vendor]
+        else:
+            return None
+    
+    def mano_to_extra_spec_cpu_socket_count(self, cpu_sockets):
+        return cpu_sockets
+
+    def extra_spec_to_mano_cpu_socket_count(self, cpu_sockets):
+        return int(cpu_sockets)
+    
+    def mano_to_extra_spec_cpu_core_count(self, cpu_core_count):
+        return cpu_core_count
+
+    def extra_spec_to_mano_cpu_core_count(self, cpu_core_count):
+        return int(cpu_core_count)
+    
+    def mano_to_extra_spec_cpu_core_thread_count(self, core_thread_count):
+        return core_thread_count
+
+    def extra_spec_to_mano_cpu_core_thread_count(self, core_thread_count):
+        return int(core_thread_count)
+
+    def mano_to_extra_spec_cpu_features(self, features):
+        cpu_features = []
+        epa_feature_str = None
+        for f in features:
+            if f in self._mano_to_espec_cpufeatures:
+                cpu_features.append(self._mano_to_espec_cpufeatures[f])
+                
+        if len(cpu_features) > 1:
+            epa_feature_str =  '<all-in> '+ " ".join(cpu_features)
+        elif len(cpu_features) == 1:
+            epa_feature_str = " ".join(cpu_features)
+
+        return epa_feature_str
+
+    def extra_spec_to_mano_cpu_features(self, features):
+        oper_symbols = ['=', '<in>', '<all-in>', '==', '!=', '>=', '<=', 's==', 's!=', 's<', 's<=', 's>', 's>=']
+        cpu_features = []
+        result = None
+        for oper in oper_symbols:
+            regex = '^'+oper+' (.*?)$'
+            result = re.search(regex, features)
+            if result is not None:
+                break
+            
+        if result is not None:
+            feature_list = result.group(1)
+        else:
+            feature_list = features
+
+        for f in feature_list.split():
+            if f in self._espec_to_mano_cpufeatures:
+                cpu_features.append(self._espec_to_mano_cpufeatures[f])
+
+        return cpu_features
+    
+
+class OpenstackExtraSpecUtils(object):
+    """
+    General utility class for flavor Extra Specs processing
+    """
+    def __init__(self):
+        self.host = OpenstackHostEPAUtils()
+        self.guest = OpenstackGuestEPAUtils()
+        self.extra_specs_keywords = [ 'hw:cpu_policy',
+                                      'hw:cpu_threads_policy',
+                                      'hw:mem_page_size',
+                                      'hw:numa_nodes',
+                                      'hw:numa_mempolicy',
+                                      'hw:numa_cpus',
+                                      'hw:numa_mem',
+                                      'trust:trusted_host',
+                                      'pci_passthrough:alias',
+                                      'capabilities:cpu_info:model',
+                                      'capabilities:cpu_info:arch',
+                                      'capabilities:cpu_info:vendor',
+                                      'capabilities:cpu_info:topology:sockets',
+                                      'capabilities:cpu_info:topology:cores',
+                                      'capabilities:cpu_info:topology:threads',
+                                      'capabilities:cpu_info:features',
+                                ]
+        self.extra_specs_regex = re.compile("^"+"|^".join(self.extra_specs_keywords))