diff --git a/devstack/README.rst b/devstack/README.rst new file mode 100644 index 0000000..3076fd7 --- /dev/null +++ b/devstack/README.rst @@ -0,0 +1,63 @@ +======================== +Installing with DevStack +======================== + +What is DevStack? +-------------------------- + +DevStack is a script to quickly create an OpenStack development environment. + +Find out more `here `_. + + +What are DevStack plugins? +-------------------------- + +DevStack plugins act as project-specific extensions of DevStack. They allow external projects to +execute code directly in the DevStack run, supporting configuration and installation changes as +part of the normal local.conf and stack.sh execution. The devstack plugin setup in this project +is for nova-dpm. Without any additional scripting required the nova-dpm plugin would be plugged +to devstack environment. + +More details can be `found here. `_ + + +How to use the nova-dpm DevStack plugins: +----------------------------------------- + +1. Download DevStack:: + + $ git clone https://git.openstack.org/openstack-dev/devstack /opt/stack/devstack + +2. Set up your local.conf file to pull in our projects: + 1. If you have an existing DevStack local.conf, modify it to pull in this project by adding:: + + [[local|localrc]] + enable_plugin nova-dpm http://git.openstack.org/openstack/nova-dpm + 2. nova-dpm driver requires zhmcclient to be installed and hence add the following line to + install zhmcclient. + + INSTALL_ZHMCCLIENT=TRUE + +3. A few notes: + + * By default this will pull in the latest/trunk versions of all the projects. If you want to + run a stable version instead, you can either check out that stable branch in the DevStack + repo (git checkout stable/liberty) which is the preferred method, or you can do it on a + project by project basis in the local.conf file as needed. + + * If you need any special services enabled for your environment, you can also specify those + in your local.conf file. In our example files we demonstrate enabling and disabling services + (n-cpu, q-agt, etc) required for our drivers. + +6. Run ``stack.sh`` from DevStack:: + + $ cd /opt/stack/devstack + $ FORCE=yes ./stack.sh + + ``FORCE=yes`` is needed on Ubuntu 15.10 since only Ubuntu LTS releases are officially supported + by DevStack. If you're running a control only node on a different, supported OS version you can + skip using ``FORCE=yes``. + +7. At this point DevStack will run through stack.sh, and barring any DevStack issues, you should + end up with a standard link to your Horizon portal at the end of the stack run. Congratulations! diff --git a/devstack/dpm-functions.sh b/devstack/dpm-functions.sh new file mode 100644 index 0000000..e70df09 --- /dev/null +++ b/devstack/dpm-functions.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# devstack/dpm-functions.sh +# Functions to control the installation and configuration of the DPM compute services + +GITREPO["zhmcclient"]=${ZHMCCLIENT_REPO:-https://github.com/zhmcclient/python-zhmcclient} +GITBRANCH["zhmcclient"]=${ZHMCCLIENT_BRANCH:-master} +GITDIR["zhmcclient"]=$DEST/zhmcclient + +function install_zhmcclient { + # Install the latest zhmcclient from git + echo_summary "Installing zhmcclient" + git_clone_by_name "zhmcclient" + setup_dev_lib "zhmcclient" + echo_summary "zhmcclient install complete" +} + +function cleanup_zhmcclient { + echo_summary "Cleaning zhmcclient" + rm -rf ${GITDIR["zhmcclient"]} +} diff --git a/devstack/local.conf.compute b/devstack/local.conf.compute new file mode 100644 index 0000000..3dd8552 --- /dev/null +++ b/devstack/local.conf.compute @@ -0,0 +1,21 @@ +#Minimal Contents +#---------------- +ADMIN_PASSWORD=admin +MYSQL_PASSWORD=mysql +RABBIT_PASSWORD=rabbit +SERVICE_PASSWORD=admin +SERVICE_TOKEN=service + +[[local|localrc]] +# Enable plugins +enable_plugin nova-dpm https://git.openstack.org/openstack/nova-dpm.git + +# Set to True to install the latest zhmcclient from source +INSTALL_ZHMCCLIENT=TRUE + +#Logging +#------- +LOGFILE=/opt/stack/logs/stack.sh.log +SCREEN_LOGDIR=~/screen_log/ +LOGDAYS=1 + diff --git a/devstack/override-defaults b/devstack/override-defaults new file mode 100644 index 0000000..0071296 --- /dev/null +++ b/devstack/override-defaults @@ -0,0 +1,3 @@ +# Plug-in overrides + +VIRT_DRIVER=dpm diff --git a/devstack/plugin.sh b/devstack/plugin.sh new file mode 100755 index 0000000..9f01841 --- /dev/null +++ b/devstack/plugin.sh @@ -0,0 +1,134 @@ +#!/bin/bash +# +# plugin.sh - Devstack extras script to install and configure the nova compute +# driver for dpm + +# This driver is enabled in override-defaults with: +# VIRT_DRIVER=${VIRT_DRIVER:-dpm} + +# The following entry points are called in this order for nova-dpm: +# +# - install_nova_dpm +# - configure_nova_dpm +# - start_nova_dpm +# - stop_nova_dpm +# - cleanup_nova_dpm + +# Save trace setting +MY_XTRACE=$(set +o | grep xtrace) +set +o xtrace + +# Defaults +# -------- + +# Set up base directories +NOVA_DIR=${NOVA_DIR:-$DEST/nova} +NOVA_CONF_DIR=${NOVA_CONF_DIR:-/etc/nova} +NOVA_CONF=${NOVA_CONF:-NOVA_CONF_DIR/nova.conf} + +# nova-dpm directories +NOVA_DPM_DIR=${NOVA_DPM_DIR:-${DEST}/nova-dpm} +NOVA_DPM_PLUGIN_DIR=$(readlink -f $(dirname ${BASH_SOURCE[0]})) + +# Support entry points installation of console scripts +if [[ -d $NOVA_DIR/bin ]]; then + NOVA_BIN_DIR=$NOVA_DIR/bin + echo_summary $NOVA_BIN_DIR +else + NOVA_BIN_DIR=$(get_python_exec_prefix) + echo_summary $NOVA_BIN_DIR +fi + +# Source functions +source $NOVA_DPM_PLUGIN_DIR/dpm-functions.sh + +# Entry Points +# ------------ + +# configure_nova_dpm() - Configure the system to use nova_dpm +function configure_nova_dpm { + + # Default configuration + iniset $NOVA_CONF DEFAULT compute_driver $DPM_DRIVER + # dpm configuration + iniset $NOVA_CONF dpm hmc $HMC + iniset $NOVA_CONF dpm hmc_username $HMC_USERNAME + iniset $NOVA_CONF dpm hmc_password $HMC_PASSWORD + iniset $NOVA_CONF dpm host $HOST + iniset $NOVA_CONF dpm cpc_uuid $CPC_UUID + iniset $NOVA_CONF dpm max_processors $MAX_PROC + iniset $NOVA_CONF dpm max_memory $MAX_MEM + iniset $NOVA_CONF dpm max_instances $MAX_INSTANCES +} + +# install_nova_dpm() - Install nova_dpm and necessary dependencies +function install_nova_dpm { + if [[ "$INSTALL_ZHMCCLIENT" == "True" ]]; then + echo_summary "Installing zhmcclient" + install_zhmcclient + fi + + # Install the nova-dpm package + setup_develop $NOVA_DPM_DIR +} + +# start_nova_dpm() - Start the nova_dpm process +function start_nova_dpm { + # This function intentionally functionless as the + # compute service will start normally + : +} + +# stop_nova_dpm() - Stop the nova_dpm process +function stop_nova_dpm { + # This function intentionally left blank as the + # compute service will stop normally + : +} + +# cleanup_nova_dpm() - Cleanup the nova_dpm process +function cleanup_nova_dpm { + # This function intentionally left blank + : +} + +# Core Dispatch +# ------------- +if is_service_enabled nova-dpm; then + if [[ "$1" == "stack" && "$2" == "install" ]]; then + # Perform installation of nova-dpm + echo_summary "Installing nova-dpm" + install_nova_dpm + + elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then + # Lay down configuration post install + echo_summary "Configuring nova-dpm" + configure_nova_dpm + + elif [[ "$1" == "stack" && "$2" == "extra" ]]; then + # Initialize and start the nova-dpm/nova-compute service + echo_summary "Starting nova-dpm" + start_nova_dpm + fi + + if [[ "$1" == "unstack" ]]; then + # Shut down nova-dpm/nova-compute + echo_summary "Stopping nova-dpm" + stop_nova_dpm + fi + + if [[ "$1" == "clean" ]]; then + # Remove any lingering configuration data + # clean.sh first calls unstack.sh + echo_summary "Cleaning up nova-dpm and associated data" + cleanup_nova_dpm + cleanup_zhmcclient + fi +fi + +# Restore xtrace +$MY_XTRACE + +# Local variables: +# mode: shell-script +# End: diff --git a/devstack/settings b/devstack/settings new file mode 100644 index 0000000..26bb5ae --- /dev/null +++ b/devstack/settings @@ -0,0 +1,21 @@ +# Devstack settings +# These defaults can be overridden in the localrc section of the local.conf file + +# Add nova-dpm to enabled services +enable_service nova-dpm + +# NovaLink install/upgrade settings +INSTALL_ZHMCCLIENT=$(trueorfalse False INSTALL_ZHMCCLIENT) + +# Nova settings +DPM_DRIVER=dpm.driver.DPMDriver + +# dpm settings +HMC=$HMC +HMC_USERNAME=$HMC_USERNAME +HMC_PASSWORD=$HMC_PASSWORD +HOST=$HOST +CPC_UUID=$CPC_UUID +MAX_PROC=$MAX_PROC +MAX_MEM=$MAX_MEM +MAX_INSTANCES=$MAX_INSTANCES diff --git a/nova/__init__.py b/nova/__init__.py new file mode 100644 index 0000000..671e539 --- /dev/null +++ b/nova/__init__.py @@ -0,0 +1,18 @@ +# Copyright 2016 IBM Corp. +# +# All Rights Reserved. +# +# 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. + +# Required to play nicely with namespace composition (PEP420). +__import__('pkg_resources').declare_namespace(__name__) diff --git a/nova/virt/__init__.py b/nova/virt/__init__.py new file mode 100644 index 0000000..671e539 --- /dev/null +++ b/nova/virt/__init__.py @@ -0,0 +1,18 @@ +# Copyright 2016 IBM Corp. +# +# All Rights Reserved. +# +# 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. + +# Required to play nicely with namespace composition (PEP420). +__import__('pkg_resources').declare_namespace(__name__) diff --git a/nova/virt/dpm/__init__.py b/nova/virt/dpm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nova/virt/dpm/driver.py b/nova/virt/dpm/driver.py new file mode 100644 index 0000000..1126eb3 --- /dev/null +++ b/nova/virt/dpm/driver.py @@ -0,0 +1,27 @@ +# Copyright 2016 IBM Corp. +# +# All Rights Reserved. +# +# 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. + +"""Shim layer for nova_dpm.virt.dpm.driver.DPMDriver. + +Duplicate all public symbols. This is necessary for the constants as well as +the classes - because instances of the classes need to be able to resolve +references to the constants. +""" +import nova_dpm.virt.dpm.driver as real_drv + +LOG = real_drv.LOG +CONF = real_drv.CONF +DPMDriver = real_drv.DPMDriver diff --git a/setup.cfg b/setup.cfg index 122deed..13d38d4 100644 --- a/setup.cfg +++ b/setup.cfg @@ -23,6 +23,7 @@ classifier = [files] packages = nova_dpm + nova/virt/dpm [build_sphinx] source-dir = doc/source diff --git a/tools/tox_install.sh b/tools/tox_install.sh index ffc0f57..68dd538 100755 --- a/tools/tox_install.sh +++ b/tools/tox_install.sh @@ -1,65 +1,59 @@ #!/usr/bin/env bash -# This wrapper for tox's package installer will use the existing package -# if it exists, else use zuul-cloner if that program exists. That last case should only -# happen with devs running unit tests locally. - -# From the tox.ini config page: -# install_command=ARGV -# default: -# pip install {opts} {packages} +# Base code from https://github.com/openstack/glance_store/blob/master/tools/tox_install.sh +# +# Library constraint file contains version pin that is in conflict with +# installing the library from source. We should replace the version pin in +# the constraints file before applying it for from-source installation. ZUUL_CLONER=/usr/zuul-env/bin/zuul-cloner BRANCH_NAME=master -nova_installed=$(echo "import nova" | python 2>/dev/null ; echo $?) -NOVA_DIR=$HOME/nova +LIB_DIR=python-zhmcclient +LIB_NAME=zhmcclient +LIB_LOCATION=git+https://github.com/zhmcclient/$LIB_DIR#egg=$LIB_NAME +requirements_installed=$(echo "import openstack_requirements" | python 2>/dev/null ; echo $?) -set -e -set -x +set -e -x -install_cmd="pip install -c$1" +CONSTRAINTS_FILE=$1 shift -# The devstack based functional tests have nova checked out in -# $NOVA_DIR on the test systems - with the change to test in it. -# Use this directory if it exists, so that this script installs the -# nova version to test here. -# Note that the functional tests use sudo to run tox and thus -# variables used for zuul-cloner to check out the correct version are -# lost. -if [ -d "$NOVA_DIR" ]; then - echo "FOUND nova code at $NOVA_DIR - using" - $install_cmd -U -e $NOVA_DIR -elif [ $nova_installed -eq 0 ]; then - echo "ALREADY INSTALLED" > /tmp/tox_install.txt - location=$(python -c "import nova; print(nova.__file__)") - echo "ALREADY INSTALLED at $location" +install_cmd="pip install" +mydir=$(mktemp -dt "$LIB_NAME-tox_install-XXXXXXX") +trap "rm -rf $mydir" EXIT +localfile=$mydir/upper-constraints.txt +if [[ $CONSTRAINTS_FILE != http* ]]; then + CONSTRAINTS_FILE=file://$CONSTRAINTS_FILE +fi +curl $CONSTRAINTS_FILE -k -o $localfile +install_cmd="$install_cmd -c$localfile" - echo "Nova already installed; using existing package" +if [ $requirements_installed -eq 0 ]; then + echo "ALREADY INSTALLED" > /tmp/tox_install.txt + echo "Requirements already installed; using existing package" elif [ -x "$ZUUL_CLONER" ]; then echo "ZUUL CLONER" > /tmp/tox_install.txt - # Make this relative to current working directory so that - # git clean can remove it. We cannot remove the directory directly - # since it is referenced after $install_cmd -e. - mkdir -p .tmp - NOVA_DIR=$(/bin/mktemp -d -p $(pwd)/.tmp) - pushd $NOVA_DIR + pushd $mydir $ZUUL_CLONER --cache-dir \ /opt/git \ --branch $BRANCH_NAME \ git://git.openstack.org \ - openstack/nova - cd openstack/nova + openstack/requirements + cd openstack/requirements $install_cmd -e . popd else echo "PIP HARDCODE" > /tmp/tox_install.txt - if [ -z "$NOVA_PIP_LOCATION" ]; then - NOVA_PIP_LOCATION="git+https://git.openstack.org/openstack/nova@$BRANCH_NAME#egg=nova" + if [ -z "$REQUIREMENTS_PIP_LOCATION" ]; then + REQUIREMENTS_PIP_LOCATION="git+https://git.openstack.org/openstack/requirements@$BRANCH_NAME#egg=requirements" fi - $install_cmd -U -e ${NOVA_PIP_LOCATION} + $install_cmd -U -e ${REQUIREMENTS_PIP_LOCATION} fi +# This is the main purpose of the script: Allow local installation of +# the current repo. It is listed in constraints file and thus any +# install will be constrained and we need to unconstrain it. +edit-constraints $localfile -- $LIB_NAME "-e $LIB_LOCATION" + $install_cmd -U $* exit $? - diff --git a/tox.ini b/tox.ini index 349a9ef..3d7d9a2 100644 --- a/tox.ini +++ b/tox.ini @@ -11,6 +11,7 @@ setenv = VIRTUAL_ENV={envdir} deps = -r{toxinidir}/test-requirements.txt -r{toxinidir}/requirements.txt + -egit+https://github.com/openstack/nova#egg=nova -egit+https://github.com/zhmcclient/python-zhmcclient#egg=zhmcclient whitelist_externals = bash install_command = {toxinidir}/tools/tox_install.sh {env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} {opts} {packages}