Merge "Extend VM's configuration with NUMA/CPU/Memory/NIC changes"

This commit is contained in:
Zuul 2020-03-03 18:22:43 +00:00 committed by Gerrit Code Review
commit a6f98d969e
3 changed files with 80 additions and 6 deletions

View File

@ -174,10 +174,14 @@ via Airship. Each key is the name of a VM and value is a JSON object:
{ {
"memory": integer, "memory": integer,
"vcpus": integer, "vcpus": integer,
"sockets": integer,
"threads": integer,
"disk_layout": "simple", "disk_layout": "simple",
"cpu_mode": "host-passthrough",
"networking": { "networking": {
"ens3": { "ens3": {
"mac": "52:54:00:00:be:31", "mac": "52:54:00:00:be:31",
"model": "e1000",
"pci": { "pci": {
"slot": 3, "slot": 3,
"port": 0 "port": 0
@ -193,18 +197,33 @@ via Airship. Each key is the name of a VM and value is a JSON object:
} }
}, },
"bootstrap": true, "bootstrap": true,
"cpu_cells": {
"cell0": {
"cpus": "0-11",
"memory": "25165824"
},
"cell1": {
"cpus": "12-23",
"memory": "25165824"
}
},
"userdata": "packages: [docker.io]" "userdata": "packages: [docker.io]"
} }
* memory - VM RAM in megabytes * memory - VM RAM in megabytes
* vcpus - Number of VM CPUs * vcpus - Number of VM CPUs
* sockets - Number of sockets. (Optional)
* threads - Number of threads. (Optional)
* disk_layout - A disk profile for the VM matching one defined under ``.disk_layouts`` * disk_layout - A disk profile for the VM matching one defined under ``.disk_layouts``
* bootstrap - True/False for whether the framework should bootstrap the VM's OS * bootstrap - True/False for whether the framework should bootstrap the VM's OS
* cpu_cells - Parameter to setup NUMA nodes and allocate RAM memory. (Optional)
* cpu_mode - CPU mode for the VM. (if not specified, default: host)
* userdata - Cloud-init userdata to feed the VM when bootstrapped for further customization * userdata - Cloud-init userdata to feed the VM when bootstrapped for further customization
* networking - Network attachment and addressing configuration. Every key but ``addresses`` * networking - Network attachment and addressing configuration. Every key but ``addresses``
is assumed to be a desired NIC on the VM. For each NIC stanza, the following fields are respected: is assumed to be a desired NIC on the VM. For each NIC stanza, the following fields are respected:
* mac - A MAC address for the NIC * mac - A MAC address for the NIC
* model - A model for the NIC (if not specified, default: virtio)
* pci - A JSON object specifying ``slot`` and ``port`` specifying the PCI address for the NIC * pci - A JSON object specifying ``slot`` and ``port`` specifying the PCI address for the NIC
* attachment - What network from ``.networking`` is attached to this NIC * attachment - What network from ``.networking`` is attached to this NIC

View File

@ -43,7 +43,15 @@ export AIRSHIP_KEYSTONE_URL=${AIRSHIP_KEYSTONE_URL:-'http://keystone.gate.local:
config_vm_memory() { config_vm_memory() {
nodename=${1} nodename=${1}
jq -cr ".vm.${nodename}.memory" < "${GATE_MANIFEST}" mem=$(jq -cr ".vm.${nodename}.memory" < "${GATE_MANIFEST}")
mem_backing=$(jq -cr ".vm.${nodename}.memorybacking" < "${GATE_MANIFEST}")
if [[ "${mem_backing}" != "null" ]]
then
echo "memory=${mem},${mem_backing}=yes"
else
echo "${mem}"
fi
} }
config_vm_names() { config_vm_names() {
@ -55,6 +63,19 @@ config_vm_iface_list() {
jq -cr ".vm.${nodename}.networking | del(.addresses) | keys | .[]" < "${GATE_MANIFEST}" jq -cr ".vm.${nodename}.networking | del(.addresses) | keys | .[]" < "${GATE_MANIFEST}"
} }
config_vm_iface_model() {
nodename="$1"
interface="$2"
iface_model=$(jq -cr ".vm.${nodename}.networking.${interface}.model" < "${GATE_MANIFEST}")
if [[ "${iface_model}" != "null" ]]
then
echo "${iface_model}"
else
echo "virtio"
fi
}
config_vm_iface_mac() { config_vm_iface_mac() {
nodename="$1" nodename="$1"
interface="$2" interface="$2"
@ -112,9 +133,42 @@ config_vm_net_ip() {
jq -cr "$query" < "${GATE_MANIFEST}" jq -cr "$query" < "${GATE_MANIFEST}"
} }
config_vm_cpu() {
nodename=${1}
cpu_mode=$(jq -cr ".vm.${nodename}.cpu_mode" < "${GATE_MANIFEST}")
cpu_cells=$(jq -cr ".vm.${nodename}.cpu_cells" < "${GATE_MANIFEST}")
if [[ "${cpu_mode}" != "null" ]]
then
config_string="mode=${cpu_mode}"
if [[ "${cpu_cells}" != "null" ]]
then
cpu_cells_to_s=$(echo "${cpu_cells}" | jq -cr "[to_entries[] | [.key + \".cpus=\" + .value.cpus, .key + \".memory=\" + .value.memory]] | add | join (\",\")")
config_string="${config_string},${cpu_cells_to_s}"
fi
else
config_string=${VIRSH_CPU_OPTS}
fi
echo -n "$config_string"
}
config_vm_vcpus() { config_vm_vcpus() {
nodename=${1} nodename=${1}
jq -cr ".vm.${nodename}.vcpus" < "${GATE_MANIFEST}" vcpus=$(jq -cr ".vm.${nodename}.vcpus" < "${GATE_MANIFEST}")
sockets=$(jq -cr ".vm.${nodename}.sockets" < "${GATE_MANIFEST}")
threads=$(jq -cr ".vm.${nodename}.threads" < "${GATE_MANIFEST}")
if [[ "${sockets}" != "null" ]]
then
config_string="vcpus=${vcpus},sockets=${sockets}"
if [[ "${threads}" != "null" ]]
then
config_string="${config_string},threads=${threads}"
fi
echo -n "$config_string"
else
echo "${vcpus}"
fi
} }
config_vm_bootstrap() { config_vm_bootstrap() {

View File

@ -378,12 +378,13 @@ vm_render_interface() {
namekey="$(get_namekey)" namekey="$(get_namekey)"
mac="$(config_vm_iface_mac "$vm" "$iface")" mac="$(config_vm_iface_mac "$vm" "$iface")"
model="$(config_vm_iface_model "$vm" "$iface")"
network="$(config_vm_iface_network "$vm" "$iface")" network="$(config_vm_iface_network "$vm" "$iface")"
network="${namekey}_${network}" network="${namekey}_${network}"
slot="$(config_vm_iface_slot "$vm" "$iface")" slot="$(config_vm_iface_slot "$vm" "$iface")"
port="$(config_vm_iface_port "$vm" "$iface")" port="$(config_vm_iface_port "$vm" "$iface")"
config_string="model=virtio,network=${network}" config_string="model=${model},network=${network}"
if [[ ! -z "$mac" ]] if [[ ! -z "$mac" ]]
then then
@ -498,7 +499,7 @@ vm_create() {
--name "${NAME}" \ --name "${NAME}" \
--os-variant ubuntu16.04 \ --os-variant ubuntu16.04 \
--virt-type kvm \ --virt-type kvm \
--cpu "${VIRSH_CPU_OPTS}" \ --cpu "$(config_vm_cpu "${NAME}")" \
--serial "file,path=${TEMP_DIR}/console/${NAME}.log" \ --serial "file,path=${TEMP_DIR}/console/${NAME}.log" \
--graphics vnc,listen=0.0.0.0 \ --graphics vnc,listen=0.0.0.0 \
--noautoconsole \ --noautoconsole \
@ -520,7 +521,7 @@ vm_create() {
--name "${NAME}" \ --name "${NAME}" \
--os-variant ubuntu16.04 \ --os-variant ubuntu16.04 \
--virt-type kvm \ --virt-type kvm \
--cpu "${VIRSH_CPU_OPTS}" \ --cpu "$(config_vm_cpu "${NAME}")" \
--graphics vnc,listen=0.0.0.0 \ --graphics vnc,listen=0.0.0.0 \
--serial file,path="${TEMP_DIR}/console/${NAME}.log" \ --serial file,path="${TEMP_DIR}/console/${NAME}.log" \
--noautoconsole \ --noautoconsole \