summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rwxr-xr-xlib/configure-deps-functions.sh53
-rwxr-xr-xlib/configure-vm32
-rw-r--r--lib/installer/domain.xml6
-rw-r--r--lib/python/apex/inventory.py3
-rwxr-xr-xlib/undercloud-functions.sh41
-rwxr-xr-xlib/virtual-setup-functions.sh10
6 files changed, 112 insertions, 33 deletions
diff --git a/lib/configure-deps-functions.sh b/lib/configure-deps-functions.sh
index 32900015..3d0e3ac7 100755
--- a/lib/configure-deps-functions.sh
+++ b/lib/configure-deps-functions.sh
@@ -129,36 +129,39 @@ EOF
virsh pool-list --all | grep default > /dev/null || virsh pool-define-as --name default dir --target /var/lib/libvirt/images
virsh pool-list | grep -Eo "default\s+active" > /dev/null || (virsh pool-autostart default; virsh pool-start default)
- if ! egrep '^flags.*(vmx|svm)' /proc/cpuinfo > /dev/null; then
- echo "${red}virtualization extensions not found, kvm kernel module insertion may fail.\n \
+ # Virt flag check is Arch dependent on x86
+ if "$(uname -i)" == 'x86_64'; then
+ if ! egrep '^flags.*(vmx|svm)' /proc/cpuinfo > /dev/null; then
+ echo "${red}virtualization extensions not found, kvm kernel module insertion may fail.\n \
Are you sure you have enabled vmx in your bios or hypervisor?${reset}"
- fi
+ fi
- if ! lsmod | grep kvm > /dev/null; then modprobe kvm; fi
- if ! lsmod | grep kvm_intel > /dev/null; then modprobe kvm_intel; fi
+ if ! lsmod | grep kvm > /dev/null; then modprobe kvm; fi
+ if ! lsmod | grep kvm_intel > /dev/null; then modprobe kvm_intel; fi
- if ! lsmod | grep kvm > /dev/null; then
- echo "${red}kvm kernel modules not loaded!${reset}"
- return 1
- fi
+ if ! lsmod | grep kvm > /dev/null; then
+ echo "${red}kvm kernel modules not loaded!${reset}"
+ return 1
+ fi
- # try to enabled nested kvm
- if [ "$virtual" == "TRUE" ]; then
- nested_kvm=`cat /sys/module/kvm_intel/parameters/nested`
- if [ "$nested_kvm" != "Y" ]; then
- # try to enable nested kvm
- echo 'options kvm-intel nested=1' > /etc/modprobe.d/kvm_intel.conf
- if rmmod kvm_intel; then
- modprobe kvm_intel
+ # try to enabled nested kvm
+ if [ "$virtual" == "TRUE" ]; then
+ nested_kvm=`cat /sys/module/kvm_intel/parameters/nested`
+ if [ "$nested_kvm" != "Y" ]; then
+ # try to enable nested kvm
+ echo 'options kvm-intel nested=1' > /etc/modprobe.d/kvm_intel.conf
+ if rmmod kvm_intel; then
+ modprobe kvm_intel
+ fi
+ nested_kvm=`cat /sys/module/kvm_intel/parameters/nested`
+ fi
+ if [ "$nested_kvm" != "Y" ]; then
+ echo "${red}Cannot enable nested kvm, falling back to qemu for deployment${reset}"
+ DEPLOY_OPTIONS+=" --libvirt-type qemu"
+ else
+ echo "${blue}Nested kvm enabled, deploying with kvm acceleration${reset}"
+ fi
fi
- nested_kvm=`cat /sys/module/kvm_intel/parameters/nested`
- fi
- if [ "$nested_kvm" != "Y" ]; then
- echo "${red}Cannot enable nested kvm, falling back to qemu for deployment${reset}"
- DEPLOY_OPTIONS+=" --libvirt-type qemu"
- else
- echo "${blue}Nested kvm enabled, deploying with kvm acceleration${reset}"
- fi
fi
##sshkeygen for root
diff --git a/lib/configure-vm b/lib/configure-vm
index 340a7ab6..5cb45218 100755
--- a/lib/configure-vm
+++ b/lib/configure-vm
@@ -100,6 +100,7 @@ def main():
'enable_serial_console': '',
'direct_boot': '',
'kernel_args': '',
+ 'user_interface': '',
}
if args.image is not None:
params['imagefile'] = args.image
@@ -162,6 +163,37 @@ def main():
<cmdline>%s</cmdline>
""" % ' '.join(args.kernel_args)
+ if args.arch == 'aarch64':
+
+ params['direct_boot'] += """
+ <loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>
+ <nvram>/var/lib/libvirt/qemu/nvram/centos7.0_VARS.fd</nvram>
+ """
+ params['user_interface'] = """
+ <controller type='virtio-serial' index='0'>
+ <address type='virtio-mmio'/>
+ </controller>
+ <serial type='pty'>
+ <target port='0'/>
+ </serial>
+ <console type='pty'>
+ <target type='serial' port='0'/>
+ </console>
+ <channel type='unix'>
+ <target type='virtio' name='org.qemu.guest_agent.0'/>
+ <address type='virtio-serial' controller='0' bus='0' port='1'/>
+ </channel>
+ """
+ else:
+ params['user_interface'] = """
+ <input type='mouse' bus='ps2'/>
+ <graphics type='vnc' port='-1' autoport='yes'/>
+ <video>
+ <model type='cirrus' vram='9216' heads='1'/>
+ </video>
+ """
+
+
libvirt_template = source_template % params
conn=libvirt.open(args.uri)
a = conn.defineXML(libvirt_template)
diff --git a/lib/installer/domain.xml b/lib/installer/domain.xml
index ead0de69..57a67d87 100644
--- a/lib/installer/domain.xml
+++ b/lib/installer/domain.xml
@@ -29,10 +29,6 @@
%(network)s
%(bm_network)s
%(enable_serial_console)s
- <input type='mouse' bus='ps2'/>
- <graphics type='vnc' port='-1' autoport='yes'/>
- <video>
- <model type='cirrus' vram='9216' heads='1'/>
- </video>
+ %(user_interface)s
</devices>
</domain>
diff --git a/lib/python/apex/inventory.py b/lib/python/apex/inventory.py
index 2e08d3b9..64f47b49 100644
--- a/lib/python/apex/inventory.py
+++ b/lib/python/apex/inventory.py
@@ -9,6 +9,7 @@
import yaml
import json
+import platform
from .common import constants
from .common import utils
@@ -67,7 +68,7 @@ class Inventory(dict):
'for non-HA baremetal deployment')
if virtual:
- self['arch'] = 'x86_64'
+ self['arch'] = platform.machine()
self['host-ip'] = '192.168.122.1'
self['power_manager'] = \
'nova.virt.baremetal.virtual_power_driver.VirtualPowerManager'
diff --git a/lib/undercloud-functions.sh b/lib/undercloud-functions.sh
index 3bd0341a..44bd3903 100755
--- a/lib/undercloud-functions.sh
+++ b/lib/undercloud-functions.sh
@@ -173,6 +173,7 @@ EOI
echo "Running undercloud installation and configuration."
echo "Logging undercloud installation to stack@undercloud:/home/stack/apex-undercloud-install.log"
ssh -T ${SSH_OPTIONS[@]} "stack@$UNDERCLOUD" << EOI
+set -e
openstack-config --set undercloud.conf DEFAULT local_ip ${admin_installer_vm_ip}/${admin_cidr##*/}
openstack-config --set undercloud.conf DEFAULT network_gateway ${admin_installer_vm_ip}
openstack-config --set undercloud.conf DEFAULT network_cidr ${admin_cidr}
@@ -194,6 +195,22 @@ sudo sed -i '/CephClusterFSID:/c\\ CephClusterFSID: \\x27$(cat /proc/sys/kernel
sudo sed -i '/CephMonKey:/c\\ CephMonKey: \\x27'"\$(ceph-authtool --gen-print-key)"'\\x27' /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml
sudo sed -i '/CephAdminKey:/c\\ CephAdminKey: \\x27'"\$(ceph-authtool --gen-print-key)"'\\x27' /usr/share/openstack-tripleo-heat-templates/environments/storage-environment.yaml
+if [ "\$(uname -i)" == 'aarch64' ]; then
+
+# These two fixes are done in the base OOO image build right now
+# keeping them here to know that they are done and in case we need
+# to take care of them in the future.
+# # remove syslinux references for aarch64
+# sudo sh -xc 'cd /etc/puppet/modules/ironic/manifests && patch -p0 < puppet-ironic-manifests-pxe-pp-aarch64.patch'
+# sudo sed -i '/syslinux-extlinux/d' /usr/share/instack-undercloud/puppet-stack-config/puppet-stack-config.pp
+#
+# # disable use_linkat in swift
+# sudo sed -i 's/o_tmpfile_supported()/False/' /usr/lib/python2.7/site-packages/swift/obj/diskfile.py
+
+ openstack-config --set undercloud.conf DEFAULT ipxe_enabled false
+ sudo sed -i '/ _link_ip_address_pxe_configs/a\\ _link_mac_pxe_configs(task)' /usr/lib/python2.7/site-packages/ironic/common/pxe_utils.py
+fi
+
openstack undercloud install &> apex-undercloud-install.log || {
# cat the undercloud install log incase it fails
echo "ERROR: openstack undercloud install has failed. Dumping Log:"
@@ -201,6 +218,30 @@ openstack undercloud install &> apex-undercloud-install.log || {
exit 1
}
+if [ "\$(uname -i)" == 'aarch64' ]; then
+sudo yum -y reinstall grub2-efi shim
+sudo cp /boot/efi/EFI/centos/grubaa64.efi /tftpboot/grubaa64.efi
+sudo mkdir -p /tftpboot/EFI/centos
+sudo tee /tftpboot/EFI/centos/grub.cfg > /dev/null << EOF
+set default=master
+set timeout=5
+set hidden_timeout_quiet=false
+
+menuentry "master" {
+configfile /tftpboot/\\\$net_default_ip.conf
+}
+EOF
+sudo chmod 644 /tftpboot/EFI/centos/grub.cfg
+sudo openstack-config --set /etc/ironic/ironic.conf pxe uefi_pxe_config_template \\\$pybasedir/drivers/modules/pxe_grub_config.template
+sudo openstack-config --set /etc/ironic/ironic.conf pxe uefi_pxe_bootfile_name grubaa64.efi
+sudo service openstack-ironic-conductor restart
+sudo sed -i 's/linuxefi/linux/g' /usr/lib/python2.7/site-packages/ironic/drivers/modules/pxe_grub_config.template
+sudo sed -i 's/initrdefi/initrd/g' /usr/lib/python2.7/site-packages/ironic/drivers/modules/pxe_grub_config.template
+echo '' | sudo tee --append /tftpboot/map-file > /dev/null
+echo 'r ^/EFI/centos/grub.cfg-(.*) /tftpboot/pxelinux.cfg/\\1' | sudo tee --append /tftpboot/map-file > /dev/null
+sudo service xinetd restart
+fi
+
# Set nova domain name
sudo openstack-config --set /etc/nova/nova.conf DEFAULT dns_domain ${domain_name}
sudo openstack-config --set /etc/nova/nova.conf DEFAULT dhcp_domain ${domain_name}
diff --git a/lib/virtual-setup-functions.sh b/lib/virtual-setup-functions.sh
index ac7b507b..8e15ef5d 100755
--- a/lib/virtual-setup-functions.sh
+++ b/lib/virtual-setup-functions.sh
@@ -81,7 +81,7 @@ EOF
cpu: $vcpus
memory: $ramsize
disk: 41
- arch: "x86_64"
+ arch: "$(uname -i)"
capabilities: "$capability"
EOF
vbmc add baremetal$i --port 623$i
@@ -139,11 +139,17 @@ function define_vm () {
kernel_args='--kernel-arg console=ttyS0 --kernel-arg root=/dev/sda'
fi
+ if [ "$(uname -i)" == 'aarch64' ]; then
+ diskbus='scsi'
+ else
+ diskbus='sata'
+ fi
+
# create the VM
$LIB/configure-vm --name $1 \
--bootdev $2 \
--image "$volume_path" \
- --diskbus sata \
+ --diskbus $diskbus \
--arch $(uname -i) \
--cpus $vcpus \
--memory $ramsize \
VM-based method has to do. Only a very simple 'is the list empty' op is done. - no VM changes are needed - 'struct address_space' is left alone. - no registration of individual locks is needed: robust mutexes dont need any extra per-lock syscalls. Robust mutexes thus become a very lightweight primitive - so they dont force the application designer to do a hard choice between performance and robustness - robust mutexes are just as fast. - no per-lock kernel allocation happens. - no resource limits are needed. - no kernel-space recovery call (FUTEX_RECOVER) is needed. - the implementation and the locking is "obvious", and there are no interactions with the VM. Performance ----------- I have benchmarked the time needed for the kernel to process a list of 1 million (!) held locks, using the new method [on a 2GHz CPU]: - with FUTEX_WAIT set [contended mutex]: 130 msecs - without FUTEX_WAIT set [uncontended mutex]: 30 msecs I have also measured an approach where glibc does the lock notification [which it currently does for !pshared robust mutexes], and that took 256 msecs - clearly slower, due to the 1 million FUTEX_WAKE syscalls userspace had to do. (1 million held locks are unheard of - we expect at most a handful of locks to be held at a time. Nevertheless it's nice to know that this approach scales nicely.) Implementation details ---------------------- The patch adds two new syscalls: one to register the userspace list, and one to query the registered list pointer: asmlinkage long sys_set_robust_list(struct robust_list_head __user *head, size_t len); asmlinkage long sys_get_robust_list(int pid, struct robust_list_head __user **head_ptr, size_t __user *len_ptr); List registration is very fast: the pointer is simply stored in current->robust_list. [Note that in the future, if robust futexes become widespread, we could extend sys_clone() to register a robust-list head for new threads, without the need of another syscall.] So there is virtually zero overhead for tasks not using robust futexes, and even for robust futex users, there is only one extra syscall per thread lifetime, and the cleanup operation, if it happens, is fast and straightforward. The kernel doesn't have any internal distinction between robust and normal futexes. If a futex is found to be held at exit time, the kernel sets the following bit of the futex word: #define FUTEX_OWNER_DIED 0x40000000 and wakes up the next futex waiter (if any). User-space does the rest of the cleanup. Otherwise, robust futexes are acquired by glibc by putting the TID into the futex field atomically. Waiters set the FUTEX_WAITERS bit: #define FUTEX_WAITERS 0x80000000 and the remaining bits are for the TID. Testing, architecture support ----------------------------- i've tested the new syscalls on x86 and x86_64, and have made sure the parsing of the userspace list is robust [ ;-) ] even if the list is deliberately corrupted. i386 and x86_64 syscalls are wired up at the moment, and Ulrich has tested the new glibc code (on x86_64 and i386), and it works for his robust-mutex testcases. All other architectures should build just fine too - but they won't have the new syscalls yet. Architectures need to implement the new futex_atomic_cmpxchg_inatomic() inline function before writing up the syscalls (that function returns -ENOSYS right now).