diff --git a/Vagrantfile b/Vagrantfile index e060a79c3..85a106464 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -43,22 +43,16 @@ NM_CONTROLLED=no EOF sudo ifup eth1 - sudo yum -y install gcc git vim python-virtualenv + /vagrant/dev/install.sh + # Configure the legacy development environment. This has been retained + # while transitioning to the new development environment. cat > /vagrant/kayobe-env << EOF export KAYOBE_CONFIG_PATH=/vagrant/etc/kayobe export KOLLA_CONFIG_PATH=/vagrant/etc/kolla EOF - source /vagrant/kayobe-env - cp /vagrant/dev/dev-vagrant.yml /vagrant/etc/kayobe/ cp /vagrant/dev/dev-hosts /vagrant/etc/kayobe/inventory cp /vagrant/dev/dev-vagrant-network-allocation.yml /vagrant/etc/kayobe/network-allocation.yml - - virtualenv ~/kayobe-venv - source ~/kayobe-venv/bin/activate - pip install -U pip - pip install /vagrant - deactivate SHELL end diff --git a/dev/config.sh b/dev/config.sh new file mode 100644 index 000000000..1d4efcad9 --- /dev/null +++ b/dev/config.sh @@ -0,0 +1,19 @@ +# Configuration for kayobe development environment. + +# Path to the kayobe source code repository. Typically this will be the Vagrant +# shared directory. +#export KAYOBE_SOURCE_PATH=/vagrant + +# Path to the kayobe-config repository checkout. +#export KAYOBE_CONFIG_SOURCE_PATH=${KAYOBE_SOURCE_PATH}/config/src/kayobe-config + +# Path to the kayobe virtual environment. +#export KAYOBE_VENV_PATH=~/kayobe-venv + +# Whether to build container images for the seed services. If 0, they will be +# pulled. +#export KAYOBE_SEED_CONTAINER_IMAGE_BUILD=0 + +# Whether to build container images for the overcloud services. If 0, they will +# be pulled. +#export KAYOBE_OVERCLOUD_CONTAINER_IMAGE_BUILD=0 diff --git a/dev/environment-setup.sh b/dev/environment-setup.sh new file mode 100755 index 000000000..bfcf0a871 --- /dev/null +++ b/dev/environment-setup.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +set -e + +# This script can be used to prepare the environment for use with kayobe. This +# includes setting environment variables and activating the python virtual +# environment. This script should be sourced rather than executed in a +# subprocess. e.g. source dev/environment-setup.sh + +PARENT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +source ${PARENT}/functions + + +function main { + config_init + environment_setup +} + +main diff --git a/dev/functions b/dev/functions new file mode 100644 index 000000000..32578ee5d --- /dev/null +++ b/dev/functions @@ -0,0 +1,195 @@ +#!/bin/bash + +set -e + +# Library of functions for the kayobe development environment. + +# Configuration + +function config_defaults { + # Set default values for kayobe development configuration. + + # Try to detect if we are running in a vagrant VM. + if [[ -e /vagrant ]]; then + KAYOBE_SOURCE_PATH_DEFAULT=/vagrant + else + KAYOBE_SOURCE_PATH_DEFAULT=$(pwd) + fi + + # Path to the kayobe source code repository. Typically this will be the + # Vagrant shared directory. + export KAYOBE_SOURCE_PATH=${KAYOBE_SOURCE_PATH:-$KAYOBE_SOURCE_PATH_DEFAULT} + + # Path to the kayobe-config repository checkout. + export KAYOBE_CONFIG_SOURCE_PATH=${KAYOBE_CONFIG_SOURCE_PATH:-${KAYOBE_SOURCE_PATH}/config/src/kayobe-config} + + # Path to the kayobe virtual environment. + export KAYOBE_VENV_PATH=${KAYOBE_VENV_PATH:-~/kayobe-venv} + + # Whether to build container images for the seed services. If 0, they will + # be pulled. + export KAYOBE_SEED_CONTAINER_IMAGE_BUILD=${KAYOBE_SEED_CONTAINER_IMAGE_BUILD:-0} + + # Whether to build container images for the overcloud services. If 0, they + # will be pulled. + export KAYOBE_OVERCLOUD_CONTAINER_IMAGE_BUILD=${KAYOBE_OVERCLOUD_CONTAINER_IMAGE_BUILD:-0} +} + +function config_set { + # Source the configuration file, config.sh + + PARENT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + + source ${PARENT}/config.sh +} + +function config_check { + # Check the configuration environment variables. + + if [[ ! -e $KAYOBE_CONFIG_SOURCE_PATH ]]; then + if [[ ${KAYOBE_CONFIG_REQUIRED:-1} -eq 1 ]]; then + echo "Kayobe configuration path $KAYOBE_CONFIG_SOURCE_PATH does not exist" + return 1 + fi + fi + + if [[ ! -e $KAYOBE_SOURCE_PATH ]]; then + echo "Kayobe source path $KAYOBE_SOURCE_PATH does not exist" + return 1 + fi +} + +function config_init { + config_defaults + config_set + config_check +} + +# Installation + +function install_dependencies { + echo "Installing package dependencies for kayobe" + if [[ -e /etc/centos-release ]]; then + sudo yum -y install gcc git vim python-virtualenv + else + sudo apt install -y python-dev python-virtualenv gcc git + fi +} + +function install_venv { + local venv_parent=$(dirname ${KAYOBE_VENV_PATH}) + if [[ ! -d $venv_parent ]]; then + mkdir -p $venv_parent + fi + if [[ ! -f ${KAYOBE_VENV_PATH}/bin/activate ]]; then + echo "Creating kayobe virtual environment in ${KAYOBE_VENV_PATH}" + virtualenv ${KAYOBE_VENV_PATH} + source ${KAYOBE_VENV_PATH}/bin/activate + pip install -U pip + pip install ${KAYOBE_SOURCE_PATH} + deactivate + else + echo "Using existing kayobe virtual environment in ${KAYOBE_VENV_PATH}" + fi +} + +# Deployment + +function is_deploy_image_built_locally { + ipa_build_images=$(kayobe configuration dump --host controllers[0] --var-name ipa_build_images) + [[ $ipa_build_images =~ ^true$ ]] +} + +function environment_setup { + source ${KAYOBE_VENV_PATH}/bin/activate + source ${KAYOBE_CONFIG_SOURCE_PATH}/kayobe-env + + cd ${KAYOBE_SOURCE_PATH} +} + +function seed_hypervisor_deploy { + # Deploy a seed hypervisor. + environment_setup + + echo "Bootstrapping the ansible control host" + kayobe control host bootstrap + + echo "Configuring the seed hypervisor" + kayobe seed hypervisor host configure +} + +function seed_deploy { + # Deploy a kayobe seed in a VM. + environment_setup + + echo "Bootstrapping the ansible control host" + kayobe control host bootstrap + + echo "Provisioning the seed VM" + kayobe seed vm provision + + echo "Configuring the seed host" + kayobe seed host configure + + # Note: This must currently be before host configure, because host + # configure runs kolla-ansible.yml, which validates the presence of the + # built deploy images. + if is_deploy_image_built_locally; then + echo "Building seed deployment images" + kayobe seed deployment image build + else + echo "Not building seed deployment images" + fi + + if [[ ${KAYOBE_SEED_CONTAINER_IMAGE_BUILD} = 1 ]]; then + echo "Building seed container images" + kayobe seed container image build + else + echo "Not pulling seed container images - no such command yet" + #kayobe seed container image pull + fi + + echo "Deploying containerised seed services" + kayobe seed service deploy +} + +function overcloud_deploy { + # Deploy a kayobe control plane. + echo "Deploying a kayobe development environment. This consists of a " + echo "single node OpenStack control plane." + + environment_setup + + echo "Bootstrapping the ansible control host" + kayobe control host bootstrap + + echo "Configuring the controller host" + kayobe overcloud host configure + + # Note: This must currently be before host configure, because host + # configure runs kolla-ansible.yml, which validates the presence of the + # built deploy images. + if is_deploy_image_built_locally; then + echo "Building overcloud deployment images" + kayobe overcloud deployment image build + else + echo "Not building overcloud deployment images" + fi + + if [[ ${KAYOBE_OVERCLOUD_CONTAINER_IMAGE_BUILD} = 1 ]]; then + echo "Building overcloud container images" + kayobe overcloud container image build + else + echo "Pulling overcloud container images" + kayobe overcloud container image pull + fi + + echo "Deploying containerised overcloud services" + kayobe overcloud service deploy + + echo "Performing post-deployment configuration" + source ${KOLLA_CONFIG_PATH:-/etc/kolla}/admin-openrc.sh + kayobe overcloud post configure + + echo "Control plane deployment complete" +} diff --git a/dev/install.sh b/dev/install.sh new file mode 100755 index 000000000..18c2ed3d8 --- /dev/null +++ b/dev/install.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +set -e + +# Install kayobe and its dependencies in a virtual environment. + +PARENT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +source ${PARENT}/functions + + +function main { + # Don't require kayobe configuration to exist for installation - it is not + # required for the legacy manual deployment procedure. + KAYOBE_CONFIG_REQUIRED=0 + config_init + install_dependencies + install_venv +} + +main diff --git a/dev/overcloud-deploy.sh b/dev/overcloud-deploy.sh new file mode 100755 index 000000000..5f512ab38 --- /dev/null +++ b/dev/overcloud-deploy.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +set -e + +# Simple script to stand up a development environment for an OpenStack +# controller in a Vagrant VM using kayobe. This should be executed from within +# the VM. + +PARENT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +source ${PARENT}/functions + + +function main { + config_init + overcloud_deploy +} + +main diff --git a/dev/seed-deploy.sh b/dev/seed-deploy.sh new file mode 100755 index 000000000..4730d0568 --- /dev/null +++ b/dev/seed-deploy.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -e + +# Simple script to stand up a development environment for a seed VM using +# kayobe. This should be executed from the hypervisor. + +PARENT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +source ${PARENT}/functions + + +function main { + config_init + seed_deploy +} + +main diff --git a/dev/seed-hypervisor-deploy.sh b/dev/seed-hypervisor-deploy.sh new file mode 100755 index 000000000..0d0aeaa30 --- /dev/null +++ b/dev/seed-hypervisor-deploy.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -e + +# Simple script to stand up a development environment for a seed hypervisor +# using kayobe. This should be executed from the hypervisor. + +PARENT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +source ${PARENT}/functions + + +function main { + config_init + seed_hypervisor_deploy +} + +main diff --git a/doc/source/development/automated.rst b/doc/source/development/automated.rst new file mode 100644 index 000000000..785b9bf73 --- /dev/null +++ b/doc/source/development/automated.rst @@ -0,0 +1,151 @@ +.. _development-automated: + +=============== +Automated Setup +=============== + +This section provides information on the development tools provided by kayobe +to automate the deployment of various development environments. + +For a manual procedure, see :ref:`development-manual`. + +Overview +======== + +The kayobe development environment automation tooling is built using simple +shell scripts. Some minimal configuration can be applied by setting the +environment variables in `dev/config.sh`. Control plane configuration is +typically provided via the `dev-kayobe-config +`_ repository, although it is +also possible to use your own kayobe configuration. This allows us to build a +development environment that is as close to production as possible. + +Environments +============ + +The following development environments are supported: + +* Overcloud (single OpenStack controller) +* Seed hypervisor +* Seed VM + +The seed VM environment may be used in an environment already deployed as a +seed hypervisor. + +Overcloud +========= + +Preparation +----------- + +Clone the kayobe repository:: + + git clone https://github.com/stackhpc/kayobe + +Change the current directory to the kayobe repository:: + + cd kayobe + +Clone the ``dev-kayobe-config`` repository to ``config/src/kayobe-config``:: + + mkdir -p config/src + git clone https://github.com/stackhpc/dev-kayobe-config config/src/kayobe-config + +Follow the steps in :ref:`development-vagrant` to prepare your environment for +use with Vagrant and bring up a Vagrant VM. + +Inspect the kayobe configuration and make any changes necessary for your +environment. + +Usage +----- + +SSH into the Vagrant VM:: + + vagrant ssh + +Run the ``dev/overcloud-deploy.sh`` script to deploy the OpenStack control +plane:: + + /vagrant/kayobe/dev/overcloud-deploy.sh + +Upon successful completion of this script, the control plane will be active. + +Seed Hypervisor +=============== + +The seed hypervisor development environment is supported for CentOS 7. The +system must be either bare metal, or a VM on a system with nested +virtualisation enabled. + +Preparation +----------- + +The following commands should be executed on the seed hypervisor. + +Clone the kayobe repository:: + + git clone https://github.com/stackhpc/kayobe + +Change the current directory to the kayobe repository:: + + cd kayobe + +Clone the ``add-seed-and-hv`` branch of the ``dev-kayobe-config`` repository to +``config/src/kayobe-config``:: + + mkdir -p config/src + git clone https://github.com/stackhpc/dev-kayobe-config -b add-seed-and-hv config/src/kayobe-config + +Inspect the kayobe configuration and make any changes necessary for your +environment. + +Usage +----- + +Run the ``dev/seed-hypervisor-deploy.sh`` script to deploy the seed +hypervisor:: + + ./dev/seed-hypervisor-deploy.sh + +Upon successful completion of this script, the seed hypervisor will be active. + +Seed VM +======= + +The seed VM should be deployed on a system configured as a libvirt/KVM +hypervisor, using the kayobe seed hypervisor support or otherwise. + +Preparation +----------- + +The following commands should be executed on the seed hypervisor. + +Change the current directory to the kayobe repository:: + + git clone https://github.com/stackhpc/kayobe + +Change to the ``kayobe`` directory:: + + cd kayobe + +Clone the ``add-seed-and-hv`` branch of the ``dev-kayobe-config`` repository to +``config/src/kayobe-config``:: + + mkdir -p config/src + git clone https://github.com/stackhpc/dev-kayobe-config -b add-seed-and-hv config/src/kayobe-config + +Inspect the kayobe configuration and make any changes necessary for your +environment. + +Usage +===== + +Run the ``dev/seed-deploy.sh`` script to deploy the seed VM:: + + ./dev/seed-deploy.sh + +Upon successful completion of this script, the seed VM will be active. The +seed VM may be accessed via SSH as the ``stack`` user:: + + ssh stack@192.168.33.5 diff --git a/doc/source/contributing.rst b/doc/source/development/contributing.rst similarity index 58% rename from doc/source/contributing.rst rename to doc/source/development/contributing.rst index eb44b0c49..7086829a1 100644 --- a/doc/source/contributing.rst +++ b/doc/source/development/contributing.rst @@ -1,4 +1,4 @@ ================= How to Contribute ================= -.. include:: ../../CONTRIBUTING.rst +.. include:: ../../../CONTRIBUTING.rst diff --git a/doc/source/development/index.rst b/doc/source/development/index.rst new file mode 100644 index 000000000..26b748398 --- /dev/null +++ b/doc/source/development/index.rst @@ -0,0 +1,11 @@ +======================== +Kayobe Development Guide +======================== + +.. toctree:: + :maxdepth: 2 + + vagrant + manual + automated + contributing diff --git a/doc/source/development.rst b/doc/source/development/manual.rst similarity index 60% rename from doc/source/development.rst rename to doc/source/development/manual.rst index 1dd6f5021..8718654ab 100644 --- a/doc/source/development.rst +++ b/doc/source/development/manual.rst @@ -1,42 +1,26 @@ -=========== -Development -=========== +.. _development-manual: -This section describes how to set up an OpenStack controller in a virtual -machine using `Vagrant `_ and Kayobe. +============ +Manual Setup +============ + +This section provides a set of manual steps to set up a development environment +for an OpenStack controller in a virtual machine using `Vagrant +`_ and Kayobe. + +For a more automated and flexible procedure, see :ref:`development-automated`. Preparation =========== -First, ensure that Vagrant is installed and correctly configured to use -virtual box. Also install the following vagrant plugins: +Follow the steps in :ref:`development-vagrant` to prepare your environment for +use with Vagrant and bring up a Vagrant VM. - vagrant plugin install vagrant-vbguest - vagrant plugin install vagrant-reload +Manual Installation +=================== -Note: if using Ubuntu 16.04 LTS, you may be unable to install any plugins. To -work around this install the upstream version from www.virtualbox.org. - -Next, clone kayobe:: - - git clone https://github.com/stackhpc/kayobe - -Change the current directory to the kayobe repository:: - - cd kayobe - -Inspect kayobe's ``Vagrantfile``, noting the provisioning steps:: - - less Vagrantfile - -Bring up a virtual machine:: - - vagrant up - -Wait for the VM to boot. - -Installation -============ +Sometimes the best way to learn a tool is to ditch the scripts and perform a +manual installation. SSH into the controller VM:: diff --git a/doc/source/development/vagrant.rst b/doc/source/development/vagrant.rst new file mode 100644 index 000000000..6bd0b16a2 --- /dev/null +++ b/doc/source/development/vagrant.rst @@ -0,0 +1,55 @@ +.. _development-vagrant: + +======= +Vagrant +======= + +Kayobe provides a Vagrantfile that can be used to bring up a virtual machine +for use as a development environment. The VM is based on the `stackhpc/centos-7 +`_ CentOS 7 image, and +supports the following providers: + +* VirtualBox +* VMWare Fusion + +The VM is configured with 4GB RAM. It has a single private network in addition +to the standard Vagrant NAT network. + +Preparation +=========== + +First, ensure that Vagrant is installed and correctly configured to use +virtual box. Also install the following vagrant plugins:: + + vagrant plugin install vagrant-vbguest + vagrant plugin install vagrant-reload + +Note: if using Ubuntu 16.04 LTS, you may be unable to install any plugins. To +work around this install the upstream version from www.virtualbox.org. + +Usage +===== + +Later sections in the development guide cover in more detail how to use the +development VM in different configurations. These steps cover bringing up and +accessing the VM. + +Clone the kayobe repository:: + + git clone https://github.com/stackhpc/kayobe + +Change the current directory to the kayobe repository:: + + cd kayobe + +Inspect kayobe's ``Vagrantfile``, noting the provisioning steps:: + + less Vagrantfile + +Bring up a virtual machine:: + + vagrant up + +Wait for the VM to boot, then SSH in:: + + vagrant ssh diff --git a/doc/source/index.rst b/doc/source/index.rst index aac175ceb..9e90e5b06 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -42,8 +42,7 @@ Developer Documentation .. toctree:: :maxdepth: 2 - contributing - development + development/index Release Notes -------------