From 6efe57e9eb80a57c78bea9a2ca9d170d4efdfeb5 Mon Sep 17 00:00:00 2001 From: Steven Dake Date: Fri, 14 Aug 2015 20:03:22 -0700 Subject: [PATCH] Remove compose from documenation Receive several quickstart related questions every day. Make a first pass at cleaning up our documentation to point people in the right direction. While we are about it remove compose related bits. Anything in the compose directory will remain as a reference implementation for how to implement the compose files to work well with our container content. Change-Id: I9e832e97ac2bacca8eab7e1bfbd82664d2b191b8 Closes-Bug: #1485163 Paritally-Implements: blueprint remove-config-internal --- docs/dev-quickstart.md | 82 ++--- tools/genenv | 686 ----------------------------------------- tools/init-runonce | 6 +- tools/kolla-compose | 157 ---------- 4 files changed, 22 insertions(+), 909 deletions(-) delete mode 100755 tools/genenv delete mode 100755 tools/kolla-compose diff --git a/docs/dev-quickstart.md b/docs/dev-quickstart.md index ffa9a44502..2b79097e41 100644 --- a/docs/dev-quickstart.md +++ b/docs/dev-quickstart.md @@ -1,11 +1,14 @@ # Developer Environment -If you are developing Kolla on an existing OpenStack cloud -that supports Heat, then follow the Heat template [README][]. -Otherwise, follow the instructions below to manually create -your Kolla development environment. +If you are developing Kolla on an existing OpenStack cloud that supports +Heat, then follow the Heat template [README][]. Another option available +on systems with VirutalBox is the use of [Vagrant][]. + +The best experience is available with bare metal deployment by following +the instructions below to manually create your Kolla deployment. [README]: https://github.com/stackforge/kolla/blob/master/devenv/README.md +[Vagrant]: https://github.com/stackforge/kolla/blob/master/docs/vagrant.md ## Installing Dependencies @@ -14,21 +17,18 @@ modules with the .xz compressed format. The guestfs system cannot read these images because a dependent package supermin in CentOS needs to be updated to add .xz compressed format support. -In order to run Kolla, it is mandatory to run a version of `docker-compose` -that includes pid: host support. Support was added in version 1.3.0 and is -specified in the requirements.txt. To install this and other potential future -dependencies: +To install Kolla depenedencies use: git clone http://github.com/stackforge/kolla cd kolla sudo pip install -r requirements.txt In order to run Kolla, it is mandatory to run a version of `docker` that is -1.6.0 or later. Docker 1.5.0 has a defect in `--pid=host` support where the -libvirt container cannot be stopped and crashes nova-compute on start. +1.7.0 or later. For most systems you can install the latest stable version of Docker with the following command: + curl -sSL https://get.docker.io | bash For Ubuntu based systems, do not use AUFS when starting Docker daemon unless @@ -46,71 +46,31 @@ running at a time. service libvirtd stop -The basic starting environment will be created using `docker-compose`. +The basic starting environment will be created using `ansible`. This environment will start up the OpenStack services listed in the -compose directory. +inventory file. ## Starting Kolla -To start, setup your environment variables. +Configure Ansible by reading the Kolla Ansible configuration documentation +[DEPLOY][]. - $ cd kolla - $ ./tools/genenv - -The `genenv` script will create a compose/openstack.env file -and an openrc file in your current directory. The openstack.env -file contains all of your initialized environment variables, which -you can edit for a different setup. - -A mandatory step is customizing the FLAT_INTERFACE network interface -environment variable. The variable defaults to eth1. In some cases, the -second interface in a system may not be eth1, but a unique name. For -example with an Intel driver, the interface is enp1s0. The interface name -can be determined by executing the ifconfig tool. The second interface must -be a real interface, not a virtual interface. Make certain to store the -interface name in `compose/openstack.env`: - - NEUTRON_FLAT_NETWORK_INTERFACE=enp1s0 - FLAT_INTERFACE=enp1s0 +[DEPLOY]: https://github.com/stackforge/kolla/blob/master/docs/ansible-deployment.md Next, run the start command: - $ sudo ./tools/kolla-compose start + $ sudo ./tools/kolla-ansible deploy -Finally, run the status command: - - $ sudo ./tools/kolla-compose status - -This will display information about all Kolla containers. +A bare metal system takes three minutes to deploy AIO. A virtual machine +takes five minutes to deploy AIO. These are estimates; your hardware may +be faster or slower but should near these results. ## Debugging Kolla -All Docker commands should be run from the directory of the Docker binary, -by default this is `/`. - -The `start` command to Kolla is responsible for starting the containers -using `docker-compose -f up -d`. - -If you want to start a container set by hand use this template: - - $ docker-compose -f glance-api-registry.yml up -d - - You can determine a container's status by executing: - $ sudo ./docker ps -a + $ sudo docker ps -a If any of the containers exited you can check the logs by executing: - $ sudo ./docker logs - $ docker-compose logs - -If you want to start a individual service like `glance-api` manually, use -this template. This is a good method to test and troubleshoot an individual -container. Note some containers require special options. Reference the -compose yml specification for more details: - - $ sudo ./docker run --name glance-api -d \ - --net=host \ - --env-file=compose/openstack.env \ - kollaglue/fedora-rdo-glance-api:latest + $ sudo docker logs diff --git a/tools/genenv b/tools/genenv deleted file mode 100755 index 050df7f3cf..0000000000 --- a/tools/genenv +++ /dev/null @@ -1,686 +0,0 @@ -#!/bin/bash -# -# This script generates a minimal set of environment variables to allow -# the openstack containers to operate. It is creating a configuration -# suitable for an all-in-one installation of openstack. -# -# It also creates a suitable 'openrc' for use with the installed system. - -function check_binarydependencies { - local binaries="openssl" - local missingbinaries="" - local space="" - - for bin in $binaries; do - if [[ ! $(type -t $bin) ]]; then - missingbinaries+=${space}$bin - space=" " - fi - done - - if [ -n "$missingbinaries" ]; then - echo Missing dependencies: $missingbinaries - exit 1 - fi -} - -check_binarydependencies - -# Move to top level directory -REAL_PATH=$(python -c "import os,sys;print os.path.realpath('$0')") -cd "$(dirname "$REAL_PATH")/.." - -MY_IP=${MY_IP:-$(ip route get $(ip route | awk '$1 == "default" {print $3}') | - awk '$4 == "src" {print $5}')} - -MY_DEV=${MY_DEV:-$(ip route get $(ip route | awk '$1 == "default" {print $3}') | - awk '$4 == "src" {print $3}')} - -echo MY_IP=$MY_IP -echo MY_DEV=$MY_DEV - -# API versions -CINDER_API_VERSION=2 - -# Admin user -ADMIN_USER=admin -ADMIN_USER_PASSWORD=steakfordinner - -# Database -BIND_ADDRESS=$PUBLIC_IP -CHAR_SET_SERVER=utf8 -COLLATION_SERVER=utf8_general_ci -DATADIR=/var/lib/mysql -DEFAULT_STORAGE_ENGINE=innodb -HOST_IP=$MY_IP -INIT_CINDER_DB=true -INIT_CONNECT="SET NAMES utf8" -INIT_DESIGNATE_DB=true -INIT_GLANCE_DB=true -INIT_MURANO_DB=true -INIT_HEAT_DB=true -INIT_KEYSTONE_DB=true -INIT_NOVA_DB=true -INNODB_FILE_PER_TABLE=true -MARIADB_MAX_CONNECTIONS=151 -MARIADB_SERVICE_PORT=3306 -MONGODB_SERVICE_PORT=27017 -MARIADB_ROOT_PASSWORD=kolla -PASSWORD=12345 -TEMP_FILE=/tmp/mysql-first-time.sql - -# Galera -DB_CLUSTER_BIND_ADDRESS=0.0.0.0 -DB_CLUSTER_INIT_DB=false -DB_CLUSTER_NAME=kollacluster -DB_CLUSTER_NODES= -DB_CLUSTER_WSREP_METHOD=mysqldump - -# Host -ADMIN_TENANT_NAME=admin -PUBLIC_IP=$HOST_IP - -# Logging -CINDER_API_LOG_FILE= -CINDER_BACKUP_LOG_FILE= -CINDER_LOG_DIR= -CINDER_SCHEDULER_LOG_FILE= -CINDER_VOLUME_LOG_FILE= -DEBUG_LOGGING=false -NEUTRON_L3_AGENT_LOG_FILE= -NEUTRON_LINUXBRIDGE_AGENT_LOG_FILE= -NEUTRON_LOG_DIR=/var/log/neutron -NEUTRON_METADATA_AGENT_LOG_FILE= -NEUTRON_SERVER_LOG_FILE= -NOVA_API_LOG_FILE= -NOVA_COMPUTE_LOG_FILE= -NOVA_CONDUCTOR_LOG_FILE= -NOVA_CONSOLEAUTH_LOG_FILE= -NOVA_LOG_DIR= -NOVA_NOVNCPROXY_LOG_FILE= -NOVA_SCHEDULER_LOG_FILE= -OVS_DB_FILE="/etc/openvswitch/conf.db" -OVS_LOG_FILE= -OVS_UNIXSOCK="/var/run/openvswitch/db.sock" -VERBOSE_LOGGING=true - - -# RabbitMQ -RABBITMQ_CLUSTER_COOKIE= -RABBITMQ_CLUSTER_NODES= -RABBITMQ_SERVICE_HOST=$HOST_IP -RABBITMQ_SERVICE_PORT=5672 -RABBIT_PASSWORD=guest -RABBITMQ_USER=guest - -#Barbican -ADMIN_TENANT_NAME=admin -BARBICAN_ADMIN_SERVICE_PORT=9312 -BARBICAN_DB_NAME=barbican -BARBICAN_DB_USER=barbican -BARBICAN_KEYSTONE_USER=barbican -BARBICAN_PUBLIC_SERVICE_PORT=9311 -KEYSTONE_AUTH_PROTOCOL=http - -#Ceilometer -CEILOMETER_ADMIN_PASSWORD=password -CEILOMETER_API_SERVICE_HOST=$HOST_IP -CEILOMETER_API_SERVICE_PORT=8777 -CEILOMETER_DB_NAME=ceilometer -CEILOMETER_DB_PASSWORD=password -CEILOMETER_DB_USER=ceilometer -CEILOMETER_KEYSTONE_USER=ceilometer - -# Cinder API -CINDER_ADMIN_PASSWORD=password -CINDER_API_SERVICE_HOST=$HOST_IP -CINDER_API_SERVICE_LISTEN=$HOST_IP -CINDER_API_SERVICE_PORT=8776 -CINDER_KEYSTONE_PASSWORD=password -CINDER_KEYSTONE_USER=cinder - -# Cinder Scheduler -CINDER_DB_NAME=cinder -CINDER_DB_PASSWORD=password -CINDER_DB_USER=cinder - -# Cinder Backup -CINDER_BACKUP_API_CLASS=cinder.backup.api.API -CINDER_BACKUP_DRIVER=cinder.backup.drivers.swift -CINDER_BACKUP_MANAGER=cinder.backup.manager.BackupManager -CINDER_BACKUP_NAME_TEMPLATE=backup-%s - -# Cinder Volume -CINDER_ENABLED_BACKEND=lvm57 -CINDER_LVM_LO_VOLUME_SIZE=4G -CINDER_VOLUME_API_LISTEN=$HOST_IP -CINDER_VOLUME_BACKEND_NAME=LVM_iSCSI57 -CINDER_VOLUME_DRIVER=cinder.volume.drivers.lvm.LVMISCSIDriver -CINDER_VOLUME_GROUP=cinder-volumes -ISCSI_HELPER=tgtadm -ISCSI_IP_ADDRESS=$HOST_IP - -# Designate -DESIGNATE_DB_NAME=designate -DESIGNATE_DB_USER=designate -DESIGNATE_DB_PASSWORD=designatedns -DESIGNATE_KEYSTONE_USER=designate -DESIGNATE_KEYSTONE_PASSWORD=designate -DESIGNATE_BIND9_RNDC_KEY=$(openssl rand -base64 24) -DESIGNATE_MASTERNS=$HOST_IP -DESIGNATE_BACKEND=bind9 -DESIGNATE_SLAVENS=$HOST_IP -DESIGNATE_API_SERVICE_HOST=$HOST_IP -DESIGNATE_API_SERVICE_PORT=9001 -DESIGNATE_MDNS_PORT=5354 -DESIGNATE_DNS_PORT=53 -DESIGNATE_POOLMAN_POOLID=$(uuidgen) -DESIGNATE_POOLMAN_TARGETS=$(uuidgen) -DESIGNATE_POOLMAN_NSS=$(uuidgen) -DESIGNATE_ALLOW_RECURSION=true -DESIGNATE_DEFAULT_POOL_NS_RECORD=ns1.example.org. -DESIGNATE_SINK_NOVA_DOMAIN_NAME=nova.example.org. -DESIGNATE_SINK_NEUTRON_DOMAIN_NAME=neutron.example.org. -DESIGNATE_SINK_NOVA_FORMATS=("%(octet0)s-%(octet1)s-%(octet2)s-%(octet3)s.%(domain)s" "%(hostname)s.%(domain)s") -DESIGNATE_SINK_NEUTRON_FORMATS=("%(octet0)s-%(octet1)s-%(octet2)s-%(octet3)s.%(domain)s" "%(hostname)s.%(domain)s") - -# Glance -GLANCE_API_SERVICE_HOST=$HOST_IP -GLANCE_API_SERVICE_PORT=9292 -GLANCE_DB_NAME=glance -GLANCE_DB_PASSWORD=kolla -GLANCE_DB_USER=glance -GLANCE_KEYSTONE_PASSWORD=glance -GLANCE_KEYSTONE_USER=glance -GLANCE_REGISTRY_SERVICE_HOST=$HOST_IP -GLANCE_REGISTRY_SERVICE_PORT=9191 - -# Gnocchi -GNOCCHI_DB_PASSWORD=gnocchi -GNOCCHI_DB_NAME=gnocchi -GNOCCHI_DB_USER=gnocchi -GNOCCHI_SERVICE_PROTOCOL=http -GNOCCHI_SERVICE_PORT=8041 -GNOCCHI_STORAGE_BACKEND=file -GNOCCHI_KEYSTONE_USER=gnocchi -GNOCCHI_KEYSTONE_PASSWORD=gnocchi -GNOCCHI_ADMIN_PASSWORD=gnocchi -GNOCCHI_API_SERVICE_HOST=$HOST_IP - - -# Heat -HEAT_API_CFN_SERVICE_HOST=$HOST_IP -HEAT_API_CFN_SERVICE_PORT=8000 -HEAT_API_CFN_URL_HOST=$HOST_IP -HEAT_API_SERVICE_HOST=$HOST_IP -HEAT_API_SERVICE_PORT=8004 -HEAT_CFN_KEYSTONE_PASSWORD=heat -HEAT_CFN_KEYSTONE_USER=heat-cfn -HEAT_DB_NAME=heat -HEAT_DB_PASSWORD=kolla -HEAT_DOMAIN_PASS=$(openssl rand -hex 8) -HEAT_KEYSTONE_PASSWORD=heat -HEAT_KEYSTONE_USER=heat - -#Horizon -HORIZON_KEYSTONE_USER=horizon -HORIZON_SERVICE_PORT=80 - -# Keystone -KEYSTONE_ADMIN_PASSWORD=$PASSWORD -KEYSTONE_ADMIN_SERVICE_HOST=$HOST_IP -KEYSTONE_ADMIN_SERVICE_PORT=35357 -KEYSTONE_ADMIN_TOKEN=$PASSWORD -KEYSTONE_API_VERSION=2.0 -KEYSTONE_AUTH_PROTOCOL=http -KEYSTONE_DB_NAME=keystone -KEYSTONE_DB_PASSWORD=kolla -KEYSTONE_DB_USER=keystone -KEYSTONE_PUBLIC_SERVICE_HOST=$HOST_IP -KEYSTONE_PUBLIC_SERVICE_PORT=5000 -KEYSTONE_USER=keystone -TOKEN_DRIVER=sql -TOKEN_PROVIDER=uuid -USE_STDERR=false - -# Keepalived -# Here we define pairs hostname:priority. Priorities have to be unique -KEEPALIVED_HOST_PRIORITIES=host1:100,host2:99 - -# Magnum -MAGNUM_DB_NAME=magnum -MAGNUM_DB_USER=magnum -MAGNUM_DB_PASSWORD=kolla -MAGNUM_KEYSTONE_USER=magnum -MAGNUM_KEYSTONE_PASSWORD=magnum -MAGNUM_API_SERVICE_HOST=$HOST_IP -MAGNUM_API_SERVICE_PORT=9511 - -# Murano -MURANO_DB_NAME=murano -MURANO_DB_PASSWORD=murano -MURANO_DB_USER=murano -MURANO_HOST_IP=$HOST_IP -MURANO_KEYSTONE_PASSWORD=password -MURANO_KEYSTONE_USER=murano -MURANO_SERVICE_PORT=8082 -MURANO_SERVICE_PROTOCOL=http - -# Neutron -NEUTRON_DB_NAME=neutron -NEUTRON_DB_USER=neutron -NEUTRON_DB_PASSWORD=password -NEUTRON_KEYSTONE_USER=neutron -NEUTRON_KEYSTONE_PASSWORD=neutron -NEUTRON_SERVER_SERVICE_HOST=$HOST_IP -NEUTRON_SERVER_SERVICE_PORT=9696 -NEUTRON_API_PASTE_CONFIG=/usr/share/neutron/api-paste.ini -# Neutron ML2 Plugin -TYPE_DRIVERS=flat,vxlan -TENANT_NETWORK_TYPES=flat,vxlan -MECHANISM_DRIVERS=linuxbridge,l2population -# Neutron Linux Bridge Agent -NEUTRON_FLAT_NETWORK_NAME=physnet1 -NEUTRON_FLAT_NETWORK_INTERFACE=eth1 - -# Neutron ML2 Plugin -MECHANISM_DRIVERS=linuxbridge,l2population -TENANT_NETWORK_TYPES=flat,vxlan -TYPE_DRIVERS=flat,vxlan - -# Neutron Linux Bridge Agent -DELETE_NAMESPACES=true -DHCP_DRIVER=neutron.agent.linux.dhcp.Dnsmasq -DNSMASQ_CONFIG_FILE=/etc/neutron/dnsmasq/dnsmasq-neutron.conf -ENDPOINT_TYPE=adminURL -KEYSTONE_REGION=RegionOne -NEUTRON_FLAT_NETWORK_INTERFACE=eth1 -NEUTRON_FLAT_NETWORK_NAME=physnet1 -ROOT_HELPER="sudo neutron-rootwrap /etc/neutron/rootwrap.conf" -USE_NAMESPACES=true - -# Networking Options are nova or neutron -NETWORK_MANAGER=neutron - -# Nova -ENABLED_APIS=ec2,osapi_compute,metadata -METADATA_HOST=$HOST_IP -NOVA_API_SERVICE_HOST=$HOST_IP -NOVA_API_SERVICE_PORT=8774 -NOVA_DB_NAME=nova -NOVA_DB_PASSWORD=nova -NOVA_DB_USER=nova -NOVA_EC2_SERVICE_HOST=$HOST_IP -NOVA_EC2_API_SERVICE_PORT=8773 -NOVA_FLAT_INTERFACE=eth1 -NOVA_KEYSTONE_PASSWORD=nova -NOVA_KEYSTONE_USER=nova -NOVA_LIBVIRT_SERVICE_PORT=16509 -NOVA_METADATA_API_SERVICE_HOST=$HOST_IP -NOVA_METADATA_API_SERVICE_PORT=8775 -NOVA_NOVNC_BASE_ADDRESS=${PUBLIC_IP} -NOVA_NOVNC_PROXY_PORT=6080 -NOVA_NOVNC_PROXY_SERVICE_HOST=0.0.0.0 -NOVA_PUBLIC_INTERFACE=$MY_DEV -NOVA_VNCSERVER_LISTEN_ADDRESS=$HOST_IP -NOVA_VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP - -# Nova/Neutron -NEUTRON_SHARED_SECRET=sharedsecret - -# Swift -SWIFT_ACCOUNT_SVC_BIND_IP=$PUBLIC_IP -SWIFT_ACCOUNT_SVC_BIND_PORT=6002 -SWIFT_ACCOUNT_SVC_DEVICES=/srv/node -SWIFT_ACCOUNT_SVC_MOUNT_CHECK=false -SWIFT_ADMIN_USER=swift -SWIFT_API_SERVICE_HOST=$HOST_IP -SWIFT_CONTAINER_SVC_BIND_IP=$PUBLIC_IP -SWIFT_CONTAINER_SVC_BIND_PORT=6001 -SWIFT_CONTAINER_SVC_DEVICES=/srv/node -SWIFT_CONTAINER_SVC_MOUNT_CHECK=false -SWIFT_DIR=/etc/swift -SWIFT_HASH_PATH_SUFFIX=$(openssl rand -hex 8) -SWIFT_KEYSTONE_PASSWORD=swift -SWIFT_KEYSTONE_USER=swift -SWIFT_OBJECT_SVC_BIND_IP=$PUBLIC_IP -SWIFT_OBJECT_SVC_BIND_PORT=6000 -SWIFT_OBJECT_SVC_DEVICES=/srv/node -SWIFT_OBJECT_SVC_MOUNT_CHECK=false -SWIFT_OBJECT_SVC_PIPELINE=object-server -SWIFT_PROXY_ACCOUNT_AUTOCREATE=true -SWIFT_PROXY_AUTH_PLUGIN=password -SWIFT_PROXY_BIND_IP=$PUBLIC_IP -SWIFT_PROXY_BIND_PORT=8080 -SWIFT_PROXY_DELAY_AUTH_DECISION=true -SWIFT_PROXY_DIR=/etc/swift -SWIFT_PROXY_OPERATOR_ROLES=admin,user -SWIFT_PROXY_PASSWORD=swift -SWIFT_PROXY_PIPELINE_MAIN="catch_errors gatekeeper healthcheck cache container_sync bulk ratelimit authtoken keystoneauth slo dlo proxy-server" -SWIFT_PROXY_PROJECT_DOMAIN_ID=default -SWIFT_PROXY_PROJECT_NAME=service -SWIFT_PROXY_SIGNING_DIR=/var/cache/swift -SWIFT_PROXY_USER_DOMAIN_ID=default -SWIFT_PROXY_USERNAME=swift -SWIFT_USER=swift -SWIFT_OBJECT_SVC_RING_NAME=/etc/swift/object.builder -SWIFT_OBJECT_SVC_RING_PART_POWER=10 -SWIFT_OBJECT_SVC_RING_REPLICAS=3 -SWIFT_OBJECT_SVC_RING_MIN_PART_HOURS=1 -SWIFT_OBJECT_SVC_RING_HOSTS="${HOST_IP}:6000,${HOST_IP}:6000,${HOST_IP}:6000" -SWIFT_OBJECT_SVC_RING_DEVICES="sdb1,sdb2,sdb3" -SWIFT_OBJECT_SVC_RING_WEIGHTS="1,1,1" -SWIFT_OBJECT_SVC_RING_ZONES="1,2,3" -SWIFT_CONTAINER_SVC_RING_NAME=/etc/swift/container.builder -SWIFT_CONTAINER_SVC_RING_PART_POWER=10 -SWIFT_CONTAINER_SVC_RING_REPLICAS=3 -SWIFT_CONTAINER_SVC_RING_MIN_PART_HOURS=1 -SWIFT_CONTAINER_SVC_RING_HOSTS="${HOST_IP}:6001,${HOST_IP}:6001,${HOST_IP}:6001" -SWIFT_CONTAINER_SVC_RING_DEVICES="sdb1,sdb2,sdb3" -SWIFT_CONTAINER_SVC_RING_WEIGHTS="1,1,1" -SWIFT_CONTAINER_SVC_RING_ZONES="1,2,3" -SWIFT_ACCOUNT_SVC_RING_NAME=/etc/swift/account.builder -SWIFT_ACCOUNT_SVC_RING_PART_POWER=10 -SWIFT_ACCOUNT_SVC_RING_REPLICAS=3 -SWIFT_ACCOUNT_SVC_RING_MIN_PART_HOURS=1 -SWIFT_ACCOUNT_SVC_RING_HOSTS="${HOST_IP}:6002,${HOST_IP}:6002,${HOST_IP}:6002" -SWIFT_ACCOUNT_SVC_RING_DEVICES="sdb1,sdb2,sdb3" -SWIFT_ACCOUNT_SVC_RING_WEIGHTS="1,1,1" -SWIFT_ACCOUNT_SVC_RING_ZONES="1,2,3" - -#Zaqar -ZAQAR_KEYSTONE_USER=zaqar -ZAQAR_SERVER_SERVICE_PORT=8888 - -# this should use the keystone admin port -# https://bugs.launchpad.net/kolla/+bug/1469209 -cat > ./openrc < ./compose/openstack.env <&1 | grep -c enabled) -ge 4 ]; do - echo -n . - sleep 2 - done - - until [ $(neutron agent-list 2>&1 | grep -c ':-)') -ge 4 ]; do - echo -n . - sleep 2 - done - echo " done" - - echo Example Usage: - echo source openrc # source keystone credentials - - echo Configure your environment once by running: - echo tools/init-runonce -} - -function usage { - cat <