Skip to content
Snippets Groups Projects
functions 7.04 KiB
Newer Older
  • Learn to ignore specific revisions
  • set -eu
    set -o pipefail
    
    
    # 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:-${HOME}/kayobe-venv}"
    
        # Whether to provision a VM for the seed host.
        export KAYOBE_SEED_VM_PROVISION=${KAYOBE_SEED_VM_PROVISION:-1}
    
    
        # 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}
    
    
        # Additional arguments to pass to kayobe commands.
        export KAYOBE_EXTRA_ARGS=${KAYOBE_EXTRA_ARGS:-}
    
    }
    
    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"
    
        if [[ ! -f "${KAYOBE_VENV_PATH}/bin/activate" ]]; then
    
            echo "Creating kayobe virtual environment in ${KAYOBE_VENV_PATH}"
    
            virtualenv "${KAYOBE_VENV_PATH}"
            # NOTE: Virtualenv's activate and deactivate scripts reference an
            # unbound variable.
            set +u
            source "${KAYOBE_VENV_PATH}/bin/activate"
    
            pip install -U pip
    
            pip install "${KAYOBE_SOURCE_PATH}"
    
        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 {
    
        # NOTE: Virtualenv's activate script references an unbound variable.
        set +u
        source "${KAYOBE_VENV_PATH}/bin/activate"
        set -u
        source "${KAYOBE_CONFIG_SOURCE_PATH}/kayobe-env"
    
        cd "${KAYOBE_SOURCE_PATH}"
    
    function run_kayobe {
        # Run a kayobe command, including extra arguments provided via
        # $KAYOBE_EXTRA_ARGS.
        kayobe ${KAYOBE_EXTRA_ARGS} $*
    }
    
    
    function seed_hypervisor_deploy {
        # Deploy a seed hypervisor.
        environment_setup
    
    
        echo "Bootstrapping the Ansible control host"
    
        run_kayobe control host bootstrap
    
    
        echo "Configuring the seed hypervisor"
    
        run_kayobe seed hypervisor host configure
    
    }
    
    function seed_deploy {
        # Deploy a kayobe seed in a VM.
        environment_setup
    
    
        echo "Bootstrapping the Ansible control host"
    
        run_kayobe control host bootstrap
    
        if [[ ${KAYOBE_SEED_VM_PROVISION} = 1 ]]; then
            echo "Provisioning the seed VM"
            run_kayobe seed vm provision
        fi
    
    
        echo "Configuring the seed host"
    
        run_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"
    
            run_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"
    
            run_kayobe seed container image build
    
        else
            echo "Not pulling seed container images - no such command yet"
    
            #run_kayobe seed container image pull
    
        fi
    
        echo "Deploying containerised seed services"
    
        run_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"
    
        run_kayobe control host bootstrap
    
    
        echo "Configuring the controller host"
    
        run_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"
    
            run_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"
    
            run_kayobe overcloud container image build
    
        else
            echo "Pulling overcloud container images"
    
            run_kayobe overcloud container image pull
    
        fi
    
        echo "Deploying containerised overcloud services"
    
        run_kayobe overcloud service deploy
    
    
        echo "Performing post-deployment configuration"
    
        source "${KOLLA_CONFIG_PATH:-/etc/kolla}/admin-openrc.sh"
    
        run_kayobe overcloud post configure
    
    
        echo "Control plane deployment complete"
    }
    
    
    function overcloud_test {
        # Perform a simple smoke test against the cloud.
        echo "Performing a simple smoke test"
    
        environment_setup
    
        pip install python-openstackclient
    
        echo "Running kolla-ansible init-runonce"
        source "${KOLLA_CONFIG_PATH:-/etc/kolla}/admin-openrc.sh"
        ${KOLLA_VENV_PATH:-$HOME/kolla-venv}/share/kolla-ansible/init-runonce
    
        echo "Creating a VM"
        openstack server create --wait --image cirros --flavor m1.tiny --key-name mykey --network demo-net demo1
        openstack server show demo1
        # TODO(mgoddard): Test SSH connectivity to the VM.
    
        echo "Deleting the VM"
        openstack server delete --wait demo1
    }