devstack/tools/cpu_map_update.py
Clark Boylan ba6fb27bc8 Remove vme and ssse3 from gate64 cpu mapping
It turns out that we need to be even more restrictive on the cpu flags
we expose as some clouds don't expose vme or ssse3.

Fixes-Bug: 1535799
Change-Id: I6c8c1101771d1c5496884be7a405285472ae803a
2016-01-19 08:25:12 -08:00

89 lines
3.5 KiB
Python
Executable File

#!/usr/bin/env python
#
# 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.
# This small script updates the libvirt CPU map to add a gate64 cpu model
# that can be used to enable a common 64bit capable feature set across
# devstack nodes so that features like nova live migration work.
import sys
import xml.etree.ElementTree as ET
from xml.dom import minidom
def update_cpu_map(tree):
root = tree.getroot()
cpus = root#.find("cpus")
x86 = None
for arch in cpus.findall("arch"):
if arch.get("name") == "x86":
x86 = arch
break
if x86 is not None:
# Create a gate64 cpu model that is core2duo less monitor, pse36,
# vme, and ssse3.
gate64 = ET.SubElement(x86, "model")
gate64.set("name", "gate64")
ET.SubElement(gate64, "vendor").set("name", "Intel")
ET.SubElement(gate64, "feature").set("name", "fpu")
ET.SubElement(gate64, "feature").set("name", "de")
ET.SubElement(gate64, "feature").set("name", "pse")
ET.SubElement(gate64, "feature").set("name", "tsc")
ET.SubElement(gate64, "feature").set("name", "msr")
ET.SubElement(gate64, "feature").set("name", "pae")
ET.SubElement(gate64, "feature").set("name", "mce")
ET.SubElement(gate64, "feature").set("name", "cx8")
ET.SubElement(gate64, "feature").set("name", "apic")
ET.SubElement(gate64, "feature").set("name", "sep")
ET.SubElement(gate64, "feature").set("name", "pge")
ET.SubElement(gate64, "feature").set("name", "cmov")
ET.SubElement(gate64, "feature").set("name", "pat")
ET.SubElement(gate64, "feature").set("name", "mmx")
ET.SubElement(gate64, "feature").set("name", "fxsr")
ET.SubElement(gate64, "feature").set("name", "sse")
ET.SubElement(gate64, "feature").set("name", "sse2")
ET.SubElement(gate64, "feature").set("name", "mtrr")
ET.SubElement(gate64, "feature").set("name", "mca")
ET.SubElement(gate64, "feature").set("name", "clflush")
ET.SubElement(gate64, "feature").set("name", "pni")
ET.SubElement(gate64, "feature").set("name", "nx")
ET.SubElement(gate64, "feature").set("name", "syscall")
ET.SubElement(gate64, "feature").set("name", "lm")
def format_xml(root):
# Adapted from http://pymotw.com/2/xml/etree/ElementTree/create.html
# thank you dhellmann
rough_string = ET.tostring(root, encoding="UTF-8")
dom_parsed = minidom.parseString(rough_string)
return dom_parsed.toprettyxml(" ", encoding="UTF-8")
def main():
if len(sys.argv) != 2:
raise Exception("Must pass path to cpu_map.xml to update")
cpu_map = sys.argv[1]
tree = ET.parse(cpu_map)
for model in tree.getroot().iter("model"):
if model.get("name") == "gate64":
# gate64 model is already present
return
update_cpu_map(tree)
pretty_xml = format_xml(tree.getroot())
with open(cpu_map, 'w') as f:
f.write(pretty_xml)
if __name__ == "__main__":
main()