Convert remaining hypervisors to plugin model
Convert BareMetal, OpenVZ, PowerVM hnd libvirt ypervisor configurations
in Nova to the new plugin setup.
Change-Id: I47d744a2c9fdda0771f5b473ec3b26fb099f7439
diff --git a/lib/nova b/lib/nova
index 4c55207..8deb3a0 100644
--- a/lib/nova
+++ b/lib/nova
@@ -71,23 +71,24 @@
NOVNC_DIR=$DEST/noVNC
SPICE_DIR=$DEST/spice-html5
+# Set default defaults here as some hypervisor drivers override these
+PUBLIC_INTERFACE_DEFAULT=br100
+GUEST_INTERFACE_DEFAULT=eth0
+FLAT_NETWORK_BRIDGE_DEFAULT=br100
+
+# Get hypervisor configuration
+# ----------------------------
+
+NOVA_PLUGINS=$TOP_DIR/lib/nova_plugins
+if is_service_enabled nova && [[ -r $NOVA_PLUGINS/hypervisor-$VIRT_DRIVER ]]; then
+ # Load plugin
+ source $NOVA_PLUGINS/hypervisor-$VIRT_DRIVER
+fi
+
# Nova Network Configuration
# --------------------------
-# Set defaults according to the virt driver
-if [ "$VIRT_DRIVER" = 'baremetal' ]; then
- NETWORK_MANAGER=${NETWORK_MANAGER:-FlatManager}
- PUBLIC_INTERFACE_DEFAULT=eth0
- FLAT_INTERFACE=${FLAT_INTERFACE:-eth0}
- FLAT_NETWORK_BRIDGE_DEFAULT=br100
- STUB_NETWORK=${STUB_NETWORK:-False}
-else
- PUBLIC_INTERFACE_DEFAULT=br100
- GUEST_INTERFACE_DEFAULT=eth0
- FLAT_NETWORK_BRIDGE_DEFAULT=br100
-fi
-
NETWORK_MANAGER=${NETWORK_MANAGER:-${NET_MAN:-FlatDHCPManager}}
PUBLIC_INTERFACE=${PUBLIC_INTERFACE:-$PUBLIC_INTERFACE_DEFAULT}
VLAN_INTERFACE=${VLAN_INTERFACE:-$GUEST_INTERFACE_DEFAULT}
@@ -274,83 +275,6 @@
fi
fi
- # Prepare directories and packages for baremetal driver
- if is_baremetal; then
- configure_baremetal_nova_dirs
- fi
-
- if [[ "$VIRT_DRIVER" = 'libvirt' ]]; then
- if is_service_enabled neutron && is_neutron_ovs_base_plugin && ! sudo grep -q '^cgroup_device_acl' $QEMU_CONF; then
- # Add /dev/net/tun to cgroup_device_acls, needed for type=ethernet interfaces
- cat <<EOF | sudo tee -a $QEMU_CONF
-cgroup_device_acl = [
- "/dev/null", "/dev/full", "/dev/zero",
- "/dev/random", "/dev/urandom",
- "/dev/ptmx", "/dev/kvm", "/dev/kqemu",
- "/dev/rtc", "/dev/hpet","/dev/net/tun",
-]
-EOF
- fi
-
- if is_ubuntu; then
- LIBVIRT_DAEMON=libvirt-bin
- else
- LIBVIRT_DAEMON=libvirtd
- fi
-
- if is_fedora || is_suse; then
- if is_fedora && [[ $DISTRO =~ (rhel6) || "$os_RELEASE" -le "17" ]]; then
- sudo bash -c "cat <<EOF >/etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
-[libvirt Management Access]
-Identity=unix-group:$LIBVIRT_GROUP
-Action=org.libvirt.unix.manage
-ResultAny=yes
-ResultInactive=yes
-ResultActive=yes
-EOF"
- elif is_suse && [[ $os_RELEASE = 12.2 || "$os_VENDOR" = "SUSE LINUX" ]]; then
- # openSUSE < 12.3 or SLE
- # Work around the fact that polkit-default-privs overrules pklas
- # with 'unix-group:$group'.
- sudo bash -c "cat <<EOF >/etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
-[libvirt Management Access]
-Identity=unix-user:$USER
-Action=org.libvirt.unix.manage
-ResultAny=yes
-ResultInactive=yes
-ResultActive=yes
-EOF"
- else
- # Starting with fedora 18 and opensuse-12.3 enable stack-user to
- # virsh -c qemu:///system by creating a policy-kit rule for
- # stack-user using the new Javascript syntax
- rules_dir=/etc/polkit-1/rules.d
- sudo mkdir -p $rules_dir
- sudo bash -c "cat <<EOF > $rules_dir/50-libvirt-$STACK_USER.rules
-polkit.addRule(function(action, subject) {
- if (action.id == 'org.libvirt.unix.manage' &&
- subject.user == '"$STACK_USER"') {
- return polkit.Result.YES;
- }
-});
-EOF"
- unset rules_dir
- fi
- fi
-
- # The user that nova runs as needs to be member of **libvirtd** group otherwise
- # nova-compute will be unable to use libvirt.
- if ! getent group $LIBVIRT_GROUP >/dev/null; then
- sudo groupadd $LIBVIRT_GROUP
- fi
- add_user_to_group $STACK_USER $LIBVIRT_GROUP
-
- # libvirt detects various settings on startup, as we potentially changed
- # the system configuration (modules, filesystems), we need to restart
- # libvirt to detect those changes.
- restart_service $LIBVIRT_DAEMON
- fi
-
# Instance Storage
# ----------------
@@ -368,6 +292,14 @@
fi
fi
fi
+
+ # Rebuild the config file from scratch
+ create_nova_conf
+
+ if [[ -r $NOVA_PLUGINS/hypervisor-$VIRT_DRIVER ]]; then
+ # Configure hypervisor plugin
+ configure_nova_hypervisor
+ fi
}
# create_nova_accounts() - Set up common required nova accounts
@@ -447,14 +379,6 @@
iniset $NOVA_CONF DEFAULT ec2_workers "4"
iniset $NOVA_CONF DEFAULT metadata_workers "4"
iniset $NOVA_CONF DEFAULT sql_connection `database_connection_url nova`
- if is_baremetal; then
- iniset $NOVA_CONF baremetal sql_connection `database_connection_url nova_bm`
- fi
- if [[ "$VIRT_DRIVER" = 'libvirt' ]]; then
- iniset $NOVA_CONF DEFAULT libvirt_type "$LIBVIRT_TYPE"
- iniset $NOVA_CONF DEFAULT libvirt_cpu_mode "none"
- iniset $NOVA_CONF DEFAULT use_usb_tablet "False"
- fi
iniset $NOVA_CONF DEFAULT instance_name_template "${INSTANCE_NAME_PREFIX}%08x"
iniset $NOVA_CONF osapi_v3 enabled "True"
@@ -646,37 +570,8 @@
# install_nova() - Collect source and prepare
function install_nova() {
- if is_service_enabled n-cpu; then
- if [[ -r $NOVA_PLUGINS/hypervisor-$VIRT_DRIVER ]]; then
- install_nova_hypervisor
- elif [[ "$VIRT_DRIVER" = 'libvirt' ]]; then
- if is_ubuntu; then
- install_package kvm
- install_package libvirt-bin
- install_package python-libvirt
- elif is_fedora || is_suse; then
- install_package kvm
- install_package libvirt
- install_package libvirt-python
- else
- exit_distro_not_supported "libvirt installation"
- fi
-
- # Install and configure **LXC** if specified. LXC is another approach to
- # splitting a system into many smaller parts. LXC uses cgroups and chroot
- # to simulate multiple systems.
- if [[ "$LIBVIRT_TYPE" == "lxc" ]]; then
- if is_ubuntu; then
- if [[ "$DISTRO" > natty ]]; then
- install_package cgroup-lite
- fi
- else
- ### FIXME(dtroyer): figure this out
- echo "RPM-based cgroup not implemented yet"
- yum_install libcgroup-tools
- fi
- fi
- fi
+ if is_service_enabled n-cpu && [[ -r $NOVA_PLUGINS/hypervisor-$VIRT_DRIVER ]]; then
+ install_nova_hypervisor
fi
git_clone $NOVA_REPO $NOVA_DIR $NOVA_BRANCH